
portaudio
Открытая C‑библиотека для ввода/вывода аудио
Ввод и вывод аудио в реальном времени на Windows, macOS, Linux и других платформах через открытый C API.
Что такое portaudio?
PortAudio — это бесплатная, открытая, кроссплатформенная библиотека на C, позволяющая разработчикам писать переносимые аудио‑приложения с возможностями ввода и вывода в реальном времени. Она абстрагирует платформенно‑специфичные аудиосистемы, такие как ASIO, CoreAudio, ALSA, WASAPI и JACK, обеспечивая согласованный ввод/вывод аудио на Windows, macOS, Linux и других операционных системах. Библиотека поддерживает множество аудиоформатов, включая 32‑битный плавающий тип, и выполняет конвертацию форматов внутри. Благодаря простому, но мощному API, PortAudio широко используется в аудиопрограммах, плагинах, образовательных инструментах и исследовательских проектах, требующих низкой задержки и высокой производительности обработки аудио.
PortAudio предоставляет два основных режима работы: основанный на обратных вызовах (для низколатентного стриминга) и блокирующее чтение/запись (для более простого синхронного ввода‑вывода). Он включает обширную документацию, примеры программ и тестовые утилиты, помогающие разработчикам быстро начать работу. Библиотека поддерживается глобальным сообществом и лицензирована по лицензии 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 мс), чтобы избежать сбоев. Это делает его идеальным для живых аудио приложений, таких как синтезаторы, педали гитарных эффектов или системы голосовой связи, где критична детерминированная производительность.
Генератор синусоидального сигнала в реальном времени через обратный вызов
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 через модульные реализации host API, обеспечивая согласованное поведение на разных операционных системах. В Windows он поддерживает ASIO (для профессионального аудио), WASAPI (Vista+), DirectSound и устаревший MME. macOS использует Core Audio для сверхнизкой задержки, в то время как Linux поддерживает ALSA, JACK и PulseAudio. BSD-системы используют OSS или sndio. Разработчики пишут один раз и развёртывают везде — без необходимости условной компиляции основной логики. Библиотека автоматически выбирает лучший доступный host API или позволяет явно указать его. Такая универсальность делает PortAudio идеальным для переносимых аудио‑инструментов, образовательного программного обеспечения и исследовательских фреймворков, которые должны надёжно работать на разнообразном оборудовании и конфигурациях ОС.
Принудительное использование API хоста JACK в 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‑битным float. Кроме того, он предлагает опциональное дезерирование при уменьшении разрядности, чтобы минимизировать квантовый шум — тонкая, но критически важная функция для аудио‑приложений высокого качества. Дезерирование сохраняет воспринимаемое качество звука при преобразовании из более высокой разрядности в более низкую. Эти возможности обеспечивают согласованную аудио‑верность на разных платформах без необходимости разработчикам реализовывать сложную логику обработки форматов.
Настройка 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
