[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