понедельник, 3 ноября 2008 г.

ALSA configuration tree

Система управления проигрыванием и записью звука в Линуксе ALSA дает очень много возможностей для настройки. Конфигурация ALSA представляет собой дерево: ее составные (compound) переменные могут включать в себя поименованные ссылки на другие переменные, которые в свою очередь также могут быть составными. Кроме составных переменных, в этом дереве еще могут быть текстовые строки, целые числа, дробные числа и 64битные целые числа (почему-то это отдельный тип). У каждой переменной есть имя внутри своего узла, поэтому на любую переменную можно сослаться выражением типа


pcm.cowbell.slave.type


Чем-то это напоминает мне SNMP.

Настройки, грубо говоря, хранятся в трех файлах:




/usr/share/alsa/alsa.conf
а на Федоре это /etc/alsa/alsa.conf

Настройки данной версии программы ALSA
/etc/asound.conf
Настройки для данной машины
~/.asoundrc
Настройки пользователя. Это место не стоит использовать для описания физических устройств, но можно описать тут разные виртуальные миксеры и прочее


Обо всем этом хорошо написано в http://www.volkerschatz.com/noise/alsa.html. А здесь я хочу написать вот о чем.

Разделы дерева конфигурации



/

pcm/
Именованные ссылки на описания устройств, пригодных для проигрывания и записи.
Например:
Команды aplay -Dcowbell bang.wav или arecord -Dcowbell bang.wav говорят ALSA, что описание устройства нужно прочитать из составной переменной pcm.cowbell.
Команда aplay -Dhw:0,0 ведет вот в это место файла alsa.conf


pcm.hw {
@args [ CARD DEV SUBDEV ]
@args.CARD {
type string
default {
@func getenv
vars [
ALSA_PCM_CARD
ALSA_CARD
]
default {
@func refer
name defaults.pcm.card
}
}
}
@args.DEV {
type integer
default {
@func igetenv
vars [
ALSA_PCM_DEVICE
]
default {
@func refer
name defaults.pcm.device
}
}
}
@args.SUBDEV {
type integer
default {
@func refer
name defaults.pcm.subdevice
}
}
type hw
card $CARD
device $DEV
subdevice $SUBDEV
hint {
show {
@func refer
name defaults.namehint.extended
}
description "Direct hardware device without any conversions"
}
}

Этот код говорит, куда нужно поставить параметры, идущие после "hw:" в опции -D.
Можно видеть, что устройство hw, вызываемое конструкцией -Dhw:x,y[,z] - это оболочка для встроенного типа PCM-устройств "hw".


pcm_slave/
Поименованные описания нижележащих устройств для конструкций, использующих нижележащие устройства. Например:


pcm_slave.bling {
pcm {
type hw
card 0
device 0
}
}

pcm.blang {
type plug
slave bling
}


Строка "bling" в поле slave объекта pcm.blang указывает на объект в поле "blang" объекта pcm_slave.



pcm_type

Позволяет определять новые символические названия типов устройств, управлением которыми могут заниматься подключаемые библиотеки. Не вникал.

ctl_type/
ctl/

Похоже, здесь некоторые описания параметров для миксера


rawmidi_type/
rawmidi/
seq_type/
seq/
Это все что-то для МИДИ


server/
pcm_scope/
pcm_scope_type/
pcm_hook/
pcm_hook_type/
hook_args/
Вообще не понял.