【发布时间】:2009-10-06 12:34:10
【问题描述】:
我想知道如何获取机器上已安装音频输出设备 (waveOut) 的列表
操作系统:Windows(XP、Vista、7) 框架:.Net 3.5 语言:c#
在遍历此列表时,我想获取每个设备的标识符、制造商等信息。
有什么提示吗?
【问题讨论】:
我想知道如何获取机器上已安装音频输出设备 (waveOut) 的列表
操作系统:Windows(XP、Vista、7) 框架:.Net 3.5 语言:c#
在遍历此列表时,我想获取每个设备的标识符、制造商等信息。
有什么提示吗?
【问题讨论】:
这是使用 WMI(参考 System.Management)在 C# 中枚举音频设备的代码。
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));
}
}
这导致输出如下:
可用性: 标题:USB音频设备 配置管理器错误代码:0 配置管理器用户配置:假 CreationClassName:Win32_SoundDevice 描述:USB音频设备 设备ID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000 DMA缓冲区大小: 错误清除: 错误描述: 安装日期: 最后错误代码: 制造商:(通用 USB 音频) MPU401地址: 名称:USB音频设备 PNPDeviceID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000 电源管理功能: 电源管理支持:假 产品名称:USB音频设备 状态:OK 状态信息:3 SystemCreationClassName:Win32_ComputerSystem 系统名称: 可用性: 标题:Realtek AC'97 Audio for VIA (R) Audio Controller 配置管理器错误代码:0 配置管理器用户配置:假 CreationClassName:Win32_SoundDevice 描述:Realtek AC'97 Audio for VIA (R) Audio Controller 设备ID:PCI\VEN_1106&DEV_3059&SUBSYS_09011558&REV_60\3&61AAA01&1&8D DMA缓冲区大小: 错误清除: 错误描述: 安装日期: 最后错误代码: 制造商:瑞昱 MPU401地址: 名称:Realtek AC'97 Audio for VIA (R) Audio Controller PNPDeviceID:PCI\VEN_1106&DEV_3059&SUBSYS_09011558&REV_60\3&61AAA01&1&8D 电源管理功能: 电源管理支持:假 产品名称:Realtek AC'97 Audio for VIA (R) Audio Controller 状态:OK 状态信息:3 SystemCreationClassName:Win32_ComputerSystem 系统名称: 可用性:令人讨厌的是,WMI 似乎无法简单地区分音频的输入和输出设备。但是,使用 DirectSound 的托管接口和 DevicesCollection 类,如下所示(参考 Microsoft.DirectX.DirectSound),我们可以获得更多面向声音的信息。
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
}
【讨论】:
在 Windows Vista 及更高版本中,您可以使用 IMMDeviceEnumerator 为您包装的 NAudio 以枚举音频端点设备。例如:
var enumerator = new MMDeviceEnumerator();
foreach (var endpoint in
enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active))
{
Console.WriteLine(endpoint.FriendlyName);
}
【讨论】:
这是一个例子
添加对 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
}
【讨论】:
/// <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)
【讨论】:
检查 waveOutGetNumDevs API
[DllImport("winmm.dll", SetLastError = true)]
public static extern uint waveOutGetNumDevs();
返回设备的数量。返回值为零表示不存在任何设备或发生错误。 http://msdn.microsoft.com/en-us/library/dd743860(v=vs.85).aspx
【讨论】: