LINUX.ORG.RU

Реакция на подключение/отключение наушников


0

1

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

Итак, как в Linux можно как-либо программно реагировать на подключение и отключение штекеров в разъёмы звуковой карты (наушники, микрофон)? В офтопике при этих действиях появляются уведомление типа «Разъём был подключен», значит карточка ОС уведомляет обо всём. Мне бы возможность выполнить произвольную команду при соответствующих событиях. Желательно в контексте текущей графической сессии (например, хочу сделать остановку воспроизведения при отключении наушников).

$ lspci | grep Audio
00:1b.0 Audio device: Intel Corporation 6 Series/C200 Series Chipset Family High Definition Audio Controller (rev 04)

И да, юзается PulseAudio.

★★★★★

Последнее исправление: KivApple (всего исправлений: 1)
$ acpi_listen 
jack/headphone HEADPHONE plug
jack/headphone HEADPHONE unplug
jack/microphone MICROPHONE plug
jack/microphone MICROPHONE unplug
Deleted
()
Ответ на: комментарий от Deleted

Да, эта команда работает. А как повесить выполнение каких-либо действий на соответствующий события?

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

Итак, как выполнять произвольную команду разобрался. Теперь остаётся дополнительный вопрос - как остановить плеер? Моя команда из handler.sh выполняется от root и вне контекста Х-сессии юзера. Плеер имеет соответствующие интерфейсы, потому что Gnome его может нормально контролировать штатными средствами (например, работают задаваемые в Gnome комбинации клавиш для плееров).

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

возможно плеером можно рулить через dbus и пускать команду от определённого пользователя через su

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

Моя команда из handler.sh выполняется от root и вне контекста Х-сессии юзера.

echo 'xhost local:' >> ~/.xinitrc

Для команд (notify-send, к примеру) использую так:

DISPLAY=:0 su имя_пользователя -c 'команда'

как остановить плеер?

Прикручивай команду, если нет, то xvkbd или что-нибудь подобное может тебе подойти.

Deleted
()
Ответ на: комментарий от KivApple

Теперь остаётся дополнительный вопрос - как остановить плеер?

Когда ещё в acpid не было этой функциональности, я написал эту программу:

Вышел Music Pause Daemon

Если это всё аккуратно и правильно скомпилировать, установить и запустить, то при вынимании наушников будет уведомление, а плеер музыки будет останавливаться. Но теперь, когда acpid способен заменить мой jacklistener, лучше прикрутить какой-нибудь костыль к acpid, слушающий его сокет и выполняющий методы через dbus-send.

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

Вот, например, можно сделать так:

acpi_listen | while read _line; do
    if [ "$_line" = 'jack/headphone HEADPHONE unplug' ]; then
        notify-send 'Headphones unplugged'
        dbus-send --session --print-reply --dest=org.mpris.MediaPlayer2.rhythmbox /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause
    fi
done
gentoo_root ★★★★★
()
Ответ на: комментарий от Deleted

Получилось вот такое:

su kiv -c 'DISPLAY=:0 dbus-send --session --print-reply --dest=org.mpris.MediaPlayer2.audacious /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.P

Оно работает, одно кажется немного костыльно:

1) Завязано на конкретное имя пользователя (в принципе, с этим можно смирится, всё равно за этой машиной никто кроме меня не работает).

2) Завязано на конкретный плеер

3) Завязано на конкретный номер дисплея (а вдруг я более одной копии иксов запущу и плеер не на 0-ой?)

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

Было бы не плохо устраивать по D-Bus в рамках сессии рассылку сообщения «Всем плеерам остановиться».

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

1) Завязано на конкретное имя пользователя (в принципе, с этим можно смирится, всё равно за этой машиной никто кроме меня не работает).

3) Завязано на конкретный номер дисплея (а вдруг я более одной копии иксов запущу и плеер не на 0-ой?)

Этих проблем нет, если запустить скрипт постом выше от нужного пользователя в автозагрузке X-сессии.

2) Завязано на конкретный плеер

А зачем пользоваться несколькими разными?

// Подозреваю, что ты игнорируешь меня, поэтому на всякий случай кастану: KivApple.

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

Я никого не игнорирую :-)

Сорри, показалось так из-за отсутствия реакции на моё сообщение, поэтому решил перестраховаться.

Вот модифицированный скрипт, который также решает проблему №2:

acpi_listen | while read _line; do
    if [ "$_line" = 'jack/headphone HEADPHONE unplug' ]; then
        notify-send 'Headphones unplugged'
        for _dest in `dbus-send --session --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames | sed -n 's/^.*"org\.mpris\.MediaPlayer2\.\(.*\)"/\1/p'`; do 
            dbus-send --session --print-reply --dest="org.mpris.MediaPlayer2.$_dest" /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause
        done
    fi
done

Если запускать это от пользователя, то будут останавливаться все плееры музыки, поддерживающие MPRIS, и отобразиться уведомление.

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

Просто идея со скриптом с циклом мне не нравится - зачем повторять работу acpid.

А этот скрипт и не повторяет работу acpid. Команда acpi_listen только читает данные из сокета acpid, поэтому велосипедов тут нет (велосипеды я предлагал в своём первом посте).

gentoo_root

отобразиться уведомление.

Быстрофикс: отобразится, конечно, без мягкого знака.

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

man rhythmbox-client

man в_линуксе_есть_плееры_кроме_rhythmbox

man mpris

gentoo_root ★★★★★
()

Не знаю, виновато ли это изменение или нет, но сейчас набюдаются некоторые глюки со звуком. Если, например, вытащить. наушники, а затем опять воткнуть (сразу же или спустя некоторое время), то пропадаёт звук. Ничего не слышно, пока не убавишь громкость до нуля, а потом не прибавишь назад до нужной.

А на 4-ый день аптайма (уводил ноут в сон вместо выключения) начал пропадать звук вообще. Запускаю воспроизведение в плеере. Секунды 4-5 звук есть, потом пропадаёт. Поизменяешь громкость - опять появляется на несколько секунд. При этом плеер не останавливается и по его виду всё нормально и непрерывно воспроизводится. Не важно воткнуты наушники или нет. Помогла только перезагрузка.

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