mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-03 09:01:52 -05:00
ucm: implement CardNumberByName substitution
The syntax is ${CardNumberByName:CARDNAME[#INDEX]}.
The CARDNAME is the ALSA's soundcard name (short form).
The INDEX is the instance (0 = first, 1 = second etc.).
Example: ${CardNumberByName:HDA Intel PCH}
(which is identical to ${CardNumberByName:HDA Intel PCH#0})
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
f0276cc0bd
commit
68d3cbfbc3
1 changed files with 33 additions and 13 deletions
|
|
@ -71,20 +71,23 @@ static char *rval_conf_name(snd_use_case_mgr_t *uc_mgr)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static char *rval_card_number(snd_use_case_mgr_t *uc_mgr)
|
||||
static char *get_card_number(struct ctl_list *ctl_list)
|
||||
{
|
||||
struct ctl_list *ctl_list;
|
||||
char num[16];
|
||||
|
||||
if (uc_mgr->conf_format < 3)
|
||||
return NULL;
|
||||
ctl_list = uc_mgr_get_master_ctl(uc_mgr);
|
||||
if (ctl_list == NULL)
|
||||
return strdup("");
|
||||
snprintf(num, sizeof(num), "%i", snd_ctl_card_info_get_card(ctl_list->ctl_info));
|
||||
return strdup(num);
|
||||
}
|
||||
|
||||
static char *rval_card_number(snd_use_case_mgr_t *uc_mgr)
|
||||
{
|
||||
if (uc_mgr->conf_format < 3)
|
||||
return NULL;
|
||||
return get_card_number(uc_mgr_get_master_ctl(uc_mgr));
|
||||
}
|
||||
|
||||
static char *rval_card_id(snd_use_case_mgr_t *uc_mgr)
|
||||
{
|
||||
struct ctl_list *ctl_list;
|
||||
|
|
@ -135,17 +138,11 @@ static char *rval_card_components(snd_use_case_mgr_t *uc_mgr)
|
|||
return strdup(snd_ctl_card_info_get_components(ctl_list->ctl_info));
|
||||
}
|
||||
|
||||
static char *rval_card_id_by_name(snd_use_case_mgr_t *uc_mgr, const char *id)
|
||||
static struct ctl_list *get_ctl_list_by_name(snd_use_case_mgr_t *uc_mgr, const char *id)
|
||||
{
|
||||
struct ctl_list *ctl_list;
|
||||
char *name, *index;
|
||||
long idx = 0;
|
||||
|
||||
if (uc_mgr->conf_format < 3) {
|
||||
uc_error("CardIdByName substitution is supported in v3+ syntax");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
name = alloca(strlen(id) + 1);
|
||||
strcpy(name, id);
|
||||
index = strchr(name, '#');
|
||||
|
|
@ -154,7 +151,29 @@ static char *rval_card_id_by_name(snd_use_case_mgr_t *uc_mgr, const char *id)
|
|||
if (safe_strtol(index + 1, &idx))
|
||||
return NULL;
|
||||
}
|
||||
ctl_list = uc_mgr_get_ctl_by_name(uc_mgr, name, idx);
|
||||
return uc_mgr_get_ctl_by_name(uc_mgr, name, idx);
|
||||
}
|
||||
|
||||
static char *rval_card_number_by_name(snd_use_case_mgr_t *uc_mgr, const char *id)
|
||||
{
|
||||
if (uc_mgr->conf_format < 3) {
|
||||
uc_error("CardNumberByName substitution is supported in v3+ syntax");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return get_card_number(get_ctl_list_by_name(uc_mgr, id));
|
||||
}
|
||||
|
||||
static char *rval_card_id_by_name(snd_use_case_mgr_t *uc_mgr, const char *id)
|
||||
{
|
||||
struct ctl_list *ctl_list;
|
||||
|
||||
if (uc_mgr->conf_format < 3) {
|
||||
uc_error("CardIdByName substitution is supported in v3+ syntax");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctl_list = get_ctl_list_by_name(uc_mgr, id);
|
||||
if (ctl_list == NULL)
|
||||
return NULL;
|
||||
return strdup(snd_ctl_card_info_get_id(ctl_list->ctl_info));
|
||||
|
|
@ -298,6 +317,7 @@ __std:
|
|||
MATCH_VARIABLE2(value, "${env:", rval_env);
|
||||
MATCH_VARIABLE2(value, "${sys:", rval_sysfs);
|
||||
MATCH_VARIABLE2(value, "${var:", rval_var);
|
||||
MATCH_VARIABLE2(value, "${CardNumberByName:", rval_card_number_by_name);
|
||||
MATCH_VARIABLE2(value, "${CardIdByName:", rval_card_id_by_name);
|
||||
__merr:
|
||||
err = -EINVAL;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue