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 забезпечує два основних режими роботи: на основі зворотного виклику (для потокової передачі з низькою затримкою) та блокуючий читання/запис (для простішого синхронного вводу/виводу). Він включає обширну документацію, приклади програм та тестові утиліти, які допомагають розробникам швидко розпочати роботу. Бібліотеку підтримує глобальна спільнота, і вона ліцензована за ліцензією MIT, що робить її придатною як для відкритих, так і для комерційних застосувань. Незалежно від того, чи створюєте ви цифрову аудіо‑станцію, інструмент розпізнавання голосу чи інтерактивний музичний додаток, PortAudio надає надійну, легку основу для крос‑платформенної розробки аудіо.

Previous Next

Початок роботи з 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();

Підтримка кросплатформенного Host 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
 Українська