Je suppose que ce code s'exécute dans une boucle serrée et est destiné à bloquer sur snd_pcm_writen()
. Le taux d'échantillonnage n'est pas donné ; Je suppose 48kHz puisque les nombres se divisent tous bien.
Je pense que ce qui se passe ici est le suivant :
snd_pcm_write()
ne garantit pas d'écrire toutes les trames fournies (la valeur de retour n'est vérifiée que pour les conditions d'erreur). À en juger par la journalisation desnd_pcm_avail()
il consomme en faitavail_min
ou144
cadres sur chacun. C'est 3ms d'audio.- En supposant que l'audio ne fonctionne pas à ce stade, après deux écritures, le nombre d'images dans le tampon est égal à
start_threshold
- à288
échantillons ; la sortie audio démarre - appels au
printf()
bloc, et je crois me souvenir quesnd_pcm_avail()
doit se synchroniser avec le matériel de sortie audio et peut également se bloquer. Étant donné que vous avez maintenant 6 ms d'avance sur la lecture, il est tout à fait possible que le tampon fonctionne à sec pendant le temps du troisième appel desnd_pcm_writen()
En résumé, vous ne devriez pas appeler le printf()
à ce stade, et vous devez probablement compenser le fait que snd_pcm_writen()
ne consomme pas toutes les images dans pSpeakerBuf