mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2026-02-15 22:05:18 -05:00
topology: Add support for vendor tokens
Vendor can define a token list in SectionVendorTokens. Each token element is a pair of string ID and integer value. And both the ID and value are vendor-specific. Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
768a006089
commit
9b751b38cb
5 changed files with 79 additions and 0 deletions
|
|
@ -578,6 +578,7 @@ enum snd_tplg_type {
|
||||||
SND_TPLG_TYPE_BE, /*!< BE DAI link */
|
SND_TPLG_TYPE_BE, /*!< BE DAI link */
|
||||||
SND_TPLG_TYPE_CC, /*!< Hostless codec <-> codec link */
|
SND_TPLG_TYPE_CC, /*!< Hostless codec <-> codec link */
|
||||||
SND_TPLG_TYPE_MANIFEST, /*!< Topology manifest */
|
SND_TPLG_TYPE_MANIFEST, /*!< Topology manifest */
|
||||||
|
SND_TPLG_TYPE_TOKEN, /*!< Vendor tokens */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -253,6 +253,56 @@ static int tplg_parse_data_hex(snd_config_t *cfg, struct tplg_elem *elem,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Parse vendor tokens
|
||||||
|
*/
|
||||||
|
int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg,
|
||||||
|
void *private ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
snd_config_iterator_t i, next;
|
||||||
|
snd_config_t *n;
|
||||||
|
const char *id, *value;
|
||||||
|
struct tplg_elem *elem;
|
||||||
|
struct tplg_vendor_tokens *tokens;
|
||||||
|
int num_tokens = 0;
|
||||||
|
|
||||||
|
elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_TOKEN);
|
||||||
|
if (!elem)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
snd_config_for_each(i, next, cfg) {
|
||||||
|
num_tokens++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!num_tokens)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
tplg_dbg(" Vendor tokens: %s, %d tokens\n", elem->id, num_tokens);
|
||||||
|
|
||||||
|
tokens = calloc(1, sizeof(*tokens)
|
||||||
|
+ num_tokens * sizeof(struct tplg_token));
|
||||||
|
if (!tokens)
|
||||||
|
return -ENOMEM;
|
||||||
|
elem->tokens = tokens;
|
||||||
|
|
||||||
|
snd_config_for_each(i, next, cfg) {
|
||||||
|
|
||||||
|
n = snd_config_iterator_entry(i);
|
||||||
|
if (snd_config_get_id(n, &id) < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (snd_config_get_string(n, &value) < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
elem_copy_text(tokens->token[tokens->num_tokens].id, id,
|
||||||
|
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
|
||||||
|
tokens->token[tokens->num_tokens].value = atoi(value);
|
||||||
|
tplg_dbg("\t\t %s : %d\n", tokens->token[tokens->num_tokens].id,
|
||||||
|
tokens->token[tokens->num_tokens].value);
|
||||||
|
tokens->num_tokens++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Parse Private data.
|
/* Parse Private data.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -193,6 +193,9 @@ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
|
||||||
list_add_tail(&elem->list, &tplg->cc_list);
|
list_add_tail(&elem->list, &tplg->cc_list);
|
||||||
obj_size = sizeof(struct snd_soc_tplg_link_config);
|
obj_size = sizeof(struct snd_soc_tplg_link_config);
|
||||||
break;
|
break;
|
||||||
|
case SND_TPLG_TYPE_TOKEN:
|
||||||
|
list_add_tail(&elem->list, &tplg->token_list);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
free(elem);
|
free(elem);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
||||||
|
|
@ -173,6 +173,14 @@ static int tplg_parse_config(snd_tplg_t *tplg, snd_config_t *cfg)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strcmp(id, "SectionVendorTokens") == 0) {
|
||||||
|
err = tplg_parse_compound(tplg, n, tplg_parse_tokens,
|
||||||
|
NULL);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
SNDERR("error: unknown section %s\n", id);
|
SNDERR("error: unknown section %s\n", id);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -407,6 +415,7 @@ snd_tplg_t *snd_tplg_new(void)
|
||||||
INIT_LIST_HEAD(&tplg->mixer_list);
|
INIT_LIST_HEAD(&tplg->mixer_list);
|
||||||
INIT_LIST_HEAD(&tplg->enum_list);
|
INIT_LIST_HEAD(&tplg->enum_list);
|
||||||
INIT_LIST_HEAD(&tplg->bytes_ext_list);
|
INIT_LIST_HEAD(&tplg->bytes_ext_list);
|
||||||
|
INIT_LIST_HEAD(&tplg->token_list);
|
||||||
|
|
||||||
return tplg;
|
return tplg;
|
||||||
}
|
}
|
||||||
|
|
@ -426,6 +435,7 @@ void snd_tplg_free(snd_tplg_t *tplg)
|
||||||
tplg_elem_free_list(&tplg->mixer_list);
|
tplg_elem_free_list(&tplg->mixer_list);
|
||||||
tplg_elem_free_list(&tplg->enum_list);
|
tplg_elem_free_list(&tplg->enum_list);
|
||||||
tplg_elem_free_list(&tplg->bytes_ext_list);
|
tplg_elem_free_list(&tplg->bytes_ext_list);
|
||||||
|
tplg_elem_free_list(&tplg->token_list);
|
||||||
|
|
||||||
free(tplg);
|
free(tplg);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,7 @@ struct snd_tplg {
|
||||||
struct list_head route_list;
|
struct list_head route_list;
|
||||||
struct list_head text_list;
|
struct list_head text_list;
|
||||||
struct list_head pdata_list;
|
struct list_head pdata_list;
|
||||||
|
struct list_head token_list;
|
||||||
struct list_head pcm_config_list;
|
struct list_head pcm_config_list;
|
||||||
struct list_head pcm_caps_list;
|
struct list_head pcm_caps_list;
|
||||||
|
|
||||||
|
|
@ -86,6 +87,16 @@ struct tplg_ref {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* element for vendor tokens */
|
||||||
|
struct tplg_token {
|
||||||
|
char id[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
|
||||||
|
unsigned int value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tplg_vendor_tokens {
|
||||||
|
unsigned int num_tokens;
|
||||||
|
struct tplg_token token[0];
|
||||||
|
};
|
||||||
/* topology element */
|
/* topology element */
|
||||||
struct tplg_elem {
|
struct tplg_elem {
|
||||||
|
|
||||||
|
|
@ -118,6 +129,7 @@ struct tplg_elem {
|
||||||
/* these do not map to UAPI structs but are internal only */
|
/* these do not map to UAPI structs but are internal only */
|
||||||
struct snd_soc_tplg_ctl_tlv *tlv;
|
struct snd_soc_tplg_ctl_tlv *tlv;
|
||||||
struct snd_soc_tplg_private *data;
|
struct snd_soc_tplg_private *data;
|
||||||
|
struct tplg_vendor_tokens *tokens;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* an element may refer to other elements:
|
/* an element may refer to other elements:
|
||||||
|
|
@ -151,6 +163,9 @@ int tplg_parse_text(snd_tplg_t *tplg, snd_config_t *cfg,
|
||||||
int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
|
int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
|
||||||
void *private ATTRIBUTE_UNUSED);
|
void *private ATTRIBUTE_UNUSED);
|
||||||
|
|
||||||
|
int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg,
|
||||||
|
void *private ATTRIBUTE_UNUSED);
|
||||||
|
|
||||||
int tplg_parse_control_bytes(snd_tplg_t *tplg,
|
int tplg_parse_control_bytes(snd_tplg_t *tplg,
|
||||||
snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
|
snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue