ucm: save the whole ctl info to the ctl_list structure

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2019-11-05 10:06:37 +01:00
parent 0dd89f3892
commit d8dfe4dac7
4 changed files with 47 additions and 37 deletions

View file

@ -1361,35 +1361,32 @@ static char *rval_conf_name(snd_use_case_mgr_t *uc_mgr)
static char *rval_card_id(snd_use_case_mgr_t *uc_mgr) static char *rval_card_id(snd_use_case_mgr_t *uc_mgr)
{ {
struct list_head *pos; struct ctl_list *ctl_list;
struct ctl_list *ctl_list = NULL;
list_for_each(pos, &uc_mgr->ctl_list) {
if (ctl_list) {
uc_error("multiple control device names were found!");
return NULL;
}
ctl_list = list_entry(pos, struct ctl_list, list);
}
ctl_list = uc_mgr_get_one_ctl(uc_mgr);
if (ctl_list == NULL) if (ctl_list == NULL)
return NULL; return NULL;
return strdup(snd_ctl_card_info_get_id(ctl_list->ctl_info));
return strdup(ctl_list->ctl_id);
} }
static char *rval_card_name(snd_use_case_mgr_t *uc_mgr) static char *rval_card_name(snd_use_case_mgr_t *uc_mgr)
{ {
if (uc_mgr->card_short_name) struct ctl_list *ctl_list;
return strdup(uc_mgr->card_short_name);
return NULL; ctl_list = uc_mgr_get_one_ctl(uc_mgr);
if (ctl_list == NULL)
return NULL;
return strdup(snd_ctl_card_info_get_name(ctl_list->ctl_info));
} }
static char *rval_card_longname(snd_use_case_mgr_t *uc_mgr) static char *rval_card_longname(snd_use_case_mgr_t *uc_mgr)
{ {
if (uc_mgr->card_long_name[0]) struct ctl_list *ctl_list;
return strdup(uc_mgr->card_long_name);
return NULL; ctl_list = uc_mgr_get_one_ctl(uc_mgr);
if (ctl_list == NULL)
return NULL;
return strdup(snd_ctl_card_info_get_longname(ctl_list->ctl_info));
} }
static char *rval_env(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED, const char *id) static char *rval_env(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED, const char *id)

View file

@ -1437,7 +1437,7 @@ static int get_card_info(snd_use_case_mgr_t *mgr,
} }
/* find the card in the local machine and store the card long name */ /* find the card in the local machine and store the card long name */
static int get_card_long_name(snd_use_case_mgr_t *mgr) static int get_card_long_name(snd_use_case_mgr_t *mgr, char *longname)
{ {
const char *card_name = mgr->card_name; const char *card_name = mgr->card_name;
int card, err; int card, err;
@ -1464,8 +1464,7 @@ static int get_card_long_name(snd_use_case_mgr_t *mgr)
_long_name = snd_ctl_card_info_get_longname(info); _long_name = snd_ctl_card_info_get_longname(info);
if (!strcmp(card_name, _name) || if (!strcmp(card_name, _name) ||
!strcmp(card_name, _long_name)) { !strcmp(card_name, _long_name)) {
snd_strlcpy(mgr->card_short_name, _name, sizeof(mgr->card_short_name)); snd_strlcpy(longname, _long_name, MAX_CARD_LONG_NAME);
snd_strlcpy(mgr->card_long_name, _long_name, sizeof(mgr->card_long_name));
return 0; return 0;
} }
} }
@ -1480,7 +1479,7 @@ static int get_card_long_name(snd_use_case_mgr_t *mgr)
} }
/* set the driver name and long name by the card ctl name */ /* set the driver name and long name by the card ctl name */
static int get_by_card(snd_use_case_mgr_t *mgr, const char *ctl_name) static int get_by_card(snd_use_case_mgr_t *mgr, const char *ctl_name, char *longname)
{ {
snd_ctl_t *ctl; snd_ctl_t *ctl;
snd_ctl_card_info_t *info; snd_ctl_card_info_t *info;
@ -1495,10 +1494,8 @@ static int get_by_card(snd_use_case_mgr_t *mgr, const char *ctl_name)
_name = snd_ctl_card_info_get_name(info); _name = snd_ctl_card_info_get_name(info);
_long_name = snd_ctl_card_info_get_longname(info); _long_name = snd_ctl_card_info_get_longname(info);
snd_strlcpy(mgr->card_short_name, _name, sizeof(mgr->card_short_name));
snd_strlcpy(mgr->card_long_name, _long_name, sizeof(mgr->card_long_name));
snd_strlcpy(mgr->conf_file_name, _name, sizeof(mgr->conf_file_name)); snd_strlcpy(mgr->conf_file_name, _name, sizeof(mgr->conf_file_name));
snd_strlcpy(longname, _long_name, MAX_CARD_LONG_NAME);
return 0; return 0;
} }
@ -1550,26 +1547,27 @@ int uc_mgr_import_master_config(snd_use_case_mgr_t *uc_mgr)
{ {
snd_config_t *cfg; snd_config_t *cfg;
const char *name = uc_mgr->card_name; const char *name = uc_mgr->card_name;
char longname[MAX_CARD_LONG_NAME];
int err; int err;
snd_strlcpy(uc_mgr->conf_file_name, uc_mgr->card_name, sizeof(uc_mgr->conf_file_name)); snd_strlcpy(uc_mgr->conf_file_name, uc_mgr->card_name, sizeof(uc_mgr->conf_file_name));
if (strncmp(name, "hw:", 3) == 0) { if (strncmp(name, "hw:", 3) == 0) {
err = get_by_card(uc_mgr, name); err = get_by_card(uc_mgr, name, longname);
if (err == 0) if (err == 0)
goto __longname; goto __longname;
uc_error("card '%s' is not valid", name); uc_error("card '%s' is not valid", name);
goto __error; goto __error;
} else if (strncmp(name, "strict:", 7)) { } else if (strncmp(name, "strict:", 7)) {
err = get_card_long_name(uc_mgr); err = get_card_long_name(uc_mgr, longname);
if (err == 0) { /* load file that matches the card long name */ if (err == 0) { /* load file that matches the card long name */
__longname: __longname:
err = load_master_config(uc_mgr, uc_mgr->card_long_name, &cfg, 1); err = load_master_config(uc_mgr, longname, &cfg, 1);
} }
if (err == 0) { if (err == 0) {
/* got device-specific file that matches the card long name */ /* got device-specific file that matches the card long name */
snd_strlcpy(uc_mgr->conf_file_name, uc_mgr->card_long_name, sizeof(uc_mgr->conf_file_name)); snd_strlcpy(uc_mgr->conf_file_name, longname, sizeof(uc_mgr->conf_file_name));
goto __parse; goto __parse;
} }
} }

View file

@ -114,8 +114,8 @@ struct ctl_dev {
struct ctl_list { struct ctl_list {
struct list_head list; struct list_head list;
struct list_head dev_list; struct list_head dev_list;
char *ctl_id;
snd_ctl_t *ctl; snd_ctl_t *ctl;
snd_ctl_card_info_t *ctl_info;
}; };
/* /*
@ -205,8 +205,6 @@ struct use_case_verb {
*/ */
struct snd_use_case_mgr { struct snd_use_case_mgr {
char *card_name; char *card_name;
char card_short_name[MAX_CARD_SHORT_NAME];
char card_long_name[MAX_CARD_LONG_NAME];
char conf_file_name[MAX_CARD_LONG_NAME]; char conf_file_name[MAX_CARD_LONG_NAME];
char *comment; char *comment;
int conf_format; int conf_format;
@ -264,6 +262,7 @@ int uc_mgr_open_ctl(snd_use_case_mgr_t *uc_mgr,
snd_ctl_t **ctl, snd_ctl_t **ctl,
const char *device); const char *device);
struct ctl_list *uc_mgr_get_one_ctl(snd_use_case_mgr_t *uc_mgr);
void uc_mgr_free_ctl_list(snd_use_case_mgr_t *uc_mgr); void uc_mgr_free_ctl_list(snd_use_case_mgr_t *uc_mgr);
/** The name of the environment variable containing the UCM directory */ /** The name of the environment variable containing the UCM directory */

View file

@ -49,6 +49,21 @@ void uc_mgr_stdout(const char *fmt,...)
va_end(va); va_end(va);
} }
struct ctl_list *uc_mgr_get_one_ctl(snd_use_case_mgr_t *uc_mgr)
{
struct list_head *pos;
struct ctl_list *ctl_list = NULL;
list_for_each(pos, &uc_mgr->ctl_list) {
if (ctl_list) {
uc_error("multiple control device names were found!");
return NULL;
}
ctl_list = list_entry(pos, struct ctl_list, list);
}
return ctl_list;
}
static void uc_mgr_free_ctl(struct ctl_list *ctl_list) static void uc_mgr_free_ctl(struct ctl_list *ctl_list)
{ {
struct list_head *pos, *npos; struct list_head *pos, *npos;
@ -59,7 +74,7 @@ static void uc_mgr_free_ctl(struct ctl_list *ctl_list)
free(ctl_dev->device); free(ctl_dev->device);
free(ctl_dev); free(ctl_dev);
} }
free(ctl_list->ctl_id); snd_ctl_card_info_free(ctl_list->ctl_info);
free(ctl_list); free(ctl_list);
} }
@ -103,7 +118,8 @@ static int uc_mgr_ctl_add_dev(struct ctl_list *ctl_list, const char *device)
static int uc_mgr_ctl_add(snd_use_case_mgr_t *uc_mgr, static int uc_mgr_ctl_add(snd_use_case_mgr_t *uc_mgr,
struct ctl_list *ctl_list, struct ctl_list *ctl_list,
snd_ctl_t *ctl, int card, snd_ctl_card_info_t *info, snd_ctl_t *ctl, int card,
snd_ctl_card_info_t *info,
const char *device) const char *device)
{ {
struct ctl_list *cl = NULL; struct ctl_list *cl = NULL;
@ -119,11 +135,11 @@ static int uc_mgr_ctl_add(snd_use_case_mgr_t *uc_mgr,
return -ENOMEM; return -ENOMEM;
INIT_LIST_HEAD(&cl->dev_list); INIT_LIST_HEAD(&cl->dev_list);
cl->ctl = ctl; cl->ctl = ctl;
cl->ctl_id = strdup(id); if (snd_ctl_card_info_malloc(&cl->ctl_info) < 0) {
if (cl->ctl_id == NULL) {
free(cl); free(cl);
return -ENOMEM; return -ENOMEM;
} }
snd_ctl_card_info_copy(cl->ctl_info, info);
ctl_list = cl; ctl_list = cl;
} }
if (card >= 0) { if (card >= 0) {
@ -197,7 +213,7 @@ int uc_mgr_open_ctl(snd_use_case_mgr_t *uc_mgr,
/* insert to cache, if just name differs */ /* insert to cache, if just name differs */
list_for_each(pos1, &uc_mgr->ctl_list) { list_for_each(pos1, &uc_mgr->ctl_list) {
ctl_list = list_entry(pos1, struct ctl_list, list); ctl_list = list_entry(pos1, struct ctl_list, list);
if (strcmp(id, ctl_list->ctl_id) == 0) { if (strcmp(id, snd_ctl_card_info_get_id(ctl_list->ctl_info)) == 0) {
card = snd_card_get_index(id); card = snd_card_get_index(id);
err = uc_mgr_ctl_add(uc_mgr, ctl_list, *ctl, card, info, device); err = uc_mgr_ctl_add(uc_mgr, ctl_list, *ctl, card, info, device);
if (err < 0) if (err < 0)