mirror of https://github.com/thesofproject/sof.git
host: add support for src component in topology parser
Add support for parsing topologies with SRC component. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
This commit is contained in:
parent
03067c6c77
commit
5b0965d094
|
@ -567,6 +567,73 @@ static int load_controls(struct sof *sof, int num_kcontrols)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* load src dapm widget */
|
||||
static int load_src(struct sof *sof, int comp_id, int pipeline_id,
|
||||
int size)
|
||||
{
|
||||
struct sof_ipc_comp_src src = {0};
|
||||
struct snd_soc_tplg_vendor_array *array = NULL;
|
||||
size_t total_array_size = 0, read_size;
|
||||
int ret = 0;
|
||||
|
||||
/* allocate memory for vendor tuple array */
|
||||
array = (struct snd_soc_tplg_vendor_array *)malloc(size);
|
||||
if (!array) {
|
||||
fprintf(stderr, "error: mem alloc for src vendor array\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* read vendor tokens */
|
||||
while (total_array_size < size) {
|
||||
read_size = sizeof(struct snd_soc_tplg_vendor_array);
|
||||
ret = fread(array, read_size, 1, file);
|
||||
if (ret != 1)
|
||||
return -EINVAL;
|
||||
read_array(array);
|
||||
|
||||
/* parse comp tokens */
|
||||
ret = sof_parse_tokens(&src.config, comp_tokens,
|
||||
ARRAY_SIZE(comp_tokens), array,
|
||||
array->size);
|
||||
if (ret != 0) {
|
||||
fprintf(stderr, "error: parse src comp_tokens %d\n",
|
||||
size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* parse src tokens */
|
||||
ret = sof_parse_tokens(&src, src_tokens,
|
||||
ARRAY_SIZE(src_tokens), array,
|
||||
array->size);
|
||||
if (ret != 0) {
|
||||
fprintf(stderr, "error: parse src tokens %d\n", size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
total_array_size += array->size;
|
||||
|
||||
/* read next array */
|
||||
array = (void *)array + array->size;
|
||||
}
|
||||
|
||||
array = (void *)array - size;
|
||||
|
||||
/* configure src */
|
||||
src.comp.id = comp_id;
|
||||
src.comp.hdr.size = sizeof(struct sof_ipc_comp_src);
|
||||
src.comp.type = SOF_COMP_SRC;
|
||||
src.comp.pipeline_id = pipeline_id;
|
||||
|
||||
/* load src component */
|
||||
if (ipc_comp_new(sof->ipc, (struct sof_ipc_comp *)&src) < 0) {
|
||||
fprintf(stderr, "error: new src comp\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
free(array);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* load dapm widget */
|
||||
static int load_widget(struct sof *sof, int *fr_id, int *fw_id,
|
||||
int *sched_id, char *bits_in,
|
||||
|
@ -663,6 +730,15 @@ static int load_widget(struct sof *sof, int *fr_id, int *fw_id,
|
|||
}
|
||||
break;
|
||||
|
||||
/* load src widget */
|
||||
case(SND_SOC_TPLG_DAPM_SRC):
|
||||
if (load_src(sof, temp_comp_list[comp_index].id,
|
||||
pipeline_id, widget->priv.size) < 0) {
|
||||
printf("error: load src\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
||||
/* unsupported widgets */
|
||||
default:
|
||||
printf("Widget type not supported %d\n",
|
||||
|
@ -825,9 +901,6 @@ int sof_parse_tokens(void *object, const struct sof_topology_token *tokens,
|
|||
printf("error: unknown token type %d\n", array->type);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* next array */
|
||||
array = (void *)array + asize;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue