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

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

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

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

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

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

17
задан 14 April 2017 в 01:23

1 ответ

Фон

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

Я знаю, что это может быть более профессионально с именем пользователя автоматически набор к переменной удара, но я еще не настолько квалифицирован :( Так или иначе сохраните файл и выход 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 / ТВ:

        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/class/drm/card0-HDMI-A-1/status", но я должен был измениться card0 кому: card1 и код выше был пересмотрен как таковой. Я не могу объяснить, что изменилось в моей системе кроме регулярных обновлений Ubuntu с 26 ноября 2016.

Редактирование 14 декабря 2016

Выше кода должен был быть переключен снова назад на: "$ (кошка/sys/class/drm/card0-HDMI-A-1/status". Вместо того, чтобы пересмотреть код между card0 и card1 в зависимости от начальной загрузки пересмотрите программу к ссылке card* получать оба сценария.

7
ответ дан 14 April 2017 в 01:23
  • 1
    К вашему сведению \s, вероятно, только работы в GNU awk - если Вы имеете mawk, например (который был значением по умолчанию awk на некоторых предыдущих версиях Ubuntu) необходимо будет, вероятно, использовать что-то как /^[ \t]*[112]#47; – steeldriver 6 September 2018 в 01:39

Другие вопросы по тегам:

Похожие вопросы: