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>
    ///
    /// </summary>
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]
    public struct WAVEOUTCAPS
    {
        public short wMid;
        public short wPid;
        public int vDriverVersion;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        private string 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, szPname, dwFormats, wChannels, wReserved, dwSupport });
        }
    }

    /// <summary>
    ///
    /// </summary>
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]
    public struct WAVEINCAPS
    {
        public short wMid;
        public short wPid;
        public int vDriverVersion;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string 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, szPname, dwFormats, wChannels, wReserved });
        }
    }

    public static WAVEOUTCAPS[] GetDevCapsPlayback()
    {
        uint waveOutDevicesCount = waveOutGetNumDevs();
        if (waveOutDevicesCount > 0)
        {
        WAVEOUTCAPS[] list = new WAVEOUTCAPS[waveOutDevicesCount];
        for (int uDeviceID = 0; uDeviceID < waveOutDevicesCount; uDeviceID++)
        {
            WAVEOUTCAPS waveOutCaps = new WAVEOUTCAPS();
            waveOutGetDevCaps(uDeviceID, ref waveOutCaps, Marshal.SizeOf(typeof(WAVEOUTCAPS)));
            System.Diagnostics.Debug.WriteLine("\n" + waveOutCaps.ToString());
            list[uDeviceID] = waveOutCaps;
        }
        return list;
        }
        else
        {
        return null;
        }
    }

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

    [DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern uint waveInGetDevCaps(int hwo, ref WAVEINCAPS pwic, /*uint*/ int cbwic);

    [DllImport("winmm.dll", SetLastError = true)]
    public static extern uint waveInGetNumDevs();

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

    [DllImport("winmm.dll", SetLastError = true)]
    static extern uint waveOutGetNumDevs();
    }