使用 winmm.dll 时,啥决定了 windows 中声音设备的顺序?

Posted

技术标签:

【中文标题】使用 winmm.dll 时,啥决定了 windows 中声音设备的顺序?【英文标题】:What determines the order for sound devices in windows when using winmm.dll?使用 winmm.dll 时,什么决定了 windows 中声音设备的顺序? 【发布时间】:2009-10-01 18:06:33 【问题描述】:

我正在尝试使用 NAudio 创建一个多声音输出应用程序。我们安装了 8 个 USB 声卡。 NAudio 让我可以使用全部 8 个,但我无法确定确定哪个设备索引是哪个卡的模式。

这些卡将连接到不同的硬件,因此确保您知道您使用的是哪张卡非常重要。

我一直在尝试使用 WMI 来轮询信息,但我似乎无法找到任何决定声音设备顺序的信息。

更新: 我忘记包含有关此问题的一些信息。声卡都是通过 12 端口集线器连接的 USB 声卡。

【问题讨论】:

【参考方案1】:

对于所有版本的 Windows,设备的顺序是不确定的。对于 Vista 及更高版本,设备通常按 DSound GUID(或多或少)排序,因此它们实际上是随机的。

【讨论】:

和我想的差不多,但我想我有办法弄清楚。【参考方案2】:

我假设您正在使用 WaveOut?您可以调用 WaveOut.GetCapabilities(deviceNumber) 来获取设备的名称,这可能会对您有所帮助。

【讨论】:

如果它们不是完全相同的 USB 声卡,这将起作用。抱歉,我之前没有提到这一点。不过还是谢谢。【参考方案3】:

这是我迄今为止想出的,对我们有用。

使用 WMI,您可以从 Win32_SoundDevice 获取 DeviceID。然后使用它,您可以访问 HKLM\SYSTEM\CurrentControlSet\ENUM\'DeviceID' 的注册表并获取名为“Driver”的字符串值。此值包含 ClassGUID 加上末尾的数字。

示例:4d36e96c-e325-11ce-bfc1-08002be10318\0015

如果您去掉所有声音设备的最后一个数字*(15)* 并订购它们,这就是使用 winmm.dll 从 NAudio 列出设备的顺序。这些声音设备也有一个位置,可以在同一键的注册表中,也可以使用 DeviceID 来自 Win32_PNPEntity。

在我们的例子中,位置让我们确定声音设备插入到 USB 集线器的哪个端口。

【讨论】:

【参考方案4】:

看看这篇 MSDN 文章。它使用 DirectSound 枚举音频设备:

http://msdn.microsoft.com/en-us/library/bb318674(VS.85).aspx

【讨论】:

还没有尝试过,因为我必须将 DirectX 程序集带入代码中。我会试试这一切都失败了。

以上是关于使用 winmm.dll 时,啥决定了 windows 中声音设备的顺序?的主要内容,如果未能解决你的问题,请参考以下文章

带有 winmm3.dll 的音频播放/倒带功能

Windows Phone 开发:使用 winmm.dll 播放内部 mp3 文件

winmm.dll的文件信息

Windows高速定时器,多媒体定时器winmm.dll库的使用

MonoDevelop + NAudio + Ubuntu Linux 告诉我找不到 Winmm.dll?

是否在每个 Windows 安装中都可以找到声音库 WINMM.DLL?