2009-10-06 50 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