Linux mit Soundblaster & WSS kompatiblen Soundkarten Frank Böhm (fraboehm@metronet.de) v0.1, 26. Januar 1998 Beschreibt die Nutzung von kompatiblen Soundkarten und Mixern unter Linux. 1. Einleitung 1.1. Geschichte Der Text entstand von mir Ursprünglich als FAQ: Probleme mit Aztech SOUND GALAXY. Da ich häufiger e-mails bekommen habe, in denen ich über die Einrichtung einer Aztech SOUND GALAXY gefragt wurde. Die Karte ist kompatibel zum Soundblaster Pro und zum Windows Sound System. Ich habe eine Möglichkeit gefunden, 16-Bit Sound und die Mixer zu benutzen. Im Laufe der Zeit hat sich dann gezeigt, daß die meisten Aussagen allgemeingültig für kompatible Karten und Mixer sind. 1.2. Copyright Dieses Dokument ist urheberrechtlich geschützt. Das Copyright liegt bei Frank Böhm. Das Dokument darf gemäß der GNU General Public License verbreitet werden. Insbesondere bedeutet dieses, daß der Text sowohl über elektronische wie auch physikalische Medien ohne die Zahlung von Lizenzgebühren verbreitet werden darf, solange dieser Copyright Hinweis nicht entfernt wird. Eine kommerzielle Verbreitung ist erlaubt und ausdrücklich erwünscht. Bei einer Publikation in Papierform ist das Deutsche Linux HOWTO Projekt hierüber zu zu informieren. 1.3. Allgemeine Infos zur Karte Die gute Nachricht zuerst, ich habe die gleiche Karte problemlos unter Linux (Kernel 2.0.30-32)ansprechen können.Bei Bedarf finde ich bestimmt auch die Werte für einen alten 1.x.xx Kernel. Die schlechte, um alle Mixer-Funktionen nutzen zu können, habe ich den Kernel gepatcht. Auf der Karte befinden sich zwei Soundkarten. Sie ist kompatibel zur Soundblaster Pro (lolevel) und zum Windows Sound System und beide können ohne Tricks nur ausschließlich benutzt werden. Entweder SB-Pro oder WSS. Beide Karten benutzen den gleichen DMA, deshalb muß leider die Entscheidung zwischen einer Karte für die Soundausgabe fallen, es kann deshalb sofort benutzt werden: SB-Pro: 8-bit Aufnahme/Wiedergabe und der Mixer ohne Baß und Höhen aber mit Synth/PCM/Line In/Mic/CD/Master oder WSS: 16-bit Aufnahme/Wiedergabe und der Mixer zeigt an PCM/Line 1/Line 2/Mic/Rec/In gain, obwohl die meisten nicht zu funktionieren scheinen. Es könnten zwei Module kompiliert werden, die abwechselnd geladen werden. Die Entscheidung zwischen fast allen Mixerfunktionen bei der SB Version und 8-Bit oder keinem Mixer und 16-Bit Wiedergabe z.B. für MPG3 fällen zu müssen, hat mich aber nicht zufriedengestellt. Mit ein wenig Hardwarekenntnissen ist es zum Glück möglich, beide Kartenteile mit Einschränkungen gleichzeitig zu nutzen. 2. Installation 2.1. Einstellungen für den Kernel Mein Ziel war ein Modul mit möglichst vielen Funktionen: Welche Werte müssen eingestellt werden? Die Werte können unter DOS mit dem Befehl SET in der Zeile GALAXY=A220 I5 D1 K10 P530 T6 oder BLASTER=A220 I5 D1 T6 entnommen werden: A220 Port Soundblaster I5 IRQ SB-Pro D1 DMA für SB-Pro und WSS K10 IRQ WSS P530 Port WSS T6 Gibt nur den Typ der SB-Karte an, für uns ohne Belang Sie können mit einem DOS-Setup Programm oder per Jumper eingestellt werden, ich ziehe letzteres vor. Unter Linux habe ich dann eingestellt: cd /usr/src/linux make menuconfig Sound card support [*] Sound Blaster (SB, SBPro, SB16, clones) support [*] Generic OPL2/OPL3 FM synthesizer support [*] Microsoft Sound System support [*] /dev/dsp and /dev/audio support [*] MIDI interface support [*] FM synthesizer (YM3812/OPL-3) support (220) I/O base for SB Check from manual of the card (5) Sound Blaster IRQ Check from manual of the card (0) Sound Blaster DMA 0, 1 or 3 (0) Sound Blaster 16 bit DMA (_REQUIRED_for SB16, Jazz16, SMW) (0) MPU401 I/O base of SB16, Jazz16 and ES1688 Check from manual of (-1) SB MPU401 IRQ (Jazz16, SM Wave and ES1688) Use -1 with SB16 (530) MSS/WSS I/O base 530, 604, E80 or F40 (10) MSS/WSS IRQ 7, 9, 10 or 11 (1) MSS/WSS DMA 0, 1 or 3 (65536) Audio DMA buffer size 4096, 16384, 32768 or 65536 make dep; make clean; make zlilo; make modules; make modules_install; Hey, mit cat /dev/sndstat tauchen doch jetzt zwei scheinbar unabhängige Karten auf? Wo sind die Einschränkungen? cat /dev/sndstat sieht bei mir so aus: Sound Driver:3.5.4-960630 (Sun Dec 28 08:34:41 MET 1997 root, Linux loki 2.0.32 #2 Sat Dec 13 05:51:24 MET 1997 i486 unknown) Kernel: Linux loki 2.0.32 #2 Sat Dec 13 05:51:24 MET 1997 i486 Config options: Installed drivers: Type 10: MS Sound System Type 24: MS Sound System (AXP) Type 27: Compaq Deskpro XL Type 1: OPL-2/OPL-3 FM Type 2: Sound Blaster Type 7: SB MPU-40 Card config: MS Sound System at 0x530 irq 10 drq 1 Sound Blaster at 0x220 irq 5 drq 0,0 (SB MPU-401 irq 1 drq 0) OPL-2/OPL-3 FM at 0x388 drq Audio devices: 0: MSS audio codec (AD1848) 1: Sound Blaster Pro (3.1) Synth devices: 0: Yamaha OPL- Midi devices: 0: Sound Blaste Timers: 0: System cloc Mixers: 0: MSS audio codec (AD1848) 1: Sound Blaster Hier liegt ein Problem "Sound Blaster at 0x220 irq 5 drq 0,0", der 8-Bit Sound funktioniert nicht. Der große Vorteil liegt darin, daß beide Mixer benutzt werden können. 2.2. Wie funktionieren die Mixer? Die meisten Karten, die eine Soundblaster und eine weitere Soundkarte emulieren, funktionieren ähnlich. Mixer auf einer Soundkarte arbeiten unabhängig von der Sounderzeugung und können mit Portadressen, ohne IRQ und DMA zu benötigen, angesteuert werden. Theoretisch sind zwei unabhängige Mixer auf der Karte vorhanden. Jeder Mixer kann mehrere Eingänge verwalten. Es könnten wesentlich mehr Devices geregelt werden, als tatsächlich Eingänge vorhanden sind, leider wird nur ein Teil genutzt. Praktisch sind die Mixer hintereinander geschaltet. Der Ausgang vom WSS-Mixer geht in einen Eingang vom SB-Mixer. Das erklärt das merkwürdige Verhalten, wenn man einen Mixer aufruft und nur einen Teil der Funktionen regeln kann, bzw. warum Regler auftauchen die nix bewirken. :-) Unter Windows fällt nicht auf, daß mit der Oberfläche eines Mixerprogramms zwei unterschiedliche Devices geregelt werden. Unter DOS ist es leider üblich, daß eine "kompatible" Karte ein Dummy- Register hat. Ein Spiel schreibt hier z.B. die Lautstärke für das CD- Rom rein, ein residenter Treiber, der beim Booten geladen wurde, schaut mit einer Zeitschleife nach ob, ein neuer Wert vorhanden ist, liest ihn aus und trägt ihn im benutzten Mixer ein. Kein Wunder, wenn es häufig zu Problemen kommt. :-( Die Aztech Sound Galaxy ist abwärtskompatibel zum Soundblaster. Die Funktionen für die Bässe/Höhen werden mit dem Mixer vom SB geregelt. Sie können auch ohne WSS Einbindung genutzt werden. Bei der alten Soundconfig konnte man noch angeben, ob man eine NXPro hatte, beim neuen Soundtreiber leider nicht mehr, aber die alten Werte standen noch in der Datei sb_mixer.h. Ich habe nichts anderes getan, als die Galaxy-Werte bei den normalen Soundblaster Einträgen zu ergänzen. Ab jetzt tauchen zwar im jedem Mixer die neuen Regler auf, sinnvoll genutzt werden können sie aber nur, wenn die Hardware dafür ausgelegt ist. Es wird keine Hardware beschädigt, wenn ein Test mit einer alten Karte durchgeführt wird. Unterstützt die Karte keine Bässe/Höhen, passiert halt nix. ;-) Es funktioniert mit mehreren Soundblaster Karten und Kompatiblen. Ich habe ein kleines DOS-Mixer Progamm geschrieben, mit dem die Bits einer SB-Karte komfortabel gesetzt werden können, wenn ich sehen will, welche Funktionen implementiert sind. Bei Bedarf kann ich es in eine Binary-NG posten oder direkt zuschicken. Als letztes mein Patch 2.0.30/32: --- sb_mixer.h.orig Sun Jun 30 10:43:39 1996 +++ sb_mixer.h Sun Nov 23 01:35:58 1997 @@ -23,8 +23,9 @@ /* Same as SB Pro, unless I find otherwise */ #define SGNXPRO_RECORDING_DEVICES SBPRO_RECORDING_DEVICES -#define SBPRO_MIXER_DEVICES (SOUND_MASK_SYNTH | SOUND_MASK_PCM | SOUND_MASK_LINE | SOUND_MASK_MIC | \ - SOUND_MASK_CD | SOUND_MASK_VOLUME) +#define SBPRO_MIXER_DEVICES (SOUND_MASK_SYNTH | SOUND_MASK_PCM | SOUND_MASK_LINE | \ + SOUND_MASK_MIC | SOUND_MASK_CD | SOUND_MASK_VOLUME | \ + SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_SPEAKER ) /* SG NX Pro has treble and bass settings on the mixer. The 'speaker' * channel is the COVOX/DisneySoundSource emulation volume control @@ -99,17 +100,19 @@ #ifdef __SB_MIXER_C__ mixer_tab sbpro_mix = { MIX_ENT(SOUND_MIXER_VOLUME, 0x22, 7, 4, 0x22, 3, 4), -MIX_ENT(SOUND_MIXER_BASS, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_TREBLE, 0x00, 0, 0, 0x00, 0, 0), +MIX_ENT(SOUND_MIXER_BASS, 0x46, 2, 3, 0x00, 0, 0), +MIX_ENT(SOUND_MIXER_TREBLE, 0x44, 2, 3, 0x00, 0, 0), MIX_ENT(SOUND_MIXER_SYNTH, 0x26, 7, 4, 0x26, 3, 4), MIX_ENT(SOUND_MIXER_PCM, 0x04, 7, 4, 0x04, 3, 4), -MIX_ENT(SOUND_MIXER_SPEAKER, 0x00, 0, 0, 0x00, 0, 0), +MIX_ENT(SOUND_MIXER_SPEAKER, 0x42, 2, 3, 0x00, 0, 0), MIX_ENT(SOUND_MIXER_LINE, 0x2e, 7, 4, 0x2e, 3, 4), MIX_ENT(SOUND_MIXER_MIC, 0x0a, 2, 3, 0x00, 0, 0), MIX_ENT(SOUND_MIXER_CD, 0x28, 7, 4, 0x28, 3, 4), MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0), MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_RECLEV, 0x00, 0, 0, 0x00, 0, 0) +MIX_ENT(SOUND_MIXER_RECLEV, 0x00, 0, 0, 0x00, 0, 0), +MIX_ENT(SOUND_MIXER_IGAIN, 0x00, 0, 0, 0x00, 0, 0), +MIX_ENT(SOUND_MIXER_OGAIN, 0x00, 0, 0, 0x00, 0, 0) }; mixer_tab es688_mix = { MIX_ENT(SOUND_MIXER_VOLUME, 0x32, 7, 4, 0x32, 3, 4), 2.3. FAQ 2.3.1. Details zur Hardware · Bei mir steht da was von "CS4231" (oder so ähnlich)? Die folgenden Chips sind aufwärtskompatibel zum AD1848: CS4248 CS4231 CS4231A und AD1845 CS4232 CS4231A (und SB, MPU) ** Plug ´n´ Pain ** CS4232A Es sollte also funktionieren. Da kannst vermutlich den WSS Teil für 16-Bit Sounderzeugung benutzen und den SB-Teil als Hauptmixer. · Welche Interrupts können für eine WSS Karte benutzt werden, geht z.B.: IRQ 3,4? Schau dir doch mit less /var/log/boot.msg die Bootmeldungen an. Normalerweise hat jeder neue PC mindestens zwei serielle Schnittstellen, die die IRQ 3,4 benutzten. Meistens ist an der ersten eine Maus angeschlossen und an der zweiten hängt ein Modem, aber selbst, wenn Du noch eine freie serielle Schnittstelle hast, würde ich davon abraten, sie zu verschwenden. Findest Du mit less /proc/interrupts keine freien Interrupts? # Serial driver version 4.13 with no serial options enabled # tty00 at 0x03f8 (irq = 4) is a 16550A # tty01 at 0x02f8 (irq = 3) is a 16550A Die Hardware der meisten WSS kompatiblen Karten läßt es nicht zu, andere Interrupts als die vorgegebenen (7,9,10,11) zu benutzen. 2.3.2. Checkliste Meine Checkliste für den Einbau: leider gibt es mehr falsche als richtigen Einstellungen. Am Ende habe ich eine komplette Liste meiner Hardware. Vielleicht hilft es. Hardware (Jumper haben meistens aber nicht immer vorrang) Hauptplatine: z.B. feste Vergabe von IRQ 5/7 und DMA 1/3 für erweiterte Druckerschnittstelle ECP/EPP über Jumper? andere Erweiterungskarten: Netzwerkkarten benutzen z.B. IRQ5 werden die Jumper auf der Soundkarte benutzt oder PNP? (beides ist möglich!!) Software: BIOS: Welche Resourcen werden intern belegt. (HDD-Controler, Grafik, PS/2 Maus...) BIOS: müssen Resourcen als frei/belegt angegeben werden? BIOS: Einstellungen COM/LPT Einstellungen anderer Karten Soundkarte EEPROM, Einstellungen mit mitgelieferter Software überprüfen. Achtung: Änderungen werden erst nach einem Hardwarereset wirksam Bei manchen Mainboards muß sogar der Rechner ausgeschaltet werden, bevor Änderungen wirken. Stimmen unter DOS die Werte im SET BLASTER überein? Test: Ab hier sollte mein Programm den SB-Mixer ändern können. Lest bitte auch die README.TXT im Paket. Doppelbelegungen werden von der Windows Systemsteuerung meistens nicht erkannt, normalerweise sind sie für Fehler verantwortlich. Ich versuche einen neuen Rechner immer mit mehreren verschiedenen Testprogrammen wie Syschk, Config u. DrHardware zu testen, da ich kein Programm kenne, das alles erkennen kann.