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

portaudio

 
 

Open-source C-bibliotheek voor audio I/O

Realtime audio-invoer & -uitvoer op Windows, macOS, Linux en meer via open-source C-API.

Wat is portaudio?

PortAudio is een gratis, open‑source, cross‑platform C‑bibliotheek die ontwikkelaars in staat stelt draagbare audio‑applicaties te schrijven met realtime invoer‑ en uitvoermogelijkheden. Het abstraheert platformspecifieke audio‑subsystemen zoals ASIO, CoreAudio, ALSA, WASAPI en JACK, waardoor consistente audio‑I/O mogelijk is op Windows, macOS, Linux en andere besturingssystemen. De bibliotheek ondersteunt meerdere audioformaten — waaronder 32‑bit floating point — en verzorgt de formaatconversie intern. Met een eenvoudige maar krachtige API wordt PortAudio veel gebruikt in audiosoftware, plug‑ins, educatieve tools en onderzoeksprojecten die lage latentie en hoge prestaties bij audio‑verwerking vereisen.

PortAudio biedt twee primaire werkmodi: callback‑gebaseerd (voor low‑latency streaming) en blokkerende lees-/schrijfoperaties (voor eenvoudigere synchrone I/O). Het bevat uitgebreide documentatie, voorbeeldprogramma's en testhulpmiddelen om ontwikkelaars snel op weg te helpen. De bibliotheek wordt onderhouden door een wereldwijde gemeenschap en is gelicentieerd onder de MIT‑licentie, waardoor hij geschikt is voor zowel open‑source als commerciële toepassingen. Of je nu een digitale audio‑werkstation, een spraakherkenningstool of een interactieve muziekapplicatie bouwt, PortAudio levert een betrouwbare, lichtgewicht basis voor cross‑platform audio‑ontwikkeling.

Previous Next

Aan de slag met portaudio

Om PortAudio te gaan gebruiken, kun je het ofwel uit de broncode bouwen of installeren via pakketbeheerders. Voor de meeste ontwikkelaars is de eenvoudigste methode om de officiële portaudio GitHub repository te klonen en te compileren met CMake of autotools. Op Linux installeer je via `apt install portaudio19-dev`; op macOS gebruik je `brew install portaudio`; op Windows download je vooraf gebouwde binaries of gebruik je vcpkg (`vcpkg install portaudio`). Na de installatie voeg je `portaudio.h` toe en link je tegen de bibliotheek (`-lportaudio`). De bibliotheek is lichtgewicht en heeft minimale afhankelijkheden, waardoor integratie eenvoudig is voor real-time audio-toepassingen.

Installeer PortAudio via pakketbeheerders

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

# macOS (Homebrew)
brew install portaudio

# Windows (vcpkg)
vcpkg install portaudio

Realtime audio streaming met callbacks

PortAudio’s callback-gebaseerde streamingmodus is ideaal voor low-latency, real-time audiobewerking. Wanneer een stream wordt gestart, roept PortAudio periodiek je callback-functie aan om audio‑gegevens op te vragen of te leveren. Deze modus geeft je precieze controle over timing en minimaliseert bufferonderruns. De callback ontvangt invoer‑ en uitvoer‑buffers, frame‑aantal, tijdsinformatie en statusvlaggen — waardoor dynamische audio‑generatie, effectverwerking of analyse mogelijk is. Aangezien de callback draait in een thread met hoge prioriteit, moet hij snel worden uitgevoerd (meestal onder de 10 ms) om glitches te voorkomen. Dit maakt het perfect voor live‑audio‑toepassingen zoals synthesizers, gitareffectpedalen of spraakcommunicatiesystemen waar deterministische prestaties cruciaal zijn.

Realtime sinusgolfgenerator 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;
}

Apparaatenumeratie en opvragen

PortAudio biedt robuuste API's om beschikbare audioapparaten te enumereren en te inspecteren — inclusief invoer- en uitvoerapparaten — samen met hun mogelijkheden. Ontwikkelaars kunnen apparaatnamen, kanaalaantallen, standaard samplefrequenties en latentie‑waarden opvragen met functies zoals `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` en `Pa_GetDefaultInputDeviceID()`. Dit stelt toepassingen in staat om gebruikers een lijst met geldige apparaten te tonen en streams optimaal te configureren. Je kunt ook standaardapparaten detecteren, ondersteunde samplefrequenties controleren en minimale/maximale latenties bepalen. Deze flexibiliteit is essentieel voor het bouwen van configureerbare audiogereedschappen, DAW's of spraakrecorders die zich aanpassen aan diverse hardware‑configuraties zonder handmatige configuratie.

Alle beschikbare audioapparaten weergeven

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 host-API-ondersteuning

PortAudio abstraheert platform-specifieke audio-API's via modulaire host-API-implementaties, waardoor consistent gedrag over besturingssystemen heen wordt gegarandeerd. Op Windows ondersteunt het ASIO (voor pro-audio), WASAPI (Vista+), DirectSound en legacy MME. macOS maakt gebruik van Core Audio voor ultra‑lage latentie, terwijl Linux ALSA, JACK en PulseAudio ondersteunt. BSD-systemen gebruiken OSS of sndio. Ontwikkelaars schrijven één keer en implementeren overal—geen voorwaardelijke compilatie nodig voor de kernlogica. De bibliotheek selecteert automatisch de best beschikbare host-API of laat je er expliciet één kiezen. Deze universaliteit maakt PortAudio ideaal voor draagbare audiogereedschappen, educatieve software en onderzoeksframeworks die betrouwbaar moeten draaien op diverse hardware- en OS-configuraties.

Forceer gebruik van JACK Host API op 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);

Audioformaatconversie en dithering

PortAudio verwerkt interne sampleformaatconversie transparant, waardoor clients handige formaten zoals 32-bit floating point kunnen gebruiken terwijl het onderliggende systeem native integerformaten gebruikt (bijv., 16-bit PCM). Het ondersteunt conversie tussen 8-, 16-, 24- en 32-bit integerformaten, evenals 32-bit float. Daarnaast biedt het optionele dithering tijdens het reduceren van de bitdiepte om kwantisatieruis te minimaliseren – een subtiele maar cruciale eigenschap voor audio‑toepassingen met hoge fideliteit. Dithering behoudt de waargenomen geluidskwaliteit bij conversie van hogere naar lagere bitdiepten. Deze mogelijkheden zorgen voor consistente audiofideliteit over platformen heen zonder dat ontwikkelaars zelf complexe logica voor formaatafhandeling hoeven te implementeren.

Configureer 32-bit float-invoer met 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
 Dutch