Sound Open Firmware
Loading...
Searching...
No Matches
audio_buffer.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2023 Intel Corporation. All rights reserved.
4 *
5 */
12#ifndef __SOF_AUDIO_BUFFER__
13#define __SOF_AUDIO_BUFFER__
14
15#include <sof/common.h>
16#include <ipc/topology.h>
17#include <sof/coherent.h>
18#include <sof/audio/sink_api.h>
20
28#define BUFFER_TYPE_LEGACY_BUFFER 1
29#define BUFFER_TYPE_RING_BUFFER 2
32/* forward def */
33struct sof_audio_buffer;
34
46 void (*free)(struct sof_audio_buffer *buffer);
47
55 void (*reset)(struct sof_audio_buffer *buffer);
56
63 int (*on_audio_format_set)(struct sof_audio_buffer *buffer);
64
73 struct sof_ipc_stream_params *params, bool force_update);
74
83 const uint32_t byte_align,
84 const uint32_t frame_align_req);
85};
86
87struct mod_alloc_ctx;
88
94
95 uint32_t buffer_type;
97 bool is_shared;
99#if CONFIG_PIPELINE_2_0
104 struct sof_audio_buffer *secondary_buffer_sink;
105
109 struct sof_audio_buffer *secondary_buffer_source;
110
111#endif /* CONFIG_PIPELINE_2_0 */
112
117
118 /* private: */
122 /* virtual methods */
123 const struct audio_buffer_ops *ops;
125 bool walking;
128};
129
130#if CONFIG_PIPELINE_2_0
138int audio_buffer_attach_secondary_buffer(struct sof_audio_buffer *buffer, bool at_input,
139 struct sof_audio_buffer *secondary_buffer);
140
147int audio_buffer_sync_secondary_buffer(struct sof_audio_buffer *buffer, size_t limit);
148
154static inline
155struct sof_sink *audio_buffer_get_sink(struct sof_audio_buffer *buffer)
156{
157 CORE_CHECK_STRUCT(buffer);
158 return buffer->secondary_buffer_sink ?
159 audio_buffer_get_sink(buffer->secondary_buffer_sink) :
160 &buffer->_sink_api;
161}
162
168static inline
170{
171 CORE_CHECK_STRUCT(buffer);
172 return buffer->secondary_buffer_source ?
173 audio_buffer_get_source(buffer->secondary_buffer_source) :
174 &buffer->_source_api;
175}
176
177#else /* CONFIG_PIPELINE_2_0 */
178
184static inline
186{
187 CORE_CHECK_STRUCT(buffer);
188 return &buffer->_sink_api;
189}
190
196static inline
198{
199 CORE_CHECK_STRUCT(buffer);
200 return &buffer->_source_api;
201}
202
203#endif /* CONFIG_PIPELINE_2_0 */
204
210static inline bool audio_buffer_is_shared(struct sof_audio_buffer *buffer)
211{
212 return buffer->is_shared;
213}
214
220static inline bool audio_buffer_hw_params_configured(struct sof_audio_buffer *buffer)
221{
223}
224
233
238static inline void audio_buffer_reset_params(struct sof_audio_buffer *buffer)
239{
241}
242
249 const struct sof_audio_buffer *buffer)
250{
251 return buffer->audio_stream_params->state;
252}
253
259static inline void audio_buffer_set_state(struct sof_audio_buffer *buffer,
260 enum sof_audio_buffer_state state)
261{
262 buffer->audio_stream_params->state = state;
263}
264
269static inline void audio_buffer_set_eos(struct sof_audio_buffer *buffer)
270{
272}
273
280static inline uint16_t audio_buffer_get_chmap(struct sof_audio_buffer *buffer, size_t index)
281{
282 return buffer->audio_stream_params->chmap[index];
283}
284
291static inline void audio_buffer_set_chmap(struct sof_audio_buffer *buffer, size_t index,
292 uint16_t value)
293{
294 buffer->audio_stream_params->chmap[index] = value;
295}
296
302static inline
307
317static inline struct sof_audio_buffer *sof_audio_buffer_from_sink(struct sof_sink *sink)
318{
319 return container_of(sink, struct sof_audio_buffer, _sink_api);
320}
321
331static inline struct sof_audio_buffer *sof_audio_buffer_from_source(struct sof_source *source)
332{
333 return container_of(source, struct sof_audio_buffer, _source_api);
334}
335
346void audio_buffer_init(struct sof_audio_buffer *buffer, uint32_t buffer_type, bool is_shared,
347 const struct source_ops *source_ops, const struct sink_ops *sink_ops,
350
356
361static inline
363{
364 if (buffer->ops->reset)
365 buffer->ops->reset(buffer);
366
367#if CONFIG_PIPELINE_2_0
368 if (buffer->secondary_buffer_sink && buffer->secondary_buffer_sink->ops->reset)
369 buffer->secondary_buffer_sink->ops->reset(buffer->secondary_buffer_sink);
370
371 if (buffer->secondary_buffer_source && buffer->secondary_buffer_source->ops->reset)
372 buffer->secondary_buffer_source->ops->reset(buffer->secondary_buffer_source);
373#endif
374}
375
376/* Audio-buffer wrappers for the source-sink API */
377
386 struct sof_ipc_stream_params *params, bool force_update);
387
394
403 const uint32_t byte_align,
404 const uint32_t frame_align_req);
405
414 bool force_update);
415
422
431 const uint32_t byte_align,
432 const uint32_t frame_align_req);
433
439uint32_t audio_buffer_sink_get_lft(struct sof_sink *sink);
440
443#endif /* __SOF_AUDIO_BUFFER__ */
Cache-coherent multi-core shared memory access abstractions.
#define container_of(ptr, type, member)
Definition common.h:117
static void audio_buffer_set_hw_params_configured(struct sof_audio_buffer *buffer)
Mark buffer hardware parameters as configured (state set to READY).
Definition audio_buffer.h:229
static struct sof_sink * audio_buffer_get_sink(struct sof_audio_buffer *buffer)
Return pointer to sink interface of audio buffer.
Definition audio_buffer.h:185
static struct sof_audio_stream_params * audio_buffer_get_stream_params(struct sof_audio_buffer *buffer)
Retrieve pointer to runtime stream parameters.
Definition audio_buffer.h:303
static uint16_t audio_buffer_get_chmap(struct sof_audio_buffer *buffer, size_t index)
Retrieve channel map value for a given channel index.
Definition audio_buffer.h:280
static void audio_buffer_set_eos(struct sof_audio_buffer *buffer)
Mark buffer state as end-of-stream (EOS).
Definition audio_buffer.h:269
static bool audio_buffer_is_shared(struct sof_audio_buffer *buffer)
Check if audio buffer is shared across cores.
Definition audio_buffer.h:210
static void audio_buffer_reset(struct sof_audio_buffer *buffer)
Reset all buffer data and positions leaving configuration intact.
Definition audio_buffer.h:362
uint32_t audio_buffer_sink_get_lft(struct sof_sink *sink)
Get linear free time (LFT) duration in microseconds from sink interface wrapper.
int audio_buffer_source_set_ipc_params(struct sof_source *source, struct sof_ipc_stream_params *params, bool force_update)
Set IPC stream parameters via source interface wrapper.
static void audio_buffer_set_chmap(struct sof_audio_buffer *buffer, size_t index, uint16_t value)
Set channel map value for a given channel index.
Definition audio_buffer.h:291
static enum sof_audio_buffer_state audio_buffer_get_state(const struct sof_audio_buffer *buffer)
Retrieve current buffer state.
Definition audio_buffer.h:248
static struct sof_audio_buffer * sof_audio_buffer_from_sink(struct sof_sink *sink)
Retrieve enclosing sof_audio_buffer from sink interface pointer.
Definition audio_buffer.h:317
int audio_buffer_sink_set_ipc_params(struct sof_sink *sink, struct sof_ipc_stream_params *params, bool force_update)
Set IPC stream parameters via sink interface wrapper.
static struct sof_audio_buffer * sof_audio_buffer_from_source(struct sof_source *source)
Retrieve enclosing sof_audio_buffer from source interface pointer.
Definition audio_buffer.h:331
static bool audio_buffer_hw_params_configured(struct sof_audio_buffer *buffer)
Check if buffer hardware parameters are configured.
Definition audio_buffer.h:220
int audio_buffer_source_set_alignment_constants(struct sof_source *source, const uint32_t byte_align, const uint32_t frame_align_req)
Set alignment constraints via source interface wrapper.
static struct sof_source * audio_buffer_get_source(struct sof_audio_buffer *buffer)
Return pointer to source interface of audio buffer.
Definition audio_buffer.h:197
static void audio_buffer_set_state(struct sof_audio_buffer *buffer, enum sof_audio_buffer_state state)
Set buffer state.
Definition audio_buffer.h:259
int audio_buffer_source_on_audio_format_set(struct sof_source *source)
Audio format set callback via source interface wrapper.
int audio_buffer_sink_set_alignment_constants(struct sof_sink *sink, const uint32_t byte_align, const uint32_t frame_align_req)
Set alignment constraints via sink interface wrapper.
int audio_buffer_sink_on_audio_format_set(struct sof_sink *sink)
Audio format set callback via sink interface wrapper.
static void audio_buffer_reset_params(struct sof_audio_buffer *buffer)
Reset buffer parameters state to initial.
Definition audio_buffer.h:238
void audio_buffer_init(struct sof_audio_buffer *buffer, uint32_t buffer_type, bool is_shared, const struct source_ops *source_ops, const struct sink_ops *sink_ops, const struct audio_buffer_ops *audio_buffer_ops, struct sof_audio_stream_params *audio_stream_params)
Initialize audio buffer structure and virtual operation tables.
void audio_buffer_free(struct sof_audio_buffer *buffer)
Free audio buffer and all allocated resources.
#define CORE_CHECK_STRUCT(_c)
Definition coherent.h:121
sof_audio_buffer_state
Define states of an audio stream buffer connecting two components.
Definition audio_stream.h:35
@ AUDIOBUF_STATE_INITIAL
Definition audio_stream.h:36
@ AUDIOBUF_STATE_END_OF_STREAM
Definition audio_stream.h:38
@ AUDIOBUF_STATE_READY
Definition audio_stream.h:37
uint32_t value
Control integer value (gain level, mute toggle, enum index).
Definition header.h:1
Audio sink API helpers and stream configuration.
Audio source API helpers and stream configuration.
Audio buffer virtual operations table.
Definition audio_buffer.h:38
void(* free)(struct sof_audio_buffer *buffer)
Free all structures allocated by buffer implementation and the buffer itself.
Definition audio_buffer.h:46
int(* audio_set_ipc_params)(struct sof_audio_buffer *buffer, struct sof_ipc_stream_params *params, bool force_update)
Configure IPC stream parameters on buffer.
Definition audio_buffer.h:72
int(* on_audio_format_set)(struct sof_audio_buffer *buffer)
Notification callback invoked on audio format modification.
Definition audio_buffer.h:63
int(* set_alignment_constants)(struct sof_audio_buffer *buffer, const uint32_t byte_align, const uint32_t frame_align_req)
Configure alignment constraints on buffer.
Definition audio_buffer.h:82
void(* reset)(struct sof_audio_buffer *buffer)
Clean all buffer data and reset positions to initial state, keeping configuration.
Definition audio_buffer.h:55
Module and pipeline allocation context aggregating a Zephyr heap and optional virtual region.
Definition alloc.h:251
this is a definition of internals of sink API
Definition sink_api.h:69
Base class for all audio buffers.
Definition audio_buffer.h:92
CORE_CHECK_STRUCT_FIELD
Definition audio_buffer.h:93
const struct audio_buffer_ops * ops
Virtual methods table.
Definition audio_buffer.h:123
bool walking
Indicates if the buffer is being walked in pipeline graph.
Definition audio_buffer.h:125
struct sof_source _source_api
Source API interface handler.
Definition audio_buffer.h:119
bool is_shared
Buffer structure is shared between 2 cores.
Definition audio_buffer.h:97
struct sof_audio_stream_params * audio_stream_params
Pointer to effective runtime stream parameters.
Definition audio_buffer.h:116
uint32_t buffer_type
Type of the buffer (BUFFER_TYPE_*)
Definition audio_buffer.h:95
struct mod_alloc_ctx * alloc
Allocation context.
Definition audio_buffer.h:127
struct sof_sink _sink_api
Sink API interface handler.
Definition audio_buffer.h:120
set of parameters describing audio stream this structure is shared between audio_stream....
Definition audio_stream.h:49
uint16_t chmap[SOF_IPC_MAX_CHANNELS]
channel map - SOF_CHMAP_
Definition audio_stream.h:82
enum sof_audio_buffer_state state
audio stream state
Definition audio_stream.h:84
Definition stream.h:71
internals of sink API.
Definition sink_api.h:141
internals of source API.
Definition source_api.h:137
this is a definition of internals of source API
Definition source_api.h:71