8#include "../utility/utility.hpp"
9#include "../SIMD/SIMD.hpp"
10#include "../macros.hpp"
14hi_export_module(hikogui.audio.audio_sample_unpacker);
16hi_export
namespace hi {
inline namespace v1 {
30 _load_shuffle_indices = format.load_shuffle_indices(stride);
31 _concat_shuffle_indices = format.concat_shuffle_indices(stride);
33 _multiplier = f32x4::broadcast(format.unpack_multiplier());
34 _num_chunks_per_quad = format.num_chunks_per_quad(stride);
35 _chunk_stride = format.chunk_stride(stride);
37 _direction = format.endian == std::endian::little ? -1 : 1;
38 _start_byte = format.endian == std::endian::little ? format.num_bytes - 1 : 0;
39 _align_shift = 32 - format.num_bytes * 8;
50 hi_assert(
src !=
nullptr);
51 hi_assert(
dst !=
nullptr);
61 load_samples(
src, _load_shuffle_indices, _concat_shuffle_indices, _num_chunks_per_quad, _chunk_stride);
66 auto const int_sample = load_sample(
src, _stride, _format.
num_bytes, _direction, _start_byte, _align_shift);
75 load_samples(
src, _load_shuffle_indices, _concat_shuffle_indices, _num_chunks_per_quad, _chunk_stride);
80 auto const int_sample = load_sample(
src, _stride, _format.
num_bytes, _direction, _start_byte, _align_shift);
89 i8x16 _load_shuffle_indices;
90 i8x16 _concat_shuffle_indices;
101 [[
nodiscard]]
static int32_t load_sample(
102 std::byte
const *hi_restrict &
src,
109 hi_axiom(
src !=
nullptr);
110 hi_axiom(num_bytes >= 1 && num_bytes <= 4);
111 hi_axiom(direction == 1 || direction == -1);
114 hi_axiom(stride >= num_bytes);
117 hi_axiom(p !=
nullptr);
122 r |=
static_cast<uint32_t
>(
static_cast<uint8_t
>(*p));
124 }
while (--num_bytes);
133 [[
nodiscard]]
static i8x16 load_samples(std::byte
const *hi_restrict &
src, i8x16 load_shuffle_indices,
std::size_t stride)
noexcept
135 hi_axiom(
src !=
nullptr);
136 hi_axiom(stride > 0);
138 auto r =
permute(i8x16::load(
src), load_shuffle_indices);
144 std::byte
const *hi_restrict &
src,
145 i8x16 load_shuffle_indices,
146 i8x16 concat_shuffle_indices,
150 hi_assert(
src !=
nullptr);
152 hi_assert(stride > 0);
165 static void store_sample(
float *hi_restrict &
dst,
float sample)
noexcept
167 hi_axiom(
dst !=
nullptr);
171 static void store_samples(
float *hi_restrict &
dst, f32x4 samples)
noexcept
173 hi_axiom(
dst !=
nullptr);
174 samples.store(
reinterpret_cast<std::byte *
>(
dst));
DOXYGEN BUG.
Definition algorithm_misc.hpp:20
The HikoGUI namespace.
Definition recursive_iterator.hpp:15
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:378
Audio sample format.
Definition audio_sample_format.hpp:30
uint8_t num_bytes
The number of bytes of the container.
Definition audio_sample_format.hpp:34
bool is_float
The numeric type is floating point.
Definition audio_sample_format.hpp:56
std::size_t num_fast_quads(std::size_t stride, std::size_t num_samples) const noexcept
Calculate the number of 4 sample-quads can be handled as chunked loads and stores.
Definition audio_sample_format.hpp:238
Definition audio_sample_unpacker.hpp:18
void operator()(std::byte const *hi_restrict src, float *hi_restrict dst, std::size_t num_samples) const noexcept
Unpack samples.
Definition audio_sample_unpacker.hpp:48
audio_sample_unpacker(audio_sample_format format, std::size_t stride) noexcept
Audio sample unpacker One instance of this class can be used to unpack multiple buffers either from o...
Definition audio_sample_unpacker.hpp:28