8#include "../utility/utility.hpp"
9#include "../SIMD/SIMD.hpp"
10#include "../random/random.hpp"
11#include "../macros.hpp"
15hi_export_module(hikogui.audio.audio_sample_packer);
17hi_export
namespace 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 auto const store_shuffle_indices = _store_shuffle_indices;
62 auto const concat_shuffle_indices = _concat_shuffle_indices;
63 auto const num_chunks_per_quad = _num_chunks_per_quad;
64 auto const chunk_stride = _chunk_stride;
70 store_samples(
int_samples,
dst, store_shuffle_indices, concat_shuffle_indices, num_chunks_per_quad, chunk_stride);
80 auto const one = f32x4::broadcast(1);
81 auto const 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(
127 std::byte * hi_restrict &
dst,
136 hi_axiom(
dst !=
nullptr);
142 }
while (--num_bytes);
148 store_samples(i8x16
int_samples, std::byte * hi_restrict &
dst, i8x16 store_shuffle_indices,
std::size_t stride)
noexcept
150 hi_axiom(
dst !=
nullptr);
151 hi_axiom(stride > 0);
154 auto tmp = i8x16::load(
dst);
167 static void store_samples(
169 std::byte * hi_restrict &
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 * hi_restrict &
src)
noexcept
188 hi_axiom(
src !=
nullptr);
192 [[
nodiscard]]
static f32x4 load_samples(
float const * hi_restrict &
src)
noexcept
194 auto const r = f32x4::load(
src);
DOXYGEN BUG.
Definition algorithm_misc.hpp:20
The HikoGUI namespace.
Definition recursive_iterator.hpp:15
@ 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: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_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
Definition simd_intf.hpp:18