libpulse¶
libpulse — это клиентская библиотека на языке C, предоставляющая программный интерфейс (API) для взаимодействия с звуковым сервером PulseAudio. Она является основным способом для приложений отправлять и принимать аудиопотоки, управлять громкостью, переключать устройства вывода и ввода, а также получать информацию о состоянии звуковой подсистемы в операционных системах, использующих PulseAudio, прежде всего в GNU/Linux и других Unix-подобных системах.
¶История
PulseAudio был создан в 2004 году финским разработчиком Леннартом Поттерингом (Lennart Poettering) как замена устаревшему к тому времени звуковому серверу Enlightened Sound Daemon (ESD). Первоначально библиотека libpulse развивалась как часть проекта PulseAudio (изначально называвшегося Polypaudio). В 2006 году проект был переименован в PulseAudio, а его API — в libpulse.
В ранних версиях PulseAudio (0.x) API был нестабильным и часто менялся. Начиная с версии 1.0 (выпущенной в 2011 году), API libpulse был объявлен стабильным, и разработчикам было рекомендовано использовать именно его, а не устаревшие обёртки (например, libpulse-simple). С тех пор libpulse является стандартным способом интеграции приложений с PulseAudio.
С появлением альтернативных звуковых серверов, таких как PipeWire (активно развивается с 2017 года), libpulse сохраняет совместимость: PipeWire предоставляет слой совместимости, реализующий API libpulse, что позволяет старым приложениям работать без изменений. Однако для новых проектов разработчики часто рекомендуют использовать API PipeWire напрямую.
¶Архитектура и устройство
¶Клиент-серверная модель
libpulse реализует клиентскую часть протокола PulseAudio. Приложение, использующее libpulse, подключается к работающему звуковому серверу PulseAudio (демону pulseaudio). Соединение может быть:
- локальным — через Unix-сокет (по умолчанию
~/.config/pulse/pulseaudio.socketили/run/user/<UID>/pulse/native); - удалённым — через TCP-сокет (порт 4713 по умолчанию, если включён сетевой доступ).
¶Основные компоненты API
Библиотека предоставляет несколько ключевых подсистем:
- Контекст (
pa_context) — основное соединение с сервером. Все операции выполняются через контекст. Он создаётся, подключается, и после завершения работы освобождается. - Потоки (
pa_stream) — представляют собой аудиопотоки (входные или выходные). Поток может быть: - выходным (playback) — воспроизведение звука;
- входным (record) — запись звука.
- Устройства — источники (source) и приёмники (sink) звука. API позволяет перечислять, выбирать и переключать устройства.
- Модули — серверные компоненты PulseAudio, управляемые через API (например, загрузка/выгрузка модулей).
- События — библиотека поддерживает асинхронную модель: приложение регистрирует обработчики (callback), которые вызываются при наступлении событий (изменение громкости, подключение/отключение устройств и т.д.).
¶Синхронность и асинхронность
libpulse работает в основном асинхронно. Большинство функций не блокируют выполнение программы, а ставят запрос в очередь и возвращают управление немедленно. Результат приходит через callback-функцию. Это позволяет приложениям (особенно с графическим интерфейсом) не зависать во время ожидания ответа от сервера. Для простых сценариев существует упрощённая обёртка — libpulse-simple, которая предоставляет синхронные вызовы.
¶Функциональные возможности
¶Управление громкостью и микширование
- Чтение и установка громкости для отдельных потоков, устройств (sink/source) и их каналов.
- Поддержка баланса каналов (лево/право, фронт/тыл и т.д.).
- Работа с объёмом звука в единицах PulseAudio (PA_VOLUME_NORM — 0x10000 соответствует 100% громкости).
¶Переключение устройств
- Выбор активного устройства вывода (sink) или ввода (source) для конкретного приложения или глобально.
- Перемещение потоков между устройствами (например, перенос музыки с колонок на наушники).
¶Работа с профилями и картами
- Управление профилями звуковых карт (например, переключение между аналоговым стерео и цифровым HDMI-выходом).
- Мониторинг подключения/отключения устройств (например, USB-гарнитуры).
¶Информация о состоянии
- Получение списка всех источников, приёмников, потоков, модулей, клиентов.
- Статистика работы сервера (загрузка ЦП, количество потерянных сэмплов и т.д.).
¶Применение
¶В операционных системах
libpulse используется практически во всех дистрибутивах GNU/Linux, где установлен PulseAudio. Это стандартный аудио-API для:
- Рабочих окружений (GNOME, KDE, Xfce, LXQt) — через системные настройки звука.
- Медиаплееров (VLC, Audacious, Rhythmbox, Amarok) — для воспроизведения музыки и видео.
- Браузеров (Firefox, Chromium/Chrome) — для воспроизведения веб-аудио и WebRTC.
- Игр (через SDL, OpenAL, FMOD, которые используют libpulse в качестве бэкенда).
- Профессионального аудио (DAW, такие как Ardour, Reaper, LMMS — через JACK, который может работать поверх PulseAudio, или напрямую через libpulse).
¶В разработке программного обеспечения
Разработчики используют libpulse для:
- Создания приложений, требующих низкой задержки (VoIP, игры).
- Реализации системных утилит управления звуком (например,
pactl,pavucontrol). - Интеграции звука в собственные проекты (например, в робототехнике, системах умного дома).
¶Примеры использования
¶Минимальная программа воспроизведения (синхронная версия через libpulse-simple)
```c
¶include <pulse/simple.h>
¶include <pulse/error.h>
int main() { pa_simple *s; pa_sample_spec ss; ss.format = PA_SAMPLE_S16LE; ss.rate = 44100; ss.channels = 2;
s = pa_simple_new(NULL, "test", PA_STREAM_PLAYBACK, NULL, "playback", &ss, NULL, NULL, NULL); if (!s) { fprintf(stderr, "pa_simple_new() failed\n"); return 1; }
// ... отправка аудиоданных через pa_simple_write() ...
pa_simple_free(s); return 0; } ```
¶Асинхронное получение списка приёмников (через libpulse)
```c
¶include <pulse/pulseaudio.h>
static void sink_list_callback(pa_context c, const pa_sink_info i, int eol, void *userdata) { if (eol > 0) return; printf("Sink: %s (%s)\n", i->name, i->description); }
int main() { pa_mainloop ml = pa_mainloop_new(); pa_context ctx = pa_context_new(pa_mainloop_get_api(ml), "test"); pa_context_connect(ctx, NULL, 0, NULL); pa_context_set_state_callback(ctx, ...); pa_operation *op = pa_context_get_sink_info_list(ctx, sink_list_callback, NULL); pa_mainloop_run(ml, NULL); return 0; } ```
¶Критика и ограничения
- Сложность асинхронного API — для новичков асинхронная модель с callback-функциями может быть непривычной и трудной в отладке.
- Зависимость от сервера — без работающего демона PulseAudio приложения, использующие libpulse, не могут воспроизводить звук (в отличие от ALSA, которая может работать напрямую с оборудованием).
- Производительность — в некоторых сценариях (например, профессиональное аудио с очень низкой задержкой) libpulse может уступать JACK или PipeWire.
- Устаревание — с развитием PipeWire и его собственного API, libpulse постепенно теряет актуальность для новых проектов, хотя остаётся критически важным для совместимости.
¶См. также
- PulseAudio
- PipeWire
- JACK Audio Connection Kit
- ALSA
- SDL_audio
¶Источники
- Официальная документация PulseAudio: freedesktop.org/wiki/Software/PulseAudio/Documentation/
- Исходный код libpulse: gitlab.freedesktop.org/pulseaudio/pulseaudio
- Статья «PulseAudio» в ArchWiki: wiki.archlinux.org/title/PulseAudio
- Lennart Poettering, «PulseAudio: A New Sound Server for Linux», 2004 (первоначальное объявление)
- Руководство разработчика PulseAudio: freedesktop.org/software/pulseaudio/doxygen/
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


