# Generic HDA devices for analog I/O

Define.FrontMicName ""
Define.FrontMicJack ""
Define.DeviceFrontMic ""
Define.LineDevice ""
Define.hpvol "Headphone"
Define.hpjack "Headphone Jack"
Define.loctl "Line"
Define.lovol "Line"

If.imicname {
	Condition {
		Type ControlExists
		Control "name='Internal Mic Boost Volume'"
	}
	True.Define {
		FrontMicName "Internal"
	}
}

If.fmicname {
	Condition {
		Type ControlExists
		Control "name='Front Mic Playback Switch'"
	}
	True.Define {
		FrontMicName "Front"
		FrontMicJack "Front Mic Jack"
	}
}

If.fmic {
	Condition {
		Type String
		Empty "${var:FrontMicName}"
	}
	False {
		If.mic2 {
			Condition {
				Type String
				String1 "${var:DeviceMic}"
				String2 "Mic2"
			}
			True.Define {
				DeviceFrontMic "Mic3"
			}
			False.Define {
				DeviceMic "Mic1"
				DeviceFrontMic "Mic2"
			}
		}
	}
}

If.lineout {
	Condition {
		Type ControlExists
		Control "name='Line Out Playback Volume'"
	}
	True.Define {
		loctl "Line Out"
		lovol "Line Out"
	}
}

If.linefront {
	Condition {
		Type ControlExists
		Control "name='Front Playback Volume'"
	}
	True.Define {
		LineDevice "1"
	}
}

If.hplo {
	Condition {
		Type ControlExists
		Control "name='Headphone+LO Playback Volume'"
	}
	True.Define {
		hpvol "Headphone+LO"
		lovol "Headphone+LO"
	}
}

If.hpjack {
	Condition {
		Type ControlExists
		Control "iface=CARD,name='Headphone Mic Jack'"
	}
	True.Define.hpjack "Headphone Mic Jack"
	False.If.front {
		Condition {
			Type ControlExists
			Control "iface=CARD,name='Front Headphone Jack'"
		}
		True.Define.hpjack "Front Headphone Jack"
	}
}

SectionDevice."Headphones" {
	Comment "Headphones"

	If.headphone_switch {
		Condition {
			Type ControlExists
			Control "name='Headphone Playback Switch'"
		}
		True {
			EnableSequence [
				cset "name='Headphone Playback Switch' on"
			]
			DisableSequence [
				cset "name='Headphone Playback Switch' off"
			]
		}
	}

	Value {
		PlaybackPriority 200
		PlaybackPCM "hw:${CardId}"
		PlaybackMixerElem "${var:hpvol}"
		PlaybackMasterElem "Master"
		PlaybackVolume "${var:hpvol} Playback Volume"
		PlaybackSwitch "Headphone Playback Switch"
		JackControl "${var:hpjack}"
	}
}

If.spk {
	Condition {
		Type ControlExists
		Control "name='Speaker Playback Switch'"
	}
	True.SectionDevice."Speaker" {
		Comment "Speaker"

		If.seq {
			Condition {
				Type ControlExists
				Control "name='Bass Speaker Playback Switch'"
			}
			True {
				EnableSequence [
					cset "name='Speaker Playback Switch' on"
					cset "name='Bass Speaker Playback Switch' on"
				]

				DisableSequence [
					cset "name='Speaker Playback Switch' off"
					cset "name='Bass Speaker Playback Switch' off"
				]
			}
			False {
				EnableSequence [
					cset "name='Speaker Playback Switch' on"
				]

				DisableSequence [
					cset "name='Speaker Playback Switch' off"
				]
			}
		}

		Value {
			PlaybackPriority 100
			PlaybackPCM "hw:${CardId}"
			PlaybackMixerElem "Speaker"
			PlaybackMasterElem "Master"
			PlaybackVolume "Speaker Playback Volume"
			PlaybackSwitch "Speaker Playback Switch"
		}
	}
}

If.monomic {
	Condition {
		Type ControlExists
		Control "name='Input Source'"
		ControlEnum "Headphone Mic"
	}
	True {
		SectionDevice."${var:DeviceMic}" {
			Comment "Headphones Stereo Microphone"

			ConflictingDevice [
				"Headset"
			]

			EnableSequence [
				cset "name='Input Source' 'Headphone Mic'"
			]

			Value {
				CapturePriority 200
				Include.value.File "/HDA/HDA-Capture-value.conf"
				CaptureMasterElem "Headphone Mic Boost"
				JackControl "Headphone Mic Jack"
			}
		}

		SectionDevice."Headset" {
			Comment "Headset Mono Microphone"

			EnableSequence [
				cset "name='Input Source' 'Headset Mic'"
			]

			Value {
				CapturePriority 300
				Include.value.File "/HDA/HDA-Capture-value.conf"
				CaptureMasterElem "Headset Mic Boost"
				JackControl "Headphone Mic Jack"
			}
		}
	}
	False {
		SectionDevice."${var:DeviceMic}" {
			Comment "Headphones Stereo Microphone"

			Value {
				CapturePriority 200
				Include.value.File "/HDA/HDA-Capture-value.conf"
				CaptureMasterElem "Mic Boost"
				JackControl "Mic Jack"
			}
		}
	}
}

If.frontmic {
	Condition {
		Type String
		Empty "${var:DeviceFrontMic}"
	}
	False.SectionDevice."${var:DeviceFrontMic}" {
		Comment "${var:FrontMicName} Stereo Microphone"

		ConflictingDevice [
			"${var:DeviceMic}"
		]

		Value {
			CapturePriority 400
			Include.value.File "/HDA/HDA-Capture-value.conf"
			CaptureMasterElem "${var:FrontMicName} Mic Boost"
		}
		If.jack {
			Condition {
				Type String
				Empty "${var:FrontMicJack}"
			}
			False.Value.JackControl "${var:FrontMicJack}"
		}
	}
}

If.line {
	Condition {
		Type ControlExists
		Control "name='${var:loctl} Playback Switch'"
	}
	True.SectionDevice."Line${var:LineDevice}" {
		Comment "Line Output"

		If.conflict {
			Condition {
				Type String
				String1 "${var:lovol}"
				String2 "Headphone+LO"
			}
			True.ConflictingDevice [
				"Headphones"
			]
		}

		EnableSequence [
			cset "name='${var:loctl} Playback Switch' on"
		]
		DisableSequence [
			cset "name='${var:loctl} Playback Switch' off"
		]

		Value {
			PlaybackPriority 300
			PlaybackPCM "hw:${CardId}"
			PlaybackMixerElem "${var:lovol}"
			PlaybackMasterElem "Master"
			PlaybackVolume "${var:lovol} Playback Volume"
			PlaybackSwitch "${var:loctl} Playback Switch"
			JackControl "${var:loctl} Jack"
		}
	}
}

If.linefront {
	Condition {
		Type ControlExists
		Control "name='Front Playback Switch'"
	}
	True.SectionDevice."Line2" {
		Comment "Second Line Output"

		ConflictingDevice [
			"Line${var:LineDevice}"
		]

		EnableSequence [
			cset "name='Front Playback Switch' on"
		]
		DisableSequence [
			cset "name='Front Playback Switch' off"
		]

		Value {
			PlaybackPriority 250
			PlaybackPCM "hw:${CardId}"
			PlaybackMixerElem "Front"
			PlaybackMasterElem "Master"
			PlaybackVolume "Front Playback Volume"
			PlaybackSwitch "Front Playback Switch"
			JackControl "Line Out Front Jack"
		}
	}
}
