Зміст

ALSA

Все пользовательские настройки устройств хранятся в файле ~/.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)

Не все программы позволяют пользователю указать в явном виде, какое аудиоустройство использовать. Вместо этого почти все они ищут в системе устройство по умолчанию (“default”). Для того, чтобы взять это устройство под свой контроль, создаём запись для него, направив весь звук (как записываемый, так и воспроизводимый) из него в ранее созданное дуплексное устройство.

pcm.!default {
    type plug
    slave.pcm "duplexasym"
    #slave.pcm "hw:0,0"
}

Результирующий файл

.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"
}
.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"
}

Тест возможностей звуковой карты

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