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

34

Я использую свой ноутбук с внешним монитором, который имеет динамики. Когда монитор подключен через HDMI, я могу переключаться (используя графический интерфейс: Настройка звука -> Оборудование) между обычным аудиовыходом ноутбука и выходом монитора.

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

Мой дистрибутив Ubuntu 12.04 с гномом 3.

РЕДАКТИРОВАТЬ:

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

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>

После перехода из GUI:

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>

И если я пытаюсь изменить это, я получаю:

pacmd set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
Welcome to PulseAudio! Use "help" for usage information.
Sink alsa_output.pci-0000_00_1b.0.hdmi-stereo does not exist.
Луиджи Масса Галлерано
источник

Ответы:

28

В этом случае карта всегда одинакова. То, что меняется между переключателем и другим, это «профиль карты».

Таким образом, решение, которое действительно сработало:

pacmd set-card-profile <cardindex> <profilename>

В моем случае я нашел все профили карточек с:

pacmd list-cards

А после я могу переключаться между монитором и динамиками ноутбука с помощью:

pacmd set-card-profile 0 output:hdmi-stereo

А также:

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

Где 0 - индекс карты:

pacmd list-cards
Welcome to PulseAudio! Use "help" for usage information.
>>> 1 card(s) available.
    index: 0
    name: <alsa_card.pci-0000_00_1b.0>

И наконец, чтобы ускорить переключение, я установил два псевдонима в своем файле .bashrc:

alias audio-hdmi='pacmd set-card-profile 0 output:hdmi-stereo+input:analog-stereo'
alias audio-laptop='pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo'

Таким образом, я могу переключаться между звуком с монитора или с ноутбука (наушников), набирая текст в оболочке: аудио-HDMI или аудио-ноутбук

Луиджи Масса Галлерано
источник
Гектометр У моего pacmd нет опции 'list-cards' ...
ka3ak
5

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

https://github.com/lkettenb/sound-output-switcher

Скриншот

Lukas
источник
3

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

Вот код:

#!/bin/bash

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

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

Для меня это особенно полезно, так как я не люблю клонировать дисплеи. Я либо использую одно или другое. Возможно, вам придется адаптировать аудио профили к вашей конкретной системе.

user56655
источник
2

Вы можете использовать pactl, прочитайте его справочную страницу для получения дополнительной информации.

favadi
источник
2

Python-скрипт Лукаса ( https://github.com/lkettenb/sound-output-switcher , опубликованный выше) для реализации апплета уведомлений работает хорошо. Требуется пакет appindicator. Это может быть установлено с

sudo apt-get install python-appindicator
P.Windridge
источник
3
Пожалуйста, включите в свой ответ хотя бы несколько слов, объясняющих, что такое сценарий и почему он удобен.
Дероберт
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" .

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

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

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

В сценарии

Я сделал некоторые изменения, основанные на ответе @ user829996 (и здесь @ user56655):

#!/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

Я создал следующий скрипт Python, который делает следующее:

  1. Переключить устройство по умолчанию на следующее устройство в списке (с переносом) независимо от идентификаторов
  2. Перемещает все запущенные приложения на это устройство.
  3. Отправляет уведомления в графический интерфейс с именем устройства.
#!/usr/bin/env python3
import subprocess
# Toggle default device to the next device (wrap around the list)
cards_info = subprocess.run(['pacmd','list-sinks'], stdout=subprocess.PIPE)
card_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=cards_info.stdout)
indexes_list = card_indexes.stdout.decode().splitlines()
card_descriptions = subprocess.run(['grep', 'device.description'], stdout=subprocess.PIPE, input=cards_info.stdout)
indices = [i for i, s in enumerate(indexes_list) if '*' in s]
if (len(indices) != 1):
    print("Error finding default device")
    exit(1)
default_index = indices[0]
next_default = 0
if (default_index != (len(indexes_list) - 1)):
    next_default = default_index + 1
next_default_index =  (indexes_list[next_default].split("index: ",1)[1])
subprocess.run(['pacmd','set-default-sink %s' %(next_default_index)], stdout=subprocess.PIPE)

# Move all existing applications to the new default device
inputs_info = subprocess.run(['pacmd','list-sink-inputs'], stdout=subprocess.PIPE)
inputs_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=inputs_info.stdout)
inputs_indexes_list = inputs_indexes.stdout.decode().splitlines()
for line in inputs_indexes_list:
    input_index =  (line.split("index: ",1)[1])
    subprocess.run(['pacmd','move-sink-input %s %s' %(input_index, next_default_index)], stdout=subprocess.PIPE)

# Send notification to the GUI
descriptions_list = card_descriptions.stdout.decode().splitlines()
if (len(descriptions_list) == len(indexes_list)):
    description =  (descriptions_list[next_default].split("= ",1)[1])[1:-1]
    args = ["notify-send", "Default audio card changed", 'Default audio card was set to %s' %(description)]
    subprocess.run(args, stdout=subprocess.PIPE)

Назначено сочетание клавиш для сценария, и теперь моя жизнь счастлива

Nimrod.s
источник