Sound Open Firmware
Loading...
Searching...
No Matches
audio_stream.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2020 - 2023 Intel Corporation. All rights reserved.
4 *
5 * Author: Karol Trzcinski <karolx.trzcinski@linux.intel.com>
6 */
7
14#ifndef __SOF_AUDIO_AUDIO_STREAM_H__
15#define __SOF_AUDIO_AUDIO_STREAM_H__
16
17#include <sof/audio/format.h>
18#include <sof/audio/sink_api.h>
21#include <rtos/panic.h>
22#include <sof/math/numbers.h>
23#include <rtos/alloc.h>
24#include <rtos/cache.h>
25#include <ipc/stream.h>
26#include <ipc4/base-config.h>
28
29#include <stdbool.h>
30#include <stdint.h>
31
52 /* runtime data */
53 uint32_t size;
54 uint32_t avail;
55 uint32_t free;
56 void *w_ptr;
57 void *r_ptr;
58 void *addr;
59 void *end_addr;
62
63
64 /* runtime stream params */
66};
67
68/* A pointer to data in a ring buffer. Just for convenience to reduce the number of typical
69 * processing function parameters: e.g., just 3 parameters (in, out ptr, and size) instead of 7.
70 */
72 void *buf_start;
73 void *buf_end;
74 void *ptr;
75};
76
78
79static inline void *audio_stream_get_rptr(const struct audio_stream *buf)
80{
81 return buf->r_ptr;
82}
83
84static inline void *audio_stream_get_wptr(const struct audio_stream *buf)
85{
86 return buf->w_ptr;
87}
88
89static inline void *audio_stream_get_end_addr(const struct audio_stream *buf)
90{
91 return buf->end_addr;
92}
93
94static inline void *audio_stream_get_addr(const struct audio_stream *buf)
95{
96 return buf->addr;
97}
98
99static inline uint32_t audio_stream_get_size(const struct audio_stream *buf)
100{
101 return buf->size;
102}
103
104static inline uint32_t audio_stream_get_avail(const struct audio_stream *buf)
105{
106 return buf->avail;
107}
108
109static inline uint32_t audio_stream_get_free(const struct audio_stream *buf)
110{
111 return buf->free;
112}
113
114static inline enum sof_ipc_frame audio_stream_get_frm_fmt(const struct audio_stream *buf)
115{
117}
118
119static inline enum sof_ipc_frame audio_stream_get_valid_fmt(const struct audio_stream *buf)
120{
122}
123
124static inline uint32_t audio_stream_get_rate(const struct audio_stream *buf)
125{
126 return buf->runtime_stream_params.rate;
127}
128
129static inline uint32_t audio_stream_get_channels(const struct audio_stream *buf)
130{
132}
133
134static inline bool audio_stream_get_underrun(const struct audio_stream *buf)
135{
137}
138
139static inline uint32_t audio_stream_get_buffer_fmt(const struct audio_stream *buf)
140{
142}
143
144static inline bool audio_stream_get_overrun(const struct audio_stream *buf)
145{
147}
148
149static inline void audio_stream_set_rptr(struct audio_stream *buf, void *val)
150{
151 buf->r_ptr = val;
152}
153
154static inline void audio_stream_set_wptr(struct audio_stream *buf, void *val)
155{
156 buf->w_ptr = val;
157}
158
159static inline void audio_stream_set_end_addr(struct audio_stream *buf, void *val)
160{
161 buf->end_addr = val;
162}
163
164static inline void audio_stream_set_addr(struct audio_stream *buf, void *val)
165{
166 buf->addr = val;
167}
168
169static inline void audio_stream_set_size(struct audio_stream *buf, uint32_t val)
170{
171 buf->size = val;
172}
173
174static inline void audio_stream_set_avail(struct audio_stream *buf, uint32_t val)
175{
176 buf->avail = val;
177}
178
179static inline void audio_stream_set_free(struct audio_stream *buf, uint32_t val)
180{
181 buf->free = val;
182}
183
184static inline void audio_stream_set_frm_fmt(struct audio_stream *buf,
185 enum sof_ipc_frame val)
186{
189}
190
191static inline void audio_stream_set_valid_fmt(struct audio_stream *buf,
192 enum sof_ipc_frame val)
193{
195}
196
197static inline void audio_stream_set_rate(struct audio_stream *buf, uint32_t val)
198{
199 buf->runtime_stream_params.rate = val;
200}
201
202static inline void audio_stream_set_channels(struct audio_stream *buf, uint16_t val)
203{
206}
207
208static inline void audio_stream_set_underrun(struct audio_stream *buf,
209 bool underrun_permitted)
210{
211 buf->runtime_stream_params.underrun_permitted = underrun_permitted;
212}
213
214static inline void audio_stream_set_overrun(struct audio_stream *buf,
215 bool overrun_permitted)
216{
217 buf->runtime_stream_params.overrun_permitted = overrun_permitted;
218}
219
220static inline void audio_stream_set_buffer_fmt(struct audio_stream *buf,
221 uint32_t buffer_fmt)
222{
223 buf->runtime_stream_params.buffer_fmt = buffer_fmt;
224}
225
244#define audio_stream_read_frag(buffer, idx, size) \
245 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, size)
246
255#define audio_stream_read_frag_s16(buffer, idx) \
256 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, sizeof(int16_t))
257
266#define audio_stream_read_frag_s32(buffer, idx) \
267 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, sizeof(int32_t))
268
287#define audio_stream_write_frag(buffer, idx, size) \
288 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, size)
289
298#define audio_stream_write_frag_s16(buffer, idx) \
299 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, sizeof(int16_t))
300
309#define audio_stream_write_frag_s32(buffer, idx) \
310 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, sizeof(int32_t))
311
322#define audio_stream_get_frag(buffer, ptr, idx, sample_size) \
323 audio_stream_wrap(buffer, (char *)(ptr) + ((idx) * (sample_size)))
324
330static inline uint32_t audio_stream_frame_bytes(const struct audio_stream *buf)
331{
334}
335
341static inline uint32_t audio_stream_sample_bytes(const struct audio_stream *buf)
342{
344}
345
358void audio_stream_set_align(const uint32_t byte_align,
359 const uint32_t frame_align_req,
360 struct audio_stream *stream);
361
368static inline int audio_stream_set_params(struct audio_stream *buffer,
369 struct sof_ipc_stream_params *params)
370{
371 if (!params)
372 return -EINVAL;
373
375 buffer->runtime_stream_params.rate = params->rate;
376 buffer->runtime_stream_params.channels = params->channels;
377
379
380 return 0;
381}
382
389static inline uint32_t audio_stream_period_bytes(const struct audio_stream *buf, uint32_t frames)
390{
391 return frames * audio_stream_frame_bytes(buf);
392}
393
401static inline void *audio_stream_wrap(const struct audio_stream *buffer, void *ptr)
402{
403 if (ptr >= buffer->end_addr)
404 ptr = (char *)buffer->addr +
405 ((char *)ptr - (char *)buffer->end_addr);
406
407 assert((uintptr_t)ptr <= (uintptr_t)buffer->end_addr);
408
409 return ptr;
410}
411
419static inline void *audio_stream_rewind_wrap(const struct audio_stream *buffer, void *ptr)
420{
421 if (ptr < buffer->addr)
422 ptr = (char *)buffer->end_addr - ((char *)buffer->addr - (char *)ptr);
423
424 assert((uintptr_t)ptr >= (uintptr_t)buffer->addr);
425
426 return ptr;
427}
428
434static inline uint32_t
436{
437 /*
438 * In case of underrun-permitted stream, report buffer full instead of
439 * empty. This way, any data present in such stream is processed at
440 * regular pace, but buffer will never be seen as completely empty by
441 * clients, and in turn will not cause underrun/XRUN.
442 */
444 return stream->avail != 0 ? stream->avail : stream->size;
445
446 return stream->avail;
447}
448
454static inline uint32_t
456{
457 return audio_stream_get_avail_bytes(stream) /
459}
460
466static inline uint32_t
468{
469 return audio_stream_get_avail_bytes(stream) /
471}
472
478static inline uint32_t
480{
481 /*
482 * In case of overrun-permitted stream, report buffer empty instead of
483 * full. This way, if there's any actual free space for data it is
484 * processed at regular pace, but buffer will never be seen as
485 * completely full by clients, and in turn will not cause overrun/XRUN.
486 */
488 return stream->free != 0 ? stream->free : stream->size;
489
490 return stream->free;
491}
492
498static inline uint32_t
500{
501 return audio_stream_get_free_bytes(stream) /
503}
504
510static inline uint32_t
512{
513 return audio_stream_get_free_bytes(stream) /
515}
516
527static inline int audio_stream_can_copy_bytes(const struct audio_stream *source,
528 const struct audio_stream *sink,
529 uint32_t bytes)
530{
531 /* check for underrun */
532 if (audio_stream_get_avail_bytes(source) < bytes)
533 return -1;
534
535 /* check for overrun */
536 if (audio_stream_get_free_bytes(sink) < bytes)
537 return 1;
538
539 /* we are good to copy */
540 return 0;
541}
542
551static inline uint32_t
553 const struct audio_stream *sink)
554{
555 uint32_t avail = audio_stream_get_avail_bytes(source);
556 uint32_t free = audio_stream_get_free_bytes(sink);
557
558 if (avail > free)
559 return free;
560 else
561 return avail;
562}
563
572static inline uint32_t
574 const struct audio_stream *sink)
575{
576 uint32_t src_frames = audio_stream_get_avail_frames(source);
577 uint32_t sink_frames = audio_stream_get_free_frames(sink);
578
579 return MIN(src_frames, sink_frames);
580}
581
588static inline uint32_t audio_stream_align_frames_round_down(const struct audio_stream *stream,
589 uint32_t frames)
590{
591 uint16_t align = stream->runtime_stream_params.align_frame_cnt;
592
593 return ROUND_DOWN(frames, align);
594}
595
602static inline uint32_t audio_stream_align_frames_round_up(const struct audio_stream *stream,
603 uint32_t frames)
604{
605 uint16_t align = stream->runtime_stream_params.align_frame_cnt;
606 uint32_t aligned_frames = ROUND_DOWN(frames, align);
607
608 if (aligned_frames < frames)
609 aligned_frames += align;
610
611 return aligned_frames;
612}
613
620static inline uint32_t audio_stream_align_frames_round_nearest(const struct audio_stream *stream,
621 uint32_t frames)
622{
623 uint16_t align = stream->runtime_stream_params.align_frame_cnt;
624
625 return ROUND_DOWN(frames + (align >> 1), align);
626}
627
636static inline uint32_t
638 const struct audio_stream *sink)
639{
640 uint32_t src_frames = audio_stream_get_avail_frames(source);
641 uint32_t sink_frames = audio_stream_get_free_frames(sink);
642 uint32_t n = MIN(src_frames, sink_frames);
643
644 return audio_stream_align_frames_round_down(source, n);
645}
646
652static inline void audio_stream_produce(struct audio_stream *buffer, uint32_t bytes)
653{
654 buffer->w_ptr = audio_stream_wrap(buffer,
655 (char *)buffer->w_ptr + bytes);
656
657 /* "overwrite" old data in circular wrap case */
658 if (bytes > audio_stream_get_free_bytes(buffer))
659 buffer->r_ptr = buffer->w_ptr;
660
661 /* calculate available bytes */
662 if (buffer->r_ptr < buffer->w_ptr)
663 buffer->avail = (char *)buffer->w_ptr - (char *)buffer->r_ptr;
664 else if (buffer->r_ptr == buffer->w_ptr)
665 buffer->avail = buffer->size; /* full */
666 else
667 buffer->avail = buffer->size -
668 ((char *)buffer->r_ptr - (char *)buffer->w_ptr);
669
670 /* calculate free bytes */
671 buffer->free = buffer->size - buffer->avail;
672}
673
679static inline void audio_stream_consume(struct audio_stream *buffer, uint32_t bytes)
680{
681 buffer->r_ptr = audio_stream_wrap(buffer,
682 (char *)buffer->r_ptr + bytes);
683
684 /* calculate available bytes */
685 if (buffer->r_ptr < buffer->w_ptr)
686 buffer->avail = (char *)buffer->w_ptr - (char *)buffer->r_ptr;
687 else if (buffer->r_ptr == buffer->w_ptr)
688 buffer->avail = 0; /* empty */
689 else
690 buffer->avail = buffer->size -
691 ((char *)buffer->r_ptr - (char *)buffer->w_ptr);
692
693 /* calculate free bytes */
694 buffer->free = buffer->size - buffer->avail;
695}
696
701static inline void audio_stream_reset(struct audio_stream *buffer)
702{
703 /* reset read and write pointer to buffer bas */
704 buffer->w_ptr = buffer->addr;
705 buffer->r_ptr = buffer->addr;
706
707 /* free space is buffer size */
708 buffer->free = buffer->size;
709
710 /* there are no avail samples at reset */
711 buffer->avail = 0;
712}
713
720void audio_stream_init(struct audio_stream *audio_stream, void *buff_addr, uint32_t size);
721
728static inline void audio_stream_invalidate(struct audio_stream *buffer, uint32_t bytes)
729{
730 uint32_t head_size = bytes;
731 uint32_t tail_size = 0;
732
733 /* check for potential wrap */
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;
737 }
738
739 dcache_invalidate_region((__sparse_force void __sparse_cache *)buffer->r_ptr, head_size);
740 if (tail_size)
741 dcache_invalidate_region((__sparse_force void __sparse_cache *)buffer->addr,
742 tail_size);
743}
744
751static inline void audio_stream_writeback(struct audio_stream *buffer, uint32_t bytes)
752{
753 uint32_t head_size = bytes;
754 uint32_t tail_size = 0;
755
756 /* check for potential wrap */
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;
760 }
761
762 dcache_writeback_region((__sparse_force void __sparse_cache *)buffer->w_ptr, head_size);
763 if (tail_size)
764 dcache_writeback_region((__sparse_force void __sparse_cache *)buffer->addr,
765 tail_size);
766}
767
774static inline int
775audio_stream_bytes_without_wrap(const struct audio_stream *source, const void *ptr)
776{
777 assert((uintptr_t)source->end_addr >= (uintptr_t)ptr);
778 return (uintptr_t)source->end_addr - (uintptr_t)ptr;
779}
780
789static inline int
790audio_stream_rewind_bytes_without_wrap(const struct audio_stream *source, const void *ptr)
791{
792 assert((uintptr_t)ptr >= (uintptr_t)source->addr);
793 size_t to_begin = (uintptr_t)ptr - (uintptr_t)source->addr;
794 return to_begin;
795}
796
804static inline uint32_t
805*audio_stream_rewind_wptr_by_bytes(const struct audio_stream *source, const uint32_t bytes)
806{
807 void *wptr = audio_stream_get_wptr(source);
808 int to_begin = audio_stream_rewind_bytes_without_wrap(source, wptr);
809
810 assert((uintptr_t)wptr >= (uintptr_t)source->addr);
811 assert((uintptr_t)source->end_addr > (uintptr_t)wptr);
812
813 if (to_begin > bytes)
814 return (uint32_t *)((intptr_t)wptr - bytes);
815 else
816 return (uint32_t *)((intptr_t)source->end_addr - (bytes - to_begin));
817}
818
826static inline int
827audio_stream_samples_without_wrap_s16(const struct audio_stream *source, const void *ptr)
828{
829 int to_end = (int16_t *)source->end_addr - (int16_t *)ptr;
830
831 assert((uintptr_t)source->end_addr >= (uintptr_t)ptr);
832 return to_end;
833}
834
842static inline int
843audio_stream_samples_without_wrap_s24(const struct audio_stream *source, const void *ptr)
844{
845 int to_end = (int32_t *)source->end_addr - (int32_t *)ptr;
846
847 assert((uintptr_t)source->end_addr >= (uintptr_t)ptr);
848 return to_end;
849}
850
858static inline int
859audio_stream_samples_without_wrap_s32(const struct audio_stream *source, const void *ptr)
860{
861 int to_end = (int32_t *)source->end_addr - (int32_t *)ptr;
862
863 assert((uintptr_t)source->end_addr >= (uintptr_t)ptr);
864 return to_end;
865}
866
874static inline uint32_t
875audio_stream_frames_without_wrap(const struct audio_stream *source, const void *ptr)
876{
877 uint32_t bytes = audio_stream_bytes_without_wrap(source, ptr);
878 uint32_t frame_bytes = audio_stream_frame_bytes(source);
879
880 return bytes / frame_bytes;
881}
882
892int audio_stream_copy(const struct audio_stream *source, uint32_t ioffset,
893 struct audio_stream *sink, uint32_t ooffset, uint32_t samples);
894
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);
907
916void audio_stream_copy_from_linear(const void *linear_source, int ioffset,
917 struct audio_stream *sink, int ooffset,
918 unsigned int samples);
919
928void audio_stream_copy_to_linear(const struct audio_stream *source, int ioffset,
929 void *linear_sink, int ooffset, unsigned int samples);
930
938static inline int audio_stream_set_zero(struct audio_stream *buffer, uint32_t bytes)
939{
940 uint32_t head_size = bytes;
941 uint32_t tail_size = 0;
942
943 /* check for overrun */
944 if (audio_stream_get_free_bytes(buffer) < bytes)
945 return 1;
946
947 /* check for potential wrap */
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;
951 }
952
953 memset(buffer->w_ptr, 0, head_size);
954 if (tail_size)
955 memset(buffer->addr, 0, tail_size);
956
957 return 0;
958}
959
967static inline void cir_buf_set_zero(void *ptr, void *buf_addr, void *buf_end, uint32_t bytes)
968{
969 uint32_t head_size = bytes;
970 uint32_t tail_size = 0;
971
972 /* check for potential wrap */
973 if ((char *)ptr + bytes > (char *)buf_end) {
974 head_size = (char *)buf_end - (char *)ptr;
975 tail_size = bytes - head_size;
976 }
977
978 memset(ptr, 0, head_size);
979 if (tail_size)
980 memset(buf_addr, 0, tail_size);
981}
982
983static inline int audio_stream_fmt_conversion(enum ipc4_bit_depth depth,
984 enum ipc4_bit_depth valid,
985 enum sof_ipc_frame *frame_fmt,
986 enum sof_ipc_frame *valid_fmt,
988{
989 int ret = -EINVAL;
990 *frame_fmt = SOF_IPC_FRAME_INVALID;
991 *valid_fmt = SOF_IPC_FRAME_INVALID;
992
993 switch (type) {
994 case IPC4_TYPE_FLOAT:
995#ifdef CONFIG_FORMAT_FLOAT
996 if (depth == 32 && valid == 32) {
997 *frame_fmt = SOF_IPC_FRAME_FLOAT;
998 *valid_fmt = SOF_IPC_FRAME_FLOAT;
999 ret = 0;
1000 }
1001#endif
1002 break;
1006 if (depth == 24 && valid == 24) {
1007#ifdef CONFIG_FORMAT_S24_3LE
1008 *frame_fmt = SOF_IPC_FRAME_S24_3LE;
1009 *valid_fmt = SOF_IPC_FRAME_S24_3LE;
1010 ret = 0;
1011#endif
1012 } else {
1013 /* IPC4_DEPTH_16BIT (16) <---> SOF_IPC_FRAME_S16_LE (0)
1014 * IPC4_DEPTH_24BIT (24) <---> SOF_IPC_FRAME_S24_4LE (1)
1015 * IPC4_DEPTH_32BIT (32) <---> SOF_IPC_FRAME_S32_LE (2)
1016 */
1017 *frame_fmt = (enum sof_ipc_frame)((depth >> 3) - 2);
1018 *valid_fmt = (enum sof_ipc_frame)((valid >> 3) - 2);
1019 ret = 0;
1020 }
1021 break;
1023#ifdef CONFIG_FORMAT_U8
1024 if (depth == 8 && valid == 8) {
1025 *frame_fmt = SOF_IPC_FRAME_U8;
1026 *valid_fmt = SOF_IPC_FRAME_U8;
1027 ret = 0;
1028 }
1029#endif /* CONFIG_FORMAT_U8 */
1030 break;
1031 case IPC4_TYPE_A_LAW:
1032#ifdef CONFIG_FORMAT_A_LAW
1033 if (depth == 8 && valid == 8) {
1034 *frame_fmt = SOF_IPC_FRAME_A_LAW;
1035 *valid_fmt = SOF_IPC_FRAME_A_LAW;
1036 ret = 0;
1037 }
1038#endif
1039 break;
1040 case IPC4_TYPE_MU_LAW:
1041#ifdef CONFIG_FORMAT_MU_LAW
1042 if (depth == 8 && valid == 8) {
1043 *frame_fmt = SOF_IPC_FRAME_MU_LAW;
1044 *valid_fmt = SOF_IPC_FRAME_MU_LAW;
1045 ret = 0;
1046 }
1047#endif
1048 break;
1049 }
1050 return ret;
1051}
1054#endif /* __SOF_AUDIO_AUDIO_STREAM_H__ */
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
ipc4_bit_depth
Container bit depth for sample storage in memory.
Definition base-config.h:58
ipc4_sample_type
Audio sample representation and arithmetic type.
Definition base-config.h:118
@ IPC4_TYPE_LSB_INTEGER
Integer with valid bits LSB-aligned in container (e.g.
Definition base-config.h:120
@ IPC4_TYPE_A_LAW
ITU-T G.711 A-law companded audio.
Definition base-config.h:124
@ IPC4_TYPE_MSB_INTEGER
Integer with valid bits MSB-aligned in container (e.g.
Definition base-config.h:119
@ IPC4_TYPE_UNSIGNED_INTEGER
Unsigned integer PCM.
Definition base-config.h:122
@ IPC4_TYPE_FLOAT
32-bit IEEE 754 floating point.
Definition base-config.h:123
@ IPC4_TYPE_SIGNED_INTEGER
Standard 2's complement signed integer (e.g.
Definition base-config.h:121
@ IPC4_TYPE_MU_LAW
ITU-T G.711 mu-law companded audio.
Definition base-config.h:125
uint32_t type
Message type, symmetric to the incoming request.
Definition header.h:8
Circular audio buffer calculation and wrap utilities for processing modules.
static uint32_t get_sample_bytes(enum sof_ipc_frame fmt)
Get the byte size of a single audio sample for a given frame format.
Definition format.h:28
static uint32_t get_frame_bytes(enum sof_ipc_frame fmt, uint32_t channels)
Get the byte size of an entire multi-channel audio frame.
Definition format.h:72
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
Definition stream.h:71
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