
portaudio
Open source C-bibliotek til lyd I/O
Realtids lydind- og -output på tværs af Windows, macOS, Linux og mere via open source C API.
Hvad er portaudio?
PortAudio er et gratis, open source, platformuafhængigt C-bibliotek, der gør det muligt for udviklere at skrive portable lydapplikationer med realtidsind- og uddatafunktioner. Det abstraherer platformspecifikke lydundersystemer som ASIO, CoreAudio, ALSA, WASAPI og JACK, hvilket muliggør konsistent lyd‑I/O på tværs af Windows, macOS, Linux og andre operativsystemer. Biblioteket understøtter flere lydformater – herunder 32-bit flydende punkt – og håndterer formatkonvertering internt. Med et enkelt, men kraftfuldt API er PortAudio bredt anvendt i lydsoftware, plugins, undervisningsværktøjer og forskningsprojekter, der kræver lav latenstid og højtydende lydbehandling.
PortAudio tilbyder to primære driftsformer: callback-baseret (til lavlatens streaming) og blokkerende læs/skriv (til enklere synkron I/O). Den inkluderer omfattende dokumentation, eksempelkoder og testværktøjer, der hjælper udviklere med hurtigt at komme i gang. Biblioteket vedligeholdes af et globalt fællesskab og er licenseret under MIT-licensen, hvilket gør det egnet til både open source- og kommercielle applikationer. Uanset om du bygger en digital lydarbejdsstation, et stemmegenkendelsesværktøj eller en interaktiv musikapplikation, leverer PortAudio et pålideligt, letvægtsgrundlag for tværplatforms lydudvikling.
Kom i gang med portaudio
Begynd at bruge PortAudio ved at bygge det fra kildekoden eller installere via pakkehåndterere. For de fleste udviklere er den nemmeste metode at klone det officielle portaudio GitHub-repository og kompilere ved hjælp af CMake eller autotools. På Linux installeres via `apt install portaudio19-dev`; på macOS bruges `brew install portaudio`; på Windows downloades forudbyggede binære filer eller bruges vcpkg (`vcpkg install portaudio`). Efter installationen inkluderes `portaudio.h` og der linkes mod biblioteket (`-lportaudio`). Biblioteket er letvægts og har minimale afhængigheder, hvilket gør integrationen ligetil for realtidslyd‑applikationer.
Installer PortAudio via pakkehåndterere
# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev
# macOS (Homebrew)
brew install portaudio
# Windows (vcpkg)
vcpkg install portaudio
Lydstreaming i realtid med callbacks
PortAudios callback-baserede streamingtilstand er ideel til lavlatens, realtidslydbehandling. Når en strøm startes, kalder PortAudio periodisk din callback-funktion for at anmode om eller levere lyddata. Denne tilstand giver dig præcis kontrol over timing og minimerer bufferunderløb. Callbacken modtager input- og output‑buffere, rammetælling, tidsinformation og statusflag—som muliggør dynamisk lydgenerering, effektbehandling eller analyse. Da callbacken kører i en højprioritets‑tråd, skal den udføres hurtigt (typisk under 10 ms) for at undgå fejl. Dette gør den perfekt til live‑lydapplikationer som synthesizere, guitar‑effektpedaler eller stemmekommunikationssystemer, hvor deterministisk ydeevne er kritisk.
Sinusgenerator i realtid 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;
}
Enhedsopregning og forespørgsel
PortAudio leverer robuste API'er til at opregne og inspicere tilgængelige lydenheder—herunder input- og output-enheder—samt deres kapaciteter. Udviklere kan forespørge enhedsnavne, kanalantal, standard-samplerater og latenstider ved hjælp af funktioner som `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` og `Pa_GetDefaultInputDeviceID()`. Dette gør det muligt for applikationer at præsentere brugerne for en liste over gyldige enheder og konfigurere strømme optimalt. Du kan også opdage standardenheder, kontrollere understøttede samplerater og bestemme minimums-/maksimumlatens. Denne fleksibilitet er afgørende for at bygge konfigurerbare lydværktøjer, DAW'er eller stemmeoptagere, der tilpasser sig forskellige hardwareopsætninger uden manuel konfiguration.
List alle tilgængelige lyd-enheder
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();
Cross-platform vært-API-understøttelse
PortAudio abstraherer platformspecifikke lyd-API'er gennem modulære vært-API-implementeringer, hvilket sikrer konsistent adfærd på tværs af operativsystemer. På Windows understøtter det ASIO (til professionel lyd), WASAPI (Vista+), DirectSound og den ældre MME. macOS udnytter Core Audio for ultralav latenstid, mens Linux understøtter ALSA, JACK og PulseAudio. BSD-systemer bruger OSS eller sndio. Udviklere skriver én gang og implementerer overalt – ingen betinget kompilering er nødvendig for kerne‑logikken. Biblioteket vælger automatisk den bedst tilgængelige vært-API eller lader dig specificere en eksplicit. Denne universalitet gør PortAudio ideel til bærbare lydværktøjer, undervisningssoftware og forskningsrammer, der skal køre pålideligt på forskellig hardware og OS‑konfigurationer.
Tving brug af JACK Host API på 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);
Audioformatkonvertering og dithering
PortAudio håndterer intern prøveformatkonvertering gennemsigtigt, så klienter kan bruge bekvemme formater som 32-bit flydende punkt, mens det underliggende system bruger native heltalsformater (f.eks. 16-bit PCM). Det understøtter konvertering mellem 8-, 16-, 24- og 32-bit heltalsformater samt 32-bit float. Derudover tilbyder det valgfri dithering under reduktion af bitdybde for at minimere kvantiseringsstøj – en subtil men kritisk funktion for højfidelitets lydapplikationer. Dithering bevarer den opfattede lydkvalitet ved konvertering fra højere til lavere bitdybder. Disse funktioner sikrer konsistent lydfidelity på tværs af platforme uden at udviklere skal implementere kompleks format‑håndteringslogik selv.
Konfigurer 32-bit flydende input med 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
