70{
71 bool rc = true;
72
73 auto first = start;
74
79 float *pointers0[2]{ buffers0[0].get(),
80 width > 1 ? buffers0[1].get() : nullptr };
83 float *pointers1[2]{ buffers1[0].get(),
84 width > 1 ? buffers1[1].get() : nullptr };
85 constexpr auto reverseBuffers =
86 [](
float *
const (&pointers)[2],
size_t size){
87 for (const auto pointer : pointers)
88 if (pointer)
89 std::reverse(pointer, pointer +
size);
90 };
91
92 auto originalLen = originalEnd - originalStart;
93
94 while (len > 1) {
95 auto block =
97 auto second = first + (len - block);
98
99 track.
GetFloats(0, width, pointers0, first, block);
100 reverseBuffers(pointers0, block);
101 track.
GetFloats(0, width, pointers1, second, block);
102 reverseBuffers(pointers1, block);
103
104 const bool success =
106 &&
108 if (!success)
109 return false;
110
111 len -= 2 * block;
112 first += block;
113
114 if (!report(
115 2 * (first - originalStart).as_double() / originalLen.as_double()
116 )) {
117 rc = false;
118 break;
119 }
120 }
121
122 return rc;
123}
size_t limitSampleBufferSize(size_t bufferSize, sampleCount limit)
bool GetFloats(size_t iChannel, size_t nBuffers, float *const buffers[], sampleCount start, size_t len, bool backwards=false, fillFormat fill=FillFormat::fillZero, bool mayThrow=true, sampleCount *pNumWithinClips=nullptr) const
bool SetFloats(const float *const *buffers, sampleCount start, size_t len, sampleFormat effectiveFormat=widestSampleFormat)
Random-access assignment of a range of samples.
size_t NChannels() const override
A constant property.
size_t GetMaxBlockSize() const
size_t GetBestBlockSize(sampleCount t) const