2009-10-06 162 views
8

我想知道如何在一台机器上获取安装的音频输出设备(waveout的)的列表在C#中如何枚举音频输出设备

操作系统:Windows(XP,Vista中,7) 框架: .Net 3.5 语言:c#

当遍历此列表时,我想获得像标识符,制造商,...每个设备的信息。

任何提示?

+0

检出WMI ... – 2009-10-06 12:36:52

回答

15

这里是代码在C#枚举音频设备,使用WMI(参考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)); 
     } 
    } 

导致输出类似:

 
Availability: 
Caption:USB Audio Device 
ConfigManagerErrorCode:0 
ConfigManagerUserConfig:False 
CreationClassName:Win32_SoundDevice 
Description:USB Audio Device 
DeviceID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000 
DMABufferSize: 
ErrorCleared: 
ErrorDescription: 
InstallDate: 
LastErrorCode: 
Manufacturer:(Generic USB Audio) 
MPU401Address: 
Name:USB Audio Device 
PNPDeviceID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000 
PowerManagementCapabilities: 
PowerManagementSupported:False 
ProductName:USB Audio Device 
Status:OK 
StatusInfo:3 
SystemCreationClassName:Win32_ComputerSystem 
SystemName: 
Availability: 

Caption:Realtek AC'97 Audio for VIA (R) Audio Controller 
ConfigManagerErrorCode:0 
ConfigManagerUserConfig:False 
CreationClassName:Win32_SoundDevice 
Description:Realtek AC'97 Audio for VIA (R) Audio Controller 
DeviceID:PCI\VEN_1106&DEV_3059&SUBSYS_09011558&REV_60\3&61AAA01&1&8D 
DMABufferSize: 
ErrorCleared: 
ErrorDescription: 
InstallDate: 
LastErrorCode: 
Manufacturer:Realtek 
MPU401Address: 
Name:Realtek AC'97 Audio for VIA (R) Audio Controller 
PNPDeviceID:PCI\VEN_1106&DEV_3059&SUBSYS_09011558&REV_60\3&61AAA01&1&8D 
PowerManagementCapabilities: 
PowerManagementSupported:False 
ProductName:Realtek AC'97 Audio for VIA (R) Audio Controller 
Status:OK 
StatusInfo:3 
SystemCreationClassName:Win32_ComputerSystem 
SystemName: 
Availability: 

WMI烦人不会出现音频输入和输出设备之间的简单区分。但是,如下(参考Microsoft.DirectX.DirectSound),使用DirectSound的受管接口和DevicesCollection类,我们可以获得更多面向声音的信息。

 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 
     } 
+0

你知道是否有可能获得某个音频设备的杰克信息? – 2015-12-01 17:47:08

+0

我不确定,也许看看https://msdn.microsoft.com/en-us/library/windows/desktop/dd370793(v=vs.85).aspx - 只是在黑暗中刺。 – Kazar 2015-12-03 09:02:56

+0

托管DirectX已被弃用相当长一段时间。 – 2016-08-20 02:19:56

3

这里是一个例子

的参考添加到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      
} 
-2

检查waveOutGetNumDevs API

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

返回设备的数量。返回值为零意味着没有设备存在或发生错误。 http://msdn.microsoft.com/en-us/library/dd743860(v=vs.85).aspx

+1

这只给你设备的数量。你如何列举它们? – 2012-10-24 18:51:48

0
 /// <summary> 
     /// The DirectSoundEnumerate function enumerates the DirectSound Odrivers installed in the system. 
     /// </summary> 
     /// <param name="lpDSEnumCallback">callback function</param> 
     /// <param name="lpContext">User context</param> 
     [DllImport("dsound.dll", EntryPoint = "DirectSoundEnumerateA", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
     static extern void DirectSoundEnumerate(DevicesEnumCallback lpDSEnumCallback, IntPtr lpContext); 

而且回调应该是这样的:

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

在Windows Vista及以上的,你可以使用IMMDeviceEnumerator这是为了枚举音频终端设备包你通过NAudio。例如:

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

你知道是否有可能获得某个音频设备的杰克信息? – 2015-12-01 17:50:46