14#ifndef __SOF_AUDIO_AUDIO_STREAM_H__
15#define __SOF_AUDIO_AUDIO_STREAM_H__
25#include <ipc/stream.h>
26#include <ipc4/base-config.h>
209 bool underrun_permitted)
215 bool overrun_permitted)
244#define audio_stream_read_frag(buffer, idx, size) \
245 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, size)
255#define audio_stream_read_frag_s16(buffer, idx) \
256 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, sizeof(int16_t))
266#define audio_stream_read_frag_s32(buffer, idx) \
267 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, sizeof(int32_t))
287#define audio_stream_write_frag(buffer, idx, size) \
288 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, size)
298#define audio_stream_write_frag_s16(buffer, idx) \
299 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, sizeof(int16_t))
309#define audio_stream_write_frag_s32(buffer, idx) \
310 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, sizeof(int32_t))
322#define audio_stream_get_frag(buffer, ptr, idx, sample_size) \
323 audio_stream_wrap(buffer, (char *)(ptr) + ((idx) * (sample_size)))
359 const uint32_t frame_align_req,
404 ptr = (
char *)buffer->
addr +
405 ((
char *)ptr - (
char *)buffer->
end_addr);
421 if (ptr < buffer->addr)
422 ptr = (
char *)buffer->
end_addr - ((
char *)buffer->
addr - (
char *)ptr);
424 assert((uintptr_t)ptr >= (uintptr_t)buffer->
addr);
434static inline uint32_t
446 return stream->
avail;
454static inline uint32_t
466static inline uint32_t
478static inline uint32_t
498static inline uint32_t
510static inline uint32_t
551static inline uint32_t
572static inline uint32_t
579 return MIN(src_frames, sink_frames);
593 return ROUND_DOWN(frames, align);
606 uint32_t aligned_frames = ROUND_DOWN(frames, align);
608 if (aligned_frames < frames)
609 aligned_frames += align;
611 return aligned_frames;
625 return ROUND_DOWN(frames + (align >> 1), align);
636static inline uint32_t
642 uint32_t n = MIN(src_frames, sink_frames);
655 (
char *)buffer->
w_ptr + bytes);
668 ((
char *)buffer->
r_ptr - (
char *)buffer->
w_ptr);
682 (
char *)buffer->
r_ptr + bytes);
691 ((
char *)buffer->
r_ptr - (
char *)buffer->
w_ptr);
730 uint32_t head_size = bytes;
731 uint32_t tail_size = 0;
734 if ((
char *)buffer->
r_ptr + bytes > (
char *)buffer->
end_addr) {
735 head_size = (
char *)buffer->
end_addr - (
char *)buffer->
r_ptr;
736 tail_size = bytes - head_size;
753 uint32_t head_size = bytes;
754 uint32_t tail_size = 0;
757 if ((
char *)buffer->
w_ptr + bytes > (
char *)buffer->
end_addr) {
758 head_size = (
char *)buffer->
end_addr - (
char *)buffer->
w_ptr;
759 tail_size = bytes - head_size;
778 return (uintptr_t)source->
end_addr - (uintptr_t)ptr;
792 assert((uintptr_t)ptr >= (uintptr_t)source->
addr);
793 size_t to_begin = (uintptr_t)ptr - (uintptr_t)source->
addr;
804static inline uint32_t
810 assert((uintptr_t)wptr >= (uintptr_t)source->
addr);
813 if (to_begin > bytes)
814 return (uint32_t *)((intptr_t)wptr - bytes);
816 return (uint32_t *)((intptr_t)source->
end_addr - (bytes - to_begin));
829 int to_end = (int16_t *)source->
end_addr - (int16_t *)ptr;
845 int to_end = (int32_t *)source->
end_addr - (int32_t *)ptr;
861 int to_end = (int32_t *)source->
end_addr - (int32_t *)ptr;
874static inline uint32_t
880 return bytes / frame_bytes;
893 struct audio_stream *sink, uint32_t ooffset, uint32_t samples);
905void cir_buf_copy(
const void *src,
const void *src_addr,
const void *src_end,
void *dst,
906 void *dst_addr,
void *dst_end,
size_t byte_size);
918 unsigned int samples);
929 void *linear_sink,
int ooffset,
unsigned int samples);
940 uint32_t head_size = bytes;
941 uint32_t tail_size = 0;
948 if ((
char *)buffer->
w_ptr + bytes > (
char *)buffer->
end_addr) {
949 head_size = (
char *)buffer->
end_addr - (
char *)buffer->
w_ptr;
950 tail_size = bytes - head_size;
953 memset(buffer->
w_ptr, 0, head_size);
955 memset(buffer->
addr, 0, tail_size);
967static inline void cir_buf_set_zero(
void *ptr,
void *buf_addr,
void *buf_end, uint32_t bytes)
969 uint32_t head_size = bytes;
970 uint32_t tail_size = 0;
973 if ((
char *)ptr + bytes > (
char *)buf_end) {
974 head_size = (
char *)buf_end - (
char *)ptr;
975 tail_size = bytes - head_size;
978 memset(ptr, 0, head_size);
980 memset(buf_addr, 0, tail_size);
995#ifdef CONFIG_FORMAT_FLOAT
996 if (depth == 32 && valid == 32) {
1006 if (depth == 24 && valid == 24) {
1007#ifdef CONFIG_FORMAT_S24_3LE
1023#ifdef CONFIG_FORMAT_U8
1024 if (depth == 8 && valid == 8) {
1032#ifdef CONFIG_FORMAT_A_LAW
1033 if (depth == 8 && valid == 8) {
1041#ifdef CONFIG_FORMAT_MU_LAW
1042 if (depth == 8 && valid == 8) {
Memory allocation API, zones, heaps, and alignment utilities.
RTOS data and instruction cache invalidation and writeback helpers.
static void dcache_writeback_region(void *addr, size_t size)
Write back (flush) modified data cache lines to memory.
Definition cache.h:53
static void dcache_invalidate_region(void *addr, size_t size)
Invalidate data cache lines in the specified memory region.
Definition cache.h:67
static uint32_t audio_stream_frames_without_wrap(const struct audio_stream *source, const void *ptr)
Calculates numbers of frames to buffer wrap and return minimum of calculated value.
Definition audio_stream.h:875
static void audio_stream_invalidate(struct audio_stream *buffer, uint32_t bytes)
Invalidates (in DSP d-cache) the buffer in range [r_ptr, r_ptr+bytes], with rollover if necessary.
Definition audio_stream.h:728
static int audio_stream_samples_without_wrap_s24(const struct audio_stream *source, const void *ptr)
Calculates numbers of s24 samples to buffer wrap when buffer is read forward towards end address.
Definition audio_stream.h:843
static uint32_t audio_stream_get_avail(const struct audio_stream *buf)
Definition audio_stream.h:104
void audio_stream_init(struct audio_stream *audio_stream, void *buff_addr, uint32_t size)
Initializes the buffer with specified memory block and size.
static uint32_t audio_stream_align_frames_round_up(const struct audio_stream *stream, uint32_t frames)
Rounds up a frame count to meet the alignment constraint of the stream.
Definition audio_stream.h:602
static uint32_t audio_stream_align_frames_round_nearest(const struct audio_stream *stream, uint32_t frames)
Rounds to nearest a frame count to meet the alignment constraint of the stream.
Definition audio_stream.h:620
static uint32_t audio_stream_period_bytes(const struct audio_stream *buf, uint32_t frames)
Calculates period size in bytes based on component stream's parameters.
Definition audio_stream.h:389
static void audio_stream_set_end_addr(struct audio_stream *buf, void *val)
Definition audio_stream.h:159
static int audio_stream_samples_without_wrap_s32(const struct audio_stream *source, const void *ptr)
Calculates numbers of s32 samples to buffer wrap when buffer is read forward towards end address.
Definition audio_stream.h:859
static void audio_stream_set_valid_fmt(struct audio_stream *buf, enum sof_ipc_frame val)
Definition audio_stream.h:191
static uint32_t audio_stream_avail_frames_aligned(const struct audio_stream *source, const struct audio_stream *sink)
Computes maximum number of frames aligned with source align criteria that can be copied from source b...
Definition audio_stream.h:637
static int audio_stream_samples_without_wrap_s16(const struct audio_stream *source, const void *ptr)
Calculates numbers of s16 samples to buffer wrap when buffer is read forward towards end address.
Definition audio_stream.h:827
int audio_stream_copy(const struct audio_stream *source, uint32_t ioffset, struct audio_stream *sink, uint32_t ooffset, uint32_t samples)
Copies data from source buffer to sink buffer.
void cir_buf_copy(const void *src, const void *src_addr, const void *src_end, void *dst, void *dst_addr, void *dst_end, size_t byte_size)
Copies data from one circular buffer to another circular buffer.
static int audio_stream_set_params(struct audio_stream *buffer, struct sof_ipc_stream_params *params)
Applies parameters to the buffer.
Definition audio_stream.h:368
static int audio_stream_set_zero(struct audio_stream *buffer, uint32_t bytes)
Writes zeros in range [w_ptr, w_ptr+bytes], with rollover if necessary.
Definition audio_stream.h:938
static uint32_t audio_stream_get_avail_samples(const struct audio_stream *stream)
Calculates available data in samples, handling underrun_permitted behaviour.
Definition audio_stream.h:455
static uint32_t audio_stream_avail_frames(const struct audio_stream *source, const struct audio_stream *sink)
Computes maximum number of frames that can be copied from source buffer to sink buffer,...
Definition audio_stream.h:573
static void * audio_stream_get_wptr(const struct audio_stream *buf)
Definition audio_stream.h:84
static void audio_stream_set_underrun(struct audio_stream *buf, bool underrun_permitted)
Definition audio_stream.h:208
static int audio_stream_fmt_conversion(enum ipc4_bit_depth depth, enum ipc4_bit_depth valid, enum sof_ipc_frame *frame_fmt, enum sof_ipc_frame *valid_fmt, enum ipc4_sample_type type)
Definition audio_stream.h:983
static void audio_stream_set_frm_fmt(struct audio_stream *buf, enum sof_ipc_frame val)
Definition audio_stream.h:184
static void audio_stream_set_wptr(struct audio_stream *buf, void *val)
Definition audio_stream.h:154
static uint32_t audio_stream_align_frames_round_down(const struct audio_stream *stream, uint32_t frames)
Rounds down a frame count to meet the alignment constraint of the stream.
Definition audio_stream.h:588
static void audio_stream_set_rptr(struct audio_stream *buf, void *val)
Definition audio_stream.h:149
static void audio_stream_set_channels(struct audio_stream *buf, uint16_t val)
Definition audio_stream.h:202
static uint32_t audio_stream_frame_bytes(const struct audio_stream *buf)
Calculates period size in bytes based on component stream's parameters.
Definition audio_stream.h:330
void audio_stream_recalc_align(struct audio_stream *stream)
static void * audio_stream_wrap(const struct audio_stream *buffer, void *ptr)
Verifies the pointer and performs rollover when reached the end of the buffer.
Definition audio_stream.h:401
static void cir_buf_set_zero(void *ptr, void *buf_addr, void *buf_end, uint32_t bytes)
Writes zeros to circular buffer in range [ptr, ptr+bytes] with rollover if necessary.
Definition audio_stream.h:967
static uint32_t audio_stream_get_buffer_fmt(const struct audio_stream *buf)
Definition audio_stream.h:139
static void audio_stream_reset(struct audio_stream *buffer)
Resets the buffer.
Definition audio_stream.h:701
static void audio_stream_set_overrun(struct audio_stream *buf, bool overrun_permitted)
Definition audio_stream.h:214
static bool audio_stream_get_overrun(const struct audio_stream *buf)
Definition audio_stream.h:144
static void audio_stream_set_avail(struct audio_stream *buf, uint32_t val)
Definition audio_stream.h:174
static enum sof_ipc_frame audio_stream_get_frm_fmt(const struct audio_stream *buf)
Definition audio_stream.h:114
static uint32_t audio_stream_sample_bytes(const struct audio_stream *buf)
Calculates sample size in bytes based on component stream's parameters.
Definition audio_stream.h:341
static int audio_stream_rewind_bytes_without_wrap(const struct audio_stream *source, const void *ptr)
Calculates numbers of bytes to buffer wrap when reading stream backwards from current sample pointed ...
Definition audio_stream.h:790
static uint32_t audio_stream_get_free_samples(const struct audio_stream *stream)
Calculates free space in samples, handling overrun_permitted behaviour.
Definition audio_stream.h:499
static enum sof_ipc_frame audio_stream_get_valid_fmt(const struct audio_stream *buf)
Definition audio_stream.h:119
static void audio_stream_set_free(struct audio_stream *buf, uint32_t val)
Definition audio_stream.h:179
static void audio_stream_set_addr(struct audio_stream *buf, void *val)
Definition audio_stream.h:164
void audio_stream_copy_from_linear(const void *linear_source, int ioffset, struct audio_stream *sink, int ooffset, unsigned int samples)
Copies data from linear source buffer to circular sink buffer.
static uint32_t audio_stream_get_size(const struct audio_stream *buf)
Definition audio_stream.h:99
static uint32_t audio_stream_get_rate(const struct audio_stream *buf)
Definition audio_stream.h:124
void audio_stream_copy_to_linear(const struct audio_stream *source, int ioffset, void *linear_sink, int ooffset, unsigned int samples)
Copies data from circular source buffer to linear sink buffer.
static int audio_stream_bytes_without_wrap(const struct audio_stream *source, const void *ptr)
Calculates numbers of bytes to buffer wrap.
Definition audio_stream.h:775
static void audio_stream_produce(struct audio_stream *buffer, uint32_t bytes)
Updates the buffer state after writing to the buffer.
Definition audio_stream.h:652
static void * audio_stream_get_addr(const struct audio_stream *buf)
Definition audio_stream.h:94
static bool audio_stream_get_underrun(const struct audio_stream *buf)
Definition audio_stream.h:134
static uint32_t audio_stream_get_free_frames(const struct audio_stream *stream)
Calculates free space in frames, handling overrun_permitted behaviour.
Definition audio_stream.h:511
static void * audio_stream_get_end_addr(const struct audio_stream *buf)
Definition audio_stream.h:89
static void audio_stream_writeback(struct audio_stream *buffer, uint32_t bytes)
Writes back (from DSP d-cache) the buffer in range [w_ptr, w_ptr+bytes], with rollover if necessary.
Definition audio_stream.h:751
static void audio_stream_consume(struct audio_stream *buffer, uint32_t bytes)
Updates the buffer state after reading from the buffer.
Definition audio_stream.h:679
static uint32_t audio_stream_get_free(const struct audio_stream *buf)
Definition audio_stream.h:109
void audio_stream_set_align(const uint32_t byte_align, const uint32_t frame_align_req, struct audio_stream *stream)
Set processing alignment requirements.
static uint32_t audio_stream_get_channels(const struct audio_stream *buf)
Definition audio_stream.h:129
static uint32_t audio_stream_get_free_bytes(const struct audio_stream *stream)
Calculates free space in bytes, handling overrun_permitted behaviour.
Definition audio_stream.h:479
static int audio_stream_can_copy_bytes(const struct audio_stream *source, const struct audio_stream *sink, uint32_t bytes)
Verifies whether specified number of bytes can be copied from source buffer to sink buffer.
Definition audio_stream.h:527
static void audio_stream_set_rate(struct audio_stream *buf, uint32_t val)
Definition audio_stream.h:197
static uint32_t audio_stream_get_avail_bytes(const struct audio_stream *stream)
Calculates available data in bytes, handling underrun_permitted behaviour.
Definition audio_stream.h:435
static uint32_t * audio_stream_rewind_wptr_by_bytes(const struct audio_stream *source, const uint32_t bytes)
Calculate position of write pointer to the position before the data was copied to source buffer.
Definition audio_stream.h:805
static void * audio_stream_get_rptr(const struct audio_stream *buf)
Definition audio_stream.h:79
static void * audio_stream_rewind_wrap(const struct audio_stream *buffer, void *ptr)
Verifies the pointer and performs rollover when reached the end of the buffer.
Definition audio_stream.h:419
static void audio_stream_set_size(struct audio_stream *buf, uint32_t val)
Definition audio_stream.h:169
static uint32_t audio_stream_get_avail_frames(const struct audio_stream *stream)
Calculates available data in frames, handling underrun_permitted behaviour.
Definition audio_stream.h:467
static uint32_t audio_stream_get_copy_bytes(const struct audio_stream *source, const struct audio_stream *sink)
Computes maximum number of bytes that can be copied from source buffer to sink buffer,...
Definition audio_stream.h:552
static void audio_stream_set_buffer_fmt(struct audio_stream *buf, uint32_t buffer_fmt)
Definition audio_stream.h:220
Circular audio buffer calculation and wrap utilities for processing modules.
sof_ipc_frame
Definition stream.h:16
@ SOF_IPC_FRAME_A_LAW
Definition stream.h:26
@ SOF_IPC_FRAME_S24_3LE
Definition stream.h:22
@ SOF_IPC_FRAME_MU_LAW
Definition stream.h:27
@ SOF_IPC_FRAME_FLOAT
Definition stream.h:20
@ SOF_IPC_FRAME_INVALID
Definition stream.h:28
@ SOF_IPC_FRAME_U8
Definition stream.h:24
Fixed-point arithmetic, saturation, rounding, and number format conversions.
#define assert(x)
Definition panic.h:19
Audio sink API helpers and stream configuration.
Audio source API helpers and stream configuration.
Audio stream is a circular buffer aware of audio format of the data in the buffer so provides API for...
Definition audio_stream.h:51
uint32_t free
Free bytes for writing.
Definition audio_stream.h:55
uint8_t frame_align_req
Definition audio_stream.h:61
uint8_t byte_align_req
Definition audio_stream.h:60
void * end_addr
Buffer end address.
Definition audio_stream.h:59
void * r_ptr
Buffer read position.
Definition audio_stream.h:57
uint32_t avail
Available bytes for reading.
Definition audio_stream.h:54
uint32_t size
Runtime buffer size in bytes (period multiple)
Definition audio_stream.h:53
void * w_ptr
Buffer write pointer.
Definition audio_stream.h:56
struct sof_audio_stream_params runtime_stream_params
Definition audio_stream.h:65
void * addr
Buffer base address.
Definition audio_stream.h:58
Definition audio_stream.h:71
void * buf_start
Definition audio_stream.h:72
void * buf_end
Definition audio_stream.h:73
void * ptr
Definition audio_stream.h:74
set of parameters describing audio stream this structure is shared between audio_stream....
Definition audio_stream.h:49
enum sof_ipc_frame frame_fmt
Sample data format.
Definition audio_stream.h:52
uint32_t buffer_fmt
enum sof_ipc_buffer_format
Definition audio_stream.h:80
bool underrun_permitted
indicates whether underrun is permitted
Definition audio_stream.h:78
uint16_t align_frame_cnt
align_frame_cnt indicates minimum number of frames that satisfies both byte align and frame align req...
Definition audio_stream.h:68
uint32_t rate
Number of data frames per second [Hz].
Definition audio_stream.h:55
bool overrun_permitted
indicates whether overrun is permitted
Definition audio_stream.h:77
enum sof_ipc_frame valid_sample_fmt
Definition audio_stream.h:53
uint16_t channels
Number of samples in each frame.
Definition audio_stream.h:56
uint16_t channels
Definition stream.h:79
uint32_t rate
Definition stream.h:77
uint32_t frame_fmt
enum sof_ipc_frame
Definition stream.h:75