在C#中如何枚举音频输出设备
我想知道如何在一台机器上获取安装的音频输出设备(waveout的)的列表在C#中如何枚举音频输出设备
操作系统:Windows(XP,Vista中,7) 框架: .Net 3.5 语言:c#
当遍历此列表时,我想获得像标识符,制造商,...每个设备的信息。
任何提示?
这里是代码在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
}
你知道是否有可能获得某个音频设备的杰克信息? – 2015-12-01 17:47:08
我不确定,也许看看https://msdn.microsoft.com/en-us/library/windows/desktop/dd370793(v=vs.85).aspx - 只是在黑暗中刺。 – Kazar 2015-12-03 09:02:56
托管DirectX已被弃用相当长一段时间。 – 2016-08-20 02:19:56
这里是一个例子
的参考添加到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
}
检查waveOutGetNumDevs API
[DllImport("winmm.dll", SetLastError = true)]
public static extern uint waveOutGetNumDevs();
返回设备的数量。返回值为零意味着没有设备存在或发生错误。 http://msdn.microsoft.com/en-us/library/dd743860(v=vs.85).aspx
这只给你设备的数量。你如何列举它们? – 2012-10-24 18:51:48
/// <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)
在Windows Vista及以上的,你可以使用IMMDeviceEnumerator
这是为了枚举音频终端设备包你通过NAudio。例如:
var enumerator = new MMDeviceEnumerator();
foreach (var endpoint in
enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active))
{
Console.WriteLine(endpoint.FriendlyName);
}
你知道是否有可能获得某个音频设备的杰克信息? – 2015-12-01 17:50:46
检出WMI ... – 2009-10-06 12:36:52