[RFC PATCH 06/11] ALSA: mixer_audient: Allow arbitrary boolean control values
From: Christian Ruppert
Date: Sat Oct 31 2026 - 20:03:20 EST
In preparation of id14 support, allow arbitrary values for true and false
of boolean switches. This also rids us of the tedious invert flag.
Signed-off-by: Christian Ruppert <arc@xxxxxx>
---
sound/usb/mixer_audient.c | 43 ++++++++++++++++++---------------------
1 file changed, 20 insertions(+), 23 deletions(-)
diff --git a/sound/usb/mixer_audient.c b/sound/usb/mixer_audient.c
index 1438cc192d34..6352aee0fb5e 100644
--- a/sound/usb/mixer_audient.c
+++ b/sound/usb/mixer_audient.c
@@ -41,13 +41,12 @@ static const struct snd_audient_ctrl_type {
snd_ctl_elem_type_t type;
unsigned long flags;
size_t len;
- bool invert;
union {
int integer;
- } min;
+ } min; /* for booleans holds physical int value for false */
union {
int integer;
- } max;
+ } max; /* for booleans holds physical int value for true */
const unsigned int *tlv;
u8 unit;
u8 sel;
@@ -63,7 +62,6 @@ static const struct snd_audient_ctrl_type {
},
[SND_AUDIENT_TYPE_PHANTOM] = {
.type = SNDRV_CTL_ELEM_TYPE_BOOLEAN,
- .invert = false,
.len = 4,
.min.integer = 0,
.max.integer = 1,
@@ -72,19 +70,17 @@ static const struct snd_audient_ctrl_type {
},
[SND_AUDIENT_TYPE_MUTE] = {
.type = SNDRV_CTL_ELEM_TYPE_BOOLEAN,
- .invert = true,
.len = 4,
- .min.integer = 0,
- .max.integer = 1,
+ .min.integer = 1,
+ .max.integer = 0,
.unit = 0x3A,
.sel = 0x02,
},
[SND_AUDIENT_TYPE_MUTE_OUT] = {
.type = SNDRV_CTL_ELEM_TYPE_BOOLEAN,
- .invert = true,
.len = 4,
- .min.integer = 0,
- .max.integer = 1,
+ .min.integer = 1,
+ .max.integer = 0,
.unit = 0x3B,
.sel = 0x01,
},
@@ -358,16 +354,12 @@ static int snd_ctl_audient_boolean_get(struct snd_kcontrol *kctl,
if (ret < 0)
return ret;
- ctl_val->value.integer.value[i] = buf ? 1 : 0;
-
- if (ctype->invert)
- ctl_val->value.integer.value[i] ^= 0x1;
+ ctl_val->value.integer.value[i] = (buf == ctype->min.integer)
+ ? false : true;
}
for (; i < nchan; i++)
- ctl_val->value.integer.value[i] = ctype->invert
- ? ctype->max.integer
- : ctype->min.integer;
+ ctl_val->value.integer.value[i] = 0;
return 0;
}
@@ -391,12 +383,10 @@ static int snd_ctl_audient_boolean_set(struct snd_kcontrol *kctl,
return pm.err;
for (i = 0; i < hwchan; i++) {
- u32 buf = ctl_val->value.integer.value[i] ? 1 : 0;
+ u32 buf = ctl_val->value.integer.value[i] ? ctype->max.integer
+ : ctype->min.integer;
int ret;
- if (ctype->invert)
- buf ^= 0x1;
-
ret = snd_audient_raw_set_one(mixer, ctype, base + i, buf);
if (ret < 0)
return ret;
@@ -484,8 +474,15 @@ static int snd_ctl_audient_info(struct snd_kcontrol *kctl,
uinfo->type = ctype->type;
uinfo->count = snd_audient_kctl_channels(kctl);
- uinfo->value.integer.min = ctype->min.integer;
- uinfo->value.integer.max = ctype->max.integer;
+
+ if (ctype->type == SNDRV_CTL_ELEM_TYPE_BOOLEAN) {
+ uinfo->value.integer.min = 0;
+ uinfo->value.integer.max = 1;
+ } else {
+ uinfo->value.integer.min = ctype->min.integer;
+ uinfo->value.integer.max = ctype->max.integer;
+ }
+
return 0;
}
--
2.56.0