Skip to content

Commit

Permalink
manual change xsink
Browse files Browse the repository at this point in the history
  • Loading branch information
marcinszkudlinski committed Sep 12, 2024
1 parent 027a4cc commit 04ff3cb
Show file tree
Hide file tree
Showing 12 changed files with 85 additions and 69 deletions.
18 changes: 11 additions & 7 deletions src/audio/mixer/mixer.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,15 +163,15 @@ static int mixer_reset(struct processing_module *mod)
{
struct mixer_data *md = module_get_private_data(mod);
struct comp_dev *dev = mod->dev;
struct list_item *blist;
int dir = dev->pipeline->source_comp->direction;

comp_dbg(dev, "mixer_reset()");

if (dir == SOF_IPC_STREAM_PLAYBACK) {
list_for_item(blist, &dev->bsource_list) {
struct comp_buffer *source = comp_dev_get_first_data_producer(dev);

while(source) {
/* FIXME: this is racy and implicitly protected by serialised IPCs */
struct comp_buffer *source = container_of(blist, struct comp_buffer, Xsink_list);
bool stop = false;

if (source->Xsource && source->Xsource->state > COMP_STATE_READY)
Expand All @@ -181,6 +181,8 @@ static int mixer_reset(struct processing_module *mod)
if (stop)
/* should not reset the downstream components */
return PPL_STATUS_PATH_STOP;

source = comp_dev_get_next_data_producer(dev, source);
}
}

Expand Down Expand Up @@ -213,15 +215,15 @@ static int mixer_prepare(struct processing_module *mod,
struct mixer_data *md = module_get_private_data(mod);
struct comp_dev *dev = mod->dev;
struct comp_buffer *sink;
struct list_item *blist;

sink = comp_dev_get_first_data_consumer(dev);
md->mix_func = mixer_get_processing_function(dev, sink);
mixer_set_frame_alignment(&sink->stream);

/* check each mixer source state */
list_for_item(blist, &dev->bsource_list) {
struct comp_buffer *source;
struct comp_buffer *source = comp_dev_get_first_data_producer(dev);

while(source) {
bool stop;

/*
Expand All @@ -232,14 +234,16 @@ static int mixer_prepare(struct processing_module *mod,
* preparing the mixer, so they shouldn't touch it until we're
* done.
*/
source = container_of(blist, struct comp_buffer, Xsink_list);
mixer_set_frame_alignment(&source->stream);
stop = source->Xsource && (source->Xsource->state == COMP_STATE_PAUSED ||
source->Xsource->state == COMP_STATE_ACTIVE);

/* only prepare downstream if we have no active sources */
if (stop)
return PPL_STATUS_PATH_STOP;


source = comp_dev_get_next_data_producer(dev, source);
}

/* prepare downstream */
Expand Down
29 changes: 14 additions & 15 deletions src/audio/module_adapter/module_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ int module_adapter_prepare(struct comp_dev *dev)
}
} else {
list_for_item(blist, &mod->sink_buffer_list) {
struct comp_buffer *buffer = container_of(blist, struct comp_buffer, Xsink_list);
struct comp_buffer *buffer = container_of(blist, struct comp_buffer, Xsink_list); //msz ???

ret = buffer_set_size(buffer, buff_size, 0);
if (ret < 0) {
Expand All @@ -410,7 +410,7 @@ int module_adapter_prepare(struct comp_dev *dev)

free:
list_for_item_safe(blist, _blist, &mod->sink_buffer_list) {
struct comp_buffer *buffer = container_of(blist, struct comp_buffer, Xsink_list);
struct comp_buffer *buffer = container_of(blist, struct comp_buffer, Xsink_list); //msz ??
uint32_t flags;

irq_local_disable(flags);
Expand Down Expand Up @@ -609,7 +609,7 @@ static void module_adapter_process_output(struct comp_dev *dev)
if (mod->output_buffers[i].size > 0) {
struct comp_buffer *buffer;

buffer = container_of(blist, struct comp_buffer, Xsink_list);
buffer = container_of(blist, struct comp_buffer, Xsink_list); //msz

ca_copy_from_module_to_sink(&buffer->stream, mod->output_buffers[i].data,
mod->output_buffers[i].size);
Expand All @@ -629,7 +629,7 @@ static void module_adapter_process_output(struct comp_dev *dev)
struct comp_buffer *source;

sink = container_of(blist, struct comp_buffer, Xsource_list); //msz ???
source = container_of(_blist, struct comp_buffer, Xsink_list);
source = container_of(_blist, struct comp_buffer, Xsink_list); //msz

module_copy_samples(dev, source, sink,
mod->output_buffers[i].size);
Expand Down Expand Up @@ -808,13 +808,11 @@ static int module_adapter_audio_stream_type_copy(struct comp_dev *dev)
}

i = 0;
struct list_item *blist;

list_for_item(blist, &dev->bsource_list) {
struct comp_buffer *source;

source = container_of(blist, struct comp_buffer, Xsink_list);
struct comp_buffer *source = comp_dev_get_first_data_producer(dev);
while(source) {
sources[i++] = source;

source = comp_dev_get_next_data_producer(dev, source);
}
num_input_buffers = i;
if (num_input_buffers > mod->max_sources) {
Expand Down Expand Up @@ -911,21 +909,22 @@ static int module_adapter_copy_ring_buffers(struct comp_dev *dev)
* This is an adapter, to be removed when pipeline2.0 is ready
*/
struct comp_buffer *buffer;
struct list_item *blist;
struct processing_module *mod = comp_mod(dev);
int err;

list_for_item(blist, &dev->bsource_list) {
buffer = comp_dev_get_first_data_producer(dev);
while(buffer) {
/* input - we need to copy data from audio_stream (as source)
* to ring_buffer (as sink)
*/
buffer = container_of(blist, struct comp_buffer, Xsink_list);
err = audio_buffer_sync_secondary_buffer(&buffer->audio_buffer, UINT_MAX);

if (err) {
comp_err(dev, "LL to DP copy error status: %d", err);
return err;
}

buffer = comp_dev_get_next_data_producer(dev, buffer);
}

if (mod->dp_startup_delay)
Expand Down Expand Up @@ -1182,7 +1181,7 @@ int module_adapter_reset(struct comp_dev *dev)
mod->total_data_produced = 0;

list_for_item(blist, &mod->sink_buffer_list) {
struct comp_buffer *buffer = container_of(blist, struct comp_buffer, Xsink_list);
struct comp_buffer *buffer = container_of(blist, struct comp_buffer, Xsink_list); //msz???
buffer_zero(buffer);
}

Expand All @@ -1208,7 +1207,7 @@ void module_adapter_free(struct comp_dev *dev)
comp_err(dev, "module_adapter_free(): failed with error: %d", ret);

list_for_item_safe(blist, _blist, &mod->sink_buffer_list) {
struct comp_buffer *buffer = container_of(blist, struct comp_buffer, Xsink_list);
struct comp_buffer *buffer = container_of(blist, struct comp_buffer, Xsink_list); //msz
uint32_t flags;

irq_local_disable(flags);
Expand Down
20 changes: 10 additions & 10 deletions src/audio/module_adapter/module_adapter_ipc3.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,22 +131,23 @@ void module_adapter_set_params(struct processing_module *mod, struct sof_ipc_str

static int module_source_status_count(struct comp_dev *dev, uint32_t status)
{
struct list_item *blist;
int count = 0;

/* count source with state == status */
list_for_item(blist, &dev->bsource_list) {
struct comp_buffer *source = comp_dev_get_first_data_producer(dev);

while(source) {
/*
* FIXME: this is racy, state can be changed by another core.
* This is implicitly protected by serialised IPCs. Even when
* IPCs are processed in the pipeline thread, the next IPC will
* not be sent until the thread has processed and replied to the
* current one.
*/
struct comp_buffer *source = container_of(blist, struct comp_buffer, Xsink_list);

if (source->Xsource && source->Xsource->state == status)
count++;

source = comp_dev_get_next_data_producer(dev, source);
}

return count;
Expand Down Expand Up @@ -335,15 +336,14 @@ int module_adapter_sink_src_prepare(struct comp_dev *dev)
}
mod->num_of_sinks = i;

i = 0;
struct list_item *blist;

list_for_item(blist, &dev->bsource_list) {
struct comp_buffer *source_buffer =
container_of(blist, struct comp_buffer, Xsink_list);
struct comp_buffer *source_buffer = comp_dev_get_first_data_producer(dev);

i = 0;
while(source_buffer) {
mod->sources[i] = audio_buffer_get_source(&source_buffer->audio_buffer);
i++;

source_buffer = comp_dev_get_next_data_producer(dev, source_buffer);
}
mod->num_of_sources = i;

Expand Down
9 changes: 5 additions & 4 deletions src/audio/module_adapter/module_adapter_ipc4.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,6 @@ EXPORT_SYMBOL(module_adapter_get_attribute);
static bool module_adapter_multi_sink_source_prepare(struct comp_dev *dev)
{
struct processing_module *mod = comp_mod(dev);
struct list_item *blist;
int i;

/* acquire all sink and source buffers, get handlers to sink/source API */
Expand All @@ -202,13 +201,15 @@ static bool module_adapter_multi_sink_source_prepare(struct comp_dev *dev)
}
mod->num_of_sinks = i;


i = 0;
list_for_item(blist, &dev->bsource_list) {
struct comp_buffer *source_buffer =
container_of(blist, struct comp_buffer, Xsink_list);
struct comp_buffer *source_buffer = comp_dev_get_first_data_producer(dev);

while(source_buffer) {
mod->sources[i] = audio_buffer_get_source(&source_buffer->audio_buffer);
i++;

source_buffer = comp_dev_get_next_data_producer(dev, source_buffer);
}
mod->num_of_sources = i;

Expand Down
20 changes: 12 additions & 8 deletions src/audio/mux/mux.c
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,6 @@ static int mux_process(struct processing_module *mod,
struct comp_data *cd = module_get_private_data(mod);
struct comp_dev *dev = mod->dev;
struct comp_buffer *source;
struct list_item *clist;
const struct audio_stream *sources_stream[MUX_MAX_STREAMS] = { NULL };
int frames = 0;
int sink_bytes;
Expand All @@ -303,8 +302,8 @@ static int mux_process(struct processing_module *mod,

/* align source streams with their respective configurations */
j = 0;
list_for_item(clist, &dev->bsource_list) {
source = container_of(clist, struct comp_buffer, Xsink_list);
source = comp_dev_get_first_data_producer(dev);
while(source) {
if (source->Xsource->state == dev->state) {
if (frames)
frames = MIN(frames, input_buffers[j].size);
Expand All @@ -320,6 +319,8 @@ static int mux_process(struct processing_module *mod,
sources_stream[i] = &source->stream;
}
j++;

source = comp_dev_get_next_data_producer(dev, source);
}

/* check if there are any sources active */
Expand All @@ -335,34 +336,37 @@ static int mux_process(struct processing_module *mod,

/* Update consumed and produced */
j = 0;
list_for_item(clist, &dev->bsource_list) {
source = container_of(clist, struct comp_buffer, Xsink_list);
source = comp_dev_get_first_data_producer(dev);
while(source) {
if (source->Xsource->state == dev->state)
mod->input_buffers[j].consumed = source_bytes;
j++;

source = comp_dev_get_next_data_producer(dev, source);
}
mod->output_buffers[0].size = sink_bytes;
return 0;
}

static int mux_reset(struct processing_module *mod)
{
struct list_item *blist;
struct comp_data *cd = module_get_private_data(mod);
struct comp_dev *dev = mod->dev;
int dir = dev->pipeline->source_comp->direction;

comp_dbg(dev, "mux_reset()");

if (dir == SOF_IPC_STREAM_PLAYBACK) {
list_for_item(blist, &dev->bsource_list) {
struct comp_buffer *source = container_of(blist, struct comp_buffer, Xsink_list);
struct comp_buffer *source = comp_dev_get_first_data_producer(dev);
while(source) {
int state = source->Xsource->state;

/* only mux the sources with the same state with mux */
if (state > COMP_STATE_READY)
/* should not reset the downstream components */
return PPL_STATUS_PATH_STOP;

source = comp_dev_get_next_data_producer(dev, source);
}
}

Expand Down
8 changes: 4 additions & 4 deletions src/audio/mux/mux_ipc4.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ static void set_mux_params(struct processing_module *mod)
struct comp_data *cd = module_get_private_data(mod);
struct comp_dev *dev = mod->dev;
struct comp_buffer *sink, *source;
struct list_item *source_list;
int j;

params->direction = dev->direction;
Expand Down Expand Up @@ -106,9 +105,8 @@ static void set_mux_params(struct processing_module *mod)
if (!list_is_empty(&dev->bsource_list)) {
struct ipc4_audio_format *audio_fmt;

list_for_item(source_list, &dev->bsource_list)
{
source = container_of(source_list, struct comp_buffer, Xsink_list);
source = comp_dev_get_first_data_producer(dev);
while(source) {
j = buf_get_id(source);
cd->config.streams[j].pipeline_id = buffer_pipeline_id(source);
if (j == BASE_CFG_QUEUED_ID)
Expand All @@ -117,6 +115,8 @@ static void set_mux_params(struct processing_module *mod)
audio_fmt = &cd->md.reference_format;

ipc4_update_buffer_format(source, audio_fmt);

source = comp_dev_get_next_data_producer(dev, source);
}
}

Expand Down
8 changes: 4 additions & 4 deletions src/audio/smart_amp/smart_amp.c
Original file line number Diff line number Diff line change
Expand Up @@ -731,7 +731,6 @@ static int smart_amp_resolve_mod_fmt(struct comp_dev *dev, uint32_t least_req_de
static int smart_amp_prepare(struct comp_dev *dev)
{
struct smart_amp_data *sad = comp_get_drvdata(dev);
struct list_item *blist;
uint16_t ff_src_fmt, fb_src_fmt, resolved_mod_fmt;
uint32_t least_req_depth;
uint32_t rate;
Expand All @@ -744,13 +743,14 @@ static int smart_amp_prepare(struct comp_dev *dev)
return ret;

/* searching for stream and feedback source buffers */
list_for_item(blist, &dev->bsource_list) {
struct comp_buffer *source_buffer = container_of(blist, struct comp_buffer, Xsink_list);

struct comp_buffer *source_buffer = comp_dev_get_first_data_producer(dev);
while(source_buffer) {
if (source_buffer->Xsource->ipc_config.type == SOF_COMP_DEMUX)
sad->feedback_buf = source_buffer;
else
sad->source_buf = source_buffer;

source_buffer = comp_dev_get_next_data_producer(dev, source_buffer);
}

/* sink buffer */
Expand Down
2 changes: 1 addition & 1 deletion src/ipc/ipc-helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ int ipc_comp_free(struct ipc *ipc, uint32_t comp_id)

irq_local_disable(flags);
list_for_item_safe(clist, tmp, &icd->cd->bsource_list) {
struct comp_buffer *buffer = container_of(clist, struct comp_buffer, Xsink_list);
struct comp_buffer *buffer = container_of(clist, struct comp_buffer, Xsink_list); //msz ??

buffer->Xsink = NULL;
/* Also if it isn't shared - we are about to modify uncached data */
Expand Down
Loading

0 comments on commit 04ff3cb

Please sign in to comment.