
portaudio
Atviro kodo C biblioteka garso įvesties ir išvesties
Realio laiko garso įvestis ir išvestis Windows, macOS, Linux ir kitose platformose per atviro kodo C API.
Kas yra portaudio?
PortAudio yra nemokama, atviro kodo, daugiaplatformė C biblioteka, kuri leidžia kūrėjams rašyti perkeliamas garso programas su realaus laiko įvesties ir išvesties galimybėmis. Ji abstrahuoja platformai būdingas garso posistemas, tokias kaip ASIO, CoreAudio, ALSA, WASAPI ir JACK, suteikdama nuoseklų garso Į/I visose Windows, macOS, Linux ir kitose operacinėse sistemose. Biblioteka palaiko kelis garso formatus – įskaitant 32‑bitų slankaus kablelio – ir viduje tvarko formato konversiją. Su paprasta, bet galinga API, PortAudio plačiai naudojama garso programinėje įrangoje, įskiepiuose, mokymo priemonėse ir tyrimų projektuose, kuriems reikalingas mažas delsimas ir aukštos našumo garso apdorojimas.
PortAudio suteikia dvi pagrindines veikimo režimus: grįžtamojo skambučio (callback) pagrindu (žemų delsų srautui) ir blokavimo skaitymo/rašymo (paprastesniam sinchroniniam I/O). Joje yra išsamus dokumentacija, pavyzdžių programos ir testų įrankiai, padedantys kūrėjams greitai pradėti. Biblioteka prižiūrima pasaulinės bendruomenės ir licencijuota pagal MIT licenciją, todėl ji tinka tiek atviro kodo, tiek komercinėms programoms. Nesvarbu, ar kuriate skaitmeninę garso darbo stotį, balso atpažinimo įrankį ar interaktyvią muzikos programą, PortAudio suteikia patikimą, lengvą pagrindą kryžminės platformos garso kūrimui.
Pradžia su portaudio
Norėdami pradėti naudoti PortAudio, galite arba sukompiliuoti iš šaltinio, arba įdiegti per paketų tvarkykles. Daugumai kūrėjų paprasčiausias būdas yra klonuoti oficialią portaudio GitHub saugyklą ir kompiliuoti naudojant CMake arba autotools. Linux sistemoje įdiekite per `apt install portaudio19-dev`; macOS – naudokite `brew install portaudio`; Windows – atsisiųskite paruoštus binarinius failus arba naudokite vcpkg (`vcpkg install portaudio`). Po įdiegimo įtraukite `portaudio.h` ir susiekite su biblioteka (`-lportaudio`). Biblioteka yra lengva ir turi minimalias priklausomybes, todėl integracija yra paprasta realaus laiko garso programoms.
Įdiekite PortAudio per paketų tvarkykles
# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev
# macOS (Homebrew)
brew install portaudio
# Windows (vcpkg)
vcpkg install portaudio
Realaus laiko garso srautas su atgaliniais iškvietimais
PortAudio callback pagrįstas srautinimo režimas yra idealus žemo delsos, realaus laiko garso apdorojimui. Kai srautas paleidžiamas, PortAudio periodiškai iškviečia jūsų callback funkciją, kad paprašytų arba pateiktų garso duomenis. Šis režimas suteikia tikslų laiko kontrolę ir sumažina buferio trūkumus. Callback gauna įvesties ir išvesties buferius, kadrų skaičių, laiko informaciją ir būsenos vėliavas – leidžiantį dinaminį garso generavimą, efektų apdorojimą arba analizę. Kadangi callback veikia aukštos prioriteto gijoje, jis turi veikti greitai (dažniausiai mažiau nei 10 ms), kad išvengtų trikdžių. Tai daro jį puikų tiesioginių garso programoms, tokioms kaip sintezatoriai, gitarų efektų pedalai arba balso komunikacijos sistemos, kur kritiškai svarbus deterministinis našumas.
Realaus laiko sinusoidės generatorius per atgalinį iškvietimą
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;
}
Įrenginių išvardijimas ir užklausos
PortAudio suteikia patikimas API, skirtas išvardyti ir patikrinti prieinamus garso įrenginius — įskaitant įvesties ir išvesties įrenginius — kartu su jų galimybėmis. Kūrėjai gali užklausti įrenginių pavadinimų, kanalų skaičiaus, numatytų mėginių dažnių ir delsos verčių naudodami tokias funkcijas kaip `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` ir `Pa_GetDefaultInputDeviceID()`. Tai leidžia programoms vartotojams pateikti galiojančių įrenginių sąrašą ir optimaliai konfigūruoti srautus. Taip pat galite aptikti numatytuosius įrenginius, patikrinti palaikomus mėginių dažnius ir nustatyti minimalias/maksimalias delsas. Šis lankstumas yra būtinas kuriant konfigūruojamus garso įrankius, DAW ar balso įrašiklius, kurie prisitaiko prie įvairių aparatūros konfigūracijų be rankinio nustatymo.
Išvardyti visus prieinamus garso įrenginius
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();
Kelių platformų pagrindinio API palaikymas
PortAudio abstrahuoja platformos specifines garso API per moduliškas prieglobos API įgyvendinimus, užtikrindama nuoseklų veikimą visose operacinėse sistemose. Windows operacinėje sistemoje ji palaiko ASIO (profesiniam garsui), WASAPI (Vista+), DirectSound ir senąją MME. macOS naudoja Core Audio ultra‑mažamų delsų pasiekimui, o Linux palaiko ALSA, JACK ir PulseAudio. BSD sistemose naudojamas OSS arba sndio. Kūrėjai rašo vieną kartą ir diegia visur—pagrindinei logikai nereikia sąlyginių kompiliacijų. Biblioteka automatiškai pasirenka geriausią prieinamą prieglobos API arba leidžia ją nurodyti aiškiai. Ši universalumas daro PortAudio idealia priemone nešiojamiems garso įrankiams, edukacinei programinei įrangai ir tyrimų sistemoms, kurios turi patikimai veikti įvairioje aparatinėje įrangoje ir OS konfigūracijose.
Priversti naudoti JACK Host API Linux sistemoje
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);
Garso formato konvertavimas ir ditheringas
PortAudio tvarko vidinį mėginių formato konvertavimą skaidriai, leidžiant klientams naudoti patogius formatus, pvz., 32‑bitų slankų kablelį, tuo tarpu pagrindinė sistema naudoja natūralius sveikųjų skaičių formatus (pvz., 16‑bitų PCM). Ji palaiko konvertavimą tarp 8‑, 16‑, 24‑ ir 32‑bitų sveikųjų skaičių formatų, taip pat 32‑bitų slankaus kablelio. Be to, ji siūlo pasirenkamą ditheringą bitų gylio sumažinimo metu, siekiant sumažinti kvantizacijos triukšmą – subtilų, bet kritišką bruožą aukštos kokybės garso programoms. Ditheringas išlaiko suvokiamą garso kokybę konvertuojant iš aukštesnių į žemesnius bitų gylį. Šios galimybės užtikrina nuoseklią garso ištikimybę įvairiose platformose, nereikalaujant kūrėjams patiems įgyvendinti sudėtingą formato tvarkymo logiką.
Konfigūruoti 32‑bitų slankaus kablelio įvestį su 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
