Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 直接渲染到WASAPI时,两个流之一没有音频输出_C++_Audio_Visual C++_Wasapi - Fatal编程技术网

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

C++ 直接渲染到WASAPI时,两个流之一没有音频输出,c++,audio,visual-c++,wasapi,C++,Audio,Visual C++,Wasapi,我已经被这个问题困扰了好几个星期了,谷歌帮不了我,所以希望这里有人能帮我 我在C++中设计了软件声音混合器,从网络和Windows麦克风中获取音频包,将它们混合在一起作为PCM,然后通过网络和扬声器/ USB耳机发送回它们。这很有效。我有一个使用PortAudio库处理Windows界面的工作设置。然而,我的主管认为该软件和我们的系统之间的延迟可以减少,因此为了降低延迟(并更好地处理USB耳机断开连接),我现在重写Windows界面层,直接使用WASAPI。我可以消除一些缓冲区和回调来实现这一点

我已经被这个问题困扰了好几个星期了,谷歌帮不了我,所以希望这里有人能帮我

我在C++中设计了软件声音混合器,从网络和Windows麦克风中获取音频包,将它们混合在一起作为PCM,然后通过网络和扬声器/ USB耳机发送回它们。这很有效。我有一个使用PortAudio库处理Windows界面的工作设置。然而,我的主管认为该软件和我们的系统之间的延迟可以减少,因此为了降低延迟(并更好地处理USB耳机断开连接),我现在重写Windows界面层,直接使用WASAPI。我可以消除一些缓冲区和回调来实现这一点,并且理论上使用超低延迟接口,如果这对于更高级别的ups来说还不够快的话

我现在只有部分工作了,而部分工作正是在这里折磨我的。我们的系统将扬声器和耳机作为三个独立的单声道音频流。扬声器为单声道,耳机由两个音频流组合成立体声。我将它作为两个流输出到windows,一个用于用户选择的扬声器设备,另一个用于用户选择的耳机设备。为了进行测试,它们都输出到我系统上的默认通用立体声混音

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

这不是一个排他性的模式问题:我在所有流上都使用共享模式,我甚至专门尝试将流减少到只使用耳机,以防其中一个踩到另一个或其他什么东西,而耳机仍然没有音频输出

这不是上游的混音器问题,因为我在使用PortAudio流时没有修改过任何代码。我可以看到音频通过混音器并通过调试可视化工具输出

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


我做错了什么?看起来Windows本身就是问题所在,但我没有Windows API方面的专业知识,我显然是公司里这方面的专家。我甚至还没有找到麦克风输入不起作用的原因,我已经被困在这个问题上好几个星期了。如果有人有任何建议,我们将不胜感激。

检查重新采样的流:将立体声流输出到扬声器,将单声道流输出到手机

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


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

这对我的问题没有帮助。然而,您提到的
IsFormatSupported
提醒我,扬声器流总是会因为mono而被拒绝格式,因此我询问系统设备是否支持自己的默认格式,并将其转换为默认格式。我用耳机做了同样的特技,现在可以了。这意味着,耳机从
IsFormatSupported
获得的“最接近”格式是一个彻头彻尾的谎言,因为它无法支持它自己建议的格式。谢谢,微软。