直接渲染到WASAPI时,两个流之一没有音频输出

时间:2019-11-14 00:31:42

标签: c++ audio visual-c++ wasapi

我已经在这个问题上停留了好几个星期了,而Google对此无能为力,所以希望这里的一些人能对我有所帮助。

我正在用C ++编写软件混音器,从网络和Windows麦克风获取音频数据包,将它们作为PCM混合在一起,然后通过网络发送回扬声器和USB耳机。这可行。我有使用PortAudio库处理Windows界面的有效设置。但是,我的主管认为此软件与我们的系统之间的延迟可能会减少,因此,为了降低延迟(并更好地处理USB耳机断开连接),我现在正在重写Windows接口层以直接使用WASAPI。我可以消除一些这样做的缓冲区和回调,并在理论上使用超低延迟接口,如果该接口仍不足以应付较高的延迟。

我现在只能部分工作,而部分原因是在这里杀死了我。我们的系统将扬声器和耳机作为三个独立的单声道音频流。扬声器为单声道,头戴式耳机由两个流组合成立体声。我将其作为两个流输出到Windows,一个流用于用户选择的扬声器设备,另一个用于用户选择的耳机设备。为了进行测试,它们都将输出到我系统上的默认常规立体声混音。

无论如何尝试,我都能听到很好的扬声器声音,但是却听不到耳机的声音。它们都使用相同的代码路径,都通过WMF重采样器以Windows所需的采样率转换为2声道音频。但是我能听到扬声器,但听不到耳机流。

这不是排他性模式的问题:我在所有流上都使用共享模式,甚至还专门尝试了将流仅削减到耳机,以防一个人踩到另一个或其他东西,并且仍然是耳机没有音频输出。

这不是上游的混音器问题,因为当它与PortAudio流一起使用时,我没有修改任何代码。我可以看到音频通过调音台并通过调试可视化器传递到输出。

当系统回叫以请求音频时,我可以看到数据进入了从系统获得的缓冲区。我应该听到的东西,甚至是静态的,但我什么也没得到。 (有一点,我完全绕过了环形缓冲区,将随机数直接放入回调的缓冲区中,但仍然没有声音。)

我在这里做错了什么?看来Windows本身就是问题所在或某些问题,但是我没有Windows API方面的专业知识才能知道是什么,而且我显然是我公司中有关此问题的最专家。我什至还没有想到为什么麦克风输入无法正常工作,而且我已经坚持了好几个星期。如果有人有任何建议,将不胜感激。

1 个答案:

答案 0 :(得分:1)

检查重新采样的流:将立体声流输出到扬声器,并将单声道流输出到听筒。

使用IAudioClient::IsFormatSupported检查手机支持的格式。

使用mp3文件验证您的代码。使用两个媒体播放器在不同的设备上同时播放不同的文件。