LINUX.ORG.RU

Теор. вопрос по структуре звук. серверов (ALSA, Pulseaudio, JACK, Pipewire)

 , , ,


3

1

Здравия желаю, товарищи профессионалы! Изучаю как устроена звуковая система Линукса. Прочитал много статей, посмотрел много блок-схем, написал конспектик для себя. И вроде всё понятно, но есть один момент, который не могу уловить. В разных статьях он по-разному освещён. Поэтому, хочу понять, где же правда.

ALSA у нас состоит из ядерной части (ALSA Kernel) и пользовательской (ALSA Library, ALSA lib, libasound), ну и плюс драйвера и утилиты, но речь не о них. Так вот:

Правильно ли я понимаю, что Pulseaudio заменяет собой ALSA Library (юзерспейсовую часть Алсы), а JACK – не заменяет, и работает поверх её? Об этом говорят блок-схемы, которые есть в сети на эту тему. Однако же, я находил и другие схемы, на которых Pulseaudio изображён рядом с ней (с ALSA-userspace) и следовательно тоже не заменяет её, а лишь дополняет. Pipewire вроде как ничего из Алсы не заменяет и работает поверх неё. Он не имеет своего API, используя как JACK API, так и Pulseaudio API.

Но при этом везде (в статьях) указано, что Pipewire идёт как замена Pulseaudio. А если так, то Pipewire должен, как и Pulseaudio, заменять собой ALSA Library. Хотя, не должен, конечно, просто это логично предположить.

В общем, запутался, прошу внести ясность. Тонкости особо не нужны, достаточно общего структурного понимания – какие модули к чему относятся, кто что заменяет.

Пульса, джэк и трубопровод все работают на одном слое как абстракции над альсой, там особо нечего додумывать. Пульса не может работать как альса с заменой alsa-lib.

Bfgeshka ★★★★★
()
Последнее исправление: Bfgeshka (всего исправлений: 1)

Посмотри зависимости интересующих тебя пакетов через пакетный менеджер твоего дистрибутива, либо на странице с информацией о пакете.

Ещё можешь набрать ldd pipewire, ldd pulseudio, только путь до бинарника правильный укажи, либо тоже самое с библиотеками, входящими в их пакеты и ты увидишь, линкуются ли они с библиотеками alsa или нет.

Я предполагаю, что должны. Но меня этот вопрос не интересовал.

kostik87 ★★★★★
()

PulseAudio использует libasound. Он умеет создавать виртуальные ALSA устройства, для приложений которые работают только с ALSA, что бы пропускать данные через себя, а не напрямую в ALSA. Приложения которые умеют работать с PulseAudio, работают с ним напрямую, но PulseAudio сам не умеет выводить, поэтому конечно передаст в любом случае все в libasound, а она в ядро.

Pipewire работает так же, но кроме ALSA, JACK может имитировать и сам PulseAudio.

JACK это про направление потоков звука, а не про общий звуковой сервер, он притворяться вроде не умеет. Работает тоже через libasound.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 5)
Ответ на: комментарий от kostik87

ldd бесполезно на бинарник натравливать, они используют модули, см /lib64/pulse-$VER/*.so

Использовать ldd на библиотеках которые он выведет, это лишняя операция, он и так рекурсивен.

Вместо указания корректного пути, который будет найден методом проб и ошибок, можно применить команду which

ldd $(which pulseaudio)

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 10)

Правильно ли я понимаю, что Pulseaudio заменяет собой ALSA Library (юзерспейсовую часть Алсы)

Пульса саму библиотеку libasound.so физически никак не трогает и не заменяет. Вместо этого пульса ставит отдельный плагин для альсы. Этот плагин создает виртуальное ALSA PCM устройство. Еще пульса ставит конфиг файл, который заставляет альсу выводить звук по умолчанию на это виртуальное устройство. Например в арче этот конфиг лежит по пути /etc/alsa/conf.d/99-pulseaudio-default.conf.

Далее все просто. Альса приложения выводят звук через libasound.so. Альса перенаправляет звук в пульсу через виртуальное устройство. Пульса микширует звук от всех приложений и гонит результат напрямую в ядерный альса модуль через ту же самую libasound.so.

Пайпваря работает по аналогичной схеме. За джек не скажу, не использовал.

Pipewire вроде как ничего из Алсы не заменяет и работает поверх неё. Он не имеет своего API

Почему это. Пайпваря как раз имеет свое API и свою клиентскую библиотеку libpipewire.so.

Но при этом везде (в статьях) указано, что Pipewire идёт как замена Pulseaudio.

Все верно. Пульсаудио приложения общаются с пульсаудио сервером через доменный сокет с помощью библиотеки libpulse.so. Пайпваря подменяет этот сокет на свой собственный и имитирует API пульсы. Таким образом пульсаудио приложения могут гнать звук в пайпварю, не замечая подмены.

archie
()

Альса есть всегда. Всё остальное (PA, Jack, PW) — дополнения, или надстройки, чтобы сделать работу со звуком более удобной.

Не все приложения могут работать с Альсой напрямую, какие-то требуют, например, чтобы была PulseAudio. А с Джеком в основном работают программы для профессиональной обработки звука. Хотя есть программы, которые могут работать и с любой звуковой системой, но таких единицы.

Чтобы быстро разобраться в звуке в линуксе, достаточно понастраивать каждую систему вручную, почитать к ним документацию, посмотреть какие вообще у них есть возможности. Самой сложной, вероятно, тут окажется Альса, так как человеческой документации к её конфигам почти не существует. Но лучше, наверное, будет начать именно с неё, чтобы понять где искать аудиоустройства и как обращаться к ним напрямую или через какие-то Alsa-плагины и чтобы познакомиться с набором полезных утилит для Альсы и файлов из /proc/asound, которые обязательно пригодятся в будущем.

anonymous
()

Правильно ли я понимаю

Не совсем. Звуковые серверы умеют также эмулировать прямые вызовы к ядерному драйверу, подменяя библиотеки, а сами напрямую общаются с alsa или oss в ядре. При этом у oss4 более развесистая и удобная функциональность (в ядре), позволяющая комфортно жить без звуковых серверов, но поезд ушёл, да и функциональность серверов во многом больше.

Shadow ★★★★★
()
Ответ на: комментарий от archie

Почему это. Пайпваря как раз имеет свое API и свою клиентскую библиотеку libpipewire.so.

Да вот, находил такую схемочку: Общая схема.

Вот, вроде бы она наиболее адекватная. На ней в блоке Pipewire указаны только API джека и пульсы, но не Pipewire API. Поэтому я и подумал, что его нет.

Структурно всё понятно. Стрелочки немного напрягают. Красная, как я понял, это проги, работающие напрямую через Алсу. Зелёная – это Pulseaudio? Синяя вообще какая-то двойная…

Don_Antonio
() автор топика

И я так понимаю, связка ALSA+Pipewire сейчас в большинстве стабильных дистрибутивов стоит умолчально.

Ещё такой вопрос: какой командой лучше всего, т. е. информативнее, смотреть текущую конфигурацию звук. системы? alsa-info вроде как? А если OSS стоит?

Don_Antonio
() автор топика
Ответ на: комментарий от Don_Antonio

Если ты разрабатываешь софт, учти экзотические ситуации: pulse/pipewire без alsa/oss, с передачей звука по сети на другой хост. Такое применяется в gnu/hurd, но теоретически может быть и в линуксе.

Khnazile ★★★★★
()
Ответ на: комментарий от Don_Antonio

Стрелочки немного напрягают. Красная, как я понял, это проги, работающие напрямую через Алсу. Зелёная – это Pulseaudio? Синяя вообще какая-то двойная…

Красная (APP1) - это альса приложение, работающее через голую альсу без плагинов.

Зеленая (APP2) - это альса приложение, использующее плагины plug и dmix.

Синяя (APP3) - это альса приложение, выводящее звук через пульсу. Двойная стрелочка видимо означает, что приложение APP4 записывает звук от приложения APP3. Например APP4 может быть приложением для стриминга типа OBS Studio.

archie
()
Ответ на: комментарий от Don_Antonio

В основе всегда ALSA (ну, либо OSS)

Не всегда. Если ты используешь блютус наушники, то в основе будет BlueZ, а не альса. Если ты гоняешь звук по сети через какой-нибудь RTP, то в основе тоже никакой альсы не будет.

Альсу можно рассматривать как низкоуровневый API для работы с локальными звуковыми картами с удобствами уровня «дачный сортир». Все остальное - это уже задача высокоуровневых звуковых серверов. Из альсы можно попытаться соорудить некое ущербное подобие звукового сервера, обмазавшись всякими костылями типа dmix и bluealsa. Но зачем это делать, когда есть настоящие полноценные звуковые сервера.

archie
()