67 template <
typename OtherSampleType>
68 using MayUseConvertingConstructor =
69 std::enable_if_t<std::is_same<std::remove_const_t<SampleType>,
70 std::remove_const_t<OtherSampleType>>::value
71 && std::is_const<SampleType>::value
72 && ! std::is_const<OtherSampleType>::value,
77 using NumericType =
typename SampleTypeHelpers::ElementType<SampleType>::Type;
146 template <
typename OtherSampleType>
148 : channels (buffer.getArrayOfWritePointers()),
150 numSamples (
static_cast<size_t> (buffer.getNumSamples()))
159 template <
typename OtherSampleType>
161 : channels (buffer.getArrayOfWritePointers()),
164 numSamples (
static_cast<size_t> (buffer.getNumSamples()) -
startSampleIndex)
166 jassert (startSample <
static_cast<size_t> (buffer.getNumSamples()));
172 template <
typename OtherSampleType, MayUseConvertingConstructor<OtherSampleType> = 0>
174 : channels {
other.channels },
175 numChannels {
other.numChannels },
176 startSample { other.startSample },
177 numSamples { other.numSamples }
181 template <
typename OtherSampleType, MayUseConvertingConstructor<OtherSampleType> = 0>
182 AudioBlock& operator= (
const AudioBlock<OtherSampleType>& other)
noexcept
189 void swap (AudioBlock& other)
noexcept
191 std::swap (other.channels, channels);
192 std::swap (other.numChannels, numChannels);
193 std::swap (other.startSample, startSample);
194 std::swap (other.numSamples, numSamples);
198 template <
typename OtherSampleType>
199 constexpr bool operator== (
const AudioBlock<OtherSampleType>& other)
const noexcept
201 return std::equal (channels,
202 channels + numChannels,
204 other.channels + other.numChannels)
205 && startSample == other.startSample
206 && numSamples == other.numSamples;
209 template <
typename OtherSampleType>
210 constexpr bool operator!= (
const AudioBlock<OtherSampleType>& other)
const noexcept
212 return ! (*
this == other);
225 jassert (channel < numChannels);
226 jassert (numSamples > 0);
227 return channels[channel] + startSample;
233 jassert (channel < numChannels);
234 return AudioBlock (channels + channel, 1, startSample, numSamples);
256 jassert (isPositiveAndBelow (channel, numChannels));
257 jassert (isPositiveAndBelow (
sampleIndex, numSamples));
268 jassert (isPositiveAndBelow (
destChannel, numChannels));
269 jassert (isPositiveAndBelow (
destSample, numSamples));
280 jassert (isPositiveAndBelow (
destChannel, numChannels));
281 jassert (isPositiveAndBelow (
destSample, numSamples));
295 template <
typename OtherSampleType>
297 template <
typename OtherSampleType>
306 template <
typename OtherNumericType>
310 template <
typename OtherNumericType>
323 size_t numElements = std::numeric_limits<size_t>::max())
const
325 auto dstlen =
static_cast<size_t> (
dst.getNumSamples()) / sizeFactor;
327 auto maxChannels = jmin (
static_cast<size_t> (
dst.getNumChannels()),
static_cast<size_t> (numChannels));
331 static_cast<int> (
dstPos * sizeFactor)),
332 getDataPointer (
ch) + (
srcPos * sizeFactor),
383 template <
typename OtherSampleType>
385 template <
typename OtherSampleType>
389 template <
typename OtherSampleType>
391 template <
typename OtherSampleType>
395 template <
typename Src1SampleType,
typename Src2SampleType>
397 template <
typename Src1SampleType,
typename Src2SampleType>
406 template <
typename OtherSampleType>
408 template <
typename OtherSampleType>
412 template <
typename OtherSampleType>
414 template <
typename OtherSampleType>
418 template <
typename Src1SampleType,
typename Src2SampleType>
420 template <
typename Src1SampleType,
typename Src2SampleType>
429 template <
typename OtherSampleType>
431 template <
typename OtherSampleType>
435 template <
typename OtherSampleType>
437 template <
typename OtherSampleType>
441 template <
typename Src1SampleType,
typename Src2SampleType>
443 template <
typename Src1SampleType,
typename Src2SampleType>
448 template <
typename SmoothingType>
450 template <
typename SmoothingType>
454 template <
typename OtherSampleType,
typename SmoothingType>
456 template <
typename OtherSampleType,
typename SmoothingType>
461 template <
typename OtherSampleType>
463 template <
typename OtherSampleType>
467 template <
typename Src1SampleType,
typename Src2SampleType>
469 template <
typename Src1SampleType,
typename Src2SampleType>
478 template <
typename OtherSampleType>
480 template <
typename OtherSampleType>
484 template <
typename OtherSampleType>
486 template <
typename OtherSampleType>
491 template <
typename Src1SampleType,
typename Src2SampleType>
493 template <
typename Src1SampleType,
typename Src2SampleType>
497 template <
typename Src1SampleType,
typename Src2SampleType>
499 template <
typename Src1SampleType,
typename Src2SampleType>
506 if (numChannels == 0)
509 auto n =
static_cast<int> (numSamples * sizeFactor);
512 for (
size_t ch = 1;
ch < numChannels; ++
ch)
523 AudioBlock& operator+= (AudioBlock src)
noexcept {
return add (src); }
524 const AudioBlock& operator+= (AudioBlock src)
const noexcept {
return add (src); }
526 AudioBlock& JUCE_VECTOR_CALLTYPE operator-= (NumericType value)
noexcept {
return subtract (value); }
527 const AudioBlock& JUCE_VECTOR_CALLTYPE operator-= (NumericType value)
const noexcept {
return subtract (value); }
530 const AudioBlock& operator-= (AudioBlock src)
const noexcept {
return subtract (src); }
532 AudioBlock& JUCE_VECTOR_CALLTYPE operator*= (NumericType value)
noexcept {
return multiplyBy (value); }
533 const AudioBlock& JUCE_VECTOR_CALLTYPE operator*= (NumericType value)
const noexcept {
return multiplyBy (value); }
538 template <
typename SmoothingType>
539 AudioBlock& operator*= (SmoothedValue<SampleType, SmoothingType>& value)
noexcept {
return multiplyBy (value); }
540 template <
typename SmoothingType>
541 const AudioBlock& operator*= (SmoothedValue<SampleType, SmoothingType>& value)
const noexcept {
return multiplyBy (value); }
545 static_assert (std::is_same<std::remove_const_t<SampleType>,
float>::value
546 || std::is_same<std::remove_const_t<SampleType>,
double>::value
548 || std::is_same<std::remove_const_t<SampleType>, SIMDRegister<float>>::value
549 || std::is_same<std::remove_const_t<SampleType>, SIMDRegister<double>>::value
551 ,
"AudioBlock only supports single or double precision floating point types");
558 template <
typename Src1SampleType,
typename Src2SampleType,
typename FunctionType>
572 for (
size_t i = 0; i <
len; ++i)
573 dst[i] = function (
src[i]);
578 NumericType* getDataPointer (
size_t channel)
const noexcept
586 auto n =
static_cast<int> (numSamples * sizeFactor);
588 for (
size_t ch = 0;
ch < numChannels; ++
ch)
592 void JUCE_VECTOR_CALLTYPE fillInternal (NumericType value)
const noexcept
594 auto n =
static_cast<int> (numSamples * sizeFactor);
596 for (
size_t ch = 0; ch < numChannels; ++ch)
600 template <
typename OtherSampleType>
601 void copyFromInternal (
const AudioBlock<OtherSampleType>& src)
const noexcept
603 auto maxChannels = jmin (src.numChannels, numChannels);
604 auto n =
static_cast<int> (jmin (src.numSamples * src.sizeFactor,
605 numSamples * sizeFactor));
607 for (
size_t ch = 0; ch < maxChannels; ++ch)
611 template <
typename OtherNumericType>
612 void copyFromInternal (
const AudioBuffer<OtherNumericType>& src,
size_t srcPos,
size_t dstPos,
size_t numElements)
const
614 auto srclen =
static_cast<size_t> (src.getNumSamples()) / sizeFactor;
615 auto n =
static_cast<int> (jmin (srclen - srcPos, numSamples - dstPos, numElements) * sizeFactor);
616 auto maxChannels = jmin (
static_cast<size_t> (src.getNumChannels()),
static_cast<size_t> (numChannels));
618 for (
size_t ch = 0; ch < maxChannels; ++ch)
620 src.getReadPointer (
static_cast<int> (ch),
621 static_cast<int> (srcPos * sizeFactor)),
625 void moveInternal (
size_t srcPos,
size_t dstPos,
626 size_t numElements = std::numeric_limits<size_t>::max()) const noexcept
628 jassert (srcPos <= numSamples && dstPos <= numSamples);
629 auto len = jmin (numSamples - srcPos, numSamples - dstPos, numElements) *
sizeof (SampleType);
632 for (
size_t ch = 0; ch < numChannels; ++ch)
638 void JUCE_VECTOR_CALLTYPE addInternal (NumericType value)
const noexcept
640 auto n =
static_cast<int> (numSamples * sizeFactor);
642 for (
size_t ch = 0; ch < numChannels; ++ch)
646 template <
typename OtherSampleType>
647 void addInternal (AudioBlock<OtherSampleType> src)
const noexcept
649 jassert (numChannels == src.numChannels);
650 auto n =
static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);
652 for (
size_t ch = 0; ch < numChannels; ++ch)
656 template <
typename OtherSampleType>
657 void JUCE_VECTOR_CALLTYPE replaceWithSumOfInternal (AudioBlock<OtherSampleType> src, NumericType value)
const noexcept
659 jassert (numChannels == src.numChannels);
660 auto n =
static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);
662 for (
size_t ch = 0; ch < numChannels; ++ch)
666 template <
typename Src1SampleType,
typename Src2SampleType>
667 void replaceWithSumOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2)
const noexcept
669 jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);
670 auto n =
static_cast<int> (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor);
672 for (
size_t ch = 0; ch < numChannels; ++ch)
677 constexpr void JUCE_VECTOR_CALLTYPE subtractInternal (NumericType value)
const noexcept
679 addInternal (value *
static_cast<NumericType
> (-1.0));
682 template <
typename OtherSampleType>
683 void subtractInternal (AudioBlock<OtherSampleType> src)
const noexcept
685 jassert (numChannels == src.numChannels);
686 auto n =
static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);
688 for (
size_t ch = 0; ch < numChannels; ++ch)
692 template <
typename OtherSampleType>
693 void JUCE_VECTOR_CALLTYPE replaceWithDifferenceOfInternal (AudioBlock<OtherSampleType> src, NumericType value)
const noexcept
695 replaceWithSumOfInternal (src,
static_cast<NumericType
> (-1.0) * value);
698 template <
typename Src1SampleType,
typename Src2SampleType>
699 void replaceWithDifferenceOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2)
const noexcept
701 jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);
702 auto n =
static_cast<int> (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor);
704 for (
size_t ch = 0; ch < numChannels; ++ch)
709 void JUCE_VECTOR_CALLTYPE multiplyByInternal (NumericType value)
const noexcept
711 auto n =
static_cast<int> (numSamples * sizeFactor);
713 for (
size_t ch = 0; ch < numChannels; ++ch)
717 template <
typename OtherSampleType>
718 void multiplyByInternal (AudioBlock<OtherSampleType> src)
const noexcept
720 jassert (numChannels == src.numChannels);
721 auto n =
static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);
723 for (
size_t ch = 0; ch < numChannels; ++ch)
727 template <
typename OtherSampleType>
728 void JUCE_VECTOR_CALLTYPE replaceWithProductOfInternal (AudioBlock<OtherSampleType> src, NumericType value)
const noexcept
730 jassert (numChannels == src.numChannels);
731 auto n =
static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);
733 for (
size_t ch = 0; ch < numChannels; ++ch)
737 template <
typename Src1SampleType,
typename Src2SampleType>
738 void replaceWithProductOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2)
const noexcept
740 jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);
741 auto n =
static_cast<int> (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor);
743 for (
size_t ch = 0; ch < numChannels; ++ch)
747 template <
typename SmoothingType>
748 void multiplyByInternal (SmoothedValue<SampleType, SmoothingType>& value)
const noexcept
750 if (! value.isSmoothing())
752 multiplyByInternal (value.getTargetValue());
756 for (
size_t i = 0; i < numSamples; ++i)
758 const auto scaler = value.getNextValue();
760 for (
size_t ch = 0; ch < numChannels; ++ch)
761 getDataPointer (ch)[i] *= scaler;
766 template <
typename OtherSampleType,
typename SmoothingType>
767 void replaceWithProductOfInternal (AudioBlock<OtherSampleType> src, SmoothedValue<SampleType, SmoothingType>& value)
const noexcept
769 jassert (numChannels == src.numChannels);
771 if (! value.isSmoothing())
773 replaceWithProductOfInternal (src, value.getTargetValue());
777 auto n = jmin (numSamples, src.numSamples) * sizeFactor;
779 for (
size_t i = 0; i < n; ++i)
781 const auto scaler = value.getNextValue();
783 for (
size_t ch = 0; ch < numChannels; ++ch)
784 getDataPointer (ch)[i] = scaler * src.getChannelPointer (ch)[i];
790 template <
typename OtherSampleType>
791 void JUCE_VECTOR_CALLTYPE addProductOfInternal (AudioBlock<OtherSampleType> src, NumericType factor)
const noexcept
793 jassert (numChannels == src.numChannels);
794 auto n =
static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);
796 for (
size_t ch = 0; ch < numChannels; ++ch)
800 template <
typename Src1SampleType,
typename Src2SampleType>
801 void addProductOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2)
const noexcept
803 jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);
804 auto n =
static_cast<int> (jmin (numSamples, src1.numSamples, src2.numSamples) * sizeFactor);
806 for (
size_t ch = 0; ch < numChannels; ++ch)
811 constexpr void negateInternal() const noexcept
813 multiplyByInternal (
static_cast<NumericType
> (-1.0));
816 template <
typename OtherSampleType>
817 void replaceWithNegativeOfInternal (AudioBlock<OtherSampleType> src)
const noexcept
819 jassert (numChannels == src.numChannels);
820 auto n =
static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);
822 for (
size_t ch = 0; ch < numChannels; ++ch)
826 template <
typename OtherSampleType>
827 void replaceWithAbsoluteValueOfInternal (AudioBlock<OtherSampleType> src)
const noexcept
829 jassert (numChannels == src.numChannels);
830 auto n =
static_cast<int> (jmin (numSamples, src.numSamples) * sizeFactor);
832 for (
size_t ch = 0; ch < numChannels; ++ch)
837 template <
typename Src1SampleType,
typename Src2SampleType>
838 void replaceWithMinOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2)
const noexcept
840 jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);
841 auto n =
static_cast<int> (jmin (src1.numSamples, src2.numSamples, numSamples) * sizeFactor);
843 for (
size_t ch = 0; ch < numChannels; ++ch)
847 template <
typename Src1SampleType,
typename Src2SampleType>
848 void replaceWithMaxOfInternal (AudioBlock<Src1SampleType> src1, AudioBlock<Src2SampleType> src2)
const noexcept
850 jassert (numChannels == src1.numChannels && src1.numChannels == src2.numChannels);
851 auto n =
static_cast<int> (jmin (src1.numSamples, src2.numSamples, numSamples) * sizeFactor);
853 for (
size_t ch = 0; ch < numChannels; ++ch)
858 using ChannelCountType =
unsigned int;
861 static constexpr size_t sizeFactor =
sizeof (SampleType) /
sizeof (NumericType);
862 static constexpr size_t elementMask = sizeFactor - 1;
863 static constexpr size_t byteMask = (sizeFactor *
sizeof (NumericType)) - 1;
866 static constexpr size_t defaultAlignment =
sizeof (SIMDRegister<NumericType>);
868 static constexpr size_t defaultAlignment =
sizeof (NumericType);
871 SampleType*
const* channels;
872 ChannelCountType numChannels = 0;
873 size_t startSample = 0, numSamples = 0;
875 template <
typename OtherSampleType>