@@ -241,8 +241,12 @@ class SyncBuffer : public juce::Timer
241241
242242 isPrepared.store (false , std::memory_order_release);
243243
244- if (readerNumChannels < 1 || writerNumChannels < 1 || readerBufferSize < 1 || writerBufferSize < 1
245- || readerSampleRate <= 0.0 || writerSampleRate <= 0.0 )
244+ if ((readerNumChannels < 1 )
245+ || (writerNumChannels < 1 )
246+ || (readerBufferSize < 1 )
247+ || (writerBufferSize < 1 )
248+ || (readerSampleRate <= 0.0 )
249+ || (writerSampleRate <= 0.0 ))
246250 {
247251 return ;
248252 }
@@ -267,6 +271,7 @@ class SyncBuffer : public juce::Timer
267271 rateSmoothing.setCurrentAndTargetValue (1.0 );
268272
269273 tempBuffer.clear ();
274+ fifoBuffer.getFifo ().reset ();
270275 fifoBuffer.write (tempBuffer.getArrayOfWritePointers (), numChannels, minBufferSize);
271276
272277 isPrepared.store (true , std::memory_order_release);
@@ -340,15 +345,22 @@ class SyncBuffer : public juce::Timer
340345 std::memset (dest[ch], 0 , sizeof (float ) * numSamples);
341346
342347 tempBuffer.clear ();
343- tempBuffer.setSize (numChannels, writerSamplesNeeded, false , false , true );
348+
349+ tempBuffer.setSize (writerNumChannels, writerSamplesNeeded, false , false , true );
344350 auto writerSamples =
345- fifoBuffer.read (tempBuffer.getArrayOfWritePointers (), numChannels , writerSamplesNeeded, false );
351+ fifoBuffer.read (tempBuffer.getArrayOfWritePointers (), writerNumChannels , writerSamplesNeeded, false );
346352
347353 if (writerSamples < writerSamplesNeeded)
348354 {
349355#ifdef JUCE_DEBUG
350356 DBG (juce::Time::getCurrentTime ().toString (true , true )
351- << " got " << writerSamples << " needed " << writerSamplesNeeded << " ratio " << ratio << " factor "
357+ << " got "
358+ << writerSamples
359+ << " needed "
360+ << writerSamplesNeeded
361+ << " ratio "
362+ << ratio
363+ << " factor "
352364 << factor);
353365#endif
354366 return false ;
@@ -361,7 +373,7 @@ class SyncBuffer : public juce::Timer
361373 auto totalSamplesConsumed = 0 ;
362374
363375 auto finalRatio = 0.0 ;
364- for (int i = 0 ; i < numChannels ; i++)
376+ for (int i = 0 ; i < writerNumChannels ; i++)
365377 {
366378 totalSamplesConsumed = 0 ;
367379 int samplesAvailable = writerSamples;
@@ -371,6 +383,8 @@ class SyncBuffer : public juce::Timer
371383 rateSmoothing.setCurrentAndTargetValue (initialRate);
372384 rateSmoothing.setTargetValue (factor);
373385
386+ auto outputGain =
387+ 1 .0f * numChannels / writerNumChannels < 1 .0f ? 1 .0f * numChannels / writerNumChannels : 1 .0f ;
374388 for (int j = 0 ; j < numSamples; ++j)
375389 {
376390 auto smoothingValue = rateSmoothing.getNextValue ();
@@ -383,7 +397,7 @@ class SyncBuffer : public juce::Timer
383397 1 ,
384398 samplesAvailable,
385399 0 ,
386- 1 . 0f
400+ outputGain
387401 );
388402 samplesAvailable -= samplesConsumed;
389403 totalSamplesConsumed += samplesConsumed;
@@ -393,8 +407,10 @@ class SyncBuffer : public juce::Timer
393407#ifdef JUCE_DEBUG
394408 if (!juce::approximatelyEqual (finalRatio, prevFinalRatio)
395409 && juce::approximatelyEqual (finalRatio, (double )(writerSampleRate / readerSampleRate)))
396- DBG (" time: " << juce::Time::getCurrentTime ().toString (true , true )
397- << juce::String (" final ratio " ) + juce::String (finalRatio));
410+ DBG (" time: "
411+ << juce::Time::getCurrentTime ().toString (true , true )
412+ << juce::String (" final ratio " )
413+ + juce::String (finalRatio));
398414#endif
399415 prevFinalRatio = finalRatio;
400416 fifoBuffer.advanceRead (totalSamplesConsumed);
0 commit comments