如何使用 ALSA API 在应用程序中切换单声道和立体声输出?

How can I switch my sound output between mono and stereo in an app using the ALSA API?

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

snd_pcm_hw_params_set_channels (cd::output_handle, cd::output_params, (unsigned int) 2);

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

只有当 PCM 流不是 运行 时,您才可以更改硬件参数。参见:https://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html。您需要先用所需的配置填充 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);
}