[ @keyboard @sound @elgato ]
В Debian, конечно, можно поменять вывод звука на разные источники прямо в консоли. Удобно же.
Дальше в мире линукса всё зависит от сервера, который управляет звуком на компьютере. В KDE по-умолчанию стоит PulseAudio, который работает через драйвер ALSA. В консоли (да и вообще это всё) управляется несколькими утилитами, среди которых
- pacmd — Reconfigure a PulseAudio sound server during runtime. Справка по pacmd --help
- pactl — Control a running PulseAudio sound server. Справка по man pactl
Первая чаще упоминается в режиме «получить информацию», а вторая — «внести изменения».
Однако далее будет видно, что pacmd вполне себе используется для внесения изменений, в частности, может включить один поток звука и подавить другой. Более того, в справке pactl есть указание «pactl only exposes a subset of the available operations. For the full set use the pacmd(1).»
Определить все звуковые устройства
Включить все, затем
cat /proc/asound/cards
У меня их четыре:
- ноутбук
- внешняя аудиокарта Jabra (монофоническая говорилка с управляющими сенсорными клавишами, подкл. по USB)
- внешняя аудиокарта Motu
- монитор (через HDMI)
Примерно так:
0 [PCH ]: HDA-Intel - HDA Intel PCH
Определить индекс каждого устройства
Узнать названия устройств с точки зрения на языке pulseaudio.
Команда выводит строки с указанием индексов устройств, но индексы эти меняются при перезагрузке или под влиянием внешних кривых рук факторов, поэтому нумерация значения не имеет:
pacmd list-sinks | grep -e 'name:' -e 'index'
Пример ответа:
index: 0
- index: 3
Символом * отмечено действующее устройство вывода звука.
Если внешнее устройство будет перевоткнуто в другой порт usb или даже через usb-хаб, тутошние значения поменяются.
Перенаправить звук на разные выходы
Делаем это в консоли, обходя два неочевидных момента
- чтобы при происходило переключение вывода звука на уровне системы, чтобы радиобатоны виджета «Громкость» в трее правильно отображали текущий выход и оставались работоспособными, вестимо.
- чтобы происходило переключение, а не дополнительное включение.
Это норм, если ты диджей и надо слышать всё близко и выводить всё в зал на внешние мониторы. В быту это воспринмается как маразм — музыка идёт сразу из нескольких источников. Неочевидно, но в при настройке вывода звука в консоли легко сделать только первый шаг и не понять, как сделать второй…
Поэтому недостаточно просто указать другое устройства для выхода звука, надо ещё
- указать новый источник его вывода,
- ПОДАВИТЬ вывод звука ВООБЩЕ,
- перезапустить PulseAudio.
Это несколько последовательных команд, котоыре можно записать в один исполняемый sh-файл и запускать одним движением.
Для примера переключим выход звука на встроенные бумкалки монитора, который получает звук через hdmi. Он у нас называется [alsa_output.pci-0000_01_00.1.hdmi-stereo].
- Сделать новый файл вроде 'setAudioToNotebook.sh':
#!/bin/bash #--- указать устройство для выхода звука
audio_device="alsa_output.pci-0000_01_00.1.hdmi-stereo"
pacmd set-default-sink $audio_device pacmd list-sink-inputs | grep index | while read line do pacmd move-sink-input `echo $line | cut -f2 -d' '` $audio_device done
- Переключить вывод звука на ноутбук (мышкой в трее)
- Выполнить этот файл в консоли:
./setAudioToNotebook.sh
Итого: звук из ноутбука переключился на внешний монитор.
Сделать переключение более удобным
Сделать отдельные файлы для переключения на каждый источник вывода звука по-отдельности. Далее
- Можно назначить хоткеи на вызов sh-файлов
- Можно вызывать файлы на выполнение через Software:KRunner
- Можно назначить переключения на кнопки внешней клавиатуры Software:Elgato “Stream Deck”
Если запутался и всё плохо
В любой момент можно полностью перезагрузить сервер alsa
systemctl --user restart pulseaudio
и не придётся перелогиниваться.
Дополнительное
Выходное устройство звука в alsa называется sink — то ли раковина, то ли слив, куда стекает вода в ванной. Выходное устройство, короче, в которое течёт поток (звука).
Посмотреть список синков (будет много информации):
pacmd list-sinks
Посмотреть список источников звука (тоже много информации):
pacmd list-sources
И то и другое выглядит одинаково безалаберно, но это разные списки с разными названиями, и воспринимать их нужно соответственно. В линуксе вообще можно одной командой направить звук из одного источника в разные выходы.
Пример (одной строкой):
pactl load-module module-loopback source=УСТРОЙСТВО_ВХОДА sink=УСТРОЙСТВО_ВЫХОДА
Это полезно, когда подключено много устройств и надо ими всеми как-то дъявольски круто управляться.
to set the default output sink
pacmd set-default-sink "SINKNAME" | index
to set the default input sink
pacmd set-default-source "SOURCENAME" | index
Управление уровнем звука из консоли тоже возможно через pacmd, но интереснее через amixer. Общий шаблон:
amixer -c [card-number> set [control> [value]
Знать номер звукового устройства (уже узнали через cat /proc/asound/cards), знать свойство, которое надо изменить (узнать доступные через amixer scontrols, ну и указать в процентах или в децибелах конечный результат.
Пример1:
amixer -c 0 set Master 80%
Пример2:
amixer -c 0 set Headphone 130%
Ещё можно запустить в консоли alsamixer — и выглядит интересно, и реально управляет звуком.
F2 - System Information
F6 - Select Sound Card
Esc - Exit the menu