On (22/04/27 11:50), Peter Ujfalusi wrote:
@@ -784,16 +785,23 @@ static int sof_get_control_data(struct snd_soc_component *scomp, }
cdata = wdata[i].control->ipc_control_data;
wdata[i].pdata = cdata->data;if (!wdata[i].pdata)return -EINVAL;/* make sure data is valid - data can be updated at runtime */
if (widget->dobj.widget.kcontrol_type[i] == SND_SOC_TPLG_TYPE_BYTES &&wdata[i].pdata->magic != SOF_ABI_MAGIC)return -EINVAL;
if (widget->dobj.widget.kcontrol_type[i] == SND_SOC_TPLG_TYPE_BYTES) {if (!cdata->data)return -EINVAL;if (cdata->data->magic != SOF_ABI_MAGIC)return -EINVAL;wdata[i].pdata = cdata->data->data;wdata[i].pdata_size = cdata->data->size;} else {wdata[i].pdata = cdata->chanv; /* points to the control data union */wdata[i].pdata_size = wdata[i].control->size;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A question, so here wdata[i].control->size is
scontrol->size = struct_size(scontrol->control_data, chanv, le32_to_cpu(mc->num_channels));
Right?
If so, then is this really what we memcpy()? We memcpy() control->data->chanv and its size is `sizeof(chanv) * le32_to_cpu(mc->num_channels)`, isn't it?
[..]
if (ipc_data_size) { for (i = 0; i < widget->num_kcontrols; i++) {
if (!wdata[i].pdata_size)continue;memcpy(&process->data[offset], wdata[i].pdata,wdata[i].pdata_size); } }offset += wdata[i].pdata_size;
So should sof_get_control_data() have instead of this
wdata[i].pdata_size = wdata[i].control->size;
something like this
wdata[i].pdata_size = wdata[i].control->size - sizeof(struct sof_ipc_ctrl_data);
So that we will copy payload data, which is a bunch of chanv structs 8 bytes each.