Soundkarte unter Debian mit ALSA
 

Die Soundkarte unter Linux zum laufen zu bringen ist heutzutage dank Plug and Play-Technik kein Hexenwerk mehr. Mußte man noch für alte ISA-Karten IRQs, DMAs und Speicherbereiche festlegen, erledigen das heutige PCI-Karten automatisch. Nur selten muß man die Karte von Hand konfigurieren. Lange Zeit war unter Linux das OSS (Open Sound System) Standard, was aber mittlerweile von ALSA (Advanced Linux Sound Architecture) abgelöst wurde. ALSA besteht aus Linux-Kernelmodulen, die verschiedene Kerneltreiber für Soundkarten bereitstellen. Die Treiber für Soundhardware sind bei ALSA modularisiert. ALSA benötigt eigene Treiber für die anzusprechenden Geräte, weshalb OSS-Treiber nicht weiter verwendet werden können. Unter Debian gibt es fertige Pakete für ALSA. Die hier gezeigte Konfiguration bezieht sich auf Debian - Codename Lenny.

Schon bei der Installation von Debian Lenny wird das Paket alsa-base installiert, welches die entsprechenden Soundkarten-Treibermodule enthält. Ob die ALSA-Module geladen und verwendet werden, sieht man am besten mit
# lsmod | grep snd
noch zu empfehlen ist das Paket alsa-utils, welches einen Wave-Player für die Kommandozeile mitbringt (zum Testen der Audioausgabe) und allerlei nützliche Tools enthält.

ALSA- Module fangen immer mit der Bezeichnung snd_ an. Sind sie geladen, kann die Soundhardware schon mit Standardeinstellungen verwendet werden und funktioniert eventuell ohne Probleme. Lediglich für detailiertere Einstellungen benötigt man die Datei asound.conf oder .asoundrc. Erstere befindet sich unter /etc/asound.conf und gilt Systemweit für alle User, während die Datei .asoundrc im Homeverzeichnis des Benutzers liegt und Benutzerspezifische Einstellungen erlaubt. Existieren beide Dateien, werden die persönlichen Einstellungen in der .asoundrc den systemweiten Einstellungen in der asound.conf vorgezogen, bzw. die Einstellungen der .asoundrc überlagern die Einstellungen der asound.conf. Für genauere Details zu den möglichen Einstellungen schaut euch die ALSA-Documentation auf der ALSA-Homepage an. Ich zeige hier nur eine simple Konfiguration, die vorraussetzt, daß ALSA die Soundhardware korrekt erkannt hat und die entsprechenden Module geladen hat, was bei meinen 3 Rechnern auf denen ich Linux getestet habe, jedes mal der Fall war.

Eine Auflistung der konfigurierten Karten sieht man unter:
# cat /proc/asound/cards
oder auch mit dem ALSA-Befehl
# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: V8235 [VIA 8235], device 0: VIA 8235 [VIA 8235]
Subdevices: 4/4
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
card 0: V8235 [VIA 8235], device 1: VIA 8235 [VIA 8235]
Subdevices: 1/1
Subdevice #0: subdevice #0

(Hier für einen VIA-AC97-Onboard-Chip)

Genauere Informationen liefert auch:
# aplay -L
default:CARD=V8235
VIA 8235, VIA 8235
Default Audio Device
front:CARD=V8235,DEV=0
VIA 8235, VIA 8235
Front speakers
surround40:CARD=V8235,DEV=0
VIA 8235, VIA 8235
4.0 Surround output to Front and Rear speakers
surround41:CARD=V8235,DEV=0
VIA 8235, VIA 8235
4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=V8235,DEV=0
VIA 8235, VIA 8235
5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=V8235,DEV=0
VIA 8235, VIA 8235
5.1 Surround output to Front, Center, Rear and Subwoofer speakers
iec958:CARD=V8235,DEV=0
VIA 8235, VIA 8235
IEC958 (S/PDIF) Digital Audio Output
null
Discard all samples (playback) or generate zero samples (capture)
default:CARD=UART
MPU-401 UART
Default Audio Device

Den Befehl aplay -L benötigen wir später noch zum festlegen der Default-Soundkarte bei Verwendung von mehreren Soundkarten. Hat man ähnliche Ausgaben mit den oben genannten Befehlen, ist die Soundkarte eigentlich schon Einsatzbereit und müßte funktionieren. Sollte dies dennoch nicht der Fall sein, gibt es den nützlichen Befehl alsaconf.
Auf der Kommandozeile ausgeführt, startet er ein kleines Skript, welches das System nach der zur Verfügung stehenden Soundhardware scannt und diese für eine Auswahl auflistet. Man wählt dann einfach die entsprechende Hardware und alsaconf lädt die entsprechenden Module und schreibt die Einstellungen.
Die dafür wichtigste Datei nennt sich sound, liegt im Verzeichnis /etc/modprobe.d und wird von alsaconf erstellt. In ihr sind die alias-Beschreibungen für die Soundhardware zu finden. So ein Eintrag von alsaconf erstellt kann z.B. so aussehen:

alias snd-card-0 snd-hda-intel
options snd-hda-intel index=0

Dazu kurz noch ein paar Sätze zu Debian. Früher wurde die gesamte Modul-Konfiguration in einer einzigen Datei durchgeführt. Entweder /etc/modprobe.conf oder /etc/modules. Neuere Debian-Releases mit Kernel 2.6 haben für die Konfiguration der Module nicht mehr eine einzige Datei, sondern ein ganzes Verzeichnis namens /etc/modprobe.d, in welchem die einzelnen Konfigurations-Dateien für die Module abgelegt sind. Im Falle von ALSA ist das eben die Datei sound (in Zukunft sound.conf), welche die alias-Namen und die Optionen vergibt. Siehe hierzu auch Hinweis zu den Konfigurations-Dateien in /etc.

Noch ein Hinweis: Sollte trotz der Konfiguration mit alsaconf die Karte stumm bleiben, lohnt sich die Installation des alsa-mixers, Paketname alsamixergui. Ruft man denselbigen dann im Startmenü unter Multimedia auf, sollte man kontrollieren, ob die Ausgänge überhaupt aktiviert sind, oder doch stumm geschaltet. ;-)

Konfiguration von mehreren Soundkarten

Bei mehreren Soundkarten, ob nun Onboard oder PCI, muß man sich eines kleinen Tricks bemühen. ALSA ist in der Lage mehrere Soundkarten zu verwalten. Warum aber eine entsprechende Option in die alsaconf nicht integriert wurde um gleich mehrere Soundkarten zu erfassen und einzurichten, ist mir ein Rätsel. Die Vorgehensweise ist jedoch recht einfach. Zuerst Konfiguriert man mit alsaconf die erste Soundkarte und macht von der Datei /etc/modprobe.d/sound eine Sicherheitskopie mittels
# cp /etc/modprobe.d/sound /etc/modprobe.d/sound.bak

Anschließend startet man wieder alsaconf und wählt die zweite Karte aus. Im Zuge der Konfiguration überschreibt alsaconf die Datei sound mit den alias-Einträgen der zweiten Karte. Nun kopiert man mittels des Befehls
# cat /etc/modprobe.d/sound.bak >> /etc/modprobe.d/sound
die alias-Einträge der ersten Karte zu den Einträgen der zweiten Karte hinzu. Die Datei Sound könnte dann in etwa so aussehen:

alias snd-card-0 snd-cs4281
options snd-cs4281 index=0

alias snd-card-0 snd-via82xx
options snd-via82xx index=0

(hier für eine Crystel-Logic und einen VIA-Onboard-AC97-Soundchip)
Abschließend muß man die Datei noch in einem Editor öffnen, z.B.
# nano /etc/modprobe.d/sound
und die alias-Einträge der unteren Karte von der Nummerierung her ändern:

alias snd-card-0 snd-cs4281
options snd-cs4281 index=0

alias snd-card-1 snd-via82xx
options snd-via82xx index=1

Nach einem Neustart (sind wir hier etwa bei Windows?) lassen sich beide Karten in den Soundprogrammen die ALSA unterstützen ansprechen. Man kann auch ohne Neustart mittels dem Befehl
# alsa force-reload
die Konfiguration neu einzulesen, hatte aber bei mir nicht denselben Effekt wie ein Neustart, da manche Soundhardware, die nicht einer Soundkarte entspringt, z.B. das Micro einer Webcam oder der HD-Sound einer Grafikkarte nicht von Alsa erfasst werden, sondern automatisch beim Start von udev eingerichtet werden. Daher kann es gut sein, daß nach einem reload von Alsa diese Dinge nicht mehr funktionieren und eben erst wieder, wenn man neugestartet hat.


Auswahl bei 2 Soundkarten für die KDE-Systemsounds

Will man eine bestimmte Karte z.B. für die Systemsounds für KDE auswählen, kommen wir hier nun zu der oben angesprochenen Default Einstellung. Bei reiner Verwendung der ALSA-Einstellung im KDE-Dialog hat eine direkte Sound-Device-Auswahl ala /etc/dsp (1. Karte) oder /etc/dsp1 (2.Karte) keinerlei Wirkung mehr (war zumindest bei mir so auf meinem Testsystem), daher gibt es für die Auswahl nur zwei Möglichkeiten:

Möglichkeit 1: ist ohne eine Default-Einstellung für die Soundkarte und beinhaltet lediglich, daß man die Karte, welche man verwenden will, in der Datei sound als card-0 definiert. KDE nimmt per Default die erste definierte Soundkarte.

Möglichkeit 2: ist die Karte per Default-Einstellung festzulegen. Dazu holt man sich erstmal die Informationen über den Namen der Karte mittels des Befehls aplay -L
(die benötigte Bezeichnung ist fett dargestellt):
# aplay -L
default:CARD=V8235
VIA 8235, VIA 8235
Default Audio Device
front:CARD=V8235,DEV=0
VIA 8235, VIA 8235
Front speakers
......

Dann legt man eine Datei namens asound.conf unter /etc an (falls sie nicht schon vorhanden ist) und schreibt folgende Zeile rein:
pcm.!default front:V8235
Nach einem anschließendem Neustart des Systems, wird diese Karte per Default von allen Soundprogrammen mit ALSA verwendet. Leider hatte ich mit Methode 2 unter einem Debian lenny 64-Bit System ein großes Problem mit der Soundwiedergabe, daher ist meine favorisierte Wahl Methode 1. Das Problem äußerte sich folgendermaßen:

Probleme mit der Soundwiedergabe unter Debian lenny mit 64-Bit-Kernel und KDE

Nach dem Start von Debian lenny kommt zwar der System-Start-Sound von KDE, aber andere Anwendungen wie z.B. der Flashplayer im Firefox oder der RealPlayer bleiben stumm. Im Falle des RealPlayers schließt dieser sich sofort nach dem Öffnen wieder. Ein Start des RealPlayers von der Konsole aus, liefert folgende Fehlermeldung:

ALSA lib ../../../src/pcm/pcm_dmix.c:996:(snd_pcm_dmix_open) unable to open slave

In den Einstellungen im RealPlayer unter "Extras/Einstellungen/Hardware" ist als PCM-Gerät cards.pcm.default eingetragen. Macht man einen Soundtest des Geräts mittels

# speaker-test -channels 2 --device cards.pcm.default

erscheint eine ähnliche Fehlermeldung:

ALSA lib pcm_dmix.c:996:(snd_pcm_dmix_open) unable to open slave
Playback open error: -16,Das Gerät oder die Ressource ist belegt

Läßt man den Soundtest weiter ackern, kann es sein, daß sich nach ca. 30 Sekunden dann doch was tut und auf einmal alles funktioniert. Solange, bis man durch eine Änderung der Sound-Einstellungen im Kontrollzentrum von KDE den Soundserver neu startet. Dann kann es wieder besagte 30 Sekunden dauern, bis die Soundausgabe auch auf anderen Geräten funktioniert. Wohlgemerkt, nur bei Dauerbeanspruchung, also wenn man die Fehlermeldungen ignoriert und permanent versucht, etwas auf dem belegten Slave auszugeben!

Das Auftreten dieses Phänomen konnte ich eindeutig Methode 2 zuordnen, also die Verwendung der asound.conf zum Eintragen einer Default-Karte. In dem Fall war die verwendete Soundkarte ein Onboard HD-Chip von Intel auch Azalia genannt. Dabei war es unerheblich ob ich eine /etc/modprobe.d/sound Datei verwendet hatte oder nicht. Natürlich muß man beim weglassen der asound.conf und dem vorhandensein mehrerer Sound-Devices eine /etc/modprobe.d/sound Datei mittels alsaconf anlegen lassen, da KDE sonst unter Umständen das falsche Device als Standard nimmt (-> Methode 1).

Eine Ausgabe was eigentlich den Sound belegt, liefert folgender Befehl:
# lsof -w $( find /dev -group audio )

Noch zwei Hinweise:

  • Zum Testen der Soundhardware auf der Kommandozeile eignet sich der aplay-Befehl auch:
    # aplay -D hw:0,0 Wavefile.wav
    aplay
    - der ALSA-Player
    Option -D für die Auswahl der Soundhardware, hier hw:0,0 (die 1. Karte).
    hw:1,0 für die 2. Karte.

  • Möchte man ein unliebsames Gerät wie z.B. das Micro einer Webcam davon abhalten, sich als Default-Sound-Karte in den Vordergrund zu schieben, kann man das auch mittels folgendem Eintrag in der Datei /etc/modprobe.d/sound bewerkstelligen:

    alias snd-card-0 snd-hda-intel
    options snd-hda-intel index=0
    options snd-usb-audio index=-2


    Der negative Index verhindert, daß das USB-Micro der Webcam sich als Default einträgt. Dazu kann man sich auch die untersten Zeilen der Datei /etc/modprobe.d/alsa-base anschauen. Interessant ist die Zeile:
    # Prevent abnormal drivers from grabbing index 0

  • Hinweis zu Grafikkarten mit HDMI-Soundausgabe

    Macht das HDMI Sounddevice Probleme, kann man es mit folgender Zeile in der Datei /etc/rc.local deaktivieren:
    Dazu muß man vorher die ID des Sounddevice herausfinden. Mittels
    # lspci | grep -i audio
    findet man folgende Zeile:
    01:00.1 Audio device: NVIDIA Corporation High Definition Audio Controller (rev a1)
    Anschließend sucht man mit
    # find /sys/devices -name *01:00.1
    das virtuelle Device. Der Eintrag in der rc.local lautet dann wie folgt:
    echo 1 > /sys/devices/pci0000\:00/0000\:00\:02.0/0000\:01\:00.1/remove