2010-10-14 11 views
7

Ho un oggetto C++ che accetta richieste sonore e le suona con ALSA. C'è una discussione che elabora le richieste sonore. Alcuni suoni sono periodici e sono riprogrammati dopo che il contenuto del file wav è stato scritto nella libreria ALSA. C'è un modo per scoprire quando sono stati riprodotti tutti i dati? La funzione snd_pcm_writei è una funzione di scrittura bloccante, ma non significa necessariamente che il file è stato riprodotto.ALSA: Come sapere quando un suono ha finito di suonare

Un'opzione che sto prendendo in considerazione è chiamare snd_pcm_drain dopo aver riprodotto ciascun file audio, quindi chiamare snd_pcm_prepare quando riproduco il file successivo. Questa sarebbe una buona soluzione? O è questo inefficiente?

Aggiornamento: La "soluzione di scarico" sembra funzionare, ma non è molto efficiente. Le chiamate richiedono un po 'di tempo per tornare (forse pulisce alcune risorse) e aggiunge latenza al programma. La latenza è vista meglio quando riproduco molti piccoli file consecutivamente. Si possono sentire alcuni secondi di silenzio tra ogni file; questo è snd_pcm_drain in esecuzione.

risposta

4

Potrebbe non essere corretto (ho fatto un lavoro molto poco in questa zona), ma dal guardare la documentazione ALSA qui: http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html

Sembra snd_pcm_status_t contiene le informazioni di stato che dovrebbe dare un indicazione di se lo stream sta attualmente elaborando i dati o meno.

+0

Ho guardato lo stato PCM pochi giorni fa e non sembra avere uno stato di "riproduzione". – waffleman

+0

Ancora - non averlo usato non lo so per certo, ma avrei pensato che 'contante disponibile in campioni - snd_pcm_status_get_avail()' potrebbe darti un valore che indicherà se c'è ancora qualcosa da giocare. Suggerirei di mettere insieme alcuni semplici casi di test e di osservare come si comportano i vari valori. – paulw1128

Problemi correlati