3

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

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

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

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

4

1 回答 1

3

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

snd_pcm_open()并且snd_pcm_close()只有一次(应用程序的开始和结束)并在您想要重置流时使用它:

snd_pcm_drop()

snd_pcm_prepare()

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

于 2010-12-17T21:38:48.960 回答