MyTetra Share
Делитесь знаниями!
Как заставить работать программный регулятор громкости для звуковой карты E-mu Tracker Pre USB в Linux
Время создания: 09.11.2017 00:11
Автор: Xintrea
Текстовые метки: linux, звуковая карта, громкость, регулировка, alsa, pulseaudio
Раздел: Компьютер - Linux - Звук и аудио - E-MU
Запись: xintrea/mytetra_syncro/master/base/1510175464ffzdo03w4y/text.html на raw.github.com

У владельцев USB-шных звуковых карточек семейства E-mu Tracker Pre/E-mu 0202 USB/E-mu 0404 USB существует проблема: при стандартных настройках не работает регулятор громкости. Это выглядит так: перемещение движка настройки громкости звука не влияет на громкость звука. Только в самом крайнем положении звук просто выключается.


Карточка хорошая, и очень обидно, что в Linux её поддержка сделана не до конца.



В этой статье предпринята попытка разобраться, как можно решить проблему регулировки громкости, и заставить работать если не встроенный в карточку хардварный регулятор громкости, так хотя бы программный, присутствующий в звуковой подсистеме Linux. Настройка будет производиться для звукового сервера Pulse Audio. По идее, эти же настройки должны исправлять и управление громкостью в ALSA, но информации об этом в сети крайне мало.


Все нижеперечисленные настройки справедливы для Debian GNU/Linux 8.6 (jessie). Ядро: Linux 3.2.0-4-686-pae #1 SMP Debian 3.2.32-1 i686 GNU/Linux, версия PulseAudio 5.0. Рабочий стол KDE 4.14.2.



Сбор сведений о звуковой карточке


Для начала нужно получить все сведения о настраиваемой звуковой карте. Сделать это можно вот по такой памятке:


Какие диагностические данные можно узнать о звуковой карте под Linux



Определение текущего контроллера, который управляет громкостью


Для проведения настройки необходимо определить имя текущего системного контроллера, который отвечает за регулировку звука на USB-звуковушке. Предполагается, что уже известен хардварный номер звуковой карты (как это сделать написано по ссылке выше). В нашем случе хардварный номер будет 1.


Выполняем команду amixer с ключем -c, указав хардварный номер 1:


$ amixer -c 1

Simple mixer control 'PCM',0

Capabilities: pvolume pswitch pswitch-joined

Playback channels: Front Left - Front Right

Limits: Playback 0 - 200

Mono:

Front Left: Playback 185 [92%] [-7.50dB] [on]

Front Right: Playback 185 [92%] [-7.50dB] [on]

Simple mixer control 'Clock rate Selector',0

Capabilities: volume volume-joined

Playback channels: Mono

Capture channels: Mono

Limits: 0 - 5

Mono: 1 [20%]

Simple mixer control 'Main',0

Capabilities: volume

Playback channels: Front Left - Front Right

Capture channels: Front Left - Front Right

Limits: 0 - 255

Front Left: 235 [92%]

Front Right: 235 [92%]


Здесь названия контроллеров 'PCM', 'Clock rate Selector', 'Main' - это так называемые control name, которые используются в файлах /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf и /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common.


Тут нужно сделать ремарку, и сказать, что файл analog-output.conf.common инклюдится в конце файла analog-output.conf , то есть оба эти файла участвуют в настройках звуковой подсистемы PulseAudio.


Указанные выше control name используются при создании наименований секций в этих настроечных файлах. Например, для контроллеров 'PCM', 'Clock rate Selector', 'Main' могут существовать секции:


[Element PCM]

[Element Clock rate Selector]

[Element Main]


Нас будет интересовать секция [Element PCM]. Кстати, по такому же принципу могут существовать секции для контроллеров системных миксеров, получаемых командой amixer без аргументов. То есть, если имеем контроллеры Master и Capture, значит могут существовать секции [Element Master] и [Element Capture].



Подключение программного миксера


Кто хорошо знает английский, может для начала прочитать обсуждение на Stack Overflow:


How to force software master volume control in PulseAudio?


Далее я напишу по-русски, о чем идет речь.


В этом обсуждении рассказывается, что делать в том случае, если не работает регулятор громкости для USB-карточки. То есть, регулятор громкости только включает и выключает звук. Это происходит из-за того, что для внешней USB-карточки семейства E-MU в стандартном драйвере нет реализации команд для полноценной хардварной поддержки, поддерживаются только примитивные команды включения/выключения звука. Для решения этой проблемы можно сделать программную регулировку звука. Забегая вперед, скажу, что падения качества звучания с включенной программной регулировкой громкости я не заметил.


Как говорят наши англоязычные коллеги, где-то в глубинах PulseAudio имеется некий флаг HW_VOLUME_CTRL. Что он из себя представляет - неясно, но вроде как благодаря ему ядерная подсистема alsa-mixer (а мы не забываем, что PulseAudio - это всего-навсего надстройка над ALSA) берет следующие настройки из файла /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common:


[Element PCM]

switch = mute

volume = merge


И существует возможность сказать PulseAudio, чтобы она игнорировала эти настройки. То есть, для PCM-контроллера можно указать не использовать присоединение к стандартному регулятору громкости (volume = merge), а начать использовать софтварный регулятор громкости.


Для этого нужно создать два файла:


/usr/share/pulseaudio/alsa-mixer/paths/emu-usb-output.conf

/usr/share/pulseaudio/alsa-mixer/profile-sets/emu-usb.conf


В файле /usr/share/pulseaudio/alsa-mixer/paths/emu-usb-output.conf нужно прописать следующее:


# This is handmade create config


[Element PCM]

switch = mute

volume = ignore


А в файл /usr/share/pulseaudio/alsa-mixer/profile-sets/emu-usb.conf надо записать следующее:


# This is handmade create config


[General]

auto-profiles = yes


[Mapping emu-usb-stereo]

device-strings = hw:%f

channel-map = left,right

paths-output = emu-usb-output


Затем надо сказать PulseAudio чтобы он начал использовать эти новые файлы профиля для данной карточки. Делается это путем установки UDEV - окружения с помощью прописывания правила:


ENV{PULSE_PROFILE_SET}=emu-usb.conf


... либо загрузкой настроек в модуль module-alsa-card вручную. Для этого в файле /etc/pulse/system.pa нужно прописать примерно следующее:


load-module module-alsa-card device_id=USB name="emu-usb" card_name="emu-usb" profile_set=emu-usb.conf profile="output:emu-usb-output" ...


В результате некая настройка PulseAudio, именуемая alsa_output.emu-usb.emu-usb-stereo будет работать без флага HW_VOLUME (ранее буржуин говорил о HW_VOLUME_CTRL, может он тут ошибся), и обычный контроль громкости звука PulseAudio начнет работать через все приложения ALSA.



Прописывание UDEV правила


Выше было сказано, что для применения настроек, заданных в новых файлах профиля, можно использовать возможность прописывания UDEV правила. Вот как это делается.


Под рутом надо зайти в каталог /etc/udev/rules.d, и создать там файл с именем 10-local.rules, если такового еще нет. Если есть - можно писать прямо в него.


Далее надо определить USB-идентификаторы звуквой карты - ID вендора и ID устройства. Для этого требуется выполнить следующую команду:


# lsusb

Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 008 Device 003: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory

Bus 008 Device 002: ID 093a:2521 Pixart Imaging, Inc.

Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Bus 006 Device 002: ID 041e:3f0a Creative Technology, Ltd

Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Bus 001 Device 002: ID 8564:4000

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub


Если непонятно, какое устройство соответствует USB-звуковушке (Creative ведь выпускает не только звуковые карты), можно дать такую команду:


# lsusb -t

...

/: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M

|__ Port 2: Dev 2, If 0, Class=Vendor Specific Class, Driver=snd-usb-audio, 12M

|__ Port 2: Dev 2, If 1, Class=Vendor Specific Class, Driver=snd-usb-audio, 12M

|__ Port 2: Dev 2, If 2, Class=Vendor Specific Class, Driver=snd-usb-audio, 12M

...


Тут уже однозначно видно, что на шине 6, на порту 2 находится звуковая карта.


Из этого набора данных нам нужны сведения о USB-идентификаторах. Вот они: "ID 041e:3f0a". Первое число - это ID вендора, второе число - это ID устройства.


Теперь можно составить UDEV правило:


ATTRS{idVendor}=="041e", ATTRS{idProduct}=="3f0a", ENV{PULSE_PROFILE_SET}="emu-usb.conf"


Обратите внимание на двойные и одинарные знаки равно "=". У атрибутов они двойные, у значения ENV - одинарные. Это потому, что двойные знаки равно используются для задания правил фильтрации контекста применимости задаваемого значения. А установка значения - оно и есть установка значения через обычный знак равно.


Строку с UDEV правилом надо прописать в файл /etc/udev/rules.d/10-local.rules и перегрузиться. Если вы все сделали правильно, у вас заработает регулятор громкости.



Результат


Регулятор громкости заработал. Честно говоря, я уже не верил, что смогу разобраться как конфигурировать звуковые устройства под Linux. На все эти изыскания в короткие моменты свободного времени у меня ушел почти год. Кажется, Linux действительно еще не готов для десктопа.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования