我有一個C++對象,它接受聲音請求並用ALSA播放它們。有線程處理聲音請求。有些聲音是週期性的,在wav文件內容寫入ALSA庫之後會重新安排。有什麼方法可以查明所有數據何時播放?函數snd_pcm_writei是一個阻塞寫入函數,但並不一定意味着該文件已被播放。ALSA:如何判斷聲音何時播放完畢
我正在考慮的一個選擇是在播放每個聲音文件後調用snd_pcm_drain,然後在播放下一個文件時調用snd_pcm_prepare。這會是一個很好的解決方案嗎?或者這是低效的?
更新:「排水解決方案」似乎工作,但效率不高。這些調用需要一段時間才能返回(也許它會清理一些資源),並增加了程序的延遲時間。當我連續播放許多小文件時,延遲效果最佳。每個文件之間可以聽到幾秒鐘的靜音;這是執行snd_pcm_drain。
我前幾天看了一下PCM狀態,看起來沒有「播放」狀態。 – waffleman 2010-10-19 18:38:08
再次 - 沒有使用它我不確定,但我會認爲樣本中的可用計數 - snd_pcm_status_get_avail()'可能會給你一個值,表明是否有剩餘的東西可以播放。我建議把一些簡單的測試用例放在一起,看看不同的值如何表現。 – paulw1128 2010-10-20 11:01:26