Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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++ 如何在使用ALSA API的应用程序中在单声道和立体声之间切换声音输出?_C++_Alsa - Fatal编程技术网

C++ 如何在使用ALSA API的应用程序中在单声道和立体声之间切换声音输出?

C++ 如何在使用ALSA API的应用程序中在单声道和立体声之间切换声音输出?,c++,alsa,C++,Alsa,可以在asoundrcconfig文件中执行此操作,但我需要一个应用程序级解决方案,而无需重新启动应用程序。到目前为止,我的应用程序的init部分已经有了这行代码: snd_pcm_hw_params_set_通道(cd::output_handle,cd::output_params,(unsigned int)2); 音频数据流来自CD驱动器,因此它始终具有2个通道(立体声)。我可以在运行时简单地将通道计数设置为1吗?谢谢。您只能在PCM流未运行时更改硬件参数。请参阅:。您需要首先使用所需

可以在
asoundrc
config文件中执行此操作,但我需要一个应用程序级解决方案,而无需重新启动应用程序。到目前为止,我的应用程序的init部分已经有了这行代码:

snd_pcm_hw_params_set_通道(cd::output_handle,cd::output_params,(unsigned int)2);

音频数据流来自CD驱动器,因此它始终具有2个通道(立体声)。我可以在运行时简单地将通道计数设置为1吗?谢谢。

您只能在PCM流未运行时更改硬件参数。请参阅:。您需要首先使用所需的配置填充
snd_pcm_hw_params_t
结构,然后使用
snd_pcm_hw_params()
应用此配置。例如:

int err;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
snd_pcm_hw_params_alloca(&params);

err = snd_pcm_open(&handle, "default" //, ...
//...
err = snd_pcm_hw_params_any(handle, params);
//...

if((err = snd_pcm_hw_params_set_channels(handle, params, 2)) == 0) {
    err = snd_pcm_hw_params(handle, params);
}

好的,谢谢。因此,我将不得不暂停音频流,然后应用您向我建议的代码,最后恢复播放该流,对吗?不,我认为
snd\u pcm\u pause()
不够(并非所有设备都支持这一点)。可以使用
snd\u pcm\u drop()
snd\u pcm\u drain()
停止流。不过,您不需要
snd\u pcm\u close()
。没有使用:
snd\u pcm\u drain()
会引发错误77(无效句柄)
snd_pcm_drop()
会停止工作,但调用
snd_pcm_hw_params_set_channels()
总是以检测到的
堆栈崩溃结束,然后立即中止。在这个问题或另一个问题中发布a。好的,我还没有机会用一个简单的例子来解决这个问题,但我至少可以应用一个成功的解决方法:在播放当前曲目后,现在更改单声道/立体声。至少对我来说,这已经足够了。