[Sound-open-firmware] [PATCH] buffer: add new buffer management apis for component convenience

Liam Girdwood liam.r.girdwood at linux.intel.com
Thu Sep 7 00:44:05 CEST 2017


Add new APIs to allow components to easily resize, reset and clear
buffers. Update host, mixer and volume to use them.

Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
 src/audio/host.c                | 10 ++++------
 src/audio/mixer.c               | 14 ++++++++++++++
 src/audio/volume.c              | 14 ++++++++++++--
 src/include/reef/audio/buffer.h | 25 +++++++++++++++++++++++++
 4 files changed, 55 insertions(+), 8 deletions(-)

diff --git a/src/audio/host.c b/src/audio/host.c
index e71e95f..3c8ed96 100644
--- a/src/audio/host.c
+++ b/src/audio/host.c
@@ -412,11 +412,10 @@ static int host_params(struct comp_dev *dev)
 
 	/* resize the buffer if space is available to align with period size */
 	buffer_size = hd->period_count * hd->period_bytes;
-	if (buffer_size <= hd->dma_buffer->alloc_size)
-		hd->dma_buffer->size = buffer_size;
-	else {
+	err = buffer_set_size(hd->dma_buffer, buffer_size);
+	if (err < 0) {
 		trace_host_error("eSz");
-		return -EINVAL;
+		return err;
 	}
 
 	/* component buffer size must be divisor of host buffer size */
@@ -432,8 +431,7 @@ static int host_params(struct comp_dev *dev)
 	if (err < 0)
 		return err;
 
-	hd->dma_buffer->r_ptr = hd->dma_buffer->addr;
-	hd->dma_buffer->w_ptr = hd->dma_buffer->addr;
+	buffer_reset_pos(hd->dma_buffer);
 
 	/* set up DMA configuration */
 	config->src_width = sizeof(uint32_t);
diff --git a/src/audio/mixer.c b/src/audio/mixer.c
index 932c3ad..3f1f1ed 100644
--- a/src/audio/mixer.c
+++ b/src/audio/mixer.c
@@ -124,6 +124,9 @@ static void mixer_free(struct comp_dev *dev)
 static int mixer_params(struct comp_dev *dev)
 {
 	struct mixer_data *md = comp_get_drvdata(dev);
+	struct sof_ipc_comp_config *config = COMP_GET_CONFIG(dev);
+	struct comp_buffer *sink;
+	int ret;
 
 	trace_mixer("par");
 
@@ -141,6 +144,17 @@ static int mixer_params(struct comp_dev *dev)
 		return -EINVAL;
 	}
 
+	sink = list_first_item(&dev->bsink_list, struct comp_buffer, source_list);
+
+	/* set downstream buffer size */
+	ret = buffer_set_size(sink, md->period_bytes * config->periods_sink);
+	if (ret < 0) {
+		trace_mixer_error("mx3");
+		return ret;
+	}
+
+	buffer_reset_pos(sink);
+
 	return 0;
 }
 
diff --git a/src/audio/volume.c b/src/audio/volume.c
index c88f9d2..13bd752 100644
--- a/src/audio/volume.c
+++ b/src/audio/volume.c
@@ -505,8 +505,8 @@ static int volume_prepare(struct comp_dev *dev)
 {
 	struct comp_data *cd = comp_get_drvdata(dev);
 	struct comp_buffer *sinkb, *sourceb;
-	struct sof_ipc_comp_config *sconfig;
-	int i;
+	struct sof_ipc_comp_config *sconfig, *config = COMP_GET_CONFIG(dev);
+	int i, ret;
 
 	trace_volume("pre");
 
@@ -556,6 +556,16 @@ static int volume_prepare(struct comp_dev *dev)
 
 	dev->frame_bytes = cd->sink_period_bytes;
 
+	/* set downstream buffer size */
+	ret = buffer_set_size(sinkb, cd->sink_period_bytes *
+		config->periods_sink);
+	if (ret < 0) {
+		trace_volume_error("vp0");
+		return ret;
+	}
+
+	buffer_reset_pos(sinkb);
+
 	/* validate */
 	if (cd->sink_period_bytes == 0) {
 		trace_volume_error("vp1");
diff --git a/src/include/reef/audio/buffer.h b/src/include/reef/audio/buffer.h
index 83fcd57..483fa35 100644
--- a/src/include/reef/audio/buffer.h
+++ b/src/include/reef/audio/buffer.h
@@ -162,4 +162,29 @@ static inline uint32_t comp_buffer_get_copy_bytes(struct comp_dev *dev,
 	return copy_bytes;
 }
 
+static inline void buffer_reset_pos(struct comp_buffer *buffer)
+{
+	buffer->r_ptr = buffer->addr;
+	buffer->w_ptr = buffer->addr;
+	buffer->free = buffer->size;
+	buffer->avail = 0;
+}
+
+static inline void buffer_clear(struct comp_buffer *buffer)
+{
+	memset(buffer->addr, 0, buffer->size);
+}
+
+/* set the runtime size of a buffer in bytes and improve the data cache */
+/* performance by only using minimum space needed for runtime params */
+static inline int buffer_set_size(struct comp_buffer *buffer, uint32_t size)
+{
+	if (size > buffer->alloc_size)
+		return -ENOMEM;
+
+	buffer->end_addr = buffer->addr + size;
+	buffer->size = size;
+	return 0;
+}
+
 #endif
-- 
2.11.0



More information about the Sound-open-firmware mailing list