2

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

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

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

问题是使用waveInGetDevCapsforWAVE_MAPPER返回“Microsoft Sound Mapper”,使用waveInMessagewithDRV_QUERYDEVICEINTERFACE返回一个空字符串。

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

4

3 回答 3

3

WAVE_MAPPER 映射到的设备取决于传递给 waveInOpen 的参数。从文档中:

WAVE_MAPPER - 该函数选择能够以指定格式录制的波形音频输入设备。

这意味着您无法在不实际打开设备的情况下检查设备属性。打开它后,您应该能够使用waveInGetID.

于 2009-12-10T20:19:26.130 回答
1

好吧,我发现 DirectSound 要容易得多,而且 XP 到 Vista 未记录的怪事要少得多(而且总体上未记录的怪事要少得多)。

但可能解决此问题的唯一方法是枚举所有其他设备并查看哪一个与 WAVE_MAPPER 匹配。

不过老实说……使用 DirectSound,或者,如果您只能使用 Vista 和 Win 7,请使用 Core Audio API。Winmm 是一个古老的 API,当它第一次被引入时已经很糟糕了......

于 2009-12-10T20:18:19.173 回答
1

如果我错了,请纠正我,但我一直在观看过去 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 与其底层音频设备相关联,而是将其视为它的本来面目:默认音频设备。

于 2009-12-11T20:36:31.997 回答