Skip to content

Commit 61efedd

Browse files
buf: add .clean method to audio_buffer API
clean method does clean all buffer data leaving config as is Need to be implemented as virtual method as is implemented difrently in each buffer type Signed-off-by: Marcin Szkudlinski <marcin.szkudlinski@intel.com>
1 parent 569b75f commit 61efedd

8 files changed

Lines changed: 80 additions & 28 deletions

File tree

src/audio/buffers/comp_buffer.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,19 @@ static int comp_buffer_sink_set_alignment_constants(struct sof_sink *sink,
152152
return 0;
153153
}
154154

155+
static void comp_buffer_clean(struct sof_audio_buffer *audio_buffer)
156+
{
157+
if (!audio_buffer)
158+
return;
159+
160+
struct comp_buffer *buffer = container_of(audio_buffer, struct comp_buffer, audio_buffer);
161+
162+
/* reset rw pointers and avail/free bytes counters */
163+
audio_stream_reset(&buffer->stream);
164+
/* clear buffer contents */
165+
buffer_zero(buffer);
166+
}
167+
155168
/* free component in the pipeline */
156169
static void comp_buffer_free(struct sof_audio_buffer *audio_buffer)
157170
{
@@ -197,6 +210,7 @@ static const struct sink_ops comp_buffer_sink_ops = {
197210

198211
static const struct audio_buffer_ops audio_buffer_ops = {
199212
.free = comp_buffer_free,
213+
.clean = comp_buffer_clean,
200214
};
201215

202216
static struct comp_buffer *buffer_alloc_struct(void *stream_addr, size_t size, uint32_t caps,

src/audio/buffers/ring_buffer.c

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,6 @@ static inline struct ring_buffer *ring_buffer_from_source(struct sof_source *sou
3131
return container_of(audio_buffer, struct ring_buffer, audio_buffer);
3232
}
3333

34-
/**
35-
* @brief remove the queue from the list, free memory
36-
*/
37-
static void ring_buffer_free(struct sof_audio_buffer *buffer)
38-
{
39-
struct ring_buffer *ring_buffer = (struct ring_buffer *)buffer;
40-
41-
rfree((__sparse_force void *)ring_buffer->_data_buffer);
42-
}
43-
4434
/**
4535
* @brief return true if the ring buffer is shared between 2 cores
4636
*/
@@ -93,6 +83,39 @@ static inline void ring_buffer_writeback_shared(struct ring_buffer *ring_buffer,
9383
dcache_writeback_region(ptr, size);
9484
}
9585

86+
87+
/**
88+
* @brief remove the queue from the list, free memory
89+
*/
90+
static void ring_buffer_free(struct sof_audio_buffer *audio_buffer)
91+
{
92+
if (!audio_buffer)
93+
return;
94+
95+
struct ring_buffer *ring_buffer =
96+
container_of(audio_buffer, struct ring_buffer, audio_buffer);
97+
98+
rfree((__sparse_force void *)ring_buffer->_data_buffer);
99+
}
100+
101+
static void ring_buffer_clean(struct sof_audio_buffer *audio_buffer)
102+
{
103+
if (!audio_buffer)
104+
return;
105+
106+
struct ring_buffer *ring_buffer =
107+
container_of(audio_buffer, struct ring_buffer, audio_buffer);
108+
109+
ring_buffer->_write_offset = 0;
110+
ring_buffer->_read_offset = 0;
111+
112+
ring_buffer_invalidate_shared(ring_buffer, ring_buffer->_data_buffer,
113+
ring_buffer->data_buffer_size);
114+
bzero((__sparse_force void *)ring_buffer->_data_buffer, ring_buffer->data_buffer_size);
115+
ring_buffer_writeback_shared(ring_buffer, ring_buffer->_data_buffer,
116+
ring_buffer->data_buffer_size);
117+
}
118+
96119
static inline
97120
uint8_t __sparse_cache *ring_buffer_get_pointer(struct ring_buffer *ring_buffer, size_t offset)
98121
{
@@ -277,6 +300,7 @@ static const struct sink_ops ring_buffer_sink_ops = {
277300

278301
static const struct audio_buffer_ops audio_buffer_ops = {
279302
.free = ring_buffer_free,
303+
.clean = ring_buffer_clean
280304
};
281305

282306
struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_space, bool is_shared,

src/audio/module_adapter/module_adapter.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ int module_adapter_prepare(struct comp_dev *dev)
385385
irq_local_enable(flags);
386386

387387
buffer_set_params(buffer, mod->stream_params, BUFFER_UPDATE_FORCE);
388-
buffer_reset_pos(buffer, NULL);
388+
audio_buffer_clean(&buffer->audio_buffer);
389389
}
390390
} else {
391391
list_for_item(blist, &mod->sink_buffer_list) {
@@ -400,7 +400,7 @@ int module_adapter_prepare(struct comp_dev *dev)
400400
}
401401

402402
buffer_set_params(buffer, mod->stream_params, BUFFER_UPDATE_FORCE);
403-
buffer_reset_pos(buffer, NULL);
403+
audio_buffer_clean(&buffer->audio_buffer);
404404
}
405405
}
406406

src/audio/pipeline/pipeline-graph.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,11 @@ static int pipeline_comp_reset(struct comp_dev *current,
360360
return pipeline_for_each_comp(current, ctx, dir);
361361
}
362362

363+
static inline void buffer_reset_params(struct comp_buffer *buffer, void *data)
364+
{
365+
audio_buffer_reset_params(&buffer->audio_buffer);
366+
}
367+
363368
/* reset the whole pipeline */
364369
int pipeline_reset(struct pipeline *p, struct comp_dev *host)
365370
{

src/audio/pipeline/pipeline-params.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,11 @@ static int pipeline_comp_prepare(struct comp_dev *current,
289289
return pipeline_for_each_comp(current, ctx, dir);
290290
}
291291

292+
static void buffer_reset_pos(struct comp_buffer *buffer, void *data)
293+
{
294+
audio_buffer_clean(&buffer->audio_buffer);
295+
}
296+
292297
/* prepare the pipeline for usage */
293298
int pipeline_prepare(struct pipeline *p, struct comp_dev *dev)
294299
{

src/include/sof/audio/audio_buffer.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ struct audio_buffer_ops {
2525
* OPTIONAL
2626
*/
2727
void (*free)(struct sof_audio_buffer *buffer);
28+
29+
/**
30+
* @brief clean all buffer data leaving config as is
31+
* the procedure is to be called only when buffer is not in use
32+
* OPTIONAL
33+
*/
34+
void (*clean)(struct sof_audio_buffer *buffer);
2835
};
2936

3037
/* base class for all buffers, all buffers must inherit from it */
@@ -267,4 +274,15 @@ void audio_buffer_init(struct sof_audio_buffer *buffer, uint32_t buffer_type, bo
267274
*/
268275
void audio_buffer_free(struct sof_audio_buffer *buffer);
269276

277+
/**
278+
* @brief clean all buffer data leaving config as is
279+
* the procedure is to be called only when buffer is not in use
280+
*/
281+
static inline
282+
void audio_buffer_clean(struct sof_audio_buffer *buffer)
283+
{
284+
if (buffer->ops->clean)
285+
buffer->ops->clean(buffer);
286+
}
287+
270288
#endif /* __SOF_AUDIO_BUFFER__ */

src/include/sof/audio/buffer.h

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -279,25 +279,11 @@ static inline uint32_t buffer_pipeline_id(const struct comp_buffer *buffer)
279279
return buffer->stream.runtime_stream_params.pipeline_id;
280280
}
281281

282-
static inline void buffer_reset_pos(struct comp_buffer *buffer, void *data)
283-
{
284-
/* reset rw pointers and avail/free bytes counters */
285-
audio_stream_reset(&buffer->stream);
286-
287-
/* clear buffer contents */
288-
buffer_zero(buffer);
289-
}
290-
291282
/* Run-time buffer re-configuration calls this too, so it must use cached access */
292283
static inline void buffer_init_stream(struct comp_buffer *buffer, size_t size)
293284
{
294285
/* addr should be set in alloc function */
295286
audio_stream_init(&buffer->stream, buffer->stream.addr, size);
296287
}
297288

298-
static inline void buffer_reset_params(struct comp_buffer *buffer, void *data)
299-
{
300-
audio_buffer_reset_params(&buffer->audio_buffer);
301-
}
302-
303289
#endif /* __SOF_AUDIO_BUFFER_H__ */

tools/plugin/modules/alsa.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ static int arecord_params(struct comp_dev *dev, struct sof_ipc_stream_params *pa
429429

430430
/* file component sink/source buffer period count */
431431
buffer = comp_dev_get_first_data_consumer(dev);
432-
buffer_reset_pos(buffer, NULL);
432+
audio_buffer_clean(&buffer->audio_buffer);
433433

434434
comp_dbg(dev, "prepare done ret = %d", ret);
435435

@@ -461,7 +461,7 @@ static int aplay_params(struct comp_dev *dev, struct sof_ipc_stream_params *para
461461

462462
/* file component sink/source buffer period count */
463463
buffer = comp_dev_get_first_data_producer(dev);
464-
buffer_reset_pos(buffer, NULL);
464+
audio_buffer_clean(&buffer->audio_buffer);
465465

466466
comp_dbg(dev, "prepare done ret = %d", ret);
467467
return 0;

0 commit comments

Comments
 (0)