Открыть сервис

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: 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 →