如何将WAVE_MAPPER音频线与其音频设备相关联

时间:2009-12-10 19:49:58

标签: c# c++ audio pinvoke winmm

我正在开发一个应用程序,除其他外,枚举所有输入音频设备(使用SetupAPI),然后为每个音频设备列出所有输入音频线(使用winmm.dll)。

基本上,我将两者联系起来的方式是从音频设备获取设备路径,然后使用waveInMessage来比较音频线的设备路径。

现在,我希望能够对Windows默认[输入]音频线(WAVE_MAPPER)执行相同的操作。

问题是waveInGetDevCaps使用WAVE_MAPPER会返回“Microsoft Sound Mapper”,而waveInMessage使用DRV_QUERYDEVICEINTERFACE会返回空字符串。

有关如何找出Microsoft Mapper映射到哪个设备的任何建议?

3 个答案:

答案 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与其底层音频设备联系起来,而是将其视为原样:默认音频设备。