7#include "audio_sample_format.hpp"
8#include "../utility/utility.hpp"
9#include "../SIMD/module.hpp"
10#include "../random/random.hpp"
11#include "../macros.hpp"
15hi_export_module(hikogui.audio.audio_sample_packer);
17namespace hi {
inline namespace v1 {
30 _dither(format.num_bits), _format(format), _stride(stride)
32 _store_shuffle_indices = format.store_shuffle_indices(stride);
33 _concat_shuffle_indices = format.concat_shuffle_indices(stride);
35 _multiplier = f32x4::broadcast(format.pack_multiplier());
37 _num_chunks_per_quad = format.num_chunks_per_quad(stride);
38 _chunk_stride = format.chunk_stride(stride);
40 _direction = format.endian == std::endian::little ? 1 : -1;
41 _start_byte = format.endian == std::endian::little ? 0 : format.num_bytes - 1;
42 _align_shift = 32 - format.num_bytes * 8;
53 hi_assert(
src !=
nullptr);
54 hi_assert(
dst !=
nullptr);
61 hilet store_shuffle_indices = _store_shuffle_indices;
62 hilet concat_shuffle_indices = _concat_shuffle_indices;
63 hilet num_chunks_per_quad = _num_chunks_per_quad;
64 hilet chunk_stride = _chunk_stride;
70 store_samples(
int_samples,
dst, store_shuffle_indices, concat_shuffle_indices, num_chunks_per_quad, chunk_stride);
79 hilet multiplier = _multiplier;
80 hilet
one = f32x4::broadcast(1);
81 hilet
min_one = f32x4::broadcast(-1);
83 auto dither = _dither;
94 store_samples(
int_samples,
dst, store_shuffle_indices, concat_shuffle_indices, num_chunks_per_quad, chunk_stride);
113 i8x16 _store_shuffle_indices;
114 i8x16 _concat_shuffle_indices;
116 mutable dither _dither;
125 static void store_sample(
136 hi_axiom(
dst !=
nullptr);
142 }
while (--num_bytes);
150 hi_axiom(
dst !=
nullptr);
151 hi_axiom(stride > 0);
154 auto tmp = i8x16::load(
dst);
170 i8x16 store_shuffle_indices,
171 i8x16 concat_shuffle_indices,
175 hi_assert(
dst !=
nullptr);
177 hi_assert(stride > 0);
186 [[
nodiscard]]
static float load_sample(
float const *&
src)
noexcept
188 hi_axiom(
src !=
nullptr);
194 hilet r = f32x4::load(
src);
DOXYGEN BUG.
Definition algorithm.hpp:16
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
@ one
The number was one, and this means something in the current language.
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
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_packer.hpp:19
audio_sample_packer(audio_sample_format format, std::size_t stride) noexcept
Audio sample packer One instance of this class can be used to pack multiple buffers either from one a...
Definition audio_sample_packer.hpp:29
void operator()(float const *hi_restrict src, std::byte *hi_restrict dst, std::size_t num_samples) const noexcept
Unpack samples.
Definition audio_sample_packer.hpp:51