Быстро сменить аудиоустройство в KDE

16

Я недавно переключился на OpenSUSE (с KDE) из Windows, и я все еще прохожу через кривую обучения.

Я довольно часто переключаюсь между использованием наушников со встроенным микрофоном и использованием встроенных динамиков моего монитора и микрофона моей веб-камеры. Используя меню Phonon через KMix (пример ниже), я могу переставить устройства так, чтобы они помещались поверх того, которое я хочу использовать, но я бы предпочел сделать это с помощью горячей клавиши, аналогично Audio Switcher делает приложение на Windows. Когда я делаю это, я также хотел бы установить мастер-канал на новый, чтобы я мог легко настроить звук.

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

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

Райан
источник

Ответы:

10

Большинство наборов GUI используют один и тот же бэкэнд PulseAudio. Используйте pactlдля написания управляющего скрипта.

NAME
       pactl - Control a running PulseAudio sound server

DESCRIPTION
       pactl can be used to issue control commands to the PulseAudio sound server.

       pactl only exposes a subset of the available operations. For the full set use the pacmd(1).

Источник: man pactl

  1. Чтобы проверить доступные выходные приемники

    $ pactl list short sinks
    0   alsa_output.pci-0000_01_00.1.hdmi-stereo    module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    1   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    
  2. Чтобы проверить доступные источники ввода

    $ pactl list short sources
    0   alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor    module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    1   alsa_output.pci-0000_00_1b.0.analog-stereo.monitor  module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    2   alsa_input.pci-0000_00_1b.0.analog-stereo   module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
    
  3. Для проверки по умолчанию

    $ pactl info
    Server String: /run/user/1000/pulse/native
    Library Protocol Version: 30
    Server Protocol Version: 30
    Is Local: yes
    Client Index: 2
    Tile Size: 65472
    User Name: user
    Host Name: userpc
    Server Name: pulseaudio
    Server Version: 6.0
    Default Sample Specification: s16le 2ch 44100Hz
    Default Channel Map: front-left,front-right
    Default Sink: alsa_output.pci-0000_00_1b.0.analog-stereo
    Default Source: alsa_input.pci-0000_00_1b.0.analog-stereo
    
  4. Установить по умолчанию

    pactl set-default-source id-or-name
    pactl set-default-sink id-or-name
    

    Пример:

    pactl set-default-source alsa_input.pci-0000_00_1b.0.analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    

    или:

    pactl set-default-source 2
    pactl set-default-sink 1
    

Примечания:

  • Это повлияет только на новые потоки, вам нужно переместить текущие текущие потоки, поэтому используйте:

    pacmd move-sink-input <stream-id> <sink-id/name>
    

    Хороший пример для копирования: переключение на HDMI Audio, когда HDMI подключен к ноутбуку (14.04)

  • Некоторые карты имеют несколько переключаемых портов, может быть тот, который вы хотите, не по умолчанию.

    Проверьте наличие доступных портов:

    $pactl list sinks
    Sink #1
        State: RUNNING
        Name: alsa_output.pci-0000_00_1b.0.analog-stereo
        Description: Built-in Audio Analog Stereo
        Driver: module-alsa-card.c
        ...
        Ports:
            analog-output-speaker: Speakers (priority: 10000, not available)
            analog-output-headphones: Headphones (priority: 9000, available)
        Active Port: analog-output-headphones
        Formats:
            pcm
    ...
    

    Чтобы установить это:

    pactl set-sink-port <sink-id/name> <port-name>
    

    Пример:

    pactl set-sink-port 1 analog-output-headphones
    

Чтобы изменить мастер-канал

Следуя этому руководству , вы можете установить мастер-канал qdbusследующим образом:

  1. Найдите мастер-микшер для каждого из ваших устройств с помощью следующей команды. Сначала установите Master Channel на тот, который вы хотите проверить, затем выполните команду:

    qdbus org.kde.kmix /Mixers org.kde.KMix.MixSet.currentMasterControl
    
  2. Используя результат этой команды и аудио-приемник, которым вы хотите управлять, используйте следующий синтаксис для изменения вашего основного канала:

    qdbus org.kde.kmix /Mixers org.kde.KMix.MixSet.setCurrentMaster "[insert Mixer]" "[insert sink]" 2>&1 > /dev/null
    
  3. В конце сценарий для переключения всего текущего аудио на новый канал, установки его по умолчанию и установки в качестве основного канала выглядит следующим образом:

    #!/bin/bash
    pactl set-default-sink alsa_output.usb-Logitech_Logitech_G930_Headset-00-Headset.analog-stereo
    pactl set-default-source alsa_input.usb-Logitech_Logitech_G930_Headset-00-Headset.analog-mono
    INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.usb-Logitech_Logitech_G930_Headset-00-Headset.analog-stereo &> /dev/null; done
    qdbus org.kde.kmix /Mixers org.kde.KMix.MixSet.setCurrentMaster "PulseAudio::Playback_Devices=:1" "alsa_output.usb-Logitech_Logitech_G930_Headset-00-Headset.analog-stereo" 2>&1 > /dev/null
user.dz
источник
Это выглядит как отличный ответ, но я не думаю, что моя установка использует PulseAudio. Я могу использовать команды, но текущий источник и приемник по умолчанию не совпадают с показанными в меню Phonon. И изменение их, кажется, не имеет никакого эффекта.
Райан
@ Райан, я только что проверил это в openSUSE 13.1 KDE, похоже, работает хорошо. Единственное, что я заметил: панель Phonon не обновляет свой интерфейс, если настройки изменились с PulseAudio. Не могли бы вы установить, а pavucontrolзатем открыть 3 вместе на экране (терминал w / pactl + pavucontrol панель + фононная панель). Попробуйте изменить настройки каждого и смотреть. Иногда вам нужно закрыть фонон и открыть его снова, чтобы увидеть реальное состояние установки.
user.dz
Я обнаружил, что вы можете создать новый профиль, который связывает оба элемента вместе, поэтому они всегда видны pactl list short sinks, см. Мой ответ ниже
Francesco
3

Благодаря этому ответу я наконец нашел решение, см. Ниже инструкцию

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

Из моего понимания этот /usr/share/pulseaudio/alsa-mixer/profile-sets/default.confсписок файлов всех профилей сопоставления между Alsa и Pulseaudio.

1.
Найдите сопоставление, которое относится к вашему Analog profileи HDMI profileопределению. ( описание: должно соответствовать профилям устройств, показанным в модуле настройки громкости звука Kde)

Для меня это следующие:

[Mapping analog-stereo]
device-strings = front:%f
channel-map = left,right
paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2
paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic
priority = 10

[Mapping hdmi-stereo-extra1]
description = Digital Stereo (HDMI 2)
device-strings = hdmi:%f,1
paths-output = hdmi-output-1
channel-map = left,right
priority = 2
direction = output

2.
На основе приведенного выше определения картирования я создал следующий новый профиль, объединяющий оба вышеуказанных профиля:

[Profile output:analog-stereo+output:hdmi-stereo-extra1]
description = All
output-mappings = analog-stereo hdmi-stereo-extra1
input-mappings = analog-stereo

3.
Перезапустите импульсный звук с помощью этой команды:

pulseaudio --kill; sleep 1; pulseaudio --start

4.
Перейдите в настройки фонона KDE> Настройка аудиооборудования и выберите новый профиль. 2 профиля в смесителе

Теперь вы должны увидеть оба профиля в смешанном, и вы сможете легко переключаться:

HDMI теперь всегда отображается в микшере
Я бы предложил использовать этот плазмоидный миксер: https://store.kde.org/p/1100894/

(дополнительный шаг) Принудительное включение обоих выходов

Если вы не возражаете против одновременного вывода звука с компьютера и с телевизора (то есть, по сути, вам не нужно переключать звук).

Вы можете выбрать настройки ниже, и тогда у вас будет новая запись в микшере

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

Francesco
источник
Это просто замечательно, работает как шарм, спасибо!
stsloth
0

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

Измените ваши аудиоустройства соответствующим образом. Используйте pactl list short sinksдля определения ваших устройств.

#!/bin/bash

# Audio sinks
HEADSET='alsa_output.usb-Corsair_Corsair_VOID_PRO_Wireless_Gaming_Headset-00.analog-stereo'
SPEAKERS='alsa_output.pci-0000_1f_00.3.analog-stereo'

# Get current audio sink
CURRENTDEV=$(pactl list short sinks | grep RUNNING | awk {'print $2'})

# Determine our next audio sink
if [[ "$CURRENTDEV" == "$HEADSET" ]]; then
    NEXTDEV=$SPEAKERS
else
    NEXTDEV=$HEADSET
fi

# Set our default device
pactl set-default-sink $NEXTDEV

# Move current streams (dont check for null, if null you wont see heads up display of audio change)
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
for i in ${INPUTS[*]}; do pacmd move-sink-input $i $NEXTDEV &> /dev/null; done

linuxkd
источник
0

Моя ситуация проста. У меня есть два вывода, некоторые HDMI и некоторые аналоговые, поэтому на основе ответа user.dz (спасибо) я написал этот маленький скрипт и вызвать его с помощью сочетаний клавиш.

#!/bin/bash
# parameter: "hdmi" or "analog"

output=`pactl list short sinks |grep $1 | cut -f1`

pactl set-default-sink $output

for i in `pacmd list-sink-inputs |grep index: | awk '{print $2}'`; do
  pacmd move-sink-input $i $output
done

Если у вас есть другие интерфейсы, вы можете найти уникальный шаблон в выводе «pactl list short sink» и вызвать скрипт с любым параметром, который вам нужен.

gabor.zed
источник