Skip to content

Commit c81e1ce

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 f1385a2 commit c81e1ce

6 files changed

Lines changed: 54 additions & 48 deletions

File tree

src/audio/buffer.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ int buffer_attach_secondary_buffer(struct comp_buffer *buffer, bool at_input,
103103
buf_err(buffer, "Only one secondary buffer may be attached to a buffer");
104104
return -EINVAL;
105105
}
106+
107+
/* secondary buffer must share audio params with the primary buffer */
108+
audio_buffer_replace_audio_stream_params(secondary_buffer,
109+
&buffer->stream.runtime_stream_params);
110+
106111
if (at_input)
107112
buffer->stream.secondary_buffer_sink = secondary_buffer;
108113
else

src/audio/buffers/audio_buffer.c

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

src/audio/buffers/ring_buffer.c

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,13 @@ static int ring_buffer_set_ipc_params(struct ring_buffer *ring_buffer,
227227
if (ring_buffer->_hw_params_configured && !force_update)
228228
return 0;
229229

230-
ring_buffer->audio_stream_params->frame_fmt = params->frame_fmt;
231-
ring_buffer->audio_stream_params->rate = params->rate;
232-
ring_buffer->audio_stream_params->channels = params->channels;
233-
ring_buffer->audio_stream_params->buffer_fmt = params->buffer_fmt;
230+
struct sof_audio_stream_params *audio_stream_params =
231+
audio_buffer_get_stream_params(&ring_buffer->audio_buffer);
232+
233+
audio_stream_params->frame_fmt = params->frame_fmt;
234+
audio_stream_params->rate = params->rate;
235+
audio_stream_params->channels = params->channels;
236+
audio_stream_params->buffer_fmt = params->buffer_fmt;
234237

235238
ring_buffer->_hw_params_configured = true;
236239

@@ -271,9 +274,12 @@ static const struct sink_ops ring_buffer_sink_ops = {
271274
.audio_set_ipc_params = ring_buffer_set_ipc_params_sink,
272275
};
273276

277+
static const struct audio_buffer_ops audio_buffer_ops = {
278+
.free = ring_buffer_free,
279+
};
280+
274281
struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_space, uint32_t flags,
275-
uint32_t id,
276-
struct sof_audio_stream_params *audio_stream_params)
282+
uint32_t id)
277283
{
278284
struct ring_buffer *ring_buffer;
279285

@@ -288,19 +294,22 @@ struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_spa
288294
return NULL;
289295

290296
ring_buffer->_flags = flags;
291-
ring_buffer->audio_stream_params = audio_stream_params;
292297

293-
CORE_CHECK_STRUCT_INIT(&ring_buffer->audio_buffer, flags & RING_BUFFER_MODE_SHARED);
294-
295-
/* initiate structures */
296-
source_init(audio_buffer_get_source(&ring_buffer->audio_buffer), &ring_buffer_source_ops,
297-
ring_buffer->audio_stream_params);
298-
sink_init(audio_buffer_get_sink(&ring_buffer->audio_buffer), &ring_buffer_sink_ops,
299-
ring_buffer->audio_stream_params);
298+
/* init base structure. The audio_stream_params is NULL because ring_buffer
299+
* is currently used as a secondary buffer for DP only
300+
*
301+
* pointer in audio_buffer will be overwritten when attaching ring_buffer as a
302+
* secondary buffer
303+
*/
304+
audio_buffer_init(&ring_buffer->audio_buffer, BUFFER_TYPE_RING_BUFFER,
305+
flags & RING_BUFFER_MODE_SHARED, &ring_buffer_source_ops,
306+
&ring_buffer_sink_ops, &audio_buffer_ops, NULL);
300307

301308
/* set obs/ibs in sink/source interfaces */
302-
sink_set_min_free_space(&ring_buffer->audio_buffer._sink_api, min_free_space);
303-
source_set_min_available(&ring_buffer->audio_buffer._source_api, min_available);
309+
sink_set_min_free_space(audio_buffer_get_sink(&ring_buffer->audio_buffer),
310+
min_free_space);
311+
source_set_min_available(audio_buffer_get_source(&ring_buffer->audio_buffer),
312+
min_available);
304313

305314
uint32_t max_ibs_obs = MAX(min_available, min_free_space);
306315

@@ -315,15 +324,10 @@ struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_spa
315324
if (!ring_buffer->_data_buffer)
316325
goto err;
317326

318-
ring_buffer->audio_stream_params->id = id;
319327
tr_info(&ring_buffer_tr, "Ring buffer created, id: %u shared: %u min_available: %u min_free_space %u, size %u",
320328
id, ring_buffer_is_shared(ring_buffer), min_available, min_free_space,
321329
ring_buffer->data_buffer_size);
322330

323-
/* set common buffer api */
324-
ring_buffer->audio_buffer.free = ring_buffer_free;
325-
ring_buffer->audio_buffer.buffer_type = BUFFER_TYPE_RING_BUFFER;
326-
327331
/* return a pointer to allocated structure */
328332
return ring_buffer;
329333
err:

src/include/sof/audio/audio_buffer.h

Lines changed: 19 additions & 9 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
@@ -195,16 +203,18 @@ static inline struct sof_audio_buffer *sof_audo_buffer_from_source(struct sof_so
195203
* @param is_shared indicates if the buffer will be shared between cores
196204
* @param source_ops pointer to virtual methods table for source API
197205
* @param sink_ops pointer to virtual methods table for sink API
206+
* @param audio_stream_params pointer to audio stream (currently kept in buffer implementation)
198207
*/
199208
static inline
200209
void audio_buffer_init(struct sof_audio_buffer *buffer, uint32_t buffer_type, bool is_shared,
201-
const struct source_ops *source_ops, const struct sink_ops *sink_ops)
210+
const struct source_ops *source_ops, const struct sink_ops *sink_ops,
211+
const struct audio_buffer_ops *audio_buffer_ops,
212+
struct sof_audio_stream_params *audio_stream_params)
202213
{
203214
CORE_CHECK_STRUCT_INIT(&buffer, is_shared);
204215
buffer->buffer_type = buffer_type;
205-
#if CONFIG_PIPELINE_2_0
206-
buffer->audio_stream_params = &buffer->_audio_stream_params;
207-
#endif /* CONFIG_PIPELINE_2_0 */
216+
buffer->ops = audio_buffer_ops;
217+
buffer->audio_stream_params = audio_stream_params;
208218
source_init(audio_buffer_get_source(buffer), source_ops,
209219
audio_buffer_get_stream_params(buffer));
210220
sink_init(audio_buffer_get_sink(buffer), sink_ops,

src/include/sof/audio/ring_buffer.h

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,9 @@ struct sof_audio_stream_params;
106106

107107
/* the ring_buffer structure */
108108
struct ring_buffer {
109-
struct sof_audio_buffer audio_buffer;
110-
111109
/* public: read only */
110+
struct sof_audio_buffer audio_buffer;
112111

113-
/* note!
114-
* as ring_buffer is currently used as a shadow for comp_buffer only for DP components,
115-
* the audio_stream_params vector must be shared between comp_buffer and ring_buffer
116-
* the audio_stream_params pointer should point to the proper comp_buffer structure
117-
*
118-
* to be changed to the structure itself when pipeline2.0 is introduced
119-
*/
120-
struct sof_audio_stream_params *audio_stream_params;
121112
size_t data_buffer_size;
122113

123114
uint32_t _flags; /* RING_BUFFER_MODE_* */
@@ -140,11 +131,8 @@ struct ring_buffer {
140131
*
141132
* @param id a stream ID, accessible later by sink_get_id/source_get_id
142133
*
143-
* @param audio_stream_params pointer to audio params vector, shared between ring_buffer and
144-
* comp_buffer for dp modules
145-
*
146134
*/
147135
struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_space, uint32_t flags,
148-
uint32_t id, struct sof_audio_stream_params *audio_stream_params);
136+
uint32_t id);
149137

150138
#endif /* __SOF_RING_BUFFER_H__ */

src/ipc/ipc4/helper.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -569,8 +569,7 @@ int ipc_comp_connect(struct ipc *ipc, ipc_pipe_comp_connect *_connect)
569569
sink_get_min_free_space(&buffer->stream._sink_api),
570570
buffer->is_shared ?
571571
RING_BUFFER_MODE_SHARED : RING_BUFFER_MODE_LOCAL,
572-
buf_get_id(buffer),
573-
&buffer->stream.runtime_stream_params);
572+
buf_get_id(buffer));
574573
if (!ring_buffer)
575574
goto free;
576575
}

0 commit comments

Comments
 (0)