#
#  USB-Audio.conf - configuration for USB Audio devices
#
#
#  DO NO EDIT; this is an internal ALSA file.
#  If you want to add your own definitions, put them into /etc/asound.conf or
#  ~/.asoundrc, with "cards." before the "USB-Audio", e.g.:
#
#  cards.USB-Audio.pcm.use_dmix."NoiseBlaster 3000" no
#
#  If your device requires such a definition to work correctly, please report it
#  to <alsa-devel@alsa-project.org>.


# If a device has sample formats not supported by dmix, dmix can be disabled
# here.
USB-Audio.pcm.use_dmix {
	"AudioPhile" no    # uses big-endian 24-bit samples
	"Audiophile USB (tm)" no
}

# If a device does not have a four-channel mode for the front/rear outputs,
# other modes can be selected here.
# six_channels       - for devices that route the last two of the four channels
#                      to the center/LFE outputs
# two_stereo_devices - for devices that have two stereo audio interfaces
USB-Audio.pcm.surround40_type {
	"AudioPhile" two_stereo_devices
	"Audiophile USB (tm)" two_stereo_devices
	"OmniStudio" two_stereo_devices
	"Quattro" two_stereo_devices
	"SB Audigy 2 NX" six_channels
}

# If a device does not use the first PCM device for digital data, the device
# number for the iec958 device can be changed here.
USB-Audio.pcm.iec958_device {
	# "NoiseBlaster 3000" 42
}


# If a device requires non-standard definitions for front, surround40,
# surround51, surround71 or iec958, they can be defined here.

# M-Audio AudioPhile USB:
# device 0: analog output, digital input
# device 1: digital output, analog input
USB-Audio."AudioPhile".pcm.default "cards.USB-Audio.Audiophile USB (tm).pcm.default"
USB-Audio."Audiophile USB (tm)".pcm.default {
	@args [ CARD ]
	@args.CARD { type string }
	type asym
	playback.pcm {
		type plug
		slave.pcm {
			type hw
			card $CARD
			device 0
		}
	}
	capture.pcm {
		type plug
		slave.pcm {
			@func concat
			strings [ "dsnoop:DEVICE=1,CARD=" $CARD ]
		}
	}
}
USB-Audio."AudioPhile".pcm.iec958 "cards.USB-Audio.Audiophile USB (tm).pcm.iec958"
USB-Audio."Audiophile USB (tm)".pcm.iec958 {
	@args [ CARD AES0 AES1 AES2 AES3 ]
	@args.CARD { type string }
	@args.AES0 { type integer }
	@args.AES1 { type integer }
	@args.AES2 { type integer }
	@args.AES3 { type integer }
	type asym
	playback.pcm {
		type hw
		card $CARD
		device 1
	}
	capture.pcm {
		type hw
		card $CARD
		device 0
	}
}


################################################################################

<confdir:pcm/front.conf>

USB-Audio.pcm.front.0 {
	@args [ CARD ]
	@args.CARD { type string }
	@func refer
	name {
		@func concat
		strings [
			"cards.USB-Audio."
			{ @func card_name card $CARD }
			".pcm.front:CARD=" $CARD
		]
	}
	default {
		# We could use softvol, but the driver might have guessed a
		# wrong name for the real volume control.
		type hw
		card $CARD
		device 0
	}
}	

USB-Audio.pcm.default {
	@args [ CARD ]
	@args.CARD { type string }
	type asym
	playback.pcm {
		type plug
		slave.pcm {
			@func refer
			name {
				@func concat
				strings [
					"cards.USB-Audio.pcm.default_playback_dmix_"
					{
						@func refer
						name {
							@func concat
							strings [
								"cards.USB-Audio.pcm.use_dmix."
								{ @func card_name card $CARD }
							]
						}
						default yes
					}
					":CARD=" $CARD
				]
			}
		}
	}
	capture.pcm {
		type plug
		slave.pcm {
			@func concat
			strings [ "dsnoop:" $CARD ]
		}
	}
}

USB-Audio.pcm.default_playback_dmix_yes {
	@args [ CARD ]
	@args.CARD { type string }
	@func concat
	strings [ "dmix:" $CARD ]
}

USB-Audio.pcm.default_playback_dmix_no {
	@args [ CARD ]
	@args.CARD { type string }
	type hw
	card $CARD
	device 0
}

<confdir:pcm/surround40.conf>

USB-Audio.pcm.surround40.0 {
	@args [ CARD ]
	@args.CARD { type string }
	@func refer
	name {
		@func concat
		strings [
			"cards.USB-Audio."
			{ @func card_name card $CARD }
			".pcm.surround40:CARD=" $CARD
		]
	}
	default {
		@func refer
		name {
			@func concat
			strings [
				"cards.USB-Audio.pcm.surround40_"
				{
					@func refer
					name {
						@func concat
						strings [
							"cards.USB-Audio.pcm.surround40_type."
							{ @func card_name card $CARD }
						]
					}
					default default
				}
				":CARD=" $CARD
			]
		}
	}
}

USB-Audio.pcm.surround40_default {
	@args [ CARD ]
	@args.CARD { type string }
	type hw
	card $CARD
	device 0
}

USB-Audio.pcm.surround40_six_channels {
	@args [ CARD ]
	@args.CARD { type string }
	type route
	ttable.0.0 1
	ttable.1.1 1
	ttable.2.4 1
	ttable.3.5 1
	slave {
		pcm {
			type hw
			card $CARD
			device 0
		}
		channels 6
	}
}

USB-Audio.pcm.surround40_two_stereo_devices {
	@args [ CARD ]
	@args.CARD { type string }
	type route
	ttable.0.0 1
	ttable.1.1 1
	ttable.2.2 1
	ttable.3.3 1
	slave.pcm {
		type multi
		slaves {
			a {
				pcm {
					type hw
					card $CARD
					device 0
				}
				channels 2
			}
			b {
				pcm {
					type hw
					card $CARD
					device 1
				}
				channels 2
			}
		}
		bindings [
			{ slave a channel 0 }
			{ slave a channel 1 }
			{ slave b channel 0 }
			{ slave b channel 1 }
		]
	}
}

<confdir:pcm/surround41.conf>
<confdir:pcm/surround50.conf>
<confdir:pcm/surround51.conf>

USB-Audio.pcm.surround51.0 {
	@args [ CARD ]
	@args.CARD { type string }
	@func refer
	name {
		@func concat
		strings [
			"cards.USB-Audio."
			{ @func card_name card $CARD }
			".pcm.surround51:CARD=" $CARD
		]
	}
	default {
		type route
		ttable.0.0 1
		ttable.1.1 1
		ttable.2.4 1
		ttable.3.5 1
		ttable.4.2 1
		ttable.5.3 1
		slave {
			pcm {
				type hw
				card $CARD
				device 0
			}
			channels 6
		}
	}
}

<confdir:pcm/surround71.conf>

USB-Audio.pcm.surround71.0 {
	@args [ CARD ]
	@args.CARD { type string }
	@func refer
	name {
		@func concat
		strings [
			"cards.USB-Audio."
			{ @func card_name card $CARD }
			".pcm.surround71:CARD=" $CARD
		]
	}
	default {
		type route
		ttable.0.0 1
		ttable.1.1 1
		ttable.2.4 1
		ttable.3.5 1
		ttable.4.2 1
		ttable.5.3 1
		ttable.6.6 1
		ttable.7.7 1
		slave {
			pcm {
				type hw
				card $CARD
				device 0
			}
			channels 8
		}
	}
}

<confdir:pcm/iec958.conf>

USB-Audio.pcm.iec958.0 {
	@args [ CARD AES0 AES1 AES2 AES3 ]
	@args.CARD { type string }
	@args.AES0 { type integer }
	@args.AES1 { type integer }
	@args.AES2 { type integer }
	@args.AES3 { type integer }
	@func refer
	name {
		@func concat
		strings [
			"cards.USB-Audio."
			{ @func card_name card $CARD }
			".pcm.iec958:CARD=" $CARD
			",AES0=" $AES0 ",AES1=" $AES1 ",AES2=" $AES2 ",AES3=" $AES3
		]
	}
	default {
		# FIXME: we cannot set the AES parameters
		type hw
		card $CARD
		device {
			@func refer
			name {
				@func concat
				strings [
					"cards.USB-Audio.pcm.iec958_device."
					{ @func card_name card $CARD }
				]
			}
			default 0
		}
	}
}

# vim: ft=alsaconf
