Автоматично перемикайте між внутрішніми та динаміками HDMI


18

Ви знаєте, як підключаючи навушники до аук-роз'єму ноутбука, внутрішні колонки автоматично вимикаються, а звук виходить із навушників? Я хочу саме це для HDMI.

Я підключаю монітор із вбудованими динаміками до свого ноутбука, щоб іноді переглядати відео. Це дуже дивно, коли відео знаходиться на моніторі (який розміщений в 3 м від мого столу), але звук виходить із внутрішніх динаміків мого ноутбука (ноутбук сидить на столі).

Звичайно, я можу просто перейти до налаштувань звуку та переключити вихідний канал на HDMI. Але потім, пізніше, коли я зняв кабель HDMI години тому і, можливо, навіть був у зовсім іншому місці, звук не відтворюватиметься, оскільки звуковий сервер все ще намагається відтворити його через HDMI, але до нього нічого не пов'язано .

Автоматичне перемикання назад на внутрішні колонки, коли жоден пристрій не підключено через HDMI, важливіше, але перемикання на вихідний звук через HDMI, коли пристрій підключено, все одно буде дуже приємним.

Це, мабуть, працювало з 11.10, але це не працює з 16.04.


Наявність швидкої клавіші для перемикання звуку може бути для вас гарним рішенням. Друга відповідь на цю тему робить , що: askubuntu.com/questions/41858 / ...
WinEunuuchs2Unix

Я все ще шукаю рішення для цього (16.04; жодне із запропонованих рішень не працює). проблема також обговорюється на форумі монетного двору .
головний герой hiro

@hiroprotagonist Так, і я. Здається, що відповідь тут працює в більшості випадків, але не у всіх.
UTF-8,

Насправді автоматична комутація працювала в Ubuntu 14.04, якщо тільки її не було відключено оновленням.
BurninLeo

Відповіді:


8

Фон

У мене була подібна проблема під час призупинення / відновлення, коли звук переходив з 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*щоб захопити обидва сценарії). .


Я не можу скопіювати, 70-persistent-net.rulesоскільки його не існує. /etc/udev/rules.dмістить лише один названий файл 39-smfp_samsung.rules.
UTF-8,

Ну добре скопіюйте 30-smfp_samsung.rules, нам не потрібен вміст файлу лише для того, щоб переконатися, що ми маємо правильні дозволи для нашого нового файлу. Копіювати наявний файл - це найпростіший спосіб (для мене все одно).
WinEunuuchs2Unix

1
Це не працює в моїй системі. @ Людина, яка вже підтримала цю відповідь: чи працює на вас? | Я спершу спробував це без перезавантаження, але це не вийшло. Він також не працює після перезавантаження. У мене був відключений HDMI і встановити звук на внутрішні колонки перед перезавантаженням. Після перезавантаження я відтворив музику та підключив кабель HDMI. Музика все ще (лише) виходила із вбудованих динаміків. Чи потрібно щось змінювати, окрім двох випадків використання імені користувача? cat /sys/class/drm/card0-HDMI-A-1/statusпоказує правильний статус (я намагався кілька разів).
UTF-8

@ UTF-8 Я додав новий розділ, де ви можете протестувати комутацію в командному рядку. Чи можете ви запустити це і побачити, якщо помилки з'являються, будь ласка?
WinEunuuchs2Unix

Здається, що немає output:analog-stereo: pastebin.com/n5bHyhCm Це робить його ще дивнішим, тому що тоді я очікую, що звук завжди відтворюватиметься через HDMI. Знімки екрана моїх налаштувань звуку, коли підключено HDMI та коли HDMI не підключено . Редагувати: я вже спробував це, але мені знадобилося ще кілька хвилин, щоб опублікувати цей коментар, оскільки мені довелося завантажити скріншоти.
UTF-8,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.