2010-10-14 7 views
7

Ses isteklerini kabul eden ve bunları ALSA ile çalan bir C++ nesnesine sahibim. Ses isteklerini işleyen iş parçacığı var. Bazı sesler periyodiktir ve wav dosyası içerikleri ALSA kütüphanesine yazıldıktan sonra yeniden zamanlanır. Tüm verilerin oynatıldığını öğrenebilmemin bir yolu var mı? Snd_pcm_writei işlevi engelleme yazma işlevidir, ancak dosyanın oynatılmasının zorunlu olduğu anlamına gelmez.ALSA: Bir sesin ne zaman biteceğini nasıl söylerim

Göz önünde bulundurduğum bir seçenek, her bir ses dosyasını yürüttükten sonra snd_pcm_drain 'i çağırmaktır, sonra bir sonraki dosyayı yürüttüğümde snd_pcm_prepare öğesini çağırın. Bu iyi bir çözüm olur mu? Yoksa bu verimsiz mi?

Güncelleme: "Drenaj çözümü" işe yarıyor gibi görünüyor, ancak çok verimli değil. Çağrılar biraz zaman alır (belki de bazı kaynakları temizler) ve programa gecikme ekler. Birden çok küçük dosyayı arka arkaya oynatırken gecikme en iyi şekilde görülür. Her dosya arasında birkaç saniye sessizlik duyulabilir; Bu snd_pcm_drain yürütüyor.

cevap

4

, ama burada ALSA docs bakarak (i ​​bu alanda çok az iş yaptık) doğru olmasa gerek: http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html Bu snd_pcm_status_t benziyor

size bir göstergesi vermelidir durum bilgilerini tutan Akışın şu anda veri işleyip işlemeyeceği.

+0

Birkaç gün önce PCM durumuna baktım ve bir "oynatma" durumuna sahip görünmüyor. – waffleman

+0

Yine - onu kullanmıyorum Kesin bilmiyorum, ama örneklerde mevcut sayımın - snd_pcm_status_get_avail() 'ın, oynamak için geriye kalan bir şey olup olmadığını gösterecek bir değer vereceğini düşünürdüm. Bazı basit test senaryolarını bir araya getirmeyi ve çeşitli değerlerin nasıl davrandığını incelemenizi tavsiye ederim. – paulw1128

İlgili konular