2010-12-17 639 views
2

我有一个程序,执行以下操作:ALSA:打开和关闭PCM在即时

  1. 打开默认的PCM与snd_pcm_open()功能
  2. 发送样本播放声音
  3. 关闭PCM与snd_pcm_close()函数

程序将定期播放任何声音要求它重新ceives,但偶尔open会失败并返回“Device or resource busy”错误。这通常发生在有很多声音文件时。但是,关闭电话总是成功的。我会假设,如果关闭是成功的,PCM将立即供其他人使用。我还应该补充说,使用声音的系统上没有其他任何东西。

ALSA在关闭后还需要清理一些资源吗? PCM接口是否设计为经常打开和关闭?互联网上的大多数例子在启动时打开PCM流并在关闭时关闭。

回答

1

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

snd_pcm_open()snd_pcm_close()只有一次(启动和应用程序的结束),当您想要重置您的视频流使用:

snd_pcm_drop() 

snd_pcm_prepare() 

通常该不该”完全不成问题,因为dmix可以处理多个流。但是,如果您使用的是直接hw:0访问,则close()步骤可能会以某种方式异步执行,而立即使用open()可能无法正常工作。

+0

关闭pcm似乎是我可以在DAPM核心中生成SND_SOC_DAPM_PRE_PMD小部件事件的唯一方法(我的动机是省电)。是否有另一种方式来通过alsa-lib触发这个? – waffleman 2011-01-25 20:27:35

+1

@Mister:那么我们如何管理不断变化的采样率?例如,我有2个PCM流,44.1KHz和48KHz采样率,我想输出这个音频s(即一些时间44.1和一些时间48)。我认为在这个切换期间,Alsa需要关闭和打开。还有其他方法吗? – jjb 2015-10-19 00:48:45