.asoundrc

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Einen Editor öffnen

  2. Ein Terminal verwenden

Inhaltsverzeichnis
  1. Einführung
  2. Initialisierung
    1. Digital
      1. SPDIF
      2. HDMI
  3. Mixing
  4. OSS
  5. JACK
    1. Direkt
    2. Via virtueller Soundkarte
      1. Multiple virtuelle Soundkarten
  6. Phonon
  7. Surround-Sound
    1. Vordefinierte Kanäle
    2. Manuelle Festlegung
    3. Downmix
    4. Upmix
    5. Up- oder Downmix als Standard festlegen
  8. Filter
  9. Beispiele
    1. Softwaremixing
      1. Stereo
      2. 5.1 Surround
      3. Kanal-Splitting
      4. Permanenter Upmix
      5. Unabhängige Stereokanäle
      6. Unabhängige Stereokanäle
  10. Mögliche Fehlerquellen
    1. Anzahl der Kanäle falsch
    2. Rate falsch
    3. .asoundrc wird ignoriert
  11. Links

In der Standardinstallation von Ubuntu übernimmt normalerweise ein Soundserver die Aufgabe, die verschiedenen Soundkanäle zu koordinieren. Dies funktioniert jedoch nicht immer problemlos und zufriedenstellend. Eine Alternative stellt die direkte Nutzung von ALSA dar. ALSA ist bei jeder Standardinstallation bereits auf dem System vorhanden; es müssen also keine Pakete nachinstalliert werden.

Einführung

Die versteckte Datei ~/.asoundrc im Heimverzeichnis des Benutzers ist eine Steuerdatei für ALSA und dessen Plugins. Bei einem Mehrbenutzersystem kann man statt dessen die Datei /etc/asound.conf benutzen, welche für alle Benutzer gilt. Anlegen muss man diese Dateien nur dann, wenn die Soundkarten von ALSA erkannt wurde, die Soundausgabe jedoch unbefriedigend ist. Das ist z.B dann der Fall, wenn die verwendete Karte kein Hardwaremixing unterstützt, was unter anderem sehr häufig bei Onboard-Soundlösungen vorkommt. Hardwaremixing bedeutet, dass die Soundkarte fähig ist, mehrere Klangquellen gleichzeitig wiederzugeben.

Die Datei kann mit einer Vielzahl an Plugins versehen werden, welche vielerlei Funktionen erfüllen. Dabei lassen sich im Prinzip alle Plugins miteinander kombinieren, solange man keine unsinnigen Angaben macht und das Audio-Signal-Routing in sich schlüssig ist. Die Datei erstellt und bearbeitet man mit einem Editor [1].

Hinweis:

Damit durch die Direktiven in der .asoundrc keine Konflikte entstehen, müssen andere Programme zum Soundmanagement deaktiviert, und ein allein auf ALSA basierendes Soundsystem eingerichtet werden. Insbesondere PulseAudio (standardmäßig installiert) sollte vorher vollständig entfernt werden.

Initialisierung

Damit eine Soundkarte von ALSA sauber erkannt wird, muss sie in der .asoundrc bekanntgegeben werden; man definiert damit ein virtuelles Gerät:

pcm.snd_card {
        type hw
        card 0
        device 0
}

ctl.snd_card {
        type hw
        card 0
        device 0
}

"snd_card" ist der Name des Gerätes. Der Name kann beliebig (Zeichen A bis z, der _ und alle Zahlen) gewählt werden, er dient als Alias für diese Soundkarte. "card 0" bedeutet, dass die als erste von ALSA gefundene Soundkarte im Rechner mit diesem Alias verknüpft wird. Sollten sich mehrere Soundkarten im Rechner befinden, oder kommen neuen Audio-USB-Geräte hinzu, so wird durchnummeriert: die zweite Karte ist als "card 1", die dritte als "card 2", usw. einzutragen.

Digital

SPDIF

Will man statt des Standard-Ausganges (dies ist in der Regel die analoge Ausgangsbuchse "Line Out", oben durch "device 0" festgelegt) den digitalen Ausgang aka SPDIF nutzen, so muss man dies nur in der Geräte-Definition mitteilen. Dazu muss die passende Geräte-Nummer ermittelt werden. Dies tut man in einem Terminal [2] mit dem Befehl "aplay -l" (die Befehls-Ausgabe wurde gekürzt):

$ aplay -l
Karte 0: ICH5 [Intel ICH5], Gerät 0: Intel ICH [Intel ICH5]
Karte 0: ICH5 [Intel ICH5], Gerät 4: Intel ICH - IEC958 [Intel ICH5 - IEC958] 

Man sieht, dass "Gerät 4" den SPDIF-Ausgang darstellt; erkenntlich ist dies an der Bezeichnung "IEC958". Wenn man nun "device 4" statt des oben verwendeten "device 0" hineinschreibt, so verwendet ALSA den SPDIF-Anschluss.

HDMI

Wieder wird "aplay -l" aufgerufen:

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: NVidia [HDA NVidia], device 0: STAC92xx Analog [STAC92xx Analog]
Subdevices: 0/1
Subdevice #0: subdevice #0
card 1: NVidia_1 [HDA NVidia], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia_1 [HDA NVidia], device 7: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia_1 [HDA NVidia], device 8: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia_1 [HDA NVidia], device 9: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0 

Bekommt man nur eine Nummer für das Device, so kann man sich glücklich schätzen, und es direkt in die .asoundrc eintragen. Wenn allerdings, wie in oben genannten Beispiel, eine ganze Reihe von Devices auftaucht, so hat man leider keine andere Wahl, als alle durch zu probieren. (Bei Nvidia-Karten könnte eventuell "device 9" eine gute Wahl sein).

Mixing

Häufigstes Einsatzszenario ist das Software-Mixing. Verfügt eine Soundkarte über keinen Hardware-Mixer (und das ist meistens der Fall), so müssen die verschiedenen Audio-Signale mittels Software zusammengemischt werden. Dies geschieht über das "dmix"-Plugin. Gleichzeitig wird definiert, dass alle Programme über das "dmix"-Plugin ihren Sound ausgeben. Dies geschieht mittels des "default"-Gerätes, welches alle Soundkanäle auf sich lenkt.

### Alles in einer Zeile nach dem Zeichen # ist ein Kommentar, und wird von ALSA ignoriert.

# Das dmix-Plugin wird definiert.
pcm.dmixer {
    type dmix
    ipc_key 1024
    ipc_perm 0666       # Andere Benutzer können ebenfalls dmix gleichzeitig nutzen
    slave.pcm "snd_card"
    slave {
        ### buffer_size kann bei Problemen der jeweiligen Karte angepasst werden.
        period_time 0
        period_size 1024
        buffer_size 4096
        ### bei Störungen kann die Konvertierung auf die Rate 44100 eingeschaltet werden.
        # rate 44100
        ### einige Soundkarten benötigen das exakte Datenformat (zB ice1712)
        # format S32_LE
        ### Verfügbare Formate: S8 U8 S16_LE S16_BE U16_LE U16_BE S24_LE S24_BE U24_LE U24_BE
        ###               S32_LE S32_BE U32_LE U32_BE FLOAT_LE FLOAT_BE FLOAT64_LE FLOAT64_BE
        ###               IEC958_SUBFRAME_LE IEC958_SUBFRAME_BE MU_LAW A_LAW IMA_ADPCM MPEG GSM
        ### Anzahl channels muss mit den bindings übereinstimmen
        channels 2 
    }
    bindings {
        0 0
        1 1
    }
}

# Das dsnoop-Plugin, welches es erlaubt, mehrere Programme gleichzeitig aufnehmen zu lassen.
pcm.dsnooper {
    type dsnoop
    ipc_key 2048
    ipc_perm 0666 
    slave.pcm "snd_card"
    slave 
    {
        period_time 0
        period_size 1024
        buffer_size 4096
        # bei Störungen kann die Konvertierung auf die Rate 44100 eingeschaltet werden.
        # rate 44100
        # einige Soundkarten benötigen das exakte Datenformat (zB ice1712)
        # format S32_LE
        ### Anzahl channels muss mit den bindings übereinstimmen
        channels 2 
    }
    bindings {
        0 0
        1 1
    }
}

# Dies definiert unser Fullduplex-Plugin als Standard für alle ALSA-Programme.
pcm.duplex {
    type asym
    playback.pcm "dmixer"
    capture.pcm "dsnooper"
}

pcm.!default {
    type plug
    slave.pcm "duplex"
}

Man kann sehr schön erkennen, wie die Weiterleitung funktioniert: das default-Gerät nimmt alle Sound-Kanäle entgegen und leitet sie an das "duplex"-Gerät weiter. Dieses wiederum verteilt sie an "dmixer" für die Wiedergabe und an "dsnooper" für die Aufnahme. Das Gerät "dmixer" leitet die Kanäle direkt in das "dmix"-Plugin, welches das eigentliche Zusammenmischen übernimmt.

OSS

Es gibt noch viele Programme, die zur Sound-Ausgabe nur OSS (Open Sound System) unterstützen. Damit auch diese Programme ihren Sound über ALSA und das "dmix"-Plugin laufen lassen können, muss noch ein virtuelles OSS-Gerät definiert werden:

# DSP wird simuliert und benutzt das dmix-Plugin.
pcm.dsp0 {
    type plug
    slave.pcm "duplex"
}

# OSS-Steuerung für dsp0 (falls es benötigt wird...)
ctl.dsp0 {
    type plug
    slave.pcm "snd_card"
}

# OSS-Steuerung für dsp0 (falls es benötigt wird...)
ctl.mixer0 {
    type plug
    slave.pcm "snd_card"
}

Ein gängiges Programm, welches nur OSS unterstützt, ist Audacity. Schon seit 7.04 unterstützt Audacity ALSA. Auch viele Browser-Plugins (z.B. Flash) kommunizieren nur mit der OSS-Schnittstelle.

JACK

Direkt

Um eine Schnittstelle zu jack (Jack Audio Connection Kit) zu bekommen, muss die .asoundrc folgendermaßen ergänzt werden:

pcm.jackplug12 {
        type plug
        slave { pcm "jack12" }
}

pcm.jack12 {
        type jack
        playback_ports {
                0 alsa_pcm:playback_1
                1 alsa_pcm:playback_2
        }
        capture_ports {
                0 alsa_pcm:capture_1
                1 alsa_pcm:capture_2
        }
}

Programme, welche nur eine ALSA-Schnittstelle, aber keine direkte jack-Unterstützung haben, können nun über das "jackplug12"-Gerät mit jack kommunizieren. In diesem konkreten Fall wurden die Mono-Hardware-Kanäle 1 und 2 zum Stereo-Gerät "jackplug12" gebündelt.

Die benötigte Bibliothek libasound_module_pcm_jack.so ist ab Lucid im Paket libasound2-plugins, welches natürlich installiert werden muss.

Via virtueller Soundkarte

Man kann auch eine virtuelle Soundkarte benutzen um ALSA mit jack kommunizieren zu lassen. Der Vorteil ist die Persistenz der Verbindung, der Nachteil der erhöhte Ressourcenverbrauch. Zuerst muss man die virtuelle Soundkarte via Kernelmodul laden:

modprobe snd-aloop pcm_substreams=2 

Dies erzeugt eine Soundkarte mit zwei Kanälen. Eine passende .asoundrc sieht zum Beispiel so aus:

# playback PCM device: using loopback subdevice 0,0
pcm.amix {
  type dmix
  ipc_key 1234
  slave.pcm "hw:Loopback,0,0"
}
# capture PCM device: using loopback subdevice 0,1
pcm.asnoop {
  type dsnoop
  ipc_key 1235
  slave.pcm "hw:Loopback,0,1"
}
# duplex device combining our PCM devices defined above
pcm.aduplex {
  type asym
  playback.pcm "amix"
  capture.pcm "asnoop"
}
# for jack alsa_in and alsa_out: looped-back signal at other ends
pcm.ploop {
  type plug
  slave.pcm "hw:Loopback,1,1"
}
pcm.cloop {
  type dsnoop
  ipc_key 1236
  slave.pcm "hw:Loopback,1,0"
}
# default device
pcm.!default {
  type plug
  slave.pcm "aduplex"
}

Danach werden die Kanäle für jack erzeugt:

alsa_in  -j cloop -dcloop -q1 &
alsa_out -j ploop -dploop -q1 & 

Diese können nun mit jack verbunden werden. Der Parameter q legt die Qualität des Resamplings fest (Werte 0 bis 4): je höher, desto besser, es braucht aber bei besserer Qualität signifikant mehr Rechenzeit.

Multiple virtuelle Soundkarten

Will man mehrere virtuelle Soundkarten erstellen (um zum Beispiel ein übersichtliches Routing in jack zu haben), so muss dies beim Laden des Moduls geschehen:

modprobe snd-aloop index=1,2,3 enable=1,1,1 pcm_substreams=8,2,6 id=xine,mplayer,vdr 

Dies erstellt drei virtuelle Soundkarten, die erste davon mit dem Namen "xine" und 8 Kanälen, eine zweite mit dem Namen "mplayer" und zwei Kanälen, und eine dritte mit dem Namen vdr und sechs Kanälen. Die Nummern der Indizes richten sich natürlich nach den eigenen Gegebenheiten. Die Namen für die virtuellen Soundkarten sind in diesem Beispiel nicht willkürlich gewählt, denn die Programme neigen dazu (beim Spulen und/oder Umschalten) bei direkter Konnektierung mit jack xruns zu verursachen.

Phonon

Damit Phonon ein Gerät in der Liste der verfügbaren Ausgabegeräte anzeigt, muss folgendes in die .asoundrc eingefügt werden.

pcm.phonon {
        type plug
        slave.pcm "duplex" # Muss an die eigene Konfiguration angepasst werden
        hint {
                show on
                description "DMix" # Anzeigename in den Phonon-Einstellungen
        }
}

Surround-Sound

Viele Signalquellen sind mittlerweile mehrkanalig. Sie alle werden unter dem Begriff "Surround-Sound" zusammengefasst. Man ist überein gekommen, zur Beschreibung eine "x.y"-Notation zu verwenden. Dabei stellt "x" die Anzahl der ungefilterten Kanäle dar, und "y" ggf. den Subwoofer-Kanal. Beispiel: "5.1" hat insgesamt 6 Kanäle ("Vorne links", "Vorne rechts", "Hinten links", "Hinten rechts", "Zentrum" und einen "Bass"). Ein Stereo-Signal hat demzufolge die Notation "2.0".

Vordefinierte Kanäle

ALSA bietet für viele Soundkarten bereits vordefinierte Surround-Geräte an. Ob die eigene Karte unterstützt wird, kann man einfach testen:

speaker-test -D surround51 -c 6 

Damit werden nacheinander alle sechs Kanäle (Option "-c 6") über ein 5.1 Surround-Gerät (Option "-D surround51") angesprochen. Weitere vordefinierte Geräte heißen analog "surround40", "surround71", etc. Man muss beachten, dass der Punkt in der normalen Notation weggelassen wird.

Manuelle Festlegung

Da beim Surroundsound mehr Kanäle als bei Stereo verwendet werden, müssen die o.g. Definitionen angepasst werden. Beim "dmixer"-Plugin geschieht dies einfach durch eine Erweiterung der Kanal-Bindung. Beim "dsnooper"-Plugin macht dies nur Sinn, wenn die Karte tatsächlich mehr als zwei physikalische Kanäle für eine Aufnahme besitzt, und diese auch gleichzeitig nutzen kann.

    bindings {
        0 0
        1 1
        2 2
        3 3
        4 4
        5 5
    }

Dieses Beispiel gilt für ein 5.1-System. Bei einigen Soundchips sind die Kanäle intern anders nummeriert, so dass man hier evtl. umsortieren muss! Es wird definiert, dass die Karte 6 Kanäle hat, und dass Eingang Nummer x auf Ausgang Nummer x geleitet wird. Alternativ kann auch folgende Definition verwendet werden:

pcm.dmix51 {
    type dmix
    ipc_key 1024
    slave {
        pcm "hw:0,0"
        rate 44100
        channels 6
        period_time 0
        period_size 1024
        buffer_time 0
        buffer_size 4096
    }
}

wobei die Adresse des PCM-Gerätes statt "hw:0,0" auch "hw:0,1" o.ä. sein kann - dies hängt von der verwendeten Hardware ab.

Downmix

Mittels der .asoundrc kann man ein 5.1-Signal auf Stereo heruntermischen (5.1 auf 2.0):

pcm.51to20 {
     type route
     slave.pcm surround51
     # hier wurde das vordefinierte Gerät "surround51" verwendet
     # falls "dmixer" entsprechend konfiguriert wurde, kann man ihn als slave.pcm angeben
     slave.channels 6
     ttable.0.0 1      # front links -> links
     ttable.1.1 1      # front rechts -> rechts
     ttable.2.0 0.707  # hinten links -> links, Dämpfung 3dB
     ttable.3.1 0.707  # hinten rechts -> rechts, Dämpfung 3dB
     ttable.4.0 0.5    # zentrum -> links, Dämpfung 6dB
     ttable.4.1 0.5    # zentrum -> rechts, Dämpfung 6dB
     ttable.5.0 0.5    # basskanal -> links, Dämpfung 6dB
     ttable.5.1 0.5    # basskanal -> rechts, Dämpfung 6dB
}

Nun kann man z.B. XINE das oben definierte "51to20"-Gerät als Audio-Ausgang zuweisen. Der Surround-Sound wird dadurch sauber auf ein Stereo-Signal heruntergemischt. Die erste Zahl nach ttable steht dabei für die Eingangskanäle (0 bis 5), die zweite Zahl steht für den Ausgangskanal (0 und 1 für links und rechts), die dritte Zahl steht für die Dämpfung des Eingang-Signals.

Upmix

Analog zum Downmix lässt sich ein Stereosignal auf ein 5.1-System hochmischen:

pcm.20to51 {
     type route
     slave.pcm surround51
     slave.channels 6
     ttable.0.0 1
     ttable.1.1 1
     ttable.0.2 1
     ttable.1.3 1
     ttable.0.4 0.5
     ttable.1.4 0.5
     ttable.0.5 0.5
     ttable.1.5 0.5
}

Die beiden Kanäle des Stereosignals werden hierdurch lediglich kopiert und auf die Kanäle des 5.1-Systems verteilt.

Up- oder Downmix als Standard festlegen

Um den Up- oder Downmix als Standard festzulegen muss lediglich das Fullduplex-Plugin angepasst werden, um das vorher definierte Up- oder Downmix-Gerät zu verwenden:

Downmix:

pcm.duplex {
    type asym
    playback.pcm "51to20"
    capture.pcm "dsnooper"
}

Upmix:

pcm.duplex {
    type asym
    playback.pcm "20to51"
    capture.pcm "dsnooper"
}

Filter

Man kann virtuelle Geräte auch als Filter definieren. Hierbei ist es egal, welcher Filter verwendet wird. Eine große Auswahl an Filtern bietet LADSPA 🇬🇧 , welche sich problemlos in Linux einbinden lassen.

pcm.lowpass {
     type ladspa
     slave.pcm "plughw:0"
     path "/usr/lib/ladspa"
     plugins [ {
          label lpf 
          input {
               controls [ 150 ]
          }
     } ]
}

pcm.test {
    type plug
    slave.pcm "lowpass"
} 

Das Beispiel definiert ein Gerät, welches einen Low-Pass-Filter einbindet; also nur Frequenzen unter 150 Hz passieren lässt. Angesprochen wird es über das zweite Gerät "test". Natürlich kann man das gefilterte Signal auch an einen zuvor definierten "dmixer" leiten. Dann muss beim Gerät "lowpass" das slave.pcm auf "plug:dmixer" zeigen.

Man muss immer darauf achten, dass der gewählte LADSPA-Filter den Anforderung genügt. Viele der Filter sind nur mono ausgelegt. Ist ein passender mehrkanaliger Filter nicht verfügbar, so muss man mehrere Mono-Filter in der .asoundrc mit dem passenden Routing von Hand einpassen.

Hinweis:

Leider hat Ubuntu in neueren Versionen (zumindest in 10.10) keine LADSPA-Unterstützung in ALSA einkompiliert. Dieser Post beschäftigt sich mit dem Problem.

Beispiele

Softwaremixing

Stereo

Alle Stereo-Kanäle werden auf das Standard-Gerät gelenkt, und dort in ein 44,1KHz Summensignal gewandelt. Aufnahme und Wiedergabe funktionieren nur Stereo.

pcm.snd_card {
        type hw
        card 0
        device 0
}

ctl.snd_card {
        type hw
        card 0
        device 0
}

pcm.dmixer {
    type dmix
    ipc_key 1024
    ipc_perm 0666
    slave.pcm "snd_card"
    slave {
        period_time 0
        period_size 1024
        buffer_size 4096
        rate 44100
        channels 2
    }
    bindings {
        0 0
        1 1
    }
}

pcm.dsnooper {
    type dsnoop
    ipc_key 2048
    ipc_perm 0666 
    slave.pcm "snd_card"
    slave 
    {
        period_time 0
        period_size 1024
        buffer_size 4096
        rate 44100
        channels 2
    }
    bindings {
        0 0
        1 1
    }
}

pcm.duplex {
    type asym
    playback.pcm "dmixer"
    capture.pcm "dsnooper"
}

pcm.!default {
    type plug
    slave.pcm "duplex"
}

5.1 Surround

Alle Surround-Signale werden auf das Standard-Gerät gelenkt, und dort in ein 44,1KHz Summensignal gewandelt. Die Wiedergabe erfolgt in Surround, die Aufnahme bleibt stereo. Zusätzlich wird ein Gerät namens "upmix" erzeugt, welches Stereo-Soundquellen auf die 5.1-Boxen verteilt.

pcm.snd_card {
        type hw
        card 0
        device 0
}

ctl.snd_card {
        type hw
        card 0
        device 0
}

pcm.dmixer {
    type dmix
    ipc_key 1024
    ipc_perm 0666
    slave.pcm "snd_card"
    slave {
        period_time 0
        period_size 1024
        buffer_size 4096
        rate 44100
        channels 6
    }
    bindings {
        0 0
        1 1
        2 2
        3 3
        4 4
        5 5
    }
}

pcm.dsnooper {
    type dsnoop
    ipc_key 2048
    ipc_perm 0666 
    slave.pcm "snd_card"
    slave 
    {
        period_time 0
        period_size 1024
        buffer_size 4096
        rate 44100
        channels 2
    }
    bindings {
        0 0
        1 1
    }
}

pcm.duplex {
    type asym
    # Wenn man nur Stereo-Signale hat, so kann man alle upmixen lassen:
    # playback.pcm "upmix"
    # Falls nicht, so wählt man den normalen Weg
    playback.pcm "dmixer"
    # und spricht den upmix direkt an; zB "aplay -D upmix sound.wav"
    # In den allermeisten Fällen wird die Aufnahme nur Stereo sein:
    capture.pcm "dsnooper"
}

pcm.!default {
    type plug
    slave.pcm "duplex"
}

pcm.upmix {
     type route
     slave.pcm dmixer
     slave.channels 6
     ttable.0.0 1
     ttable.1.1 1
     ttable.0.2 1
     ttable.1.3 1
     ttable.0.4 0.5
     ttable.1.4 0.5
     ttable.0.5 0.5
     ttable.1.5 0.5
}

Kanal-Splitting

Bei einer 8-Kanal-Soundkarte werden 4 unabhängige Stereo-Ausgänge definiert. Diese müssen vom Player direkt angesprochen werden, ansonsten zieht das Standard-Gerät alles an sich. Eingebaut ist eine Ratekonversion auf 96KHz.

pcm.snd-card {
         type hw
         card 0
         device 0
}

ctl.snd-card {
         type hw
         card 0
         device 0
}

pcm.dmixer {
    type dmix
    ipc_key 1024
    ipc_perm 0666
    slave.pcm "snd-card"
    slave {
        period_time 0
        period_size 1024
        buffer_size 4096
        rate 96000
        channels 8
    }
    bindings {
        0 0
        1 1
        2 2
        3 3
        4 4
        5 5
        6 6
        7 7
    }
}

pcm.!default {
    type plug
    slave.pcm "dmixer"
}

pcm.stereo1 {
    type plug
    slave {
        pcm "dmixer"
        channels 8
    }
    ttable.0.0 1
    ttable.1.1 1
}

pcm.stereo2 {
    type plug
    slave {
        pcm "dmixer"
        channels 8
    }
    ttable.0.2 1
    ttable.1.3 1
}

pcm.stereo3 {
    type plug
    slave {
        pcm "dmixer"
        channels 8
    }
    ttable.0.4 1
    ttable.1.5 1
}

pcm.stereo4 {
    type plug
    slave {
        pcm "dmixer"
        channels 8
    }
    ttable.0.6 1
    ttable.1.7 1
}

Permanenter Upmix

Hier wird ein permanenter Upmix realisiert, der gleichzeitige Wiedergabe von 5.1 und Stereo-Signalen erlaubt. Zudem sind die Werte für den Soundchip CMI8738-MC6 angepasst. Außerdem wurde ein Lautstärke-Regler definiert (Software Master), der auf alle Kanäle zugleich wirkt.

### asoundrc for CMI8738-MC6

# 6 channel dmix
pcm.dmix6 {
        type dmix
        ipc_key 1024
        ipc_key_add_uid false
        ipc_perm 0660
        slave {
                pcm "hw:0,1"
                rate 48000
                channels 6
                period_time 0
                period_size 1024
                buffer_time 0
                buffer_size 5120
        }
}

# upmixing
pcm.ch51dup {
        type route
        slave.pcm dmix6
        slave.channels 6
        ttable.0.0 1
        ttable.1.1 1
        ttable.0.2 1
        ttable.1.3 1
        ttable.0.4 0.5
        ttable.1.4 0.5
        ttable.0.5 0.5
        ttable.1.5 0.5
} 

pcm.duplex {
        type asym
        playback.pcm "ch51dup"
        capture.pcm "hw:0"
}

pcm.!default {
        type softvol
        slave.pcm "duplex"
        control {
                name "Software Master"
                card 0
        }
}

# for aoss
pcm.dsp "duplex"
pcm.dsp1 "duplex"

Unabhängige Stereokanäle

Speziell für den Soundchip "ice1712" (genauer: eine "M-Audio Delta 1010LT") ist diese Konfiguration geeignet. Natürlich muss mittels des Mixers envy24control die Karte ebenfalls auf 96kHz eingestellt worden sein.

pcm.ice {
        type hw
        card 0
        device 0
}

ctl.ice {
        type hw
        card 0
        device 0
}

pcm.dmixer {
    type dmix
    ipc_key 1024
    ipc_perm 0666
    slave.pcm "ice"
    slave {
        period_time 0
        period_size 1024
        buffer_size 4096
        rate 96000
        format S32_LE
        channels 8
    }
    bindings {
        0 0
        1 1
        2 2
        3 3
        4 4
        5 5
        6 6
        7 7
    }
}

pcm.dsnooper {
    type dsnoop
    ipc_key 2048
    ipc_perm 0666 
    slave.pcm "ice"
    slave {
        period_time 0
        period_size 1024
        buffer_size 4096
        rate 96000
        format S32_LE
        channels 8 
    }
    bindings {
        0 0
        1 1
        2 2
        3 3
        4 4
        5 5
        6 6
        7 7
    }
}

pcm.duplex {
    type asym
    playback.pcm "dmixer"
    capture.pcm "dsnooper"
}

pcm.!default {
        type softvol
        slave.pcm "plug:dmixer"
        control {
                name "Master"
                card 0
        }
}

pcm.dsp "duplex"
pcm.dsp1 "duplex"

pcm.stereo1 {
    type plug
    slave {
        pcm "duplex"
        channels 8
    }
    ttable.0.0 1
    ttable.1.1 1
}

pcm.stereo2 {
    type plug
    slave {
        pcm "duplex"
        channels 8
    }
    ttable.0.2 1
    ttable.1.3 1
}

pcm.stereo3 {
    type plug
    slave {
        pcm "duplex"
        channels 8
    }
    ttable.0.4 1
    ttable.1.5 1
}

pcm.stereo4 {
    type plug
    slave {
        pcm "duplex"
        channels 8
    }
    ttable.0.6 1
    ttable.1.7 1
}

Unabhängige Stereokanäle

Speziell für die Terratec Producer Phase26 ist diese Konfiguration geeignet. Die Karte sollte auf 16/48 eingestellt sein!

pcm.snd_card {
	type hw
	card USB1648
	device 0
}

ctl.snd_card {
	type hw
	card USB1648
	device 0
}

pcm.dmixer {
	type dmix
	ipc_key 1024
	ipc_perm 0666
	slave.pcm "snd_card"
	slave {
		period_time 0
		period_size 1024
		buffer_size 4096
		rate 48000
		format S32_LE
		channels 6
	}
	bindings {
		0 0
		1 1
		2 2
		3 3
		4 4
		5 5
	}
}

pcm.!default {
	type plug
	slave.pcm "dmixer"
}

pcm.all {
	type plug
	slave.pcm "dmixer"
	slave.channels 6
	route_policy duplicate
}

pcm.stereo1 {
	type plug
	slave {
		pcm "dmixer"
		channels 6
	}
	ttable.0.0 1
	ttable.1.1 1
}

pcm.stereo2 {
	type plug
	slave {
		pcm "dmixer"
		channels 6
	}
	ttable.0.2 1
	ttable.1.3 1
}

pcm.stereo3 {
	type plug
	slave {
		pcm "dmixer"
		channels 6
	}
	ttable.0.4 1
	ttable.1.5 1
}

Mögliche Fehlerquellen

Anzahl der Kanäle falsch

Wenn mit channels bzw. bindings mehr Kanäle angegeben sind, als tatsächlich vorhanden sind, gibt es keine Ausgabe bzw. keine Aufnahme. Bei Mikrofoneingängen ist z.B. manchmal nur ein Kanal vorhanden.

Rate falsch

Klingt die Musik, wie bei einer schlecht geputzten CD, kann es sein, dass die Ausgabe mit einer Rate von 44100 Hz Abhilfe für die gegebene Soundkarte verschafft. Andere Soundkarten verlangen eine Rate von 48000 Hz. Will man z.B. die Rate für das Gerät "dmixer" umstellen, so geht man wie oben beschrieben vor. Alternativ kann man auch eine direkte Zuweisung vornehmen:

pcm.dmixer.slave.rate 44100

.asoundrc wird ignoriert

In seltenen Fällen wird die Datei vom Soundsystem ignoriert. Die Ursache ist unklar, hängt jedoch mit der verwendeten Hardware zusammen. Zudem tritt das Problem nur unter Ubuntu auf, andere Distributionen scheinen nicht betroffen. Es kann sein, dass speziell bei Ubuntu einige Konfigurationsdateien von Alsa verändert wurden, was bei bestimmter Hardware zu Problemen führt. Beim Autor war dies unter Karmic und einer HDA ATI SB Karte der Fall. Nach einem Austausch der Karte gegen eine mit einem ICE1712-Chip funktionierte alles wieder wie gewünscht. Wahrscheinlich würde auch helfen, ALSA aus den Quellen selbst zu bauen; getestet wurde dies jedoch nicht.