Click here to Skip to main content
11,491,742 members (82,981 online)
Click here to Skip to main content

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

, 7 May 2007 CPOL 51K 1.4K 19
Rate this:
Please Sign up or sign in to vote.
This article describes a sample class that uses winmm.dll in C# through P/Invoke to enumerate sound recording devices.

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)

Share

About the Author

ChernoDV
Web Developer
Israel Israel
No Biography provided

Comments and Discussions

 
GeneralWhy the redundant check? Pin
minitech31-May-11 17:16
memberminitech31-May-11 17:16 
GeneralszPname is truncated Pin
Member 383892815-Aug-09 19:33
memberMember 383892815-Aug-09 19:33 
GeneralThe declaration for WAVEINCAPS is not as good as it could have been. Pin
Aptitude27-May-09 13:00
memberAptitude27-May-09 13:00 
Question2 sound cards Pin
Ibrahim Dwaikat3-Nov-07 15:16
memberIbrahim Dwaikat3-Nov-07 15:16 
GeneralRecording Pin
Janardhan Mysore31-Oct-07 22:17
memberJanardhan Mysore31-Oct-07 22:17 
QuestionHow to record audio from microphone Pin
janardhanaiyengar12-Oct-07 8:11
memberjanardhanaiyengar12-Oct-07 8:11 
QuestionHow to record audio using this Pin
janardhanaiyengar11-Oct-07 3:50
memberjanardhanaiyengar11-Oct-07 3:50 
AnswerRe: How to record audio using this Pin
ChernoDV11-Oct-07 5:23
memberChernoDV11-Oct-07 5:23 
GeneralRe: How to record audio using this Pin
janardhanaiyengar11-Oct-07 7:58
memberjanardhanaiyengar11-Oct-07 7:58 
Hi,

my mail address is janardhanmysore@gmail.com


thanks

with regards

janardhan
GeneralRe: How to record audio using this Pin
janardhanaiyengar15-Oct-07 8:54
memberjanardhanaiyengar15-Oct-07 8:54 

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.150520.1 | Last Updated 7 May 2007
Article Copyright 2007 by ChernoDV
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid