HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
audio_sample_format.hpp
1// Copyright Take Vos 2021.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "../utility/module.hpp"
8#include "../SIMD/module.hpp"
9#include <bit>
10
11namespace hi::inline v1 {
12
31 uint8_t num_bytes;
32
37
48 uint8_t num_bits;
49
54
57 std::endian endian;
58
59 constexpr audio_sample_format() noexcept :
60 num_bytes(0), num_guard_bits(0), num_bits(0), is_float(false), endian(std::endian::native)
61 {
62 }
63
64 constexpr audio_sample_format(audio_sample_format const &) noexcept = default;
65 constexpr audio_sample_format(audio_sample_format &&) noexcept = default;
66 constexpr audio_sample_format &operator=(audio_sample_format const &) noexcept = default;
67 constexpr audio_sample_format &operator=(audio_sample_format &&) noexcept = default;
68
77 [[nodiscard]] constexpr audio_sample_format(
78 uint8_t num_bytes,
79 uint8_t num_guard_bits,
80 uint8_t num_bits,
81 bool is_float,
82 std::endian endian) noexcept :
83 num_bytes(num_bytes), num_guard_bits(num_guard_bits), num_bits(num_bits), is_float(is_float), endian(endian)
84 {
85 hi_axiom(holds_invariant());
86 }
87
88 [[nodiscard]] static constexpr audio_sample_format float32_le() noexcept
89 {
90 return {4, 8, 23, true, std::endian::little};
91 }
92
93 [[nodiscard]] static constexpr audio_sample_format float32_be() noexcept
94 {
95 return {4, 8, 23, true, std::endian::big};
96 }
97
98 [[nodiscard]] static constexpr audio_sample_format float32() noexcept
99 {
100 return {4, 8, 23, true, std::endian::native};
101 }
102
103 [[nodiscard]] static constexpr audio_sample_format int16_le() noexcept
104 {
105 return {2, 0, 15, false, std::endian::little};
106 }
107
108 [[nodiscard]] static constexpr audio_sample_format int16_be() noexcept
109 {
110 return {2, 0, 15, false, std::endian::big};
111 }
112
113 [[nodiscard]] static constexpr audio_sample_format int16() noexcept
114 {
115 return {2, 0, 15, false, std::endian::native};
116 }
117
118 [[nodiscard]] static constexpr audio_sample_format int20_le() noexcept
119 {
120 return {3, 0, 19, false, std::endian::little};
121 }
122
123 [[nodiscard]] static constexpr audio_sample_format int20_be() noexcept
124 {
125 return {3, 0, 19, false, std::endian::big};
126 }
127
128 [[nodiscard]] static constexpr audio_sample_format int20() noexcept
129 {
130 return {3, 0, 19, false, std::endian::native};
131 }
132
133 [[nodiscard]] static constexpr audio_sample_format int24_le() noexcept
134 {
135 return {3, 0, 23, false, std::endian::little};
136 }
137
138 [[nodiscard]] static constexpr audio_sample_format int24_be() noexcept
139 {
140 return {3, 0, 23, false, std::endian::big};
141 }
142
143 [[nodiscard]] static constexpr audio_sample_format int24() noexcept
144 {
145 return {3, 0, 23, false, std::endian::native};
146 }
147
148 [[nodiscard]] static constexpr audio_sample_format int32_le() noexcept
149 {
150 return {4, 0, 31, false, std::endian::little};
151 }
152
153 [[nodiscard]] static constexpr audio_sample_format int32_be() noexcept
154 {
155 return {4, 0, 31, false, std::endian::big};
156 }
157
158 [[nodiscard]] static constexpr audio_sample_format int32() noexcept
159 {
160 return {4, 0, 31, false, std::endian::native};
161 }
162
163 [[nodiscard]] static constexpr audio_sample_format fix8_23_le() noexcept
164 {
165 return {4, 8, 23, false, std::endian::little};
166 }
167
168 [[nodiscard]] static constexpr audio_sample_format fix8_23_be() noexcept
169 {
170 return {4, 8, 23, false, std::endian::big};
171 }
172
173 [[nodiscard]] static constexpr audio_sample_format fix8_23() noexcept
174 {
175 return {4, 8, 23, false, std::endian::native};
176 }
177
178 constexpr explicit operator bool() const noexcept
179 {
180 return num_bytes != 0;
181 }
182
185 [[nodiscard]] float pack_multiplier() const noexcept;
186
189 [[nodiscard]] float unpack_multiplier() const noexcept;
190
194 [[nodiscard]] std::size_t num_samples_per_chunk(std::size_t stride) const noexcept;
195
198 [[nodiscard]] std::size_t chunk_stride(std::size_t stride) const noexcept;
199
202 [[nodiscard]] std::size_t num_chunks_per_quad(std::size_t stride) const noexcept;
203
206 [[nodiscard]] std::size_t num_fast_quads(std::size_t stride, std::size_t num_samples) const noexcept;
207
210 [[nodiscard]] i8x16 load_shuffle_indices(std::size_t stride) const noexcept;
211
214 [[nodiscard]] i8x16 store_shuffle_indices(std::size_t stride) const noexcept;
215
218 [[nodiscard]] i8x16 concat_shuffle_indices(std::size_t stride) const noexcept;
219
222 [[nodiscard]] constexpr bool holds_invariant() const noexcept
223 {
224 return (num_bytes >= 1 && num_bytes <= 4) && (num_bits + num_guard_bits <= num_bytes * 8) &&
225 (endian == std::endian::little || endian == std::endian::big);
226 }
227};
228
229} // namespace hi::inline v1
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:253
STL namespace.
DOXYGEN BUG.
Definition algorithm.hpp:13
Audio sample format.
Definition audio_sample_format.hpp:27
bool is_float
The numeric type is floating point.
Definition audio_sample_format.hpp:53
uint8_t num_guard_bits
The number of bits used for the integer part of a fixed point number.
Definition audio_sample_format.hpp:36
uint8_t num_bits
The number of significant bits of the sample format.
Definition audio_sample_format.hpp:48
float pack_multiplier() const noexcept
How much to multiply float samples to create integer samples.
std::endian endian
The endian order of the bytes in the container.
Definition audio_sample_format.hpp:57
uint8_t num_bytes
The number of bytes of the container.
Definition audio_sample_format.hpp:31