1. Termékek
  2.   Hang
  3.   C++
  4.   portaudio

portaudio

 
 

Nyílt forráskódú C könyvtár audio I/O-hoz

Valós idejű audio bemenet és kimenet Windows, macOS, Linux és egyéb rendszerek között nyílt forráskódú C API segítségével.

Mi az a portaudio?

A PortAudio egy ingyenes, nyílt forráskódú, többplatformos C könyvtár, amely lehetővé teszi a fejlesztők számára, hogy valós idejű bemenet- és kimeneti képességekkel rendelkező hordozható audioalkalmazásokat írjanak. Absztrahálja a platformfüggő audio alrendszereket, mint az ASIO, CoreAudio, ALSA, WASAPI és a JACK, így konzisztens audio I/O-t biztosít Windows, macOS, Linux és egyéb operációs rendszerek között. A könyvtár több audioformátumot támogat – beleértve a 32 bites lebegőpontos formátumot is – és belsőleg kezeli a formátumkonverziót. Egyszerű, mégis hatékony API-jával a PortAudio széles körben használatos audio szoftverekben, pluginekben, oktatási eszközökben és kutatási projektekben, amelyek alacsony késleltetésű, nagy teljesítményű audiofeldolgozást igényelnek.

A PortAudio két fő működési módot kínál: visszahíváson alapuló (alacsony késleltetésű streaminghez) és blokkoló olvasás/írás (egyszerűbb szinkron I/O-hoz). Kiterjedt dokumentációt, példaprogramokat és tesztsegédprogramokat tartalmaz, amelyek segítik a fejlesztőket a gyors kezdésben. A könyvtárat egy globális közösség tartja karban, és az MIT licenc alatt áll, ami alkalmassá teszi nyílt forráskódú és kereskedelmi alkalmazásokra egyaránt. Akár digitális audio munkaállomást, hangfelismerő eszközt vagy interaktív zenei alkalmazást építesz, a PortAudio megbízható, könnyű alapot biztosít a többplatformos audio fejlesztéshez.

Previous Next

A portaudio használatának megkezdése

A PortAudio használatának megkezdéséhez vagy a forrásból építheted fel, vagy csomagkezelőkön keresztül telepítheted. A legtöbb fejlesztő számára a legegyszerűbb módszer az hivatalos portaudio GitHub tároló klónozása, majd CMake vagy autotools használatával történő fordítása. Linuxon telepítsd a `apt install portaudio19-dev` paranccsal; macOS-en használd a `brew install portaudio` parancsot; Windows-on tölts le előre lefordított binárisokat, vagy használd a vcpkg-t (`vcpkg install portaudio`). A telepítés után add hozzá a `portaudio.h` fejléct, és linkeld a könyvtárat (`-lportaudio`). A könyvtár könnyű, és minimális függőségekkel rendelkezik, ami egyszerűvé teszi a beépítést valós idejű audioalkalmazásokhoz.

PortAudio telepítése csomagkezelőkkel

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

# macOS (Homebrew)
brew install portaudio

# Windows (vcpkg)
vcpkg install portaudio

Valós idejű hangfolyamok visszahívásokkal

PortAudio visszahívás-alapú streaming módja ideális alacsony késleltetésű, valós idejű hangfeldolgozáshoz. Amikor egy adatfolyam elindul, a PortAudio rendszeresen meghívja a visszahívási függvényedet, hogy hangadatot kérjen vagy biztosítson. Ez a mód pontos időzítési kontrollt ad, és minimalizálja a puffer alulcsordulásokat. A visszahívás bemeneti és kimeneti puffereket, keretszámot, időinformációt és állapotjelzőket kap — lehetővé téve dinamikus hanggenerálást, effektusfeldolgozást vagy elemzést. Mivel a visszahívás magas prioritású szálon fut, gyorsan kell végrehajtódnia (általában 10 ms alatt), hogy elkerülje a hibákat. Ez tökéletes élő hangalkalmazásokhoz, mint szintetizátorok, gitár effektpedálok vagy hangkommunikációs rendszerek, ahol a determinisztikus teljesítmény kritikus.

Valós idejű szinuszhullám-generátor visszahívással

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

Eszközök felsorolása és lekérdezése

PortAudio robusztus API-kat biztosít az elérhető audioeszközök felsorolásához és vizsgálatához – beleértve a bemeneti és kimeneti eszközöket – valamint azok képességeit. A fejlesztők lekérdezhetik az eszközök nevét, csatornaszámát, alapértelmezett mintavételezési frekvenciákat és késleltetési értékeket olyan függvényekkel, mint a `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` és a `Pa_GetDefaultInputDeviceID()`. Ez lehetővé teszi, hogy az alkalmazások a felhasználóknak érvényes eszközök listáját mutassák, és a streameket optimálisan konfigurálják. Emellett felismerhetők az alapértelmezett eszközök, ellenőrizhetők a támogatott mintavételezési frekvenciák, és meghatározhatók a minimum/maximum késleltetések. Ez a rugalmasság elengedhetetlen konfigurálható audioeszközök, DAW-ok vagy hangrögzítők építéséhez, amelyek a különféle hardverbeállításokhoz alkalmazkodnak manuális konfiguráció nélkül.

Az összes elérhető audioeszköz listázása

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

Keresztplatformos host API támogatás

PortAudio absztrahálja a platformfüggő audio API-kat moduláris host API megvalósításokon keresztül, biztosítva a konzisztens viselkedést az operációs rendszerek között. Windowson támogatja az ASIO-t (professzionális audio), a WASAPI-t (Vista+), a DirectSound-ot és a régi MME-t. A macOS a Core Audio-t használja az ultra alacsony késleltetéshez, míg Linuxon az ALSA, a JACK és a PulseAudio támogatott. BSD rendszerek az OSS-t vagy a sndio-t használják. A fejlesztők egyszer írnak, és mindenhol telepítenek – a fő logikához nem szükséges feltételes fordítás. A könyvtár automatikusan kiválasztja a legjobb elérhető host API-t, vagy lehetővé teszi, hogy explicit módon megadjuk. Ez az univerzalitás teszi a PortAudio-t ideálissá hordozható audio eszközök, oktatási szoftverek és kutatási keretrendszerek számára, amelyeknek megbízhatóan kell működniük változatos hardver- és OS-konfigurációkban.

JACK host API kényszerített használata Linuxon

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

Hangformátum-átalakítás és dithering

A PortAudio átláthatóan kezeli a belső mintavételi formátum konverziót, lehetővé téve az ügyfelek számára, hogy kényelmes formátumokat, például 32‑bites lebegőpontos értékeket használjanak, miközben az alaprendszer natív egész szám formátumokat alkalmaz (pl. 16‑bites PCM). Támogatja a 8‑, 16‑, 24‑ és 32‑bites egész szám formátumok, valamint a 32‑bites lebegőpontos formátum közötti átalakítást. Emellett opcionális ditheringet (zajszórást) kínál a bitmélység csökkentése során a kvantálási zaj minimalizálása érdekében – egy finom, de kritikus funkció a magas hűségű audioalkalmazások számára. A dithering megőrzi a hallott hangminőséget, amikor magasabbról alacsonyabb bitmélységre konvertálunk. Ezek a képességek biztosítják a konzisztens audiohűséget a különböző platformokon anélkül, hogy a fejlesztőknek saját maguknak kellene megvalósítaniuk a bonyolult formátumkezelő logikát.

32 bites lebegőpontos bemenet beállítása ditheringgel

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
 Magyar