#pcm.!default { # type hw # card 0 # device 7 #} pcm.analog_card { type hw card 0 device 0 } ctl.analog_card { type hw card 0 device 0 } pcm.digital_card { type hw card 0 device 1 } ctl.digital_card { type hw card 0 device 1 } pcm.hdmi_card { type hw card 0 device 7 } ctl.hdmi_card { type hw card 0 device 7 } pcm.!default { type plug slave.pcm both } #ctl.!default { # type hw # card "Intel" #} # Creates a card named "both", which is basically a wrapper around a plugin, in # this case "route". pcm.both { # The "route" plugin routes channels from its input card to its output. type route # Slave is the input card. slave { # The virtual input card has 4 channels. Yes, this is circumstantial and # also must be specified explicitly. channels 4 # Unnamed definition of the input card. pcm { # The "multi" plugin merges several cards into one. This is necessary, # because the "route" plugin can only handle one card. type multi slaves.a.pcm analog_card slaves.b.pcm hdmi_card slaves.a.channels 2 slaves.b.channels 2 # Definition of the card's channels. bindings { # Channel 0... 0 { # ... bound to child card "a"'s... slave a # ... channel 0. channel 0 } 1 { slave a channel 1 } 2 { slave b channel 0 } 3 { slave b channel 1 } } } } # Definition of transfer table for the card's output. ttable { # Channel 0... 0 { # ... bound to child card's channel 0 at full volume... 0 1.0 # ... AND child child card's channel 1 at full volume. 2 1.0 } 1 { 1 1.0 3 1.0 } } } # This defines the controls for the card "both", which is what tools such as # alsamixer refer to. #ctl.both { # type hw # card "Intel" #}