ucm: fix the cdev initialization sequence

The default values must be set before the defaults
UCM sequence is executed.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2019-11-26 17:35:15 +01:00
parent cf630e4e54
commit 4c89f4eb90

View file

@ -489,6 +489,45 @@ static int execute_component_seq(snd_use_case_mgr_t *uc_mgr,
return err;
}
static int add_auto_value(snd_use_case_mgr_t *uc_mgr, const char *key, char *value)
{
char *s;
int err;
err = get_value1(uc_mgr, &value, &uc_mgr->value_list, key);
if (err == -ENOENT) {
s = strdup(value);
if (s == NULL)
return -ENOMEM;
return uc_mgr_add_value(&uc_mgr->value_list, key, s);
} else if (err < 0) {
return err;
}
free(value);
return 0;
}
static int add_auto_values(snd_use_case_mgr_t *uc_mgr)
{
struct ctl_list *ctl_list;
const char *id;
char buf[40];
int err;
ctl_list = uc_mgr_get_one_ctl(uc_mgr);
if (ctl_list) {
id = snd_ctl_card_info_get_id(ctl_list->ctl_info);
snprintf(buf, sizeof(buf), "hw:%s", id);
err = add_auto_value(uc_mgr, "PlaybackCTL", buf);
if (err < 0)
return err;
err = add_auto_value(uc_mgr, "CaptureCTL", buf);
if (err < 0)
return err;
}
return 0;
}
/**
* \brief Import master config and execute the default sequence
* \param uc_mgr Use case manager
@ -499,6 +538,9 @@ static int import_master_config(snd_use_case_mgr_t *uc_mgr)
int err;
err = uc_mgr_import_master_config(uc_mgr);
if (err < 0)
return err;
err = add_auto_values(uc_mgr);
if (err < 0)
return err;
err = execute_sequence(uc_mgr, &uc_mgr->default_list,
@ -882,45 +924,6 @@ static int set_device(snd_use_case_mgr_t *uc_mgr,
return err;
}
static int add_auto_value(snd_use_case_mgr_t *uc_mgr, const char *key, char *value)
{
char *s;
int err;
err = get_value1(uc_mgr, &value, &uc_mgr->value_list, key);
if (err == -ENOENT) {
s = strdup(value);
if (s == NULL)
return -ENOMEM;
return uc_mgr_add_value(&uc_mgr->value_list, key, s);
} else if (err < 0) {
return err;
}
free(value);
return 0;
}
static int add_auto_values(snd_use_case_mgr_t *uc_mgr)
{
struct ctl_list *ctl_list;
const char *id;
char buf[40];
int err;
ctl_list = uc_mgr_get_one_ctl(uc_mgr);
if (ctl_list) {
id = snd_ctl_card_info_get_id(ctl_list->ctl_info);
snprintf(buf, sizeof(buf), "hw:%s", id);
err = add_auto_value(uc_mgr, "PlaybackCTL", buf);
if (err < 0)
return err;
err = add_auto_value(uc_mgr, "CaptureCTL", buf);
if (err < 0)
return err;
}
return 0;
}
/**
* \brief Init sound card use case manager.
* \param uc_mgr Returned use case manager pointer
@ -959,10 +962,6 @@ int snd_use_case_mgr_open(snd_use_case_mgr_t **uc_mgr,
goto err;
}
err = add_auto_values(mgr);
if (err < 0)
goto err;
*uc_mgr = mgr;
return 0;