如何将 WAVE_MAPPER 音频线与其音频设备相关联
Posted
技术标签:
【中文标题】如何将 WAVE_MAPPER 音频线与其音频设备相关联【英文标题】:How to relate WAVE_MAPPER audio line with its audio device 【发布时间】:2009-12-10 19:49:57 【问题描述】:我正在开发一个应用程序,除其他外,枚举所有输入音频设备(使用SetupAPI
),然后对于每个音频设备,它列出所有输入音频线(使用winmm.dll
)。
基本上,我将两者联系起来的方式是从音频设备获取设备路径,然后使用waveInMessage
比较音频线的设备路径。
现在,我希望能够对 Windows 默认 [输入] 音频线 (WAVE_MAPPER
) 执行相同操作。
问题在于,将waveInGetDevCaps
与WAVE_MAPPER
一起使用会返回“Microsoft Sound Mapper”,而将waveInMessage
与DRV_QUERYDEVICEINTERFACE
一起使用会返回一个空字符串。
关于如何找出 Microsoft Mapper 映射到哪个设备的任何建议?
【问题讨论】:
【参考方案1】:WAVE_MAPPER 映射到的设备取决于传递给 waveInOpen 的参数。来自文档:
WAVE_MAPPER - 该函数选择能够以指定格式录制的波形音频输入设备。
这意味着您无法在不实际打开设备的情况下检查设备属性。打开后,您应该可以通过waveInGetID
获取实际的设备ID。
【讨论】:
waveInGetID 是我尚未移植到 C# 的函数之一。通过阅读它的文档,听起来它应该可以工作。我会测试您的建议,并在此处告知是否可行。 刚刚测试过...从waveInOpen 获得句柄,然后将句柄传递给waveInGetID...。我得到了什么...哈哈哈...-1 (WAVE_MAPPER)。也许这就是为什么 google 上的第一个条目说“此功能支持向后兼容。新应用程序可以转换设备的句柄而不是检索设备标识符。”【参考方案2】:我发现 DirectSound 更容易,而且 XP 到 Vista 未记录的怪事要少得多(而且一般来说,未记录的怪事要少得多)。
但可能解决此问题的唯一方法是枚举所有其他设备并查看哪一个与 WAVE_MAPPER 匹配。
老实说……使用 DirectSound,或者,如果您只能使用 Vista 和 Win 7,请使用 Core Audio API。 Winmm 是一个古老的 API,当它第一次被引入时已经很糟糕了......
【讨论】:
问题是我们必须支持windows 2000及以上。现在关于您的建议,我实际上是在枚举所有设备,但问题是我没有什么可以坚持和比较的......我找不到将 WAVE_MAPPER 与我已经拥有的设备列表相匹配的方法。 DirectSound 可以在 Win 2K 上开箱即用 .. 但这取决于你。我仍然强烈建议避免使用 winmm ......但祝你好运,我希望所有无证更改不要像他们那样咬你!【参考方案3】:如果我错了,请纠正我,但我一直在观看过去 Microsoft 会议上有关声音开发的一些视频。在拉里·奥斯特曼 (Larry Osterman) 的最新一期中,他提到了 [我相信] Windows 7 中他的团队正在开发的新声音功能。
其中一个功能是[名称是我的解释]“设备热插拔”。假设您的应用程序正在使用“windows 默认声音播放”端点进行播放,此时是一组 USB 耳机。突然,你断开了耳机。在 Windows 7 之前,您的应用程序会崩溃 [如果您没有预见到该测试场景]。在 Windows 7 中 [这里是原始主题的钩子],如果您使用 Windows 默认播放设备,Windows 会优雅地自动将输出流切换到新的默认值,这可能是扬声器。
我想要达到的是,我正在尝试将 WAVE_MAPPER 设备放入一个不应该存在的类中。也许,从概念上讲,WAVE_MAPPER 尽管具有相同的音频流输入和输出能力,但应该被视为例外。
我会尽量说得更具体一些。在我的应用程序中,我有一个音频设备列表,每个音频设备都有一个音频线列表。音频设备具有 VID 和 PID 等属性,这些属性可以通过 SetupAPI 轻松发现,并且可以通过 winmm 的 waveInMessage 与音频线路相关联。 WAVE_MAPPER 不遵循该逻辑,我试图做到这一点。
因此,我不会尝试将 WAVE_MAPPER 与其底层音频设备相关联,而是将其视为默认音频设备。
【讨论】:
以上是关于如何将 WAVE_MAPPER 音频线与其音频设备相关联的主要内容,如果未能解决你的问题,请参考以下文章