Pulseaudio или как победить дракона Юзабилити

Nov 22, 2017 20:41


В процессе юзания Ubuntu возникало у меня много разного рода мелких и не очень проблем. В большинстве своем они быстро решались, либо же находились какие-то обходные пути. Но с сегодняшним героем было не так. С наскока ничего путного не вышло и только через год получилось достаточно вникнуть. Суть возникшей проблемы - при загрузке системы портом вывода по умолчанию являются колонки, т.е. линейный выход. Мне же хотелось, чтобы звук выдавался и на колонки и на наушники, воткнутые в морду системника. Казалось бы, решение простое: ставим утилиту pavucontrol и в графическом режиме выставляем нужный порт. Это прекрасно работает, но только до перезагрузки, потому как авторам не пришло в голову добавить в интерфейс галочку "по умолчанию" для выбранного порта. Что ж, придется копнуть глубже. Pavucontrol - это просто утилита для настройки звукового сервера Pulseaudio. Последний представляет собой прослойку между программами, использующими функции ввода/вывода звука, и ядром системы. Pulseaudio обладает множеством возможностей, но скрыты они за адски неудобным для простого юзера командным интерфейсом.

Для управления Pulseaudio есть несколько утилит, но мне хватило и одной. Знакомьтесь - pacmd. Она позволяет перенастроить уже запущенный сервер Pulseaudio. Это не совсем нужный мне функционал, но хотя бы шаг в его сторону. Идея в том, чтобы найти подходящую для смены порта вывода команду, а потом запустить ее при загрузке системы. Команда выглядит так:

pacmd set-sink-port ИМЯ|№ ПОРТ

В терминологии Pulseaudio, есть три типа объектов:
Card - звуковая карта, сам дивайс.
Sink - сток, приемник звука. Это линейный выход, выход наушников и т.д.
Source - исток, источник звука. Это линейный вход, вход фронтального микрофона и т.д.
Вышеприведенной командой можно, очевидно сменить текущий выбранный порт вывода. В качестве аргументов имеются таинственное ИМЯ и очевидный ПОРТ. Где их взять? В этом нам поможет другая команда:

pacmd list-sinks

Она покажет, как настроены порты вывода в данный момент. Вывод выглядит примерно так:




Здесь в строке name записан аргумент ИМЯ - это имя приемника. А в строках ports указаны возможные варианты для аргумента ПОРТ - имена портов вывода. Строка active port показывает текущий используемый порт вывода. Для того, чтобы сделать активным порт вывода на наушники команда должна выглядеть так:

pacmd set-sink-port 'alsa_output.pci-0000_00_07.0.analog-stereo' 'analog-output-headphones'

Все, можно пихать ее в автозапуск и наслаждаться жизнью? Как бы ни так. Не работает такой подход, по неизвестным для меня причинам. Но есть более правильный с точки зрения разработчиков Pulseaudio путь - правка соответствующего конфига. Искомый файл зовется /etc/pulse/default.pa. Вот он как раз и содержит настройки по умолчанию. Для смены порта вывода при загрузке системы в него нужно записать вот такую строчку:

set-sink-port alsa_output.pci-0000_00_07.0.analog-stereo analog-output-headphones

Аргументы те же, но не нужен вызов pacmd и кавычки. Все, вот теперь энджой.
Отдельная полезная мелочь - возможность управления громкостью в консоли. Примерно так:

pactl set-sink-volume 'alsa_output.pci-0000_00_07.0.analog-stereo' 30000

Здесь, очевидно, опять используется имя карты, а второй аргумент - громкость. Минимум - 0, максимум - 65535. 30000 в примере - это около 50% громкости. Выставленное значение сохраняется после перезагрузки.

Но, хорошего хочется больше - возникла необходимость изменить и вход по умолчанию. Был тыловой микрофон, а должен стать фронтальный. Логика примерно та же, только вместо sink в командах будет source.
Сперва посмотрим на наши текущие входа:

pacmd list-sources

Из вывода берем знакомые уже аргументы ИМЯ и ПОРТ и подставляем в команду смены порта ввода:

pacmd set-source-port 'alsa_input.pci-0000_00_07.0.analog-stereo' 'analog-input-front-mic'

И вход микрофона действительно сменился с тылового на фронтальный. Теперь осталось дописать нужную строчку в файл /etc/pulse/default.pa. Выглядеть эта строчка будет так:

set-source-port alsa_input.pci-0000_00_07.0.analog-stereo analog-input-front-mic

Энджой, но пока неполный - стоит еще покопать в сторону встроенного фильтра шумов микрофона. В Pulseaudio есть такая функция и с ее помощью можно улучшить качество звука с микрофона, однако использовать это стоит только для голосового общения. При включении фильтра будут вноситься дополнительные искажения в сигнал (такова цена быстрого шумоподавления в реальном времени), поэтому при записи лучше записать что есть, а шумы удалять уже фильтрами звукового редактора. Для включения функции для конкретного приложения нужно запускать его с переменной окружения PULSE_PROP="filter.want=echo-cancel". Для Дискорда я сделал скрипт для запуска с фильтром, который помести на рабочем столе вместо штатной кнопки запуска:

#!/bin/sh
PULSE_PROP="filter.want=echo-cancel"
/usr/share/discord/Discord

На этом все. Нетронутых в этой заметке возможностей у Pulseaudio еще много, но мне лень разбираться, пока не возникло насущной необходимости.

За информацию спасибо вот этим ребятам:
PulseAudio, часть 1: управление из командной строки
Change default port for PulseAudio (line out, not headphones)
Давим шумы средствами PulseAudio

linux, hardware

Previous post Next post
Up