Быстро сменить аудиоустройство в KDE
Я недавно переключился на OpenSUSE (с KDE) из Windows, и я все еще прохожу через кривую обучения.
Я довольно часто переключаюсь между использованием наушников со встроенным микрофоном и использованием встроенных динамиков моего монитора и микрофона моей веб-камеры. Используя меню Phonon через KMix (пример ниже), я могу переставить устройства так, чтобы они помещались поверх того, который я хочу использовать, но я бы предпочел сделать это с помощью горячей клавиши, аналогично приложение Audio Switcher работает в Windows. Когда я делаю это, я также хотел бы установить мастер-канал на новый, чтобы я мог легко настроить звук.
Есть ли способ через какой-нибудь сценарий, который позволил бы мне (а) выбрать новое устройство воспроизведения звука по умолчанию и записывающее аудио устройство на лету, (б), а также настроить мастер-канал для того же устройства воспроизведения (в) с помощью горячей клавиши или другой быстрый метод на рабочем столе?
3 ответа
Большинство наборов 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
Чтобы проверить доступные выходные приемники
$ 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
Чтобы проверить доступные источники ввода
$ 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
Для проверки по умолчанию
$ 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
Установить по умолчанию
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
следующее:
Найдите мастер-микшер для каждого из ваших устройств с помощью следующей команды. Сначала вручную установите мастер-канал на тот, который вы хотите проверить, затем выполните команду:
qdbus org.kde.kmix /Mixers org.kde.KMix.MixSet.currentMasterControl
Используя результат этой команды и звуковой приемник, которым вы хотите управлять, используйте следующий синтаксис для изменения вашего основного канала:
qdbus org.kde.kmix /Mixers org.kde.KMix.MixSet.setCurrentMaster "[insert Mixer]" "[insert sink]" 2>&1 > /dev/null
В конце сценарий для переключения всего текущего аудио на новый канал, установки его по умолчанию и установки в качестве основного канала выглядит следующим образом:
#!/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
Благодаря этому ответу я наконец нашел решение, см. Ниже инструкцию
Всегда показывать 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> Настройка аудиооборудования и выберите новый профиль.
Теперь вы должны увидеть оба профиля в смешанном, и вы сможете легко переключаться:
Я бы предложил использовать этот плазмоидный миксер: https://store.kde.org/p/1100894/
(дополнительный шаг) Принудительное включение обоих выходов
Если вы не возражаете против одновременного вывода звука с компьютера и с телевизора (то есть, по сути, вам не нужно переключать звук).
Вы можете выбрать настройки ниже, и тогда у вас будет новая запись в микшере
Основываясь на предыдущих комментариях, я написал следующий скрипт и связал его с горячей клавишей для использования в 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
Моя ситуация проста. У меня есть два вывода, некоторые 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" и вызвать скрипт с любым параметром, который вам нужен.
Искал везде... не нашел... Скрипт на питоне сделал, пользуюсь)
import os
speakers = []
st = 0
au = os.popen("pacmd list-sinks")
audiotm = au.read()
audio = list(audiotm.split())
indices = [i for i, x in enumerate(audio) if x == "name:"]
for num in range(len(indices)):
speakers.append(audio[indices[num]+1])
for num in range(len(speakers)):
speakers[num] = speakers[num][1:len(speakers[num])-1]
dir = os.path.abspath(__file__)
dir = dir[:-5]
try: f = open(dir + "lststate.txt","r");st = int(f.read()) ;f.close();
except:f = open(dir + "lststate.txt","w");f.write(str(st)); f.close();
if st == len(speakers): st = 0;
OUT = speakers[st]
st += 1
f = open(dir + "lststate.txt","w");f.write(str(st)); f.close();
z = os.popen("pactl list short sink-inputs")
OUTID = z.read().split()
x = os.popen("pacmd set-default-sink " + OUT)
for num in range(0,len(OUTID),7):
y = os.popen("pactl move-sink-input " + OUTID[num] + " " + OUT)
exit()