
portaudio
Åpen kildekode C-bibliotek for lyd I/O
Sanntids lydinn- og -utgang på tvers av Windows, macOS, Linux og mer via åpen kildekode C API.
Hva er portaudio?
PortAudio er et gratis, åpen kildekode, plattformuavhengig C-bibliotek som gjør det mulig for utviklere å skrive portable lydapplikasjoner med sanntids inn- og utdata. Det abstrakterer plattformspesifikke lydundersystemer som ASIO, CoreAudio, ALSA, WASAPI og JACK, og gjør det mulig med konsistent lyd‑I/O på Windows, macOS, Linux og andre operativsystemer. Biblioteket støtter flere lydformater – inkludert 32‑bits flyttall – og håndterer formatkonvertering internt. Med et enkelt, men kraftig API, er PortAudio mye brukt i lydprogramvare, plugins, undervisningsverktøy og forskningsprosjekter som krever lav latens og høy ytelse i lydbehandling.
PortAudio tilbyr to primære driftsmoduser: callback-basert (for lavlatens streaming) og blokkering av lesing/skriving (for enklere synkron I/O). Den inkluderer omfattende dokumentasjon, eksempelkode og testverktøy for å hjelpe utviklere i gang raskt. Biblioteket vedlikeholdes av et globalt fellesskap og er lisensiert under MIT-lisensen, noe som gjør det egnet for både åpen kildekode og kommersielle applikasjoner. Enten du bygger en digital lydarbeidsstasjon, et talegjenkjenningsverktøy eller en interaktiv musikkapplikasjon, leverer PortAudio et pålitelig, lettvektig grunnlag for plattformuavhengig lydutvikling.
Kom i gang med portaudio
For å begynne å bruke PortAudio, kan du enten bygge det fra kildekode eller installere via pakkebehandlere. For de fleste utviklere er den enkleste metoden å klone det offisielle portaudio GitHub-depotet og kompilere med CMake eller autotools. På Linux installeres det via `apt install portaudio19-dev`; på macOS bruker du `brew install portaudio`; på Windows laster du ned forhåndsbygde binærfiler eller bruker vcpkg (`vcpkg install portaudio`). Etter installasjon inkluderer du `portaudio.h` og lenker mot biblioteket (`-lportaudio`). Biblioteket er lettvektig og har minimale avhengigheter, noe som gjør integrering enkel for sanntidslydapplikasjoner.
Installer PortAudio via pakkebehandlere
# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev
# macOS (Homebrew)
brew install portaudio
# Windows (vcpkg)
vcpkg install portaudio
Sanntids lydstrømming med tilbakeringinger
PortAudios callback-baserte strømmingsmodus er ideell for lavlatens, sanntids lydbehandling. Når en strøm startes, kaller PortAudio periodisk din callback-funksjon for å be om eller levere lyddata. Denne modusen gir deg presis kontroll over timing og minimerer bufferunderskudd. Callbacken mottar inn- og utdata-buffere, rammetelling, tidsinformasjon og statusflagg—som gjør dynamisk lydgenerering, effektbehandling eller analyse mulig. Siden callbacken kjører i en høyprioritets-tråd, må den utføres raskt (vanligvis under 10 ms) for å unngå feil. Dette gjør den perfekt for live lydapplikasjoner som synthesizere, gitar-effektpedaler eller talekommunikasjonssystemer hvor deterministisk ytelse er kritisk.
Sanntids sinusgenerering via tilbakeringing
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;
}
Enhetsoppregning og spørring
PortAudio tilbyr robuste API-er for å oppregne og inspisere tilgjengelige lydenheter—inkludert inn- og utdataenheter—sammen med deres egenskaper. Utviklere kan forespørre enhetsnavn, kanalantall, standard samplingsfrekvenser og latensverdier ved hjelp av funksjoner som `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` og `Pa_GetDefaultInputDeviceID()`. Dette gjør at applikasjoner kan presentere brukerne med en liste over gyldige enheter og konfigurere strømmer optimalt. Du kan også oppdage standardenheter, sjekke støttede samplingsfrekvenser og bestemme minimums-/maksimumslatens. Denne fleksibiliteten er essensiell for å bygge konfigurerbare lydverktøy, DAW-er eller stemmeopptakere som tilpasser seg ulike maskinvareoppsett uten manuell konfigurasjon.
List opp alle tilgjengelige lyd-enheter
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();
Kryssplattform vert-API-støtte
PortAudio abstraherer plattformspesifikke lyd-API-er gjennom modulære vert-API-implementasjoner, og sikrer konsistent oppførsel på tvers av operativsystemer. På Windows støtter den ASIO (for proff lyd), WASAPI (Vista+), DirectSound og den eldre MME. macOS utnytter Core Audio for ultralav latens, mens Linux støtter ALSA, JACK og PulseAudio. BSD-systemer bruker OSS eller sndio. Utviklere skriver én gang og distribuerer overalt—ingen betinget kompilering nødvendig for kjerne‑logikken. Biblioteket velger automatisk den beste tilgjengelige vert‑API-en eller lar deg spesifisere en eksplisitt. Denne universaliteten gjør PortAudio ideell for bærbare lydverktøy, utdanningsprogramvare og forskningsrammeverk som må kjøre pålitelig på variert maskinvare og OS‑konfigurasjoner.
Tving bruk av 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);
Lydformatkonvertering og dithering
PortAudio håndterer intern konvertering av sampleformat på en transparent måte, slik at klienter kan bruke praktiske formater som 32‑bits flyttall mens det underliggende systemet bruker native heltallsformater (f.eks. 16‑bits PCM). Det støtter konvertering mellom 8‑, 16‑, 24‑ og 32‑bits heltallsformater, samt 32‑bits flyttall. I tillegg tilbyr det valgfri dithering under reduksjon av bitdybde for å minimere kvantiseringsstøy – en subtil, men kritisk funksjon for høy‑fidelitets lydapplikasjoner. Dithering bevarer oppfattet lydkvalitet når man konverterer fra høyere til lavere bitdybde. Disse mulighetene sikrer konsistent lydfidelity på tvers av plattformer uten at utviklere må implementere kompleks format‑håndteringslogikk selv.
Konfigurer 32-bits flyttallsinngang 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
