Все пользовательские настройки устройств хранятся в файле ~/.asoundrc
Простая конфигурация маршрутов для четырёх каналов, при которой 2 стерео-канала (№0 и №1) перенаправляются в тыловые каналы (№2 и №3). Сделать это можно при помощи плагина “route”.
pcm.torear { type route # Route & Volume conversion PCM #slave STR # Slave name # or slave { # Slave definition pcm "dmixer" # Slave PCM name # or #pcm { } # Slave PCM definition #[format STR] # Slave format channels 4 # Slave channels } ttable { 0 { # Таблица коэффициентов передачи канала №0 (передний левый) в другие каналы: 0 0.0 # в передний левый с коэффициентом 0 1 0.0 # в передний правый с коэффициентом 0 2 1.0 # в тыловой левый с коэффициентом 1 (т.е. 100%) 3 0.0 # в тыловой правый с коэффициентом 0 } 1 { # Таблица коэффициентов передачи канала №1 (передний правый) в другие каналы: 0 0.0 # в передний левый с коэффициентом 0 1 0.0 # в передний правый с коэффициентом 0 2 0.0 # в тыловой левый с коэффициентом 0 3 1.0 # в тыловой правый с коэффициентом 1 (т.е. 100%) } } }
Такая запись в файле ~/.asoundrc создаст ALSA-устройство под названием “torear”. Если после этого настроить в какой-либо программе вывод звука через это устройство, звук будет попатать только в два тыловых канала. Например,
mplayer -ao alsa:device=torear music.ogg
aqualung --device=torear
Для того, чтобы несколько приложений могли использовать аудиоустройства одновременно, необходимо создать устройства-микшеры, способные принимать аудиосигнал от нескольких приложений и смешивать его.
Для микшера воспроизведения используется плагин ALSA под названием “dmix”
pcm.dmixer { type dmix ipc_key 234885 slave { pcm "hw:0,0" period_time 0 buffer_time 0 period_size 1024 buffer_size 8192 # rate 44100 # channels 6 } # bindings { # 0 0 # 1 1 # 2 2 # 3 3 # 4 4 # 5 5 # } }
Для совместного доступа приложений к устройству записи (захвата звука) используем ALSA-плагин “dsnoop”
pcm.dsnooper { type dsnoop ipc_key 234886 ipc_perm 0660 slave.pcm "hw:0,0" }
Чтобы приложения могли использовать одно устройство для записи и воспроизведения звука, нам нужно “дуплексное” устройство. Т.е. такое устройство, которое имеет канал для захвата звука и независимый канал для воспроизведения звука. Для этого используем ALSA-плагин “asym”
pcm.duplexasym { type asym playback.pcm "dmixer" # playback on all speakers capture.pcm "dsnooper" # recording } pcm.duplex { # plug and play on all speakers type plug slave.pcm "duplexasym" }
Примитивный шумодав (написан правильно, но на деле очень плохо работает), входящий в набор “CMT”. Его единственный параметр указывает пороговое значение, при превышении которого канал “открывается” и звук становится слышен. Допустимые значения от 0 до 1.
pcm.noise_gate { type plug slave.pcm "ladspa_noise_gate"; } pcm.ladspa_noise_gate { type ladspa slave.pcm "duplex" path "/usr/lib/ladspa"; plugins [{ label hard_gate input { controls [ 0.1 ] } }] }
Сначала необходимо установить плагин для ALSA, реализующий функции эквалайзера. В качестве этого плагина зачастую выбирают плагин Eq2x2, входящий в состав набора C*A*P*S.
В Gentoo для этого достаточно выполнить команду
# emerge -va alsaequal
которая установит пакет media-plugins/alsaequal вместе с набором плагинов media-plugins/caps-plugins
После этого в пользовательский файл настроек ALSA ( ~/.asoundrc ) необходимо добавить следующие записи:
pcm.equalplug { # Or if you want the equalizer to be your # default soundcard uncomment the following # line and comment the above line. # pcm.!default { type plug; slave.pcm equal; } pcm.equal { type equal; slave.pcm "dmixplug"; } ctl.equal { type equal; }
Теперь после перезапуска звуковой подсистемы ALSA
# /etc/init.d/alsasound restart
появится возможность использовать эквалайзер. Настроить его можно при помощи утилиты
$ alsamixer
Эквалайзер в alsamixer'е представлен как отдельная звуковая карта. Для того, чтобы её выбрать, нужно нажать F6
и выбрать пункт enter device name…
после чего ввести в поле названия звуковой карты “equal”
Поле этого на экране появятся настройки 10-полосного эквалайзера
Настроив эквалайзер, можно воспроизводить звук через него, указывая в качестве устройства вывода звука equalplug. Например,
mplayer -ao alsa:device=equalplug audiofile.flac
или
aqualung -d equalplug
Не все программы позволяют пользователю указать в явном виде, какое аудиоустройство использовать. Вместо этого почти все они ищут в системе устройство по умолчанию (“default”). Для того, чтобы взять это устройство под свой контроль, создаём запись для него, направив весь звук (как записываемый, так и воспроизводимый) из него в ранее созданное дуплексное устройство.
pcm.!default { type plug slave.pcm "duplexasym" #slave.pcm "hw:0,0" }
pcm.noise_gate { type plug slave.pcm "ladspa_noise_gate"; } pcm.ladspa_noise_gate { type ladspa slave.pcm "duplex" path "/usr/lib/ladspa"; plugins [{ label hard_gate input { controls [ 0.1 ] } }] } pcm.dsnooper { type dsnoop ipc_key 234886 ipc_perm 0660 slave.pcm "hw:0,0" } pcm.dmixer { type dmix ipc_key 234885 slave { pcm "hw:0,0" period_time 0 buffer_time 0 period_size 1024 buffer_size 8192 # rate 44100 } # bindings { # 0 0 # 1 1 # } } pcm.duplexasym { type asym playback.pcm "dmixer" # playback on all speakers capture.pcm "dsnooper" # recording } pcm.duplex { # plug and play on all speakers type plug slave.pcm "duplexasym" } pcm.!default { type plug slave.pcm "duplexasym" }
pcm.amp3db { type plug slave.pcm "ladspa_amp3db" } pcm.ladspa_amp3db { type ladspa #slave.pcm "plughw:0,0"; slave.pcm "dmixplug"; #slave.pcm "dmixer"; # error: Slave PCM not usable #slave.pcm "default"; path "/usr/lib/ladspa"; plugins [{ label amp_stereo input { # gain, dB controls [3.0] } }] } pcm.amp6db { type plug slave.pcm "ladspa_amp6db" } pcm.ladspa_amp6db { type ladspa #slave.pcm "plughw:0,0"; slave.pcm "dmixplug"; #slave.pcm "dmixer"; # error: Slave PCM not usable #slave.pcm "default"; path "/usr/lib/ladspa"; plugins [{ label amp_stereo input { # gain, dB controls [6.0] } }] } pcm.amp9db { type plug slave.pcm "ladspa_amp9db" } pcm.ladspa_amp9db { type ladspa #slave.pcm "plughw:0,0"; slave.pcm "dmixplug"; #slave.pcm "dmixer"; # error: Slave PCM not usable #slave.pcm "default"; path "/usr/lib/ladspa"; plugins [{ label amp_stereo input { # gain, dB controls [9.0] } }] } pcm.amp12db { type plug slave.pcm "ladspa_amp12db" } pcm.ladspa_amp12db { type ladspa #slave.pcm "plughw:0,0"; slave.pcm "dmixplug"; #slave.pcm "dmixer"; # error: Slave PCM not usable #slave.pcm "default"; path "/usr/lib/ladspa"; plugins [{ label amp_stereo input { # gain, dB controls [12.0] } }] } pcm.amp15db { type plug slave.pcm "ladspa_amp15db" } pcm.ladspa_amp15db { type ladspa #slave.pcm "plughw:0,0"; slave.pcm "dmixplug"; #slave.pcm "dmixer"; # error: Slave PCM not usable #slave.pcm "default"; path "/usr/lib/ladspa"; plugins [{ label amp_stereo input { # gain, dB controls [15.0] } }] } pcm.!default{ type plug slave.pcm "duplex"; } pcm.duplex { type asym playback.pcm "dmixer" capture.pcm "mixin" } #ctl.!default { # type hw # card 0 #} pcm.dmixplug { type plug slave.pcm "dmixer"; } pcm.dmixer { type dmix ipc_key 1024 slave { pcm "hw:0,0" period_time 0 period_size 1024 buffer_size 8192 #periods 128 rate 44100 } bindings { 0 0 1 1 } } ctl.dmixer { type hw card 0 } pcm.mixin { type dsnoop ipc_key 5978293 # must be unique for all dmix plugins!!!! ipc_key_add_uid yes slave { pcm "hw:0,0" channels 2 period_size 1024 buffer_size 4096 rate 44100 periods 0 period_time 0 } bindings { 0 0 0 1 } } # playback PCM device: using loopback subdevice 0,0 pcm.amix { type dmix ipc_key 219345 slave.pcm "hw:Loopback,0,0" } # capture PCM device: using loopback subdevice 0,1 pcm.asnoop { type dsnoop ipc_key 219346 slave.pcm "hw:Loopback,0,1" }
arecord -c 2 -f FLOAT_LE -r 192000 test.wav
pcm.hard { type plug slave { pcm "hw:0,0" } }
aplay -Dhard test.wav
mplayer -ao alsa:device=hard test.wav