Ярлик для переключення між аналоговим стереовиходом та аудіовиходом 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

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


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-пристрій, запустивши папрефи з можливістю додати віртуальний пристрій виводу:

папрефи


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.Але якщо я вручну вибираю профіль із GUI Preferences GUI і виконую ту саму команду, я не отримую помилки. Тож не допомагає перемикатися.
iJeeves

@iJeeves: див. редагування для оновлення.
Таккат

Аналогічне питання. Якщо я запускаю команду, вона візуально змінить її в графічному інтерфейсі, але звук не перенаправляється. Мені потрібно вручну переключити його в GUI, щоб він працював. Якісь ідеї?
Ілля Лінн

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

а потім зв'язати невикористану клавішу на моїй клавіатурі, щоб виконати її (див. Як прив’язати власні команди до комбінацій клавіш? )


Хоча ви не підписалися протягом 18 місяців, просто хотіли повідомити, що це найкраща відповідь IMO +1
WinEunuuchs2Unix

Як це зробити, якщо мені потрібно переключитися між двома картками, а не лише двома профілями однієї карти?
Oebele

2

Ще один сценарій вимивання раковини

протестовано на 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в кінці, є підозрою програми, що належить

Потім ми повторюємо кожен рядок

... | 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

+1 для чудової першої відповіді як нового користувача. Оскільки оригінальне запитання стосувалося Ubuntu 11.04, вам слід вказати, з якою версією було протестовано.
WinEunuuchs2Unix

@ WinEunuuchs2Unix Нічого собі! Дякую :). Я додав версію Ubuntu під заголовком.
Мадакол


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

1

Я також намагався знайти рішення цієї проблеми. Що стосується Ubuntu 11.04, це, мабуть, не можливо безпосередньо, я знайшов лише це керівництво, щоб додати як HDMI, так і Analog як окремі виходи, тому pacmd показує 3 раковини. Тоді можна перемикатися між мийками за допомогою наведених вище команд. ( див. також )

Але, мабуть, Ubuntu 11.11 отримає PulseAudio із системою виявлення джеків. Згідно з наведеним нижче веб-сайтом, Девід Геннінгссон зашифрував виявлення через udev, тому імпульсне аудіо автоматично переключається на останній доданий вихід, включаючи перемикання між різними профілями однієї звукової карти (як це стосується вашої та моєї настройки). (див. тут )

Тож сподіваюся, що це спрацює, коли я спробую остаточну версію наступної п’ятниці.


1

На основі багатьох попередніх відповідей я написав сценарій, який встановлює раковину відтворення, чергуючи між доступними.

Найкращий спосіб використовувати це - створити комбінацію клавіш для запуску, тому кожен раз, коли ви натискаєте цю комбінацію клавіш, аудіо перенаправляється на наступний доступний раковину.

Код доступний тут: https://gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c


0

У моєму випадку аналогові параметри там, де їх немає в списку. Встановити pavucontrol: sudo apt install pavucontrol

Не вдалося виправити проблему, запустивши програму:

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

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

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

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


0

Альтернативою Sound Switcher Indicator (яка вимагає додавання 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

Чи є спосіб створити кнопку перемикання на панелі

Я написав аплет індикатора, який дозволяє перемикати вихідний звук.


Ласкаво просимо до Ask Ubuntu! Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Уоррен Хілл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.