99#include <sof/common.h>
1010#include <ipc/topology.h>
1111#include <sof/coherent.h>
12+ #include <sof/audio/sink_api.h>
13+ #include <sof/audio/source_api.h>
1214
1315#define BUFFER_TYPE_LEGACY_BUFFER 1
14- #define BUFFER_TYPE_LEGACY_RING_HYBRID 2
15- #define BUFFER_TYPE_RING_BUFFER 3
16+ #define BUFFER_TYPE_RING_BUFFER 2
1617
1718/* base class for all buffers, all buffers must inherit from it */
1819struct sof_audio_buffer {
@@ -21,8 +22,34 @@ struct sof_audio_buffer {
2122 /* type of the buffer BUFFER_TYPE_* */
2223 uint32_t buffer_type ;
2324
24- /* runtime stream params */
25- struct sof_audio_stream_params audio_stream_params ;
25+ #if CONFIG_PIPELINE_2_0
26+ /**
27+ * sink API of an additional buffer
28+ * of any type at data input
29+ *
30+ * to be removed when hybrid buffers are no longer needed
31+ */
32+ struct sof_audio_buffer * secondary_buffer_sink ;
33+
34+ /**
35+ * source API of an additional buffer
36+ * at data output
37+ */
38+ struct sof_audio_buffer * secondary_buffer_source ;
39+
40+ #endif /* CONFIG_PIPELINE_2_0 */
41+
42+ /* effective runtime stream params
43+ * before pipelin2.0 is ready, stream params may be kept in audio_stream structure
44+ * also for hybrid buffering audio params need to be shared between primary and secondary
45+ * buffers
46+ *
47+ * So currently only a pointer to effective stream params is here.
48+ * Note that the same pointer MUST be set in source and sink api (kept there for
49+ * performance reasons)
50+ */
51+ struct sof_audio_stream_params * audio_stream_params ;
52+
2653
2754 /* private: */
2855 struct sof_source _source_api ; /**< src api handler */
@@ -36,6 +63,77 @@ struct sof_audio_buffer {
3663 void (* free )(struct sof_audio_buffer * buffer );
3764};
3865
66+ #if CONFIG_PIPELINE_2_0
67+ /*
68+ * attach a secondary buffer (any type) before buffer (when at_input == true) or behind a buffer
69+ *
70+ * before buffer (at_input == true):
71+ * 2.0 mod ==> (sink_API) secondary buffer ==>
72+ * ==> comp_buffer (audio_stream or source API) ==> 1.0 mod
73+ *
74+ * after buffer (at_input == false):
75+ * 1.0 mod ==> (audio_stream or sink API) ==> comp_buffer ==>
76+ * ==> secondary buffer(source API) == 2.0 mod
77+ *
78+ * If a secondary buffer is attached, it replaces source or sink interface of audio_stream
79+ * allowing the module connected to it using all properties of secondary buffer (like
80+ * lockless cross-core connection in case of ring_buffer etc.) keeping legacy interface
81+ * to other modules
82+ *
83+ * buffer_sync_secondary_buffer must be called every 1 ms to move data to/from
84+ * secondary buffer to comp_buffer
85+ *
86+ * @param buffer pointer to a buffer
87+ * @param at_input true indicates that a secondary buffer is located at data input, replacing
88+ * sink API of audio_stream
89+ * false indicates that a secondary buffer is located at data output, replacing
90+ * source API of audio_stream
91+ * @param secondary_buffer pointer to a buffer to be attached
92+ *
93+ * to be removed when hybrid buffers are no longer needed
94+ */
95+ int audio_buffer_attach_secondary_buffer (struct sof_audio_buffer * buffer , bool at_input ,
96+ struct sof_audio_buffer * secondary_buffer );
97+
98+ /*
99+ * move data from/to secondary buffer, must be called periodically as described above
100+ *
101+ * @param buffer pointer to a buffer
102+ * @param limit data copy limit. Indicates maximum amount of data that will be moved from/to
103+ * secondary buffer in an operation
104+ *
105+ * to be removed when hybrid buffers are no longer needed
106+ */
107+ int audio_buffer_sync_secondary_buffer (struct sof_audio_buffer * buffer , size_t limit );
108+
109+ /**
110+ * @brief return a handler to sink API of audio_buffer.
111+ * the handler may be used by helper functions defined in sink_api.h
112+ */
113+ static inline
114+ struct sof_sink * audio_buffer_get_sink (struct sof_audio_buffer * buffer )
115+ {
116+ CORE_CHECK_STRUCT (buffer );
117+ return buffer -> secondary_buffer_sink ?
118+ audio_buffer_get_sink (buffer -> secondary_buffer_sink ) :
119+ & buffer -> _sink_api ;
120+ }
121+
122+ /**
123+ * @brief return a handler to source API of audio_buffer
124+ * the handler may be used by helper functions defined in source_api.h
125+ */
126+ static inline
127+ struct sof_source * audio_buffer_get_source (struct sof_audio_buffer * buffer )
128+ {
129+ CORE_CHECK_STRUCT (buffer );
130+ return buffer -> secondary_buffer_source ?
131+ audio_buffer_get_source (buffer -> secondary_buffer_source ) :
132+ & buffer -> _source_api ;
133+ }
134+
135+ #else /* CONFIG_PIPELINE_2_0 */
136+
39137/**
40138 * @brief return a handler to sink API of audio_buffer.
41139 * the handler may be used by helper functions defined in sink_api.h
@@ -58,6 +156,17 @@ struct sof_source *audio_buffer_get_source(struct sof_audio_buffer *buffer)
58156 return & buffer -> _source_api ;
59157}
60158
159+ #endif /* CONFIG_PIPELINE_2_0 */
160+
161+ /**
162+ * @brief return a handler to stream params structure
163+ */
164+ static inline
165+ struct sof_audio_stream_params * audio_buffer_get_stream_params (struct sof_audio_buffer * buffer )
166+ {
167+ return buffer -> audio_stream_params ;
168+ }
169+
61170/**
62171 * @brief return a pointer to struct sof_audio_buffer from sink pointer
63172 * NOTE! ensure that sink is really provided by sof_audio_buffer
@@ -79,18 +188,32 @@ static inline struct sof_audio_buffer *sof_audo_buffer_from_source(struct sof_so
79188}
80189
81190/**
82- * @brief free buffer and all allocated resources
191+ * @brief initialize audio buffer structures
192+ *
193+ * @param buffer pointer to the audio_buffer
194+ * @param buffer_type a type of the buffer, BUFFER_TYPE_*
195+ * @param is_shared indicates if the buffer will be shared between cores
196+ * @param source_ops pointer to virtual methods table for source API
197+ * @param sink_ops pointer to virtual methods table for sink API
198+ * @param audio_stream_params pointer to audio stream (currently kept in buffer implementation)
83199 */
84200static inline
85- void audio_buffer_free (struct sof_audio_buffer * buffer )
201+ void audio_buffer_init (struct sof_audio_buffer * buffer , uint32_t buffer_type , bool is_shared ,
202+ const struct source_ops * source_ops , const struct sink_ops * sink_ops ,
203+ struct sof_audio_stream_params * audio_stream_params )
86204{
87- if (! buffer )
88- return ;
89-
90- CORE_CHECK_STRUCT ( buffer );
91- if (buffer -> free )
92- buffer -> free ( buffer );
93- rfree (buffer );
205+ CORE_CHECK_STRUCT_INIT ( & buffer , is_shared );
206+ buffer -> buffer_type = buffer_type ;
207+ buffer -> audio_stream_params = audio_stream_params ;
208+ source_init ( audio_buffer_get_source ( buffer ), source_ops ,
209+ audio_buffer_get_stream_params (buffer ));
210+ sink_init ( audio_buffer_get_sink ( buffer ), sink_ops ,
211+ audio_buffer_get_stream_params (buffer ) );
94212}
95213
214+ /**
215+ * @brief free buffer and all allocated resources
216+ */
217+ void audio_buffer_free (struct sof_audio_buffer * buffer );
218+
96219#endif /* __SOF_AUDIO_BUFFER__ */
0 commit comments