snd-hda-intel -- ALSA --5.1 audio

Found this configuration and it appears to work very nicely (on-board Hi-def Intel family ICH9 ALC883, known to work with ALC888, may work with ALC889). It also solved many problems I had with the microphone (especially any Windows programs running under wine). The main thing you will notice is a new control in kmix (and others) labeled “2ch-Upmix Master”, this control solved many microphone problems. Should work well with Skype and others. You can place this file in your home directory.

.asoundrc

2008-11-15

This .asoundrc will allow the following:

- upmix stereo files to 5.1 speakers.

- playback real 5.1 sounds, on 5.1 speakers,

- allow the playback of both stere(oupmixed) and surround(5.1) sources at the same time.

- use the 6th and 7th channel (side speakers) as a separate soundcard, i.e. for headphones

(This is called the “alternate” output throughout the file, device names prefixed with ‘a’)

- play mono sources in stereo (like skype & ekiga) on the alterate output

Make sure you have “8 Channels” and NOT “6 Channels” selected in alsamixer!

Please try the following commands, to make sure everything is working as it should.

To test stereo upmix : speaker-test -c2 -Ddefault -twav

To test surround(5.1): speaker-test -c6 -Dplug:dmix6 -twav

To test alternative output: speaker-test -c2 -Daduplex -twav

To test mono upmix: speaker-test -c1 -Dmonoduplex -twav

It may not work out of the box for all cards. If it doesnt work for you, read the comments throughout the file.

The basis of this file was written by wishie of #alsa, and then modified with info from various sources by

squisher.

#Define the soundcard to use
pcm.snd_card {
type hw
card 0
device 0
}

8 channel dmix - output whatever audio, to all 8 speakers

pcm.dmix8 {
type dmix
ipc_key 1024
ipc_key_add_uid false
ipc_perm 0660
slave {
pcm “snd_card”
rate 44100
channels 8
period_time 0
period_size 1024
buffer_time 0
buffer_size 5120
}

Some cards, like the “nforce” variants require the following to be uncommented. It routes the audio to t he correct speakers.

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

}

upmixing - duplicate stereo data to all 6 channels

pcm.ch51dup {
type route
slave.pcm dmix8
slave.channels 8
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
}

this creates a six channel soundcard

and outputs to the eight channel one

i.e. for usage in mplayer I had to define in ~/.mplayer/config:

ao=alsa:device=dmix6

channels=6

pcm.dmix6 {
type route
slave.pcm dmix8
slave.channels 8
ttable.0.0 1
ttable.1.1 1
ttable.2.2 1
ttable.3.3 1
ttable.4.4 1
ttable.5.5 1
}

share the microphone, i.e. because virtualbox grabs it by default

pcm.microphone {
type dsnoop
ipc_key 1027
slave {
pcm “snd_card”
}
}

rate conversion, needed i.e. for wine

pcm.2chplug {
type plug
slave.pcm “ch51dup”
}
pcm.a2chplug {
type plug
slave.pcm “dmix8”
}

routes the channel for the alternative

2 channel output, which becomes the 7th and 8th channel

on the real soundcard

pcm.alt2ch {
type route
slave.pcm “a2chplug”
slave.channels 8
ttable.0.6 1
ttable.1.7 1
}

skype and ekiga are only mono, so route left channel to the right channel

note: this gets routed to the alternative 2 channels

pcm.mono_playback {
type route
slave.pcm “a2chplug”
slave.channels 8
# Send Skype channel 0 to the L and R speakers at full volume
ttable.0.6 1
ttable.0.7 1
}

‘full-duplex’ device for use with aoss

pcm.duplex {
type asym
playback.pcm “2chplug”
capture.pcm “microphone”
}

pcm.aduplex {
type asym
playback.pcm “alt2ch”
capture.pcm “microphone”
}

pcm.monoduplex {
type asym
playback.pcm “mono_playback”
capture.pcm “microphone”
}

for aoss

pcm.dsp0 “duplex”
ctl.mixer0 “duplex”

softvol manages volume in alsa

i.e. wine likes this

pcm.mainvol {
type softvol
slave.pcm “duplex”
control {
name “2ch-Upmix Master”
card 0
}
}

#pcm.!default “mainvol”

set the default device according to the environment

variable ALSA_DEFAULT_PCM and default to mainvol

pcm.!default {
@func refer
name { @func concat
strings “pcm.”
{ @func getenv
vars ALSA_DEFAULT_PCM ]
default “mainvol”
}
]
}
}

uncomment the following if you want to be able to control

the mixer device through environment variables as well

#ctl.!default {

@func refer

name { @func concat

strings “ctl.”

{ @func getenv

vars ALSA_DEFAULT_CTL

ALSA_DEFAULT_PCM

]

default “duplex”

}

]

}

#}

Thanks for sharing your discovery.