Фон
У мене була подібна проблема під час призупинення / відновлення, коли звук переходив з HDMI TV на колонки ноутбука. Після відновлення звук залишатиметься на динаміках ноутбука, і мені доведеться вручну скинути вихідний пристрій на телевізор у 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-монітор / телевізор та звукові комутатори належним чином.
Caveat
У моїй системі звук автоматично повертається до динаміків ноутбука, коли відключається 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
щоб побачити, чи є у вас картки більше числа 0. Якщо так, вам потрібно буде використовувати відповідний номер картки у своїх сценаріях. Наприклад:
$ 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 року
З незрозумілої причини сценарій сьогодні був порушений. Наведений вище код використовується наступним чином: «$ (кіт / SYS / клас / ЦУП / card0-HDMI-A-1 / статус» , але мені довелося змінити , card0
щоб card1
і код вище був переглянутий як такої , я не можу пояснити , що змінилося. в моїй системі, крім звичайних оновлень Ubuntu, починаючи з 26 листопада 2016 року.
Редагувати 14 грудня 2016 року
Вищевказаний код потрібно було знову переключити на: "$ (cat / sys / class / drm / card0-HDMI-A-1 / status". Замість перегляду коду між card0
та card1
залежно від завантаження, перегляньте програму для посилання, card*
щоб захопити обидва сценарії). .