33#include < juce_audio_utils/juce_audio_utils.h>
44
55constexpr auto ATK_CORRECTION_RATE = 1 + 1000 .0f / 1000000 ; // 1000 ppm
6- constexpr auto ATK_SMOOTHING_TIME = 1 . 0f ; // 1 second
6+ constexpr auto ATK_SMOOTHING_TIME = 0 . 1f ; // seconds
77
88class FifoBuffer2 : public juce ::Timer
99{
@@ -263,9 +263,8 @@ class SyncBuffer : public juce::Timer
263263
264264 tempBuffer.setSize (numChannels, 2 * std::max (readerBufferSize, writerBufferSize), false , false , true );
265265
266- rateSmoothing.reset (readerSampleRate, ATK_SMOOTHING_TIME);
266+ rateSmoothing.reset (readerSampleRate * ATK_SMOOTHING_TIME);
267267 rateSmoothing.setCurrentAndTargetValue (1.0 );
268- rateSmoothingBuffer.setSize (numChannels, readerBufferSize, false , false , true );
269268
270269 tempBuffer.clear ();
271270 fifoBuffer.write (tempBuffer.getArrayOfWritePointers (), numChannels, minBufferSize);
@@ -326,18 +325,7 @@ class SyncBuffer : public juce::Timer
326325 else if (maxAvailable > maxBufferSize)
327326 factor = ATK_CORRECTION_RATE;
328327
329- rateSmoothing.setTargetValue (factor);
330- rateSmoothingBuffer.setSize (1 , numSamples, false , false , true );
331- float maxFactor = 0 .0f ;
332- for (int i = 0 ; i < numSamples; ++i)
333- {
334- auto currentFactor = rateSmoothing.getNextValue ();
335- if (currentFactor > maxFactor)
336- maxFactor = currentFactor;
337- rateSmoothingBuffer.getWritePointer (0 )[i] = currentFactor;
338- }
339-
340- int writerSamplesNeeded = std::ceil (numSamples * ratio * maxFactor);
328+ int writerSamplesNeeded = std::ceil (numSamples * ratio * factor);
341329
342330 if (!addToBuffer)
343331 for (int ch = 0 ; ch < numChannels; ++ch)
@@ -352,30 +340,35 @@ class SyncBuffer : public juce::Timer
352340 {
353341#ifdef JUCE_DEBUG
354342 DBG (juce::Time::getCurrentTime ().toString (true , true )
355- << " got " << writerSamples << " needed " << writerSamplesNeeded << " ratio " << ratio);
343+ << " got " << writerSamples << " needed " << writerSamplesNeeded << " ratio " << ratio << " factor "
344+ << factor);
356345#endif
357- // return false;
346+ return false ;
358347 }
359348
360349 if (!addToBuffer)
361350 for (int ch = 0 ; ch < numChannels; ++ch)
362351 std::memset (dest[ch], 0 , sizeof (float ) * numSamples);
363352
364- auto smoothingReadPtr = rateSmoothingBuffer.getReadPointer (0 );
365353 auto totalSamplesConsumed = 0 ;
366354
367- auto finalRatio = 0 .0f ;
355+ auto initialRate = rateSmoothing.getCurrentValue ();
356+
357+ auto finalRatio = 0.0 ;
368358 for (int i = 0 ; i < numChannels; i++)
369359 {
370360 totalSamplesConsumed = 0 ;
371361 int samplesAvailable = writerSamples;
372362
373363 auto ch = i % numChannels;
374364
365+ rateSmoothing.setCurrentAndTargetValue (initialRate);
366+ rateSmoothing.setTargetValue (factor);
367+
375368 for (int j = 0 ; j < numSamples; ++j)
376369 {
377- auto currentFactor = smoothingReadPtr[j] ;
378- finalRatio = ratio * currentFactor ;
370+ auto smoothingValue = rateSmoothing. getNextValue () ;
371+ finalRatio = ratio * smoothingValue ;
379372
380373 int samplesConsumed = interpolators[i].processAdding (
381374 finalRatio,
@@ -393,7 +386,7 @@ class SyncBuffer : public juce::Timer
393386
394387#ifdef JUCE_DEBUG
395388 if (!juce::approximatelyEqual (finalRatio, prevFinalRatio)
396- && juce::approximatelyEqual (finalRatio, (float )(writerSampleRate / readerSampleRate)))
389+ && juce::approximatelyEqual (finalRatio, (double )(writerSampleRate / readerSampleRate)))
397390 DBG (" time: " << juce::Time::getCurrentTime ().toString (true , true )
398391 << juce::String (" final ratio " ) + juce::String (finalRatio));
399392#endif
@@ -424,11 +417,10 @@ class SyncBuffer : public juce::Timer
424417 int minBufferSize{0 };
425418 int maxBufferSize{0 };
426419
427- juce::LinearSmoothedValue<float > rateSmoothing;
428- juce::AudioBuffer<float > rateSmoothingBuffer;
420+ juce::LinearSmoothedValue<double > rateSmoothing;
429421
430422 juce::CriticalSection readLock;
431423 juce::CriticalSection writeLock;
432424
433- float prevFinalRatio{1 .0f };
425+ double prevFinalRatio{1.0 };
434426};
0 commit comments