pcm: softvol - add LED group support

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2021-02-22 20:25:42 +01:00
parent 569d945712
commit 2a7486c1dd

View file

@ -719,16 +719,18 @@ static int add_tlv_info(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo)
} }
static int add_user_ctl(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo, static int add_user_ctl(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo,
int count) int count, snd_ctl_led_group_t led)
{ {
int err; int err;
int i; int i;
unsigned int def_val; unsigned int def_val;
if (svol->max_val == 1) {
snd_ctl_elem_info_set_read_write(cinfo, 1, 1); snd_ctl_elem_info_set_read_write(cinfo, 1, 1);
snd_ctl_elem_info_set_led_group(cinfo, led);
if (svol->max_val == 1) {
err = snd_ctl_add_boolean_elem_set(svol->ctl, cinfo, 1, count); err = snd_ctl_add_boolean_elem_set(svol->ctl, cinfo, 1, count);
} else { } else {
snd_ctl_elem_info_set_tlv_read_write(cinfo, 1, 1);
err = snd_ctl_add_integer_elem_set(svol->ctl, cinfo, 1, count, err = snd_ctl_add_integer_elem_set(svol->ctl, cinfo, 1, count,
0, svol->max_val, 0); 0, svol->max_val, 0);
} }
@ -756,7 +758,7 @@ static int add_user_ctl(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo,
static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol, static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
int ctl_card, snd_ctl_elem_id_t *ctl_id, int ctl_card, snd_ctl_elem_id_t *ctl_id,
int cchannels, double min_dB, double max_dB, int cchannels, double min_dB, double max_dB,
int resolution) int resolution, snd_ctl_led_group_t led)
{ {
char tmp_name[32]; char tmp_name[32];
snd_pcm_info_t info = {0}; snd_pcm_info_t info = {0};
@ -799,7 +801,7 @@ static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
SNDERR("Cannot get info for CTL %s", tmp_name); SNDERR("Cannot get info for CTL %s", tmp_name);
return err; return err;
} }
err = add_user_ctl(svol, &cinfo, cchannels); err = add_user_ctl(svol, &cinfo, cchannels, led);
if (err < 0) { if (err < 0) {
SNDERR("Cannot add a control"); SNDERR("Cannot add a control");
return err; return err;
@ -821,7 +823,7 @@ static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
} }
/* reset numid */ /* reset numid */
snd_ctl_elem_info_set_id(&cinfo, ctl_id); snd_ctl_elem_info_set_id(&cinfo, ctl_id);
if ((err = add_user_ctl(svol, &cinfo, cchannels)) < 0) { if ((err = add_user_ctl(svol, &cinfo, cchannels, led)) < 0) {
SNDERR("Cannot add a control"); SNDERR("Cannot add a control");
return err; return err;
} }
@ -910,6 +912,7 @@ int snd_pcm_softvol_open(snd_pcm_t **pcmp, const char *name,
int ctl_card, snd_ctl_elem_id_t *ctl_id, int ctl_card, snd_ctl_elem_id_t *ctl_id,
int cchannels, int cchannels,
double min_dB, double max_dB, int resolution, double min_dB, double max_dB, int resolution,
snd_ctl_led_group_t led,
snd_pcm_t *slave, int close_slave) snd_pcm_t *slave, int close_slave)
{ {
snd_pcm_t *pcm; snd_pcm_t *pcm;
@ -928,7 +931,7 @@ int snd_pcm_softvol_open(snd_pcm_t **pcmp, const char *name,
if (! svol) if (! svol)
return -ENOMEM; return -ENOMEM;
err = softvol_load_control(slave, svol, ctl_card, ctl_id, cchannels, err = softvol_load_control(slave, svol, ctl_card, ctl_id, cchannels,
min_dB, max_dB, resolution); min_dB, max_dB, resolution, led);
if (err < 0) { if (err < 0) {
softvol_free(svol); softvol_free(svol);
return err; return err;
@ -1127,6 +1130,7 @@ pcm.name {
[max_dB REAL] # maximal dB value (default: 0.0) [max_dB REAL] # maximal dB value (default: 0.0)
[resolution INT] # resolution (default: 256) [resolution INT] # resolution (default: 256)
# resolution = 2 means a mute switch # resolution = 2 means a mute switch
[led STR] # LED group (speaker or microphone)
} }
\endcode \endcode
@ -1167,6 +1171,8 @@ int _snd_pcm_softvol_open(snd_pcm_t **pcmp, const char *name,
double min_dB = PRESET_MIN_DB; double min_dB = PRESET_MIN_DB;
double max_dB = ZERO_DB; double max_dB = ZERO_DB;
int card = -1, cchannels = 2; int card = -1, cchannels = 2;
snd_ctl_led_group_t led = SND_CTL_ELEM_LED_NONE;
const char *s;
snd_config_for_each(i, next, conf) { snd_config_for_each(i, next, conf) {
snd_config_t *n = snd_config_iterator_entry(i); snd_config_t *n = snd_config_iterator_entry(i);
@ -1209,6 +1215,21 @@ int _snd_pcm_softvol_open(snd_pcm_t **pcmp, const char *name,
} }
continue; continue;
} }
if (strcmp(id, "led") == 0) {
err = snd_config_get_string(n, &s);
if (err < 0) {
wrong_led_group:
SNDERR("Invalid LED group");
return err;
}
if (strcasecmp(s, "speaker") == 0)
led = SND_CTL_ELEM_LED_SPEAKER;
else if (strcasecmp(s, "mic") == 0)
led = SND_CTL_ELEM_LED_MICROPHONE;
else
goto wrong_led_group;
continue;
}
SNDERR("Unknown field %s", id); SNDERR("Unknown field %s", id);
return -EINVAL; return -EINVAL;
} }
@ -1267,7 +1288,7 @@ int _snd_pcm_softvol_open(snd_pcm_t **pcmp, const char *name,
} }
err = snd_pcm_softvol_open(pcmp, name, sformat, card, &ctl_id, err = snd_pcm_softvol_open(pcmp, name, sformat, card, &ctl_id,
cchannels, min_dB, max_dB, cchannels, min_dB, max_dB,
resolution, spcm, 1); resolution, led, spcm, 1);
if (err < 0) if (err < 0)
snd_pcm_close(spcm); snd_pcm_close(spcm);
} }