Soundkarten kombinieren
Aus Gentoo Linux Wiki
Viele (Onboard-)Soundkarten haben schlechte Mikrofoneingänge. Diese sind oft nicht richtig abgeschirmt und jede Prozessor- oder CD-ROM-Aktivität schlägt sich durch fieben und zwitschern in Aufnahmen und Audiokonferenzen nieder.
Abhilfe schaffen USB-Mikrofone und -Headsets, da sie den Ton digitalisieren bevor irgendetwas stören kann. Oder man hat eine zweite Soundkarte mit einem guten Mikrofoneingang, möchte aber den Ausgang der Onboardsoundkarte nutzen.
Die Lösung ist ALSA so zu konfigurieren, daß dem Programm, egal ob es nun ALSA oder OSS unterstützt, eine Soundkarte vorzugaukeln, die in Wirklichkeit aus zwei Soundkarten besteht.
| Datei: /etc/asound.conf oder ~/.asoundrc |
#Das Abspielgerät
pcm.wiedergabe
{
#ist ein Hardwareplugin (http://alsa.opensrc.org/ALSA_plugins)
type hw
card 0 #und zwar die Soundkarte 0 (aplay -l)
}
#Aufnahmegerät
pcm.aufnahme
{
type hw
card 1 #Soundkarte 1 (arecord -l)
}
#Gemischtes Abspielgerät (wird benötigt von OSS-Programmen)
pcm.gemischte_wiedergabe
{
#ist ein Softwaremixer-plugin (http://alsa.opensrc.org/Dmix)
type dmix
#dmixer brauchen einen einzigartigen Schlüssel für die Interprozesskommunikation
ipc_key 1024
#ist ein Abkömmling vom Abspielgerät
#http://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html
slave.pcm "wiedergabe"
#dies oder ähnliches wird bei vielen Karten benötigt
#z.B.: http://gentoo-wiki.com/HOWTO_ALSA_Complete_%28includes_dmix%29#via82cxxx_onboard.2FICE1712_chip
slave
{
#Hat man Probleme mit stotterndem/knatterndem Sound, sollte man an diesen Werten spielen
#Um die Latenz so gering wie möglich zu halten (-->VoIP bei FPS-Spielen), sollten die Soundpuffer
#so niedrig wie möglich gewählt werden
#period_size 1024 #muß ein Vielfaches von 2 sein
#buffer_size 4096 #muß ein Vielfaches von period_size sein
#periods 0
#period_time 0
#buffer_time 0
}
#http://www.alsa-project.org/alsa-doc/doc-php/asoundrc.php#bindings
bindings
{
#Mapping der Kanäle, z.B.: 0 1: links auf rechts, 1 0 rechts auf links
#0 0
#1 1
}
}
#Gemischtes Aufnahmegerät
pcm.gemischte_aufnahme
{
#http://alsa.opensrc.org/Dsnoop
type dsnoop
ipc_key 1024
slave.pcm "aufnahme"
slave
{
#period_size 1024
#buffer_size 4096
#periods 0
#period_time 0
#buffer_time 0
}
bindings
{
#nur ein Capture-Kanal vorhanden beim USB-Mikrofon (/proc/asound/cardX/pcmXc)
#0 0
}
}
#Die neue virtuelle Soundkarte für ALSA-Programme
pcm.alsa_virtuell
{
#ist ein assymetrisches Gerät (http://alsa.opensrc.org/Asym)
type asym
#Wenn die Soundkarte hardware-mixing kann, kann man sie direkt angeben (z.B. VIA 8237, emu10k1)
#playback.pcm "wiedergabe"
#Das dmix-plugin funktioniert bei VIA 8237 nicht mit ALSA-Programmen! Dafür hat
#diese Karte einen Hardwaremixer für vier Sounds ("aplay -l" zeigt vier Subdevices)
playback.pcm "gemischte_wiedergabe"
capture.pcm "gemischte_aufnahme"
}
#Die neue virtuelle Soundkarte für OSS-Programme
pcm.oss_virtuell
{
type asym
#Bei OSS müssen jeweils die gemischten Geräte genommen werden
playback.pcm "gemischte_wiedergabe"
capture.pcm "gemischte_aufnahme"
}
#Das Standard-ALSA-Gerät ("default")
pcm.!default
{
#ist ein PCM-Plugin (http://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html)
type plug
slave.pcm "alsa_virtuell"
}
#Standard-OSS-Gerät (der Wrapper für OSS-Programme (aoss) nimmt dsp0)
pcm.dsp0
{
type plug
slave.pcm "oss_virtuell"
}
|
Das ganze kann man auch kürzer schreiben:
| Datei: /etc/asound.conf oder ~/.asoundrc |
#Standard-ALSA-Gerät
pcm.!default {
type plug
slave {
pcm {
type asym
playback.pcm dmix:0
capture.pcm dsnoop:1
}
}
}
#Standard-OSS-Gerät (bei Benutzung von aoss)
pcm.dsp pcm.!default
|
Hat man Probleme mit dmix und ALSA-Programmen kann man stattdessen auch JACK probieren:
| Datei: /etc/asound.conf oder ~/.asoundrc |
pcm.jack {
type jack
playback_ports {
#Die von JACK benutzten Kanäle, hier Stereo
0 alsa_pcm:playback_1
1 alsa_pcm:playback_2
}
}
pcm.!default {
type plug
slave {
pcm {
type asym
playback.pcm "jack"
capture.pcm "dsnoop:1"
}
}
}
pcm.dsp0 {
type plug
slave {
pcm {
type asym
playback.pcm dmix:0
capture.pcm dsnoop:1
}
}
}
|
Um nur die Wiedergabe über den JACK-Server laufen zu lassen, startet man mit ihn mit
# jackd -d alsa -P
JACK hat den Nachteil, daß ein Subdevice exklusiv belegt wird, es sei denn man läßt ihn auf einem virtuellen ALSA-Gerät laufen (-d alsa -d virtuelles_geraet). Auch machen manche ALSA-Programme Probleme, die über die asound.conf auf JACK laufen, also den JACK-Server nicht direkt ansprechen. Dazu gehören mplayer und mumble. Im Fall von mplayer läßt sich das Problem aber einfach lösen: ao=jack,alsa,nas,sdl,oss,openal,portaudio in der ~/.mplayer/config oder /etc/mplayer.conf.
Sollte es Probleme geben mit der Reihenfolge der Geräte, muß noch die /etc/modules.d/alsa angepaßt werden.
| Datei: /etc/modules.d/alsa |
#Karte 1 #Treibernamen herausfinden: lsmod bzw. http://www.alsa-project.org/alsa-doc/ alias snd-card-0 [Treibername] alias sound-slot-0 snd-card-0 options [Treibername] index=0 #Karte 2 alias snd-card-1 [Treibername] alias sound-slot-1 snd-card-1 #Zweite Soundkarte soll niemals Priorität kriegen: options [Treibername] index=-2 |
$ update-modules $ /etc/init.d/alsasound restart
Software:
- Mumble:
Mumble funktioniert jetzt automatisch so wie es soll.
- Skype:
Skype unterstützt mittlerweile ALSA komplett und funktioniert ebenfalls wie gewünscht.
- TeamSpeak
TeamSpeak muß mit aoss gestartet werden, da es nur OSS unterstützt. aoss ist Bestandteil von media-libs/alsa-oss.
# aoss TeamSpeak
Nützliche Infos:
# cat /proc/asound/cards # cat /proc/asound/devices # cat /proc/asound/oss/sndstat # cat /proc/asound/pcm # ls -ld /proc/asound/card?/pcm?p # ls -ld /proc/asound/card?/pcm?c # aplay -l # arecord -l
ALSA-Infos:
- ALSA combining FAQ
- http://alsa.opensrc.org/TwoCardsAsOne
- http://alsa.opensrc.org/Dmix
- http://alsa.opensrc.org/Dsnoop
- http://www.alsa-project.org/alsa-doc/doc-php/asoundrc.php
- http://www.gentoo.de/doc/de/alsa-guide.xml
- http://de.gentoo-wiki.com/Dmix
- http://gentoo-wiki.com/HOWTO_ALSA_Complete_%28includes_dmix%29
- http://gentoo-wiki.com/HOWTO_Jack
- http://alsa.opensrc.org/JACK
- /usr/share/doc/alsa-plugins-*/README-jack.*
Sonstige Links:
-- Mattenklicker 17:18, 24. Mär 2007 (UTC)
