1. Productos
  2.   Audio
  3.   C++
  4.   portaudio

portaudio

 
 

Biblioteca C de código abierto para Audio I/O

Entrada y salida de audio en tiempo real en Windows, macOS, Linux y más mediante API C de código abierto.

¿Qué es PortAudio?

PortAudio es una biblioteca C gratuita, de código abierto y multiplataforma que permite a los desarrolladores crear aplicaciones de audio portátiles con capacidades de entrada y salida en tiempo real. Abstrae subsistemas de audio específicos de cada plataforma, como ASIO, CoreAudio, ALSA, WASAPI y JACK, permitiendo una E/S de audio coherente en Windows, macOS, Linux y otros sistemas operativos. La biblioteca admite múltiples formatos de audio, incluidos los de punto flotante de 32 bits, y gestiona la conversión de formatos internamente. Con una API simple pero potente, PortAudio se utiliza ampliamente en software de audio, complementos, herramientas educativas y proyectos de investigación que requieren procesamiento de audio de baja latencia y alto rendimiento.

PortAudio ofrece dos modos principales de funcionamiento: basado en callbacks (para transmisión de baja latencia) y lectura/escritura bloqueante (para I/O sincrónico más simple). Incluye documentación extensa, programas de ejemplo y utilidades de prueba para ayudar a los desarrolladores a comenzar rápidamente. La biblioteca es mantenida por una comunidad global y está licenciada bajo la licencia MIT, lo que la hace adecuada tanto para aplicaciones de código abierto como comerciales. Ya sea que estés construyendo una estación de trabajo de audio digital, una herramienta de reconocimiento de voz o una aplicación musical interactiva, PortAudio proporciona una base fiable y ligera para el desarrollo de audio multiplataforma.

Previous Next

Comenzando con PortAudio

Para comenzar a usar PortAudio, puedes compilarlo desde el código fuente o instalarlo mediante gestores de paquetes. Para la mayoría de los desarrolladores, el método más sencillo es clonar el repositorio oficial GitHub de portaudio y compilar usando CMake o autotools. En Linux, instala con `apt install portaudio19-dev`; en macOS, usa `brew install portaudio`; en Windows, descarga binarios precompilados o usa vcpkg (`vcpkg install portaudio`). Después de la instalación, incluye `portaudio.h` y enlaza contra la biblioteca (`-lportaudio`). La biblioteca es ligera y tiene dependencias mínimas, lo que hace que la integración sea directa para aplicaciones de audio en tiempo real.

Instalar PortAudio mediante gestores de paquetes

# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev

# macOS (Homebrew)
brew install portaudio

# Windows (vcpkg)
vcpkg install portaudio

Transmisión de audio en tiempo real con callbacks

El modo de transmisión basado en callbacks de PortAudio es ideal para el procesamiento de audio en tiempo real y de baja latencia. Cuando se inicia una transmisión, PortAudio invoca periódicamente su función de callback para solicitar o proporcionar datos de audio. Este modo le brinda un control preciso sobre el tiempo y minimiza los desbordamientos de búfer. El callback recibe buffers de entrada y salida, recuento de frames, información de tiempo y banderas de estado—permitiendo la generación dinámica de audio, el procesamiento de efectos o el análisis. Dado que el callback se ejecuta en un hilo de alta prioridad, debe ejecutarse rápidamente (normalmente en menos de 10 ms) para evitar fallos. Esto lo hace perfecto para aplicaciones de audio en vivo como sintetizadores, pedales de efectos para guitarra o sistemas de comunicación de voz donde el rendimiento determinista es crítico.

Generador de onda sinusoidal en tiempo real mediante callback

typedef struct {
    float phase;
    float phase_increment;
} paTestData;

int patestCallback(const void *input, void *output,
    unsigned long frameCount,
    const PaStreamCallbackTimeInfo* timeInfo,
    PaStreamCallbackFlags statusFlags,
    void *userData)
{
    paTestData *data = (paTestData*)userData;
    float *out = (float*)output;
    for (unsigned long i = 0; i < frameCount; i++) {
        *out++ = sinf(data->phase);
        data->phase += data->phase_increment;
        if (data->phase >= M_PI * 2) data->phase -= M_PI * 2;
    }
    return paContinue;
}

Enumeración y consulta de dispositivos

PortAudio proporciona API robustas para enumerar e inspeccionar los dispositivos de audio disponibles, incluidos los dispositivos de entrada y salida, junto con sus capacidades. Los desarrolladores pueden consultar los nombres de los dispositivos, la cantidad de canales, las tasas de muestreo predeterminadas y los valores de latencia usando funciones como `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` y `Pa_GetDefaultInputDeviceID()`. Esto permite que las aplicaciones presenten a los usuarios una lista de dispositivos válidos y configuren los flujos de manera óptima. También puedes detectar los dispositivos predeterminados, verificar las tasas de muestreo compatibles y determinar las latencias mínima/máxima. Esta flexibilidad es esencial para crear herramientas de audio configurables, DAW o grabadoras de voz que se adapten a diversas configuraciones de hardware sin configuración manual.

Listar todos los dispositivos de audio disponibles

PaError err;
err = Pa_Initialize();
if (err != paNoError) goto error;

int numDevices = Pa_GetDeviceCount();
for (int i = 0; i < numDevices; i++) {
    const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
    printf("%d: %s (in: %d, out: %d)\n", 
        i, info->name, 
        info->maxInputChannels, 
        info->maxOutputChannels);
}
Pa_Terminate();

Compatibilidad con API de host multiplataforma

PortAudio abstrae las API de audio específicas de cada plataforma mediante implementaciones modulares de API de host, garantizando un comportamiento consistente en todos los sistemas operativos. En Windows, soporta ASIO (para audio profesional), WASAPI (Vista+), DirectSound y el legado MME. macOS aprovecha Core Audio para una latencia ultra baja, mientras que Linux soporta ALSA, JACK y PulseAudio. Los sistemas BSD utilizan OSS o sndio. Los desarrolladores escriben una vez y despliegan en todas partes—no se necesita compilación condicional para la lógica principal. La biblioteca selecciona automáticamente la mejor API de host disponible o permite especificar una explícitamente. Esta universalidad hace que PortAudio sea ideal para herramientas de audio portátiles, software educativo y marcos de investigación que deben ejecutarse de manera fiable en hardware y configuraciones de SO diversos.

Forzar el uso de la API de host JACK en Linux

PaStreamParameters inputParam, outputParam;
PaError err;

inputParam.device = Pa_GetHostApiInfoByType(paJACK)->defaultInputDevice;
inputParam.channelCount = 2;
inputParam.sampleFormat = paFloat32;
// ... configure outputParam similarly ...

PaStream *stream;
err = Pa_OpenStream(&stream, &inputParam, &outputParam, 
    44100, 256, paNoFlag, callback, NULL);

Conversión de formato de audio y dithering

PortAudio maneja la conversión interna de formatos de muestra de forma transparente, permitiendo a los clientes usar formatos convenientes como 32-bit floating point mientras el sistema subyacente utiliza formatos enteros nativos (p. ej., 16-bit PCM). Soporta conversión entre formatos enteros de 8-, 16-, 24- y 32-bit, así como 32-bit float. Además, ofrece dithering opcional durante la reducción de profundidad de bits para minimizar el ruido de cuantización—una característica sutil pero crítica para aplicaciones de audio de alta fidelidad. Dithering preserva la calidad de audio percibida al convertir de profundidades de bits mayores a menores. Estas capacidades garantizan una fidelidad de audio consistente en todas las plataformas sin requerir que los desarrolladores implementen lógica compleja de manejo de formatos.

Configurar entrada de punto flotante de 32 bits con dithering

PaStreamParameters inputParam = {0};
inputParam.device = Pa_GetDefaultInputDevice();
inputParam.channelCount = 2;
inputParam.sampleFormat = paFloat32;
inputParam.suggestedLatency = Pa_GetDeviceInfo(inputParam.device)->defaultLowInputLatency;

// Enable dithering for output conversion
PaStream *stream;
Pa_OpenStream(&stream, &inputParam, NULL, 44100, 128, 
    paClipOff | paDitherOff, NULL, NULL);
// Note: paDitherOff disables dithering; omit for default dithering
 Español