Конфиг:asoundrc, параллельный вывод звука на несколько выходов или карт

Материал из Linux Wiki
Перейти к: навигация, поиск

Конфиг для ALSA, представленный ниже, позволяет одновременно выводить звук от одного источника (плеера, например) одновременно на несколько выходов или даже разные звуковые карты, что может быть полезно, например, при сравнении их звучания.

В примере ниже используется конфигурация с двумя выходами одной карты; звук подается одновременно на аналоговый - hw:1,0 - и оптический S/PDIF (Toslink) - hw:1,1.

В нижней части конфига описываются выходы карт - pcm.analog и pcm.digital - а также указывается микшер для нужной карты (это может быть полезно для выравнивания выходных уровней встроенного в карту ЦАПа и внешнего, подключенного к S/PDIF). В принципе, описывать выходы было не обязательно, их в данном случае можно было напрямую указать в описании виртуального устройства, может пригодиться и такой вариант - он позволит указывать карту в источниках звука по имени.

Далее из двух двухканальных выходов собирается виртуальная четырехканальная звуковая карта - pcm.multi. В этой части конфига указываются подчиненные устройства - slaves.a и slaves.b, а также делается привязка выходов реальных карт к выходам виртуальной.

И напоследок ключевой момент данной конфигурации - создание еще одного виртуального устройства и описание таблицы роутинга между его выходами и выходами 4-хканальной карты. В данном случае с 0-го выхода устройства allcard сигнал подается на 0 и 2 выходы устройства multi, а с 1 - соответственно, на 1 и 3. Для всех каналов уровень сигнала равен 1 (т.е., 100%. Данный параметр также можно использовать для согласования выходных уровней разных карт/выходов между собой).

Теперь осталось только указать allcard в качестве устройства для вывода звука в плеере.


#pcm.allcard {
#        type plug
#        slave {
#                pcm "both"
#        }
#}
 
#pcm.both {
pcm.allcard {
        type route
        slave {
                pcm multi
                channels 4
        }
 
        ttable.0.0 1.0
        ttable.1.1 1.0
        ttable.0.2 1.0
        ttable.1.3 1.0
}
 
pcm.multi {
        type multi
        slaves.a {
                pcm "analog"
                channels 2
        }
        slaves.b {
                pcm "digital"
                channels 2
        }
        bindings.0.slave a
        bindings.0.channel 0
 
        bindings.1.slave a
        bindings.1.channel 1
 
        bindings.2.slave b
        bindings.2.channel 0
 
        bindings.3.slave b
        bindings.3.channel 1
}
 
pcm.analog {
        type hw
        card 1
        device 0
}
pcm.digital {
        type hw
        card 1
        device 1
}
 
ctl.allcard {
        type hw
        card 1
}

Ссылки