Click here to Skip to main content
Click here to Skip to main content

Enumerating Sound Recording Devices (Using winmm.dll/C#)

By , 7 May 2007
 

Introduction

This article describes a sample class that uses winmm.dll in C# through P/Invoke to enumerate sound recording devices.

Using the code

Let's start by including all the namespaces we are going to use:

using System.Runtime.InteropServices;//DLLimport
using System.Collections;//arrayList

The second step is declaring all the APIs we need:

//return total Sound Recording Devices
[DllImport("winmm.dll")]
public static extern int waveInGetNumDevs();
//return spesific Sound Recording Devices spec
[DllImport("winmm.dll", EntryPoint = "waveInGetDevCaps")]
public static extern int waveInGetDevCapsA(int uDeviceID, ref WaveInCaps lpCaps, int uSize);

The third step is to declare the "WaveInCaps" struct returned by the waveInGetDevCaps API. I found this one in "http://www.dotnetjunkies.com/WebLog/debasish/archive/2006/11/25/160495.aspx" - thanks to "debasish" for the hard work.

[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct WaveInCaps
{
    public short wMid;
    public short wPid;
    public int vDriverVersion;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
    public char[] szPname;
    public uint dwFormats;
    public short wChannels;
    public short wReserved1;
}

From here, it's just straightforward C# coding...

I implemented this in a clsRecDevices class:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Collections;
namespace winApp
{
class clsRecDevices
{ 
    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct WaveInCaps
    {
        public short wMid;
        public short wPid;
        public int vDriverVersion;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
        public char[] szPname;
        public uint dwFormats;
        public short wChannels;
        public short wReserved1;
    } 

    [DllImport("winmm.dll")]
    public static extern int waveInGetNumDevs();
    [DllImport("winmm.dll", EntryPoint = "waveInGetDevCaps")]
    public static extern int waveInGetDevCapsA(int uDeviceID, 
                         ref WaveInCaps lpCaps, int uSize);
    ArrayList arrLst = new ArrayList();
    //using to store all sound recording devices strings 

    public int Count
    //to return total sound recording devices found
    { 
        get {return arrLst.Count;}
    }
    public string this[int indexer]
    //return spesipic sound recording device name
    {
        get{return (string)arrLst[indexer];}
    }
    public clsRecDevices() //fill sound recording devices array
    {
        int waveInDevicesCount = waveInGetNumDevs(); //get total
        if (waveInDevicesCount > 0)
        {
            for (int uDeviceID = 0; uDeviceID < waveInDevicesCount; uDeviceID++)
            {
                WaveInCaps waveInCaps = new WaveInCaps();
                waveInGetDevCapsA(uDeviceID,ref waveInCaps, 
                                  Marshal.SizeOf(typeof(WaveInCaps))); 
                arrLst.Add(new string(waveInCaps.szPname).Remove(
                           new string(waveInCaps.szPname).IndexOf('\0')).Trim());
                           //clean garbage
            }
        }
    } 
}
}

This class can be used as follows:

clsRecDevices recDev = new clsRecDevices();
for (int i = 0; i < recDev.Count; i++){
    MessageBox.Show(recDev[i]);
}

History

You can also implement IEnumerator and IEnumerable to add some cool indexing features.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

ChernoDV
Web Developer
Israel Israel
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralWhy the redundant check?memberminitech31 May '11 - 16:16 
GeneralszPname is truncatedmemberMember 383892815 Aug '09 - 18:33 
GeneralThe declaration for WAVEINCAPS is not as good as it could have been.memberAptitude27 May '09 - 12:00 
Question2 sound cardsmemberIbrahim Dwaikat3 Nov '07 - 14:16 
GeneralRecordingmemberJanardhan Mysore31 Oct '07 - 21:17 
QuestionHow to record audio from microphonememberjanardhanaiyengar12 Oct '07 - 7:11 
QuestionHow to record audio using thismemberjanardhanaiyengar11 Oct '07 - 2:50 
AnswerRe: How to record audio using thismemberChernoDV11 Oct '07 - 4:23 
Send mr your mail - i will send you few exampels i have
GeneralRe: How to record audio using thismemberjanardhanaiyengar11 Oct '07 - 6:58 
GeneralRe: How to record audio using thismemberjanardhanaiyengar15 Oct '07 - 7:54 
GeneralRe: How to record audio using thismemberpavelnaru28 Feb '09 - 23:37 
QuestionNice, questionmembersides_dale19 May '07 - 9:42 
AnswerRe: Nice, questionmemberChernoDV19 May '07 - 22:36 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 7 May 2007
Article Copyright 2007 by ChernoDV
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid