Як я можу перемикатися між різними аудіовихідними пристроями за допомогою оболонки?


34

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

Я повторюю цю процедуру багато часу, і я почав замислюватися про те, чи зможу я її автоматизувати або, як би там не було, швидше виконати за допомогою оболонки.

Мій дистрибутив - 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 немає опції "Картки списку" ...
ka3ak


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

Для мене це особливо корисно, оскільки я не люблю клонувати екрани. Я або використовую те, або інше. Можливо, вам доведеться адаптувати звукові профілі до вашої конкретної системи.


2

Для pactlотримання додаткової інформації ви можете користуватися , читати його довідкову сторінку.


2

Лукаш пітоновий скрипт ( https://github.com/lkettenb/sound-output-switcher , розміщений вище) для впровадження аплету сповіщувача працює добре. Для цього потрібен пакет appindicator. Що можна встановити за допомогою

sudo apt-get install python-appindicator

3
Будь ласка, включіть у свою відповідь хоча б кілька слів, що пояснюють, що таке сценарій і чому він зручний.
дероберт


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

Ви можете скористатися спеціальною ярликом для її виконання 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. Надсилає сповіщення GUI із назвою пристрою.
#!/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)

Призначений ярлик клавіатури до сценарію, і моє життя зараз щасливе

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