Skip to content

Commit 9023cfd

Browse files
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>
1 parent 63cd457 commit 9023cfd

3 files changed

Lines changed: 22 additions & 8 deletions

File tree

src/audio/buffers/audio_buffer.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ void audio_buffer_free(struct sof_audio_buffer *buffer)
9191
audio_buffer_free(buffer->secondary_buffer_sink);
9292
audio_buffer_free(buffer->secondary_buffer_source);
9393
#endif /* CONFIG_PIPELINE_2_0 */
94-
if (buffer->free)
95-
buffer->free(buffer);
94+
if (buffer->ops->free)
95+
buffer->ops->free(buffer);
9696
rfree(buffer);
9797
}

src/audio/buffers/ring_buffer.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,10 @@ static const struct sink_ops ring_buffer_sink_ops = {
271271
.audio_set_ipc_params = ring_buffer_set_ipc_params_sink,
272272
};
273273

274+
static const struct audio_buffer_ops ring_buffer_audio_buffer_ops = {
275+
.free = ring_buffer_free,
276+
};
277+
274278
struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_space, uint32_t flags,
275279
uint32_t id,
276280
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
321325
ring_buffer->data_buffer_size);
322326

323327
/* set common buffer api */
324-
ring_buffer->audio_buffer.free = ring_buffer_free;
328+
ring_buffer->audio_buffer.ops = &ring_buffer_audio_buffer_ops;
325329
ring_buffer->audio_buffer.buffer_type = BUFFER_TYPE_RING_BUFFER;
326330

327331
/* return a pointer to allocated structure */

src/include/sof/audio/audio_buffer.h

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@
1515
#define BUFFER_TYPE_LEGACY_BUFFER 1
1616
#define BUFFER_TYPE_RING_BUFFER 2
1717

18+
/* forward def */
19+
struct sof_audio_buffer;
20+
21+
struct audio_buffer_ops {
22+
/**
23+
* @brief this method must free all structures allocated by buffer implementation
24+
* it must not free the buffer memory itself
25+
* OPTIONAL
26+
*/
27+
void (*free)(struct sof_audio_buffer *buffer);
28+
};
29+
1830
/* base class for all buffers, all buffers must inherit from it */
1931
struct sof_audio_buffer {
2032
CORE_CHECK_STRUCT_FIELD;
@@ -56,11 +68,7 @@ struct sof_audio_buffer {
5668
struct sof_sink _sink_api; /**< sink api handler */
5769

5870
/* virtual methods */
59-
/**
60-
* @brief this method must free all structures allocated by buffer implementation
61-
* it must not free the buffer memory itself
62-
*/
63-
void (*free)(struct sof_audio_buffer *buffer);
71+
const struct audio_buffer_ops *ops;
6472
};
6573

6674
#if CONFIG_PIPELINE_2_0
@@ -200,10 +208,12 @@ static inline struct sof_audio_buffer *sof_audo_buffer_from_source(struct sof_so
200208
static inline
201209
void audio_buffer_init(struct sof_audio_buffer *buffer, uint32_t buffer_type, bool is_shared,
202210
const struct source_ops *source_ops, const struct sink_ops *sink_ops,
211+
const struct audio_buffer_ops *audio_buffer_ops,
203212
struct sof_audio_stream_params *audio_stream_params)
204213
{
205214
CORE_CHECK_STRUCT_INIT(&buffer, is_shared);
206215
buffer->buffer_type = buffer_type;
216+
buffer->ops = audio_buffer_ops;
207217
buffer->audio_stream_params = audio_stream_params;
208218
source_init(audio_buffer_get_source(buffer), source_ops,
209219
audio_buffer_get_stream_params(buffer));

0 commit comments

Comments
 (0)