LINUX.ORG.RU

Что такое PulseAudio? Как оно работает?

 , , , ,


1

1

Имеется следующая цитата:

PulseAudio - звуковой сервер в виде демона, запускаемый, что интересно, от имени обычного пользователя. Создает слой абстракции звуковых потоков для возможности различной коммутации, принимает по собственному API звуковой поток от приложений и воспроизводит его через ALSA. Так же PulseAudio создает для ALSA специальный порт, через которые может получать данные, отправляемые приложениями в сам ALSA, и такое поведение настраивается по-дефолту при установке PulseAudio. Считается надстройкой над ALSA, так как без ALSA его использование бессмысленно (будет работать только комутация, а звука не будет).


Имеются ли в ней грубые фактические ошибки, вводящие читателя в заблуждение? Сам пользуюсь PulseAudio, и конфигурю его по необходимости «чтоб работало», но понимание внутреннего устройства ограничено общими фразами из околозвуковых статей.

★★★★★

Грубых фактических ошибок нет, во внутреннее устройство вникать уже нет смысла, ибо «легаси». Вникать нужно в pipewire\wireplumber, так как даже в твоём по видимому слоупочном дистрибутиве это всё заменит pulseaudio в очередном релизе.

Добавлю что вникание в pulseaudio ничем не поможет в постижении pipewire, так как там другой подход и другие настройки, несмотря на совместимость на уровне API (pipewire прозрачно имитирует демон pulseaudio для ничего не знающих про pipewire приложений).

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

Я и сказал «в реализации». Как то это называть надо же, в любом случае делает оно тоже самое что и пульса, и запускает пульсовые плагины, считай пульса просто другая реализация, а что там под API капотом пофик, ставится этот «эмулятор» пульсы отдельно так что считай аддон к трубе, ой да ну путаться, пульса в виде апульса, пульса в виде пульсы, пульса в виде пареваря-пульса, пульса, пульса, пульса, пшшшшшшшшшшшшш =)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Далеко не все плагины оно запускает, и это вообще не «другая реализация пульсы». Это именно что костыль, для тех плагинов функционал которых нативно пока что не реализован.

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

Далеко не все плагины оно запускает

Ага, самые простые и то парочку. Но благо они то мне и нужны

и это вообще не «другая реализация пульсы». Это именно что костыль, для тех плагинов функционал которых нативно пока что не реализован.

Ну да и ладно. Никогда не вникал в пульсу и её работу и правильно, оно просто исчезло и так же не вижу никакого смысла вникать в папеварю, тоже подохнет,а пока просто работает и ладно,взбесит удолим =), а альса прибита гвоздями к ядру слава те хоспади.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Ну как бы пайпварь с вайрплумбером ещё и видеопотоки коммутирует. И собсно фишка пульсы\пайпвари и прочих «надстроек» вовсе не в том чтобы продвинуто заменить алсовый dmix. Суть в динамической коммутации потоков, вводов\выводов и устройств. Ключевое слово «динамическая конфигурация», на лету, без перезапуска софта. Алса динамически может только в рамках одного звукового устройства его входами\выходами управлять, а в компутерах их нынче стало намного больше чем одно. Тут и HDMI выходы на видеокартах, и блютус, и всякие USB гарнитуры, собсно pulse\pipe нужны для того чтобы всем этим рулить динамически, и, по возможности, автоматически.

Jameson ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Просто я хочу понять вот такую вещь. Есть два утверждения:

Так же PulseAudio создает для ALSA специальный порт, через которые может получать данные, отправляемые приложениями в сам ALSA, и такое поведение настраивается по-дефолту при установке PulseAudio.

принимает по собственному API звуковой поток от приложений и воспроизводит его через ALSA.

Получается, что если в системе установлено и настроено PulseAudio, то поток данных от приложения, использующего ALSA, сначала попадает в ALSA, но сразу не воспроизводится, а передается в PulseAudio. Потом PulseAudio снова передает поток в ту часть ALSA, которая занимается воспроизведение звука.

То есть, если в системе есть PulseAudio, то поток так и будет идти по цепочке Приложение - ALSA - PulseAudio - снова ALSA для непросредственного воспроизведения. Правильно я понимаю?

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

Ой тут надо смотреть реализацию и нюансы уточнять. Но

то поток данных от приложения, использующего ALSA

Не, в пульсу должно идти, и она там звуки смешивает в один поток, который кушает ALSA и воспроизводит.

Приложуха -> API звука -> пульса перехватывает и обрабатывает (смешивает, заглушает , прочее) -> альса кушает -> модуль ядра взбадривается -> железо ляляляя по полям по полям синий трактор едет к нам…

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от Xintrea

То есть, если в системе есть PulseAudio, то поток так и будет идти по цепочке Приложение - ALSA - PulseAudio - снова ALSA для непросредственного воспроизведения. Правильно я понимаю?

Если приложение использует API ALSA, то да. Если приложение использует нативное API PulseAudio (libpulse), то первый шаг исчезает.

Важно понимать, что не каждый шаг здесь подразумевает копирование (передачу) данных. Это просто абстракции.

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

Нет, неправильно. Приложение пытающееся напрямую обратиться к alsa перехватывается (с помощью перехватывающего плугина alsa, входы которого обозначены как default control, не забываем что alsa тоже имеет и умеет в plugins) и направляется в pulseaudio\pipewire. И дальше уже по стандартному сценарию микшируется внутри. Причём есть проблема, если старое приложение не обращает внимание на default (то бишь игнорирует юзерспейсную часть alsa и плугины), а лезет напрямую к железу через файлы в /dev — оно обломается, так как файлы устройства в /dev захвачены pulseaudio\pipewire. Или монопольно захватит устройство и обрушит демон, если демон настроен «засыпать» и освобождать файлы устройства.

Jameson ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Приложуха -> API звука -> пульса перехватывает и обрабатывает

1. что подразумевается под API звука для приложения, которое написано под ALSA и не знает что такое PulseAudio? У PulseAudio нет эмуляции ALSA. Значит, приложение гонит свой поток в ALSA по API ALSA.

2. Каким волшебным образом PulseAudio перехватывает поток?

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

Там не в смешении аудиопотоков суть, это действительно с древних времён умел алсовский плугин dmix, а скорее в их динамической коммутации. Я могу наврать, глубоко не вникал, но поздние реализации pulseaudio, как и pipewire, научились использовать те же механизмы что и dmix в alsa, что позволило избавиться от принудительного ресемплинга всего и вся.

Jameson ★★★★★
()

Всё верно. Но слишком много слов. Можно короче «ненужная прослойка между alsa и приложениями которая по большей части дублирует то, что есть и без неё».

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

У PulseAudio нет эмуляции ALSA

У пульсаудио есть специальный плугин для алса, который выступает в качестве перехватчика и перенаправляет звуковой поток в пульсу. Этот плугин притворяется умолчальным устройством алса для приложений умеющих только в alsa. Впрочем он вполне может быть отдельным пакетом, и быть не установлен в каком либо дистрибутиве. Или удалён, по незнанию\ненадобности.

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

Приложение пытающееся напрямую обратиться к alsa перехватывается (с помощью перехватывающего плугина alsa

То есть, при наличии PulseAudio, ALSA настраивается так, что входным кодом становится «Перехватывающий ALSA-плагин», то есть какой-то плагин, входящий в поставку ALSA, способный получить данные и перекинуть их в PulseAudio? Как этот плагин называется? Он универсальный, или писался специально для работы с PulseAudio? Или это плагин из поставки PulseAudio?

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

Это плугин из pulseaudio, для alsa, но может быть оформлен отдельным пакетом. А может и не быть. В генто он часть media-plugins/alsa-plugins и включается юзом «pulseaudio».

Jameson ★★★★★
()
Последнее исправление: Jameson (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Да, всё так. Ну и надо учитывать, что ALSA это не только модуль ядра, но и libasound2.so. Перехват в пульсу идёт из библиотеки, а проигрыванием звука занимается ядерный модуль.

Приложение -> libasound -> pulseaudio -> libasound -> kernel alsa

Первые два этапа это процесс приложения, третий и четвёртый - процесс pulseaudio демона, пятый - ядро.

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

Ну типа да смешивает, ну и всё, если надо больше действий то уже нужна прослойка. Если в кратце для обработки потоков байт на лету до того как они попадут на воспроизведение, перехватить их и сохранить, смешать их, эквалайзером обработать, одно приглушить другое усилить, перенаправить и так далее включая смену формата. У меня вот звук в ПК подох, так что прослойка его перехватывает и шлёт по сети, а приложенька на телефоне его принимает и глаголит мне в ухи через головные телефоны =) Вот например для таких случаев, хотя можно arecord + nc по сути взять и тоже звук в сеть слать, но мне ещё дискретизацию надо с 44100 до 22050 опустить попутно, а тут уже в эту связку придётся вставить нечто или даже писать это нечто самому.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от firkax

Приложение -> libasound -> pulseaudio -> libasound -> kernel alsa

Тут, видимо не хватает еще одного сегмента?

Приложение -> libasound -> «Перехватывающий ALSA-плагин» -> pulseaudio -> libasound -> kernel alsa

?

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

Кстати да, отказ от OSS в пользу ALSA был первым плевком в мою нежную юношескую душу. Она трепетала глядя на лиспообразные конфиги и практически полное отсутствие документации. До сих пор интересно что творилось в головах разумных кальмаров которые это придумали. IMHO тотальное неумение настраивать ALSA за пределами нескольких HOWTO до сих пор проистекает из нечеловеческого формата их конфигов и невнятной документации. Да, я знаю что отказ от OSS вызван наступившим у разрабов ОSS приступом жадности, но в настройке OSS был значительно проще и логичнее. Потом я так же бомбил после отказа от EVMS в пользу LVM2.

Jameson ★★★★★
()
Последнее исправление: Jameson (всего исправлений: 1)
Ответ на: комментарий от Xintrea

libasound -> «Перехватывающий ALSA-плагин»

Это на одном уровне действует, собсно механизм плугинов как раз и реализуется в рамках libasound. Однако приложение вольно игнорировать libasound и напрямую ломиться в железо, обычно в настройках можно выбрать что то типа hw:0 или default. И вот hw:0 это стук «в железо» минуя всякие libasound и плугины.

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

Нет, этот самый «hw:0» передаётся аргументом во всё тот же libasound. А плагины уже минуются, да. Работать напрямую с устройствами из /dev с помощью их открывания и выполнения всяческих ioctl, конечно, возможно, но так никто не делает и это крайне не рекомендуется - по факту ты просто заново реализуешь половину libasound, только потеряешь совместимость с какими-то будущими версиями alsa у которых окажется другой ядерный интерфейс (который никто не обещал стабильным, официальное апи именно libasound).

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

Ну, раньше встречалось всякое древнее что монопольно захватывало файлы устройств. К счастью это всё вымерло. А так да, я неправ, выбирая входы мы по прежнему выбираем через либасаунд, можно как напрямую к железке обращаться, через hw:0, так и к любому сконфигурированному плугину, например dmix. default в конфиге алсы показывает приложению какой из плугинов предпочтителен. В конфигурации с pulseaudio default обычно настроен на перехватывающий алса-плагин. При наличии пульсы\пипвари алса-приложение конечно же не должно использовать hw:0 напрямую.

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

Кушаю, не обляпываюсь, нраицца, вспоминаю пшшшаудио как страшный сон.

Главный принцип – лучшее враг хорошего. Пока пульса работает без нареканий, то и смысла ее заменять нет. Ну а если «пшшшш», то конечно. Не у всех же все одинаково.

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

Ну, раньше встречалось всякое древнее что монопольно захватывало файлы устройств.

libasound и захватывает, если hw:0 ему указать

При наличии пульсы\пипвари алса-приложение конечно же не должно использовать hw:0 напрямую.

Пульса тут ни при чём. Если приложение использует hw:0 значит оно забирает звук у всех остальных, а пульса там или не пульса - уже не влияет.

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

А я вот не пойму, если ALSA-приложение хочет работать без PulseAudio оверхеда, а напрямую с ALSA API, то пока включено PulseAudio и его «Перехватывающий ALSA-плагин», сделать этого невозможно?

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

То есть, при наличии PulseAudio, ALSA настраивается так, что входным кодом становится «Перехватывающий ALSA-плагин», то есть какой-то плагин, входящий в поставку ALSA, способный получить данные и перекинуть их в PulseAudio?

Да:

$ pacman -Ql pulseaudio-alsa 
pulseaudio-alsa /etc/
pulseaudio-alsa /etc/alsa/
pulseaudio-alsa /etc/alsa/conf.d/
pulseaudio-alsa /etc/alsa/conf.d/99-pulseaudio-default.conf

$ cat /etc/alsa/conf.d/99-pulseaudio-default.conf 
# Default to PulseAudio

pcm.!default {
    type pulse
    fallback "sysdefault"
    hint {
        show on
        description "Default ALSA Output (currently PulseAudio Sound Server)"
    }
}

ctl.!default {
    type pulse
    fallback "sysdefault"
}

Как этот плагин называется? Он универсальный, или писался специально для работы с PulseAudio? Или это плагин из поставки PulseAudio?

pulse, нет, да, нет:

$ pacman -Ql alsa-plugins | grep pulse
alsa-plugins /etc/alsa/conf.d/50-pulseaudio.conf
alsa-plugins /usr/lib/alsa-lib/libasound_module_conf_pulse.so
alsa-plugins /usr/lib/alsa-lib/libasound_module_ctl_pulse.so
alsa-plugins /usr/lib/alsa-lib/libasound_module_pcm_pulse.so
alsa-plugins /usr/share/alsa/alsa.conf.d/50-pulseaudio.conf
alsa-plugins /usr/share/alsa/alsa.conf.d/99-pulseaudio-default.conf
alsa-plugins /usr/share/doc/alsa-plugins/README-pulse
intelfx ★★★★★
()
Ответ на: комментарий от Xintrea

Да, невозможно в стандартной конфигурации. Можно настроить так чтобы pulseaudio работало с alsa через плугин dmix, тогда alsa приложение тоже должно быть настроено на работу через dmix, но это нестандартная конфигурация не имеющая смысла, потому что dmix — это микшер, и pulseaudio тоже микшер. Смысла в том чтобы пускать микшер через микшер нет. Почему бы алса приложению не использовать pulseaudio (даже не подозревая о его наличии) и сущности не умножать? Оверхеда кстати там практически нет, точнее во всей этой херне и так дофига оверхеда. Если волнует оверхед и нужны предсказуемые задержки нужно смотреть в сторону jack (btw pipewire сделало его ненужным, так как в pipewire ситуация с оверхедом и задержками значительно лучше чем в pulseaudio, так что pipewire потихоньку заменяет jack и умеет его имитировать для желающих jack программ).

Дело в такой штуке которая называется «монопольный захват физического устройства». В стандартной конфигурации монопольно захватывает устройство pulseaudio, именно поэтому алса приложение играет через заворачивающий плугин. Если алса приложение само монопольно захватит устройство — отвалится пульсаудио и всё что его использует. Алса плугин dmix позволяет нескольким приложениям одновременно работать через себя и микширует их потоки, но по сути в данном случае монопольный захват осуществляет dmix.

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

Оно может не только через Альсу воспроизводить, он и через OSS и возможно ещё что то. Ещё заявлялась способность транслировать звук по сети.

kirill_rrr ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

В BSD-системах если не ошибаюсь OSS, над которым надстраивают пульс или пайп. А где то сбоку есть Джак. А ещё совместимость с андроидовым, виндовым и маковским звуком.

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

Получается, что если в системе установлено и настроено PulseAudio, то поток данных от приложения, использующего ALSA, сначала попадает в ALSA, но сразу не воспроизводится, а передается в PulseAudio.

Нет. Альса умеет монопольный захват устройства приложением или слияние потоков через dmix (встроеный) (могу ошибаться в терминах). А приложение может подключиться либо к пульсу/пайпу через их api, или к альсе. У пульса/пайпа разумеется сразу идёт микширование потоков, никакой однозадачности. В заисимости от настроек, если к альсе в монопольном режиме подключен пульс, но приложение стучится к альсе то звука не будет и это дефолтный сценарий. Вероятно есть настройки при которых пульс подключается к альсе через dmix, и тогда альса-приложения тоже смогут выводить звук сразу в альсу.

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

Где именно? В условной убунту 16.04 ЛТС, которая вроде бы является актуальной? Или в дебиан-сид, который является альфа-глюкодромом? А openarena через неё играет? А что в стимоси? А xfce умеет управлять звуком через пайп? А файерфокс? А mplayer с какой версии?

kirill_rrr ★★★★★
()