Ich nehme an, dieser Code läuft in einer engen Schleife und soll auf snd_pcm_writen()
blockieren . Die Abtastrate wird nicht angegeben; Ich gehe von 48 kHz aus, da sich die Zahlen alle gut teilen lassen.
Was meiner Meinung nach hier vor sich geht, ist Folgendes:
snd_pcm_write()
garantiert nicht, dass alle bereitgestellten Frames geschrieben werden (der Rückgabewert wird immer nur auf Fehlerbedingungen überprüft). Gemessen an der Protokollierung vonsnd_pcm_avail()
es verbraucht tatsächlichavail_min
oder144
Rahmen auf jedem. Dies sind 3 ms Audio.- Unter der Annahme, dass Audio zu diesem Zeitpunkt nicht läuft, ist die Anzahl der Frames im Puffer nach zwei Schreibvorgängen gleich
start_threshold
- unter288
Proben; Audioausgabe startet - ruft
printf()
auf Block, und ich meine mich an diesensnd_pcm_avail()
zu erinnern muss sich mit der Audioausgabehardware synchronisieren und kann auch blockieren. Da Sie der Wiedergabe jetzt 6ms voraus sind, ist es durchaus möglich, dass der Puffer während der Zeit des dritten Aufrufs vonsnd_pcm_writen()
leer läuft
Zusammenfassend sollten Sie printf()
nicht anrufen an dieser Stelle, und Sie müssen wahrscheinlich die Tatsache kompensieren, dass snd_pcm_writen()
verbraucht nicht alle Frames in pSpeakerBuf