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

Pipeline2.0: low hanging fruits - move buffers' common params to struct sof_audio_buffer. #9499

Merged
merged 5 commits into from
Sep 27, 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
7 changes: 3 additions & 4 deletions src/audio/buffers/comp_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,6 @@ static struct comp_buffer *buffer_alloc_struct(void *stream_addr, size_t size, u
return NULL;
}

buffer->is_shared = is_shared;
buffer->caps = caps;

audio_buffer_init(&buffer->audio_buffer, BUFFER_TYPE_LEGACY_BUFFER, is_shared,
Expand Down Expand Up @@ -430,7 +429,7 @@ int buffer_set_params(struct comp_buffer *buffer,
return -EINVAL;
}

if (buffer->hw_params_configured && !force_update)
if (audio_buffer_hw_params_configured(&buffer->audio_buffer) && !force_update)
return 0;

ret = audio_stream_set_params(&buffer->stream, params);
Expand All @@ -441,9 +440,9 @@ int buffer_set_params(struct comp_buffer *buffer,

audio_stream_set_buffer_fmt(&buffer->stream, params->buffer_fmt);
for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++)
buffer->chmap[i] = params->chmap[i];
audio_buffer_set_chmap(&buffer->audio_buffer, i, params->chmap[i]);

buffer->hw_params_configured = true;
audio_buffer_set_hw_params_configured(&buffer->audio_buffer);

return 0;
}
Expand Down
19 changes: 9 additions & 10 deletions src/audio/buffers/ring_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,12 @@ static void ring_buffer_free(struct sof_audio_buffer *buffer)
}

/**
* @brief return true if the queue is shared between 2 cores
* @brief return true if the ring buffer is shared between 2 cores
*/
static inline
bool ring_buffer_is_shared(struct ring_buffer *ring_buffer)
{
return !!(ring_buffer->_flags & RING_BUFFER_MODE_SHARED);
return audio_buffer_is_shared(&ring_buffer->audio_buffer);
}

static inline uint8_t __sparse_cache *ring_buffer_buffer_end(struct ring_buffer *ring_buffer)
Expand Down Expand Up @@ -224,7 +224,8 @@ static int ring_buffer_set_ipc_params(struct ring_buffer *ring_buffer,
bool force_update)
{
CORE_CHECK_STRUCT(&ring_buffer->audio_buffer);
if (ring_buffer->_hw_params_configured && !force_update)

if (audio_buffer_hw_params_configured(&ring_buffer->audio_buffer) && !force_update)
return 0;

struct sof_audio_stream_params *audio_stream_params =
Expand All @@ -235,7 +236,7 @@ static int ring_buffer_set_ipc_params(struct ring_buffer *ring_buffer,
audio_stream_params->channels = params->channels;
audio_stream_params->buffer_fmt = params->buffer_fmt;

ring_buffer->_hw_params_configured = true;
audio_buffer_set_hw_params_configured(&ring_buffer->audio_buffer);

return 0;
}
Expand Down Expand Up @@ -278,13 +279,13 @@ static const struct audio_buffer_ops audio_buffer_ops = {
.free = ring_buffer_free,
};

struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_space, uint32_t flags,
struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_space, bool is_shared,
uint32_t id)
{
struct ring_buffer *ring_buffer;

/* allocate ring_buffer structure */
if (flags & RING_BUFFER_MODE_SHARED)
if (is_shared)
ring_buffer = rzalloc(SOF_MEM_ZONE_RUNTIME_SHARED, 0, SOF_MEM_CAPS_RAM,
sizeof(*ring_buffer));
else
Expand All @@ -293,17 +294,15 @@ struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_spa
if (!ring_buffer)
return NULL;

ring_buffer->_flags = flags;

/* init base structure. The audio_stream_params is NULL because ring_buffer
* is currently used as a secondary buffer for DP only
*
* pointer in audio_buffer will be overwritten when attaching ring_buffer as a
* secondary buffer
*/
audio_buffer_init(&ring_buffer->audio_buffer, BUFFER_TYPE_RING_BUFFER,
flags & RING_BUFFER_MODE_SHARED, &ring_buffer_source_ops,
&ring_buffer_sink_ops, &audio_buffer_ops, NULL);
is_shared, &ring_buffer_source_ops, &ring_buffer_sink_ops,
&audio_buffer_ops, NULL);

/* set obs/ibs in sink/source interfaces */
sink_set_min_free_space(audio_buffer_get_sink(&ring_buffer->audio_buffer),
Expand Down
3 changes: 2 additions & 1 deletion src/audio/copier/copier.c
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,8 @@ static int do_conversion_copy(struct comp_dev *dev,
int i;

/* buffer params might be not yet configured by component on another pipeline */
if (!src->hw_params_configured || !sink->hw_params_configured)
if (!audio_buffer_hw_params_configured(&src->audio_buffer) ||
!audio_buffer_hw_params_configured(&sink->audio_buffer))
return 0;

comp_get_copy_limits(src, sink, processed_data);
Expand Down
3 changes: 2 additions & 1 deletion src/audio/copier/copier_dai.c
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,8 @@ int copier_dai_params(struct copier_data *cd, struct comp_dev *dev,
return ret;

for (j = 0; j < SOF_IPC_MAX_CHANNELS; j++)
cd->dd[dai_index]->dma_buffer->chmap[j] = (cd->chan_map[dai_index] >> j * 4) & 0xf;
audio_buffer_set_chmap(&cd->dd[dai_index]->dma_buffer->audio_buffer,
j, (cd->chan_map[dai_index] >> j * 4) & 0xf);

/* set channel copy func */
container_size = audio_stream_sample_bytes(&cd->multi_endpoint_buffer->stream);
Expand Down
4 changes: 2 additions & 2 deletions src/audio/copier/copier_generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,9 +192,9 @@ int create_endpoint_buffer(struct comp_dev *dev,
copier_cfg->base.audio_fmt.interleaving_style);

for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++)
buffer->chmap[i] = (chan_map >> i * 4) & 0xf;
audio_buffer_set_chmap(&buffer->audio_buffer, i, (chan_map >> i * 4) & 0xf);

buffer->hw_params_configured = true;
audio_buffer_set_hw_params_configured(&buffer->audio_buffer);

if (create_multi_endpoint_buffer)
cd->multi_endpoint_buffer = buffer;
Expand Down
11 changes: 6 additions & 5 deletions src/audio/dai-zephyr.c
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ dai_dma_cb(struct dai_data *dd, struct comp_dev *dev, uint32_t bytes,
}

if (sink_dev && sink_dev->state == COMP_STATE_ACTIVE &&
sink->hw_params_configured) {
audio_buffer_hw_params_configured(&sink->audio_buffer)) {
ret = stream_copy_from_no_consume(dd->local_buffer, sink,
converter[j], bytes, dd->chmap);
}
Expand Down Expand Up @@ -353,7 +353,7 @@ dai_dma_cb(struct dai_data *dd, struct comp_dev *dev, uint32_t bytes,
}

if (sink_dev && sink_dev->state == COMP_STATE_ACTIVE &&
sink->hw_params_configured)
audio_buffer_hw_params_configured(&sink->audio_buffer))
ret = stream_copy_from_no_consume(dd->dma_buffer,
sink, converter[j],
bytes, dd->chmap);
Expand Down Expand Up @@ -426,7 +426,8 @@ dai_dma_multi_endpoint_cb(struct dai_data *dd, struct comp_dev *dev, uint32_t fr

/* copy all channels one by one */
for (i = 0; i < audio_stream_get_channels(&dd->dma_buffer->stream); i++) {
uint32_t multi_buf_channel = dd->dma_buffer->chmap[i];
uint32_t multi_buf_channel = audio_buffer_get_chmap(&dd->dma_buffer->audio_buffer,
i);

if (dev->direction == SOF_IPC_STREAM_PLAYBACK)
dd->channel_copy(&multi_endpoint_buffer->stream, multi_buf_channel,
Expand Down Expand Up @@ -1650,7 +1651,7 @@ int dai_common_copy(struct dai_data *dd, struct comp_dev *dev, pcm_converter_fun
sink_dev = sink->sink;

if (sink_dev && sink_dev->state == COMP_STATE_ACTIVE &&
sink->hw_params_configured) {
audio_buffer_hw_params_configured(&sink->audio_buffer)) {
sink_frames =
audio_stream_get_free_frames(&sink->stream);
frames = MIN(frames, sink_frames);
Expand Down Expand Up @@ -1680,7 +1681,7 @@ int dai_common_copy(struct dai_data *dd, struct comp_dev *dev, pcm_converter_fun
sink_dev = sink->sink;

if (sink_dev && sink_dev->state == COMP_STATE_ACTIVE &&
sink->hw_params_configured) {
audio_buffer_hw_params_configured(&sink->audio_buffer)) {
sink_frames =
audio_stream_get_free_frames(&sink->stream);
frames = MIN(frames, sink_frames);
Expand Down
2 changes: 1 addition & 1 deletion src/audio/google/google_rtc_audio_processing.c
Original file line number Diff line number Diff line change
Expand Up @@ -751,7 +751,7 @@ static int trigger_handler(struct processing_module *mod, int cmd)
/* Ignore and halt propagation if we get a trigger from the
* playback pipeline: not for us. (Never happens on IPC4)
*/
if (cd->ref_comp_buffer->walking)
if (cd->ref_comp_buffer->audio_buffer.walking)
return PPL_STATUS_PATH_STOP;
#endif

Expand Down
2 changes: 1 addition & 1 deletion src/audio/mux/mux_ipc4.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ static void set_mux_params(struct processing_module *mod)
if (!list_is_empty(&dev->bsink_list)) {
sink = comp_dev_get_first_data_consumer(dev);

if (!sink->hw_params_configured) {
if (!audio_buffer_hw_params_configured(&sink->audio_buffer)) {
ipc4_update_buffer_format(sink, &cd->md.output_format);
params->frame_fmt = audio_stream_get_frm_fmt(&sink->stream);
}
Expand Down
6 changes: 3 additions & 3 deletions src/audio/pipeline/pipeline-graph.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ int pipeline_for_each_comp(struct comp_dev *current,
* across CPUs. See further comment below.
*/
dcache_writeback_invalidate_region(uncache_to_cache(buffer), sizeof(*buffer));
if (buffer->walking)
if (buffer->audio_buffer.walking)
continue;

buffer_comp = buffer_get_comp(buffer, dir);
Expand All @@ -428,12 +428,12 @@ int pipeline_for_each_comp(struct comp_dev *current,
if (buffer_comp &&
(!ctx->skip_incomplete || buffer_comp->pipeline) &&
ctx->comp_func) {
buffer->walking = true;
buffer->audio_buffer.walking = true;

err = ctx->comp_func(buffer_comp, buffer,
ctx, dir);

buffer->walking = false;
buffer->audio_buffer.walking = false;
}

if (err < 0 || err == PPL_STATUS_PATH_STOP)
Expand Down
2 changes: 1 addition & 1 deletion src/audio/pipeline/pipeline-params.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ static void pipeline_update_buffer_pcm_params(struct comp_buffer *buffer,
params->rate = audio_stream_get_rate(&buffer->stream);
params->channels = audio_stream_get_channels(&buffer->stream);
for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++)
params->chmap[i] = buffer->chmap[i];
params->chmap[i] = audio_buffer_get_chmap(&buffer->audio_buffer, i);
}

/* fetch hardware stream parameters from DAI */
Expand Down
2 changes: 1 addition & 1 deletion src/audio/selector/selector.c
Original file line number Diff line number Diff line change
Expand Up @@ -669,7 +669,7 @@ static void set_selector_params(struct processing_module *mod,
*/
src_buf = comp_dev_get_first_data_producer(dev);

if (!src_buf->hw_params_configured)
if (!audio_buffer_hw_params_configured(&src_buf->audio_buffer))
ipc4_update_buffer_format(src_buf, &mod->priv.cfg.base_cfg.audio_fmt);
}

Expand Down
3 changes: 0 additions & 3 deletions src/include/ipc/stream.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,6 @@
/*
* Stream configuration.
*/

#define SOF_IPC_MAX_CHANNELS 8

/* common sample rates for use in masks */
#define SOF_RATE_8000 (1 << 0) /**< 8000Hz */
#define SOF_RATE_11025 (1 << 1) /**< 11025Hz */
Expand Down
4 changes: 4 additions & 0 deletions src/include/module/audio/audio_stream.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ struct sof_audio_stream_params {
bool underrun_permitted; /**< indicates whether underrun is permitted */

uint32_t buffer_fmt; /**< enum sof_ipc_buffer_format */

uint16_t chmap[SOF_IPC_MAX_CHANNELS]; /**< channel map - SOF_CHMAP_ */

bool hw_params_configured; /**< indicates whether hw params were set */
};

#endif /* __MODULE_AUDIO_AUDIO_STREAM_H__ */
2 changes: 2 additions & 0 deletions src/include/module/ipc/stream.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#ifndef __MODULE_IPC_STREAM_H__
#define __MODULE_IPC_STREAM_H__

#define SOF_IPC_MAX_CHANNELS 8

/* stream PCM frame format */
enum sof_ipc_frame {
SOF_IPC_FRAME_S16_LE = 0,
Expand Down
40 changes: 40 additions & 0 deletions src/include/sof/audio/audio_buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ struct sof_audio_buffer {
/* type of the buffer BUFFER_TYPE_* */
uint32_t buffer_type;

bool is_shared; /* buffer structure is shared between 2 cores */

#if CONFIG_PIPELINE_2_0
/**
* sink API of an additional buffer
Expand Down Expand Up @@ -69,6 +71,12 @@ struct sof_audio_buffer {

/* virtual methods */
const struct audio_buffer_ops *ops;

/*
* legacy params, needed for pipeline binding/iterating, not for data buffering
* should not be in struct sof_audio_buffer at all, kept for pipeline2.0 transition
*/
bool walking; /**< indicates if the buffer is being walked */
};

#if CONFIG_PIPELINE_2_0
Expand Down Expand Up @@ -166,6 +174,37 @@ struct sof_source *audio_buffer_get_source(struct sof_audio_buffer *buffer)

#endif /* CONFIG_PIPELINE_2_0 */

static inline bool audio_buffer_is_shared(struct sof_audio_buffer *buffer)
{
return buffer->is_shared;
}

static inline bool audio_buffer_hw_params_configured(struct sof_audio_buffer *buffer)
{
return buffer->audio_stream_params->hw_params_configured;
}

static inline void audio_buffer_set_hw_params_configured(struct sof_audio_buffer *buffer)
{
buffer->audio_stream_params->hw_params_configured = true;
}

static inline void audio_buffer_reset_params(struct sof_audio_buffer *buffer)
{
buffer->audio_stream_params->hw_params_configured = false;
}

static inline uint16_t audio_buffer_get_chmap(struct sof_audio_buffer *buffer, size_t index)
{
return buffer->audio_stream_params->chmap[index];
}

static inline void audio_buffer_set_chmap(struct sof_audio_buffer *buffer, size_t index,
uint16_t value)
{
buffer->audio_stream_params->chmap[index] = value;
}

/**
* @brief return a handler to stream params structure
*/
Expand Down Expand Up @@ -216,6 +255,7 @@ void audio_buffer_init(struct sof_audio_buffer *buffer, uint32_t buffer_type, bo
buffer->buffer_type = buffer_type;
buffer->ops = audio_buffer_ops;
buffer->audio_stream_params = audio_stream_params;
buffer->is_shared = is_shared;
source_init(audio_buffer_get_source(buffer), source_ops,
audio_buffer_get_stream_params(buffer));
sink_init(audio_buffer_get_sink(buffer), sink_ops,
Expand Down
13 changes: 3 additions & 10 deletions src/include/sof/audio/buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,6 @@ struct comp_buffer {
uint32_t caps;
uint32_t core;
struct tr_ctx tctx; /* trace settings */
bool is_shared; /* buffer structure is shared between 2 cores */

/* connected components */
struct comp_dev *source; /* source component */
Expand All @@ -142,12 +141,6 @@ struct comp_buffer {
/* lists */
struct list_item source_list; /* list in comp buffers */
struct list_item sink_list; /* list in comp buffers */

/* runtime stream params */
uint16_t chmap[SOF_IPC_MAX_CHANNELS]; /**< channel map - SOF_CHMAP_ */

bool hw_params_configured; /**< indicates whether hw params were set */
bool walking; /**< indicates if the buffer is being walked */
};

/* Only to be used for synchronous same-core notifications! */
Expand Down Expand Up @@ -227,15 +220,15 @@ bool buffer_params_match(struct comp_buffer *buffer,
static inline void buffer_stream_invalidate(struct comp_buffer *buffer, uint32_t bytes)
{
#if CONFIG_INCOHERENT
if (buffer->is_shared)
if (audio_buffer_is_shared(&buffer->audio_buffer))
audio_stream_invalidate(&buffer->stream, bytes);
#endif
}

static inline void buffer_stream_writeback(struct comp_buffer *buffer, uint32_t bytes)
{
#if CONFIG_INCOHERENT
if (buffer->is_shared)
if (audio_buffer_is_shared(&buffer->audio_buffer))
audio_stream_writeback(&buffer->stream, bytes);
#endif
}
Expand Down Expand Up @@ -286,7 +279,7 @@ static inline void buffer_init_stream(struct comp_buffer *buffer, size_t size)

static inline void buffer_reset_params(struct comp_buffer *buffer, void *data)
{
buffer->hw_params_configured = false;
audio_buffer_reset_params(&buffer->audio_buffer);
}

#endif /* __SOF_AUDIO_BUFFER_H__ */
Loading