es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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(&params);
    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++) {

    /* Generar una onda sinusoidal */
    for (int i = 0; i < 512; i++) {
        buf[i] = (int16_t)(32767 * sin(2 * M_PI * t * 440 / rate));
    }
    
    /* Escribir los datos de audio en ALSA */
    if ((err = snd_pcm_writei(pcm_handle, buf, 512)) < 0) {
        printf("Error al escribir el audio: %s\n", snd_strerror(err));
        return -1;
    }
    
    /* Esperar a presionar una tecla */
    int ch = getch();
    if (ch == 'q') {
        break;
    }
    

    }

    /* 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.

Comments are closed.