LinuxSound
aus ThiesenWiki, der freien Wissensdatenbank
Inhaltsverzeichnis |
Getting rid of OSS
Warum Linux Sound immer noch Suckt
Obwohl Linux seit 2.6 ALSA endlich mit im Kernel hat ist Sound Handhabung immer noch schrecklich. Das liegt im großen und ganzen am OSS. Das (alte) Open Sound System hatte seine vorteile (im letzten Jahrtausend) hat aber ein großes Problem, sound Zugriff passiert über eine device node (/dev/dsp) und darauf kann halt nur einmal schreibend zugegriffen werden. ALSA muss diese Probleme alle nicht haben, hat aber ein OSS Emulationslayer, das auch über /dev/dsp ansprechbar ist. Das ist scheiße, weil damit ALSA den gleichen Beschränkungen unterliegt. Das tut es zwar auch ohne das OSS Emulationslayer, allerdings kann man an dieser Stelle mit dem "dmix" Plugin so einiges reißen und den Desktop Sound Daemons (ala artsd bei KDE oder esd bei GNOME) das überlassen was sie eigentlich machen sollen, nämlich desktop Sounds ausgeben. Schritt 1: Erklärtes Ziel ist ersteinmal /dev/dsp loszuwerden. Dazu soll man im Linux Kernel die Optionen CONFIG_SND_PCM_OSS und CONFIG_SND_SEQUENCER_OSS abstellen. Den Mixer kann man an lassen, da konkurierende Mixerzugriffe nicht so häufig vorkommen wir konkurierende Soundzugriffe. Wenn man den damit kompilierten Kernel bootet sollte
cat /dev/dsp
folgendes Output verursachen:
cat: /dev/dsp: No such device
Wenn man schon bei Kernel ist: es reicht vollkommen die ganzen Sound sachen als Module zu kompilieren. Bei mir sieht das so aus:
marcus@mobilHal:~: cat /usr/src/linux/.config | grep SND CONFIG_SND=m CONFIG_SND_TIMER=m CONFIG_SND_PCM=m CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_SEQUENCER=m CONFIG_SND_SEQ_DUMMY=m CONFIG_SND_OSSEMUL=y CONFIG_SND_MIXER_OSS=m # CONFIG_SND_PCM_OSS is not set # CONFIG_SND_SEQUENCER_OSS is not set CONFIG_SND_RTCTIMER=m # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set CONFIG_SND_MPU401_UART=m CONFIG_SND_DUMMY=m CONFIG_SND_VIRMIDI=m
marcus@mobilHal:~: lsmod | grep snd snd_mixer_oss 16256 1 snd_intel8x0 25128 4 snd_ac97_codec 55760 1 snd_intel8x0 snd_pcm 65288 2 snd_intel8x0 snd_timer 18308 3 snd_pcm snd_page_alloc 6024 2 snd_intel8x0,snd_pcm snd_mpu401_uart 5120 1 snd_intel8x0 snd_rawmidi 17060 1 snd_mpu401_uart snd_seq_device 5128 1 snd_rawmidi snd 36452 11 snd_mixer_oss,snd_intel8x0,snd_ac97_codec,snd_pcm,snd_timer,snd_mpu401_uart,snd_rawmidi,snd_seq_device soundcore 5472 2 snd
So jetzt kann uns wenigstens keiner mehr die Device klauen. Man sollte auch sicherstellen das die Userspace Programme alle richtig installiert und vorhanden sind, bei Debian z.B.
marcus@mobilHal:~: dpkg -l | grep alsa- ii alsa-base 1.0.6a-9 ALSA driver configuration files ii alsa-headers 1.0.6a-9 transitional package that can be safely remo ii alsa-utils 1.0.6-4 ALSA utilities
Jetzt zu "dmix". Dmix ist ein Plugin für ALSA das dafür sorgt, das mehrere Output streams überlagert werden, sprich man mehrere Sounds zur gleichen Zeit ausgeben kann. Dafür muss man ALSA konfigurieren dies zu tun. Entweder unter /etc/asoundrc systemweit oder unter $HOME/.asoundrc für den jeweiligen Benutzer (Beachte: wenn man es "nur" für den eigenen Benutzer macht und dann Sound als root ausgibt blockiert das immer noch). Es kann sein das die Dateien nicht existieren, wenn dies der Fall ist können sie ruhig angelegt werden. Das ganze sollte ungefähr so aussehen:
marcus@mobilHal:~: cat .asoundrc
pcm.!default {
type plug
slave.pcm "mypcm"
}
pcm.mypcm {
type dmix
ipc_key 50558
slave {
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 32768
rate 44100
}
}
Das "pcm.!default" leitet die Default Ausgabe, die 99,999% aller Programme nutzen, auf das slave-pcm "mypcm" um. Dieses ist vom type dmix, benutzt also das dmix Plugin. Der ipc_key ist nicht besonders wichtig, er muss nur Unique sein. Die einstellungen unter Slave beziehen sich auf die Soundkarte selber. Das Einzige was hier zu ändern sein könnte ist das "pcm", was die hardware addresse der soundkarte angibt und die buffer_size, die Festlegt wieviel gepuffert werden soll bevor das output kommt. Sollten bei hoher Auslastung des Systems Lücken im Audio entstehen, sollte man mit diesem Wert experimentieren. Jetzt sollte man mit "alsaplayer" schon mehrere Outputstreams ausgeben können (zwei Soundfiles gleichzeitig abspielen). Desweiteren zu den einzelnen Applikationen:
XMMS
Einfach das ALSA Output Plugin Nutzen
MPlayer
mplaye -ao alsa1x oder -ao alsa benutzt default zum ausgeben, sollte also auch funktionieren.
KDE (Arts)
Einfach als output Alsa wählen.
Alles andere
Wenn sich etwas nicht dazu übereden lässt direkt über ALSA auszugeben (was man an Fehlermeldungen die sich auf /dev/dsp beziehen erkennt) sollte man mit "aoss" starten, was dann irgendwie die Applikation dazu verleitet ebenfalls direkt auf ALSA zuzugreifen. (z.B. "aoss play /some/sound/file.mp3")
Weitere informationen gibt es auf dieser Seite: http://alsa.opensrc.org/index.php?page=DmixPlugin
