17 mLoopStartFrame(0), mLoopEndFrame(0), mParentBuffer(parent) {
28 int offsetFrame = offset;
32 while (offsetFrame < 0)
33 offsetFrame += bufferSize;
34 while ((
unsigned) offsetFrame > bufferSize)
35 offsetFrame -= bufferSize;
46 mCurrentFrame = mTempCurrentFrame;
54 unsigned numFrames = outputBuffer.mNumFrames;
55 unsigned currentFrame = mCurrentFrame;
56 unsigned ringBufferStartFrame = mLoopStartFrame;
57 unsigned ringBufferEndFrame = mParentBuffer->mBuffer.mNumFrames - mLoopEndFrame;
58 unsigned currentBufNum = outBufNum % (mParentBuffer->mBuffer.mNumChannels);
59 unsigned framesWritten = 0;
63 if (currentFrame > ringBufferEndFrame)
64 currentFrame = ringBufferStartFrame;
65 else if (currentFrame < ringBufferStartFrame)
66 currentFrame = ringBufferStartFrame;
69 SampleBuffer currentBufferPtr = mParentBuffer->mBuffer.buffer(currentBufNum) + currentFrame;
70 SampleBuffer outputBufferPtr = outputBuffer.buffer(outBufNum);
72 for (; numFrames > 0; numFrames -= framesWritten) {
73 canCopyToEnd = (currentFrame + numFrames) > ringBufferEndFrame;
74 framesWritten = canCopyToEnd ? (ringBufferEndFrame - currentFrame) : numFrames;
75 memcpy(outputBufferPtr, currentBufferPtr, framesWritten *
sizeof(
sample*));
77 currentFrame = ringBufferStartFrame;
79 currentFrame += framesWritten;
81 currentBufferPtr = mParentBuffer->mBuffer.buffer(currentBufNum) + currentFrame;
82 outputBufferPtr += framesWritten;
84 mTempCurrentFrame = currentFrame;
90 unsigned numOutputBuffers = outputBuffer.mNumChannels;
93 for (i = 0; i < numOutputBuffers; i++)
94 destructiveNextBuffer(outputBuffer, i);
96 mCurrentFrame = mTempCurrentFrame;
104 unsigned numFrames = outputBuffer.mNumFrames;
105 unsigned currentFrame = mCurrentFrame;
106 unsigned ringBufferStartFrame = mLoopStartFrame;
107 unsigned ringBufferEndFrame = mParentBuffer->mBuffer.mNumFrames - mLoopEndFrame;
109 if (currentFrame > ringBufferEndFrame)
110 currentFrame = ringBufferStartFrame;
111 else if (currentFrame < ringBufferStartFrame)
112 currentFrame = ringBufferStartFrame;
113 unsigned currentBufNum = outBufNum % (mParentBuffer->mBuffer.mNumChannels);
114 SampleBuffer currentBufferPtr = mParentBuffer->mBuffer.buffer(currentBufNum) + currentFrame;
115 SampleBuffer outputBufferPtr = outputBuffer.buffer(outBufNum);
117 unsigned framesWritten = 0;
118 for (; numFrames > 0; numFrames -= framesWritten) {
119 bool copyToEnd = (currentFrame + numFrames) > ringBufferEndFrame;
120 framesWritten = copyToEnd ? (ringBufferEndFrame - currentFrame) : numFrames;
121 memcpy (outputBufferPtr, currentBufferPtr, framesWritten *
sizeof(
sample*));
122 memset (currentBufferPtr, 0, framesWritten *
sizeof(
sample*));
124 currentFrame = ringBufferStartFrame;
126 currentFrame += framesWritten;
128 currentBufferPtr = mParentBuffer->mBuffer.buffer(currentBufNum) + currentFrame;
129 outputBufferPtr += framesWritten;
132 mTempCurrentFrame = currentFrame;
141 setOffset((
int) position);
144 int offsetFrame = mCurrentFrame + position;
145 int bufferSize = mParentBuffer->mBuffer.mNumFrames;
146 while (offsetFrame < 0)
147 offsetFrame += bufferSize;
148 while (offsetFrame > bufferSize)
149 offsetFrame -= bufferSize;
153 setOffset(-1 * position);
156 return mCurrentFrame;
165 mBuffer(), mTempCurrentWriteFrame(0) {
171 mBuffer(nmChannels, nmFrames),
172 mTempCurrentWriteFrame(0) {
179 mBuffer(nmChannels, nmFrames),
180 mTempCurrentWriteFrame(0) {
190 writeBuffer(outputBuffer);
192 return mTap.nextBuffer(outputBuffer);
196 return mTap.destructiveNextBuffer(outputBuffer);
201 mCurrentWriteFrame = mTempCurrentWriteFrame;
206 unsigned numBufs = inputBuffer.mNumChannels;
207 for (
unsigned i = 0; i < numBufs; i++)
208 sumIntoBuffer(inputBuffer, i);
209 mCurrentWriteFrame = mTempCurrentWriteFrame;
214 unsigned writeFrame = mCurrentWriteFrame;
215 unsigned numFrames = mBuffer.mNumFrames;
217 writeFrame += position;
218 while (writeFrame > numFrames)
219 writeFrame -= numFrames;
220 mCurrentWriteFrame = writeFrame;
221 return mCurrentWriteFrame;
226 if (bufNum >= mNumChannels)
return;
227 unsigned numFrames = inputBuffer.mNumFrames;
228 unsigned currentFrame = mCurrentWriteFrame;
229 unsigned ringBufferStartFrame = mTap.mLoopStartFrame;
230 unsigned ringBufferEndFrame = mBuffer.mNumFrames - mTap.mLoopEndFrame;
232 if (currentFrame > ringBufferEndFrame)
233 currentFrame = ringBufferStartFrame;
234 else if (currentFrame < ringBufferStartFrame)
235 currentFrame = ringBufferStartFrame;
237 unsigned framesWritten = 0;
238 unsigned currentBufNum = bufNum % mBuffer.mNumChannels;
239 SampleBuffer currentBufferPtr = mBuffer.buffer(currentBufNum) + currentFrame;
240 SampleBuffer inputBufferPtr = inputBuffer.buffer(bufNum);
242 for (; numFrames > 0; numFrames -= framesWritten) {
243 bool copyToEnd = (currentFrame + numFrames) > ringBufferEndFrame;
244 framesWritten = copyToEnd ? (ringBufferEndFrame - currentFrame) : numFrames;
245 memcpy (currentBufferPtr, inputBufferPtr, framesWritten *
sizeof(
sample*));
247 currentFrame = ringBufferStartFrame;
249 currentFrame += framesWritten;
251 currentBufferPtr = mBuffer.buffer(currentBufNum) + currentFrame;
252 inputBufferPtr += framesWritten;
255 mTempCurrentWriteFrame = currentFrame;
261 unsigned numFrames = inputBuffer.mNumFrames;
262 unsigned currentFrame = mCurrentWriteFrame;
263 unsigned ringBufferStartFrame = mTap.mLoopStartFrame;
264 unsigned ringBufferEndFrame = mBuffer.mNumFrames - mTap.mLoopEndFrame;
266 if (currentFrame > ringBufferEndFrame)
267 currentFrame = ringBufferStartFrame;
268 else if (currentFrame < ringBufferStartFrame)
269 currentFrame = ringBufferStartFrame;
271 unsigned framesWritten = 0;
272 unsigned currentBufNum = bufNum % mBuffer.mNumChannels;
275 SampleBuffer currentBufferPtr = mBuffer.buffer(currentBufNum) + currentFrame;
276 SampleBuffer inputBufferPtr = inputBuffer.buffer(bufNum);
278 for (; numFrames > 0; numFrames -= framesWritten) {
279 canCopyToEnd = (currentFrame + numFrames) > ringBufferEndFrame;
280 framesWritten = canCopyToEnd ? (ringBufferEndFrame - currentFrame) : numFrames;
282 for (
unsigned i = 0; i < framesWritten; i++)
283 *currentBufferPtr++ += *inputBufferPtr++;
286 currentFrame = ringBufferStartFrame;
287 currentBufferPtr = mBuffer.buffer(currentBufNum) + currentFrame;
289 currentFrame += framesWritten;
293 mTempCurrentWriteFrame = currentFrame;
308 mCurrentFrame = position;
311 mCurrentFrame += position;
314 mCurrentFrame = mBuffer->mNumFrames - position;
317 return mCurrentFrame;
322 mCurrentFrame = mTempCurrentFrame;
328 mCurrentWriteFrame = mTempCurrentWriteFrame;
334 unsigned numFrames = outputBuffer.mNumFrames;
335 unsigned currentFrame = mCurrentFrame;
336 unsigned bufferEndFrame = mBuffer->mNumFrames;
337 unsigned currentBufNum = outBufNum % (mBuffer->mNumChannels);
338 SampleBuffer outputBufferPtr = outputBuffer.buffer(outBufNum);
341 if (currentFrame > bufferEndFrame) {
342 memset(outputBufferPtr, 0, numFrames);
346 SampleBuffer currentBufPtr = mBuffer->buffer(currentBufNum) + currentFrame;
347 unsigned framesWritten = 0;
348 bool copyToEnd = (currentFrame + numFrames) > bufferEndFrame;
349 framesWritten = copyToEnd ? (bufferEndFrame - currentFrame) : numFrames;
350 memcpy (outputBufferPtr, currentBufPtr, framesWritten *
sizeof(
sample*));
351 currentFrame += framesWritten;
352 if (framesWritten < numFrames) {
353 outputBufferPtr += framesWritten;
354 memset(outputBufferPtr, 0, numFrames - framesWritten);
356 mTempCurrentFrame = currentFrame;
362 unsigned numFrames = inputBuffer.mNumFrames;
363 unsigned currentFrame = mCurrentWriteFrame;
364 unsigned bufferEndFrame = mBuffer->mNumFrames;
366 if (currentFrame > bufferEndFrame) {
371 unsigned currentBufNum = bufNum % mBuffer->mNumChannels;
372 SampleBuffer currentBufPtr = mBuffer->buffer(currentBufNum) + currentFrame;
373 SampleBuffer inputBufferPtr = inputBuffer.buffer(bufNum);
374 unsigned framesWritten = 0;
375 bool copyToEnd = (currentFrame + numFrames) > bufferEndFrame;
376 framesWritten = copyToEnd ? (bufferEndFrame - currentFrame) : numFrames;
377 memcpy (currentBufPtr, inputBufferPtr, framesWritten *
sizeof(
sample*));
378 currentFrame += framesWritten;
380 mTempCurrentWriteFrame = currentFrame;