mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-02 09:01:48 -05:00
topology: Refactor functions to parse and build streams
Previously these functions are only used by pcm elements (front-end DAI & DAI link) to parse stream capablities. Now refactor them to be reused by back-end DAI elements later. Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
e64334df2b
commit
86ec8b4900
3 changed files with 36 additions and 28 deletions
|
|
@ -119,7 +119,7 @@ static int tplg_parse_config(snd_tplg_t *tplg, snd_config_t *cfg)
|
||||||
|
|
||||||
if (strcmp(id, "SectionPCMCapabilities") == 0) {
|
if (strcmp(id, "SectionPCMCapabilities") == 0) {
|
||||||
err = tplg_parse_compound(tplg, n,
|
err = tplg_parse_compound(tplg, n,
|
||||||
tplg_parse_pcm_caps, NULL);
|
tplg_parse_stream_caps, NULL);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -40,9 +40,9 @@ struct tplg_elem *lookup_pcm_dai_stream(struct list_head *base, const char* id)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy referenced caps to the pcm */
|
/* copy referenced caps to the parent (pcm or be dai) */
|
||||||
static void copy_pcm_caps(const char *id, struct snd_soc_tplg_stream_caps *caps,
|
static void copy_stream_caps(const char *id,
|
||||||
struct tplg_elem *ref_elem)
|
struct snd_soc_tplg_stream_caps *caps, struct tplg_elem *ref_elem)
|
||||||
{
|
{
|
||||||
struct snd_soc_tplg_stream_caps *ref_caps = ref_elem->stream_caps;
|
struct snd_soc_tplg_stream_caps *ref_caps = ref_elem->stream_caps;
|
||||||
|
|
||||||
|
|
@ -52,24 +52,19 @@ static void copy_pcm_caps(const char *id, struct snd_soc_tplg_stream_caps *caps,
|
||||||
*caps = *ref_caps;
|
*caps = *ref_caps;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check referenced config and caps for a pcm */
|
/* find and copy the referenced stream caps */
|
||||||
static int tplg_build_pcm_caps(snd_tplg_t *tplg, struct tplg_elem *elem)
|
static int tplg_build_stream_caps(snd_tplg_t *tplg,
|
||||||
|
const char *id, struct snd_soc_tplg_stream_caps *caps)
|
||||||
{
|
{
|
||||||
struct tplg_elem *ref_elem = NULL;
|
struct tplg_elem *ref_elem = NULL;
|
||||||
struct snd_soc_tplg_pcm *pcm;
|
|
||||||
struct snd_soc_tplg_stream_caps *caps;
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
pcm = elem->pcm;
|
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
caps = &pcm->caps[i];
|
|
||||||
|
|
||||||
ref_elem = tplg_elem_lookup(&tplg->pcm_caps_list,
|
ref_elem = tplg_elem_lookup(&tplg->pcm_caps_list,
|
||||||
caps->name, SND_TPLG_TYPE_STREAM_CAPS);
|
caps[i].name, SND_TPLG_TYPE_STREAM_CAPS);
|
||||||
|
|
||||||
if (ref_elem != NULL)
|
if (ref_elem != NULL)
|
||||||
copy_pcm_caps(elem->id, caps, ref_elem);
|
copy_stream_caps(id, &caps[i], ref_elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -91,7 +86,7 @@ int tplg_build_pcm(snd_tplg_t *tplg, unsigned int type)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = tplg_build_pcm_caps(tplg, elem);
|
err = tplg_build_stream_caps(tplg, elem->id, elem->pcm->caps);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
@ -184,8 +179,8 @@ static int split_format(struct snd_soc_tplg_stream_caps *caps, char *str)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse pcm Capabilities */
|
/* Parse pcm stream capabilities */
|
||||||
int tplg_parse_pcm_caps(snd_tplg_t *tplg,
|
int tplg_parse_stream_caps(snd_tplg_t *tplg,
|
||||||
snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
|
snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
struct snd_soc_tplg_stream_caps *sc;
|
struct snd_soc_tplg_stream_caps *sc;
|
||||||
|
|
@ -263,29 +258,40 @@ int tplg_parse_pcm_caps(snd_tplg_t *tplg,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse the caps of a pcm stream */
|
/* Parse the caps and config of a pcm stream */
|
||||||
int tplg_parse_stream_caps(snd_tplg_t *tplg, snd_config_t *cfg,
|
static int tplg_parse_streams(snd_tplg_t *tplg, snd_config_t *cfg,
|
||||||
void *private)
|
void *private)
|
||||||
{
|
{
|
||||||
snd_config_iterator_t i, next;
|
snd_config_iterator_t i, next;
|
||||||
snd_config_t *n;
|
snd_config_t *n;
|
||||||
struct tplg_elem *elem = private;
|
struct tplg_elem *elem = private;
|
||||||
struct snd_soc_tplg_pcm *pcm;
|
struct snd_soc_tplg_pcm *pcm;
|
||||||
|
unsigned int *playback, *capture;
|
||||||
|
struct snd_soc_tplg_stream_caps *caps;
|
||||||
const char *id, *value;
|
const char *id, *value;
|
||||||
int stream;
|
int stream;
|
||||||
|
|
||||||
pcm = elem->pcm;
|
|
||||||
|
|
||||||
snd_config_get_id(cfg, &id);
|
snd_config_get_id(cfg, &id);
|
||||||
|
|
||||||
tplg_dbg("\t%s:\n", id);
|
tplg_dbg("\t%s:\n", id);
|
||||||
|
|
||||||
|
switch (elem->type) {
|
||||||
|
case SND_TPLG_TYPE_PCM:
|
||||||
|
pcm = elem->pcm;
|
||||||
|
playback = &pcm->playback;
|
||||||
|
capture = &pcm->capture;
|
||||||
|
caps = pcm->caps;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (strcmp(id, "playback") == 0) {
|
if (strcmp(id, "playback") == 0) {
|
||||||
stream = SND_SOC_TPLG_STREAM_PLAYBACK;
|
stream = SND_SOC_TPLG_STREAM_PLAYBACK;
|
||||||
pcm->playback = 1;
|
*playback = 1;
|
||||||
} else if (strcmp(id, "capture") == 0) {
|
} else if (strcmp(id, "capture") == 0) {
|
||||||
stream = SND_SOC_TPLG_STREAM_CAPTURE;
|
stream = SND_SOC_TPLG_STREAM_CAPTURE;
|
||||||
pcm->capture = 1;
|
*capture = 1;
|
||||||
} else
|
} else
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
|
@ -300,8 +306,10 @@ int tplg_parse_stream_caps(snd_tplg_t *tplg, snd_config_t *cfg,
|
||||||
if (strcmp(id, "capabilities") == 0) {
|
if (strcmp(id, "capabilities") == 0) {
|
||||||
if (snd_config_get_string(n, &value) < 0)
|
if (snd_config_get_string(n, &value) < 0)
|
||||||
continue;
|
continue;
|
||||||
|
/* store stream caps name, to find and merge
|
||||||
elem_copy_text(pcm->caps[stream].name, value,
|
* the caps in building phase.
|
||||||
|
*/
|
||||||
|
elem_copy_text(caps[stream].name, value,
|
||||||
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
|
SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
|
||||||
|
|
||||||
tplg_dbg("\t\t%s\n\t\t\t%s\n", id, value);
|
tplg_dbg("\t\t%s\n\t\t\t%s\n", id, value);
|
||||||
|
|
@ -312,7 +320,7 @@ int tplg_parse_stream_caps(snd_tplg_t *tplg, snd_config_t *cfg,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse pcm */
|
/* Parse pcm (for front end DAI & DAI link) */
|
||||||
int tplg_parse_pcm(snd_tplg_t *tplg,
|
int tplg_parse_pcm(snd_tplg_t *tplg,
|
||||||
snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
|
snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
|
|
@ -365,7 +373,7 @@ int tplg_parse_pcm(snd_tplg_t *tplg,
|
||||||
|
|
||||||
if (strcmp(id, "pcm") == 0) {
|
if (strcmp(id, "pcm") == 0) {
|
||||||
err = tplg_parse_compound(tplg, n,
|
err = tplg_parse_compound(tplg, n,
|
||||||
tplg_parse_stream_caps, elem);
|
tplg_parse_streams, elem);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@ int tplg_parse_dapm_graph(snd_tplg_t *tplg, snd_config_t *cfg,
|
||||||
int tplg_parse_dapm_widget(snd_tplg_t *tplg,
|
int tplg_parse_dapm_widget(snd_tplg_t *tplg,
|
||||||
snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
|
snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
|
||||||
|
|
||||||
int tplg_parse_pcm_caps(snd_tplg_t *tplg,
|
int tplg_parse_stream_caps(snd_tplg_t *tplg,
|
||||||
snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
|
snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);
|
||||||
|
|
||||||
int tplg_parse_pcm(snd_tplg_t *tplg,
|
int tplg_parse_pcm(snd_tplg_t *tplg,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue