14namespace hi::inline
v1 {
23 [[nodiscard]]
friend constexpr bool operator==(
pcm_format const&,
pcm_format const&)
noexcept =
default;
25 [[nodiscard]]
friend constexpr auto operator<=>(
pcm_format const &lhs,
pcm_format const &rhs)
noexcept
27 if (
hilet tmp = lhs._floating_point <=> rhs._floating_point; tmp != std::strong_ordering::equal) {
30 if (
hilet tmp = lhs._num_major_bits <=> rhs._num_major_bits; tmp != std::strong_ordering::equal) {
33 if (
hilet tmp = lhs._num_minor_bits <=> rhs._num_minor_bits; tmp != std::strong_ordering::equal) {
36 if (
hilet tmp = lhs._num_bytes <=> rhs._num_bytes; tmp != std::strong_ordering::equal) {
39 if (
hilet tmp = lhs._lsb <=> rhs._lsb; tmp != std::strong_ordering::equal) {
42 return lhs._lsb <=> rhs._lsb;
45 [[nodiscard]]
constexpr friend bool equal_except_bit_depth(
pcm_format const& lhs,
pcm_format const& rhs)
noexcept
47 return lhs._floating_point == rhs._floating_point;
67 uint8_t num_major_bits,
68 uint8_t num_minor_bits) noexcept :
69 _floating_point(floating_point),
70 _little_endian(endian == std::endian::little),
72 _num_bytes(num_bytes - 1),
73 _num_major_bits(num_major_bits),
74 _num_minor_bits(num_minor_bits)
76 hi_assert(num_bytes >= 1 and num_bytes <= 8);
77 hi_assert(num_major_bits >= 0 and num_major_bits <= 15);
78 hi_assert(num_minor_bits >= 1 and num_minor_bits <= 63);
81 [[nodiscard]]
constexpr static pcm_format float32() noexcept
83 return pcm_format{
true, std::endian::native,
true, 4, 8, 23};
86 [[nodiscard]]
constexpr static pcm_format float32_le() noexcept
88 return pcm_format{
true, std::endian::little,
true, 4, 8, 23};
91 [[nodiscard]]
constexpr static pcm_format float32_be() noexcept
93 return pcm_format{
true, std::endian::big,
true, 4, 8, 23};
96 [[nodiscard]]
constexpr static pcm_format sint24() noexcept
98 return pcm_format{
false, std::endian::native,
true, 3, 0, 23};
101 [[nodiscard]]
constexpr static pcm_format sint24_le() noexcept
103 return pcm_format{
false, std::endian::little,
true, 3, 0, 23};
106 [[nodiscard]]
constexpr static pcm_format sint24_be() noexcept
108 return pcm_format{
false, std::endian::big,
true, 3, 0, 23};
111 [[nodiscard]]
constexpr static pcm_format sint16() noexcept
113 return pcm_format{
false, std::endian::native,
true, 2, 0, 15};
116 [[nodiscard]]
constexpr static pcm_format sint16_le() noexcept
118 return pcm_format{
false, std::endian::little,
true, 2, 0, 15};
121 [[nodiscard]]
constexpr static pcm_format sint16_be() noexcept
123 return pcm_format{
false, std::endian::big,
true, 2, 0, 15};
126 [[nodiscard]]
constexpr bool empty() const noexcept
128 return _num_minor_bits == 0;
131 constexpr explicit operator bool() const noexcept
136 [[nodiscard]]
constexpr bool floating_point() const noexcept
139 return _floating_point;
142 [[nodiscard]]
constexpr bool fixed_point() const noexcept
145 return not floating_point();
148 [[nodiscard]]
constexpr std::endian endian() const noexcept
151 return _little_endian ? std::endian::little : std::endian::big;
161 return narrow_cast<uint8_t>(_num_bytes + 1);
166 [[nodiscard]]
constexpr bool lsb() const noexcept
174 [[nodiscard]]
constexpr bool msb() const noexcept
191 return narrow_cast<uint8_t>(_num_major_bits + _num_minor_bits + 1);
206 return _num_major_bits;
219 return _num_minor_bits;
236 return _num_major_bits;
253 return _num_minor_bits;
258 if (rhs.floating_point()) {
259 if (rhs.endian() == std::endian::native) {
260 return std::format(
"float-{}", rhs.
num_bits());
262 return std::format(
"float-{}_{}", rhs.
num_bits(), rhs.endian() == std::endian::little ?
"le" :
"be");
266 if (rhs.endian() == std::endian::native) {
267 return std::format(
"int-{}", rhs.
num_bits());
269 return std::format(
"int-{}_{}", rhs.
num_bits(), rhs.endian() == std::endian::little ?
"le" :
"be");
273 if (rhs.endian() == std::endian::native) {
280 rhs.endian() == std::endian::little ?
"le" :
"be");
286 uint16_t _floating_point : 1 = 0;
287 uint16_t _little_endian : 1 = 0;
288 uint16_t _lsb : 1 = 0;
289 uint16_t _num_bytes : 3 = 0;
290 uint16_t _num_major_bits : 4 = 0;
291 uint16_t _num_minor_bits : 6 = 0;
296template<
typename CharT>
297struct std::formatter<
hi::pcm_format, CharT> : std::formatter<std::string_view, CharT> {
298 auto format(hi::pcm_format
const& t,
auto& fc)
300 return std::formatter<std::string_view, CharT>::format(
to_string(t), fc);
Utilities to assert and bound check.
#define hi_assert(expression,...)
Assert if expression is true.
Definition assert.hpp:87
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:133
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
DOXYGEN BUG.
Definition algorithm.hpp:15
geometry/margins.hpp
Definition assert.hpp:18
Definition pcm_format.hpp:16
uint8_t num_bytes() const noexcept
The number of bytes a sample is stored in.
Definition pcm_format.hpp:158
constexpr bool lsb() const noexcept
The sample is stored in the least-significant-bits of the storage.
Definition pcm_format.hpp:166
uint8_t num_mantissa_bits() const noexcept
The number of bits in the mantissa.
Definition pcm_format.hpp:216
uint8_t num_exponent_bits() const noexcept
The number of bits in the exponent.
Definition pcm_format.hpp:203
uint8_t num_fraction_bits() const noexcept
The number of fractional bits.
Definition pcm_format.hpp:250
uint8_t num_integral_bits() const noexcept
The number of integral bits.
Definition pcm_format.hpp:233
constexpr pcm_format(bool floating_point, std::endian endian, bool lsb, uint8_t num_bytes, uint8_t num_major_bits, uint8_t num_minor_bits) noexcept
Construct a PCM format.
Definition pcm_format.hpp:62
constexpr bool msb() const noexcept
The sample is stored in the most-significant-bits of the storage.
Definition pcm_format.hpp:174
uint8_t num_bits() const noexcept
The number of least significant bits of the storage that is used by the sample.
Definition pcm_format.hpp:188