суббота, 24 октября 2020 г.

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

Будучи любителем послушать музыку с комфортом, соединил свой компьютер с ресивером аудиосистемы с помощью TosLink/ S/PDIF и столкнулся с неприятной особенностью моей новой материнки. Так, она не умеет одновременно работать с аналоговым и цифровым выходом, так что старый трюк с добавлением виртуального устройства со вторым типом выхода не прокатил - второй выход оказался немым. В итоге, чтобы переключиться на S/PDIF, мне нужно каждый раз лезть в настройки PulseAudio и переключать выход на нужный в текущий момент (колонки/наушники у компа или аудиосистема по S/PDIF). Но, лень двигатель прогресса - меня этак картина быстро перестала устраивать и я озаботился переключателем, позволяющим быстро изменять режим звуковой карты. Поделюсь тут этим фокусом, может кому пригодится.

В каждой графической системе в Linux имеется множество различных виджетов-переключателей. Так, например, Configurable Button для KDE/Plasma 5 вполне способен справиться с задачей. Так что смело добавляем её в трей и всё что нам остаётся - создать скрипты для переключения.

Чтобы переключить режим звуковой карты и выбрать нужный выход, мы воспользуемся интерфейсом командной строки для PulseAudio - командой pactl.

Так, команда :

$pactl set-card-profile <#> <profile-name>

переключает профиль аудиокарты <#> на профиль с названием <profile-name>, а команда

$pactl set-default-sink <sink-name>

переключает выход на свеже-объявившийся. Последнюю команду необходимо добавить в скрипт, так как по умолчанию, при потере связи с аудиовыходом, пульс переключится на доступный - и будет у вас звук ломиться в hdmi или ещё куда. 

Всё что остаётся сделать - это выяснить номер аудиокарты, имя профиля, имя выхода. Чтобы определить их, выполните команды:

 $pactl list cards

- это даст вам номер карты и имена всех доступных профилей, представленных в виде "output:analog-stereo+input:analog-stereo" для аналога или, например  "output:iec958-stereo+input:analog-stereo" - для цифры. Затем выполните команду:

$pacmd list-sinks | grep -e name: -e index -e description -e muted

- это даст вам имя нужного выхода, вида "alsa_output.pci-0000_2f_00.4.iec958-stereo", который нужно будет скормить команде pactl set-default-sink. Обратите внимание, что имена в списке будут в скобочках вида <имя> - так вот скобочки в команду не кидайте, она их не съест. Кроме того, на первый взгляд можно дать вместо полного имени профиля просто номер напротив "index: #", вот только делать этого не следует - т.к. номер будет при каждом переключении прогрессивно расти и скрипт выдаст ошибку.

Теперь заходим в свою домашнюю папку, в папку со скриптами (у вас нет такой? Создайте немедленно!) типа ~/.scripts/, создаём там пару скриптов, обозвав их для узнаваемости spdif-on.sh и spdif-off.sh, в которые добавляем команды вида:

#!/bin/bash
pactl set-card-profile 1 output:iec958-stereo
pactl set-default-sink alsa_output.pci-0000_2f_00.4.iec958-stereo

 И для обратного переключения:

#!/bin/bash
pactl set-card-profile 1 output:analog-stereo+input:analog-stereo
pactl set-default-sink alsa_output.pci-0000_2f_00.4.analog-stereo

 Теперь добавляем этим скриптам разрешение на исполнения командой 

$chmod +x spdif-on.sh&&chmod +x spdif-off.sh

 и скармливаем их нашему виджету, не забыв попутно прикрутить ему понятную иконку на включённое и отключённое состояние.

Дело сделано - теперь можно быстро переключать режим аудиокарты на цифровой выход и обратно. 


Комментариев нет:

Отправить комментарий