14#ifndef __SOF_AUDIO_AUDIO_STREAM_H__
15#define __SOF_AUDIO_AUDIO_STREAM_H__
20#include <sof/compiler_attributes.h>
27#include <ipc4/base-config.h>
28#include <module/audio/audio_stream.h>
186 enum sof_ipc_frame val)
193 enum sof_ipc_frame val)
210 bool underrun_permitted)
216 bool overrun_permitted)
245#define audio_stream_read_frag(buffer, idx, size) \
246 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, size)
256#define audio_stream_read_frag_s16(buffer, idx) \
257 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, sizeof(int16_t))
267#define audio_stream_read_frag_s32(buffer, idx) \
268 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, sizeof(int32_t))
288#define audio_stream_write_frag(buffer, idx, size) \
289 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, size)
299#define audio_stream_write_frag_s16(buffer, idx) \
300 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, sizeof(int16_t))
310#define audio_stream_write_frag_s32(buffer, idx) \
311 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, sizeof(int32_t))
323#define audio_stream_get_frag(buffer, ptr, idx, sample_size) \
324 audio_stream_wrap(buffer, (char *)(ptr) + ((idx) * (sample_size)))
360 const uint32_t frame_align_req,
405 ptr = (
char *)buffer->
addr +
406 ((
char *)ptr - (
char *)buffer->
end_addr);
422 if (ptr < buffer->addr)
423 ptr = (
char *)buffer->
end_addr - ((
char *)buffer->
addr - (
char *)ptr);
425 assert((intptr_t)ptr >= (intptr_t)buffer->
addr);
435static inline uint32_t
447 return stream->
avail;
455static inline uint32_t
467static inline uint32_t
479static inline uint32_t
499static inline uint32_t
511static inline uint32_t
552static inline uint32_t
573static inline uint32_t
580 return MIN(src_frames, sink_frames);
607 uint32_t aligned_frames =
ROUND_DOWN(frames, align);
609 if (aligned_frames < frames)
610 aligned_frames += align;
612 return aligned_frames;
626 return ROUND_DOWN(frames + (align >> 1), align);
637static inline uint32_t
643 uint32_t n =
MIN(src_frames, sink_frames);
656 (
char *)buffer->
w_ptr + bytes);
669 ((
char *)buffer->
r_ptr - (
char *)buffer->
w_ptr);
683 (
char *)buffer->
r_ptr + bytes);
692 ((
char *)buffer->
r_ptr - (
char *)buffer->
w_ptr);
704static inline void audio_stream_sync_to_hw(
struct audio_stream *stream,
705 const struct dma_status *dma_status)
760 uint32_t head_size = bytes;
761 uint32_t tail_size = 0;
764 if ((
char *)buffer->
r_ptr + bytes > (
char *)buffer->
end_addr) {
765 head_size = (
char *)buffer->
end_addr - (
char *)buffer->
r_ptr;
766 tail_size = bytes - head_size;
783 uint32_t head_size = bytes;
784 uint32_t tail_size = 0;
787 if ((
char *)buffer->
w_ptr + bytes > (
char *)buffer->
end_addr) {
788 head_size = (
char *)buffer->
end_addr - (
char *)buffer->
w_ptr;
789 tail_size = bytes - head_size;
808 return (intptr_t)source->
end_addr - (intptr_t)ptr;
822 assert((intptr_t)ptr >= (intptr_t)source->
addr);
823 int to_begin = (intptr_t)ptr - (intptr_t)source->
addr;
834static inline uint32_t
840 assert((intptr_t)wptr >= (intptr_t)source->
addr);
843 if (to_begin > bytes)
844 return (uint32_t *)((intptr_t)wptr - bytes);
846 return (uint32_t *)((intptr_t)source->
end_addr - (bytes - to_begin));
859 int to_end = (int16_t *)source->
end_addr - (int16_t *)ptr;
875 int to_end = (int32_t *)source->
end_addr - (int32_t *)ptr;
891 int to_end = (int32_t *)source->
end_addr - (int32_t *)ptr;
907 assert((intptr_t)buf_end >= (intptr_t)ptr);
908 return (intptr_t)buf_end - (intptr_t)ptr;
918static inline uint32_t
924 return bytes / frame_bytes;
937 struct audio_stream *sink, uint32_t ooffset, uint32_t samples);
949void cir_buf_copy(
const void *src,
const void *src_addr,
const void *src_end,
void *dst,
950 void *dst_addr,
void *dst_end,
size_t byte_size);
962 unsigned int samples);
973 void *linear_sink,
int ooffset,
unsigned int samples);
984 uint32_t head_size = bytes;
985 uint32_t tail_size = 0;
992 if ((
char *)buffer->
w_ptr + bytes > (
char *)buffer->
end_addr) {
993 head_size = (
char *)buffer->
end_addr - (
char *)buffer->
w_ptr;
994 tail_size = bytes - head_size;
997 memset(buffer->
w_ptr, 0, head_size);
999 memset(buffer->
addr, 0, tail_size);
1013 uint32_t head_size = bytes;
1014 uint32_t tail_size = 0;
1017 if ((
char *)ptr + bytes > (
char *)buf_end) {
1018 head_size = (
char *)buf_end - (
char *)ptr;
1019 tail_size = bytes - head_size;
1022 memset(ptr, 0, head_size);
1024 memset(buf_addr, 0, tail_size);
1028 enum ipc4_bit_depth valid,
1029 enum sof_ipc_frame *frame_fmt,
1030 enum sof_ipc_frame *valid_fmt,
1031 enum ipc4_sample_type
type)
1034 *frame_fmt = SOF_IPC_FRAME_INVALID;
1035 *valid_fmt = SOF_IPC_FRAME_INVALID;
1038 case IPC4_TYPE_FLOAT:
1039#ifdef CONFIG_FORMAT_FLOAT
1040 if (depth == 32 && valid == 32) {
1041 *frame_fmt = SOF_IPC_FRAME_FLOAT;
1042 *valid_fmt = SOF_IPC_FRAME_FLOAT;
1047 case IPC4_TYPE_MSB_INTEGER:
1048 case IPC4_TYPE_LSB_INTEGER:
1049 case IPC4_TYPE_SIGNED_INTEGER:
1050 if (depth == 24 && valid == 24) {
1051#ifdef CONFIG_FORMAT_S24_3LE
1052 *frame_fmt = SOF_IPC_FRAME_S24_3LE;
1053 *valid_fmt = SOF_IPC_FRAME_S24_3LE;
1061 *frame_fmt = (
enum sof_ipc_frame)((depth >> 3) - 2);
1062 *valid_fmt = (
enum sof_ipc_frame)((valid >> 3) - 2);
1066 case IPC4_TYPE_UNSIGNED_INTEGER:
1067#ifdef CONFIG_FORMAT_U8
1068 if (depth == 8 && valid == 8) {
1069 *frame_fmt = SOF_IPC_FRAME_U8;
1070 *valid_fmt = SOF_IPC_FRAME_U8;
1075 case IPC4_TYPE_A_LAW:
1076#ifdef CONFIG_FORMAT_A_LAW
1077 if (depth == 8 && valid == 8) {
1078 *frame_fmt = SOF_IPC_FRAME_A_LAW;
1079 *valid_fmt = SOF_IPC_FRAME_A_LAW;
1084 case IPC4_TYPE_MU_LAW:
1085#ifdef CONFIG_FORMAT_MU_LAW
1086 if (depth == 8 && valid == 8) {
1087 *frame_fmt = SOF_IPC_FRAME_MU_LAW;
1088 *valid_fmt = SOF_IPC_FRAME_MU_LAW;
static void dcache_writeback_region(void __sparse_cache *addr, size_t size)
Definition cache.h:38
static void dcache_invalidate_region(void __sparse_cache *addr, size_t size)
Definition cache.h:44
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:919
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:758
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:873
static uint32_t audio_stream_get_avail(const struct audio_stream *buf)
Definition audio_stream.h:105
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:603
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:621
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:390
static void audio_stream_set_end_addr(struct audio_stream *buf, void *val)
Definition audio_stream.h:160
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:889
static void audio_stream_set_valid_fmt(struct audio_stream *buf, enum sof_ipc_frame val)
Definition audio_stream.h:192
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:638
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:857
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:369
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:982
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:456
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:574
static void * audio_stream_get_wptr(const struct audio_stream *buf)
Definition audio_stream.h:85
static void audio_stream_set_underrun(struct audio_stream *buf, bool underrun_permitted)
Definition audio_stream.h:209
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:1027
static void audio_stream_set_frm_fmt(struct audio_stream *buf, enum sof_ipc_frame val)
Definition audio_stream.h:185
static void audio_stream_set_wptr(struct audio_stream *buf, void *val)
Definition audio_stream.h:155
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:589
static void audio_stream_set_rptr(struct audio_stream *buf, void *val)
Definition audio_stream.h:150
static void audio_stream_set_channels(struct audio_stream *buf, uint16_t val)
Definition audio_stream.h:203
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:331
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:402
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:1011
static uint32_t audio_stream_get_buffer_fmt(const struct audio_stream *buf)
Definition audio_stream.h:140
static void audio_stream_reset(struct audio_stream *buffer)
Resets the buffer.
Definition audio_stream.h:731
static void audio_stream_set_overrun(struct audio_stream *buf, bool overrun_permitted)
Definition audio_stream.h:215
static bool audio_stream_get_overrun(const struct audio_stream *buf)
Definition audio_stream.h:145
static void audio_stream_set_avail(struct audio_stream *buf, uint32_t val)
Definition audio_stream.h:175
static enum sof_ipc_frame audio_stream_get_frm_fmt(const struct audio_stream *buf)
Definition audio_stream.h:115
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:342
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:820
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:500
static enum sof_ipc_frame audio_stream_get_valid_fmt(const struct audio_stream *buf)
Definition audio_stream.h:120
static void audio_stream_set_free(struct audio_stream *buf, uint32_t val)
Definition audio_stream.h:180
static void audio_stream_set_addr(struct audio_stream *buf, void *val)
Definition audio_stream.h:165
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:100
static uint32_t audio_stream_get_rate(const struct audio_stream *buf)
Definition audio_stream.h:125
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:805
static int cir_buf_bytes_without_wrap(const void *ptr, const void *buf_end)
Calculates numbers of bytes to buffer wrap when reading stream backwards from current sample pointed ...
Definition audio_stream.h:905
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:653
static void * audio_stream_get_addr(const struct audio_stream *buf)
Definition audio_stream.h:95
static bool audio_stream_get_underrun(const struct audio_stream *buf)
Definition audio_stream.h:135
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:512
static void * audio_stream_get_end_addr(const struct audio_stream *buf)
Definition audio_stream.h:90
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:781
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:680
static uint32_t audio_stream_get_free(const struct audio_stream *buf)
Definition audio_stream.h:110
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:130
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:480
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:528
static void audio_stream_set_rate(struct audio_stream *buf, uint32_t val)
Definition audio_stream.h:198
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:436
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:835
static void * audio_stream_get_rptr(const struct audio_stream *buf)
Definition audio_stream.h:80
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:420
static void audio_stream_set_size(struct audio_stream *buf, uint32_t val)
Definition audio_stream.h:170
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:468
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:553
static void audio_stream_set_buffer_fmt(struct audio_stream *buf, uint32_t buffer_fmt)
Definition audio_stream.h:221
IPC definitions for streams.
#define MIN(a, b)
Definition numbers.h:19
#define ROUND_DOWN(size, alignment)
Definition numbers.h:22
#define assert(x)
Definition panic.h:19
Audio stream is a circular buffer aware of audio format of the data in the buffer so provides API for...
Definition audio_stream.h:52
uint32_t free
Free bytes for writing.
Definition audio_stream.h:56
uint8_t frame_align_req
Definition audio_stream.h:62
uint8_t byte_align_req
Definition audio_stream.h:61
void * end_addr
Buffer end address.
Definition audio_stream.h:60
void * r_ptr
Buffer read position.
Definition audio_stream.h:58
uint32_t avail
Available bytes for reading.
Definition audio_stream.h:55
uint32_t size
Runtime buffer size in bytes (period multiple).
Definition audio_stream.h:54
void * w_ptr
Buffer write pointer.
Definition audio_stream.h:57
struct sof_audio_stream_params runtime_stream_params
Definition audio_stream.h:66
void * addr
Buffer base address.
Definition audio_stream.h:59
Definition audio_stream.h:72
void * buf_start
Definition audio_stream.h:73
void * buf_end
Definition audio_stream.h:74
void * ptr
Definition audio_stream.h:75
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
uint32_t type
Definition tlv.h:0
#define __sparse_force
Definition compiler_attributes.h:12
#define __sparse_cache
Definition compiler_attributes.h:11