2010-12-17 54 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