Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 32 additions & 25 deletions src/audio/asrc/asrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -334,13 +334,6 @@ static int asrc_cmd(struct comp_dev *dev, int cmd, void *data,
return ret;
}

static int asrc_trigger(struct comp_dev *dev, int cmd)
{
comp_info(dev, "asrc_trigger()");

return comp_set_state(dev, cmd);
}

static int asrc_verify_params(struct comp_dev *dev,
struct sof_ipc_stream_params *params)
{
Expand Down Expand Up @@ -527,6 +520,38 @@ static int asrc_dai_get_timestamp(struct comp_data *cd,
return cd->dai_dev->drv->ops.dai_ts_get(cd->dai_dev, tsd);
}

static int asrc_trigger(struct comp_dev *dev, int cmd)
{
struct comp_buffer *sinkb;
struct comp_buffer *sourceb;
struct comp_data *cd = comp_get_drvdata(dev);
int ret;

comp_info(dev, "asrc_trigger()");

/* Enable timestamping in pipeline DAI */
if (cmd == COMP_TRIGGER_START && cd->track_drift) {
sourceb = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list);
sinkb = list_first_item(&dev->bsink_list, struct comp_buffer, source_list);
ret = asrc_dai_find(dev, cd, sinkb, sourceb);
if (ret) {
comp_err(dev, "No DAI found to track");
cd->track_drift = false;
return ret;
}

cd->ts_count = 0;
ret = asrc_dai_configure_timestamp(cd);
if (ret) {
comp_err(dev, "No timestamp capability in DAI");
cd->track_drift = false;
return ret;
}
}

return comp_set_state(dev, cmd);
}

static int asrc_prepare(struct comp_dev *dev)
{
struct comp_data *cd = comp_get_drvdata(dev);
Expand Down Expand Up @@ -688,24 +713,6 @@ static int asrc_prepare(struct comp_dev *dev)
goto err_free_asrc;
}

/* Enable timestamping in pipeline DAI */
if (cd->track_drift) {
ret = asrc_dai_find(dev, cd, sinkb, sourceb);
if (ret) {
comp_err(dev, "No DAI found to track");
cd->track_drift = false;
goto err_free_asrc;
}

cd->ts_count = 0;
ret = asrc_dai_configure_timestamp(cd);
if (ret) {
comp_err(dev, "No timestamp capability in DAI");
cd->track_drift = false;
goto err_free_asrc;
}
}

return 0;

err_free_asrc:
Expand Down
15 changes: 15 additions & 0 deletions src/audio/dai.c
Original file line number Diff line number Diff line change
Expand Up @@ -1150,13 +1150,28 @@ static int dai_position(struct comp_dev *dev, struct sof_ipc_stream_posn *posn)
return 0;
}

/**
* \brief Get DAI parameters and configure timestamping
* \param[in, out] dev DAI device.
* \return Error code.
*
* This function retrieves various DAI parameters such as type, direction, index, and DMA
* controller information those are needed when configuring HW timestamping. Note that
* DAI must be prepared before this function is used (for DMA information). If not, an error
* is returned.
*/
static int dai_ts_config(struct comp_dev *dev)
{
struct dai_data *dd = comp_get_drvdata(dev);
struct timestamp_cfg *cfg = &dd->ts_config;
struct sof_ipc_comp_dai *dai = COMP_GET_IPC(dev, sof_ipc_comp_dai);

comp_dbg(dev, "dai_ts_config()");
if (!dd->chan) {
comp_err(dev, "dai_ts_config(), No DMA channel information");
return -EINVAL;
}

cfg->type = dd->dai->drv->type;
cfg->direction = dai->direction;
cfg->index = dd->dai->index;
Expand Down