2010-10-14 4 views
7

Ich habe ein C++ Objekt, das Soundanfragen akzeptiert und sie mit ALSA abspielt. Es gibt einen Thread, der die Soundanforderungen verarbeitet. Einige Sounds sind periodisch und werden neu geplant, nachdem der Inhalt der wav-Datei in die ALSA-Bibliothek geschrieben wurde. Kann ich herausfinden, wann alle Daten abgespielt wurden? Die Funktion snd_pcm_writei ist eine blockierende Schreibfunktion, bedeutet aber nicht unbedingt, dass die Datei abgespielt wurde.ALSA: Wie man weiß, wann ein Sound abgespielt wird

Eine Option, die ich in Erwägung ziehe, ist, nach dem Abspielen jeder Sounddatei snd_pcm_drain aufzurufen, und dann snd_pcm_prepare aufzurufen, wenn ich die nächste Datei abspiele. Wäre das eine gute Lösung? Oder ist das ineffizient?

Update: Die "Drain-Lösung" scheint zu funktionieren, ist aber nicht sehr effizient. Die Aufrufe brauchen eine Weile, um zurückzukehren (vielleicht räumt sie einige Ressourcen auf) und fügt dem Programm Latenz hinzu. Die Latenz wird am besten gesehen, wenn ich viele kleine Dateien nacheinander abspiele. Ein paar Sekunden Stille sind zwischen jeder Datei zu hören; Dies ist die Ausführung von snd_pcm_drain.

Antwort

4

könnte nicht richtig sein (ich habe sehr wenig Arbeit in diesem Bereich getan), aber hier an dem ALSA docs von der Suche: http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html

Es ist wie snd_pcm_status_t sieht die Statusinformationen enthalten, die Ihnen einen Hinweis geben sollte ob der Stream gerade Daten verarbeitet oder nicht.

+0

Ich habe den PCM-Status vor ein paar Tagen angeschaut und es scheint keinen "spielenden" Zustand zu haben. – waffleman

+0

Nochmal - ich habe es nicht benutzt, weiß es nicht genau, aber ich hätte gedacht, dass 'available count in samples - snd_pcm_status_get_avail()' Ihnen einen Wert geben könnte, der anzeigt, ob noch etwas zu spielen ist. Ich würde empfehlen, einige einfache Testfälle zusammenzustellen und zu untersuchen, wie sich die verschiedenen Werte verhalten. – paulw1128

Verwandte Themen