alsa и две звуковые карты

Virkom, нужно делать картинки превьюшками
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
akorop
А вместо этого номер карты надо взять из "имени файла" card* в каталоге, соответствующем PCI-адресу выбранной карты.
да, будет работать

Virkom, привяжи список к PCI
будет как то так
Port CA0106 [0000:00:01.1] CA0106, CA0106 [hw:2]
Port CA0106 [0000:00:14.2] CA0106, CA0106 [hw:0]
Port CA0106 [0000:00:06.1] CA0106, CA0106 [hw:1]

ls /sys/bus/pci/devices/*/sound/
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Итак, делюсь опытом.

Первым делом нужно узнать, по какому пути регистируются звуковушки. Для этого надо дать команду
udevadm monitor --kernel --property --subsystem-match=sound
и каким-то образом сделать так, чтобы карты переопределились. Для USB - легко. Просто переткнуть. Для PCI - нужно выгрузить и загрузить модуль ядра.
Модуль ядра можно узнать командой
lsmod | grep snd
У меня это snd_oxygen (для карточек Xonar DG).
Дальше выгружаю модуль:
sudo rmmod snd_oxygen
и получаю сообщение о том, что модуль занят и выгрузить его невозможно. Что может его занимать? Правильно, pulseaudio. Задача - убить pulseaudio и быстро дать команду rmmod. Быстро потому, что pulseaudio тут же перезагрузится заново.

sudo killall pulseaudio
sudo rmmod snd_oxygen
Модуль выгрузился.
Ну и заново его загружаем:
sudo modprobe snd_oxygen

В это время в отдельной вкладке терминала работает программка udevadm и она показала следующее:

monitor will print the received events for:
KERNEL - the kernel uevent

KERNEL[8590.844301] add     [b] /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0[/b] (sound)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0
SEQNUM=2827
SUBSYSTEM=sound

KERNEL[8590.844393] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0/controlC0 (sound)
ACTION=add
DEVNAME=/dev/snd/controlC0
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0/controlC0
MAJOR=116
MINOR=14
SEQNUM=2828
SUBSYSTEM=sound

KERNEL[8590.844418] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0/pcmC0D0p (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC0D0p
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0/pcmC0D0p
MAJOR=116
MINOR=15
SEQNUM=2829
SUBSYSTEM=sound

KERNEL[8590.844444] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0/pcmC0D0c (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC0D0c
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0/pcmC0D0c
MAJOR=116
MINOR=16
SEQNUM=2830
SUBSYSTEM=sound

KERNEL[8590.844513] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0/pcmC0D1p (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC0D1p
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0/pcmC0D1p
MAJOR=116
MINOR=17
SEQNUM=2831
SUBSYSTEM=sound

KERNEL[8590.845604] change   /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0 (sound)
ACTION=change
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0
SEQNUM=2832
SUBSYSTEM=sound

KERNEL[8590.847581] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0/pcmC0D1c (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC0D1c
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card0/pcmC0D1c
MAJOR=116
MINOR=18
SEQNUM=2833
SUBSYSTEM=sound

KERNEL[8593.352313] add      [b]/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3[/b] (sound)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3
SEQNUM=2834
SUBSYSTEM=sound

KERNEL[8593.352423] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3/controlC3 (sound)
ACTION=add
DEVNAME=/dev/snd/controlC3
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3/controlC3
MAJOR=116
MINOR=19
SEQNUM=2835
SUBSYSTEM=sound

KERNEL[8593.352449] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3/pcmC3D0p (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC3D0p
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3/pcmC3D0p
MAJOR=116
MINOR=20
SEQNUM=2836
SUBSYSTEM=sound

KERNEL[8593.352496] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3/pcmC3D0c (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC3D0c
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3/pcmC3D0c
MAJOR=116
MINOR=21
SEQNUM=2837
SUBSYSTEM=sound

KERNEL[8593.352521] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3/pcmC3D1p (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC3D1p
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3/pcmC3D1p
MAJOR=116
MINOR=22
SEQNUM=2838
SUBSYSTEM=sound

KERNEL[8593.352568] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3/pcmC3D1c (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC3D1c
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3/pcmC3D1c
MAJOR=116
MINOR=23
SEQNUM=2839
SUBSYSTEM=sound

KERNEL[8593.353777] change   /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3 (sound)
ACTION=change
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card3
SEQNUM=2840
SUBSYSTEM=sound

KERNEL[8595.856346] add     [b] /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4[/b] (sound)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4
SEQNUM=2841
SUBSYSTEM=sound

KERNEL[8595.856527] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4/controlC4 (sound)
ACTION=add
DEVNAME=/dev/snd/controlC4
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4/controlC4
MAJOR=116
MINOR=24
SEQNUM=2842
SUBSYSTEM=sound

KERNEL[8595.856550] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4/pcmC4D0p (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC4D0p
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4/pcmC4D0p
MAJOR=116
MINOR=25
SEQNUM=2843
SUBSYSTEM=sound

KERNEL[8595.856568] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4/pcmC4D0c (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC4D0c
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4/pcmC4D0c
MAJOR=116
MINOR=26
SEQNUM=2844
SUBSYSTEM=sound

KERNEL[8595.860227] change   /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4 (sound)
ACTION=change
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4
SEQNUM=2845
SUBSYSTEM=sound

KERNEL[8595.860262] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4/pcmC4D1p (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC4D1p
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4/pcmC4D1p
MAJOR=116
MINOR=27
SEQNUM=2846
SUBSYSTEM=sound

KERNEL[8595.860282] add      /devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4/pcmC4D1c (sound)
ACTION=add
DEVNAME=/dev/snd/pcmC4D1c
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card4/pcmC4D1c
MAJOR=116
MINOR=28
SEQNUM=2847
SUBSYSTEM=sound

То, что нужно, я попытался выделить жирным, но, к сожалению, внутри кода это делать нельзя. Кому интересно - может запустить поиск по BB-code.

Следующий пункт - создаем файлик правил для udev:

sudo nano /etc/udev/rules.d/85-xonar-audio.rules
С содержимым:

SUBSYSTEM!="sound", GOTO="xonar_audio"
ACTION!="add", GOTO="xonar_audio"

DEVPATH=="/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:00.0/sound/card?", ATTR{id}="Xonar_DG_1"
DEVPATH=="/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:02.0/sound/card?", ATTR{id}="Xonar_DG_2"
DEVPATH=="/devices/pci0000:00/0000:00:1c.1/0000:04:00.0/0000:05:04.0/sound/card?", ATTR{id}="Xonar_DG_3"

LABEL="xonar_audio"
Скопированы пути и вместо card0, card1, card2... вставлено "card?". Потому как при загрузке драйвера карточке может присвоиться любой номер. В конце строки для карточки устанавливается айдишник. Использовать можно только буквы, цифры и знак подчеркивания.

Едем дальше.
Сохраняем файл и, для того, чтобы правила применились, опять же убиваем пульс, делаем rmmod и modprobe.
Теперь все выглядит вот так:

$ cat /proc/asound/cards

 0 [Xonar_DG_1     ]: CMI8786 - Xonar DG
                      C-Media Oxygen HD Audio at 0xc200, irq 17
 1 [NVidia_1       ]: HDA-Intel - HDA NVidia
                      HDA NVidia at 0xf7080000 irq 17
 2 [NVidia         ]: HDA-Intel - HDA NVidia
                      HDA NVidia at 0xf3080000 irq 17
 3 [Xonar_DG_2     ]: CMI8786 - Xonar DG
                      C-Media Oxygen HD Audio at 0xc100, irq 19
 4 [Xonar_DG_3     ]: CMI8786 - Xonar DG
                      C-Media Oxygen HD Audio at 0xc000, irq 17

Все. Каждой карте присвоен свой айдишник в зависимости от места на pci-шине.
Обращаться к каждой карточке можно с помощью hw:<ID>. Т.е. в моем случае:

aplay -D hw:Xonar_DG_1

Теперь совершенно без разницы, какой номер карте выдался. hw:0, hw:1, hw:2.... Можно обращаться по ID. А ID, в свою очередь привязан к PCI-шине.
Вот как-то так.

P.S.: Кстати, накатал в консоли сервера быстренько программку на Java, которая выдаст всю информацию по карточкам. И внутри самой Java в качестве name карты определяется как раз этот ID, который прописан в UDEV.
Выглядит примерно так: http://www.picshare.ru/uploads/170731/0V72ydusqP.jpg
Не красиво, конечно, но с этим по крайней мере уже можно поиграться. Поменять ID, сортировку в списке и т.д.
 
Зарегистрироваться или войдите чтобы оставить сообщение.