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 при каждом изменении.

Другие вопросы по тегам