【问题标题】:ALSA: Opening and closing PCM On-The-FlyALSA:打开和关闭 PCM On-The-Fly
【发布时间】:2011-05-27 08:49:44
【问题描述】:

我有一个执行以下操作的程序:

  1. 使用 snd_pcm_open() 函数打开默认 PCM
  2. 发送样本以播放声音
  3. 使用 snd_pcm_close() 函数关闭 PCM

程序会定期播放它收到的任何声音请求,但偶尔打开会失败并返回“设备或资源忙”错误。这通常发生在有大量声音文件时。但是,关闭电话总是成功的。我假设如果关闭成功,那么 PCM 将立即可供其他任何人使用。我还应该补充一点,系统上没有其他使用声音的东西。

ALSA 是否有可能在关闭后仍需要清理一些资源? PCM接口不是设计成经常打开和关闭的吗? Internet 上的大多数示例在启动时打开 PCM 流并在关闭时将其关闭。

【问题讨论】:

    标签: c linux audio alsa


    【解决方案1】:

    不要经常关闭和打开它。你可以使用

    snd_pcm_open() 和 snd_pcm_close() 仅一次(应用程序的开始和结束),当您想要重置流时使用它:

    snd_pcm_drop()
    

    和

    snd_pcm_prepare()
    

    通常这根本不成问题,因为 dmix 可以处理多个流。但是,如果您使用直接 hw:0 访问,则 close() 步骤可能在某种程度上是异步的,即立即 open() 可能无法正常工作。

    【讨论】:

    • 关闭 pcm 似乎是我可以在 DAPM 核心中生成 SND_SOC_DAPM_PRE_PMD 小部件事件的唯一方法(我的动机是省电)。还有其他方法可以通过 alsa-lib 触发吗?
    • @Maister:那我们如何管理流中不断变化的采样率呢?例如,我有 2 个采样率分别为 44.1 KHz 和 48KHz 的 PCM 流,我想输出这个音频(即某个时间 44.1 和某个时间 48)。我认为在此切换期间,Alsa 需要关闭和打开。还有其他方法吗?
    • @jjm 不,只需调用 snd_pcm_drain() 以旧的采样率播放所有待处理的帧,然后为 pcm 设置包含更改的采样率的新参数就足够了。
    • @waffleman 您是否找到了避免在每次使用时打开/关闭 pcm 的解决方案?我有同样的问题。如果我在所有生命代码期间保持 pcm 处于打开状态,那么省电效果非常糟糕。我尝试了暂停或暂停 alsa 功能,但没有更多成功。
    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 2023-03-06
    • 2011-10-22
    • 2010-12-18
    • 2016-02-06
    • 1970-01-01
    • 2011-12-31
    • 2018-06-16
    相关资源
    最近更新 更多