我正在开发一个应用程序,除其他外,枚举所有输入音频设备(使用SetupAPI
),然后为每个音频设备列出所有输入音频线(使用winmm.dll
)。
基本上,我将两者联系起来的方式是从音频设备获取设备路径,然后使用waveInMessage
来比较音频线的设备路径。
现在,我希望能够对Windows默认[输入]音频线(WAVE_MAPPER
)执行相同的操作。
问题是waveInGetDevCaps
使用WAVE_MAPPER
会返回“Microsoft Sound Mapper”,而waveInMessage
使用DRV_QUERYDEVICEINTERFACE
会返回空字符串。
有关如何找出Microsoft Mapper映射到哪个设备的任何建议?
答案 0 :(得分:3)
WAVE_MAPPER映射到的设备取决于传递给waveInOpen的参数。来自文档:
WAVE_MAPPER - 该功能选择能够以指定格式录制的波形音频输入设备。
这意味着您无法在未实际打开的情况下检查设备属性。打开后,您应该可以使用waveInGetID
获取实际的设备ID。
答案 1 :(得分:1)
对于一个人来说,我发现DirectSound要容易得多,并且远远少于Vista无法识别的奇怪(并且通常远没有那些无证的奇怪)。
但是,你可以解决的唯一方法就是枚举所有其他设备并查看哪一个与WAVE_MAPPER匹配。
老实说虽然......使用DirectSound,或者如果你只能做Vista和Win 7,请使用Core Audio API。 Winmm是一个ANCIENT API,并且在它首次推出时非常破碎......
答案 2 :(得分:1)
如果我错了,请纠正我,但我一直在观看微软会议上关于声音开发的一些视频。在拉里·奥斯特曼(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与其底层音频设备联系起来,而是将其视为原样:默认音频设备。