[ Пред. ] [ Содержание ] [ След. ]

Переключить выход звука

[ @keyboard @sound @elgato ]

 


В Debian, конечно, можно поменять вывод звука на разные источники прямо в консоли. Удобно же.


Дальше в мире линукса всё зависит от сервера, который управляет звуком на компьютере. В KDE по-умолчанию стоит PulseAudio, который работает через драйвер ALSA. В консоли (да и вообще это всё) управляется несколькими утилитами, среди которых



Первая чаще упоминается в режиме «получить информацию», а вторая — «внести изменения».


Однако далее будет видно, что pacmd вполне себе используется для внесения изменений, в частности, может включить один поток звука и подавить другой. Более того, в справке pactl есть указание «pactl only exposes a subset of the available operations. For the full set use the pacmd(1).»


Определить все звуковые устройства


Включить все, затем


cat /proc/asound/cards


У меня их четыре:

  1. ноутбук
  2. внешняя аудиокарта Jabra (монофоническая говорилка с управляющими сенсорными клавишами, подкл. по USB)
  3. внешняя аудиокарта Motu
  4. монитор (через HDMI)

Примерно так:


0 [PCH ]: HDA-Intel - HDA Intel PCH

HDA Intel PCH at 0xa4520000 irq 132
1 [NVidia ]: HDA-Intel - HDA NVidia
HDA NVidia at 0xa4000000 irq 17
2 [M2 ]: USB-Audio - M2
MOTU M2 at usb-0000:00:14.0-3, high speed
3 [USB ]: USB-Audio - Jabra SPEAK 410 USB
Jabra SPEAK 410 USB at usb-0000:00:14.0-5.4.1, full speed


Определить индекс каждого устройства


Узнать названия устройств с точки зрения на языке pulseaudio.


Команда выводит строки с указанием индексов устройств, но индексы эти меняются при перезагрузке или под влиянием внешних кривых рук факторов, поэтому нумерация значения не имеет:


pacmd list-sinks | grep -e 'name:' -e 'index'


Пример ответа:


index: 0

name: [alsa_output.usb-MOTU_M2_M20000023287-00.analog-stereo]
index: 1
name: [alsa_output.pci-0000_00_1f.3.analog-stereo]

name: [alsa_output.pci-0000_01_00.1.hdmi-stereo]
index: 4
name: [alsa_output.usb-0b0e_Jabra_SPEAK_410_USB_30507557996Ex011200-00.analog-stereo]


Символом * отмечено действующее устройство вывода звука.


Если внешнее устройство будет перевоткнуто в другой порт usb или даже через usb-хаб, тутошние значения поменяются.


Перенаправить звук на разные выходы


Делаем это в консоли, обходя два неочевидных момента


В линуксе есть возможность одновременно направить звук в несколько выходов сразу — Настроить виджет «Громкость»
Это норм, если ты диджей и надо слышать всё близко и выводить всё в зал на внешние мониторы. В быту это воспринмается как маразм — музыка идёт сразу из нескольких источников. Неочевидно, но в при настройке вывода звука в консоли легко сделать только первый шаг и не понять, как сделать второй…


Поэтому недостаточно просто указать другое устройства для выхода звука, надо ещё

  1. указать новый источник его вывода,
  2. ПОДАВИТЬ вывод звука ВООБЩЕ,
  3. перезапустить PulseAudio.

Это несколько последовательных команд, котоыре можно записать в один исполняемый sh-файл и запускать одним движением.


Для примера переключим выход звука на встроенные бумкалки монитора, который получает звук через hdmi. Он у нас называется [alsa_output.pci-0000_01_00.1.hdmi-stereo].


  1. Сделать новый файл вроде '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

  1. Переключить вывод звука на ноутбук (мышкой в трее)

  1. Выполнить этот файл в консоли:

./setAudioToNotebook.sh


Итого: звук из ноутбука переключился на внешний монитор.


Сделать переключение более удобным


Сделать отдельные файлы для переключения на каждый источник вывода звука по-отдельности. Далее


Если запутался и всё плохо


В любой момент можно полностью перезагрузить сервер 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 — и выглядит интересно, и реально управляет звуком.


F1 - Help
F2 - System Information
F6 - Select Sound Card
Esc - Exit the menu