Фон
У меня была похожая проблема во время приостановки / возобновления, когда звук переключался с телевизора HDMI на динамики ноутбука. После возобновления звучание будет оставаться на динамиках ноутбука, и мне придется вручную сбросить устройство вывода на ТВ в System Settings
-> Sound
.
Это был мой первый раздражающий опыт обновления с Ubuntu 14.04 до 16.04, и рут был обновлением до PulseAudio 8, который поставляется с 16.04 LTS
После долгих поисков я создал скрипт под названием TV-sound
. Хотя я не подключаю и не отключаю телевизор, как вы, я провел несколько поисков в Google и создал вариант сценария для работы в вашей ситуации. Я проверил это, и это работает.
Шаг 1: Создать скрипт для переключения аудио между подключенными устройствами
Мы создадим скрипт, hotplugtv
который называется udev. Этот же скрипт может быть вызван во многих местах. Например, во время тестирования я использовал его lock-screen-timer
там, где звук возвращался к ноутбуку во время блокировки экрана.
cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv
Когда редактор откроется с пустым экраном, скопируйте и вставьте в него следующее:
#! /bin/bash
# NAME: hotplugtv
# PATH: /usr/local/bin
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: called from /etc/udev/rules.d/99-monitor-hotplug.rules
# DATE: Created Nov 26, 2016.
# NOTE: logs output using log-file
# UPDT: Dec 14, 2016 - Sometimes /sys/class/drm/card0 & sometimes /sys/class/drm/card1
# so use /sys/class/dmcard* instead.
if [[ $(cat /sys/class/drm/card*-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
# log-file "HDMI TV connected" ~/bin/log-hotplugtv;
/bin/sleep 2;
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
else
# log-file "HDMI TV disconnected" ~/bin/log-hotplugtv;
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
fi
exit 0
Вам нужно будет заменить два вхождения rick
своим собственным идентификатором пользователя, т. Е. И т. UTF-8
Д.
Я знаю, что это может быть более профессионально с именем пользователя, автоматически устанавливающим переменную bash, но я еще не настолько опытен :( В любом случае, сохраните файл и выйдите gedit
.
Шаг 2: Создание правил udev
udev отслеживает события горячего подключения, когда вы подключаете и отключаете монитор HDMI. Введите следующее, чтобы создать новое правило.
cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules
ПРИМЕЧАНИЕ. Если файл 70-persistent-net.rules
не существует в вашем каталоге, скопируйте туда любой другой файл. Нам не нужно содержимое файла, только права доступа к файлу, чтобы гарантировать, что наши совпадают.
Редактор покажет кучу неактуального текста, выделит и удалит его. Затем выделите приведенный ниже код и вставьте его в редактор:
# NAME: 99-hotplugtv.rules
# PATH: /etc/udev/rules.d
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: automatically called on system events
# DATE: Created Nov 26, 2016.
# NOTE: in future may requre systemd service hooks
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/local/bin/hotplugtv"
Сохраните файл и выйдите.
Чтобы включить правило (без перезагрузки), нам нужно перезагрузить udev:
sudo udevadm control --reload-rules
Теперь вы можете подключать и отключать монитор HDMI / телевизор, и звук переключается соответствующим образом.
Предостережение
В моей системе звук автоматически возвращается к динамикам ноутбука, когда HDMI отключен. На вашей системе это не так. Дальнейшие улучшения кода могут потребоваться, если звук не поступает на динамики ноутбука, когда HDMI отключен. Пожалуйста, ответьте через комментарий ниже, как все работает / не работает.
Быстрое тестирование в CLI
Вы можете быстро проверить код в терминале, используя:
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
Переключиться на HDMI / TV:
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
Вернитесь к встроенным динамикам:
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
Не забудьте заменить rick
на ваше имя пользователя.
- Начальная
export
строка, вероятно, не нужна, но я включил ее просто для безопасности.
- Если у вас несколько звуковых карт, или что-то другое, кроме
hdmi-stereo
твиков, очевидно, необходимо выяснить правильные параметры перед написанием вашего скрипта.
Расшифровка имени вашего устройства в PulseAudio
Код ниже использует одну и ту же команду дважды. Один раз, когда звук установлен на внешний HDMI ТВ. Второй раз, когда звук установлен на встроенные динамики ноутбука. Каждый раз, когда вы видите имя, которое использует PulseAudio:
$ pacmd list-sinks | grep -e 'name:' -e 'index'
* index: 28
name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>
───────────────────────────────────────────────────────────────────────────────
$ pacmd list-sinks | grep -e 'name:' -e 'index'
* index: 30
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
Когда у вас есть несколько звуковых карт
Используйте команду, aplay -l
чтобы увидеть, есть ли у вас карты больше нуля. Если это так, вам нужно будет использовать соответствующий номер карты в ваших сценариях. Например:
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: 92HD91BXX Analog [92HD91BXX Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
Subdevices: 0/1
Subdevice #0: subdevice #0
В приведенном выше примере все номера карт равны 0 с разными источниками вывода. Если у вас есть USB-динамики, они могут иметь номер карты, отличный от 0.
Редактировать 2 декабря 2016 г.
По неизвестной причине сценарий был сломан сегодня. Приведенный выше код гласил: «$ (cat / sys / class / drm / card0-HDMI-A-1 / status»), но мне пришлось изменить card0
его, card1
и приведенный выше код был изменен как таковой. Я не могу объяснить, что изменилось в моей системе, кроме регулярных обновлений Ubuntu с 26 ноября 2016 года.
Редактировать 14 декабря 2016 г.
Приведенный выше код необходимо снова переключить обратно на: «$ (cat / sys / class / drm / card0-HDMI-A-1 / status»). Вместо того, чтобы изменять код между загрузкой card0
и в card1
зависимости от нее, измените программу на ссылку, card*
чтобы захватить оба сценария. ,