From 21ba646d4714903e1fa496bc3421e58864ad200f Mon Sep 17 00:00:00 2001 From: Bartosz Kokoszko Date: Wed, 4 Nov 2020 11:42:20 +0100 Subject: [PATCH 1/3] mux: change prepare_active_look_up() function name This commit changes prepare_active_look_up() function name to be mux specific. Signed-off-by: Bartosz Kokoszko --- src/audio/mux/mux.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/audio/mux/mux.c b/src/audio/mux/mux.c index 779a9728515f..aa0e4e397f8b 100644 --- a/src/audio/mux/mux.c +++ b/src/audio/mux/mux.c @@ -317,9 +317,9 @@ static int mux_cmd(struct comp_dev *dev, int cmd, void *data, } } -static void prepare_active_look_up(struct comp_dev *dev, - struct audio_stream *sink, - const struct audio_stream **sources) +static void mux_prepare_active_look_up(struct comp_dev *dev, + struct audio_stream *sink, + const struct audio_stream **sources) { struct comp_data *cd = comp_get_drvdata(dev); const struct audio_stream *source; @@ -519,7 +519,7 @@ static int mux_copy(struct comp_dev *dev) } sink_bytes = frames * audio_stream_frame_bytes(&sink->stream); - prepare_active_look_up(dev, &sink->stream, &sources_stream[0]); + mux_prepare_active_look_up(dev, &sink->stream, &sources_stream[0]); /* produce output */ cd->mux(dev, &sink->stream, &sources_stream[0], frames, From 4713b494a4ee42369573c8f4cc9c65084c2b18f6 Mon Sep 17 00:00:00 2001 From: Bartosz Kokoszko Date: Wed, 4 Nov 2020 11:48:53 +0100 Subject: [PATCH 2/3] mux: add channels check in mux_prepare_active_look_up() This commit adds channel parameter checking in mux_prepare_active_look_up() function. Look up table should not include elements referring to channels higher than those actually set in source/sink buffers. Signed-off-by: Bartosz Kokoszko --- src/audio/mux/mux.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/audio/mux/mux.c b/src/audio/mux/mux.c index aa0e4e397f8b..c68e421c23f8 100644 --- a/src/audio/mux/mux.c +++ b/src/audio/mux/mux.c @@ -336,6 +336,12 @@ static void mux_prepare_active_look_up(struct comp_dev *dev, if (!source) continue; + if ((cd->lookup[0].copy_elem[elem].in_ch > + (source->channels - 1)) || + (cd->lookup[0].copy_elem[elem].out_ch > + (sink->channels - 1))) + continue; + cd->active_lookup.copy_elem[active_elem] = cd->lookup[0].copy_elem[elem]; active_elem++; From aea020e83ee6659b2efd8be398d9375a37f71547 Mon Sep 17 00:00:00 2001 From: Bartosz Kokoszko Date: Wed, 4 Nov 2020 11:51:12 +0100 Subject: [PATCH 3/3] demux: add demux_prepare_active_look_up() function This commit adds demux_prepare_active_look_up() function. It contains channel parameter checking. Look up table should not include elements referring to channels higher than those actually set in source/sink buffers. Signed-off-by: Bartosz Kokoszko --- src/audio/mux/mux.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/audio/mux/mux.c b/src/audio/mux/mux.c index c68e421c23f8..40dd59a03f8f 100644 --- a/src/audio/mux/mux.c +++ b/src/audio/mux/mux.c @@ -349,6 +349,34 @@ static void mux_prepare_active_look_up(struct comp_dev *dev, } } +static void demux_prepare_active_look_up(struct comp_dev *dev, + struct audio_stream *sink, + const struct audio_stream *source, + struct mux_look_up *look_up) +{ + struct comp_data *cd = comp_get_drvdata(dev); + uint8_t active_elem; + uint8_t elem; + + cd->active_lookup.num_elems = 0; + + active_elem = 0; + + /* init pointers */ + for (elem = 0; elem < look_up->num_elems; elem++) { + if ((look_up->copy_elem[elem].in_ch > + (source->channels - 1)) || + (look_up->copy_elem[elem].out_ch > + (sink->channels - 1))) + continue; + + cd->active_lookup.copy_elem[active_elem] = + look_up->copy_elem[elem]; + active_elem++; + cd->active_lookup.num_elems = active_elem; + } +} + /* process and copy stream data from source to sink buffers */ static int demux_copy(struct comp_dev *dev) { @@ -429,9 +457,11 @@ static int demux_copy(struct comp_dev *dev) if (!sinks[i]) continue; + demux_prepare_active_look_up(dev, &sinks[i]->stream, + &source->stream, look_ups[i]); buffer_invalidate(source, source_bytes); cd->demux(dev, &sinks[i]->stream, &source->stream, frames, - look_ups[i]); + &cd->active_lookup); buffer_writeback(sinks[i], sinks_bytes[i]); }