]> git.alsa-project.org Git - alsa-lib.git/commitdiff
topology: Export physical DAIs to the binary for kernel
authorGuneshwor Singh <guneshwor.o.singh@intel.com>
Wed, 16 Nov 2016 06:42:49 +0000 (14:42 +0800)
committerTakashi Iwai <tiwai@suse.de>
Tue, 22 Nov 2016 06:50:29 +0000 (07:50 +0100)
Export the physical DAI objects to the binary output file for kernel.
For physical DAIs defined by the text conf file, find and merge their
stream capablities and private data before exporting.

Signed-off-by: Guneshwor Singh <guneshwor.o.singh@intel.com>
Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/topology/builder.c
src/topology/parser.c
src/topology/pcm.c
src/topology/tplg_local.h

index b0ba54e4ad2c974416605af138d68cfbcaf39aab..20fa9256a92111e01a35b186ee742a284c978694 100644 (file)
@@ -204,6 +204,9 @@ static int write_block(snd_tplg_t *tplg, struct list_head *base,
        case SND_TPLG_TYPE_DATA:
                return write_elem_block(tplg, base, size,
                        SND_SOC_TPLG_TYPE_PDATA, "data");
+       case SND_TPLG_TYPE_DAI:
+               return write_elem_block(tplg, base, size,
+                       SND_SOC_TPLG_TYPE_DAI, "dai");
        default:
                return -EINVAL;
        }
@@ -293,6 +296,14 @@ int tplg_write_data(snd_tplg_t *tplg)
                return ret;
        }
 
+       /* write physical dai elems */
+       ret = write_block(tplg, &tplg->dai_list,
+               SND_TPLG_TYPE_DAI);
+       if (ret < 0) {
+               SNDERR("failed to write physical dai elems %d\n", ret);
+               return ret;
+       }
+
        /* write be elems */
        ret = write_block(tplg, &tplg->be_list,
                SND_TPLG_TYPE_BE);
index 4afa5763df4a31e6887661b28745764fe1f7e4aa..c5f9757f3f9a4cd49b583f2f2af884bbb8d3328b 100644 (file)
@@ -288,6 +288,10 @@ static int tplg_build_integ(snd_tplg_t *tplg)
        if (err <  0)
                return err;
 
+       err = tplg_build_dais(tplg, SND_TPLG_TYPE_DAI);
+       if (err <  0)
+               return err;
+
        err = tplg_build_links(tplg, SND_TPLG_TYPE_BE);
        if (err <  0)
                return err;
index 9f60e4be9e196b961b392fe519b392ef438bd887..d7c04c264ddbb3c81e75d892da8330d6d17a6f94 100644 (file)
@@ -129,6 +129,61 @@ int tplg_build_pcms(snd_tplg_t *tplg, unsigned int type)
        return 0;
 }
 
+/* build a physical DAI */
+static int tplg_build_dai(snd_tplg_t *tplg, struct tplg_elem *elem)
+{
+       struct tplg_ref *ref;
+       struct list_head *base, *pos;
+       int err = 0;
+
+       /* get playback & capture stream caps */
+       err = tplg_build_stream_caps(tplg, elem->id, elem->dai->caps);
+       if (err < 0)
+               return err;
+
+       /* get private data */
+       base = &elem->ref_list;
+       list_for_each(pos, base) {
+
+               ref = list_entry(pos, struct tplg_ref, list);
+
+               if (ref->type == SND_TPLG_TYPE_DATA) {
+                       err = tplg_copy_data(tplg, elem, ref);
+                       if (err < 0)
+                               return err;
+               }
+       }
+
+       /* add DAI to manifest */
+       tplg->manifest.dai_elems++;
+
+       return 0;
+}
+
+/* build physical DAIs*/
+int tplg_build_dais(snd_tplg_t *tplg, unsigned int type)
+{
+       struct list_head *base, *pos;
+       struct tplg_elem *elem;
+       int err = 0;
+
+       base = &tplg->dai_list;
+       list_for_each(pos, base) {
+
+               elem = list_entry(pos, struct tplg_elem, list);
+               if (elem->type != type) {
+                       SNDERR("error: invalid elem '%s'\n", elem->id);
+                       return -EINVAL;
+               }
+
+               err = tplg_build_dai(tplg, elem);
+               if (err < 0)
+                       return err;
+       }
+
+       return 0;
+}
+
 static int tplg_build_stream_cfg(snd_tplg_t *tplg,
        struct snd_soc_tplg_stream *stream, int num_streams)
 {
index 807462b7057cf1a32181612583d8936bb24a1f07..f913563a34599d7335aff247f6e15a74d01102a5 100644 (file)
@@ -294,6 +294,7 @@ int tplg_add_bytes(snd_tplg_t *tplg, struct snd_tplg_bytes_template *bytes_ctl,
                   struct tplg_elem **e);
 
 int tplg_build_pcms(snd_tplg_t *tplg, unsigned int type);
+int tplg_build_dais(snd_tplg_t *tplg, unsigned int type);
 int tplg_build_links(snd_tplg_t *tplg, unsigned int type);
 int tplg_add_link_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t);
 int tplg_add_pcm_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t);