Capture pipelines must wait for the DAI to fill one period of data before they can be scheduled. This avoids underruning the pipeline.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com --- src/audio/pipeline.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/src/audio/pipeline.c b/src/audio/pipeline.c index 4fe7896..3cfffb6 100644 --- a/src/audio/pipeline.c +++ b/src/audio/pipeline.c @@ -208,13 +208,19 @@ static void pipeline_cmd_update(struct pipeline *p, struct comp_dev *comp, case COMP_CMD_RELEASE: p->xrun_bytes = 0;
- /* schedule initial pipeline fill when next idle */ - pipeline_schedule_copy_idle(p); - - /* schedule pipeline */ - if (p->ipc_pipe.timer) - pipeline_schedule_copy(p, 0); - + /* playback pipelines need scheduled now, capture pipelines are + * scheduled once their initial DMA period is filled by the DAI */ + if (comp->params.direction == SOF_IPC_STREAM_PLAYBACK) { + + /* pipelines are either scheduled by timers or DAI/DMA interrupts */ + if (p->ipc_pipe.timer) { + /* timer - schedule initial copy */ + pipeline_schedule_copy(p, 0); + } else { + /* DAI - schedule initial pipeline fill when next idle */ + pipeline_schedule_copy_idle(p); + } + } break; case COMP_CMD_SUSPEND: case COMP_CMD_RESUME: