2010-10-14 102 views
7

我有一個C++對象,它接受聲音請求並用ALSA播放它們。有線程處理聲音請求。有些聲音是週期性的,在wav文件內容寫入ALSA庫之後會重新安排。有什麼方法可以查明所有數據何時播放?函數snd_pcm_writei是一個阻塞寫入函數,但並不一定意味着該文件已被播放。ALSA:如何判斷聲音何時播放完畢

我正在考慮的一個選擇是在播放每個聲音文件後調用snd_pcm_drain,然後在播放下一個文件時調用snd_pcm_prepare。這會是一個很好的解決方案嗎?或者這是低效的?

更新:「排水解決方案」似乎工作,但效率不高。這些調用需要一段時間才能返回(也許它會清理一些資源),並增加了程序的延遲時間。當我連續播放許多小文件時,延遲效果最佳。每個文件之間可以聽到幾秒鐘的靜音;這是執行snd_pcm_drain。

回答

4

可能不正確(我已經在這方面做的工作很少),但在ALSA文檔這裏尋找:http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html

看起來snd_pcm_status_t認爲,應該給你的指示的狀態信息流是否正在處理數據。

+0

我前幾天看了一下PCM狀態,看起來沒有「播放」狀態。 – waffleman 2010-10-19 18:38:08

+0

再次 - 沒有使用它我不確定,但我會認爲樣本中的可用計數 - snd_pcm_status_get_avail()'可能會給你一個值,表明是否有剩餘的東西可以播放。我建議把一些簡單的測試用例放在一起,看看不同的值如何表現。 – paulw1128 2010-10-20 11:01:26