OSDN Git Service

topology: Support configuring physical DAIs by C API
authorGuneshwor Singh <guneshwor.o.singh@intel.com>
Wed, 16 Nov 2016 06:42:41 +0000 (14:42 +0800)
committerTakashi Iwai <tiwai@suse.de>
Tue, 22 Nov 2016 06:50:27 +0000 (07:50 +0100)
In addition to text conf file, physical DAIs can also be configured
by C API. This patch defines the template to add physical DAI
configurations from C API.

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>
include/topology.h
src/topology/parser.c
src/topology/pcm.c
src/topology/tplg_local.h

index 0581b1c..c5d0080 100644 (file)
@@ -1014,6 +1014,22 @@ struct snd_tplg_hw_config_template {
        unsigned int *rx_chanmap;       /* array of slot number */
 };
 
+/** \struct snd_tplg_dai_template
+ * \brief Template type for physical DAI.
+ * It can be used to configure backend DAIs for DPCM.
+ */
+struct snd_tplg_dai_template {
+       const char *dai_name;   /*!< DAI name */
+       unsigned int dai_id;    /*!< unique ID - used to match */
+       unsigned int playback;  /*!< supports playback mode */
+       unsigned int capture;   /*!< supports capture mode */
+       struct snd_tplg_stream_caps_template *caps[2]; /*!< playback & capture for DAI */
+       unsigned int flag_mask; /*!< bitmask of flags to configure */
+       unsigned int flags;     /*!< SND_SOC_TPLG_DAI_FLGBIT_* */
+       struct snd_soc_tplg_private *priv;      /*!< private data */
+
+};
+
 /** \struct snd_tplg_link_template
  * \brief Template type for BE and CC DAI Links.
  */
@@ -1050,6 +1066,7 @@ typedef struct snd_tplg_obj_template {
                struct snd_tplg_graph_template *graph;          /*!< Graph elements */
                struct snd_tplg_pcm_template *pcm;              /*!< PCM elements */
                struct snd_tplg_link_template *link;            /*!< BE and CC Links */
+               struct snd_tplg_dai_template *dai;              /*!< Physical DAI */
        };
 } snd_tplg_obj_template_t;
 
index 72efef4..4afa576 100644 (file)
@@ -364,6 +364,8 @@ int snd_tplg_add_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
                return tplg_add_graph_object(tplg, t);
        case SND_TPLG_TYPE_PCM:
                return tplg_add_pcm_object(tplg, t);
+       case SND_TPLG_TYPE_DAI:
+               return tplg_add_dai_object(tplg, t);
        case SND_TPLG_TYPE_LINK:
        case SND_TPLG_TYPE_BE:
        case SND_TPLG_TYPE_CC:
index 4093e2f..9f60e4b 100644 (file)
@@ -1201,3 +1201,58 @@ int tplg_add_link_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
 
        return 0;
 }
+
+int tplg_add_dai_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
+{
+       struct snd_tplg_dai_template *dai_tpl = t->dai;
+       struct snd_soc_tplg_dai *dai, *_dai;
+       struct tplg_elem *elem;
+       int i;
+
+       tplg_dbg("DAI %s\n", dai_tpl->dai_name);
+
+       elem = tplg_elem_new_common(tplg, NULL, dai_tpl->dai_name,
+               SND_TPLG_TYPE_DAI);
+       if (!elem)
+               return -ENOMEM;
+
+       dai = elem->dai;
+       dai->size = elem->size;
+
+       elem_copy_text(dai->dai_name, dai_tpl->dai_name,
+               SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
+       dai->dai_id = dai_tpl->dai_id;
+
+       /* stream caps */
+       dai->playback = dai_tpl->playback;
+       dai->capture = dai_tpl->capture;
+
+       for (i = 0; i < 2; i++) {
+               if (dai_tpl->caps[i])
+                       tplg_add_stream_caps(&dai->caps[i], dai_tpl->caps[i]);
+       }
+
+       /* flags */
+       dai->flag_mask = dai_tpl->flag_mask;
+       dai->flags = dai_tpl->flags;
+
+       /* private data */
+       if (dai_tpl->priv != NULL) {
+               _dai = realloc(dai,
+                       elem->size + dai_tpl->priv->size);
+               if (!_dai) {
+                       tplg_elem_free(elem);
+                       return -ENOMEM;
+               }
+
+               dai = _dai;
+               dai->priv.size = dai_tpl->priv->size;
+
+               elem->dai = dai;
+               elem->size += dai->priv.size;
+               memcpy(dai->priv.data, dai_tpl->priv->data,
+                      dai->priv.size);
+       }
+
+       return 0;
+}
index eeeb0f1..807462b 100644 (file)
@@ -297,3 +297,4 @@ int tplg_build_pcms(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);
+int tplg_add_dai_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t);