【问题标题】:How can I switch my sound output between mono and stereo in an app using the ALSA API?如何使用 ALSA API 在应用程序中在单声道和立体声之间切换声音输出?
【发布时间】:2020-04-06 23:08:48
【问题描述】:

asoundrc 配置文件中可以做到这一点,但我需要一个应用程序级别的解决方案,而无需重新启动应用程序。到目前为止,我的应用程序的 init 部分中有这行代码:

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

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

【问题讨论】:

    标签: c++ alsa


    【解决方案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);
    }
    

    【讨论】:

    • 好的,谢谢。所以我将不得不暂停音频流,然后应用你建议我的代码,最后继续播放流,对吗?
    • 不,我认为snd_pcm_pause() 还不够(并不是每个设备都支持)。可以使用snd_pcm_drop()snd_pcm_drain() 停止流。不过,您不需要snd_pcm_close()
    • 无用:snd_pcm_drain () 引发错误 #77(无效句柄)。 snd_pcm_drop () 死掉了,但调用 snd_pcm_hw_params_set_channels () 总是以 stack smashing detected 结尾,然后立即中止。
    • 在这个或另一个问题中发布minimal reproducible example
    • 好的,我还没有机会用一个最小的例子来解决这个问题,但我至少可以应用一个成功的解决方法:在播放当前曲目后,现在更改单声道/立体声.至少对我来说,已经足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多