1. produkty
  2.   Zvuk
  3.   C++
  4.   portaudio

portaudio

 
 

Open source knihovna v C pro audio I/O

Vstup a výstup zvuku v reálném čase na Windows, macOS, Linuxu a dalších platformách pomocí open source C API.

Co je portaudio?

PortAudio je bezplatná, open-source, multiplatformní knihovna v jazyce C, která umožňuje vývojářům psát přenositelné audio aplikace s možností vstupu a výstupu v reálném čase. Abstrahuje platformově specifické audio subsystémy jako ASIO, CoreAudio, ALSA, WASAPI a JACK, což umožňuje konzistentní audio I/O napříč Windows, macOS, Linuxem a dalšími operačními systémy. Knihovna podporuje různé audio formáty – včetně 32bitového floating pointu – a interně provádí konverzi formátů. Díky jednoduchému, ale výkonnému API je PortAudio široce používána v audio softwaru, pluginech, vzdělávacích nástrojích a výzkumných projektech vyžadujících nízkou latenci a vysoký výkon při zpracování audia.

PortAudio poskytuje dva hlavní režimy provozu: založený na zpětných voláních (pro nízkou latenci streamování) a blokující čtení/zápis (pro jednodušší synchronní I/O). Obsahuje rozsáhlou dokumentaci, ukázkové programy a testovací nástroje, které vývojářům pomáhají rychle začít. Knihovna je udržována globální komunitou a je licencována pod licencí MIT, což ji činí vhodnou jak pro open-source, tak pro komerční aplikace. Ať už vytváříte digitální audio pracovní stanici, nástroj pro rozpoznávání hlasu nebo interaktivní hudební aplikaci, PortAudio poskytuje spolehlivý, lehký základ pro multiplatformní vývoj zvuku.

Previous Next

Začínáme s portaudio

Chcete-li začít používat PortAudio, můžete jej buď sestavit ze zdrojového kódu, nebo nainstalovat pomocí správce balíčků. Pro většinu vývojářů je nejjednodušší metoda naklonovat oficiální portaudio GitHub repozitář a zkompilovat pomocí CMake nebo autotools. Na Linuxu nainstalujte pomocí `apt install portaudio19-dev`; na macOS použijte `brew install portaudio`; na Windows stáhněte předkompilované binární soubory nebo použijte vcpkg (`vcpkg install portaudio`). Po instalaci zahrňte `portaudio.h` a propojte s knihovnou (`-lportaudio`). Knihovna je lehká a má minimální závislosti, což usnadňuje integraci pro aplikace v reálném čase.

Instalace PortAudio pomocí správce balíčků

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

# macOS (Homebrew)
brew install portaudio

# Windows (vcpkg)
vcpkg install portaudio

Streamování zvuku v reálném čase s callbacky

Režim streamování založený na zpětných voláních PortAudio je ideální pro nízkou latenci a zpracování zvuku v reálném čase. Když je stream spuštěn, PortAudio periodicky volá vaši funkci zpětného volání, aby požádala o audio data nebo je dodala. Tento režim vám poskytuje přesnou kontrolu nad časováním a minimalizuje podtečení bufferu. Zpětné volání přijímá vstupní a výstupní buffery, počet snímků, časové informace a stavové příznaky — umožňující dynamické generování zvuku, zpracování efektů nebo analýzu. Protože zpětné volání běží ve vysoce prioritním vláknu, musí být vykonáno rychle (typicky pod 10 ms), aby nedocházelo k chybám. To ho činí perfektním pro živé audio aplikace, jako jsou syntezátory, pedály pro kytarové efekty nebo systémy hlasové komunikace, kde je rozhodující deterministický výkon.

Generátor sinusového signálu v reálném čase pomocí callbacku

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

Enumerace a dotazování zařízení

PortAudio poskytuje robustní API pro výčet a kontrolu dostupných audio zařízení — včetně vstupních a výstupních zařízení — spolu s jejich schopnostmi. Vývojáři mohou pomocí funkcí jako `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` a `Pa_GetDefaultInputDeviceID()` dotazovat názvy zařízení, počet kanálů, výchozí vzorkovací frekvence a hodnoty latence. To umožňuje aplikacím zobrazit uživatelům seznam platných zařízení a optimálně konfigurovat streamy. Také můžete detekovat výchozí zařízení, kontrolovat podporované vzorkovací frekvence a určit minimální/maximální latence. Tato flexibilita je nezbytná pro tvorbu konfigurovatelných audio nástrojů, DAW nebo hlasových rekordérů, které se přizpůsobují různorodým hardwarovým konfiguracím bez ručního nastavení.

Seznam všech dostupných audio zařízení

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

Podpora hostitelského API napříč platformami

PortAudio abstrahuje platformově specifické audio API prostřednictvím modulárních implementací host API, což zajišťuje konzistentní chování napříč operačními systémy. Ve Windows podporuje ASIO (pro profesionální audio), WASAPI (Vista+), DirectSound a starší MME. macOS využívá Core Audio pro ultra nízkou latenci, zatímco Linux podporuje ALSA, JACK a PulseAudio. BSD systémy používají OSS nebo sndio. Vývojáři píší jednou a nasazují všude – není potřeba podmíněná kompilace pro jádro logiky. Knihovna automaticky vybírá nejlepší dostupné host API nebo vám umožní specifikovat konkrétní. Tato univerzálnost činí PortAudio ideálním pro přenosné audio nástroje, vzdělávací software a výzkumné rámce, které musí spolehlivě fungovat na různorodém hardwaru a konfiguracích OS.

Vynutit použití JACK Host API v Linuxu

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

Konverze audio formátů a dithering

PortAudio transparentně zpracovává interní konverzi formátů vzorků, což umožňuje klientům používat pohodlné formáty jako 32bitové floating point, zatímco podkladový systém používá nativní celočíselné formáty (např. 16bitový PCM). Podporuje konverzi mezi 8-, 16-, 24- a 32bitovými celočíselnými formáty, stejně jako 32bitovým float. Navíc nabízí volitelné dithering během snižování bitové hloubky, aby se minimalizoval kvantizační šum – jemná, ale kritická funkce pro aplikace s vysokou věrností zvuku. Dithering zachovává vnímanou kvalitu zvuku při převodu z vyšší na nižší bitovou hloubku. Tyto možnosti zajišťují konzistentní zvukovou věrnost napříč platformami, aniž by vývojáři museli sami implementovat složitou logiku pro zpracování formátů.

Nastavit 32bitový float vstup s ditheringem

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
 Čeština