Alsa USB-Audio hotplug
Мой новый USB аудио динамик появился как второе устройство в Alsa. Мне удалось сделать его основным:
$ cat /proc/asound/modules
0 snd_usb_audio
1 snd_hda_intel
$ cat /proc/asound/cards
0 [Speaker ]: USB-Audio - uBoom Q Speaker
uBoom Q Speaker at usb-0000:00:1d.1-1, full speed
1 [Intel ]: HDA-Intel - HDA Intel
HDA Intel at 0x80000000 irq 16
добавив эти строки в /etc/modprobe.d/alsa-base.conf
:
options snd_hda_intel index=1
options snd_usb_audio index=0
Теперь при загрузке USB-Audio везде работает по умолчанию. Проблема - когда я отключаю его (или загружаю без него), я вижу
$ cat /proc/asound/modules
1 snd_hda_intel
и ничего не работает, потому что нет 0
-ое устройство:
$ aplay
ALSA lib confmisc.c:768:(parse_card) cannot find card '0'
То, что я хочу, это способ переназначения индексов устройства. Если решение - скрипт - я собираюсь создать с ним правило udev.
В настоящее время я меняю 'index=?' вернуться к значению по умолчанию "0,1", вызвать alsa force-reload
и это помогает. Есть ли лучший способ?
Примечание: нет asoundconf
в моем дистрибутиве (KUbuntu Lucid):(
4 ответа
Во-первых, давайте разберемся с индексами устройств Alsa. Подключите USB-динамик и вызовите sudo alsa force-reload
так Алса находит это.
Перечень карточных указателей и их драйверов:
$ cat /proc/asound/modules
0 snd_hda_intel
1 snd_usb_audio
Показать более подробную информацию:
$ cat /proc/asound/cards
0 [Intel ]: HDA-Intel - HDA Intel
HDA Intel at 0x80000000 irq 16
1 [Speaker ]: USB-Audio - uBoom Q Speaker
uBoom Q Speaker at usb-0000:00:1d.0-1, full speed
Мы хотим иметь "Speaker" с индексом = 0.
Добавьте эти строки в /etc/modprobe.d/alsa-base.conf
сделать USB-динамик устройством по умолчанию, если оно есть:
options snd_hda_intel index=-2
options snd_usb_audio index=-1
Это делает USB-динамик более предпочтительным, чем встроенная карта. вопрос sudo alsa force-reload
Вуаля! Теперь вы можете увидеть с cat /proc/asound/cards
как карты появляются и исчезают при подключении / отключении USB-динамика.
Вот еще одна квитанция о том, как выбрать, какую из 2 доступных карт будет использовать следующее запущенное приложение.
Добавьте эти строки в /etc/asound.conf:
$ cat /etc/asound.conf.switch
# CARD DEFINITIONS
#=== CARD 'card0'
pcm.card0-hw { type hw ; card 0 ; }
ctl.card0-hw { type hw ; card 0 ; }
pcm.card0 { type dmix ;
ipc_key 4109 ; ipc_perm 0660 ;
slave { pcm "hw:0,0"
channels 2 ; period_size 1024 ; buffer_size 4096 ; rate 44100 ; period_time 0 ;
}
bindings { 0 0 ; 1 1 ; }
}
#=== CARD 'card1'
pcm.card1-hw { type hw ; card 1 ; }
ctl.card1-hw { type hw ; card 1 ; }
pcm.card1 { type dmix ;
ipc_key 1949 ; ipc_perm 0660 ;
slave { pcm "hw:1,0"
channels 2 ; period_size 1024 ; buffer_size 4096 ; rate 44100 ; period_time 0 ;
}
bindings { 0 0 ; 1 1 ; }
}
Это создаст два устройства воспроизведения 'dmix': 'card0' и 'card1'. Они позволят вам без проблем переключаться между ними.
Теперь поместите это в ~/.asoundrc:
# Define new virtual devices
pcm.this { type plug ; slave.pcm "card1" ; }
ctl.this ctl.card1-hw
# Set default device
pcm.!default pcm.this
ctl.!default ctl.this
переключиться на вторую карту. Замените все "1" на "0", чтобы переключиться обратно. Небольшой скрипт пригодится:)
ПРИМЕЧАНИЕ. В этом руководстве мы создали несколько новых устройств Alsa: "this", "card0-hw", "card0", "card1-hw", "card1". Вы можете обратиться к ним:
$ amixer -D 'this' scontrols
Simple mixer control 'PCM',0
PS Я не знаком с тем, как на самом деле работает Alsa, и, возможно, допустил ужасные ошибки:) Пожалуйста, исправьте меня, если есть лучший способ. Но все же, это работает:)
Попробуйте установить asoundconf-gtk, но позаботьтесь о https://bugs.launchpad.net/ubuntu/+source/asoundconf-gtk/+bug/575058
Я пытаюсь решить ту же проблему: автоматически перенаправлять аудиопоток, когда звуковая карта USB подключена к системе, поэтому я решил написать новое правило для udev:
/etc/udev/rules.d/50-alsa.rules:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="****", ATTRS{idProduct}=="****", RUN+="/usr/local/bin/alsa-switch.sh"
конечно, вы должны заменить "*" на числа, соответствующие вашему устройству (используйте lsusb, чтобы узнать, какие из них)
alsa-switch.sh
Сценарий очень прост:
#!/bin/sh
ln -sf /path/to/custom/asoundrc /home/<user>/.asoundrc
Другое правило может быть добавлено, чтобы восстановить конфигурацию при удалении устройства (извините, я все еще работаю над этим)
Я попробовал простое редактирование alsa-base.conf, установив на борту -2, а usb на -1, но это не сработало.
однако, когда я установил ОБА в значение -1 (с указанием встроенной платы первым), я мог переключаться назад и вперед.
Тем не менее, мне нужно выполнять принудительную перезагрузку alsa при каждом изменении.