]> git.alsa-project.org Git - alsa-lib.git/commitdiff
topology: Refactor functions to parse and build streams
authorMengdong Lin <mengdong.lin@linux.intel.com>
Fri, 29 Apr 2016 03:03:04 +0000 (11:03 +0800)
committerTakashi Iwai <tiwai@suse.de>
Mon, 9 May 2016 08:30:39 +0000 (10:30 +0200)
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>
src/topology/parser.c
src/topology/pcm.c
src/topology/tplg_local.h

index 84117c3ef60ffa1383decd2bfe4f3b1b557da98b..f6fc944efceed1c65ee643201ece4c0e6a7dc71f 100644 (file)
@@ -119,7 +119,7 @@ static int tplg_parse_config(snd_tplg_t *tplg, snd_config_t *cfg)
 
                if (strcmp(id, "SectionPCMCapabilities") == 0) {
                        err = tplg_parse_compound(tplg, n,
-                               tplg_parse_pcm_caps, NULL);
+                               tplg_parse_stream_caps, NULL);
                        if (err < 0)
                                return err;
                        continue;
index d75aad88672a3e2069465f739d34e0ee6494146d..1df4f54db998456a9f7a59447e6ae689a634cf0c 100644 (file)
@@ -40,9 +40,9 @@ struct tplg_elem *lookup_pcm_dai_stream(struct list_head *base, const char* id)
        return NULL;
 }
 
-/* copy referenced caps to the pcm */
-static void copy_pcm_caps(const char *id, struct snd_soc_tplg_stream_caps *caps,
-       struct tplg_elem *ref_elem)
+/* copy referenced caps to the parent (pcm or be dai) */
+static void copy_stream_caps(const char *id,
+       struct snd_soc_tplg_stream_caps *caps, struct tplg_elem *ref_elem)
 {
        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;
 }
 
-/* check referenced config and caps for a pcm */
-static int tplg_build_pcm_caps(snd_tplg_t *tplg, struct tplg_elem *elem)
+/* find and copy the referenced stream caps */
+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 snd_soc_tplg_pcm *pcm;
-       struct snd_soc_tplg_stream_caps *caps;
        unsigned int i;
 
-       pcm = elem->pcm;
-
        for (i = 0; i < 2; i++) {
-               caps = &pcm->caps[i];
-
                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)
-                       copy_pcm_caps(elem->id, caps, ref_elem);
+                       copy_stream_caps(id, &caps[i], ref_elem);
        }
 
        return 0;
@@ -91,7 +86,7 @@ int tplg_build_pcm(snd_tplg_t *tplg, unsigned int type)
                        return -EINVAL;
                }
 
-               err = tplg_build_pcm_caps(tplg, elem);
+               err = tplg_build_stream_caps(tplg, elem->id, elem->pcm->caps);
                if (err < 0)
                        return err;
 
@@ -184,8 +179,8 @@ static int split_format(struct snd_soc_tplg_stream_caps *caps, char *str)
        return 0;
 }
 
-/* Parse pcm Capabilities */
-int tplg_parse_pcm_caps(snd_tplg_t *tplg,
+/* Parse pcm stream capabilities */
+int tplg_parse_stream_caps(snd_tplg_t *tplg,
        snd_config_t *cfg, void *private ATTRIBUTE_UNUSED)
 {
        struct snd_soc_tplg_stream_caps *sc;
@@ -263,29 +258,40 @@ int tplg_parse_pcm_caps(snd_tplg_t *tplg,
        return 0;
 }
 
-/* Parse the caps of a pcm stream */
-int tplg_parse_stream_caps(snd_tplg_t *tplg, snd_config_t *cfg,
+/* Parse the caps and config of a pcm stream */
+static int tplg_parse_streams(snd_tplg_t *tplg, snd_config_t *cfg,
        void *private)
 {
        snd_config_iterator_t i, next;
        snd_config_t *n;
        struct tplg_elem *elem = private;
        struct snd_soc_tplg_pcm *pcm;
+       unsigned int *playback, *capture;
+       struct snd_soc_tplg_stream_caps *caps;
        const char *id, *value;
        int stream;
 
-       pcm = elem->pcm;
-
        snd_config_get_id(cfg, &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) {
                stream = SND_SOC_TPLG_STREAM_PLAYBACK;
-               pcm->playback = 1;
+               *playback = 1;
        } else if (strcmp(id, "capture") == 0) {
                stream = SND_SOC_TPLG_STREAM_CAPTURE;
-               pcm->capture = 1;
+               *capture = 1;
        } else
                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 (snd_config_get_string(n, &value) < 0)
                                continue;
-
-                       elem_copy_text(pcm->caps[stream].name, value,
+                       /* store stream caps name, to find and merge
+                        * the caps in building phase.
+                        */
+                       elem_copy_text(caps[stream].name, value,
                                SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
 
                        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;
 }
 
-/* Parse pcm */
+/* Parse pcm (for front end DAI & DAI link) */
 int tplg_parse_pcm(snd_tplg_t *tplg,
        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) {
                        err = tplg_parse_compound(tplg, n,
-                               tplg_parse_stream_caps, elem);
+                               tplg_parse_streams, elem);
                        if (err < 0)
                                return err;
                        continue;
index 4c601d4064ef4fe57ff88d30608d26866915932b..9239aef8fa30025ba054e9f0a5b29c7c4fbbd5b6 100644 (file)
@@ -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,
        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);
 
 int tplg_parse_pcm(snd_tplg_t *tplg,