Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 46 additions & 15 deletions src/audio/module_adapter/module/waves/waves.c
Original file line number Diff line number Diff line change
Expand Up @@ -753,28 +753,47 @@ static int waves_codec_init_process(struct processing_module *mod)
return 0;
}

static int
waves_codec_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)
static int waves_codec_process(struct processing_module *mod,
struct sof_source **sources, int num_of_sources,
struct sof_sink **sinks, int num_of_sinks)
Comment on lines +756 to +758
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@softwarecki do we have an init check for this when buffers are setup ? Seems valid.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lgirdwood Number of sources and sinks is checked in module_adapter_prepare(). It returns an error if any of these values is zero. So process() cannot be called without at least one source and sink.

/* compute number of input buffers */
mod->num_of_sources = 0;
list_for_item(blist, &dev->bsource_list)
mod->num_of_sources++;
/* compute number of output buffers */
mod->num_of_sinks = 0;
list_for_item(blist, &dev->bsink_list)
mod->num_of_sinks++;
if (!mod->num_of_sources && !mod->num_of_sinks) {
comp_err(dev, "no source and sink buffers connected!");
return -EINVAL;
}
if (mod->num_of_sources > CONFIG_MODULE_MAX_CONNECTIONS ||
mod->num_of_sinks > CONFIG_MODULE_MAX_CONNECTIONS) {
comp_err(dev, "too many connected sinks %d or sources %d!",
mod->num_of_sinks, mod->num_of_sources);
return -EINVAL;
}
if (mod->num_of_sources > mod->max_sources ||
mod->num_of_sinks > mod->max_sinks) {
comp_err(dev, "connected sources %d (max %d) or sinks %d (max %d) exceed module capacity",
mod->num_of_sources, mod->max_sources,
mod->num_of_sinks, mod->max_sinks);
return -EINVAL;
}

{
int ret;
struct comp_dev *dev = mod->dev;
struct module_data *codec = &mod->priv;
struct waves_codec_data *waves_codec = codec->private;
const void *src_ptr;
const void *src_buf_start;
size_t src_buf_size;
void *snk_ptr;
void *snk_buf_start;
size_t snk_buf_size;
size_t n_bytes = codec->mpd.in_buff_size;
size_t size_to_wrap;

/* Proceed only if we have enough data to fill the module buffer completely */
if (input_buffers[0].size < codec->mpd.in_buff_size) {
if (source_get_data_available(sources[0]) < n_bytes) {
comp_dbg(dev, "not enough data to process");
return -ENODATA;
}

if (!codec->mpd.init_done)
waves_codec_init_process(mod);

memcpy_s(codec->mpd.in_buff, codec->mpd.in_buff_size,
input_buffers[0].data, codec->mpd.in_buff_size);
codec->mpd.avail = codec->mpd.in_buff_size;
ret = source_get_data(sources[0], n_bytes, &src_ptr, &src_buf_start, &src_buf_size);
if (ret)
return ret;

/* src_buf_size is the total ring buffer size; handle wrap when copying to in_buff */
size_to_wrap = (const uint8_t *)src_buf_start + src_buf_size - (const uint8_t *)src_ptr;
if (n_bytes <= size_to_wrap) {
memcpy_s(codec->mpd.in_buff, n_bytes, src_ptr, n_bytes);
} else {
memcpy_s(codec->mpd.in_buff, n_bytes, src_ptr, size_to_wrap);
memcpy_s((uint8_t *)codec->mpd.in_buff + size_to_wrap, n_bytes - size_to_wrap,
src_buf_start, n_bytes - size_to_wrap);
}
source_release_data(sources[0], n_bytes);
codec->mpd.avail = n_bytes;

comp_dbg(dev, "start");

Expand Down Expand Up @@ -812,12 +831,24 @@ waves_codec_process(struct processing_module *mod,
codec->mpd.produced = waves_codec->o_stream.numAvailableSamples *
waves_codec->o_format.numChannels * waves_codec->sample_size_in_bytes;
codec->mpd.consumed = codec->mpd.produced;
input_buffers[0].consumed = codec->mpd.consumed;
ret = 0;
/* copy the produced samples into the output buffer */
memcpy_s(output_buffers[0].data, codec->mpd.produced, codec->mpd.out_buff,
codec->mpd.produced);
output_buffers[0].size = codec->mpd.produced;
ret = sink_get_buffer(sinks[0], codec->mpd.produced,
&snk_ptr, &snk_buf_start, &snk_buf_size);
if (!ret) {
/* snk_buf_size is the total ring buffer size; handle wrap */
size_to_wrap = (uint8_t *)snk_buf_start + snk_buf_size -
(uint8_t *)snk_ptr;
if (codec->mpd.produced <= size_to_wrap) {
memcpy_s(snk_ptr, codec->mpd.produced,
codec->mpd.out_buff, codec->mpd.produced);
} else {
memcpy_s(snk_ptr, codec->mpd.produced,
codec->mpd.out_buff, size_to_wrap);
memcpy_s(snk_buf_start, codec->mpd.produced - size_to_wrap,
(const uint8_t *)codec->mpd.out_buff + size_to_wrap,
codec->mpd.produced - size_to_wrap);
}
sink_commit_buffer(sinks[0], codec->mpd.produced);
}
}

if (ret)
Expand Down Expand Up @@ -899,7 +930,7 @@ waves_codec_set_configuration(struct processing_module *mod, uint32_t config_id,
static const struct module_interface waves_interface = {
.init = waves_codec_init,
.prepare = waves_codec_prepare,
.process_raw_data = waves_codec_process,
.process = waves_codec_process,
.set_configuration = waves_codec_set_configuration,
.reset = waves_codec_reset,
.free = waves_codec_free
Expand Down
Loading