Soundkarten kombinieren

Aus Gentoo Linux Wiki

Wechseln zu: Navigation, Suche

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:


Sonstige Links:


-- Mattenklicker 17:18, 24. Mär 2007 (UTC)

'Persönliche Werkzeuge