
portaudio
Отворена C библиотека за аудио I/O
Аудио вход и изход в реално време за Windows, macOS, Linux и други чрез отворен C API.
Какво е PortAudio?
PortAudio е безплатна, с отворен код, кросплатформена C библиотека, която позволява на разработчиците да създават преносими аудио приложения с възможности за реалновременен вход и изход. Тя абстрахира специфичните за платформата аудио подсистеми като ASIO, CoreAudio, ALSA, WASAPI и JACK, осигурявайки последователен аудио I/O в Windows, macOS, Linux и други операционни системи. Библиотеката поддържа множество аудио формати — включително 32-битово плаващо запетая — и обработва конверсията на формати вътрешно. Със прост, но мощен API, PortAudio се използва широко в аудио софтуер, плъгини, образователни инструменти и изследователски проекти, изискващи ниска латентност и висока производителност при обработка на аудио.
PortAudio предоставя два основни режима на работа: базиран на обратни извиквания (за стрийминг с ниска латентност) и блокиращо четене/запис (за по‑опростен синхронен I/O). Той включва обширна документация, примерни програми и тестови инструменти, които помагат на разработчиците бързо да започнат. Библиотеката се поддържа от глобална общност и е лицензирана под MIT лиценз, което я прави подходяща както за отворен код, така и за комерсиални приложения. Независимо дали създавате цифрова аудио работна станция, инструмент за разпознаване на глас или интерактивно музикално приложение, PortAudio предоставя надеждна, лека основа за крос‑платформена аудио разработка.
Започване с PortAudio
За да започнете да използвате PortAudio, можете или да го компилирате от изходния код, или да го инсталирате чрез пакетни мениджъри. За повечето разработчици най-лесният метод е да клонирате официалното portaudio GitHub хранилище и да компилирате с CMake или autotools. В Linux инсталирайте чрез `apt install portaudio19-dev`; в macOS използвайте `brew install portaudio`; в Windows изтеглете предварително компилирани бинарни файлове или използвайте vcpkg (`vcpkg install portaudio`). След инсталацията включете `portaudio.h` и линквайте към библиотеката (`-lportaudio`). Библиотеката е лека и има минимални зависимости, което прави интеграцията проста за приложения в реално време.
Инсталиране на PortAudio чрез пакетни мениджъри
# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev
# macOS (Homebrew)
brew install portaudio
# Windows (vcpkg)
vcpkg install portaudio
Поточно предаване на аудио в реално време с обратни извиквания
Режимът за стрийминг, базиран на обратни извиквания на PortAudio, е идеален за обработка на аудио с ниска латентност и в реално време. Когато се стартира поток, PortAudio периодично извиква вашата функция за обратен вик, за да поиска или достави аудио данни. Този режим ви дава прецизен контрол върху времето и минимизира недостигите в буфера. Обратният вик получава входни и изходни буфери, брой кадри, информация за времето и флагове за състояние — позволявайки динамично генериране на аудио, обработка на ефекти или анализ. Тъй като обратният вик се изпълнява в нишка с високо приоритет, той трябва да се изпълнява бързо (обикновено под 10 ms), за да се избегнат грешки. Това го прави перфектен за живи аудио приложения като синтезатори, педали за китарни ефекти или системи за гласова комуникация, където детерминистичната производителност е от съществено значение.
Генератор на синусоидална вълна в реално време чрез 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;
}
Изброяване и запитване на устройства
PortAudio предоставя стабилни API за изброяване и проверка на наличните аудио устройства — включително входни и изходни устройства — заедно с техните възможности. Разработчиците могат да запитват имена на устройства, брой канали, стандартни честоти на дискретизация и стойности на латентност, използвайки функции като `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` и `Pa_GetDefaultInputDeviceID()`. Това позволява на приложенията да представят на потребителите списък с валидни устройства и да конфигурират потоците оптимално. Можете също да откривате стандартни устройства, да проверявате поддържани честоти на дискретизация и да определяте минимални/максимални латентности. Тази гъвкавост е от съществено значение за създаването на конфигурируеми аудио инструменти, DAW‑ове или гласови записващи устройства, които се адаптират към различни хардуерни конфигурации без ръчна настройка.
Избройте всички налични аудио устройства
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();
Поддръжка на кросплатформен хост API
PortAudio абстрахира специфичните за платформата аудио API чрез модулни реализации на хост API, осигурявайки последователно поведение в различните операционни системи. В Windows поддържа ASIO (за професионално аудио), WASAPI (Vista+), DirectSound и наследеното MME. macOS използва Core Audio за ултра-ниска латентност, докато Linux поддържа ALSA, JACK и PulseAudio. BSD системите използват OSS или sndio. Разработчиците пишат веднъж и внедряват навсякъде — без необходимост от условна компилация за основната логика. Библиотеката автоматично избира най-доброто налично хост API или ви позволява да посочите конкретно таково. Тази универсалност прави PortAudio идеален за преносими аудио инструменти, образователен софтуер и изследователски рамки, които трябва да работят надеждно върху разнообразен хардуер и конфигурации на ОС.
Принудително използване на JACK Host 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);
Конвертиране на аудио формати и дийтинг
PortAudio обработва вътрешната конверсия на формата на пробата прозрачно, позволявайки на клиентите да използват удобни формати като 32-битово плаващо число, докато подлежащата система използва родни целочислени формати (например 16-битов PCM). Той поддържа конверсия между 8-, 16-, 24- и 32-битови целочислени формати, както и 32-битов плаващ. Освен това предлага опционално дийтинг при намаляване на дълбочината на битовете, за да се минимизира квантизационният шум – фин, но критичен елемент за аудио приложения с висока вярност. Дийтингът запазва възприетото качество на звука при конверсия от по-високи към по-ниски битови дълбочини. Тези възможности осигуряват последователна аудио вярност на различни платформи, без да се налага разработчиците да имплементират сложна логика за обработка на формати.
Конфигуриране на 32-битово плаващо входно с дийтинг
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
