topology: Support configuring physical DAIs by C API

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>
This commit is contained in:
Guneshwor Singh 2016-11-16 14:42:41 +08:00 committed by Takashi Iwai
parent 0b6bd6c19a
commit 9117715371
4 changed files with 75 additions and 0 deletions

View 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;

View 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:

View 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;
}

View 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);