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_minou144cadres 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