waveOutGetDevCaps (winmm)
Last changed: -74.69.33.164

.
Summary
The waveOutGetDevCaps function fills the WAVEOUTCAPS structure with wave device capabilities.

"WAVEOUTCAPS" [http://msdn2.microsoft.com/en-us/library/ms713743(d=printer).aspx]

"Manufacturer and Product Identifiers" [http://msdn2.microsoft.com/en-us/library/ms709440.aspx]

C# Signature:

[DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern uint waveOutGetDevCaps(IntPtr hwo,ref WAVEOUTCAPS pwoc,uint cbwoc);

VB Signature:

Declare Auto Function waveOutGetDevCaps Lib "winmm.dll" (ByVal uDeviceID as Integer, ByRef lpCaps As WAVEOUTCAPS, _
ByVal uSize As Integer) As Integer

Constants Used:

Public Const C_MAXPNAMELEN As Integer = 32
Public Const WAVE_MAPPER As Integer = -1    'Specifies default device ID

Structures Used:

VB.NET 2005 - Use the following structure: WAVEOUTCAPS

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential, CharSet:=Runtime.InteropServices.CharSet.Auto)> _
Public Structure WAVEOUTCAPS
     Public wMid As Short
     Public wPid As Short
     Public vDriverVersion As Integer

     <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)> _
     Public szPname As String

     Public dwFormats As Integer
     Public wChannels As Short
     Public wReserved As Short
     Public dwSupport As Integer
End Structure

C# 2005 version of structure
[System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public struct WAVEOUTCAPS
{
     public short wMid;
     public short wPid;
     public int vDriverVersion;

     [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 32)]
     public string szPname;

     public int dwFormats;
     public short wChannels;
     public short wReserved;
     public int dwSupport;
}

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

Remember to have the strings marshaled as ByValTStr with size of 32.

Use "Auto" in the Declare statement to have the correct character set selected automatically.

Tips & Tricks:

Please add some!

Sample Code:

Sub ShowDeviceCaps()
     Dim i As Integer
     Dim wc As New WAVEOUTCAPS

     MsgBox("Number of Wave Devices: " & waveOutGetNumDevs(), , "WAVE DEVICES")

     For i = 0 To waveOutGetNumDevs() - 1
         ' waveOutGetDevCaps(i, wc, Len(wc))
         waveOutGetDevCaps(i, wc, System.Runtime.InteropServices.Marshal.SizeOf(wc))  
         MsgBox("MID = " & wc.wMid & Chr(13) & "PID = " & wc.wPid & Chr(13) & "Version = " & _
         wc.vDriverVersion & Chr(13) & "Name = " & wc.szPname & Chr(13) & "Formats = " & wc.dwFormats & _
         Chr(13) & "Channels = " & wc.wChannels, , "Device ID = " & i + 1)
     Next i
End Sub

Documentation

C# Code

    /// <summary>
    ///    typedef struct {
    ///    WORD      wMid;
    ///    WORD      wPid;
    ///    MMVERSION vDriverVersion;
    ///    TCHAR     szPname[MAXPNAMELEN];
    ///    DWORD     dwFormats;
    ///    WORD      wChannels;
    ///    WORD      wReserved1;
    ///    DWORD     dwSupport;
    ///} WAVEOUTCAPS;
    /// </summary>
    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 4)]
    public struct WAVEOUTCAPS
    {
    public short wMid;
    public short wPid;
    public int vDriverVersion;
    [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 32)]
    public char[] szPname;
    public uint dwFormats;
    public short wChannels;
    public short wReserved;
    public uint dwSupport;
    public override string ToString()
    {
        return string.Format("wMid:{0}|wPid:{1}|vDriverVersion:{2}|szPname:{3}|dwFormats:{4}|wChannels:{5}|wReserved:{6}|dwSupport:{7}", new object[] { wMid, wPid, vDriverVersion, new string(szPname), dwFormats, wChannels, wReserved, dwSupport });
        //return base.ToString();
    }
    }
    /// <summary>
    /// typedef struct {
    ///  WORD      wMid;
    ///  WORD      wPid;
    ///  MMVERSION vDriverVersion;
    ///  TCHAR     szPname[MAXPNAMELEN];
    ///  DWORD     dwFormats;
    ///  WORD      wChannels;
    ///  WORD      wReserved1;
    /// } WAVEINCAPS;
    /// </summary>
    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 4)]
    public struct WAVEINCAPS
    {
    public short wMid;
    public short wPid;
    public int vDriverVersion;
    [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 32)]
    public char[] szPname;      
    public uint dwFormats;
    public short wChannels;
    public short wReserved;
    //public int dwSupport;
    public override string ToString()
    {
        return string.Format("wMid:{0}|wPid:{1}|vDriverVersion:{2}|szPname:{3}|dwFormats:{4}|wChannels:{5}|wReserved:{6}", new object[] { wMid, wPid, vDriverVersion, new string(szPname), dwFormats, wChannels, wReserved });
        //return base.ToString();
    }
    }
    public static WavePlayerLib.WAVEOUTCAPS[] GetDevCapsPlayback()
    {
        int waveOutDevicesCount = WavePlayerLib.WaveNative.waveOutGetNumDevs();
        if (waveOutDevicesCount > 0)
        {
        WavePlayerLib.WAVEOUTCAPS[] list = new WAVEOUTCAPS[waveOutDevicesCount];
        for (int uDeviceID = 0; uDeviceID < waveOutDevicesCount; uDeviceID++)
        {
            WavePlayerLib.WAVEOUTCAPS waveOutCaps = new WavePlayerLib.WAVEOUTCAPS();
            WavePlayerLib.WaveNative.waveOutGetDevCaps(uDeviceID, ref waveOutCaps, System.Runtime.InteropServices.Marshal.SizeOf(typeof(WavePlayerLib.WAVEOUTCAPS)));
            System.Diagnostics.Debug.WriteLine("\n" + waveOutCaps.ToString());
            list[uDeviceID] = waveOutCaps;            
        }
        return list;
        }
        else
        {
        return null;
        }
    }

    public static WavePlayerLib.WAVEINCAPS[] GetDevCapsRecording()
    {      
        int waveInDevicesCount = WavePlayerLib.WaveNative.waveInGetNumDevs();
        if (waveInDevicesCount > 0)
        {
        WAVEINCAPS[] list = new WAVEINCAPS[waveInDevicesCount];
        for (int uDeviceID = 0; uDeviceID < waveInDevicesCount; uDeviceID++)
        {
            WavePlayerLib.WAVEINCAPS waveInCaps = new WavePlayerLib.WAVEINCAPS();
            WavePlayerLib.WaveNative.waveInGetDevCaps(uDeviceID, ref waveInCaps, System.Runtime.InteropServices.Marshal.SizeOf(typeof(WavePlayerLib.WAVEINCAPS)));
            System.Diagnostics.Debug.WriteLine("\n" + waveInCaps.ToString());
            list[uDeviceID] = waveInCaps;
        }
        return list;
        }
        else {
        return null;
        }
    }