Von OSS zu Alsa mit dem 2.4er Kernel
Inhalt
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
Sound ---> | |<*> Sound card support | | | |< > ALi5455 audio support | | | |< > BT878 audio dma | | | |< > C-Media PCI (CMI8338/8738) | | | |< > Creative SBLive! (EMU10K1) | | | |< > Crystal SoundFusion (CS4280/461x) | | | |< > Crystal Sound CS4281 | | | |< > Ensoniq AudioPCI (ES1370) | | | |< > Creative Ensoniq AudioPCI 97 (ES1371) | | | |< > ESS Technology Solo1 | | | |< > ESS Maestro, Maestro2, Maestro2E driver | | | |< > ESS Maestro3/Allegro driver (EXPERIMENTAL) | | | |< > ForteMedia FM801 driver (EXPERIMENTAL) | | | |< > Intel ICH (i8xx), SiS 7012, NVidia nForce Audio or AMD 768/811x| | | |< > RME Hammerfall (RME96XX) support | | | |< > S3 SonicVibes | | | |< > Trident 4DWave DX/NX, SiS 7018 or ALi 5451 PCI Audio Core | | | |< > Support for Turtle Beach MultiSound Classic, Tahiti, Monterey | | | |< > Support for Turtle Beach MultiSound Pinnacle, Fiji | | | |< > VIA 82C686 Audio Codec | | | |< > OSS sound modules | | | |< > TV card (bt848) mixer support | | | |< > AD1980 front/back switch plugin | | | |< > Wolfson Touchscreen/BMON plugin | |
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.
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 storeNun ist alles gut und selbst der Flashplayer hat endlich Sound ;-)