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

portaudio

 
 

Atvērtā koda C bibliotēka audio I/O

Reāllaika audio ievade un izvade Windows, macOS, Linux un citās platformās, izmantojot atvērtā koda C API.

Kas ir portaudio?

PortAudio ir bezmaksas, atvērtā koda, daudzplatformu C bibliotēka, kas ļauj izstrādātājiem rakstīt portatīvas audio lietojumprogrammas ar reāllaika ievades un izvades iespējām. Tā abstraktē platformas specifiskās audio apakšsistēmas, piemēram, ASIO, CoreAudio, ALSA, WASAPI un JACK, nodrošinot konsekventu audio I/O visā Windows, macOS, Linux un citās operētājsistēmās. Bibliotēka atbalsta vairākus audio formātus — tostarp 32‑bitu peldošā komata — un veic formāta konvertēšanu iekšēji. Ar vienkāršu, bet jaudīgu API, PortAudio plaši tiek izmantota audio programmatūrā, spraudņos, izglītības rīkos un pētījumu projektos, kas prasa zemu latentumu un augstas veiktspējas audio apstrādi.

PortAudio nodrošina divus galvenos darbības režīmus: atzvanīšanas (callback) balstītu (zemas latentuma straumēšanai) un bloķējošu lasīšanu/rakstīšanu (vienkāršākai sinhronai I/O). Tajā ir plaša dokumentācija, piemēru programmas un testēšanas rīki, kas palīdz izstrādātājiem ātri sākt darbu. Bibliotēku uztur globāla kopiena, un tā ir licencēta zem MIT licences, padarot to piemērotu gan atvērtā koda, gan komerciālām lietojumprogrammām. Neatkarīgi no tā, vai veidojat digitālu audio darba staciju, balss atpazīšanas rīku vai interaktīvu mūzikas lietotni, PortAudio nodrošina uzticamu, vieglu pamatu platformu neatkarīgai audio izstrādei.

Previous Next

Sākšana ar portaudio

Lai sāktu izmantot PortAudio, jūs varat vai nu būvēt to no pirmavota, vai instalēt, izmantojot pakotņu pārvaldniekus. Lielākajai daļai izstrādātāju visvienkāršākais veids ir klonēt oficiālo portaudio GitHub repozitoriju un kompilēt, izmantojot CMake vai autotools. Linuxā instalējiet, izmantojot `apt install portaudio19-dev`; macOS lietojiet `brew install portaudio`; Windows lejupielādējiet iepriekš kompilētus binārus vai izmantojiet vcpkg (`vcpkg install portaudio`). Pēc instalācijas iekļaujiet `portaudio.h` un piesaistiet bibliotēku (`-lportaudio`). Bibliotēka ir viegla un tai ir minimālas atkarības, kas ļauj vienkārši integrēt to reāllaika audio lietojumprogrammās.

Instalējiet PortAudio, izmantojot pakotņu pārvaldniekus

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

# macOS (Homebrew)
brew install portaudio

# Windows (vcpkg)
vcpkg install portaudio

Reālā laika audio straumēšana ar atzvanēm

PortAudio izsaukuma balstītā straumēšanas režīms ir ideāls zemas latentuma, reāllaika audio apstrādei. Kad tiek sākta straume, PortAudio periodiski izsauc jūsu atzvanīšanas funkciju, lai pieprasītu vai piegādātu audio datus. Šis režīms nodrošina precīzu laika kontroli un samazina bufera nepilnības. Atzvanīšana saņem ievades un izvades buferus, kadru skaitu, laika informāciju un statusa karogus — ļaujot dinamiski ģenerēt audio, apstrādāt efektus vai veikt analīzi. Tā kā atzvanīšana darbojas augstas prioritātes pavedienā, tai jāizpildās ātri (parasti mazāk nekā 10 ms), lai izvairītos no traucējumiem. Tas padara to par perfektu risinājumu tiešraides audio lietojumprogrammām, piemēram, sintezatoriem, ģitāras efekta pedāļiem vai balss komunikācijas sistēmām, kur deterministiska veiktspēja ir kritiska.

Reālā laika sinusoīda viļņa ģenerators, izmantojot atzvani

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

Ierīču uzskaitīšana un vaicāšana

PortAudio nodrošina stabilas API, lai uzskaitītu un pārbaudītu pieejamās audio ierīces — tostarp ievades un izvades ierīces — kopā ar to iespējamībām. Izstrādātāji var vaicāt ierīču nosaukumus, kanālu skaitu, noklusējuma paraugfrekvences un latentuma vērtības, izmantojot tādas funkcijas kā `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` un `Pa_GetDefaultInputDeviceID()`. Tas ļauj lietojumprogrammām lietotājiem parādīt derīgu ierīču sarakstu un optimāli konfigurēt plūsmas. Jūs varat arī noteikt noklusējuma ierīces, pārbaudīt atbalstītās paraugfrekvences un noteikt minimālo/maksimālo latentumu. Šī elastība ir būtiska, lai izveidotu konfigurējamus audio rīkus, DAW vai balss ierakstītājus, kas spēj pielāgoties dažādām aparatūras konfigurācijām bez manuālas iestatīšanas.

Uzskaitīt visas pieejamās audio ierīces

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

Daudzplatformu hosta API atbalsts

PortAudio abstraktē platformas specifiskās audio API caur modulāriem host API implementācijām, nodrošinot konsekventu uzvedību visās operētājsistēmās. Windows vidē tas atbalsta ASIO (profesionālam audio), WASAPI (Vista+), DirectSound un mantoto MME. macOS izmanto Core Audio ultra‑zemu latentumu, kamēr Linux atbalsta ALSA, JACK un PulseAudio. BSD sistēmas lieto OSS vai sndio. Izstrādātāji raksta vienreiz un izvieto visur — nav nepieciešama nosacīta kompilācija galvenajai loģikai. Bibliotēka automātiski izvēlas labāko pieejamo host API vai ļauj to norādīt manuāli. Šī universālitāte padara PortAudio par ideālu portatīviem audio rīkiem, izglītības programmatūrai un pētījumu ietvariem, kas jādarbojas uzticami dažādā aparatūrā un OS konfigurācijās.

Piespiest izmantot JACK hosta API 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);

Audio formāta konvertēšana un dithering

PortAudio pārvalda iekšējo paraugu formāta konvertēšanu caurspīdīgi, ļaujot klientiem izmantot ērtus formātus, piemēram, 32‑bitu peldošo komatu, kamēr pamatā esošā sistēma izmanto vietējos veselu skaitļu formātus (piemēram, 16‑bitu PCM). Tas atbalsta konvertēšanu starp 8‑, 16‑, 24‑ un 32‑bitu veselu skaitļu formātiem, kā arī 32‑bitu peldošo komatu. Turklāt tas piedāvā izvēles dithering (trokšņa izkliedēšanu) bitu dziļuma samazināšanas laikā, lai samazinātu kvantizācijas troksni — smags, bet būtisks rādītājs augstas uztveres audio lietojumprogrammām. Dithering saglabā uztveramo audio kvalitāti, pārvēršot no augstākiem uz zemākiem bitu dziļumiem. Šīs iespējas nodrošina konsekventu audio uzticamību visās platformās, neprasot izstrādātājiem pašiem īstenot sarežģītu formāta apstrādes loģiku.

Konfigurēt 32‑bitu peldošā komata ievadi ar ditheringu

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
 Latviski