We need the application buffer pointer(write pointer for playback) update from the host side, to make the ALSA pcm buffer pointer checking possible.
Here we introduce component command COMP_CMD_AVAIL_UPDATE for the update event notification.
Signed-off-by: Keyon Jie yang.jie@linux.intel.com --- src/include/reef/audio/component.h | 1 + src/ipc/intel-ipc.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+)
diff --git a/src/include/reef/audio/component.h b/src/include/reef/audio/component.h index e521753..bbd9b33 100644 --- a/src/include/reef/audio/component.h +++ b/src/include/reef/audio/component.h @@ -72,6 +72,7 @@ #define COMP_CMD_MUTE 101 #define COMP_CMD_UNMUTE 102 #define COMP_CMD_ROUTE 103 +#define COMP_CMD_AVAIL_UPDATE 104
/* MMAP IPC status */ #define COMP_CMD_IPC_MMAP_RPOS 200 /* host read position */ diff --git a/src/ipc/intel-ipc.c b/src/ipc/intel-ipc.c index 127541d..f192917 100644 --- a/src/ipc/intel-ipc.c +++ b/src/ipc/intel-ipc.c @@ -711,9 +711,43 @@ error:
static uint32_t ipc_stage_write_pos(uint32_t header) { + struct ipc_comp_dev *stream_dev; + struct ipc_intel_ipc_stream_set_position app_pos; + uint32_t stream_id; + int err; + trace_ipc("PoW");
+ /* read volume from the inbox */ + mailbox_inbox_read(&app_pos, 0, sizeof(app_pos)); + + trace_value(app_pos.position); + /* the driver uses stream ID to also identify certain mixers */ + stream_id = header & IPC_INTEL_STR_ID_MASK; + stream_id >>= IPC_INTEL_STR_ID_SHIFT; + + /* get the pcm_dev */ + stream_dev = ipc_get_comp(stream_id); + if (stream_dev == NULL) + goto error; + + err = pipeline_cmd(stream_dev->p, stream_dev->cd, + COMP_CMD_AVAIL_UPDATE, &app_pos); + if (err < 0) + goto error; + + /* drain the pipeline for EOS */ + if (app_pos.end_of_buffer) { + err = pipeline_cmd(stream_dev->p, stream_dev->cd, + COMP_CMD_DRAIN, NULL); + if (err < 0) + goto error; + } + return IPC_INTEL_GLB_REPLY_SUCCESS; + +error: + return IPC_INTEL_GLB_REPLY_ERROR_INVALID_PARAM; }
static uint32_t ipc_stage_message(uint32_t header)