Skip to content
Merged
Show file tree
Hide file tree
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
24 changes: 12 additions & 12 deletions src/audio/module_adapter/module_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,13 @@ struct comp_dev *module_adapter_new_ext(const struct comp_driver *drv,
/* set the pipeline pointer if ipc_pipe is valid */
ipc_pipe = ipc_get_comp_by_ppl_id(ipc, COMP_TYPE_PIPELINE, config->pipeline_id,
IPC_COMP_IGNORE_REMOTE);
if (ipc_pipe)
if (ipc_pipe) {
dev->pipeline = ipc_pipe->pipeline;

/* LL modules have the same period as the pipeline */
if (dev->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_LL)
dev->period = ipc_pipe->pipeline->period;
}
#endif

/* Init processing module */
Expand Down Expand Up @@ -166,6 +171,9 @@ struct comp_dev *module_adapter_new_ext(const struct comp_driver *drv,
comp_err(dev, "%d: module params failed", ret);
goto err;
}

/* set component period frames */
component_set_nearest_period_frames(dev, params.rate);
#endif

comp_dbg(dev, "done");
Expand Down Expand Up @@ -226,11 +234,7 @@ int module_adapter_prepare(struct comp_dev *dev)

comp_dbg(dev, "start");
#if CONFIG_IPC_MAJOR_4
/*
* if the stream_params are valid, just update the sink/source buffer params. If not,
* retrieve the params from the basecfg, allocate stream_params and then update the
* sink/source buffer params.
*/
/* allocate stream_params and retrieve the params from the basecfg if needed */
if (!mod->stream_params) {
struct sof_ipc_stream_params params;

Expand All @@ -239,12 +243,6 @@ int module_adapter_prepare(struct comp_dev *dev)
comp_err(dev, "module_adapter_new() %d: module params failed", ret);
return ret;
}
} else {
ret = comp_verify_params(dev, mod->verify_params_flags, mod->stream_params);
if (ret < 0) {
comp_err(dev, "comp_verify_params() failed.");
return ret;
}
}
#endif
/* Prepare module */
Expand Down Expand Up @@ -535,11 +533,13 @@ int module_adapter_params(struct comp_dev *dev, struct sof_ipc_stream_params *pa

module_adapter_set_params(mod, params);

#if CONFIG_IPC_MAJOR_3
ret = comp_verify_params(dev, mod->verify_params_flags, params);
if (ret < 0) {
comp_err(dev, "comp_verify_params() failed.");
return ret;
}
#endif

/* allocate stream_params each time */
if (mod->stream_params)
Expand Down
36 changes: 36 additions & 0 deletions src/audio/module_adapter/module_adapter_ipc4.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,11 +320,47 @@ static bool module_adapter_multi_sink_source_prepare(struct comp_dev *dev)
return false;
}

static int module_update_source_buffer_params(struct processing_module *mod,
struct bind_info *bind_data)
{
struct module_config *dst = &mod->priv.cfg;
struct sof_ipc_stream_params params;
struct comp_buffer *buffer;
int dst_queue_id = bind_data->ipc4_data->extension.r.dst_queue;

/* only update buffer params for sink components */
if (bind_data->bind_type != COMP_BIND_TYPE_SOURCE)
return 0;

comp_dev_for_each_producer(mod->dev, buffer) {
if (IPC4_SINK_QUEUE_ID(buffer->stream.runtime_stream_params.id) != dst_queue_id)
continue;

/* use base_cfg params for pin 0 or if base config extn is missing */
if (!dst_queue_id || dst_queue_id >= dst->nb_input_pins) {
buffer_set_params(buffer, mod->stream_params, BUFFER_UPDATE_FORCE);
return 0;
}

/* otherwise use the respective input pin audio format */
ipc4_audio_format_to_stream_params(&dst->input_pins[dst_queue_id].audio_fmt,
&params);
buffer_set_params(buffer, &params, BUFFER_UPDATE_FORCE);
return 0;
}

return 0;
}

int module_adapter_bind(struct comp_dev *dev, struct bind_info *bind_data)
{
struct processing_module *mod = comp_mod(dev);
int ret;

ret = module_update_source_buffer_params(mod, bind_data);
if (ret < 0)
return ret;

ret = module_bind(mod, bind_data);
if (ret < 0)
return ret;
Expand Down
2 changes: 2 additions & 0 deletions src/include/ipc4/base-config.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
struct sof_ipc_stream_params;
void ipc4_base_module_cfg_to_stream_params(const struct ipc4_base_module_cfg *base_cfg,
struct sof_ipc_stream_params *params);
void ipc4_audio_format_to_stream_params(const struct ipc4_audio_format *audio_fmt,
struct sof_ipc_stream_params *params);
struct comp_buffer;
void ipc4_update_buffer_format(struct comp_buffer *buf_c,
const struct ipc4_audio_format *fmt);
Expand Down
35 changes: 22 additions & 13 deletions src/ipc/ipc4/helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -1152,28 +1152,37 @@ int ipc4_find_dma_config_multiple(struct ipc_config_dai *dai, uint8_t *data_buff
return IPC4_INVALID_REQUEST;
}

void ipc4_base_module_cfg_to_stream_params(const struct ipc4_base_module_cfg *base_cfg,
struct sof_ipc_stream_params *params)
void ipc4_audio_format_to_stream_params(const struct ipc4_audio_format *audio_fmt,
struct sof_ipc_stream_params *params)
{
enum sof_ipc_frame frame_fmt, valid_fmt;
int i;

memset(params, 0, sizeof(struct sof_ipc_stream_params));
params->channels = base_cfg->audio_fmt.channels_count;
params->rate = base_cfg->audio_fmt.sampling_frequency;
params->sample_container_bytes = base_cfg->audio_fmt.depth / 8;
params->sample_valid_bytes = base_cfg->audio_fmt.valid_bit_depth / 8;
params->buffer_fmt = base_cfg->audio_fmt.interleaving_style;
params->buffer.size = base_cfg->obs * 2;

audio_stream_fmt_conversion(base_cfg->audio_fmt.depth,
base_cfg->audio_fmt.valid_bit_depth,
params->channels = audio_fmt->channels_count;
params->rate = audio_fmt->sampling_frequency;
params->sample_container_bytes = audio_fmt->depth / 8;
params->sample_valid_bytes = audio_fmt->valid_bit_depth / 8;
params->buffer_fmt = audio_fmt->interleaving_style;

audio_stream_fmt_conversion(audio_fmt->depth,
audio_fmt->valid_bit_depth,
&frame_fmt, &valid_fmt,
base_cfg->audio_fmt.s_type);
audio_fmt->s_type);
params->frame_fmt = frame_fmt;

for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++)
params->chmap[i] = (base_cfg->audio_fmt.ch_map >> i * 4) & 0xf;
params->chmap[i] = (audio_fmt->ch_map >> i * 4) & 0xf;
}
EXPORT_SYMBOL(ipc4_audio_format_to_stream_params);

void ipc4_base_module_cfg_to_stream_params(const struct ipc4_base_module_cfg *base_cfg,
struct sof_ipc_stream_params *params)
{
memset(params, 0, sizeof(struct sof_ipc_stream_params));
params->buffer.size = base_cfg->obs * 2;

ipc4_audio_format_to_stream_params(&base_cfg->audio_fmt, params);
}
EXPORT_SYMBOL(ipc4_base_module_cfg_to_stream_params);

Expand Down
Loading