
portaudio
Bibliotecă C open-source pentru intrare/ieșire audio
Intrare și ieșire audio în timp real pe Windows, macOS, Linux și altele prin API C open-source.
Ce este portaudio?
PortAudio este o bibliotecă C gratuită, open-source și multiplatformă care permite dezvoltatorilor să scrie aplicații audio portabile cu capabilități de intrare și ieșire în timp real. Abstractizează subsistemele audio specifice platformei, cum ar fi ASIO, CoreAudio, ALSA, WASAPI și JACK, permițând I/O audio consistent pe Windows, macOS, Linux și alte sisteme de operare. Biblioteca suportă multiple formate audio — inclusiv punct flotant pe 32 de biți — și gestionează conversia de format intern. Cu un API simplu, dar puternic, PortAudio este utilizată pe scară largă în software audio, pluginuri, instrumente educaționale și proiecte de cercetare care necesită procesare audio cu latență scăzută și performanță înaltă.
PortAudio oferă două moduri principale de funcționare: bazat pe callback (pentru streaming cu latență scăzută) și citire/scriere blocantă (pentru I/O sincron simplu). Include documentație extinsă, programe exemplu și utilitare de testare pentru a ajuta dezvoltatorii să înceapă rapid. Biblioteca este întreținută de o comunitate globală și este licențiată sub licența MIT, făcând-o potrivită atât pentru aplicații open-source, cât și comerciale. Indiferent dacă construiți o stație de lucru audio digitală, un instrument de recunoaștere vocală sau o aplicație muzicală interactivă, PortAudio oferă o bază fiabilă și ușoară pentru dezvoltarea audio cross‑platform.
Începeți cu portaudio
Pentru a începe să utilizați PortAudio, puteți fie să îl construiți din sursă, fie să îl instalați prin managerii de pachete. Pentru majoritatea dezvoltatorilor, cea mai ușoară metodă este să clonați depozitul oficial portaudio GitHub și să compilați utilizând CMake sau autotools. Pe Linux, instalați prin `apt install portaudio19-dev`; pe macOS, folosiți `brew install portaudio`; pe Windows, descărcați binare precompilate sau utilizați vcpkg (`vcpkg install portaudio`). După instalare, includeți `portaudio.h` și legați biblioteca (`-lportaudio`). Biblioteca este ușoară și are dependențe minime, făcând integrarea simplă pentru aplicații audio în timp real.
Instalați PortAudio prin managerii de pachete
# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev
# macOS (Homebrew)
brew install portaudio
# Windows (vcpkg)
vcpkg install portaudio
Streaming audio în timp real cu callback-uri
Modul de streaming bazat pe callback al PortAudio este ideal pentru procesarea audio cu latență scăzută și în timp real. Când este pornit un flux, PortAudio invocă periodic funcția ta de callback pentru a solicita sau furniza date audio. Acest mod îți oferă control precis asupra sincronizării și minimizează subderulările de buffer. Callback‑ul primește buffer‑e de intrare și ieșire, numărul de cadre, informații despre timp și steaguri de stare — permițând generarea dinamică a audio, procesarea efectelor sau analiza. Deoarece callback‑ul rulează într-un fir de execuție cu prioritate înaltă, trebuie să se execute rapid (de obicei sub 10 ms) pentru a evita defectele. Acest lucru îl face perfect pentru aplicații audio live, cum ar fi sintetizatoare, pedale de efecte pentru chitară sau sisteme de comunicare vocală, unde performanța deterministă este critică.
Generator de undă sinusoidală în timp real prin 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;
}
Enumerarea și interogarea dispozitivelor
PortAudio oferă API-uri robuste pentru enumerarea și inspectarea dispozitivelor audio disponibile—incluzând dispozitive de intrare și ieșire—împreună cu capacitățile lor. Dezvoltatorii pot interoga numele dispozitivelor, numărul de canale, ratele de eșantionare implicite și valorile de latență utilizând funcții precum `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` și `Pa_GetDefaultInputDeviceID()`. Acest lucru permite aplicațiilor să prezinte utilizatorilor o listă de dispozitive valide și să configureze fluxurile în mod optim. De asemenea, puteți detecta dispozitivele implicite, verifica ratele de eșantionare suportate și determina latențele minime/maxime. Această flexibilitate este esențială pentru construirea de instrumente audio configurabile, DAW-uri sau înregistratoare de voce care se adaptează la diverse configurații hardware fără configurare manuală.
Listează toate dispozitivele audio disponibile
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();
Suport pentru API gazdă multiplatformă
PortAudio abstractizează API-urile audio specifice platformei prin implementări modulare ale API-ului gazdă, asigurând un comportament consistent pe toate sistemele de operare. Pe Windows, suportă ASIO (pentru audio profesional), WASAPI (Vista+), DirectSound și MME legacy. macOS folosește Core Audio pentru latență ultra-scăzută, în timp ce Linux suportă ALSA, JACK și PulseAudio. Sistemele BSD utilizează OSS sau sndio. Dezvoltatorii scriu o singură dată și implementează peste tot—nu este necesară compilarea condițională pentru logica de bază. Biblioteca selectează automat cel mai bun API gazdă disponibil sau vă permite să specificați unul explicit. Această universalitate face ca PortAudio să fie ideal pentru instrumente audio portabile, software educațional și cadre de cercetare care trebuie să ruleze fiabil pe hardware și configurații de OS diverse.
Forțează utilizarea API-ului JACK Host pe 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);
Conversia formatului audio și dithering
PortAudio gestionează conversia internă a formatului de eșantionare în mod transparent, permițând clienților să utilizeze formate convenabile, cum ar fi punctul flotant pe 32 de biți, în timp ce sistemul de bază folosește formate întregi native (de ex., PCM pe 16 biți). Acceptă conversia între formatele întregi pe 8, 16, 24 și 32 de biți, precum și 32‑bit float. În plus, oferă dithering opțional în timpul reducerii adâncimii de biți pentru a minimiza zgomotul de cuantizare – o caracteristică subtilă, dar esențială pentru aplicații audio de înaltă fidelitate. Ditheringul păstrează calitatea audio percepută la conversia de la adâncimi de biți mai mari la cele mai mici. Aceste capabilități asigură o fidelitate audio consistentă pe toate platformele fără a necesita ca dezvoltatorii să implementeze logică complexă de gestionare a formatelor.
Configurează intrarea în virgulă mobilă pe 32 de biți cu 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
