Supongo que este código se ejecuta en un bucle cerrado y está destinado a bloquearse en snd_pcm_writen() . No se proporciona la frecuencia de muestreo; Supongo que 48kHz ya que todos los números se dividen muy bien.
Lo que creo que va aquí es lo siguiente:
snd_pcm_write()no garantiza escribir todos los marcos provistos (el valor de retorno solo se verifica en busca de condiciones de error). A juzgar por el registro desnd_pcm_avail()de hecho, está consumiendoavail_mino144marcos en cada uno. Esto es 3 ms de audio.- Suponiendo que el audio no se está ejecutando en este punto, después de dos escrituras, la cantidad de fotogramas en el búfer es igual a
start_threshold- en288muestras; comienza la salida de audio - llamadas a
printf()block, y me parece recordar quesnd_pcm_avail()tiene que sincronizarse con el hardware de salida de audio y también puede bloquearse. Dado que ahora está 6 ms por delante de la reproducción, es muy posible que el búfer se esté agotando durante el tiempo de la tercera llamada desnd_pcm_writen()
En resumen, no deberías llamar al printf() en este punto, y probablemente necesite compensar el hecho de que snd_pcm_writen() no está consumiendo todos los marcos en pSpeakerBuf