LINUX.ORG.RU

Как добиться от pulseaudio вменяемого поведения?

 хватит это терпеть


1

1

Я использую пульсаудио ради одной-единственной фичи: переключение между аудиодевайсами на лету. Всё, что мне нужно, это чтобы при подключении внешнего USB-ЦАПа он становился выходом по умолчанию, все имеющиеся потоки перекидывались на него, и все новые отправлялись туда же. Да, именно как в богомерзкой винде. Казалось бы, что может быть проще? Но не тут-то было... Несмотря на то, что у меня включен module-default-device-restore, который, вроде бы, за это отвечает, работает он в зависимости от фазы луны. Иногда подключенный ЦАП устанавливается по умолчанию, но все потоки, кроме перекинутых вручную, открываются не на нём, а иногда они, таки, открываются на нём, но он при этом не становится дефолтным. А иногда и вовсе ничего не происходит, закономерность выявить я не смог. Такое ощущение, что он пытается запоминать, что где было, но ему мешает запущенная стадия болезни Альцгеймера.
Этот бардак меня уже порядком достал, как и необходимость каждый раз вручную всё переключать. Как, в конце концов, вразумить этого слабоумного инвалида детства?

★★★★★

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

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

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

vim pulseaudio.c

anonymous
()
Ответ на: комментарий от Axon

У меня такое на ноуте с Wi-Fi бывает. Для линукса он не подходит, так что жую кактус.

Chehelo
()

Можно напедалить скрипт для udev+systemd/pacmd, и за одно телегу-багрепорт. Я пока-что подруливаю выходы скриптом

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

Я раньше на альсе обходился правилом для udev, запускающим скрипт, правящий .asoundrc. А можно пример вашего скрипта? А то я пульсой из консоли рулить не умею.

Axon ★★★★★
() автор топика

<многа букв не читай сразу отвечай> удалить Pulseaudio...

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

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

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

удалить Pulseaudio...

И каждый раз при подключении внешнего ЦАПа перезапускать всё, что может выводить звук? No, thanks.

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

У меня с пульсом немного не такая задача, мне нужен верный синк в зависимости от места пребывания ноута. Различие в том, что в случае с усб устройством достаточно напедалить правило в udev c нужным ENV{SYSTEMD_WANTS}, а в моем я пускаю это диспатчером.

В остальном:

 > cat ~/.config/systemd/user/pulse-default-sink@.service 
[Unit]
Description=Setup default sink for %i
After=pulseaudio.service
Requisite=pulseaudio.service

[Service]
EnvironmentFile=%h/.config/dock/%i
Type=oneshot
ExecStart=/usr/bin/pacmd set-default-sink $SINK
ExecStop=/usr/bin/pacmd set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
RemainAfterExit=yes

> grep SINK ~/.config/dock/home 
SINK=tunnel.AliSo.local.ch20
> grep SINK ~/.config/dock/work 
SINK=tunnel.Pain.local.alsa_output.0.analog-stere

итп

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

Правда в моем случае нет миграции уже запущенных приложений, надо посмотреть как это разрулить скриптом

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

Во. Перекидывает всех клиентов на дефолтный синк. Вроде работает

default_sink_id=$(pacmd list-sinks | awk -v FS=: '/\* index:/{print $2}')
for client in $(pacmd list-sink-inputs | awk -v FS=: '/index: /{print $2}'); do pacmd move-sink-input $client  $default_sink_id; done
vasily_pupkin ★★★★★
()
Ответ на: комментарий от vasily_pupkin

Спасибо, буду копать в сторону pacmd. Systemd на целевой машине нет и, надеюсь, не предвидится, так что буду думать над правилом udev. Тем более, что само правило у меня уже есть, надо только скрипт новый написать.

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

Не отключай внешний цап :3

Тут есть одна проблема. На самом деле, это портативный усилок, который в основном используется с плеером. ☺

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

Спасибо огромное! Ушёл писать костыль...

Axon ★★★★★
() автор топика

Я тоже умею делать костыли

У меня была проблема в том, что при втыкании usb-гарнитуры pulseaudio не делал гарнитуру устройством по умолчанию, и кнопки регулировки звука на самой гарнитуре продолжали регулировать встроенную звукокарточку ноутбука. Данный тред сподвиг меня на написание костыля:

Для начала делаем правило udev, например /etc/udev/rules.d/99-usb-headset.rules idVendor и IDproduct узнаются, например, через lsusb

KERNEL=="*", SUBSYSTEM=="usb", ATTRS{idVendor}=="047f", ATTRS{idProduct}=="c007", ACTION=="add", RUN+="/usr/local/bin/headset.sh &"

& в конце зачем-то нужно udev, зачем — не понял до конца. Содержание headset.sh:

#!/bin/bash
su erik -c /home/erik/bin/pulse_headset.sh
exit 0

Подобное извращение нужно, чтобы запустить pacmd от имени пользователя, при меньшем количестве шагов почему-то не получается, ну и пёс с ним. Содержимое pulse_headset.sh:

#!/bin/bash
/usr/bin/pacmd set-default-sink alsa_output.usb-Plantronics_Plantronics_.Audio_476_DSP-00-DSP.analog-stereo
exit 0

Наименование устройства проставить по вкусу. Костыль конкретнейший, потому что работает с одним-единственным устройством, но для сельской местности сойдёт. Обратно переключается само (при использовании veromixer).

Erik_der_Zweite
()
Ответ на: комментарий от Axon

Да, включён. Но без скриптов при втыкании гарнитуры клавиши регулировки громкости всё равно меняют уровни громкости встроенной звукокарточки.

В pulse-headset пришлось добавить sleep 5.

Erik_der_Zweite
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.