7#include "../utility/module.hpp"
13namespace hi::inline
v1 {
22 [[nodiscard]]
friend constexpr bool operator==(
pcm_format const&,
pcm_format const&)
noexcept =
default;
24 [[nodiscard]]
friend constexpr auto operator<=>(
pcm_format const &lhs,
pcm_format const &rhs)
noexcept
26 if (
hilet tmp = lhs._floating_point <=> rhs._floating_point; tmp != std::strong_ordering::equal) {
29 if (
hilet tmp = lhs._num_major_bits <=> rhs._num_major_bits; tmp != std::strong_ordering::equal) {
32 if (
hilet tmp = lhs._num_minor_bits <=> rhs._num_minor_bits; tmp != std::strong_ordering::equal) {
35 if (
hilet tmp = lhs._num_bytes <=> rhs._num_bytes; tmp != std::strong_ordering::equal) {
38 if (
hilet tmp = lhs._lsb <=> rhs._lsb; tmp != std::strong_ordering::equal) {
41 return lhs._lsb <=> rhs._lsb;
44 [[nodiscard]]
constexpr friend bool equal_except_bit_depth(
pcm_format const& lhs,
pcm_format const& rhs)
noexcept
46 return lhs._floating_point == rhs._floating_point;
66 uint8_t num_major_bits,
67 uint8_t num_minor_bits) noexcept :
68 _floating_point(floating_point),
69 _little_endian(endian == std::endian::little),
71 _num_bytes(num_bytes - 1),
72 _num_major_bits(num_major_bits),
73 _num_minor_bits(num_minor_bits)
75 hi_assert(num_bytes >= 1 and num_bytes <= 8);
76 hi_assert(num_major_bits >= 0 and num_major_bits <= 15);
77 hi_assert(num_minor_bits >= 1 and num_minor_bits <= 63);
80 [[nodiscard]]
constexpr static pcm_format float32() noexcept
82 return pcm_format{
true, std::endian::native,
true, 4, 8, 23};
85 [[nodiscard]]
constexpr static pcm_format float32_le() noexcept
87 return pcm_format{
true, std::endian::little,
true, 4, 8, 23};
90 [[nodiscard]]
constexpr static pcm_format float32_be() noexcept
92 return pcm_format{
true, std::endian::big,
true, 4, 8, 23};
95 [[nodiscard]]
constexpr static pcm_format sint24() noexcept
97 return pcm_format{
false, std::endian::native,
true, 3, 0, 23};
100 [[nodiscard]]
constexpr static pcm_format sint24_le() noexcept
102 return pcm_format{
false, std::endian::little,
true, 3, 0, 23};
105 [[nodiscard]]
constexpr static pcm_format sint24_be() noexcept
107 return pcm_format{
false, std::endian::big,
true, 3, 0, 23};
110 [[nodiscard]]
constexpr static pcm_format sint16() noexcept
112 return pcm_format{
false, std::endian::native,
true, 2, 0, 15};
115 [[nodiscard]]
constexpr static pcm_format sint16_le() noexcept
117 return pcm_format{
false, std::endian::little,
true, 2, 0, 15};
120 [[nodiscard]]
constexpr static pcm_format sint16_be() noexcept
122 return pcm_format{
false, std::endian::big,
true, 2, 0, 15};
125 [[nodiscard]]
constexpr bool empty() const noexcept
127 return _num_minor_bits == 0;
130 constexpr explicit operator bool() const noexcept
135 [[nodiscard]]
constexpr bool floating_point() const noexcept
138 return _floating_point;
141 [[nodiscard]]
constexpr bool fixed_point() const noexcept
144 return not floating_point();
147 [[nodiscard]]
constexpr std::endian endian() const noexcept
150 return _little_endian ? std::endian::little : std::endian::big;
160 return narrow_cast<uint8_t>(_num_bytes + 1);
165 [[nodiscard]]
constexpr bool lsb() const noexcept
173 [[nodiscard]]
constexpr bool msb() const noexcept
190 return narrow_cast<uint8_t>(_num_major_bits + _num_minor_bits + 1);
205 return _num_major_bits;
218 return _num_minor_bits;
235 return _num_major_bits;
252 return _num_minor_bits;
257 if (rhs.floating_point()) {
258 if (rhs.endian() == std::endian::native) {
259 return std::format(
"float-{}", rhs.
num_bits());
261 return std::format(
"float-{}_{}", rhs.
num_bits(), rhs.endian() == std::endian::little ?
"le" :
"be");
265 if (rhs.endian() == std::endian::native) {
266 return std::format(
"int-{}", rhs.
num_bits());
268 return std::format(
"int-{}_{}", rhs.
num_bits(), rhs.endian() == std::endian::little ?
"le" :
"be");
272 if (rhs.endian() == std::endian::native) {
279 rhs.endian() == std::endian::little ?
"le" :
"be");
285 uint16_t _floating_point : 1 = 0;
286 uint16_t _little_endian : 1 = 0;
287 uint16_t _lsb : 1 = 0;
288 uint16_t _num_bytes : 3 = 0;
289 uint16_t _num_major_bits : 4 = 0;
290 uint16_t _num_minor_bits : 6 = 0;
295template<
typename CharT>
296struct std::formatter<
hi::pcm_format, CharT> : std::formatter<std::string_view, CharT> {
297 auto format(hi::pcm_format
const& t,
auto& fc)
299 return std::formatter<std::string_view, CharT>::format(
to_string(t), fc);
#define hi_assert(expression,...)
Assert if expression is true.
Definition assert.hpp:199
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:253
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
Definition pcm_format.hpp:15
uint8_t num_bytes() const noexcept
The number of bytes a sample is stored in.
Definition pcm_format.hpp:157
constexpr bool lsb() const noexcept
The sample is stored in the least-significant-bits of the storage.
Definition pcm_format.hpp:165
uint8_t num_mantissa_bits() const noexcept
The number of bits in the mantissa.
Definition pcm_format.hpp:215
uint8_t num_exponent_bits() const noexcept
The number of bits in the exponent.
Definition pcm_format.hpp:202
uint8_t num_fraction_bits() const noexcept
The number of fractional bits.
Definition pcm_format.hpp:249
uint8_t num_integral_bits() const noexcept
The number of integral bits.
Definition pcm_format.hpp:232
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:61
constexpr bool msb() const noexcept
The sample is stored in the most-significant-bits of the storage.
Definition pcm_format.hpp:173
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:187