From 2d92b98277ac7693a98067e7695a9948142b4f4d Mon Sep 17 00:00:00 2001 From: Marcin Szkudlinski Date: Thu, 19 Sep 2024 11:20:47 +0200 Subject: [PATCH 1/5] buf: grammar fixes in comments a first / the first procedure / function Signed-off-by: Marcin Szkudlinski --- src/include/sof/audio/component.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/include/sof/audio/component.h b/src/include/sof/audio/component.h index 1463da2e2c61..692c55572ad4 100644 --- a/src/include/sof/audio/component.h +++ b/src/include/sof/audio/component.h @@ -635,8 +635,8 @@ struct comp_dev { }; /** - * Get a pointer to a first comp_buffer object providing data to the component - * The procedure will return NULL if there's no data provider + * Get a pointer to the first comp_buffer object providing data to the component + * The function will return NULL if there's no data provider */ static inline struct comp_buffer *comp_dev_get_first_data_producer(struct comp_dev *component) { @@ -645,8 +645,8 @@ static inline struct comp_buffer *comp_dev_get_first_data_producer(struct comp_d } /** - * Get a pointer to a next comp_buffer object providing data to the component - * The procedure will return NULL if there're no more data providers + * Get a pointer to the next comp_buffer object providing data to the component + * The function will return NULL if there're no more data providers */ static inline struct comp_buffer *comp_dev_get_next_data_producer(struct comp_dev *component, struct comp_buffer *producer) @@ -656,8 +656,8 @@ static inline struct comp_buffer *comp_dev_get_next_data_producer(struct comp_de } /** - * Get a pointer to a first comp_buffer object receiving data from the component - * The procedure will return NULL if there's no data consumers + * Get a pointer to the first comp_buffer object receiving data from the component + * The function will return NULL if there's no data consumers */ static inline struct comp_buffer *comp_dev_get_first_data_consumer(struct comp_dev *component) { @@ -666,8 +666,8 @@ static inline struct comp_buffer *comp_dev_get_first_data_consumer(struct comp_d } /** - * Get a pointer to a next comp_buffer object receiving data from the component - * The procedure will return NULL if there're no more data consumers + * Get a pointer to the next comp_buffer object receiving data from the component + * The function will return NULL if there're no more data consumers */ static inline struct comp_buffer *comp_dev_get_next_data_consumer(struct comp_dev *component, struct comp_buffer *consumer) From c56abe1c5dad3a871a5cacc9f6c3eeeea30b606f Mon Sep 17 00:00:00 2001 From: Marcin Szkudlinski Date: Tue, 20 Aug 2024 16:23:29 +0200 Subject: [PATCH 2/5] buf: move is_shared flag to audio_buffer structure is_shared is a flag indicating that a buffer is shared between cores. This property is common for all types of audio buffers and should be kept in a base structure Signed-off-by: Marcin Szkudlinski --- src/audio/buffers/comp_buffer.c | 1 - src/audio/buffers/ring_buffer.c | 14 ++++++-------- src/include/sof/audio/audio_buffer.h | 8 ++++++++ src/include/sof/audio/buffer.h | 5 ++--- src/include/sof/audio/ring_buffer.h | 12 ++---------- src/ipc/ipc-helper.c | 4 ++-- src/ipc/ipc4/helper.c | 3 +-- 7 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/audio/buffers/comp_buffer.c b/src/audio/buffers/comp_buffer.c index 66ab613ed9f8..16cbc2bcb686 100644 --- a/src/audio/buffers/comp_buffer.c +++ b/src/audio/buffers/comp_buffer.c @@ -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, diff --git a/src/audio/buffers/ring_buffer.c b/src/audio/buffers/ring_buffer.c index 3168478f1226..25543c2e4992 100644 --- a/src/audio/buffers/ring_buffer.c +++ b/src/audio/buffers/ring_buffer.c @@ -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) @@ -278,13 +278,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 @@ -293,8 +293,6 @@ 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 * @@ -302,8 +300,8 @@ struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_spa * 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), diff --git a/src/include/sof/audio/audio_buffer.h b/src/include/sof/audio/audio_buffer.h index 00067f3c15a7..38d690107157 100644 --- a/src/include/sof/audio/audio_buffer.h +++ b/src/include/sof/audio/audio_buffer.h @@ -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 @@ -166,6 +168,11 @@ 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; +} + /** * @brief return a handler to stream params structure */ @@ -216,6 +223,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, diff --git a/src/include/sof/audio/buffer.h b/src/include/sof/audio/buffer.h index 48d297b83919..4bb996c51a78 100644 --- a/src/include/sof/audio/buffer.h +++ b/src/include/sof/audio/buffer.h @@ -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 */ @@ -227,7 +226,7 @@ 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 } @@ -235,7 +234,7 @@ static inline void buffer_stream_invalidate(struct comp_buffer *buffer, uint32_t 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 } diff --git a/src/include/sof/audio/ring_buffer.h b/src/include/sof/audio/ring_buffer.h index e9727917c442..cd1f7cc968b0 100644 --- a/src/include/sof/audio/ring_buffer.h +++ b/src/include/sof/audio/ring_buffer.h @@ -100,10 +100,6 @@ struct ring_buffer; struct sof_audio_stream_params; -/* buffer flags */ -#define RING_BUFFER_MODE_LOCAL 0 -#define RING_BUFFER_MODE_SHARED BIT(1) - /* the ring_buffer structure */ struct ring_buffer { /* public: read only */ @@ -111,8 +107,6 @@ struct ring_buffer { size_t data_buffer_size; - uint32_t _flags; /* RING_BUFFER_MODE_* */ - uint8_t __sparse_cache *_data_buffer; size_t _write_offset; /* private: to be modified by data producer using API */ size_t _read_offset; /* private: to be modified by data consumer using API */ @@ -126,13 +120,11 @@ struct ring_buffer { * ring_buffer's source api * @param min_free_space minimum buffer space in queue required by the module using * ring_buffer's sink api - * - * @param flags a combinatin of RING_BUFFER_MODE_* flags determining working mode - * + * @param is_shared indicates if the buffer will be shared between cores * @param id a stream ID, accessible later by sink_get_id/source_get_id * */ -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); #endif /* __SOF_RING_BUFFER_H__ */ diff --git a/src/ipc/ipc-helper.c b/src/ipc/ipc-helper.c index 43926002abe3..1e27c701899f 100644 --- a/src/ipc/ipc-helper.c +++ b/src/ipc/ipc-helper.c @@ -186,9 +186,9 @@ int comp_buffer_connect(struct comp_dev *comp, uint32_t comp_core, if (buffer->core != comp_core) { #if CONFIG_INCOHERENT /* buffer must be shared */ - assert(buffer->is_shared); + assert(audio_buffer_is_shared(&buffer->audio_buffer)); #else - buffer->is_shared = true; + buffer->audio_buffer.is_shared = true; #endif if (!comp->is_shared) comp_make_shared(comp); diff --git a/src/ipc/ipc4/helper.c b/src/ipc/ipc4/helper.c index c7798861a518..114f1cfea937 100644 --- a/src/ipc/ipc4/helper.c +++ b/src/ipc/ipc4/helper.c @@ -569,8 +569,7 @@ int ipc_comp_connect(struct ipc *ipc, ipc_pipe_comp_connect *_connect) ring_buffer = ring_buffer_create(source_get_min_available(source), sink_get_min_free_space(sink), - buffer->is_shared ? - RING_BUFFER_MODE_SHARED : RING_BUFFER_MODE_LOCAL, + audio_buffer_is_shared(&buffer->audio_buffer), buf_get_id(buffer)); if (!ring_buffer) goto free; From 7cecc1196f3be0fc94ff807961d64baac333e755 Mon Sep 17 00:00:00 2001 From: Marcin Szkudlinski Date: Fri, 20 Sep 2024 11:08:50 +0200 Subject: [PATCH 3/5] buf: move hw_params_configured flag to stream_params structure hw_params_configured is a flag indicating that a buffer params has been already set, and should be kept in the same structure as the params themselves this commit moves hw_params_configured to sof_audio_stream_params and introduces API to handle the flag Signed-off-by: Marcin Szkudlinski --- src/audio/buffers/comp_buffer.c | 4 ++-- src/audio/buffers/ring_buffer.c | 5 +++-- src/audio/copier/copier.c | 3 ++- src/audio/copier/copier_generic.c | 2 +- src/audio/dai-zephyr.c | 8 ++++---- src/audio/mux/mux_ipc4.c | 2 +- src/audio/selector/selector.c | 2 +- src/include/module/audio/audio_stream.h | 2 ++ src/include/sof/audio/audio_buffer.h | 15 +++++++++++++++ src/include/sof/audio/buffer.h | 3 +-- src/include/sof/audio/ring_buffer.h | 2 -- src/ipc/ipc4/helper.c | 2 +- 12 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/audio/buffers/comp_buffer.c b/src/audio/buffers/comp_buffer.c index 16cbc2bcb686..be26ef5479b6 100644 --- a/src/audio/buffers/comp_buffer.c +++ b/src/audio/buffers/comp_buffer.c @@ -429,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); @@ -442,7 +442,7 @@ int buffer_set_params(struct comp_buffer *buffer, for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) buffer->chmap[i] = params->chmap[i]; - buffer->hw_params_configured = true; + audio_buffer_set_hw_params_configured(&buffer->audio_buffer); return 0; } diff --git a/src/audio/buffers/ring_buffer.c b/src/audio/buffers/ring_buffer.c index 25543c2e4992..45849b0b0669 100644 --- a/src/audio/buffers/ring_buffer.c +++ b/src/audio/buffers/ring_buffer.c @@ -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 = @@ -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; } diff --git a/src/audio/copier/copier.c b/src/audio/copier/copier.c index a82e54990311..31f62eb9d115 100644 --- a/src/audio/copier/copier.c +++ b/src/audio/copier/copier.c @@ -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); diff --git a/src/audio/copier/copier_generic.c b/src/audio/copier/copier_generic.c index 48107d238cae..0fe271d76c12 100644 --- a/src/audio/copier/copier_generic.c +++ b/src/audio/copier/copier_generic.c @@ -194,7 +194,7 @@ int create_endpoint_buffer(struct comp_dev *dev, for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) buffer->chmap[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; diff --git a/src/audio/dai-zephyr.c b/src/audio/dai-zephyr.c index 32b44776a278..783207c45b64 100644 --- a/src/audio/dai-zephyr.c +++ b/src/audio/dai-zephyr.c @@ -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); } @@ -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); @@ -1650,7 +1650,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); @@ -1680,7 +1680,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); diff --git a/src/audio/mux/mux_ipc4.c b/src/audio/mux/mux_ipc4.c index 6d183d6973f6..dd6315b3bcd0 100644 --- a/src/audio/mux/mux_ipc4.c +++ b/src/audio/mux/mux_ipc4.c @@ -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); } diff --git a/src/audio/selector/selector.c b/src/audio/selector/selector.c index 3ade8c14e477..fc36d5a9a830 100644 --- a/src/audio/selector/selector.c +++ b/src/audio/selector/selector.c @@ -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); } diff --git a/src/include/module/audio/audio_stream.h b/src/include/module/audio/audio_stream.h index 5e30c2aab4a9..301d74861a74 100644 --- a/src/include/module/audio/audio_stream.h +++ b/src/include/module/audio/audio_stream.h @@ -50,6 +50,8 @@ struct sof_audio_stream_params { bool underrun_permitted; /**< indicates whether underrun is permitted */ uint32_t buffer_fmt; /**< enum sof_ipc_buffer_format */ + + bool hw_params_configured; /**< indicates whether hw params were set */ }; #endif /* __MODULE_AUDIO_AUDIO_STREAM_H__ */ diff --git a/src/include/sof/audio/audio_buffer.h b/src/include/sof/audio/audio_buffer.h index 38d690107157..4254d98d3c02 100644 --- a/src/include/sof/audio/audio_buffer.h +++ b/src/include/sof/audio/audio_buffer.h @@ -173,6 +173,21 @@ 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; +} + /** * @brief return a handler to stream params structure */ diff --git a/src/include/sof/audio/buffer.h b/src/include/sof/audio/buffer.h index 4bb996c51a78..1e290d71cb4e 100644 --- a/src/include/sof/audio/buffer.h +++ b/src/include/sof/audio/buffer.h @@ -145,7 +145,6 @@ struct comp_buffer { /* 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 */ }; @@ -285,7 +284,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__ */ diff --git a/src/include/sof/audio/ring_buffer.h b/src/include/sof/audio/ring_buffer.h index cd1f7cc968b0..222b102f2ae9 100644 --- a/src/include/sof/audio/ring_buffer.h +++ b/src/include/sof/audio/ring_buffer.h @@ -110,8 +110,6 @@ struct ring_buffer { uint8_t __sparse_cache *_data_buffer; size_t _write_offset; /* private: to be modified by data producer using API */ size_t _read_offset; /* private: to be modified by data consumer using API */ - - bool _hw_params_configured; }; /** diff --git a/src/ipc/ipc4/helper.c b/src/ipc/ipc4/helper.c index 114f1cfea937..619be15a8030 100644 --- a/src/ipc/ipc4/helper.c +++ b/src/ipc/ipc4/helper.c @@ -1196,7 +1196,7 @@ void ipc4_update_buffer_format(struct comp_buffer *buf_c, for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) buf_c->chmap[i] = (fmt->ch_map >> i * 4) & 0xf; - buf_c->hw_params_configured = true; + audio_buffer_set_hw_params_configured(&buf_c->audio_buffer); } void ipc4_update_source_format(struct sof_source *source, From 68d8ea095837fe53149a0db67f0ff80c53ed0edf Mon Sep 17 00:00:00 2001 From: Marcin Szkudlinski Date: Fri, 20 Sep 2024 11:19:36 +0200 Subject: [PATCH 4/5] buf: move walking flag to sof_audio_buffer structure walking flag is not really needed for data buffering, rather for pipeline iteration procedures, so it should not be in sof_audio_buffer structure. But before in order to make possible usage of other buffer types than comp_buffer before pipeline2.0 is ready, it must be kept there. Signed-off-by: Marcin Szkudlinski --- src/audio/google/google_rtc_audio_processing.c | 2 +- src/audio/pipeline/pipeline-graph.c | 6 +++--- src/include/sof/audio/audio_buffer.h | 6 ++++++ src/include/sof/audio/buffer.h | 2 -- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/audio/google/google_rtc_audio_processing.c b/src/audio/google/google_rtc_audio_processing.c index fe9d2c62b3e3..151bcee9fa92 100644 --- a/src/audio/google/google_rtc_audio_processing.c +++ b/src/audio/google/google_rtc_audio_processing.c @@ -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 diff --git a/src/audio/pipeline/pipeline-graph.c b/src/audio/pipeline/pipeline-graph.c index 42fbdc7bae8f..8b21774c6d19 100644 --- a/src/audio/pipeline/pipeline-graph.c +++ b/src/audio/pipeline/pipeline-graph.c @@ -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); @@ -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) diff --git a/src/include/sof/audio/audio_buffer.h b/src/include/sof/audio/audio_buffer.h index 4254d98d3c02..0e161c5a4df0 100644 --- a/src/include/sof/audio/audio_buffer.h +++ b/src/include/sof/audio/audio_buffer.h @@ -71,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 diff --git a/src/include/sof/audio/buffer.h b/src/include/sof/audio/buffer.h index 1e290d71cb4e..05543d70fa6d 100644 --- a/src/include/sof/audio/buffer.h +++ b/src/include/sof/audio/buffer.h @@ -144,8 +144,6 @@ struct comp_buffer { /* runtime stream params */ uint16_t chmap[SOF_IPC_MAX_CHANNELS]; /**< channel map - SOF_CHMAP_ */ - - bool walking; /**< indicates if the buffer is being walked */ }; /* Only to be used for synchronous same-core notifications! */ From dd4c5121bcead5a371a755071bcb2dc694bd9ab4 Mon Sep 17 00:00:00 2001 From: Marcin Szkudlinski Date: Fri, 20 Sep 2024 12:26:48 +0200 Subject: [PATCH 5/5] buf: move chmap to stream_params structure chmap is a parameter common for all types of buffers, should be accessible through sink/src api, so it needs to be kept in sof_audio_stream_params an API inroduced for accessing the parameter Signed-off-by: Marcin Szkudlinski --- src/audio/buffers/comp_buffer.c | 2 +- src/audio/copier/copier_dai.c | 3 ++- src/audio/copier/copier_generic.c | 2 +- src/audio/dai-zephyr.c | 3 ++- src/audio/pipeline/pipeline-params.c | 2 +- src/include/ipc/stream.h | 3 --- src/include/module/audio/audio_stream.h | 2 ++ src/include/module/ipc/stream.h | 2 ++ src/include/sof/audio/audio_buffer.h | 11 +++++++++++ src/include/sof/audio/buffer.h | 3 --- src/ipc/ipc4/helper.c | 2 +- 11 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/audio/buffers/comp_buffer.c b/src/audio/buffers/comp_buffer.c index be26ef5479b6..7aa6c158124c 100644 --- a/src/audio/buffers/comp_buffer.c +++ b/src/audio/buffers/comp_buffer.c @@ -440,7 +440,7 @@ 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]); audio_buffer_set_hw_params_configured(&buffer->audio_buffer); diff --git a/src/audio/copier/copier_dai.c b/src/audio/copier/copier_dai.c index 80866f6933c1..741bbad9db3b 100644 --- a/src/audio/copier/copier_dai.c +++ b/src/audio/copier/copier_dai.c @@ -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); diff --git a/src/audio/copier/copier_generic.c b/src/audio/copier/copier_generic.c index 0fe271d76c12..a0502d6376df 100644 --- a/src/audio/copier/copier_generic.c +++ b/src/audio/copier/copier_generic.c @@ -192,7 +192,7 @@ 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); audio_buffer_set_hw_params_configured(&buffer->audio_buffer); diff --git a/src/audio/dai-zephyr.c b/src/audio/dai-zephyr.c index 783207c45b64..5e6708437992 100644 --- a/src/audio/dai-zephyr.c +++ b/src/audio/dai-zephyr.c @@ -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, diff --git a/src/audio/pipeline/pipeline-params.c b/src/audio/pipeline/pipeline-params.c index 8c9de7969bb8..6bd07e35e883 100644 --- a/src/audio/pipeline/pipeline-params.c +++ b/src/audio/pipeline/pipeline-params.c @@ -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 */ diff --git a/src/include/ipc/stream.h b/src/include/ipc/stream.h index c397f34a1d27..7cc020e50897 100644 --- a/src/include/ipc/stream.h +++ b/src/include/ipc/stream.h @@ -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 */ diff --git a/src/include/module/audio/audio_stream.h b/src/include/module/audio/audio_stream.h index 301d74861a74..f66fc414e865 100644 --- a/src/include/module/audio/audio_stream.h +++ b/src/include/module/audio/audio_stream.h @@ -51,6 +51,8 @@ struct sof_audio_stream_params { 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 */ }; diff --git a/src/include/module/ipc/stream.h b/src/include/module/ipc/stream.h index c3d05d903075..4fbbb801689e 100644 --- a/src/include/module/ipc/stream.h +++ b/src/include/module/ipc/stream.h @@ -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, diff --git a/src/include/sof/audio/audio_buffer.h b/src/include/sof/audio/audio_buffer.h index 0e161c5a4df0..3b8aedd30fb4 100644 --- a/src/include/sof/audio/audio_buffer.h +++ b/src/include/sof/audio/audio_buffer.h @@ -194,6 +194,17 @@ 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 */ diff --git a/src/include/sof/audio/buffer.h b/src/include/sof/audio/buffer.h index 05543d70fa6d..5805fe0f420d 100644 --- a/src/include/sof/audio/buffer.h +++ b/src/include/sof/audio/buffer.h @@ -141,9 +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_ */ }; /* Only to be used for synchronous same-core notifications! */ diff --git a/src/ipc/ipc4/helper.c b/src/ipc/ipc4/helper.c index 619be15a8030..8ef06f8e93b8 100644 --- a/src/ipc/ipc4/helper.c +++ b/src/ipc/ipc4/helper.c @@ -1194,7 +1194,7 @@ void ipc4_update_buffer_format(struct comp_buffer *buf_c, audio_stream_set_buffer_fmt(&buf_c->stream, fmt->interleaving_style); for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) - buf_c->chmap[i] = (fmt->ch_map >> i * 4) & 0xf; + audio_buffer_set_chmap(&buf_c->audio_buffer, i, (fmt->ch_map >> i * 4) & 0xf); audio_buffer_set_hw_params_configured(&buf_c->audio_buffer); }