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

portaudio

 
 

Open-Source-C-Bibliothek für Audio I/O

Echtzeit-Audio-Ein- und -Ausgabe unter Windows, macOS, Linux und mehr über Open-Source-C-API.

Was ist PortAudio?

PortAudio ist eine kostenlose, Open‑Source‑ und plattformübergreifende C‑Bibliothek, die Entwicklern ermöglicht, portable Audio‑Anwendungen mit Echtzeit‑Ein‑ und Ausgabefunktionen zu schreiben. Sie abstrahiert plattformspezifische Audiosubsysteme wie ASIO, CoreAudio, ALSA, WASAPI und JACK und ermöglicht konsistente Audio‑E/A über Windows, macOS, Linux und andere Betriebssysteme hinweg. Die Bibliothek unterstützt mehrere Audioformate – einschließlich 32‑Bit‑Gleitkomma – und übernimmt die Formatkonvertierung intern. Mit einer einfachen, aber leistungsstarken API wird PortAudio häufig in Audio‑Software, Plugins, Lernwerkzeugen und Forschungsprojekten eingesetzt, die eine niedrige Latenz und Hochleistungs‑Audioverarbeitung erfordern.

PortAudio bietet zwei Hauptbetriebsmodi: Callback-basiert (für latenzarmes Streaming) und blockierendes Lesen/Schreiben (für einfachere synchrone I/O). Es enthält umfangreiche Dokumentation, Beispielprogramme und Testwerkzeuge, die Entwicklern einen schnellen Einstieg ermöglichen. Die Bibliothek wird von einer globalen Community gepflegt und ist unter der MIT-Lizenz lizenziert, was sie sowohl für Open-Source- als auch für kommerzielle Anwendungen geeignet macht. Egal, ob Sie eine digitale Audio-Workstation, ein Spracherkennungstool oder eine interaktive Musik-Anwendung bauen, PortAudio liefert eine zuverlässige, leichte Grundlage für plattformübergreifende Audioentwicklung.

Previous Next

Erste Schritte mit PortAudio

Um PortAudio zu verwenden, können Sie es entweder aus dem Quellcode bauen oder über Paketmanager installieren. Für die meisten Entwickler ist die einfachste Methode, das offizielle portaudio GitHub-Repository zu klonen und mit CMake oder autotools zu kompilieren. Unter Linux installieren Sie es mit `apt install portaudio19-dev`; unter macOS verwenden Sie `brew install portaudio`; unter Windows laden Sie vorgefertigte Binärdateien herunter oder nutzen vcpkg (`vcpkg install portaudio`). Nach der Installation binden Sie `portaudio.h` ein und verlinken gegen die Bibliothek (`-lportaudio`). Die Bibliothek ist leichtgewichtig und hat minimale Abhängigkeiten, was die Integration für Echtzeitaudio-Anwendungen unkompliziert macht.

PortAudio über Paketmanager installieren

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

# macOS (Homebrew)
brew install portaudio

# Windows (vcpkg)
vcpkg install portaudio

Echtzeit-Audiostreaming mit Callbacks

Der callback-basierte Streaming-Modus von PortAudio ist ideal für latenzarme, Echtzeit-Audiobearbeitung. Wenn ein Stream gestartet wird, ruft PortAudio periodisch Ihre Callback-Funktion auf, um Audiodaten anzufordern oder bereitzustellen. Dieser Modus gibt Ihnen präzise Kontrolle über das Timing und minimiert Pufferunterläufe. Der Callback erhält Eingabe- und Ausgabepuffer, Frame-Anzahl, Zeitinformationen und Statusflags — was dynamische Audioerzeugung, Effektverarbeitung oder Analyse ermöglicht. Da der Callback in einem hochprioritären Thread läuft, muss er schnell ausgeführt werden (typischerweise unter 10 ms), um Störungen zu vermeiden. Das macht ihn perfekt für Live-Audio-Anwendungen wie Synthesizer, Gitarren-Effektpedale oder Sprachkommunikationssysteme, bei denen deterministische Leistung entscheidend ist.

Echtzeit-Sinuswellengenerator über 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;
}

Geräteaufzählung und Abfrage

PortAudio bietet robuste APIs, um verfügbare Audiogeräte—einschließlich Eingabe- und Ausgabegeräte—aufzuzählen und zu inspizieren, zusammen mit deren Fähigkeiten. Entwickler können Gerätnamen, Kanalzahlen, Standard-Abtastraten und Latenzwerte mit Funktionen wie `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` und `Pa_GetDefaultInputDeviceID()` abfragen. Dies ermöglicht Anwendungen, den Benutzern eine Liste gültiger Geräte anzuzeigen und Streams optimal zu konfigurieren. Sie können auch Standardgeräte erkennen, unterstützte Abtastraten prüfen und minimale/maximale Latenzen bestimmen. Diese Flexibilität ist entscheidend für den Aufbau konfigurierbarer Audiowerkzeuge, DAWs oder Sprachrekorder, die sich an unterschiedliche Hardware-Setups anpassen, ohne manuelle Konfiguration.

Alle verfügbaren Audiogeräte auflisten

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();

Plattformübergreifende Host-API-Unterstützung

PortAudio abstrahiert plattformspezifische Audio-APIs durch modulare Host-API-Implementierungen und sorgt für ein konsistentes Verhalten über verschiedene Betriebssysteme hinweg. Unter Windows unterstützt es ASIO (für professionelle Audio), WASAPI (Vista+), DirectSound und das veraltete MME. macOS nutzt Core Audio für ultra‑niedrige Latenz, während Linux ALSA, JACK und PulseAudio unterstützt. BSD-Systeme verwenden OSS oder sndio. Entwickler schreiben einmal und setzen es überall ein – keine bedingte Kompilierung für die Kernlogik erforderlich. Die Bibliothek wählt automatisch die best verfügbare Host-API aus oder lässt Sie eine explizit angeben. Diese Universalität macht PortAudio ideal für portable Audiowerkzeuge, Bildungssoftware und Forschungsrahmen, die zuverlässig auf unterschiedlicher Hardware und OS-Konfigurationen laufen müssen.

Erzwinge die Verwendung der JACK-Host-API unter 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);

Audioformatkonvertierung und Dithering

PortAudio verarbeitet die interne Sample-Formatkonvertierung transparent und ermöglicht es Clients, praktische Formate wie 32‑Bit‑Gleitkomma zu verwenden, während das zugrunde liegende System native Ganzzahlformate nutzt (z. B. 16‑Bit‑PCM). Es unterstützt die Konvertierung zwischen 8‑, 16‑, 24‑ und 32‑Bit‑Ganzzahlformaten sowie 32‑Bit‑Float. Zusätzlich bietet es optionales Dithering während der Bit‑Tiefen‑Reduktion, um Quantisierungsrauschen zu minimieren – ein subtiler, aber kritischer Aspekt für hoch‑fidelity‑Audioanwendungen. Dithering erhält die wahrgenommene Audioqualität beim Konvertieren von höheren zu niedrigeren Bit‑Tiefen. Diese Fähigkeiten gewährleisten eine konsistente Audio‑Fidelity über Plattformen hinweg, ohne dass Entwickler komplexe Format‑Handling‑Logik selbst implementieren müssen.

Konfiguriere 32‑Bit‑Float-Eingabe mit 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
 Deutsch