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
13
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>
20#include <sof/compiler_attributes.h>
21#include <rtos/panic.h>
22#include <sof/math/numbers.h>
23#include <sof/lib/dma.h>
24#include <rtos/alloc.h>
25#include <rtos/cache.h>
26#include <ipc/stream.h>
27#include <ipc4/base-config.h>
28#include <module/audio/audio_stream.h>
29
30#include <stdbool.h>
31#include <stdint.h>
32
36
53 /* runtime data */
54 uint32_t size;
55 uint32_t avail;
56 uint32_t free;
57 void *w_ptr;
58 void *r_ptr;
59 void *addr;
60 void *end_addr;
63
64
65 /* runtime stream params */
66 struct sof_audio_stream_params runtime_stream_params;
67};
68
69/* A pointer to data in a ring buffer. Just for convenience to reduce the number of typical
70 * processing function parameters: e.g., just 3 parameters (in, out ptr, and size) instead of 7.
71 */
73 void *buf_start;
74 void *buf_end;
75 void *ptr;
76};
77
79
80static inline void *audio_stream_get_rptr(const struct audio_stream *buf)
81{
82 return buf->r_ptr;
83}
84
85static inline void *audio_stream_get_wptr(const struct audio_stream *buf)
86{
87 return buf->w_ptr;
88}
89
90static inline void *audio_stream_get_end_addr(const struct audio_stream *buf)
91{
92 return buf->end_addr;
93}
94
95static inline void *audio_stream_get_addr(const struct audio_stream *buf)
96{
97 return buf->addr;
98}
99
100static inline uint32_t audio_stream_get_size(const struct audio_stream *buf)
101{
102 return buf->size;
103}
104
105static inline uint32_t audio_stream_get_avail(const struct audio_stream *buf)
106{
107 return buf->avail;
108}
109
110static inline uint32_t audio_stream_get_free(const struct audio_stream *buf)
111{
112 return buf->free;
113}
114
115static inline enum sof_ipc_frame audio_stream_get_frm_fmt(const struct audio_stream *buf)
116{
117 return buf->runtime_stream_params.frame_fmt;
118}
119
120static inline enum sof_ipc_frame audio_stream_get_valid_fmt(const struct audio_stream *buf)
121{
122 return buf->runtime_stream_params.valid_sample_fmt;
123}
124
125static inline uint32_t audio_stream_get_rate(const struct audio_stream *buf)
126{
127 return buf->runtime_stream_params.rate;
128}
129
130static inline uint32_t audio_stream_get_channels(const struct audio_stream *buf)
131{
132 return buf->runtime_stream_params.channels;
133}
134
135static inline bool audio_stream_get_underrun(const struct audio_stream *buf)
136{
137 return buf->runtime_stream_params.underrun_permitted;
138}
139
140static inline uint32_t audio_stream_get_buffer_fmt(const struct audio_stream *buf)
141{
142 return buf->runtime_stream_params.buffer_fmt;
143}
144
145static inline bool audio_stream_get_overrun(const struct audio_stream *buf)
146{
147 return buf->runtime_stream_params.overrun_permitted;
148}
149
150static inline void audio_stream_set_rptr(struct audio_stream *buf, void *val)
151{
152 buf->r_ptr = val;
153}
154
155static inline void audio_stream_set_wptr(struct audio_stream *buf, void *val)
156{
157 buf->w_ptr = val;
158}
159
160static inline void audio_stream_set_end_addr(struct audio_stream *buf, void *val)
161{
162 buf->end_addr = val;
163}
164
165static inline void audio_stream_set_addr(struct audio_stream *buf, void *val)
166{
167 buf->addr = val;
168}
169
170static inline void audio_stream_set_size(struct audio_stream *buf, uint32_t val)
171{
172 buf->size = val;
173}
174
175static inline void audio_stream_set_avail(struct audio_stream *buf, uint32_t val)
176{
177 buf->avail = val;
178}
179
180static inline void audio_stream_set_free(struct audio_stream *buf, uint32_t val)
181{
182 buf->free = val;
183}
184
185static inline void audio_stream_set_frm_fmt(struct audio_stream *buf,
186 enum sof_ipc_frame val)
187{
188 buf->runtime_stream_params.frame_fmt = val;
190}
191
192static inline void audio_stream_set_valid_fmt(struct audio_stream *buf,
193 enum sof_ipc_frame val)
194{
195 buf->runtime_stream_params.valid_sample_fmt = val;
196}
197
198static inline void audio_stream_set_rate(struct audio_stream *buf, uint32_t val)
199{
200 buf->runtime_stream_params.rate = val;
201}
202
203static inline void audio_stream_set_channels(struct audio_stream *buf, uint16_t val)
204{
205 buf->runtime_stream_params.channels = val;
207}
208
209static inline void audio_stream_set_underrun(struct audio_stream *buf,
210 bool underrun_permitted)
211{
212 buf->runtime_stream_params.underrun_permitted = underrun_permitted;
213}
214
215static inline void audio_stream_set_overrun(struct audio_stream *buf,
216 bool overrun_permitted)
217{
218 buf->runtime_stream_params.overrun_permitted = overrun_permitted;
219}
220
221static inline void audio_stream_set_buffer_fmt(struct audio_stream *buf,
222 uint32_t buffer_fmt)
223{
224 buf->runtime_stream_params.buffer_fmt = buffer_fmt;
225}
226
245#define audio_stream_read_frag(buffer, idx, size) \
246 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, size)
247
256#define audio_stream_read_frag_s16(buffer, idx) \
257 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, sizeof(int16_t))
258
267#define audio_stream_read_frag_s32(buffer, idx) \
268 audio_stream_get_frag(buffer, (buffer)->r_ptr, idx, sizeof(int32_t))
269
288#define audio_stream_write_frag(buffer, idx, size) \
289 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, size)
290
299#define audio_stream_write_frag_s16(buffer, idx) \
300 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, sizeof(int16_t))
301
310#define audio_stream_write_frag_s32(buffer, idx) \
311 audio_stream_get_frag(buffer, (buffer)->w_ptr, idx, sizeof(int32_t))
312
323#define audio_stream_get_frag(buffer, ptr, idx, sample_size) \
324 audio_stream_wrap(buffer, (char *)(ptr) + ((idx) * (sample_size)))
325
331static inline uint32_t audio_stream_frame_bytes(const struct audio_stream *buf)
332{
333 return get_frame_bytes(buf->runtime_stream_params.frame_fmt,
334 buf->runtime_stream_params.channels);
335}
336
342static inline uint32_t audio_stream_sample_bytes(const struct audio_stream *buf)
343{
344 return get_sample_bytes(buf->runtime_stream_params.frame_fmt);
345}
346
359void audio_stream_set_align(const uint32_t byte_align,
360 const uint32_t frame_align_req,
361 struct audio_stream *stream);
362
369static inline int audio_stream_set_params(struct audio_stream *buffer,
370 struct sof_ipc_stream_params *params)
371{
372 if (!params)
373 return -EINVAL;
374
375 buffer->runtime_stream_params.frame_fmt = (enum sof_ipc_frame)params->frame_fmt;
376 buffer->runtime_stream_params.rate = params->rate;
377 buffer->runtime_stream_params.channels = params->channels;
378
380
381 return 0;
382}
383
390static inline uint32_t audio_stream_period_bytes(const struct audio_stream *buf, uint32_t frames)
391{
392 return frames * audio_stream_frame_bytes(buf);
393}
394
402static inline void *audio_stream_wrap(const struct audio_stream *buffer, void *ptr)
403{
404 if (ptr >= buffer->end_addr)
405 ptr = (char *)buffer->addr +
406 ((char *)ptr - (char *)buffer->end_addr);
407
408 assert((intptr_t)ptr <= (intptr_t)buffer->end_addr);
409
410 return ptr;
411}
412
420static inline void *audio_stream_rewind_wrap(const struct audio_stream *buffer, void *ptr)
421{
422 if (ptr < buffer->addr)
423 ptr = (char *)buffer->end_addr - ((char *)buffer->addr - (char *)ptr);
424
425 assert((intptr_t)ptr >= (intptr_t)buffer->addr);
426
427 return ptr;
428}
429
435static inline uint32_t
437{
438 /*
439 * In case of underrun-permitted stream, report buffer full instead of
440 * empty. This way, any data present in such stream is processed at
441 * regular pace, but buffer will never be seen as completely empty by
442 * clients, and in turn will not cause underrun/XRUN.
443 */
444 if (stream->runtime_stream_params.underrun_permitted)
445 return stream->avail != 0 ? stream->avail : stream->size;
446
447 return stream->avail;
448}
449
455static inline uint32_t
457{
458 return audio_stream_get_avail_bytes(stream) /
460}
461
467static inline uint32_t
469{
470 return audio_stream_get_avail_bytes(stream) /
472}
473
479static inline uint32_t
481{
482 /*
483 * In case of overrun-permitted stream, report buffer empty instead of
484 * full. This way, if there's any actual free space for data it is
485 * processed at regular pace, but buffer will never be seen as
486 * completely full by clients, and in turn will not cause overrun/XRUN.
487 */
488 if (stream->runtime_stream_params.overrun_permitted)
489 return stream->free != 0 ? stream->free : stream->size;
490
491 return stream->free;
492}
493
499static inline uint32_t
501{
502 return audio_stream_get_free_bytes(stream) /
504}
505
511static inline uint32_t
513{
514 return audio_stream_get_free_bytes(stream) /
516}
517
528static inline int audio_stream_can_copy_bytes(const struct audio_stream *source,
529 const struct audio_stream *sink,
530 uint32_t bytes)
531{
532 /* check for underrun */
533 if (audio_stream_get_avail_bytes(source) < bytes)
534 return -1;
535
536 /* check for overrun */
537 if (audio_stream_get_free_bytes(sink) < bytes)
538 return 1;
539
540 /* we are good to copy */
541 return 0;
542}
543
552static inline uint32_t
554 const struct audio_stream *sink)
555{
556 uint32_t avail = audio_stream_get_avail_bytes(source);
557 uint32_t free = audio_stream_get_free_bytes(sink);
558
559 if (avail > free)
560 return free;
561 else
562 return avail;
563}
564
573static inline uint32_t
575 const struct audio_stream *sink)
576{
577 uint32_t src_frames = audio_stream_get_avail_frames(source);
578 uint32_t sink_frames = audio_stream_get_free_frames(sink);
579
580 return MIN(src_frames, sink_frames);
581}
582
589static inline uint32_t audio_stream_align_frames_round_down(const struct audio_stream *stream,
590 uint32_t frames)
591{
592 uint16_t align = stream->runtime_stream_params.align_frame_cnt;
593
594 return ROUND_DOWN(frames, align);
595}
596
603static inline uint32_t audio_stream_align_frames_round_up(const struct audio_stream *stream,
604 uint32_t frames)
605{
606 uint16_t align = stream->runtime_stream_params.align_frame_cnt;
607 uint32_t aligned_frames = ROUND_DOWN(frames, align);
608
609 if (aligned_frames < frames)
610 aligned_frames += align;
611
612 return aligned_frames;
613}
614
621static inline uint32_t audio_stream_align_frames_round_nearest(const struct audio_stream *stream,
622 uint32_t frames)
623{
624 uint16_t align = stream->runtime_stream_params.align_frame_cnt;
625
626 return ROUND_DOWN(frames + (align >> 1), align);
627}
628
637static inline uint32_t
639 const struct audio_stream *sink)
640{
641 uint32_t src_frames = audio_stream_get_avail_frames(source);
642 uint32_t sink_frames = audio_stream_get_free_frames(sink);
643 uint32_t n = MIN(src_frames, sink_frames);
644
645 return audio_stream_align_frames_round_down(source, n);
646}
647
653static inline void audio_stream_produce(struct audio_stream *buffer, uint32_t bytes)
654{
655 buffer->w_ptr = audio_stream_wrap(buffer,
656 (char *)buffer->w_ptr + bytes);
657
658 /* "overwrite" old data in circular wrap case */
659 if (bytes > audio_stream_get_free_bytes(buffer))
660 buffer->r_ptr = buffer->w_ptr;
661
662 /* calculate available bytes */
663 if (buffer->r_ptr < buffer->w_ptr)
664 buffer->avail = (char *)buffer->w_ptr - (char *)buffer->r_ptr;
665 else if (buffer->r_ptr == buffer->w_ptr)
666 buffer->avail = buffer->size; /* full */
667 else
668 buffer->avail = buffer->size -
669 ((char *)buffer->r_ptr - (char *)buffer->w_ptr);
670
671 /* calculate free bytes */
672 buffer->free = buffer->size - buffer->avail;
673}
674
680static inline void audio_stream_consume(struct audio_stream *buffer, uint32_t bytes)
681{
682 buffer->r_ptr = audio_stream_wrap(buffer,
683 (char *)buffer->r_ptr + bytes);
684
685 /* calculate available bytes */
686 if (buffer->r_ptr < buffer->w_ptr)
687 buffer->avail = (char *)buffer->w_ptr - (char *)buffer->r_ptr;
688 else if (buffer->r_ptr == buffer->w_ptr)
689 buffer->avail = 0; /* empty */
690 else
691 buffer->avail = buffer->size -
692 ((char *)buffer->r_ptr - (char *)buffer->w_ptr);
693
694 /* calculate free bytes */
695 buffer->free = buffer->size - buffer->avail;
696}
697
698#ifdef __ZEPHYR__
704static inline void audio_stream_sync_to_hw(struct audio_stream *stream,
705 const struct dma_status *dma_status)
706{
707 uintptr_t buf_start = (uintptr_t)audio_stream_get_addr(stream);
708
709 /* Note: It is assumed here that dma_status values are reported as bytes. However,
710 * this is actually platform-specific. Although unlikely, they could be, for example,
711 * words on some particular platform, and changes should be made here to address
712 * such case.
713 */
714
715 assert(dma_status->write_position < audio_stream_get_size(stream));
716 assert(dma_status->read_position < audio_stream_get_size(stream));
717 assert(dma_status->pending_length <= audio_stream_get_size(stream));
718 assert(dma_status->free <= audio_stream_get_size(stream));
719
720 audio_stream_set_wptr(stream, (void *)(buf_start + dma_status->write_position));
721 audio_stream_set_rptr(stream, (void *)(buf_start + dma_status->read_position));
722 audio_stream_set_avail(stream, dma_status->pending_length);
723 audio_stream_set_free(stream, dma_status->free);
724}
725#endif /* __ZEPHYR__ */
726
731static inline void audio_stream_reset(struct audio_stream *buffer)
732{
733 /* reset read and write pointer to buffer bas */
734 buffer->w_ptr = buffer->addr;
735 buffer->r_ptr = buffer->addr;
736
737 /* free space is buffer size */
738 buffer->free = buffer->size;
739
740 /* there are no avail samples at reset */
741 buffer->avail = 0;
742}
743
750void audio_stream_init(struct audio_stream *audio_stream, void *buff_addr, uint32_t size);
751
758static inline void audio_stream_invalidate(struct audio_stream *buffer, uint32_t bytes)
759{
760 uint32_t head_size = bytes;
761 uint32_t tail_size = 0;
762
763 /* check for potential wrap */
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;
767 }
768
770 if (tail_size)
772 tail_size);
773}
774
781static inline void audio_stream_writeback(struct audio_stream *buffer, uint32_t bytes)
782{
783 uint32_t head_size = bytes;
784 uint32_t tail_size = 0;
785
786 /* check for potential wrap */
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;
790 }
791
793 if (tail_size)
795 tail_size);
796}
797
804static inline int
805audio_stream_bytes_without_wrap(const struct audio_stream *source, const void *ptr)
806{
807 assert((intptr_t)source->end_addr >= (intptr_t)ptr);
808 return (intptr_t)source->end_addr - (intptr_t)ptr;
809}
810
819static inline int
820audio_stream_rewind_bytes_without_wrap(const struct audio_stream *source, const void *ptr)
821{
822 assert((intptr_t)ptr >= (intptr_t)source->addr);
823 int to_begin = (intptr_t)ptr - (intptr_t)source->addr;
824 return to_begin;
825}
826
834static inline uint32_t
835*audio_stream_rewind_wptr_by_bytes(const struct audio_stream *source, const uint32_t bytes)
836{
837 void *wptr = audio_stream_get_wptr(source);
838 int to_begin = audio_stream_rewind_bytes_without_wrap(source, wptr);
839
840 assert((intptr_t)wptr >= (intptr_t)source->addr);
841 assert((intptr_t)source->end_addr > (intptr_t)wptr);
842
843 if (to_begin > bytes)
844 return (uint32_t *)((intptr_t)wptr - bytes);
845 else
846 return (uint32_t *)((intptr_t)source->end_addr - (bytes - to_begin));
847}
848
856static inline int
857audio_stream_samples_without_wrap_s16(const struct audio_stream *source, const void *ptr)
858{
859 int to_end = (int16_t *)source->end_addr - (int16_t *)ptr;
860
861 assert((intptr_t)source->end_addr >= (intptr_t)ptr);
862 return to_end;
863}
864
872static inline int
873audio_stream_samples_without_wrap_s24(const struct audio_stream *source, const void *ptr)
874{
875 int to_end = (int32_t *)source->end_addr - (int32_t *)ptr;
876
877 assert((intptr_t)source->end_addr >= (intptr_t)ptr);
878 return to_end;
879}
880
888static inline int
889audio_stream_samples_without_wrap_s32(const struct audio_stream *source, const void *ptr)
890{
891 int to_end = (int32_t *)source->end_addr - (int32_t *)ptr;
892
893 assert((intptr_t)source->end_addr >= (intptr_t)ptr);
894 return to_end;
895}
896
905static inline int cir_buf_bytes_without_wrap(const void *ptr, const void *buf_end)
906{
907 assert((intptr_t)buf_end >= (intptr_t)ptr);
908 return (intptr_t)buf_end - (intptr_t)ptr;
909}
910
918static inline uint32_t
919audio_stream_frames_without_wrap(const struct audio_stream *source, const void *ptr)
920{
921 uint32_t bytes = audio_stream_bytes_without_wrap(source, ptr);
922 uint32_t frame_bytes = audio_stream_frame_bytes(source);
923
924 return bytes / frame_bytes;
925}
926
936int audio_stream_copy(const struct audio_stream *source, uint32_t ioffset,
937 struct audio_stream *sink, uint32_t ooffset, uint32_t samples);
938
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);
951
960void audio_stream_copy_from_linear(const void *linear_source, int ioffset,
961 struct audio_stream *sink, int ooffset,
962 unsigned int samples);
963
972void audio_stream_copy_to_linear(const struct audio_stream *source, int ioffset,
973 void *linear_sink, int ooffset, unsigned int samples);
974
982static inline int audio_stream_set_zero(struct audio_stream *buffer, uint32_t bytes)
983{
984 uint32_t head_size = bytes;
985 uint32_t tail_size = 0;
986
987 /* check for overrun */
988 if (audio_stream_get_free_bytes(buffer) < bytes)
989 return 1;
990
991 /* check for potential wrap */
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;
995 }
996
997 memset(buffer->w_ptr, 0, head_size);
998 if (tail_size)
999 memset(buffer->addr, 0, tail_size);
1000
1001 return 0;
1002}
1003
1011static inline void cir_buf_set_zero(void *ptr, void *buf_addr, void *buf_end, uint32_t bytes)
1012{
1013 uint32_t head_size = bytes;
1014 uint32_t tail_size = 0;
1015
1016 /* check for potential wrap */
1017 if ((char *)ptr + bytes > (char *)buf_end) {
1018 head_size = (char *)buf_end - (char *)ptr;
1019 tail_size = bytes - head_size;
1020 }
1021
1022 memset(ptr, 0, head_size);
1023 if (tail_size)
1024 memset(buf_addr, 0, tail_size);
1025}
1026
1027static inline int audio_stream_fmt_conversion(enum ipc4_bit_depth depth,
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)
1032{
1033 int ret = -EINVAL;
1034 *frame_fmt = SOF_IPC_FRAME_INVALID;
1035 *valid_fmt = SOF_IPC_FRAME_INVALID;
1036
1037 switch (type) {
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;
1043 ret = 0;
1044 }
1045#endif
1046 break;
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;
1054 ret = 0;
1055#endif
1056 } else {
1057 /* IPC4_DEPTH_16BIT (16) <---> SOF_IPC_FRAME_S16_LE (0)
1058 * IPC4_DEPTH_24BIT (24) <---> SOF_IPC_FRAME_S24_4LE (1)
1059 * IPC4_DEPTH_32BIT (32) <---> SOF_IPC_FRAME_S32_LE (2)
1060 */
1061 *frame_fmt = (enum sof_ipc_frame)((depth >> 3) - 2);
1062 *valid_fmt = (enum sof_ipc_frame)((valid >> 3) - 2);
1063 ret = 0;
1064 }
1065 break;
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;
1071 ret = 0;
1072 }
1073#endif /* CONFIG_FORMAT_U8 */
1074 break;
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;
1080 ret = 0;
1081 }
1082#endif
1083 break;
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;
1089 ret = 0;
1090 }
1091#endif
1092 break;
1093 }
1094 return ret;
1095}
1096
1097
1098#endif /* __SOF_AUDIO_AUDIO_STREAM_H__ */
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
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
uint32_t type
Definition tlv.h:0
#define __sparse_force
Definition compiler_attributes.h:12
#define __sparse_cache
Definition compiler_attributes.h:11