diff --git a/src/audio/multiband_drc/multiband_drc.c b/src/audio/multiband_drc/multiband_drc.c index 84a079134ea1..8596e905a7db 100644 --- a/src/audio/multiband_drc/multiband_drc.c +++ b/src/audio/multiband_drc/multiband_drc.c @@ -5,10 +5,8 @@ // Author: Pin-chih Lin #include -#include #include #include -#include #include #include #include @@ -301,15 +299,12 @@ __cold static int multiband_drc_get_config(struct processing_module *mod, } static int multiband_drc_process(struct processing_module *mod, - struct input_stream_buffer *input_buffers, int num_input_buffers, - struct output_stream_buffer *output_buffers, - int num_output_buffers) + struct sof_source **sources, int num_of_sources, + struct sof_sink **sinks, int num_of_sinks) { struct multiband_drc_comp_data *cd = module_get_private_data(mod); struct comp_dev *dev = mod->dev; - struct audio_stream *source = input_buffers[0].data; - struct audio_stream *sink = output_buffers[0].data; - int frames = input_buffers[0].size; + int frames = source_get_data_frames_available(sources[0]); int ret; comp_dbg(dev, "entry"); @@ -317,8 +312,8 @@ static int multiband_drc_process(struct processing_module *mod, /* Check for changed configuration */ if (comp_is_new_data_blob_available(cd->model_handler)) { cd->config = comp_get_data_blob(cd->model_handler, NULL, NULL); - ret = multiband_drc_setup(mod, (int16_t)audio_stream_get_channels(sink), - audio_stream_get_rate(sink)); + ret = multiband_drc_setup(mod, (int16_t)sink_get_channels(sinks[0]), + sink_get_rate(sinks[0])); if (ret < 0) { comp_err(dev, "failed DRC setup"); return ret; @@ -326,13 +321,14 @@ static int multiband_drc_process(struct processing_module *mod, } if (cd->process_enabled) - cd->multiband_drc_func(mod, source, sink, frames); + ret = cd->multiband_drc_func(mod, sources[0], sinks[0], frames); else - multiband_drc_default_pass(mod, source, sink, frames); + ret = multiband_drc_default_pass(mod, sources[0], sinks[0], frames); - /* calc new free and available */ - module_update_buffer_position(&input_buffers[0], &output_buffers[0], frames); - return 0; + if (ret < 0) + comp_err(dev, "processing failed: %d", ret); + + return ret; } static int multiband_drc_prepare(struct processing_module *mod, @@ -341,7 +337,6 @@ static int multiband_drc_prepare(struct processing_module *mod, { struct multiband_drc_comp_data *cd = module_get_private_data(mod); struct comp_dev *dev = mod->dev; - struct comp_buffer *sourceb; size_t data_size; int channels; int rate; @@ -353,17 +348,10 @@ static int multiband_drc_prepare(struct processing_module *mod, if (ret < 0) return ret; - /* DRC component will only ever have 1 source and 1 sink buffer */ - sourceb = comp_dev_get_first_data_producer(dev); - if (!sourceb) { - comp_err(dev, "no source buffer"); - return -ENOTCONN; - } - /* get source data format */ - cd->source_format = audio_stream_get_frm_fmt(&sourceb->stream); - channels = audio_stream_get_channels(&sourceb->stream); - rate = audio_stream_get_rate(&sourceb->stream); + cd->source_format = source_get_frm_fmt(sources[0]); + channels = (int16_t)source_get_channels(sources[0]); + rate = source_get_rate(sources[0]); /* Initialize DRC */ comp_dbg(dev, "source_format=%d, sink_format=%d", @@ -404,7 +392,7 @@ static int multiband_drc_reset(struct processing_module *mod) static const struct module_interface multiband_drc_interface = { .init = multiband_drc_init, .prepare = multiband_drc_prepare, - .process_audio_stream = multiband_drc_process, + .process = multiband_drc_process, .set_configuration = multiband_drc_set_config, .get_configuration = multiband_drc_get_config, .reset = multiband_drc_reset, diff --git a/src/audio/multiband_drc/multiband_drc.h b/src/audio/multiband_drc/multiband_drc.h index 6a99fda55cef..ba939663de5d 100644 --- a/src/audio/multiband_drc/multiband_drc.h +++ b/src/audio/multiband_drc/multiband_drc.h @@ -28,10 +28,10 @@ struct multiband_drc_state { struct iir_state_df1 deemphasis[PLATFORM_MAX_CHANNELS]; }; -typedef void (*multiband_drc_func)(const struct processing_module *mod, - const struct audio_stream *source, - struct audio_stream *sink, - uint32_t frames); +typedef int (*multiband_drc_func)(const struct processing_module *mod, + struct sof_source *source, + struct sof_sink *sink, + uint32_t frames); /* Multiband DRC component private data */ struct multiband_drc_comp_data { @@ -54,10 +54,10 @@ extern const struct multiband_drc_proc_fnmap multiband_drc_proc_fnmap[]; extern const struct multiband_drc_proc_fnmap multiband_drc_proc_fnmap_pass[]; extern const size_t multiband_drc_proc_fncount; -void multiband_drc_default_pass(const struct processing_module *mod, - const struct audio_stream *source, - struct audio_stream *sink, - uint32_t frames); +int multiband_drc_default_pass(const struct processing_module *mod, + struct sof_source *source, + struct sof_sink *sink, + uint32_t frames); /** * \brief Returns Multiband DRC processing function. diff --git a/src/audio/multiband_drc/multiband_drc_generic.c b/src/audio/multiband_drc/multiband_drc_generic.c index bd64f5012fc8..b14387a1baaf 100644 --- a/src/audio/multiband_drc/multiband_drc_generic.c +++ b/src/audio/multiband_drc/multiband_drc_generic.c @@ -6,17 +6,18 @@ #include #include +#include #include #include "multiband_drc.h" #include "../drc/drc_algorithm.h" -void multiband_drc_default_pass(const struct processing_module *mod, - const struct audio_stream *source, - struct audio_stream *sink, - uint32_t frames) +int multiband_drc_default_pass(const struct processing_module *mod, + struct sof_source *source, + struct sof_sink *sink, + uint32_t frames) { - audio_stream_copy(source, 0, sink, 0, audio_stream_get_channels(source) * frames); + return source_to_sink_copy(source, sink, true, frames * source_get_frame_bytes(source)); } static void multiband_drc_process_emp_crossover(struct multiband_drc_state *state, @@ -203,10 +204,10 @@ static void multiband_drc_process_deemp(struct multiband_drc_state *state, * :buf_drc_src[nch*nband] :buf_sink[nch] */ #if CONFIG_FORMAT_S16LE -static void multiband_drc_s16_default(const struct processing_module *mod, - const struct audio_stream *source, - struct audio_stream *sink, - uint32_t frames) +static int multiband_drc_s16_default(const struct processing_module *mod, + struct sof_source *source, + struct sof_sink *sink, + uint32_t frames) { struct multiband_drc_comp_data *cd = module_get_private_data(mod); struct multiband_drc_state *state = &cd->state; @@ -216,22 +217,35 @@ static void multiband_drc_s16_default(const struct processing_module *mod, int32_t buf_drc_sink[PLATFORM_MAX_CHANNELS * SOF_MULTIBAND_DRC_MAX_BANDS]; int32_t *band_buf_drc_src; int32_t *band_buf_drc_sink; - int16_t *x = audio_stream_get_rptr(source); - int16_t *y = audio_stream_get_wptr(sink); + const int16_t *x, *buf_x_start; + int16_t *y, *buf_y_start; + int buf_x_samples, buf_y_samples; + size_t n_bytes = frames * source_get_frame_bytes(source); int band; int nbuf; int npcm; + int ret; int ch; int i; - int nch = audio_stream_get_channels(source); + int nch = source_get_channels(source); int nband = cd->config->num_bands; int enable_emp_deemp = cd->config->enable_emp_deemp; int samples = frames * nch; + ret = source_get_data_s16(source, n_bytes, &x, &buf_x_start, &buf_x_samples); + if (ret) + return ret; + + ret = sink_get_buffer_s16(sink, n_bytes, &y, &buf_y_start, &buf_y_samples); + if (ret) { + source_release_data(source, 0); + return ret; + } + while (samples) { - nbuf = audio_stream_samples_without_wrap_s16(source, x); + nbuf = cir_buf_samples_to_wrap_s16(x, buf_x_start, buf_x_samples); npcm = MIN(samples, nbuf); - nbuf = audio_stream_samples_without_wrap_s16(sink, y); + nbuf = cir_buf_samples_to_wrap_s16(y, buf_y_start, buf_y_samples); npcm = MIN(npcm, nbuf); for (i = 0; i < npcm; i += nch) { for (ch = 0; ch < nch; ch++) { @@ -263,17 +277,22 @@ static void multiband_drc_s16_default(const struct processing_module *mod, } } samples -= npcm; - x = audio_stream_wrap(source, x); - y = audio_stream_wrap(sink, y); + if (x >= buf_x_start + buf_x_samples) + x = buf_x_start; + if (y >= buf_y_start + buf_y_samples) + y = buf_y_start; } + source_release_data(source, n_bytes); + sink_commit_buffer(sink, n_bytes); + return 0; } #endif /* CONFIG_FORMAT_S16LE */ #if CONFIG_FORMAT_S24LE -static void multiband_drc_s24_default(const struct processing_module *mod, - const struct audio_stream *source, - struct audio_stream *sink, - uint32_t frames) +static int multiband_drc_s24_default(const struct processing_module *mod, + struct sof_source *source, + struct sof_sink *sink, + uint32_t frames) { struct multiband_drc_comp_data *cd = module_get_private_data(mod); struct multiband_drc_state *state = &cd->state; @@ -283,22 +302,35 @@ static void multiband_drc_s24_default(const struct processing_module *mod, int32_t buf_drc_sink[PLATFORM_MAX_CHANNELS * SOF_MULTIBAND_DRC_MAX_BANDS]; int32_t *band_buf_drc_src; int32_t *band_buf_drc_sink; - int32_t *x = audio_stream_get_rptr(source); - int32_t *y = audio_stream_get_wptr(sink); + const int32_t *x, *buf_x_start; + int32_t *y, *buf_y_start; + int buf_x_samples, buf_y_samples; + size_t n_bytes = frames * source_get_frame_bytes(source); int band; int nbuf; int npcm; + int ret; int ch; int i; - int nch = audio_stream_get_channels(source); + int nch = source_get_channels(source); int nband = cd->config->num_bands; int enable_emp_deemp = cd->config->enable_emp_deemp; int samples = frames * nch; + ret = source_get_data_s32(source, n_bytes, &x, &buf_x_start, &buf_x_samples); + if (ret) + return ret; + + ret = sink_get_buffer_s32(sink, n_bytes, &y, &buf_y_start, &buf_y_samples); + if (ret) { + source_release_data(source, 0); + return ret; + } + while (samples) { - nbuf = audio_stream_samples_without_wrap_s24(source, x); + nbuf = cir_buf_samples_to_wrap_s32(x, buf_x_start, buf_x_samples); npcm = MIN(samples, nbuf); - nbuf = audio_stream_samples_without_wrap_s24(sink, y); + nbuf = cir_buf_samples_to_wrap_s32(y, buf_y_start, buf_y_samples); npcm = MIN(npcm, nbuf); for (i = 0; i < npcm; i += nch) { for (ch = 0; ch < nch; ch++) { @@ -330,17 +362,22 @@ static void multiband_drc_s24_default(const struct processing_module *mod, } } samples -= npcm; - x = audio_stream_wrap(source, x); - y = audio_stream_wrap(sink, y); + if (x >= buf_x_start + buf_x_samples) + x = buf_x_start; + if (y >= buf_y_start + buf_y_samples) + y = buf_y_start; } + source_release_data(source, n_bytes); + sink_commit_buffer(sink, n_bytes); + return 0; } #endif /* CONFIG_FORMAT_S24LE */ #if CONFIG_FORMAT_S32LE -static void multiband_drc_s32_default(const struct processing_module *mod, - const struct audio_stream *source, - struct audio_stream *sink, - uint32_t frames) +static int multiband_drc_s32_default(const struct processing_module *mod, + struct sof_source *source, + struct sof_sink *sink, + uint32_t frames) { struct multiband_drc_comp_data *cd = module_get_private_data(mod); struct multiband_drc_state *state = &cd->state; @@ -350,22 +387,35 @@ static void multiband_drc_s32_default(const struct processing_module *mod, int32_t buf_drc_sink[PLATFORM_MAX_CHANNELS * SOF_MULTIBAND_DRC_MAX_BANDS]; int32_t *band_buf_drc_src; int32_t *band_buf_drc_sink; - int32_t *x = audio_stream_get_rptr(source); - int32_t *y = audio_stream_get_wptr(sink); + const int32_t *x, *buf_x_start; + int32_t *y, *buf_y_start; + int buf_x_samples, buf_y_samples; + size_t n_bytes = frames * source_get_frame_bytes(source); int band; int nbuf; int npcm; + int ret; int ch; int i; - int nch = audio_stream_get_channels(source); + int nch = source_get_channels(source); int nband = cd->config->num_bands; int enable_emp_deemp = cd->config->enable_emp_deemp; int samples = frames * nch; + ret = source_get_data_s32(source, n_bytes, &x, &buf_x_start, &buf_x_samples); + if (ret) + return ret; + + ret = sink_get_buffer_s32(sink, n_bytes, &y, &buf_y_start, &buf_y_samples); + if (ret) { + source_release_data(source, 0); + return ret; + } + while (samples) { - nbuf = audio_stream_samples_without_wrap_s32(source, x); + nbuf = cir_buf_samples_to_wrap_s32(x, buf_x_start, buf_x_samples); npcm = MIN(samples, nbuf); - nbuf = audio_stream_samples_without_wrap_s32(sink, y); + nbuf = cir_buf_samples_to_wrap_s32(y, buf_y_start, buf_y_samples); npcm = MIN(npcm, nbuf); for (i = 0; i < npcm; i += nch) { for (ch = 0; ch < nch; ch++) { @@ -397,9 +447,14 @@ static void multiband_drc_s32_default(const struct processing_module *mod, } } samples -= npcm; - x = audio_stream_wrap(source, x); - y = audio_stream_wrap(sink, y); + if (x >= buf_x_start + buf_x_samples) + x = buf_x_start; + if (y >= buf_y_start + buf_y_samples) + y = buf_y_start; } + source_release_data(source, n_bytes); + sink_commit_buffer(sink, n_bytes); + return 0; } #endif /* CONFIG_FORMAT_S32LE */ diff --git a/src/include/module/audio/audio_stream.h b/src/include/module/audio/audio_stream.h index e032ef322f85..77bb7d9785d7 100644 --- a/src/include/module/audio/audio_stream.h +++ b/src/include/module/audio/audio_stream.h @@ -74,4 +74,32 @@ struct sof_audio_stream_params { enum sof_audio_buffer_state state; /**< audio stream state */ }; +/** + * @brief Calculates numbers of s16 samples to buffer wrap. + * @param ptr Read or write pointer of circular buffer. + * @param buf_start Start address of circular buffer. + * @return Number of samples to buffer wrap. + */ +static inline int cir_buf_samples_to_wrap_s16(const int16_t *ptr, const int16_t *buf_start, + int buf_samples) +{ + const int16_t *const buf_end = buf_start + buf_samples; + + return buf_end - ptr; +} + +/** + * @brief Calculates numbers of s32 samples to buffer wrap. + * @param ptr Read or write pointer of circular buffer. + * @param buf_start Start address of circular buffer. + * @return Number of samples to buffer wrap. + */ +static inline int cir_buf_samples_to_wrap_s32(const int32_t *ptr, const int32_t *buf_start, + int buf_samples) +{ + const int32_t *const buf_end = buf_start + buf_samples; + + return buf_end - ptr; +} + #endif /* __MODULE_AUDIO_AUDIO_STREAM_H__ */