Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

audio_stream: Fix uninitialized data in alignment_constants #8672

Merged
merged 4 commits into from
Jan 9, 2024
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
6 changes: 2 additions & 4 deletions src/audio/aria/aria.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,10 +162,8 @@ static void aria_set_stream_params(struct comp_buffer *buffer,
const struct ipc4_audio_format *audio_fmt = &mod->priv.cfg.base_cfg.audio_fmt;

ipc4_update_buffer_format(buffer, audio_fmt);
#ifdef ARIA_GENERIC
audio_stream_init_alignment_constants(1, 1, &buffer->stream);
#else
audio_stream_init_alignment_constants(8, 1, &buffer->stream);
#ifndef ARIA_GENERIC
audio_stream_set_align(8, 1, &buffer->stream);
#endif
}

Expand Down
3 changes: 0 additions & 3 deletions src/audio/asrc/asrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -550,9 +550,6 @@ static int asrc_prepare(struct processing_module *mod,
sinkb = list_first_item(&dev->bsink_list,
struct comp_buffer, source_list);

audio_stream_init_alignment_constants(1, 1, &sourceb->stream);
audio_stream_init_alignment_constants(1, 1, &sinkb->stream);

/* get source data format and period bytes */
cd->source_format = audio_stream_get_frm_fmt(&sourceb->stream);
source_period_bytes = audio_stream_period_bytes(&sourceb->stream,
Expand Down
59 changes: 57 additions & 2 deletions src/audio/audio_stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,42 @@ static int audio_stream_get_data(struct sof_source *source, size_t req_size,
return 0;
}

static uint32_t audio_stream_frame_align_get(const uint32_t byte_align,
const uint32_t frame_align_req,
uint32_t frame_size)
{
/* Figure out how many frames are needed to meet the byte_align alignment requirements */
uint32_t frame_num = byte_align / gcd(byte_align, frame_size);

/** return the lcm of frame_num and frame_align_req*/
return frame_align_req * frame_num / gcd(frame_num, frame_align_req);
}


void audio_stream_recalc_align(struct audio_stream *stream)
{
const uint32_t byte_align = stream->byte_align_req;
const uint32_t frame_align_req = stream->frame_align_req;
uint32_t process_size;
uint32_t frame_size = audio_stream_frame_bytes(stream);

stream->runtime_stream_params.align_frame_cnt =
audio_stream_frame_align_get(byte_align, frame_align_req, frame_size);
process_size = stream->runtime_stream_params.align_frame_cnt * frame_size;
stream->runtime_stream_params.align_shift_idx =
(is_power_of_2(process_size) ? 31 : 32) - clz(process_size);
}

void audio_stream_set_align(const uint32_t byte_align,
const uint32_t frame_align_req,
struct audio_stream *stream)
{
stream->byte_align_req = byte_align;
stream->frame_align_req = frame_align_req;
audio_stream_recalc_align(stream);
}


static int audio_stream_release_data(struct sof_source *source, size_t free_size)
{
struct audio_stream *audio_stream = container_of(source, struct audio_stream, source_api);
Expand Down Expand Up @@ -103,7 +139,7 @@ static int audio_stream_source_set_alignment_constants(struct sof_source *source
{
struct audio_stream *audio_stream = container_of(source, struct audio_stream, source_api);

audio_stream_init_alignment_constants(byte_align, frame_align_req, audio_stream);
audio_stream_set_align(byte_align, frame_align_req, audio_stream);

return 0;
}
Expand All @@ -114,8 +150,24 @@ static int audio_stream_sink_set_alignment_constants(struct sof_sink *sink,
{
struct audio_stream *audio_stream = container_of(sink, struct audio_stream, sink_api);

audio_stream_init_alignment_constants(byte_align, frame_align_req, audio_stream);
audio_stream_set_align(byte_align, frame_align_req, audio_stream);

return 0;
}

static int source_format_set(struct sof_source *source)
{
struct audio_stream *s = container_of(source, struct audio_stream, source_api);

audio_stream_recalc_align(s);
return 0;
}

static int sink_format_set(struct sof_sink *sink)
{
struct audio_stream *s = container_of(sink, struct audio_stream, sink_api);

audio_stream_recalc_align(s);
return 0;
}

Expand All @@ -124,6 +176,7 @@ static const struct source_ops audio_stream_source_ops = {
.get_data = audio_stream_get_data,
.release_data = audio_stream_release_data,
.audio_set_ipc_params = audio_stream_set_ipc_params_source,
.on_audio_format_set = source_format_set,
.set_alignment_constants = audio_stream_source_set_alignment_constants
};

Expand All @@ -132,6 +185,7 @@ static const struct sink_ops audio_stream_sink_ops = {
.get_buffer = audio_stream_get_buffer,
.commit_buffer = audio_stream_commit_buffer,
.audio_set_ipc_params = audio_stream_set_ipc_params_sink,
.on_audio_format_set = sink_format_set,
.set_alignment_constants = audio_stream_sink_set_alignment_constants
};

Expand All @@ -141,6 +195,7 @@ void audio_stream_init(struct audio_stream *audio_stream, void *buff_addr, uint3
audio_stream->addr = buff_addr;
audio_stream->end_addr = (char *)audio_stream->addr + size;

audio_stream_set_align(1, 1, audio_stream);
source_init(audio_stream_get_source(audio_stream), &audio_stream_source_ops,
&audio_stream->runtime_stream_params);
sink_init(audio_stream_get_sink(audio_stream), &audio_stream_sink_ops,
Expand Down
5 changes: 1 addition & 4 deletions src/audio/crossover/crossover.c
Original file line number Diff line number Diff line change
Expand Up @@ -546,14 +546,11 @@ static int crossover_prepare(struct processing_module *mod,
/* Get source data format */
cd->source_format = audio_stream_get_frm_fmt(&source->stream);
channels = audio_stream_get_channels(&source->stream);
audio_stream_init_alignment_constants(1, 1, &source->stream);

/* Validate frame format and buffer size of sinks */
list_for_item(sink_list, &dev->bsink_list) {
sink = container_of(sink_list, struct comp_buffer, source_list);
if (cd->source_format == audio_stream_get_frm_fmt(&sink->stream)) {
audio_stream_init_alignment_constants(1, 1, &sink->stream);
} else {
if (cd->source_format != audio_stream_get_frm_fmt(&sink->stream)) {
comp_err(dev, "crossover_prepare(): Source fmt %d and sink fmt %d are different.",
cd->source_format, audio_stream_get_frm_fmt(&sink->stream));
ret = -EINVAL;
Expand Down
13 changes: 0 additions & 13 deletions src/audio/dcblock/dcblock.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,17 +183,6 @@ static int dcblock_process(struct processing_module *mod,
return 0;
}

/* init and calculate the aligned setting for available frames and free frames retrieve*/
static inline void dcblock_set_frame_alignment(struct audio_stream *source,
struct audio_stream *sink)
{
const uint32_t byte_align = 1;
const uint32_t frame_align_req = 1;

audio_stream_init_alignment_constants(byte_align, frame_align_req, source);
audio_stream_init_alignment_constants(byte_align, frame_align_req, sink);
}

/**
* \brief Prepares DC Blocking Filter component for processing.
* \param[in,out] dev DC Blocking Filter base component device.
Expand Down Expand Up @@ -221,8 +210,6 @@ static int dcblock_prepare(struct processing_module *mod,
/* get sink data format and period bytes */
cd->sink_format = audio_stream_get_frm_fmt(&sinkb->stream);

dcblock_set_frame_alignment(&sourceb->stream, &sinkb->stream);

dcblock_init_state(cd);
cd->dcblock_func = dcblock_find_func(cd->source_format);
if (!cd->dcblock_func) {
Expand Down
9 changes: 0 additions & 9 deletions src/audio/drc/drc.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,14 +260,6 @@ static int drc_get_config(struct processing_module *mod,
return comp_data_blob_get_cmd(cd->model_handler, cdata, fragment_size);
}

static void drc_set_alignment(struct audio_stream *source,
struct audio_stream *sink)
{
/* Currently no optimizations those would use wider loads and stores */
audio_stream_init_alignment_constants(1, 1, source);
audio_stream_init_alignment_constants(1, 1, sink);
}

static int drc_process(struct processing_module *mod,
struct input_stream_buffer *input_buffers,
int num_input_buffers,
Expand Down Expand Up @@ -344,7 +336,6 @@ static int drc_prepare(struct processing_module *mod,
/* DRC component will only ever have 1 source and 1 sink buffer */
sourceb = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list);
sinkb = list_first_item(&dev->bsink_list, struct comp_buffer, source_list);
drc_set_alignment(&sourceb->stream, &sinkb->stream);

/* get source data format */
cd->source_format = audio_stream_get_frm_fmt(&sourceb->stream);
Expand Down
4 changes: 2 additions & 2 deletions src/audio/eq_fir/eq_fir.c
Original file line number Diff line number Diff line change
Expand Up @@ -402,8 +402,8 @@ static void eq_fir_set_alignment(struct audio_stream *source,
const uint32_t byte_align = 1;
const uint32_t frame_align_req = 2; /* Process multiples of 2 frames */

audio_stream_init_alignment_constants(byte_align, frame_align_req, source);
audio_stream_init_alignment_constants(byte_align, frame_align_req, sink);
audio_stream_set_align(byte_align, frame_align_req, source);
audio_stream_set_align(byte_align, frame_align_req, sink);
}

static int eq_fir_prepare(struct processing_module *mod,
Expand Down
4 changes: 2 additions & 2 deletions src/audio/eq_iir/eq_iir.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,8 @@ static void eq_iir_set_alignment(struct audio_stream *source,
const uint32_t byte_align = 8;
const uint32_t frame_align_req = 2;

audio_stream_init_alignment_constants(byte_align, frame_align_req, source);
audio_stream_init_alignment_constants(byte_align, frame_align_req, sink);
audio_stream_set_align(byte_align, frame_align_req, source);
audio_stream_set_align(byte_align, frame_align_req, sink);
}

static int eq_iir_prepare(struct processing_module *mod,
Expand Down
2 changes: 0 additions & 2 deletions src/audio/google/google_rtc_audio_processing.c
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,6 @@ static int google_rtc_audio_processing_prepare(struct processing_module *mod,
microphone_stream_channels);
}

audio_stream_init_alignment_constants(1, 1, &source->stream);
i++;
}

Expand All @@ -592,7 +591,6 @@ static int google_rtc_audio_processing_prepare(struct processing_module *mod,
return -EINVAL;
}

audio_stream_init_alignment_constants(1, 1, &output->stream);
frame_fmt = audio_stream_get_frm_fmt(&output->stream);
rate = audio_stream_get_rate(&output->stream);
output_stream_channels = audio_stream_get_channels(&output->stream);
Expand Down
4 changes: 0 additions & 4 deletions src/audio/kpb.c
Original file line number Diff line number Diff line change
Expand Up @@ -893,16 +893,12 @@ static int kpb_prepare(struct comp_dev *dev)
*/
if (kpb->ipc4_cfg.base_cfg.ibs != kpb->ipc4_cfg.base_cfg.obs) {
struct list_item *sink_list;
const uint32_t byte_align = 1;
const uint32_t frame_align_req = 1;
uint32_t sink_id;

list_for_item(sink_list, &dev->bsink_list) {
struct comp_buffer *sink =
container_of(sink_list, struct comp_buffer, source_list);

audio_stream_init_alignment_constants(byte_align, frame_align_req,
&sink->stream);
sink_id = buf_get_id(sink);

if (sink_id == 0)
Expand Down
12 changes: 0 additions & 12 deletions src/audio/mfcc/mfcc.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,15 +177,6 @@ static int mfcc_process(struct processing_module *mod,
return 0;
}

static void mfcc_set_alignment(struct audio_stream *source, struct audio_stream *sink)
{
const uint32_t byte_align = 1;
const uint32_t frame_align_req = 1;

audio_stream_init_alignment_constants(byte_align, frame_align_req, source);
audio_stream_init_alignment_constants(byte_align, frame_align_req, sink);
}

static int mfcc_prepare(struct processing_module *mod,
struct sof_source **sources, int num_of_sources,
struct sof_sink **sinks, int num_of_sinks)
Expand All @@ -208,9 +199,6 @@ static int mfcc_prepare(struct processing_module *mod,
/* get source data format */
source_format = audio_stream_get_frm_fmt(&sourceb->stream);

/* set align requirements */
mfcc_set_alignment(&sourceb->stream, &sinkb->stream);

/* get sink data format and period bytes */
sink_format = audio_stream_get_frm_fmt(&sinkb->stream);
sink_period_bytes = audio_stream_period_bytes(&sinkb->stream, dev->frames);
Expand Down
11 changes: 1 addition & 10 deletions src/audio/mixer/mixer.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,17 +205,8 @@ static inline void mixer_set_frame_alignment(struct audio_stream *source)
/*There is no limit for frame number, so set it as 1*/
const uint32_t frame_align_req = 1;

#else

/* Since the generic version process signal sample by sample, so there is no
* limit for it, then set the byte_align and frame_align_req to be 1.
*/
const uint32_t byte_align = 1;
const uint32_t frame_align_req = 1;

audio_stream_set_align(byte_align, frame_align_req, source);
#endif

audio_stream_init_alignment_constants(byte_align, frame_align_req, source);
}

static int mixer_prepare(struct processing_module *mod,
Expand Down
13 changes: 1 addition & 12 deletions src/audio/multiband_drc/multiband_drc.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,14 +310,6 @@ static int multiband_drc_get_config(struct processing_module *mod,
return multiband_drc_get_ipc_config(mod, cdata, fragment_size);
}

static void multiband_drc_set_alignment(struct audio_stream *source,
struct audio_stream *sink)
{
/* Currently no optimizations those would use wider loads and stores */
audio_stream_init_alignment_constants(1, 1, source);
audio_stream_init_alignment_constants(1, 1, sink);
}

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,
Expand Down Expand Up @@ -356,7 +348,7 @@ 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, *sinkb;
struct comp_buffer *sourceb;
int channels;
int rate;
int ret = 0;
Expand All @@ -369,9 +361,6 @@ static int multiband_drc_prepare(struct processing_module *mod,

/* DRC component will only ever have 1 source and 1 sink buffer */
sourceb = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list);
sinkb = list_first_item(&dev->bsink_list, struct comp_buffer, source_list);

multiband_drc_set_alignment(&sourceb->stream, &sinkb->stream);

/* get source data format */
cd->source_format = audio_stream_get_frm_fmt(&sourceb->stream);
Expand Down
21 changes: 0 additions & 21 deletions src/audio/mux/mux.c
Original file line number Diff line number Diff line change
Expand Up @@ -378,12 +378,8 @@ static int mux_prepare(struct processing_module *mod,
{
struct comp_dev *dev = mod->dev;
struct comp_data *cd = module_get_private_data(mod);
struct list_item *blist;
struct comp_buffer *source;
struct comp_buffer *sink;
struct sof_mux_config *config;
size_t blob_size;
int state;
int ret;

comp_dbg(dev, "mux_prepare()");
Expand All @@ -410,23 +406,6 @@ static int mux_prepare(struct processing_module *mod,
return -EINVAL;
}

/* check each mux source state, set source align to 1 byte, 1 frame */
list_for_item(blist, &dev->bsource_list) {
source = container_of(blist, struct comp_buffer, sink_list);
state = source->source->state;
audio_stream_init_alignment_constants(1, 1, &source->stream);

/* only prepare downstream if we have no active sources */
if (state == COMP_STATE_PAUSED || state == COMP_STATE_ACTIVE)
return PPL_STATUS_PATH_STOP;
}

/* set sink align to 1 byte, 1 frame */
list_for_item(blist, &dev->bsink_list) {
sink = container_of(blist, struct comp_buffer, source_list);
audio_stream_init_alignment_constants(1, 1, &sink->stream);
}

/* prepare downstream */
return 0;
}
Expand Down
6 changes: 0 additions & 6 deletions src/audio/mux/mux_ipc4.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,6 @@ static void set_mux_params(struct processing_module *mod)
struct comp_buffer *sink, *source;
struct list_item *source_list;
int j;
const uint32_t byte_align = 1;
const uint32_t frame_align_req = 1;

params->direction = dev->direction;
params->channels = cd->md.base_cfg.audio_fmt.channels_count;
Expand All @@ -101,8 +99,6 @@ static void set_mux_params(struct processing_module *mod)
/* update sink format */
if (!list_is_empty(&dev->bsink_list)) {
sink = list_first_item(&dev->bsink_list, struct comp_buffer, source_list);
audio_stream_init_alignment_constants(byte_align, frame_align_req,
&sink->stream);

if (!sink->hw_params_configured) {
ipc4_update_buffer_format(sink, &cd->md.output_format);
Expand All @@ -117,8 +113,6 @@ static void set_mux_params(struct processing_module *mod)
list_for_item(source_list, &dev->bsource_list)
{
source = container_of(source_list, struct comp_buffer, sink_list);
audio_stream_init_alignment_constants(byte_align, frame_align_req,
&source->stream);
j = buf_get_id(source);
cd->config.streams[j].pipeline_id = source->pipeline_id;
if (j == BASE_CFG_QUEUED_ID)
Expand Down
4 changes: 2 additions & 2 deletions src/audio/selector/selector.c
Original file line number Diff line number Diff line change
Expand Up @@ -847,8 +847,8 @@ static int selector_prepare(struct processing_module *mod,
sourceb = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list);
sinkb = list_first_item(&dev->bsink_list, struct comp_buffer, source_list);

audio_stream_init_alignment_constants(4, 1, &sourceb->stream);
audio_stream_init_alignment_constants(4, 1, &sinkb->stream);
audio_stream_set_align(4, 1, &sourceb->stream);
audio_stream_set_align(4, 1, &sinkb->stream);

/* get source data format and period bytes */
cd->source_format = audio_stream_get_frm_fmt(&sourceb->stream);
Expand Down
Loading
Loading