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_min
o144
marcos 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
- en288
muestras; 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