25#ifndef LMMS_AUDIO_BUFFER_H
26#define LMMS_AUDIO_BUFFER_H
29#include <memory_resource>
35#include "lmms_export.h"
143 std::pmr::memory_resource* resource =
std::pmr::get_default_resource());
158 std::pmr::memory_resource* resource, F&& groupVisitor)
161 setGroups(groups, std::forward<F>(groupVisitor));
165 void allocateInterleavedBuffer();
174 bool withInterleavedBuffer =
false) -> std::size_t;
252 auto addGroup(
ch_cnt_t channels) -> ChannelGroup*;
266 static_assert(std::is_invocable_r_v<ch_cnt_t, F, group_cnt_t, ChannelGroup&>,
267 "groupVisitor is passed the group index + group reference and must return the group's channel count");
275 const auto channels = groupVisitor(idx,
group);
276 if (channels == 0) {
throw std::runtime_error{
"group cannot have zero channels"}; }
279 group.setChannels(channels);
284 throw std::runtime_error{
"sum of group channel counts exceeds total channels"};
315 void enableSilenceTracking(
bool enabled);
333 auto hasSignal(
const ChannelFlags& channels)
const -> bool;
336 auto hasAnySignal()
const ->
bool;
359 auto updateAllSilenceFlags() ->
bool;
370 void silenceAllChannels();
#define noexcept
Definition DistrhoDefines.h:72
Definition ArrayVector.h:51
Non-owning collection of audio channels + metadata.
Definition AudioBuffer.h:85
auto buffer(ch_cnt_t channel) -> float *
Definition AudioBuffer.h:102
auto buffer(ch_cnt_t channel) const -> const float *
Definition AudioBuffer.h:96
ch_cnt_t m_channels
Number of channels in m_buffers - currently only 2 is used.
Definition AudioBuffer.h:123
void setBuffers(float **newBuffers)
Definition AudioBuffer.h:110
void setChannels(ch_cnt_t channels)
Definition AudioBuffer.h:111
float ** m_buffers
Definition AudioBuffer.h:120
ChannelGroup(float **buffers, ch_cnt_t channels)
Definition AudioBuffer.h:88
auto buffers() const -> const float *const *
Definition AudioBuffer.h:93
auto channels() const -> ch_cnt_t
Definition AudioBuffer.h:108
auto buffers() -> float **
Definition AudioBuffer.h:94
Definition AudioBuffer.h:79
ArrayVector< ChannelGroup, MaxGroupsPerAudioBuffer > m_groups
Divides channels into arbitrary groups.
Definition AudioBuffer.h:398
auto silenceTrackingEnabled() const -> bool
Definition AudioBuffer.h:316
auto allBuffers() const -> PlanarBufferView< const float >
Definition AudioBuffer.h:183
f_cnt_t m_frames
Frame count for every channel buffer.
Definition AudioBuffer.h:401
auto groupBuffers(group_cnt_t index) const -> PlanarBufferView< const float >
Definition AudioBuffer.h:195
std::pmr::vector< float > m_interleavedBuffer
Definition AudioBuffer.h:395
auto groupBuffers(group_cnt_t index) -> PlanarBufferView< float >
Definition AudioBuffer.h:203
auto group(group_cnt_t index) const -> const ChannelGroup &
Definition AudioBuffer.h:179
auto buffer(ch_cnt_t channel) const -> std::span< const float >
Definition AudioBuffer.h:211
auto allBuffers() -> PlanarBufferView< float >
Definition AudioBuffer.h:189
auto interleavedBuffer() const -> InterleavedBufferView< const float, 2 >
Definition AudioBuffer.h:229
auto hasInterleavedBuffer() const -> bool
Definition AudioBuffer.h:167
void assumeNonSilent(ch_cnt_t channel)
Forcibly pessimizes silence tracking for a specific channel.
Definition AudioBuffer.h:302
auto groupCount() const -> group_cnt_t
Definition AudioBuffer.h:177
auto group(group_cnt_t index) -> ChannelGroup &
Definition AudioBuffer.h:180
auto frames() const -> f_cnt_t
Definition AudioBuffer.h:226
bool m_silenceTrackingEnabled
Definition AudioBuffer.h:416
std::bitset< MaxChannelsPerAudioBuffer > ChannelFlags
Definition AudioBuffer.h:81
std::pmr::vector< float > m_sourceBuffer
Definition AudioBuffer.h:381
AudioBuffer(const AudioBuffer &)=delete
AudioBuffer(AudioBuffer &&) noexcept=default
ChannelFlags m_silenceFlags
Definition AudioBuffer.h:414
auto silenceFlags() const -> const ChannelFlags &
Definition AudioBuffer.h:299
void setGroups(group_cnt_t groups, F &&groupVisitor)
Changes the channel grouping without changing the channel count. Does not reallocate any buffers.
Definition AudioBuffer.h:264
auto interleavedBuffer() -> InterleavedBufferView< float, 2 >
Definition AudioBuffer.h:236
std::pmr::vector< float * > m_accessBuffer
Definition AudioBuffer.h:388
auto buffer(ch_cnt_t channel) -> std::span< float >
Definition AudioBuffer.h:217
auto totalChannels() const -> ch_cnt_t
Definition AudioBuffer.h:223
Definition AudioBufferView.h:291
Definition AudioBufferView.h:475
int g
Definition inflate.c:1573
Definition AudioAlsa.cpp:35
std::uint8_t group_cnt_t
Definition LmmsTypes.h:48
std::uint16_t ch_cnt_t
Definition LmmsTypes.h:44
constexpr auto DEFAULT_CHANNELS
Definition lmms_constants.h:38
constexpr auto MaxGroupsPerAudioBuffer
Definition lmms_constants.h:40
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
constexpr auto MaxChannelsPerAudioBuffer
Definition lmms_constants.h:39
Definition juce_Uuid.h:141
#define false
Definition ordinals.h:83
#define const
Definition zconf.h:137