Presumo che questo codice venga eseguito in un ciclo stretto ed è destinato a bloccare su snd_pcm_writen()
. La frequenza di campionamento non è data; Presumo 48kHz poiché i numeri si dividono tutti bene.
Quello che penso stia succedendo qui è il seguente:
snd_pcm_write()
non garantisce la scrittura di tutti i frame forniti (il valore restituito viene controllato solo per condizioni di errore). A giudicare dalla registrazione disnd_pcm_avail()
sta infatti consumandoavail_min
o144
cornici su ciascuno. Sono 3 ms di audio.- Supponendo che l'audio non sia in esecuzione a questo punto, dopo due scritture, il numero di frame nel buffer è pari a
start_threshold
- al288
campioni; viene avviata l'uscita audio - chiamate a
printf()
block, e mi sembra di ricordare chesnd_pcm_avail()
deve sincronizzarsi con l'hardware di uscita audio e potrebbe anche bloccarsi. Dato che ora sei 6 ms avanti rispetto alla riproduzione, è del tutto possibile che il buffer si stia esaurendo durante il tempo della terza chiamata disnd_pcm_writen()
In sintesi, non dovresti chiamare printf()
a questo punto, e probabilmente dovrai compensare il fatto che snd_pcm_writen()
non consuma tutti i frame in pSpeakerBuf