GästebuchIhr Eintrag in unser Gästebuch KontaktNehmen Sie Kontakt mit den Autoren auf ArchivAlle Unixwerk- Artikel seit 2003
23. Dezember 2007

Von OSS zu Alsa mit dem 2.4er Kernel

Inhalt

  1. Einleitung
  2. Neuen Kernel bauen
  3. ALSA Treiber übersetzen
  4. Kernel-Module laden
  5. ALSA konfigurieren

1. Einleitung

Mit dem 2.6er-Kernel ist ALSA ja schon lange Standard. Wer aber -wie ich- aus bestimmten Gründen noch auf einen Kernel der 2.4er-Serie angewiesen ist, bekommt zunächst einmal das Open Sound System (kurz OSS) angeboten. Dies hat mit meiner Soundkarte auch halbwegs gut geklappt, allerdings hat OSS einige eklatante Nachteile gegenüber ALSA. Einer ist, dass ein Programm, das die Soundkarte benutzt (z.B. xmms), das Gerät für alle anderen Programme blockiert.

Ein weiters Problem hatte ich mit dem Flashplayer-Plugin für Mozilla. Dieses liefert zwar Bilder, der Sound ist aber nur ein lautes Rauschen. So macht YouTube jedenfalls keinen Spaß...

Nun gibt es ALSA ja schon länger und auch ältere, auf den 2.4er-Kernel basierende Distributionen liefern normalerweise die ALSA-Module mit. Die mitgelieferten Module funktionieren aber nur mit dem Installationskernel. Da ich aber immer auf die neueste Version des 2.4er-Kernels setze, helfen diese leider nicht weiter.

Dieser Artikel beschreibt, wie man trotzdem zu einem vernünftigen Soundsystem kommt.

2. Neuen Kernel bauen

Zunächst einmal beschaffen wir uns die neuesten 2.4er-Kernelquellen und kopieren die alte Konfiguration in das Hauptverzeichnis der neuen Quellen:

tux:~# cd /usr/src
tux:/usr/src# tar xvjf linux-2.4.34.5.tar.bz2
tux:/usr/src# ln -s linux-2.4.34.5 linux
tux:/usr/src# cp linux-2.4.34.2/.config linux-2.4.34.5
tux:/usr/src# cd linux
tux:/usr/src/linux# make oldconfig

Der OSS-Support muss aus dem Kernel entfernt werden. In der Konfiguration wird Sound Support eingeschaltet, alle weiteren Soundkarten bezogenen Optionen werden jedoch abgeschaltet:

tux:/usr/src/linux# make menuconfig

Der neue Kernel wird kompiliert...

tux:/usr/src/linux# make dep clean bzImage modules modules_install

Nun wird der neuen Kernel installiert...

tux:/usr/src/linux# cp .config /boot/config-2.4.34.5-alsa
tux:/usr/src/linux# cp System.map /boot/System.map-2.4.34.5-alsa
tux:/usr/src/linux# cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.34.5-alsa
tux:/usr/src/linux# cd /
tux:/# ln -s /boot/vmlinuz-2.4.34.5-alsa vmlinuz-alsa

...danach die Konfiguration des Bootmanagers angepasst - im Falle von Lilo wird ein Eintrag für den neuen Kernel in der Datei /etc/lilo.conf verankert...

tux:/# vi /etc/lilo.conf
image = /vmlinuz-alsa
  root = /dev/hda6
  label = Alsa
  read-only

...und zu guter Letzt wird der Bootmanager neu geschrieben und das System neu gestartet:

tux:/# lilo
Added Alsa *

tux:/# reboot && logout

3. ALSA Treiber übersetzen

Die ALSA-Treiber habe ich von der ALSA-Homepage heruntergeladen und ins Verzeichnis /usr/src entpackt. Dort starte ich die Übersetzung mit...

tux:~# cd /usr/src/alsa-driver-1.0.13
tux:/usr/src/alsa-driver-1.0.13# ./configure
tux:/usr/src/alsa-driver-1.0.13# make
io.c:65: error: syntax error before "this_object_must_be_defined_as_export_objs_in_the_Makefile"
io.c:65: warning: type defaults to `int' in declaration of `this_object_must_be_defined_as_export_objs_in_the_Makefile'
io.c:65: warning: data definition has no type or storage class
io.c:97: error: syntax error before "this_object_must_be_defined_as_export_objs_in_the_Makefile"
io.c:97: warning: type defaults to `int' in declaration of `this_object_must_be_defined_as_export_objs_in_the_Makefile'
io.c:97: warning: data definition has no type or storage class
make[2]: *** [io.o] Error 1
make[2]: Leaving directory `/usr/src/alsa-driver-1.0.13/pci/emu10k1'
make[1]: *** [_modsubdir_emu10k1] Error 2
make[1]: Leaving directory `/usr/src/alsa-driver-1.0.13/pci'
make: *** [compile] Error 1

An dieser Stelle steigt make aus.... Ein Blick in die Datei ../../alsa-kernel/pci/emu10k1/io.c bringt mich auch nicht weiter. Doch hat mein Rechner ja wahrscheinlich auch einen ganz anderen Soundchip. So bleibt die Hoffnung, dass ich den problematischen Chipsatz einfach ausschließen kann. Mal sehen, was ich der Hilfe zu configure entlocken kann:

tux:/usr/src/alsa-driver-1.0.13# ./configure --help
`configure' configures this package to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

                              :
                              :
Optional Packages:
                              :
                              :
  --with-cards=<list>     compile driver for cards in <list>;
                          cards may be separated with commas;
                          'all' compiles all drivers;
                          Possible cards are:
                            seq-dummy, dummy, virmidi, mtpav, mts64,
                              :
                              :
                            rme96, rme9652, sonicvibes, trident, via82xx,
                            via82xx-modem, vx222, ymfpci, pdplus, asihpi,
                            powermac, aoa, aoa-fabric-layout, aoa-onyx,
                              :
                              :

Aha - ausschließen scheint nicht möglich zu sein, doch kann ich einen bestimmten Soundchip angeben, für den ALSA Treiber erzeugt werden sollen. Ein Blick auf die PCI-Geräte zeigt einen VIA VT8233 Chipsatz:

tux:/usr/src/alsa-driver-1.0.13# lspci
00:00.0 Host bridge: VIA Technologies, Inc. VT8385 [K8T800 AGP] Host Bridge (rev 01)
00:01.0 PCI bridge: VIA Technologies, Inc. VT8237 PCI bridge [K8T800/K8T890 South]
00:08.0 Ethernet controller: 3Com Corporation 3c940 10/100/1000Base-T [Marvell] (rev 12)
00:09.0 SCSI storage controller: LSI Logic / Symbios Logic 53c810 (rev 23)
00:0b.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 74)
00:0e.0 RAID bus controller: Silicon Image, Inc. SiI 3114 [SATALink/SATARaid] Serial ATA Controller (rev 02)
00:0f.0 IDE interface: VIA Technologies, Inc. VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE (rev 06)
00:10.0 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81)
00:11.0 ISA bridge: VIA Technologies, Inc. VT8237 ISA bridge [KT600/K8T800/K8T890 South]
00:11.5 Multimedia audio controller: VIA Technologies, Inc. VT8233/A/8235/8237 AC97 Audio Controller (rev 60)
00:12.0 Ethernet controller: VIA Technologies, Inc. VT6102 [Rhine-II] (rev 78)
00:18.0 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] HyperTransport Technology Configuration
01:00.0 VGA compatible controller: nVidia Corporation NV28 [GeForce4 Ti 4200 AGP 8x] (rev a1)

Also versuche ich configure mit der Option »--with-cards=via82xx« aufzurufen und den make-Prozess zu wiederholen:

tux:/usr/src/alsa-driver-1.0.13# ./configure --with-cards=via82xx
tux:/usr/src/alsa-driver-1.0.13# make
tux:/usr/src/alsa-driver-1.0.13# make install

Diesmal klappt's und der letzte Befehl installiert auch die benötigten Kernel-Module. Es fehlen allerdings noch die benötigten Gerätedateien unter /dev. Diese werden mit...

tux:/usr/src/alsa-driver-1.0.13# ./snddevices

erzeugt.

4. Kernel-Module laden

Mindestens vier Module müssen geladen werden, damit man der Soundkarte (wieder) Töne entlocken kann:

tux:~# modprobe snd-via82xx
tux:~# modprobe snd-pcm-oss
tux:~# modprobe snd-seq-oss
tux:~# modprobe snd-mixer-oss 

wobei das erste Modul je nach Soundchip natürlich verschieden heißt.

5. ALSA konfigurieren

Nach der Installation sind zunächst alle Kanäle deaktiviert und die Lautstärke steht auf 0. Dazu wird der alsamixer oder auch ein anderer Mixer, etwa kmix, aufgerufen und die Kanäle werden wie gewünscht eingestellt, die Einstellungen gespeichert:

tux:~# alsamixer
tux:~# alsactl store

Nun ist alles gut und selbst der Flashplayer hat endlich Sound ;-)