
portaudio
Biblioteca C de Código Aberto para I/O de Áudio
Entrada e Saída de Áudio em Tempo Real em Windows, macOS, Linux e Mais via API C de Código Aberto.
O que é o PortAudio?
PortAudio é uma biblioteca C gratuita, de código aberto e multiplataforma que permite aos desenvolvedores escrever aplicações de áudio portáteis com capacidades de entrada e saída em tempo real. Ela abstrai subsistemas de áudio específicos de cada plataforma, como ASIO, CoreAudio, ALSA, WASAPI e JACK, permitindo I/O de áudio consistente em Windows, macOS, Linux e outros sistemas operacionais. A biblioteca suporta múltiplos formatos de áudio — incluindo ponto flutuante de 32 bits — e lida com a conversão de formatos internamente. Com uma API simples, porém poderosa, o PortAudio é amplamente usado em softwares de áudio, plugins, ferramentas educacionais e projetos de pesquisa que exigem processamento de áudio de baixa latência e alto desempenho.
PortAudio oferece dois modos principais de operação: baseado em callbacks (para streaming de baixa latência) e leitura/gravação bloqueante (para I/O síncrono mais simples). Inclui documentação extensa, programas de exemplo e utilitários de teste para ajudar os desenvolvedores a começar rapidamente. A biblioteca é mantida por uma comunidade global e está licenciada sob a licença MIT, tornando-a adequada tanto para aplicações de código aberto quanto comerciais. Seja construindo uma estação de trabalho de áudio digital, uma ferramenta de reconhecimento de voz ou uma aplicação musical interativa, o PortAudio fornece uma base confiável e leve para desenvolvimento de áudio multiplataforma.
Começando com o PortAudio
Para começar a usar o PortAudio, você pode compilar a partir do código-fonte ou instalar via gerenciadores de pacotes. Para a maioria dos desenvolvedores, o método mais fácil é clonar o repositório oficial portaudio GitHub e compilar usando CMake ou autotools. No Linux, instale via `apt install portaudio19-dev`; no macOS, use `brew install portaudio`; no Windows, faça o download de binários pré-compilados ou use o vcpkg (`vcpkg install portaudio`). Após a instalação, inclua `portaudio.h` e vincule contra a biblioteca (`-lportaudio`). A biblioteca é leve e tem dependências mínimas, tornando a integração direta para aplicações de áudio em tempo real.
Instalar PortAudio via Gerenciadores de Pacotes
# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev
# macOS (Homebrew)
brew install portaudio
# Windows (vcpkg)
vcpkg install portaudio
Transmissão de Áudio em Tempo Real com Callbacks
O modo de streaming baseado em callbacks do PortAudio é ideal para processamento de áudio em tempo real e baixa latência. Quando um stream é iniciado, o PortAudio invoca periodicamente sua função de callback para solicitar ou fornecer dados de áudio. Esse modo oferece controle preciso sobre o tempo e minimiza faltas de buffer. O callback recebe buffers de entrada e saída, contagem de quadros, informações de tempo e flags de status — permitindo geração dinâmica de áudio, processamento de efeitos ou análise. Como o callback roda em uma thread de alta prioridade, ele deve ser executado rapidamente (geralmente em menos de 10 ms) para evitar falhas. Isso o torna perfeito para aplicações de áudio ao vivo, como sintetizadores, pedais de efeitos para guitarra ou sistemas de comunicação por voz, onde o desempenho determinístico é crítico.
Gerador de Onda Senoidal em Tempo Real via 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;
}
Enumeração e Consulta de Dispositivos
PortAudio fornece APIs robustas para enumerar e inspecionar dispositivos de áudio disponíveis — incluindo dispositivos de entrada e saída — juntamente com suas capacidades. Os desenvolvedores podem consultar nomes de dispositivos, contagens de canais, taxas de amostragem padrão e valores de latência usando funções como `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` e `Pa_GetDefaultInputDeviceID()`. Isso permite que aplicativos apresentem aos usuários uma lista de dispositivos válidos e configurem fluxos de forma otimizada. Você também pode detectar dispositivos padrão, verificar taxas de amostragem suportadas e determinar latências mínimas/máximas. Essa flexibilidade é essencial para construir ferramentas de áudio configuráveis, DAWs ou gravadores de voz que se adaptam a diferentes configurações de hardware sem necessidade de configuração manual.
Listar Todos os Dispositivos de Áudio Disponíveis
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();
Suporte a API de Host Multiplataforma
PortAudio abstrai APIs de áudio específicas de plataforma por meio de implementações modulares de API de host, garantindo comportamento consistente em diferentes sistemas operacionais. No Windows, ele suporta ASIO (para áudio profissional), WASAPI (Vista+), DirectSound e MME legado. O macOS utiliza Core Audio para latência ultra baixa, enquanto o Linux suporta ALSA, JACK e PulseAudio. Sistemas BSD usam OSS ou sndio. Os desenvolvedores escrevem uma vez e implantam em qualquer lugar — sem necessidade de compilação condicional para a lógica principal. A biblioteca seleciona automaticamente a melhor API de host disponível ou permite que você a especifique explicitamente. Essa universalidade torna o PortAudio ideal para ferramentas de áudio portáteis, softwares educacionais e frameworks de pesquisa que precisam operar de forma confiável em hardware e configurações de SO diversificados.
Forçar o Uso da API de Host JACK no 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);
Conversão de Formato de Áudio e Dithering
PortAudio lida com a conversão interna de formato de amostra de forma transparente, permitindo que os clientes usem formatos convenientes como ponto flutuante de 32 bits enquanto o sistema subjacente utiliza formatos inteiros nativos (por exemplo, PCM de 16 bits). Ele suporta conversão entre formatos inteiros de 8, 16, 24 e 32 bits, bem como 32-bit float. Além disso, oferece dithering opcional durante a redução da profundidade de bits para minimizar o ruído de quantização — um recurso sutil, porém crítico, para aplicações de áudio de alta fidelidade. O dithering preserva a qualidade de áudio percebida ao converter de profundidades de bits maiores para menores. Esses recursos garantem fidelidade de áudio consistente em todas as plataformas sem exigir que os desenvolvedores implementem lógica complexa de manipulação de formatos.
Configurar Entrada de Ponto Flutuante de 32 bits com 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
