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 <marcin.szkudlinski@intel.com>
This commit is contained in:
Marcin Szkudlinski 2024-08-14 16:39:11 +02:00 committed by Liam Girdwood
parent d23f8e81d9
commit 051009b8b7
3 changed files with 22 additions and 8 deletions

View File

@ -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);
}

View File

@ -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 */

View File

@ -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));