@@ -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+
96119static inline
97120uint8_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
278301static const struct audio_buffer_ops audio_buffer_ops = {
279302 .free = ring_buffer_free ,
303+ .clean = ring_buffer_clean
280304};
281305
282306struct ring_buffer * ring_buffer_create (size_t min_available , size_t min_free_space , bool is_shared ,
0 commit comments