Cómo enumerar dispositivos de salida de audio en c #

Me gustaría saber cómo obtener una lista de los dispositivos de salida de audio instalados (waveOut) en una máquina

SO: Windows (XP, Vista, 7) Framework: .Net 3.5 Idioma: c #

Al iterar a través de esta lista, me gustaría obtener información como Identificador, Fabricante, … por dispositivo.

¿Algún consejo?

Aquí hay un código para enumerar dispositivos de audio en C #, usando WMI (referencia System.Management).

ManagementObjectSearcher objSearcher = new ManagementObjectSearcher( "SELECT * FROM Win32_SoundDevice"); ManagementObjectCollection objCollection = objSearcher.Get(); foreach (ManagementObject obj in objCollection) { foreach (PropertyData property in obj.Properties) { Console.Out.WriteLine(String.Format("{0}:{1}", property.Name, property.Value)); } } 

Lo que da como resultado algo así como:

 Disponibilidad:
 Leyenda: Dispositivo de audio USB
 ConfigManagerErrorCode: 0
 ConfigManagerUserConfig: False
 CreationClassName: Win32_SoundDevice
 Descripción: Dispositivo de audio USB
 DeviceID: USB \ VID_047F y PID_0CA1 & MI_00 \ 6 y 2C037688 & 0 & 0000
 DMABufferSize:
 ErrorCleared:
 Error de descripción:
 InstallDate:
 LastErrorCode:
 Fabricante: (Audio USB Genérico)
 MPU401 Dirección:
 Nombre: dispositivo de audio USB
 PNPDeviceID: USB \ VID_047F y PID_0CA1 & MI_00 \ 6 y 2C037688 & 0 & 0000
 PowerManagementCapabilities:
 PowerManagementSupported: False
 ProductName: dispositivo de audio USB
 Estado: OK
 StatusInfo: 3
 SystemCreationClassName: Win32_ComputerSystem
 Nombre del sistema:
 Disponibilidad:

 Leyenda: Audio Realtek AC'97 para controlador de audio VIA (R)
 ConfigManagerErrorCode: 0
 ConfigManagerUserConfig: False
 CreationClassName: Win32_SoundDevice
 Descripción: Realtek AC'97 Audio para VIA (R) Audio Controller
 DeviceID: PCI \ VEN_1106 y DEV_3059 y SUBSYS_09011558 & REV_60 \ 3 & 61AAA01 & 1 & 8D
 DMABufferSize:
 ErrorCleared:
 Error de descripción:
 InstallDate:
 LastErrorCode:
 Fabricante: Realtek
 MPU401 Dirección:
 Nombre: Audio Realtek AC'97 para el controlador de audio VIA (R)
 PNPDeviceID: PCI \ VEN_1106 & DEV_3059 & SUBSYS_09011558 & REV_60 \ 3 & 61AAA01 & 1 & 8D
 PowerManagementCapabilities:
 PowerManagementSupported: False
 ProductName: Audio Realtek AC'97 para el controlador de audio VIA (R)
 Estado: OK
 StatusInfo: 3
 SystemCreationClassName: Win32_ComputerSystem
 Nombre del sistema:
 Disponibilidad:

WMI molestamente no parece distinguir simplemente entre dispositivos de entrada y salida para audio. Sin embargo, utilizando la interfaz administrada para DirectSound y la clase DevicesCollection, como se muestra a continuación (referencia Microsoft.DirectX.DirectSound), podemos obtener mucha más información orientada al sonido.

  DevicesCollection devColl = new DevicesCollection(); foreach (DeviceInformation devInfo in devColl) { Device dev = new Device(devInfo.DriverGuid); //use dev.Caps, devInfo to access a fair bit of info about the sound device } 

En Windows Vista y versiones posteriores, puede usar IMMDeviceEnumerator que IMMDeviceEnumerator le envuelve para enumerar dispositivos de punto final de audio. Por ejemplo:

 var enumerator = new MMDeviceEnumerator(); foreach (var endpoint in enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active)) { Console.WriteLine(endpoint.FriendlyName); } 

Aquí hay un ejemplo

Agregue una referencia a System.Management

 ManagementObjectSearcher mo = new ManagementObjectSearcher("select * from Win32_SoundDevice"); foreach (ManagementObject soundDevice in mo.Get()) { Console.WriteLine(soundDevice.GetPropertyValue("DeviceId")); Console.WriteLine(soundDevice.GetPropertyValue("Manufacturer")); // etc } 
  ///  /// The DirectSoundEnumerate function enumerates the DirectSound Odrivers installed in the system. ///  /// callback function /// User context [DllImport("dsound.dll", EntryPoint = "DirectSoundEnumerateA", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] static extern void DirectSoundEnumerate(DevicesEnumCallback lpDSEnumCallback, IntPtr lpContext); 

Y la callback debería ser así:

  private static bool DevicesEnumCallbackHandler(IntPtr lpGuid, IntPtr lpcstrDescription, IntPtr lpcstrModule, IntPtr lpContext) 

Verifique la API waveOutGetNumDevs

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

Devuelve la cantidad de dispositivos. Un valor de retorno de cero significa que no hay dispositivos presentes o que ocurrió un error. http://msdn.microsoft.com/en-us/library/dd743860(v=vs.85).aspx