В процессе юзания 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