mirror of https://github.com/thesofproject/sof.git
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:
parent
d23f8e81d9
commit
051009b8b7
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue