¿Por qué hay latencia en este programa C++ ALSA (audio de Linux)?
Estoy explorando la generación de sonido usando C++ en Ubuntu Linux. Aquí está mi código:
“`cpp
#include <iostream>
#include <cmath>
#include <stdint.h>
#include <ncurses.h>
//para compilar: make [nombre_del_archivo] && ./[nombre_del_archivo]|aplay
int main()
{
initscr();
<pre><code>cbreak();
noecho();
nodelay(stdscr, TRUE);
scrollok(stdscr, TRUE);
timeout(0);
</code></pre>
for (int t = 0;; t++)
{
int ch = getch();
if (ch == 'q')
{
break;
}
<pre><code> uint8_t temp = t;
std::cout<<temp; }="" }="" “`=”” cuando=”” se=”” ejecuta=”” este=”” código,=”” quiero=”” que=”” genere=”” sonido=”” hasta=”” que=”” presione=”” “q”=”” en=”” mi=”” teclado,=”” después=”” quiero=”” que=”” el=”” programa=”” se=”” cierre.=”” esto=”” funciona=”” bien;=”” sin=”” embargo,=”” hay=”” un=”” retraso=”” notable=”” entre=”” presionar=”” el=”” teclado=”” y=”” que=”” el=”” programa=”” se=”” cierre.=”” esto=”” no=”” se=”” debe=”” a=”” un=”” retraso=”” con=”” ncurses,=”” ya=”” que=”” cuando=”” ejecuto=”” el=”” programa=”” sin=””></temp;><temp;` (es decir, sin generar sonido), no hay latencia.
¿hay alguna manera de solucionar esto? si no es así, ¿cómo se escriben los programas de audio en tiempo real y sensibles?
ediciones y sugerencias para la pregunta son bienvenidas. soy un principiante en alsa, por lo que no estoy seguro si se requiere algún detalle adicional para replicar el error. (es=”” decir,=”” sin=”” generar=”” sonido),=”” no=”” hay=”” latencia.=”” ¿hay=”” alguna=”” manera=”” de=”” solucionar=”” esto?=”” si=”” no=”” es=”” así,=”” ¿cómo=”” se=”” escriben=”” los=”” programas=”” de=”” audio=”” en=”” tiempo=”” real=”” y=”” sensibles?=”” ediciones=”” y=”” sugerencias=”” para=”” la=”” pregunta=”” son=”” bienvenidas.=”” soy=”” un=”” principiante=”” en=”” alsa,=”” por=”” lo=”” que=”” no=”” estoy=”” seguro=”” si=”” se=”” requiere=”” algún=”” detalle=”” adicional=”” para=”” replicar=”” el=””></temp;` (es decir, sin generar sonido), no hay latencia.
¿hay alguna manera de solucionar esto? si no es así, ¿cómo se escriben los programas de audio en tiempo real y sensibles?
ediciones y sugerencias para la pregunta son bienvenidas. soy un principiante en alsa, por lo que no estoy seguro si se requiere algún detalle adicional para replicar el error.></ncurses.h></stdint.h>
davy.ai
Generación de sonido usando C++ en Ubuntu Linux
Descripción del problema
El código proporcionado genera sonido hasta que se presiona la tecla “q”, pero hay un retraso notable entre presionar el teclado y la finalización del programa. El problema no se debe a Ncurses, ya que la latencia no está presente cuando no se genera sonido. La pregunta es cómo corregir el código para eliminar el retraso o cómo escribir un programa de audio sensible en tiempo real.
Solución
El problema aquí es que el sonido generado no se reproduce en tiempo real, lo que causa un retraso en la finalización del programa. Para crear un programa de audio sensible en tiempo real, debemos usar una biblioteca de audio que admita la reproducción de audio de baja latencia. ALSA (Advanced Linux Sound Architecture) es una de esas bibliotecas que proporciona acceso de baja latencia a las tarjetas de sonido en Linux.
La solución consiste en reemplazar la instrucción
std::cout<<temp;
por=”” la=”” reproducción=”” de=”” audio=”” alsa.=”” aquí=”” tienes=”” un=”” ejemplo=”” de=”” cómo=”” reproducir=”” una=”” onda=”” sinusoidal=”” usando=”” alsa:=”” “`=”” #include=””></temp;`>snd_pcm_t *pcm_handle;
snd_pcm_hw_params_t *params;
unsigned int rate = 44100;
int err;
int16_t buf[512];
/* Abrir el dispositivo PCM en modo de reproducción */
if (snd_pcm_open(&pcm_handle, “default”, SND_PCM_STREAM_PLAYBACK, 0) < 0) {
printf(“Error al abrir el dispositivo PCM\n”);
return -1;
}
/* Asignar un objeto de parámetros y establecer los parámetros */
snd_pcm_hw_params_alloca(¶ms);
snd_pcm_hw_params_any(pcm_handle, params);
snd_pcm_hw_params_set_access(pcm_handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
snd_pcm_hw_params_set_format(pcm_handle, params, SND_PCM_FORMAT_S16_LE);
snd_pcm_hw_params_set_channels(pcm_handle, params, 1);
snd_pcm_hw_params_set_rate_near(pcm_handle, params, &rate, 0);
/* Establecer los parámetros de hardware */
if ((err = snd_pcm_hw_params(pcm_handle, params)) < 0) {
printf(“Error al establecer los parámetros de hardware: %s\n”, snd_strerror(err));
return -1;
}
/* Escribir los datos de audio en un bucle hasta que se presione ‘q’ */
for (int t = 0; ; t++) {
}
/* Cerrar el dispositivo PCM */
snd_pcm_close(pcm_handle);
“`
Este código abre el dispositivo PCM predeterminado en modo de reproducción, establece los parámetros de hardware para reproducir una onda sinusoidal de 440 Hz y la escribe en el dispositivo usando
snd_pcm_writei()
. El programa espera la entrada del usuario hasta que se presiona ‘q’ y luego cierra el dispositivo.Usando este enfoque, el audio se reproduce en tiempo real y el programa responde inmediatamente a la entrada del usuario.