From 051009b8b706aa34aae4a9d0bdc8354e5cb0804a Mon Sep 17 00:00:00 2001 From: Marcin Szkudlinski Date: Wed, 14 Aug 2024 16:39:11 +0200 Subject: [PATCH] buf: introduce ops instead of a single free function in struct audio_buffer there was only one virtual method (free). There are probably more coming, so an ops structure is introduced. ring buffer which uses audio buffer as a base must adjust, including using of an audio_buffer_init procedure, what implies using audio_stream_params located in audio_buffer Signed-off-by: Marcin Szkudlinski --- src/audio/buffers/audio_buffer.c | 4 ++-- src/audio/buffers/ring_buffer.c | 6 +++++- src/include/sof/audio/audio_buffer.h | 20 +++++++++++++++----- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/audio/buffers/audio_buffer.c b/src/audio/buffers/audio_buffer.c index cca84a0a1..9cbd58719 100644 --- a/src/audio/buffers/audio_buffer.c +++ b/src/audio/buffers/audio_buffer.c @@ -91,7 +91,7 @@ void audio_buffer_free(struct sof_audio_buffer *buffer) audio_buffer_free(buffer->secondary_buffer_sink); audio_buffer_free(buffer->secondary_buffer_source); #endif /* CONFIG_PIPELINE_2_0 */ - if (buffer->free) - buffer->free(buffer); + if (buffer->ops->free) + buffer->ops->free(buffer); rfree(buffer); } diff --git a/src/audio/buffers/ring_buffer.c b/src/audio/buffers/ring_buffer.c index 9ce7eeee8..e32f1c45c 100644 --- a/src/audio/buffers/ring_buffer.c +++ b/src/audio/buffers/ring_buffer.c @@ -271,6 +271,10 @@ static const struct sink_ops ring_buffer_sink_ops = { .audio_set_ipc_params = ring_buffer_set_ipc_params_sink, }; +static const struct audio_buffer_ops ring_buffer_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, uint32_t id, struct sof_audio_stream_params *audio_stream_params) @@ -321,7 +325,7 @@ struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_spa ring_buffer->data_buffer_size); /* set common buffer api */ - ring_buffer->audio_buffer.free = ring_buffer_free; + ring_buffer->audio_buffer.ops = &ring_buffer_audio_buffer_ops; ring_buffer->audio_buffer.buffer_type = BUFFER_TYPE_RING_BUFFER; /* return a pointer to allocated structure */ diff --git a/src/include/sof/audio/audio_buffer.h b/src/include/sof/audio/audio_buffer.h index bb8b48173..b775a9a8b 100644 --- a/src/include/sof/audio/audio_buffer.h +++ b/src/include/sof/audio/audio_buffer.h @@ -15,6 +15,18 @@ #define BUFFER_TYPE_LEGACY_BUFFER 1 #define BUFFER_TYPE_RING_BUFFER 2 +/* forward def */ +struct sof_audio_buffer; + +struct audio_buffer_ops { + /** + * @brief this method must free all structures allocated by buffer implementation + * it must not free the buffer memory itself + * OPTIONAL + */ + void (*free)(struct sof_audio_buffer *buffer); +}; + /* base class for all buffers, all buffers must inherit from it */ struct sof_audio_buffer { CORE_CHECK_STRUCT_FIELD; @@ -56,11 +68,7 @@ struct sof_audio_buffer { struct sof_sink _sink_api; /**< sink api handler */ /* virtual methods */ - /** - * @brief this method must free all structures allocated by buffer implementation - * it must not free the buffer memory itself - */ - void (*free)(struct sof_audio_buffer *buffer); + const struct audio_buffer_ops *ops; }; #if CONFIG_PIPELINE_2_0 @@ -200,10 +208,12 @@ static inline struct sof_audio_buffer *sof_audo_buffer_from_source(struct sof_so static inline void audio_buffer_init(struct sof_audio_buffer *buffer, uint32_t buffer_type, bool is_shared, const struct source_ops *source_ops, const struct sink_ops *sink_ops, + const struct audio_buffer_ops *audio_buffer_ops, struct sof_audio_stream_params *audio_stream_params) { CORE_CHECK_STRUCT_INIT(&buffer, is_shared); buffer->buffer_type = buffer_type; + buffer->ops = audio_buffer_ops; buffer->audio_stream_params = audio_stream_params; source_init(audio_buffer_get_source(buffer), source_ops, audio_buffer_get_stream_params(buffer));