Ярлык для переключения между аналоговым стереофоническим выходом и аудиовыходом HDMI

18

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

:aplay -l 
**** List of PLAYBACK Hardware Devices ****
card 0: Intel [HDA Intel], device 0: STAC92xx Analog [STAC92xx Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 7: STAC92xx Digital [STAC92xx Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

введите описание изображения здесь

iJeeves
источник
1
+1 Было бы здорово, если бы я мог одним нажатием переключиться на правильный режим вывода изображения HDMI и режим звука.
Кит Менке
Что было бы еще лучше, так это то, что, когда он обнаружит этот аудиоканал HDMI / Display Port, он автоматически переключит его. Для этого и есть док-станция. Кажется, я недавно вспомнил какой-то код стыковки, который изменит конфигурацию на основе определенных аппаратных идентификаторов (MAC). Кто-нибудь знает, как это называется снова?
Элайджа Линн

Ответы:

10

С помощью pulseaudio мы можем выбрать выходной приемник из командной строки:

pacmd set-default-sink "SINKNAME"

Эта команда может использоваться в панели запуска, скрипте или даже назначаться сочетанию клавиш для быстрого переключения между различными приемниками. Пожалуйста, замените "SINKNAME" именем или номером желаемой раковины. Список известных приемников с соответствующими номерами и именами задается командой:

pacmd list-sinks

Примечание. Изменение выходного приемника через интерфейс командной строки может вступить в силу только в том случае, если чтение целевого устройства потока отключено. Это можно сделать, отредактировав соответствующую строку в /etc/pulse/default.pa:

load-module module-stream-restore restore_device=false

В качестве альтернативы мы могли бы запустить pulseaudio для одновременного вывода звука на внутреннее аудиоустройство и на hdmi-устройство, запустив paprefs с возможностью добавить виртуальное устройство вывода:

paprefs

Takkat
источник
2
pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.analog-stereo"и pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.hdmi-stereo"работает только после выбора соответствующего профиля в настройках звука. Если у меня установлен HDMI, и я запускаю команду pacmd для аналогового стерео, я получаю ошибку. Sink alsa_output.pci-0000_00_1b.0.analog-stereo does not exist.Но если я вручную выбираю профиль из графического интерфейса настройки звука и запускаю ту же команду, я не получаю сообщение об ошибке. Так что это не помогает переключаться.
iJeeves
@iJeeves: см. редактировать для обновления.
Таккат
Аналогичная проблема. Если я запускаю команду, она визуально изменит ее в графическом интерфейсе, но звук не будет перенаправлен. Я должен вручную переключать его в графическом интерфейсе, чтобы он работал. Есть идеи?
Элайджа Линн
1
@ElijahLynn: Возможно, вам также придется перенести поток: askubuntu.com/questions/71863/…
Takkat
@Takkat: я еще не пробовал, но, похоже, это была именно та проблема, которая у меня возникла. Спасибо!
Элайджа Линн
7

Я нашел это очень раздражающим для себя и написал скрипт для переключения вывода:

#!/bin/bash

CURRENT_PROFILE=$(pacmd list-cards | grep "active profile" | cut -d ' ' -f 3-)

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo+input:analog-stereo>" ] ; then
        pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo"
else 
        pacmd set-card-profile 0 "output:hdmi-stereo+input:analog-stereo"        
fi

а затем привязать неиспользуемую клавишу на клавиатуре для ее выполнения (см. Как связать пользовательские команды с сочетаниями клавиш? )

user829996
источник
Хотя вы не
регистрировались
Как я могу это сделать, если мне нужно переключаться между двумя картами, а не просто двумя профилями одной карты?
Oebele
2

Еще один сценарий переключения Sink

протестировано на Ubuntu 16.04


Но этот позволяет переключать только звук приложения, которое вы хотите.

ИСПОЛЬЗОВАНИЕ: Фокус приложения, которое вы хотите изменить его приемник и запустить этот скрипт. Это оно!!!

Этот сценарий обнаруживает приложение, находящееся в фокусе, находит все воспроизводимые с него аудиофайлы и переключает их на следующий доступный приемник.

https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3

Объясняя сценарий

Нам нужно найти PID приложения в фокусе

Но сначала нам нужен XID

xprop -root _NET_ACTIVE_WINDOW 

Затем вставьте его сюда, $xidчтобы получить pid приложения

xprop -id $xid _NET_WM_PID

Теперь нам нужно найти входные данные, связанные с этим PID.

Сначала давайте линеаризуем вывод команды, pacmd list-sink-inputsчтобы перечислить один вход-приемник в каждой строке, показывая ее индекс, приемник и pid в одной строке.

pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2

давайте проанализируем это шаг за шагом:

grep -E 'index:|sink:|process.idтолько сохранить строки , которые содержат index:, sink:илиprocess.id

tr '\n' ' ' объединяет все линии

tr -d '"'удаляет все "символы Нужно получить пид без кавычек

sed -e 's/index:/\n/g'заменяет все index:вхождения символом новой строки\n

tail -n +2 удаляет первую строку, потому что она пуста

И результат примерно такой:

  180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
  181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
  182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

Давайте разберем одну строку, чтобы понять, что это значит:

  # 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

182является индексом входного потока, 0является индексом приемника, и 13752в конце, является pid принадлежащего приложения

Затем мы перебираем каждую строку

... | while IFS= read -r line || [ -n "$line" ]; do
  sink_input_pid=$(echo $line | awk '{print $NF}')

И, наконец, отфильтруйте только тот pid входного сигнала, который соответствует pid целевого приложения.

  if [ $sink_input_pid = $app_pid ]; then

Извлечение данных

С помощью awkмы можем получить необходимые нам элементы

sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')

Получить число приемников, чтобы узнать, когда вращение приемников должно возобновиться с 0.

sink_list_size=${#sink_list_array[@]}

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

i=0
for sink in "${sink_list_array[@]}"; do
  i=$((($i+1)%sink_list_size))  # i++ mod(#sinks)
  if [ $sink = $current_sink_index ]; then
    next_sink_index=${sink_list_array[i]}
    break
  fi
done

И наконец, мы перемещаем вход-приемник для воспроизведения в next_sink_index

pacmd move-sink-input $sink_input_index $next_sink_index

Примечание по Ubuntu 16.04:

При настройке сочетания клавиш я не мог заставить его работать с менеджером ярлыков в Ubuntu. Поэтому мне пришлось установить compizconfig-settings-manager

sudo apt-get install compizconfig-settings-manager
Madacol
источник
+1 за отличный первый ответ как новый пользователь. Поскольку первоначальный вопрос касался Ubuntu 11.04, вы должны указать, с какой версией была протестирована.
WinEunuuchs2Unix
@ WinEunuuchs2Unix Ух ты! Спасибо :). Я добавил версию Ubuntu под заголовком.
Madacol
1

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

Например: у меня есть ноутбук с одной встроенной звуковой картой, но он имеет цифровой выход (SPDIF) в док-станции.

Итак, что я хотел сделать, это переключить активный выход или «Профиль» в pulseaudio.

Я нашел команды, которые делают именно это:

pacmd set-card-profile 0 output:analog-stereo
pacmd set-card-profile 0 output:iec958-stereo+input:analog-stereo

То, что я сделал, чтобы получить правильные названия для желаемой настройки вывода - здесь, цифровой выход, но аналоговый (микро) вход - было:

pacmd list | grep output
ritterkeks
источник
1

Я тоже пытался найти решение этой проблемы. Начиная с Ubuntu 11.04 это не представляется возможным напрямую, я нашел это руководство только для добавления HDMI и Analog в качестве отдельных выходов, поэтому pacmd показывает 3 приемника. Затем можно переключаться между приемниками, используя приведенные выше команды. ( см. также )

Но, по-видимому, Ubuntu 11.11 получит PulseAudio с системой обнаружения джека. Согласно веб-сайту ниже, Дэвид Хеннингссон кодировал обнаружение через udev, поэтому импульсное аудио автоматически переключается на последний добавленный выход, включая переключение между различными профилями одной и той же звуковой карты (как в случае с вашей и моей настройкой). (см. здесь )

Поэтому я надеюсь, что это сработает, когда я попробую финальную версию в следующую пятницу.

Graipher
источник
1

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

Лучший способ использовать его - создать сочетание клавиш для его запуска, поэтому при каждом нажатии этой комбинации клавиш звук перенаправляется на следующий доступный приемник.

Код доступен здесь: https://gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c

GermanK
источник
0

В моем случае аналоговых вариантов нет в списке. Установите pavucontrol: sudo apt install pavucontrol

Может решить проблему, запустив приложение:

  1. Запустите приложение через терминал, введя: pavucontrol(введите)
  2. Перейдите на вкладку «Конфигурация».
  3. Выберите выходной профиль Analoge в Intern Sound

введите описание изображения здесь

Теперь я могу здесь озвучивать и выбирать разные профили (под Linux Mint):

введите описание изображения здесь

danger89
источник
0

Альтернативой индикатору Sound Switcher (который требует добавления PPA) является создание команды (или сценария) и вызов ее с помощью ярлыка:

В моем случае был hdmi-stereo-extra1+inputпрофиль, поэтому в одной строке было бы:

[[ $(pacmd list-cards | grep "active profile" | cut -d " " -f 3-) = "<output:hdmi-stereo-extra1+input:analog-stereo>" ]] && \
     pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo" || \
     pacmd set-card-profile 0 "output:hdmi-stereo-extra1+input:analog-stereo"

Вы можете использовать собственный ярлык ( gnome-control-center keyboard) для его выполнения bash -c(предупредит вас, если есть какой-либо конфликт с другим ярлыком):

Скриншот

Скриншот

Я использую:

  • Super + Alt + o: Переключить выход между наушниками и HDMI.
  • Super + Alt + Up: Vol Up
  • Super + Alt + Down: Vol Down

Также вы можете добавить aliasв свой.bashrc .

Протестировано на Ubuntu 16.04 и 18.04


Если вы не хотите описывать поведение сценария, я внес некоторые изменения, основанные на ответе @ user829996:

#!/bin/bash
set -euo pipefail # strict mode

activeProfile() { pacmd list-cards | grep "active profile" | cut -d " " -f 3-; }
CURRENT_PROFILE="$(eval activeProfile)"

# If it doesn't work run  pacmd list-cards  and try the other outputs from profile section
ANALOG_PROFILE="output:analog-stereo+input:analog-stereo"
HDMI_PROFILE="output:hdmi-stereo-extra1+input:analog-stereo"

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo-extra1+input:analog-stereo>" ] ; then
  pacmd set-card-profile 0 "$ANALOG_PROFILE"
else
    pacmd set-card-profile 0 "$HDMI_PROFILE"
fi

activeProfile
Пабло Бьянки
источник
0

Есть ли способ создать кнопку переключения на панели?

Я написал индикаторный апплет, который позволяет переключать вывод звука.

Lukas
источник
Добро пожаловать в Спросите Ubuntu! Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
Уоррен Хилл