Alsa USB-Audio-Hotplug

9450
kolypto

Mein neuer USB-Audio-Lautsprecher erschien als zweites Gerät in Alsa. Ich habe es geschafft, es zur primären zu machen:

$ 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 

indem Sie diese Zeilen hinzufügen /etc/modprobe.d/alsa-base.conf:

options snd_hda_intel index=1 options snd_usb_audio index=0 

Wenn ich jetzt boote, funktioniert USB-Audio standardmäßig überall. Das Problem ist - wenn ich die Verbindung trenne (oder boote ohne), sehe ich

$ cat /proc/asound/modules  1 snd_hda_intel 

und nichts funktioniert, weil es kein 0-th Gerät gibt:

$ aplay ALSA lib confmisc.c:768:(parse_card) cannot find card '0' 

Was ich möchte, ist eine Möglichkeit, Geräteindizes neu zuzuweisen. Wenn die Lösung ein Skript ist, werde ich damit eine udev-Regel erstellen.

Momentan ändere ich 'index =?' zurück auf die Standardeinstellung '0,1', aufrufen alsa force-reloadund es hilft. Besserer Weg?

Hinweis: Es gibt keine asoundconfin meiner Distribution (KUbuntu Lucid) :(

2

4 Antworten auf die Frage

2
user47877

Installieren Sie asoundconf-gtk, aber achten Sie auf https://bugs.launchpad.net/ubuntu/+source/asoundconf-gtk/+bug/575058

1
kolypto

Lassen Sie uns zunächst auf die Indizes von Alsa-Geräten eingehen. Schließen Sie Ihren USB-Lautsprecher an und rufen Sie ihn auf, sudo alsa force-reloaddamit Alsa ihn findet.

Listet Kartenindizes und ihre Treiber auf:

$ cat /proc/asound/modules  0 snd_hda_intel 1 snd_usb_audio 

Detaillierte Informationen anzeigen:

$ 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 

Wir möchten 'Speaker' mit Index = 0 haben.

Fügen Sie diese Zeilen hinzu, /etc/modprobe.d/alsa-base.confum den USB-Lautsprecher (falls vorhanden) zum Standardgerät zu machen:

options snd_hda_intel index=-2 options snd_usb_audio index=-1 

Dies macht USB-Lautsprecher vorzuziehen gegenüber der Builtin-Karte. Ausgabe sudo alsa force-reload, voila! Jetzt können Sie sehen, cat /proc/asound/cardswie Karten angezeigt werden und verschwinden, wenn Sie Ihren USB-Lautsprecher ein- oder ausschalten.


Hier ist eine weitere Quittung, wie Sie auswählen können, welche der 2 verfügbaren Karten die nächste gestartete Anwendung verwenden wird.

Fügen Sie diese Zeilen zu /etc/asound.conf hinzu:

$ 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 ; } } 

Dadurch werden zwei 'dmix'-Wiedergabegeräte erstellt:' card0 'und' card1 '. Sie können problemlos zwischen ihnen wechseln.

Nun füge das in ~ / .asoundrc ein:

# 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 

auf die zweite Karte wechseln. Ersetzen Sie alle '1' durch '0', um zurückzuschalten. Ein kleines Skript wird hilfreich sein :)

HINWEIS: In diesem Handbuch wurden mehrere neue Alsa-Geräte erstellt: 'this', 'card0-hw', 'card0', 'card1-hw', 'card1'. Sie können sich auf sie beziehen:

$ amixer -D 'this' scontrols Simple mixer control 'PCM',0 

PS Ich bin nicht damit einverstanden, wie Alsa wirklich funktioniert und vielleicht schreckliche Fehler gemacht hat :) Bitte korrigieren Sie mich, wenn es einen besseren Weg gibt. Aber das funktioniert trotzdem :)

0
Steve Rinsler

Ich habe die einfache Bearbeitung der alsa-base.conf ausprobiert, die Onboard auf -2 und die USB auf -1 gesetzt hat, aber das hat nicht funktioniert.

Wenn ich jedoch BEIDE auf -1 setze (wobei das Onboard zuerst aufgeführt wird), könnte ich hin und her wechseln.

Ich muss jedoch bei jeder Änderung ein alsa-Force-Reload durchführen.

0
Daniele

Ich versuche, das gleiche Problem zu lösen: Automatisches Umleiten des Audiostreams, wenn eine USB-Soundkarte an das System angeschlossen ist. Daher habe ich beschlossen, eine neue Regel für udev zu schreiben:

/etc/udev/rules.d/50-alsa.rules:

SUBSYSTEMS=="usb", ATTRS=="****", ATTRS=="****", RUN+="/usr/local/bin/alsa-switch.sh" 

natürlich müssen Sie die '*' durch Nummern entsprechend Ihrem Gerät ersetzen (verwenden Sie lsusb, um zu wissen, welche)

Das alsa-switch.shSkript ist sehr einfach:

#!/bin/sh ln -sf /path/to/custom/asoundrc /home/<user>/.asoundrc 

Eine andere Regel kann hinzugefügt werden, um die Konfiguration wiederherzustellen, wenn das Gerät entfernt wird (sorry, ich arbeite noch daran)