[Sound-open-firmware] [PATCH] component: add 64bit position counter to each component
Liam Girdwood
liam.r.girdwood at linux.intel.com
Tue Aug 15 17:39:23 CEST 2017
Components will now each have a 64bit position counter that will indicate
the processing position in bytes for each component. This can be used
by time stamping, trace and debug.
Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
src/audio/dai.c | 6 ++++++
src/audio/host.c | 6 ++++--
src/include/reef/audio/component.h | 1 +
3 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/audio/dai.c b/src/audio/dai.c
index 8f41026..f7868cd 100644
--- a/src/audio/dai.c
+++ b/src/audio/dai.c
@@ -95,6 +95,7 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
dcache_writeback_region(dma_buffer->r_ptr, dd->period_bytes);
/* update host position(in bytes offset) for drivers */
+ dev->position += copied_size;
if (dd->dai_pos) {
dd->dai_pos_blks += copied_size;
*dd->dai_pos = dd->dai_pos_blks +
@@ -111,6 +112,8 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
/* recalc available buffer space */
comp_update_buffer_produce(dma_buffer, dd->period_bytes);
+ /* update positions */
+ dev->position += dd->period_bytes;
if (dd->dai_pos) {
dd->dai_pos_blks += dd->period_bytes;
*dd->dai_pos = dd->dai_pos_blks +
@@ -396,6 +399,8 @@ static int dai_prepare(struct comp_dev *dev)
trace_dai("pre");
+ dev->position = 0;
+
if (list_is_empty(&dd->config.elem_list)) {
trace_dai_error("wdm");
return -EINVAL;
@@ -436,6 +441,7 @@ static int dai_reset(struct comp_dev *dev)
*dd->dai_pos = 0;
dd->dai_pos = NULL;
dd->last_bytes = 0;
+ dev->position = 0;
return 0;
}
diff --git a/src/audio/host.c b/src/audio/host.c
index 5ac2cf4..5cdc4da 100644
--- a/src/audio/host.c
+++ b/src/audio/host.c
@@ -143,6 +143,7 @@ static void host_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
/* new local period, update host buffer position blks */
hd->local_pos += local_elem->size;
+ dev->position += local_elem->size;
/* buffer overlap ? */
if (hd->local_pos >= hd->host_size)
@@ -150,6 +151,7 @@ static void host_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
/* send IPC message to driver if needed */
hd->report_pos += local_elem->size;
+ hd->posn.host_posn += local_elem->size;
if (dev->params.host_period_bytes != 0 &&
hd->report_pos >= dev->params.host_period_bytes) {
hd->report_pos = 0;
@@ -486,8 +488,7 @@ static int host_prepare(struct comp_dev *dev)
*hd->host_pos = 0;
hd->report_pos = 0;
hd->split_remaining = 0;
-
- //dev->preload = PLAT_HOST_PERIODS;
+ dev->position = 0;
dev->state = COMP_STATE_PREPARE;
return 0;
@@ -502,6 +503,7 @@ static int host_pointer_reset(struct comp_dev *dev)
*hd->host_pos = 0;
hd->local_pos = 0;
hd->report_pos = 0;
+ dev->position = 0;
return 0;
}
diff --git a/src/include/reef/audio/component.h b/src/include/reef/audio/component.h
index 28ce144..3238e13 100644
--- a/src/include/reef/audio/component.h
+++ b/src/include/reef/audio/component.h
@@ -159,6 +159,7 @@ struct comp_dev {
uint16_t state; /* COMP_STATE_ */
uint16_t is_endpoint; /* component is end point in pipeline */
spinlock_t lock; /* lock for this component */
+ uint64_t position; /* component rendering position */
struct pipeline *pipeline; /* pipeline we belong to */
/* common runtime configuration for downstream/upstream */
--
2.11.0
More information about the Sound-open-firmware
mailing list