26#ifndef LMMS_AUDIO_BUFFER_VIEW_H
27#define LMMS_AUDIO_BUFFER_VIEW_H
48template<
typename T, ch_cnt_t channelCount>
104template<
typename T, ch_cnt_t channelCount>
144template<
typename T, ch_cnt_t channelCount = DynamicChannelCount>
217 return iter + frames;
234 return this->
m_data - other.m_data;
244 return this->
m_data == other.m_data;
252 constexpr auto operator==(T* sentinel)
const noexcept ->
bool
254 return this->
m_data == sentinel;
260static_assert(std::random_access_iterator<InterleavedFrameIterator<float, 2>>);
262template<
typename T,
typename... AllowedTs>
263inline constexpr bool OneOf = (std::is_same_v<T, AllowedTs> || ...);
289template<SampleType T, ch_cnt_t channelCount = DynamicChannelCount>
301 template<
typename U = T>
requires (std::is_const_v<U> && channelCount !=
DynamicChannelCount)
303 :
Base{other.data(), other.frames()}
308 template<
typename U = T>
requires (std::is_const_v<U> && channelCount ==
DynamicChannelCount)
310 :
Base{other.data(), other.channels(), other.frames()}
315 template<ch_cnt_t otherChannels>
324 requires (std::is_same_v<std::remove_const_t<T>,
float> && channelCount == 2)
331 requires (std::is_same_v<T, const float> && channelCount == 2)
427 requires (std::is_same_v<T, float> && channelCount == 2)
434 requires (std::is_same_v<T, const float> && channelCount == 2)
441 requires (
std::is_same_v<T,
float> && channelCount == 2)
447 requires (
std::is_same_v<T,
const float> && channelCount == 2)
473template<SampleType T, ch_cnt_t channelCount = DynamicChannelCount>
482 template<
typename U = T>
requires (std::is_const_v<U> && channelCount !=
DynamicChannelCount)
484 :
Base{other.data(), other.frames()}
489 template<
typename U = T>
requires (std::is_const_v<U> && channelCount ==
DynamicChannelCount)
491 :
Base{other.data(), other.channels(), other.frames()}
496 template<ch_cnt_t otherChannels>
516 constexpr auto buffer()
const noexcept -> std::span<T>
529 return this->
m_data[channel];
539 static_assert(channel < channelCount);
541 return this->
m_data[channel];
563template<
class T,
typename U, ch_cnt_t channels = DynamicChannelCount>
565 || std::convertible_to<T, PlanarBufferView<U, channels>>);
569template<
class T, ch_cnt_t inputs, ch_cnt_t outputs>
578 else {
static_assert(inputs == outputs); }
580 for (
f_cnt_t frame = 0; frame < dst.frames(); ++frame)
582 auto* framePtr = dst.framePtr(frame);
583 for (
ch_cnt_t channel = 0; channel < dst.channels(); ++channel)
585 framePtr[channel] = src.
bufferPtr(channel)[frame];
591template<
class T, ch_cnt_t inputs, ch_cnt_t outputs>
600 else {
static_assert(inputs == outputs); }
602 for (
ch_cnt_t channel = 0; channel < dst.channels(); ++channel)
604 auto* channelPtr = dst.bufferPtr(channel);
605 for (
f_cnt_t frame = 0; frame < dst.frames(); ++frame)
607 channelPtr[frame] = src.
framePtr(frame)[channel];
#define noexcept
Definition DistrhoDefines.h:72
Definition AudioBufferView.h:291
InterleavedBufferView(SampleFrame *data, f_cnt_t frames) noexcept
Construct from SampleFrame*.
Definition AudioBufferView.h:323
constexpr InterleavedBufferView(InterleavedBufferView< std::remove_const_t< U >, channelCount > other) noexcept
Construct const from mutable (static channel count).
Definition AudioBufferView.h:302
auto asSampleFrames() const noexcept -> std::span< const SampleFrame >
Definition AudioBufferView.h:446
constexpr auto subspan(f_cnt_t offset, f_cnt_t frames) const -> InterleavedBufferView< T, channelCount >
Definition AudioBufferView.h:384
static constexpr bool Interleaved
Use to distinguish between InterleavedBufferView and PlanarBufferView when using AudioBufferView.
Definition AudioBufferView.h:453
detail::InterleavedFrameIterator< T, channelCount > FrameIter
Definition AudioBufferView.h:294
constexpr auto framePtr(f_cnt_t index) const noexcept -> T *
Definition AudioBufferView.h:368
constexpr InterleavedBufferView(InterleavedBufferView< T, otherChannels > other) noexcept
Construct dynamic channel count from static.
Definition AudioBufferView.h:317
constexpr auto framesView() noexcept -> std::ranges::subrange< FrameIter, T * >
Definition AudioBufferView.h:413
auto asSampleFrames() noexcept -> std::span< SampleFrame >
Definition AudioBufferView.h:440
auto sampleFrameAt(f_cnt_t index) noexcept -> SampleFrame &
Definition AudioBufferView.h:426
constexpr auto framesView() const noexcept -> std::ranges::subrange< ConstFrameIter, const T * >
Definition AudioBufferView.h:399
detail::InterleavedFrameIterator< const T, channelCount > ConstFrameIter
Definition AudioBufferView.h:295
constexpr auto dataSizeBytes() const noexcept -> std::size_t
Definition AudioBufferView.h:341
constexpr auto operator[](f_cnt_t index) const noexcept -> T *
Definition AudioBufferView.h:378
constexpr auto frame(f_cnt_t index) const noexcept
Definition AudioBufferView.h:352
auto sampleFrameAt(f_cnt_t index) const noexcept -> const SampleFrame &
Definition AudioBufferView.h:433
InterleavedBufferView(const SampleFrame *data, f_cnt_t frames) noexcept
Construct from const SampleFrame*.
Definition AudioBufferView.h:330
constexpr auto dataView() noexcept -> std::span< T >
Definition AudioBufferView.h:346
constexpr auto empty() const noexcept -> bool
Definition AudioBufferView.h:336
detail::BufferViewData< T, channelCount > Base
Definition AudioBufferView.h:292
Definition AudioBufferView.h:475
detail::BufferViewData< T *const, channelCount > Base
Definition AudioBufferView.h:476
constexpr auto empty() const noexcept -> bool
Definition AudioBufferView.h:503
constexpr auto bufferPtr(ch_cnt_t channel) const noexcept -> T *
Definition AudioBufferView.h:525
constexpr PlanarBufferView(PlanarBufferView< T, otherChannels > other) noexcept
Construct dynamic channel count from static.
Definition AudioBufferView.h:498
constexpr auto operator[](ch_cnt_t channel) const noexcept -> T *
Definition AudioBufferView.h:548
constexpr auto bufferPtr() const noexcept -> T *
Definition AudioBufferView.h:537
constexpr auto buffer(ch_cnt_t channel) const noexcept -> std::span< T >
Definition AudioBufferView.h:509
constexpr PlanarBufferView(PlanarBufferView< std::remove_const_t< U >, channelCount > other) noexcept
Construct const from mutable (static channel count).
Definition AudioBufferView.h:483
constexpr auto buffer() const noexcept -> std::span< T >
Definition AudioBufferView.h:516
static constexpr bool Interleaved
Use to distinguish between InterleavedBufferView and PlanarBufferView when using AudioBufferView.
Definition AudioBufferView.h:554
Definition SampleFrame.h:41
constexpr BufferViewData(T *data, ch_cnt_t channels, f_cnt_t frames) noexcept
Definition AudioBufferView.h:85
f_cnt_t m_frames
Definition AudioBufferView.h:100
constexpr auto data() const noexcept -> T *
Definition AudioBufferView.h:93
constexpr BufferViewData(const BufferViewData &)=default
constexpr BufferViewData()=default
T * m_data
Definition AudioBufferView.h:98
constexpr auto channels() const noexcept -> ch_cnt_t
Definition AudioBufferView.h:94
ch_cnt_t m_channels
Definition AudioBufferView.h:99
constexpr auto frames() const noexcept -> f_cnt_t
Definition AudioBufferView.h:95
Definition AudioBufferView.h:50
constexpr BufferViewData()=default
constexpr BufferViewData(T *data, ch_cnt_t channels, f_cnt_t frames) noexcept
Definition AudioBufferView.h:55
constexpr auto frames() const noexcept -> f_cnt_t
Definition AudioBufferView.h:70
constexpr BufferViewData(T *data, f_cnt_t frames) noexcept
Definition AudioBufferView.h:62
f_cnt_t m_frames
Definition AudioBufferView.h:74
constexpr BufferViewData(const BufferViewData &)=default
constexpr auto data() const noexcept -> T *
Definition AudioBufferView.h:68
static constexpr auto channels() noexcept -> ch_cnt_t
Definition AudioBufferView.h:69
T * m_data
Definition AudioBufferView.h:73
constexpr InterleavedFrameIteratorData()=default
constexpr InterleavedFrameIteratorData(const InterleavedFrameIteratorData &)=default
constexpr InterleavedFrameIteratorData(T *data, ch_cnt_t channels) noexcept
Definition AudioBufferView.h:130
ch_cnt_t m_channels
Definition AudioBufferView.h:140
constexpr auto channels() const noexcept -> ch_cnt_t
Definition AudioBufferView.h:136
T * m_data
Definition AudioBufferView.h:139
T * m_data
Definition AudioBufferView.h:119
constexpr InterleavedFrameIteratorData(const InterleavedFrameIteratorData &)=default
constexpr InterleavedFrameIteratorData(T *data) noexcept
Definition AudioBufferView.h:111
static constexpr auto channels() noexcept -> ch_cnt_t
Definition AudioBufferView.h:116
constexpr InterleavedFrameIteratorData()=default
Definition AudioBufferView.h:146
constexpr auto operator+=(difference_type channels) noexcept -> InterleavedFrameIterator &
Definition AudioBufferView.h:189
constexpr auto operator<=>(InterleavedFrameIterator other) const noexcept
Definition AudioBufferView.h:237
constexpr auto base() const noexcept -> T *
Definition AudioBufferView.h:257
constexpr auto operator--(int) noexcept -> InterleavedFrameIterator
Definition AudioBufferView.h:182
constexpr auto operator==(T *sentinel) const noexcept -> bool
Definition AudioBufferView.h:252
InterleavedFrameIteratorData< T, channelCount > Base
Definition AudioBufferView.h:147
constexpr auto operator[](difference_type frames) const noexcept -> value_type
Definition AudioBufferView.h:158
constexpr auto operator-=(difference_type channels) noexcept -> InterleavedFrameIterator &
Definition AudioBufferView.h:195
friend constexpr auto operator+(difference_type frames, InterleavedFrameIterator iter) noexcept -> InterleavedFrameIterator
Definition AudioBufferView.h:214
constexpr auto operator--() noexcept -> InterleavedFrameIterator &
Definition AudioBufferView.h:176
constexpr auto operator-(InterleavedFrameIterator other) const noexcept -> difference_type
Definition AudioBufferView.h:232
constexpr auto operator==(InterleavedFrameIterator other) const noexcept -> bool
Definition AudioBufferView.h:242
constexpr auto operator++(int) noexcept -> InterleavedFrameIterator
Definition AudioBufferView.h:169
T * value_type
Definition AudioBufferView.h:151
std::ptrdiff_t difference_type
Definition AudioBufferView.h:152
constexpr auto operator*() const noexcept -> value_type
Definition AudioBufferView.h:156
constexpr auto operator-(difference_type frames) const noexcept -> InterleavedFrameIterator
Definition AudioBufferView.h:220
std::random_access_iterator_tag iterator_concept
Definition AudioBufferView.h:150
friend constexpr auto operator+(InterleavedFrameIterator iter, difference_type frames) noexcept -> InterleavedFrameIterator
Definition AudioBufferView.h:201
constexpr auto operator++() noexcept -> InterleavedFrameIterator &
Definition AudioBufferView.h:163
constexpr auto operator<=>(T *sentinel) const noexcept
Definition AudioBufferView.h:247
Concept for any audio buffer view, interleaved or planar.
Definition AudioBufferView.h:564
Recognized sample types, either const or non-const.
Definition AudioBufferView.h:270
JSAMPIMAGE data
Definition jpeglib.h:945
Definition AudioBufferView.h:45
constexpr bool OneOf
Definition AudioBufferView.h:263
Definition AudioAlsa.cpp:35
std::uint16_t ch_cnt_t
Definition LmmsTypes.h:44
InterleavedBufferView(const SampleFrame *, f_cnt_t) -> InterleavedBufferView< const float, 2 >
constexpr void toInterleaved(PlanarBufferView< T, inputs > src, InterleavedBufferView< std::remove_const_t< T >, outputs > dst)
Converts planar buffers to interleaved buffers.
Definition AudioBufferView.h:570
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
constexpr void toPlanar(InterleavedBufferView< T, inputs > src, PlanarBufferView< std::remove_const_t< T >, outputs > dst)
Converts interleaved buffers to planar buffers.
Definition AudioBufferView.h:592
constexpr auto DynamicChannelCount
Use when the number of channels is not known at compile time.
Definition AudioBufferView.h:42
Definition juce_Uuid.h:141
#define const
Definition zconf.h:137