62 num_bytes(0), num_guard_bits(0), num_bits(0), is_float(false), endian(
std::endian::native)
82 uint8_t num_guard_bits,
85 std::endian endian) noexcept :
86 num_bytes(num_bytes), num_guard_bits(num_guard_bits), num_bits(num_bits), is_float(is_float), endian(endian)
88 hi_axiom(holds_invariant());
93 return {4, 8, 23,
true, std::endian::little};
96 [[nodiscard]]
static constexpr audio_sample_format float32_be() noexcept
98 return {4, 8, 23,
true, std::endian::big};
101 [[nodiscard]]
static constexpr audio_sample_format float32() noexcept
103 return {4, 8, 23,
true, std::endian::native};
106 [[nodiscard]]
static constexpr audio_sample_format int16_le() noexcept
108 return {2, 0, 15,
false, std::endian::little};
111 [[nodiscard]]
static constexpr audio_sample_format int16_be() noexcept
113 return {2, 0, 15,
false, std::endian::big};
116 [[nodiscard]]
static constexpr audio_sample_format int16() noexcept
118 return {2, 0, 15,
false, std::endian::native};
121 [[nodiscard]]
static constexpr audio_sample_format int20_le() noexcept
123 return {3, 0, 19,
false, std::endian::little};
126 [[nodiscard]]
static constexpr audio_sample_format int20_be() noexcept
128 return {3, 0, 19,
false, std::endian::big};
131 [[nodiscard]]
static constexpr audio_sample_format int20() noexcept
133 return {3, 0, 19,
false, std::endian::native};
136 [[nodiscard]]
static constexpr audio_sample_format int24_le() noexcept
138 return {3, 0, 23,
false, std::endian::little};
141 [[nodiscard]]
static constexpr audio_sample_format int24_be() noexcept
143 return {3, 0, 23,
false, std::endian::big};
146 [[nodiscard]]
static constexpr audio_sample_format int24() noexcept
148 return {3, 0, 23,
false, std::endian::native};
151 [[nodiscard]]
static constexpr audio_sample_format int32_le() noexcept
153 return {4, 0, 31,
false, std::endian::little};
156 [[nodiscard]]
static constexpr audio_sample_format int32_be() noexcept
158 return {4, 0, 31,
false, std::endian::big};
161 [[nodiscard]]
static constexpr audio_sample_format int32() noexcept
163 return {4, 0, 31,
false, std::endian::native};
166 [[nodiscard]]
static constexpr audio_sample_format fix8_23_le() noexcept
168 return {4, 8, 23,
false, std::endian::little};
171 [[nodiscard]]
static constexpr audio_sample_format fix8_23_be() noexcept
173 return {4, 8, 23,
false, std::endian::big};
176 [[nodiscard]]
static constexpr audio_sample_format fix8_23() noexcept
178 return {4, 8, 23,
false, std::endian::native};
181 constexpr explicit operator bool() const noexcept
183 return num_bytes != 0;
192 [[nodiscard]]
float unpack_multiplier() const noexcept;
197 [[nodiscard]]
std::
size_t num_samples_per_chunk(
std::
size_t stride) const noexcept;
201 [[nodiscard]]
std::
size_t chunk_stride(
std::
size_t stride) const noexcept;
205 [[nodiscard]]
std::
size_t num_chunks_per_quad(
std::
size_t stride) const noexcept;
209 [[nodiscard]]
std::
size_t num_fast_quads(
std::
size_t stride,
std::
size_t num_samples) const noexcept;
213 [[nodiscard]]
i8x16 load_shuffle_indices(
std::
size_t stride) const noexcept;
217 [[nodiscard]]
i8x16 store_shuffle_indices(
std::
size_t stride) const noexcept;
221 [[nodiscard]]
i8x16 concat_shuffle_indices(
std::
size_t stride) const noexcept;
225 [[nodiscard]] constexpr
bool holds_invariant() const noexcept
227 return (num_bytes >= 1 && num_bytes <= 4) && (num_bits + num_guard_bits <= num_bytes * 8) &&
228 (endian == std::endian::little || endian == std::endian::big);