[Sound-open-firmware] [PATCH 1/4] SRC: IPC updates and fixes

Seppo Ingalsuo seppo.ingalsuo at linux.intel.com
Wed Jun 21 19:12:46 CEST 2017


SRC sets sink and downstream pipeline PCM rate in src_params() to
received out_rate. Also the use of incorrect alloc_size is replaced
by ipc_buffer.size.

Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo at linux.intel.com>
---
 src/audio/src.c                 | 22 +++++++++++++---------
 src/include/reef/audio/buffer.h |  8 ++++----
 src/include/uapi/ipc.h          |  1 +
 3 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/src/audio/src.c b/src/audio/src.c
index c338220..58ecf4b 100644
--- a/src/audio/src.c
+++ b/src/audio/src.c
@@ -155,7 +155,7 @@ static void src_2s_s32_default(struct comp_dev *dev,
 
 	s1.times = n_times1;
 	s1.x_end_addr = source->end_addr;
-	s1.x_size = source->alloc_size;
+	s1.x_size = source->ipc_buffer.size;
 	s1.x_inc = nch;
 	s1.y_end_addr = &cd->delay_lines[cd->scratch_length];
 	s1.y_size = STAGE_BUF_SIZE * sizeof(int32_t);
@@ -166,7 +166,7 @@ static void src_2s_s32_default(struct comp_dev *dev,
 	s2.x_size = STAGE_BUF_SIZE * sizeof(int32_t);
 	s2.x_inc = 1;
 	s2.y_end_addr = sink->end_addr;
-	s2.y_size = sink->alloc_size;
+	s2.y_size = sink->ipc_buffer.size;
 	s2.y_inc = nch;
 
 	s1.x_rptr = src + nch - 1;
@@ -227,10 +227,10 @@ static void src_1s_s32_default(struct comp_dev *dev,
 
 	s1.times = n_times;
 	s1.x_end_addr = source->end_addr;
-	s1.x_size = source->alloc_size;
+	s1.x_size = source->ipc_buffer.size;
 	s1.x_inc = nch;
 	s1.y_end_addr = sink->end_addr;
-	s1.y_size = sink->alloc_size;
+	s1.y_size = sink->ipc_buffer.size;
 	s1.y_inc = nch;
 	s1.x_rptr = src + nch - 1;
 	s1.y_wptr = dest + nch - 1;
@@ -263,7 +263,7 @@ static struct comp_dev *src_new(struct sof_ipc_comp *comp)
 {
 	struct comp_dev *dev;
 	struct sof_ipc_comp_src *src;
-	struct sof_ipc_comp_src *ipc_src = (struct sof_ipc_comp_src *)comp;
+	struct sof_ipc_comp_src *ipc_src = (struct sof_ipc_comp_src *) comp;
 	struct comp_data *cd;
 	int i;
 
@@ -274,7 +274,7 @@ static struct comp_dev *src_new(struct sof_ipc_comp *comp)
 	if (dev == NULL)
 		return NULL;
 
-	src = (struct sof_ipc_comp_src *)&dev->comp;
+	src = (struct sof_ipc_comp_src *) &dev->comp;
 	memcpy(src, ipc_src, sizeof(struct sof_ipc_comp_src));
 
 	cd = rmalloc(RZONE_RUNTIME, RFLAGS_NONE, sizeof(*cd));
@@ -317,6 +317,7 @@ static int src_params(struct comp_dev *dev, struct stream_params *params)
 	int32_t *buffer_start;
 	int n = 0;
 	struct comp_data *cd = comp_get_drvdata(dev);
+	struct sof_ipc_comp_src *src = (struct sof_ipc_comp_src *) &dev->comp;
 
 	trace_src("SPa");
 
@@ -325,7 +326,8 @@ static int src_params(struct comp_dev *dev, struct stream_params *params)
 		|| (params->pcm->frame_fmt != SOF_IPC_FRAME_S32_LE))
 		return -EINVAL;
 
-	/* No data transformation */
+	/* Stored IPC from src_new() contains the output rate for sink */
+	params->pcm->rate = src->out_rate;
 	comp_set_sink_params(dev, params);
 
 	/* Allocate needed memory for delay lines */
@@ -333,8 +335,10 @@ static int src_params(struct comp_dev *dev, struct stream_params *params)
 		sink_list);
 	sink = list_first_item(&dev->bsink_list, struct comp_buffer,
 		source_list);
-	src_buffer_lengths(&need, source->params.pcm->rate,
-		sink->params.pcm->rate, source->params.pcm->channels);
+	if (src_buffer_lengths(&need, source->params.pcm->rate,
+		sink->params.pcm->rate, source->params.pcm->channels) < 0)
+		return -EINVAL;
+
 	delay_lines_size = sizeof(int32_t) * need.total;
 	if (cd->delay_lines != NULL)
 		rfree(cd->delay_lines);
diff --git a/src/include/reef/audio/buffer.h b/src/include/reef/audio/buffer.h
index 5f2dbb7..0817a40 100644
--- a/src/include/reef/audio/buffer.h
+++ b/src/include/reef/audio/buffer.h
@@ -119,20 +119,20 @@ static inline void comp_update_sink_free_avail(struct comp_buffer *snk, int n)
 static inline void comp_wrap_source_r_ptr_circular(struct comp_buffer *src)
 {
         if (src->r_ptr >= src->end_addr)
-                src->r_ptr -= src->alloc_size;
+                src->r_ptr -= src->ipc_buffer.size;
 
         if (src->r_ptr < src->addr)
-                src->r_ptr += src->alloc_size;
+                src->r_ptr += src->ipc_buffer.size;
 }
 
 
 static inline void comp_wrap_sink_w_ptr_circular(struct comp_buffer *snk)
 {
         if (snk->w_ptr >= snk->end_addr)
-                snk->w_ptr -= snk->alloc_size;
+                snk->w_ptr -= snk->ipc_buffer.size;
 
         if (snk->w_ptr < snk->addr)
-                snk->w_ptr += snk->alloc_size;
+                snk->w_ptr += snk->ipc_buffer.size;
 }
 
 #endif
diff --git a/src/include/uapi/ipc.h b/src/include/uapi/ipc.h
index 3d78db3..d89039e 100644
--- a/src/include/uapi/ipc.h
+++ b/src/include/uapi/ipc.h
@@ -488,6 +488,7 @@ struct sof_ipc_comp_src {
 	struct sof_ipc_pcm_comp pcm;
 	uint32_t in_mask;	/* SOF_RATE_ supported input rates */
 	uint32_t out_mask;	/* SOF_RATE_ supported output rates */
+	int32_t out_rate;
 } __attribute__((packed));
 
 /* generic MUX component */
-- 
2.11.0



More information about the Sound-open-firmware mailing list