HDA: use device labels

This is huge cleanup using new device labels in 'Syntax 8' to remove
a lot of conditions. The future extensions will be simplier.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2026-01-13 16:41:35 +01:00
commit d2d810a35f
6 changed files with 114 additions and 354 deletions

View file

@ -1,10 +1,10 @@
Syntax 6
Syntax 8
Define.Use "" # a non-empty string to use UCM configuration for HDA devices
Define.Done "" # a non-empty string to skip the end error
Define.AcpCardId "$${find-card:field=name,return=id,regex='^acp(|6[23x]|-pdm-mach)$'}"
Define.DeviceMic "Mic"
Define.MicType "hda"
If.dualcodec {
Condition {
@ -26,7 +26,7 @@ If.acp {
}
False {
Define.Use y
Define.DeviceMic "Mic2"
Define.MicType "acp"
}
}

View file

@ -1,4 +1,4 @@
SectionDevice."Mic1" {
SectionDevice."Mic:acp" {
Comment "Digital Microphone"
Value {

View file

@ -1,6 +1,5 @@
# Generic HDA devices for analog I/O
Define.LineDevice ""
Define.spkvol "Speaker"
Define.hpvol "Headphone"
Define.hpjack "Headphone Jack"
@ -44,16 +43,6 @@ If.lineout {
}
}
If.linefront {
Condition {
Type ControlExists
Control "name='Front Playback Volume'"
}
True.Define {
LineDevice "1"
}
}
If.hpvol {
Condition {
Type ControlExists
@ -188,7 +177,7 @@ If.line {
Type String
Empty "${var:loctl}"
}
False.SectionDevice."Line${var:LineDevice}" {
False.SectionDevice."Line:main" {
Comment "Line Output"
If.conflict {
@ -234,18 +223,12 @@ If.linefront {
Type ControlExists
Control "name='Front Playback Switch'"
}
True.SectionDevice."Line2" {
True.SectionDevice."Line:front" {
Comment "Second Line Output"
If.line1exists {
Condition {
Type String
Empty "${var:loctl}"
}
False.ConflictingDevice [
"Line${var:LineDevice}"
ConflictingDevice [
"Line:main"
]
}
EnableSequence [
cset "name='Front Playback Switch' on"

View file

@ -1,12 +1,8 @@
# Generic handling of analog microphones on HDA devices
# Microphone related variables on entry
# If DMIC is present:
# (DeviceDmic == "Mic1")
# DeviceMic == "Mic2"
#
# If DMIC is not present:
# DeviceMic == "Mic"
# MicType == "hda" # HDA microphone
# MicType != "hda" # other microphone type (AMD 'acp', Intel 'sof-dsp')
# Microphone related variables as used internally
# HDA codecs can offer input source selection (mux) via "Input Source" or
@ -21,31 +17,11 @@
# This leads to up to maximum of four possible input devices.
Define.SourceControl ""
Define.MicExtraPriority 0
Define.MicJackControl ""
Define.MicHPJackControl ""
Define.MicHSJackControl ""
# DeviceMic is pre-configured
Define.DeviceMicName ""
Define.DeviceMicComment ""
Define.DeviceMicPriority ""
Define.DeviceMicJack ""
Define.DeviceMic2 ""
Define.DeviceMic2Name ""
Define.DeviceMic2Comment ""
Define.DeviceMic2Priority ""
Define.DeviceMic2Jack ""
Define.DeviceMic3 ""
Define.DeviceMic3Name ""
Define.DeviceMic3Comment ""
Define.DeviceMic3Priority ""
Define.DeviceMic3Jack ""
Define.DeviceMic4 ""
Define.DeviceMic4Name ""
Define.DeviceMic4Comment ""
Define.DeviceMic4Priority ""
Define.DeviceMic4Jack ""
# evaluate the microphone jack name
If.micjack {
Condition {
@ -119,39 +95,77 @@ If.inputsourcectl {
}
}
# Set initial names and priorities for the SectionDevices based on the presence
# of DMIC (DMIC is named as 'Mic1')
# Extra priority for systems with DMIC presence (MicType != 'hda')
If.micdevs {
# DeviceMic == "Mic2" indicates DMIC presence
Condition {
Type String
String1 "${var:DeviceMic}"
String2 "Mic2"
String1 "${var:MicType}"
String2 "hda"
}
True.Define {
# DeviceMic "Mic2" - already set (Mic1 is DMIC)
DeviceMicPriority 200
DeviceMic2 "Mic3"
DeviceMic2Priority 300
DeviceMic3 "Mic4"
DeviceMic3Priority 400
DeviceMic4 "Mic5"
DeviceMic4Priority 500
False.Define.MicExtraPriority 100
}
# Macro HDAMicEnum - Create the SectionDevice for HDA inputs
#
# Arguments:
# DevName - Name of the device (used as SectionDevice."${var:__DevName}"
# Enum - Name of the source/input enum
# Comment - Long name of the SectionDevice
# Jack - Jack control if available
# Priority - CapturePriority
DefineMacro.HDAMicEnum.SectionDevice."${var:__DevName}" {
Comment "${var:__Comment}"
EnableSequence [
cset "name='${var:SourceControl}' '${var:__Enum}'"
]
Value {
CapturePriority "${eval:($__Priority+$MicExtraPriority)}"
CapturePCM "hw:${CardId}"
CaptureMixerElem "Capture"
CaptureVolume "Capture Volume"
CaptureSwitch "Capture Switch"
CaptureMasterElem "${var:__Enum} Boost"
}
False.Define {
DeviceMic "Mic1"
DeviceMicPriority 100
DeviceMic2 "Mic2"
DeviceMic2Priority 200
DeviceMic3 "Mic3"
DeviceMic3Priority 300
DeviceMic4 "Mic4"
DeviceMic4Priority 400
If.jack {
Condition {
Type String
Empty "${var:-__Jack}"
}
False.Value.JackControl "${var:__Jack}"
}
ConflictingDevice [
"Mic:hda-int"
"Mic:hda-hp"
"Mic:hda"
"Headset:hda-mic"
]
}
# Macro HDAMicSwitch - Create the SectionDevice for HDA inputs (switches)
#
# Arguments:
# DevName - Name of the device (used as SectionDevice."${var:__DevName}"
# Name - Name of the controls
# Comment - Long name of the SectionDevice
# Jack - Jack control if available
# Priority - CapturePriority
DefineMacro.HDAMicSwitch.SectionDevice."${var:__DevName}" {
Comment "${var:__Comment}"
Value {
CapturePriority "${eval:($__Priority+$MicExtraPriority)}"
CapturePCM "hw:${CardId}"
CaptureMixerElem "${var:__Name}"
CaptureVolume "${var:__Name} Volume"
CaptureSwitch "${var:__Name} Switch"
CaptureMasterElem "${var:__Name} Boost"
JackControl "${var:__Jack}"
}
}
# Scan the Microphone configuration in the system and set the definitions for
# the SectionDevice creations for them.
If.micsetup {
Condition {
Type String
@ -160,292 +174,56 @@ If.micsetup {
False {
# the input selection is via ENUM, the possible types are
# Internal, Headset, Headphone and just 'Mic'
# Internal Mic
If.internalmic {
Condition {
Type ControlExists
Control "name='${var:SourceControl}'"
ControlEnum "Internal Mic"
Macro.in.HDAMicEnum {
DevName "Mic:hda-int"
Comment "Internal Stereo Microphone"
Enum "Internal Mic"
Priority 100
}
True.Define {
DeviceMicName "Internal Mic"
DeviceMicComment "Internal Stereo Microphone"
}
}
# Headphone Mic (Stereo Microphone in Headphone Jack)
If.hpmic {
Condition {
Type ControlExists
Control "name='${var:SourceControl}'"
ControlEnum "Headphone Mic"
}
True.If.whichdev {
Condition {
Type String
Empty "${var:DeviceMicName}"
}
True.Define {
DeviceMicName "Headphone Mic"
DeviceMicComment "Headphones Stereo Microphone"
DeviceMicJack "${var:MicHPJackControl}"
}
False.Define {
DeviceMic2Name "Headphone Mic"
DeviceMic2Comment "Headphones Stereo Microphone"
DeviceMic2Jack "${var:MicHPJackControl}"
}
}
}
# Just 'Mic'
If.justmic {
Condition {
Type ControlExists
Control "name='${var:SourceControl}'"
ControlEnum "Mic"
}
True.If.whichdev {
Condition {
Type String
Empty "${var:DeviceMicName}"
}
True.Define {
DeviceMicName "Mic"
DeviceMicComment "Stereo Microphone"
DeviceMicJack "${var:MicJackControl}"
}
False.If.whichdev2 {
Condition {
Type String
Empty "${var:DeviceMic2Name}"
}
True.Define {
DeviceMic2Name "Mic"
DeviceMic2Comment "Stereo Microphone"
DeviceMic2Jack "${var:MicJackControl}"
}
False.Define {
DeviceMic3Name "Mic"
DeviceMic3Comment "Stereo Microphone"
DeviceMic3Jack "${var:MicJackControl}"
}
}
}
}
# Headset Mono Mic
If.hsmic {
Condition {
Type ControlExists
Control "name='${var:SourceControl}'"
ControlEnum "Headset Mic"
}
True.If.whichdev {
# Override the DeviceMicX (which is used as
# SectionDevice name) for headset mic as per
# UCM naming convention, reference:
# https://github.com/alsa-project/alsa-lib/blob/master/include/use-case.h
Condition {
Type String
Empty "${var:DeviceMicName}"
}
True.Define {
DeviceMic "Headset"
DeviceMicName "Headset Mic"
DeviceMicComment "Headset Mono Microphone"
DeviceMicJack "${var:MicHSJackControl}"
}
False.If.whichdev2 {
Condition {
Type String
Empty "${var:DeviceMic2Name}"
}
True.Define {
DeviceMic2 "Headset"
DeviceMic2Name "Headset Mic"
DeviceMic2Comment "Headset Mono Microphone"
DeviceMic2Jack "${var:MicHSJackControl}"
}
False.If.whichdev3 {
Condition {
Type String
Empty "${var:DeviceMic2Name}"
}
True.Define {
DeviceMic3 "Headset"
DeviceMic3Name "Headset Mic"
DeviceMic3Comment "Headset Mono Microphone"
DeviceMic3Jack "${var:MicHSJackControl}"
}
False.Define {
DeviceMic4 "Headset"
DeviceMic4Name "Headset Mic"
DeviceMic4Comment "Headset Mono Microphone"
DeviceMic4Jack "${var:MicHSJackControl}"
}
}
Macro.hp.HDAMicEnum {
DevName "Mic:hda-hp"
Comment "Headphones Stereo Microphone"
Enum "Headphone Mic"
Priority 200
Jack "${var:MicHPJackControl}"
}
Macro.mi.HDAMicEnum {
DevName "Mic:hda"
Comment "Stereo Microphone"
Enum "Mic"
Priority 300
Jack "${var:MicJackControl}"
}
Macro.hs.HDAMicEnum {
DevName "Headset:hda-mic"
Comment "Headset Mono Microphone"
Enum "Headset Mic"
Priority 400
Jack "${var:MicHSJackControl}"
}
}
True {
# the input selection is via switches, the possible types are
# Mic and Front Mic
Define {
DeviceMicName "Mic"
DeviceMicComment "Stereo Microphone"
DeviceMicJack "${var:MicJackControl}"
DeviceMicPriority 200
Macro.mic.HDAMicSwitch {
DevName "Mic:hda"
Comment "Stereo Microphone"
Name "Mic"
Priority 100
Jack "${var:MicJackControl}"
}
If.fmic {
Condition {
Type ControlExists
Control "name='Front Mic Playback Switch'"
}
True.Define {
DeviceMic2Name "Front Mic"
DeviceMic2Comment "Front Stereo Microphone"
DeviceMic2Jack "Front Mic Jack"
DeviceMic2Priority 300
True.Macro.fmic.HDAMicSwitch {
DevName "Mic:hda-front"
Comment "Front Stereo Microphone"
Name "Front Mic"
Priority 200
Jack "Front Mic Jack"
}
}
}
}
# Macro HDACaptureDevice - Create the SectionDevice for HDA inputs
#
# Arguments:
# DevName - Name of the device (used as SectionDevice."${var:__DevName}"
# MicName - Name of the Microphone
# DevComment - Long name of the SectionDevice
# JackName - Jack control if available
# Priority - CapturePriority
# ConflictCondition1 - (string) if not empty, set ConflictingDevice 1
# ConflictDev1 - Name of the ConflictingDevice 1
# ConflictCondition2 - (string) if not empty, set ConflictingDevice 2
# ConflictDev2 - Name of the ConflictingDevice 2
# ConflictCondition3 - (string) if not empty, set ConflictingDevice 3
# ConflictDev3 - Name of the ConflictingDevice 3
DefineMacro.HDACaptureDevice.SectionDevice."${var:__DevName}" {
Comment "${var:__DevComment}"
If.micsetup {
Condition {
Type String
Empty "${var:SourceControl}"
}
False.EnableSequence [
cset "name='${var:SourceControl}' '${var:__MicName}'"
]
}
Value {
CapturePriority "${var:__Priority}"
CapturePCM "hw:${CardId}"
CaptureMixerElem "Capture"
CaptureVolume "Capture Volume"
CaptureSwitch "Capture Switch"
CaptureMasterElem "${var:__MicName} Boost"
}
If.jack {
Condition {
Type String
Empty "${var:__JackName}"
}
False.Value.JackControl "${var:__JackName}"
}
If.conflict1 {
Condition {
Type String
Empty "${var:-__ConflictCondition1}"
}
False.ConflictingDevice [
"${var:-__ConflictDev1}"
]
}
If.conflict2 {
Condition {
Type String
Empty "${var:-__ConflictCondition2}"
}
False.ConflictingDevice [
"${var:-__ConflictDev2}"
]
}
If.conflict3 {
Condition {
Type String
Empty "${var:-__ConflictCondition3}"
}
False.ConflictingDevice [
"${var:-__ConflictDev3}"
]
}
}
If.mic1 {
Condition {
Type String
Empty "${var:DeviceMicName}"
}
False.Macro.0.HDACaptureDevice {
DevName "${var:DeviceMic}"
MicName "${var:DeviceMicName}"
DevComment "${var:DeviceMicComment}"
JackName "${var:DeviceMicJack}"
Priority "${var:DeviceMicPriority}"
ConflictCondition1 "${var:DeviceMic2Name}" ConflictDev1 "${var:DeviceMic2}"
ConflictCondition2 "${var:DeviceMic3Name}" ConflictDev2 "${var:DeviceMic3}"
ConflictCondition3 "${var:DeviceMic4Name}" ConflictDev3 "${var:DeviceMic4}"
}
}
If.mic2 {
Condition {
Type String
Empty "${var:DeviceMic2Name}"
}
False.Macro.1.HDACaptureDevice {
DevName "${var:DeviceMic2}"
MicName "${var:DeviceMic2Name}"
DevComment "${var:DeviceMic2Comment}"
JackName "${var:DeviceMic2Jack}"
Priority "${var:DeviceMic2Priority}"
ConflictCondition1 "${var:DeviceMic3Name}" ConflictDev1 "${var:DeviceMic3}"
ConflictCondition2 "${var:DeviceMic4Name}" ConflictDev2 "${var:DeviceMic4}"
}
}
If.mic3 {
Condition {
Type String
Empty "${var:DeviceMic3Name}"
}
False.Macro.1.HDACaptureDevice {
DevName "${var:DeviceMic3}"
MicName "${var:DeviceMic3Name}"
DevComment "${var:DeviceMic3Comment}"
JackName "${var:DeviceMic3Jack}"
Priority "${var:DeviceMic3Priority}"
ConflictCondition1 "${var:DeviceMic4Name}" ConflictDev1 "${var:DeviceMic4}"
}
}
If.mic4 {
Condition {
Type String
Empty "${var:DeviceMic4Name}"
}
False.Macro.1.HDACaptureDevice {
DevName "${var:DeviceMic4}"
MicName "${var:DeviceMic4Name}"
DevComment "${var:DeviceMic4Comment}"
JackName "${var:DeviceMic4Jack}"
Priority "${var:DeviceMic4Priority}"
}
}

View file

@ -15,10 +15,10 @@ Include.sof-analog.File "HiFi-sof.conf"
If.dmic {
Condition {
Type String
Empty "${var:DeviceDmic}"
String1 "${var:MicType}"
String2 "sof-dsp"
}
Before.SectionDevice "${var:DeviceMic}"
False.SectionDevice."${var:DeviceDmic}" {
True.SectionDevice."Mic:sof-dsp" {
Comment "Digital Microphone"
Value {

View file

@ -1,11 +1,11 @@
Syntax 7
Syntax 8
Include.led.File "/common/ctl/led.conf"
Include.card-init.File "/lib/card-init.conf"
Include.dsp-variables.File "dsp.conf"
Define {
DeviceMic "Mic"
MicType "hda"
DeviceDmic ""
Iec61937Pcms1 ""
}
@ -24,8 +24,7 @@ If.devdmic {
Needle "cfg-dmics:"
}
True {
Define.DeviceDmic "Mic1"
Define.DeviceMic "Mic2"
Define.MicType "sof-dsp"
#
# users expect to turn the LED on when only internal
# mic is off, but it makes sense to turn this LED