32template <
typename Type>
54 int numSamplesToAllocate)
56 size (numSamplesToAllocate)
83 jassert (dataToReferTo !=
nullptr);
84 jassert (numChannelsToUse >= 0 && numSamples >= 0);
105 int numChannelsToUse,
111 jassert (dataToReferTo !=
nullptr);
112 jassert (numChannelsToUse >= 0 && startSample >= 0 && numSamples >= 0);
199 other.numChannels = 0;
201 other.allocatedBytes = 0;
225 other.numChannels = 0;
227 other.allocatedBytes = 0;
272 return channels[channelNumber] + sampleIndex;
319 return channels[channelNumber] + sampleIndex;
369 bool keepExistingContent =
false,
370 bool clearExtraSpace =
false,
371 bool avoidReallocating =
false)
378 auto allocatedSamplesPerChannel = ((size_t) newNumSamples + 3) & ~3u;
379 auto channelListSize = ((
static_cast<size_t> (1 + newNumChannels) *
sizeof (Type*)) + 15) & ~15u;
380 auto newTotalBytes = ((size_t) newNumChannels * (size_t) allocatedSamplesPerChannel *
sizeof (Type))
381 + channelListSize + 32;
383 if (keepExistingContent)
385 if (avoidReallocating && newNumChannels <=
numChannels && newNumSamples <=
size)
394 auto numSamplesToCopy = (size_t)
jmin (newNumSamples,
size);
399 for (
int j = 0;
j < newNumChannels; ++
j)
401 newChannels[
j] = newChan;
402 newChan += allocatedSamplesPerChannel;
409 for (
int i = 0;
i < numChansToCopy; ++
i)
410 FloatVectorOperations::copy (newChannels[
i],
channels[
i], (
int) numSamplesToCopy);
422 if (clearExtraSpace ||
isClear)
434 for (
int i = 0;
i < newNumChannels; ++
i)
437 chan += allocatedSamplesPerChannel;
442 size = newNumSamples;
473 jassert (dataToReferTo !=
nullptr);
474 jassert (newNumChannels >= 0 && newNumSamples >= 0);
483 size = newNumSamples;
524 template <
typename OtherType>
543 dest[
i] =
static_cast<Type
> (src[
i]);
579 void clear (
int startSample,
int numSamples)
noexcept
581 jassert (startSample >= 0 && numSamples >= 0 && startSample + numSamples <=
size);
586 FloatVectorOperations::clear (
channels[
i] + startSample, numSamples);
588 isClear = (startSample == 0 && numSamples ==
size);
602 void clear (
int channel,
int startSample,
int numSamples)
noexcept
605 jassert (startSample >= 0 && numSamples >= 0 && startSample + numSamples <=
size);
608 FloatVectorOperations::clear (
channels[channel] + startSample, numSamples);
636 Type
getSample (
int channel,
int sampleIndex)
const noexcept
640 return *(
channels[channel] + sampleIndex);
651 void setSample (
int destChannel,
int destSample, Type newValue)
noexcept
655 *(
channels[destChannel] + destSample) = newValue;
667 void addSample (
int destChannel,
int destSample, Type valueToAdd)
noexcept
671 *(
channels[destChannel] + destSample) += valueToAdd;
680 void applyGain (
int channel,
int startSample,
int numSamples, Type gain)
noexcept
683 jassert (startSample >= 0 && numSamples >= 0 && startSample + numSamples <=
size);
685 if (gain != Type (1) && !
isClear)
687 auto*
d =
channels[channel] + startSample;
690 FloatVectorOperations::clear (
d, numSamples);
692 FloatVectorOperations::multiply (
d, gain, numSamples);
701 void applyGain (
int startSample,
int numSamples, Type gain)
noexcept
723 Type startGain, Type endGain)
noexcept
727 if (startGain == endGain)
729 applyGain (channel, startSample, numSamples, startGain);
734 jassert (startSample >= 0 && numSamples >= 0 && startSample + numSamples <=
size);
736 const auto increment = (endGain - startGain) / (
float) numSamples;
737 auto*
d =
channels[channel] + startSample;
739 while (--numSamples >= 0)
742 startGain += increment;
758 Type startGain, Type endGain)
noexcept
784 int sourceStartSample,
786 Type gainToApplyToSource = Type (1))
noexcept
789 || sourceChannel != destChannel
790 || sourceStartSample + numSamples <= destStartSample
791 || destStartSample + numSamples <= sourceStartSample);
793 jassert (destStartSample >= 0 && numSamples >= 0 && destStartSample + numSamples <=
size);
795 jassert (sourceStartSample >= 0 && sourceStartSample + numSamples <= source.
size);
797 if (gainToApplyToSource != 0 && numSamples > 0 && ! source.
isClear)
799 auto*
d =
channels[destChannel] + destStartSample;
800 auto*
s = source.
channels[sourceChannel] + sourceStartSample;
806 if (gainToApplyToSource != Type (1))
807 FloatVectorOperations::copyWithMultiply (
d,
s, gainToApplyToSource, numSamples);
809 FloatVectorOperations::copy (
d,
s, numSamples);
813 if (gainToApplyToSource != Type (1))
814 FloatVectorOperations::addWithMultiply (
d,
s, gainToApplyToSource, numSamples);
816 FloatVectorOperations::add (
d,
s, numSamples);
839 Type gainToApplyToSource = Type (1))
noexcept
842 jassert (destStartSample >= 0 && numSamples >= 0 && destStartSample + numSamples <=
size);
845 if (gainToApplyToSource != 0 && numSamples > 0)
847 auto*
d =
channels[destChannel] + destStartSample;
853 if (gainToApplyToSource != Type (1))
854 FloatVectorOperations::copyWithMultiply (
d, source, gainToApplyToSource, numSamples);
856 FloatVectorOperations::copy (
d, source, numSamples);
860 if (gainToApplyToSource != Type (1))
861 FloatVectorOperations::addWithMultiply (
d, source, gainToApplyToSource, numSamples);
863 FloatVectorOperations::add (
d, source, numSamples);
888 Type endGain)
noexcept
890 if (startGain == endGain)
892 addFrom (destChannel, destStartSample, source, numSamples, startGain);
897 jassert (destStartSample >= 0 && numSamples >= 0 && destStartSample + numSamples <=
size);
903 const auto increment = (endGain - startGain) / numSamples;
904 auto*
d =
channels[destChannel] + destStartSample;
906 while (--numSamples >= 0)
908 *
d++ += startGain * *source++;
909 startGain += increment;
930 int sourceStartSample,
931 int numSamples)
noexcept
934 || sourceChannel != destChannel
935 || sourceStartSample + numSamples <= destStartSample
936 || destStartSample + numSamples <= sourceStartSample);
938 jassert (destStartSample >= 0 && destStartSample + numSamples <=
size);
940 jassert (sourceStartSample >= 0 && numSamples >= 0 && sourceStartSample + numSamples <= source.size);
947 FloatVectorOperations::clear (
channels[destChannel] + destStartSample, numSamples);
952 FloatVectorOperations::copy (
channels[destChannel] + destStartSample,
953 source.channels[sourceChannel] + sourceStartSample,
974 int numSamples)
noexcept
977 jassert (destStartSample >= 0 && numSamples >= 0 && destStartSample + numSamples <=
size);
983 FloatVectorOperations::copy (
channels[destChannel] + destStartSample, source, numSamples);
1001 int destStartSample,
1007 jassert (destStartSample >= 0 && numSamples >= 0 && destStartSample + numSamples <=
size);
1012 auto*
d =
channels[destChannel] + destStartSample;
1014 if (gain != Type (1))
1019 FloatVectorOperations::clear (
d, numSamples);
1024 FloatVectorOperations::copyWithMultiply (
d, source, gain, numSamples);
1030 FloatVectorOperations::copy (
d, source, numSamples);
1052 int destStartSample,
1056 Type endGain)
noexcept
1058 if (startGain == endGain)
1060 copyFrom (destChannel, destStartSample, source, numSamples, startGain);
1065 jassert (destStartSample >= 0 && numSamples >= 0 && destStartSample + numSamples <=
size);
1071 const auto increment = (endGain - startGain) / numSamples;
1072 auto*
d =
channels[destChannel] + destStartSample;
1074 while (--numSamples >= 0)
1076 *
d++ = startGain * *source++;
1077 startGain += increment;
1092 jassert (startSample >= 0 && numSamples >= 0 && startSample + numSamples <=
size);
1095 return { Type (0), Type (0) };
1097 return FloatVectorOperations::findMinAndMax (
channels[channel] + startSample, numSamples);
1101 Type
getMagnitude (
int channel,
int startSample,
int numSamples)
const noexcept
1104 jassert (startSample >= 0 && numSamples >= 0 && startSample + numSamples <=
size);
1109 auto r =
findMinMax (channel, startSample, numSamples);
1111 return jmax (
r.getStart(), -
r.getStart(),
r.getEnd(), -
r.getEnd());
1127 Type
getRMSLevel (
int channel,
int startSample,
int numSamples)
const noexcept
1130 jassert (startSample >= 0 && numSamples >= 0 && startSample + numSamples <=
size);
1138 for (
int i = 0;
i < numSamples; ++
i)
1144 return static_cast<Type
> (std::sqrt (sum / numSamples));
1148 void reverse (
int channel,
int startSample,
int numSamples)
const noexcept
1151 jassert (startSample >= 0 && numSamples >= 0 && startSample + numSamples <=
size);
1154 std::reverse (
channels[channel] + startSample,
1155 channels[channel] + startSample + numSamples);
1159 void reverse (
int startSample,
int numSamples)
const noexcept
1162 reverse (
i, startSample, numSamples);
1173 #if (! JUCE_GCC || (__GNUC__ * 100 + __GNUC_MINOR__) >= 409)
1175 "AudioBuffer cannot hold types with alignment requirements larger than that guaranteed by malloc");
1179 auto channelListSize = (size_t) (
numChannels + 1) *
sizeof (Type*);
1180 auto requiredSampleAlignment = std::alignment_of<Type>::value;
1181 size_t alignmentOverflow = channelListSize % requiredSampleAlignment;
1183 if (alignmentOverflow != 0)
1184 channelListSize += requiredSampleAlignment - alignmentOverflow;
1219 jassert (dataToReferTo[
i] !=
nullptr);
1233 constexpr size_t alignments[] {
alignof (std::max_align_t),
1237 alignof (
long double),
1238 alignof (
short int),
1241 alignof (
long long int),
1246 alignof (
wchar_t) };
1250 for (
const auto elem : alignments)
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_AudioSampleBuffer.h:34
int size
Definition juce_AudioSampleBuffer.h:1256
HeapBlock< char, true > allocatedData
Definition juce_AudioSampleBuffer.h:1259
void allocateData()
Definition juce_AudioSampleBuffer.h:1171
AudioBuffer(Type *const *dataToReferTo, int numChannelsToUse, int startSample, int numSamples)
Definition juce_AudioSampleBuffer.h:104
void setSize(int newNumChannels, int newNumSamples, bool keepExistingContent=false, bool clearExtraSpace=false, bool avoidReallocating=false)
Definition juce_AudioSampleBuffer.h:367
Type getMagnitude(int channel, int startSample, int numSamples) const noexcept
Definition juce_AudioSampleBuffer.h:1101
AudioBuffer(Type *const *dataToReferTo, int numChannelsToUse, int numSamples)
Definition juce_AudioSampleBuffer.h:77
Type getSample(int channel, int sampleIndex) const noexcept
Definition juce_AudioSampleBuffer.h:636
float * preallocatedChannelSpace[32]
Definition juce_AudioSampleBuffer.h:1260
void applyGain(Type gain) noexcept
Definition juce_AudioSampleBuffer.h:708
Range< Type > findMinMax(int channel, int startSample, int numSamples) const noexcept
Definition juce_AudioSampleBuffer.h:1089
AudioBuffer(const AudioBuffer &other)
Definition juce_AudioSampleBuffer.h:122
const Type * getReadPointer(int channelNumber, int sampleIndex) const noexcept
Definition juce_AudioSampleBuffer.h:268
int numChannels
Definition juce_AudioSampleBuffer.h:1256
void makeCopyOf(const AudioBuffer< OtherType > &other, bool avoidReallocating=false)
Definition juce_AudioSampleBuffer.h:525
void setNotClear() noexcept
Definition juce_AudioSampleBuffer.h:627
void applyGain(int startSample, int numSamples, Type gain) noexcept
Definition juce_AudioSampleBuffer.h:701
void setDataToReferTo(Type **dataToReferTo, int newNumChannels, int newNumSamples)
Definition juce_AudioSampleBuffer.h:509
void copyFromWithRamp(int destChannel, int destStartSample, const Type *source, int numSamples, Type startGain, Type endGain) noexcept
Definition juce_AudioSampleBuffer.h:1051
void addSample(int destChannel, int destSample, Type valueToAdd) noexcept
Definition juce_AudioSampleBuffer.h:667
Type getRMSLevel(int channel, int startSample, int numSamples) const noexcept
Definition juce_AudioSampleBuffer.h:1127
Type * getWritePointer(int channelNumber) noexcept
Definition juce_AudioSampleBuffer.h:291
void copyFrom(int destChannel, int destStartSample, const Type *source, int numSamples) noexcept
Definition juce_AudioSampleBuffer.h:971
float ** channels
Definition juce_AudioSampleBuffer.h:1258
int getNumChannels() const noexcept
Definition juce_AudioSampleBuffer.h:236
Type * getWritePointer(int channelNumber, int sampleIndex) noexcept
Definition juce_AudioSampleBuffer.h:314
int getNumSamples() const noexcept
Definition juce_AudioSampleBuffer.h:242
void clear() noexcept
Definition juce_AudioSampleBuffer.h:556
void clear(int channel, int startSample, int numSamples) noexcept
Definition juce_AudioSampleBuffer.h:602
void copyFrom(int destChannel, int destStartSample, const Type *source, int numSamples, Type gain) noexcept
Definition juce_AudioSampleBuffer.h:1000
void applyGainRamp(int channel, int startSample, int numSamples, Type startGain, Type endGain) noexcept
Definition juce_AudioSampleBuffer.h:722
void setDataToReferTo(Type **dataToReferTo, int newNumChannels, int newStartSample, int newNumSamples)
Definition juce_AudioSampleBuffer.h:468
void copyFrom(int destChannel, int destStartSample, const AudioBuffer &source, int sourceChannel, int sourceStartSample, int numSamples) noexcept
Definition juce_AudioSampleBuffer.h:926
void reverse(int startSample, int numSamples) const noexcept
Definition juce_AudioSampleBuffer.h:1159
void addFromWithRamp(int destChannel, int destStartSample, const Type *source, int numSamples, Type startGain, Type endGain) noexcept
Definition juce_AudioSampleBuffer.h:883
static constexpr size_t getMaxAlignment() noexcept
Definition juce_AudioSampleBuffer.h:1231
bool isClear
Definition juce_AudioSampleBuffer.h:1261
Type getMagnitude(int startSample, int numSamples) const noexcept
Definition juce_AudioSampleBuffer.h:1115
void reverse(int channel, int startSample, int numSamples) const noexcept
Definition juce_AudioSampleBuffer.h:1148
void setSample(int destChannel, int destSample, Type newValue) noexcept
Definition juce_AudioSampleBuffer.h:651
void addFrom(int destChannel, int destStartSample, const AudioBuffer &source, int sourceChannel, int sourceStartSample, int numSamples, Type gainToApplyToSource=Type(1)) noexcept
Definition juce_AudioSampleBuffer.h:780
size_t allocatedBytes
Definition juce_AudioSampleBuffer.h:1257
bool hasBeenCleared() const noexcept
Definition juce_AudioSampleBuffer.h:618
const Type * getReadPointer(int channelNumber) const noexcept
Definition juce_AudioSampleBuffer.h:253
AudioBuffer(AudioBuffer &&other) noexcept
Definition juce_AudioSampleBuffer.h:180
Type SampleType
Definition juce_AudioSampleBuffer.h:1167
AudioBuffer() noexcept
Definition juce_AudioSampleBuffer.h:38
void clear(int startSample, int numSamples) noexcept
Definition juce_AudioSampleBuffer.h:579
const Type ** getArrayOfReadPointers() const noexcept
Definition juce_AudioSampleBuffer.h:327
static constexpr size_t maxAlignment
Definition juce_AudioSampleBuffer.h:1262
AudioBuffer(int numChannelsToAllocate, int numSamplesToAllocate)
Definition juce_AudioSampleBuffer.h:53
void allocateChannels(float *const *dataToReferTo, int offset)
Definition juce_AudioSampleBuffer.h:1201
void addFrom(int destChannel, int destStartSample, const Type *source, int numSamples, Type gainToApplyToSource=Type(1)) noexcept
Definition juce_AudioSampleBuffer.h:835
void applyGainRamp(int startSample, int numSamples, Type startGain, Type endGain) noexcept
Definition juce_AudioSampleBuffer.h:757
Type ** getArrayOfWritePointers() noexcept
Definition juce_AudioSampleBuffer.h:342
void applyGain(int channel, int startSample, int numSamples, Type gain) noexcept
Definition juce_AudioSampleBuffer.h:680
Definition juce_HeapBlock.h:87
ElementType * get() const noexcept
Definition juce_HeapBlock.h:188
void allocate(SizeType newNumElements, bool initialiseToZero)
Definition juce_HeapBlock.h:275
Definition juce_Range.h:40
register unsigned j
Definition inflate.c:1576
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
JSAMPIMAGE data
Definition jpeglib.h:945
#define JUCE_LEAK_DETECTOR(OwnerClass)
Definition juce_LeakedObjectDetector.h:138
Definition carla_juce.cpp:31
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
Type unalignedPointerCast(void *ptr) noexcept
Definition juce_Memory.h:88
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
AudioBuffer< float > AudioSampleBuffer
Definition juce_AudioSampleBuffer.h:1277
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
constexpr int numElementsInArray(Type(&)[N]) noexcept
Definition juce_MathsFunctions.h:344
#define max(x, y)
Definition os.h:78
signed int sample
Definition tap_dynamics_m.c:41
int r
Definition crypt.c:458
typedef int(UZ_EXP MsgFn)()
#define const
Definition zconf.h:137