Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
Both sides previous revision Попередня ревізія | |||
alsa [2013/06/04 17:19] wombat Equalizer added |
alsa [2013/06/04 17:22] (поточний) wombat [Эквалайзер] |
||
---|---|---|---|
Рядок 1: | Рядок 1: | ||
+ | ====== ALSA ====== | ||
+ | Все пользовательские настройки устройств хранятся в файле //~/.asoundrc// | ||
+ | |||
+ | ===== Маршрутизация каналов ===== | ||
+ | |||
+ | Простая конфигурация маршрутов для четырёх каналов, при которой 2 стерео-канала (№0 и №1) перенаправляются в тыловые каналы (№2 и №3). Сделать это можно при помощи плагина "[[http://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html#pcm_plugins_route|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 под названием "[[http://alsa.opensrc.org/Dmix|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-плагин "[[http://alsa.opensrc.org/Dsnoop/|dsnoop]]" | ||
+ | |||
+ | pcm.dsnooper { | ||
+ | type dsnoop | ||
+ | ipc_key 234886 | ||
+ | ipc_perm 0660 | ||
+ | slave.pcm "hw:0,0" | ||
+ | } | ||
+ | |||
+ | ==== Дуплекс ==== | ||
+ | |||
+ | Чтобы приложения могли использовать одно устройство для записи и воспроизведения звука, нам нужно "дуплексное" устройство. Т.е. такое устройство, которое имеет канал для захвата звука и независимый канал для воспроизведения звука. Для этого используем ALSA-плагин "[[http://alsa.opensrc.org/Asym|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" | ||
+ | } | ||
+ | |||
+ | ===== Шумоподавитель ===== | ||
+ | |||
+ | Примитивный шумодав (написан правильно, но на деле очень плохо работает), входящий в набор "[[http://www.ladspa.org/cmt/|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, реализующий функции эквалайзера. В качестве этого плагина зачастую выбирают плагин [[http://quitte.de/dsp/caps.html#Eq2x2|Eq2x2]], входящий в состав набора [[http://quitte.de/dsp/caps.html|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...'' | ||
+ | |||
+ | {{:alsamixer-choose-soundcard.png}} | ||
+ | |||
+ | после чего ввести в поле названия звуковой карты "**equal**" | ||
+ | |||
+ | {{:alsamixer-soundcard-equal.png}} | ||
+ | |||
+ | Поле этого на экране появятся настройки 10-полосного эквалайзера | ||
+ | |||
+ | {{:alsamixer-equalizer.png}} | ||
+ | |||
+ | Настроив эквалайзер, можно воспроизводить звук через него, указывая в качестве устройства вывода звука **equalplug**. Например, | ||
+ | |||
+ | mplayer -ao alsa:device=equalplug audiofile.flac | ||
+ | |||
+ | или | ||
+ | |||
+ | aqualung -d equalplug | ||
+ | |||
+ | ===== Устройство по умолчанию (default) ===== | ||
+ | |||
+ | Не все программы позволяют пользователю указать в явном виде, какое аудиоустройство использовать. Вместо этого почти все они ищут в системе устройство по умолчанию ("default"). Для того, чтобы взять это устройство под свой контроль, создаём запись для него, направив весь звук (как записываемый, так и воспроизводимый) из него в ранее созданное дуплексное устройство. | ||
+ | |||
+ | pcm.!default { | ||
+ | type plug | ||
+ | slave.pcm "duplexasym" | ||
+ | #slave.pcm "hw:0,0" | ||
+ | } | ||
+ | |||
+ | ===== Результирующий файл ====== | ||
+ | |||
+ | <file txt .asoundrc> | ||
+ | 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" | ||
+ | } | ||
+ | </file> | ||
+ | |||
+ | <file txt .asoundrc> | ||
+ | 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" | ||
+ | } | ||
+ | </file> | ||
+ | |||
+ | ====== Тест возможностей звуковой карты ====== | ||
+ | |||
+ | 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 |