diff --git a/src/audio/crossover/crossover_generic.c b/src/audio/crossover/crossover_generic.c index 694588b59f49..2f3118ba3946 100644 --- a/src/audio/crossover/crossover_generic.c +++ b/src/audio/crossover/crossover_generic.c @@ -225,32 +225,39 @@ static void crossover_s32_default(struct comp_data *cd, int32_t num_sinks, uint32_t frames) { - struct crossover_state *state; - const struct audio_stream *source_stream = bsource->data; - struct audio_stream *sink_stream; - int32_t *x, *y; - int ch, i, j; - int idx; - int nch = audio_stream_get_channels(source_stream); - int32_t out[num_sinks]; + /* Array to hold active sink streams; initialized to null */ + struct audio_stream *sink_stream[SOF_CROSSOVER_MAX_STREAMS] = { NULL }; + int active_sinks = 0; /* Counter for active sink streams */ + int ch, i, j; /* Indices for channels, frames, sinks */ + struct crossover_state *state; /* Current crossover channel state */ + const struct audio_stream *source_stream = bsource->data; /* Source stream */ + int32_t *x, *y; /* Source and sink frame pointers */ + int nch = audio_stream_get_channels(source_stream); /* Channel count */ + int32_t out[num_sinks]; /* Frame output for sinks */ + int idx; /* Combined index for source and sink */ + + /* Identify active sinks, avoid processing null sinks later */ + for (j = 0; j < num_sinks; j++) { + if (bsinks[j]) + sink_stream[active_sinks++] = bsinks[j]->data; + } + /* Process for each channel */ for (ch = 0; ch < nch; ch++) { - idx = ch; + /* Set current crossover state */ state = &cd->state[ch]; - for (i = 0; i < frames; i++) { + /* Iterate over frames */ + for (i = 0, idx = ch; i < frames; i++, idx += nch) { + /* Read source */ x = audio_stream_read_frag_s32(source_stream, idx); cd->crossover_split(*x, out, state); - for (j = 0; j < num_sinks; j++) { - if (!bsinks[j]) - continue; - sink_stream = bsinks[j]->data; - y = audio_stream_write_frag_s32(sink_stream, - idx); + /* Write output to active sinks */ + for (j = 0; j < active_sinks; j++) { + y = audio_stream_write_frag_s32(sink_stream[j], idx); + /* Copy processed data to sink */ *y = out[j]; } - - idx += nch; } } }