Переключаться между внутренними динамиками и динамиками HDMI автоматически

18

Вы знаете, как, когда вы подключаете наушники к разъему aux вашего ноутбука, внутренние динамики автоматически отключаются, и из наушников издается звук? Я хочу именно это для HDMI.

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

Конечно, я могу просто зайти в настройки звука и переключить выходной канал на HDMI. Но потом, когда я несколько часов назад отсоединял кабель HDMI и, возможно, даже находился в совершенно другом месте, звук не воспроизводился, потому что звуковой сервер все еще пытается воспроизвести его через HDMI, но к нему ничего не подключено. ,

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

Это очевидно работало с 11.10, но не работало с 16.04.

UTF-8,
источник
Хорошим решением для вас может быть использование сочетания клавиш для переключения звука. Второй ответ в этой теме: аскубунту.ком
вопросник/
я все еще ищу решение для этого также (16.04; ни одно из предложенных решений не работает). проблема также обсуждается на форуме монетного двора .
Хиро главный герой
@hiroprotagonist Да, я тоже. Кажется, что ответ здесь работает в большинстве случаев, но не во всех.
UTF-8
На самом деле автоматическое переключение работало в Ubuntu 14.04, если только это не было отключено обновлением.
BurninLeo

Ответы:

8

Фон

У меня была похожая проблема во время приостановки / возобновления, когда звук переключался с телевизора 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*чтобы захватить оба сценария. ,

WinEunuuchs2Unix
источник
Я не могу скопировать, 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