/// Returns number of samples currently unprocessed. uint SoundTouch::numUnprocessedSamples() const { FIFOSamplePipe * psp; if (pTDStretch) { psp = pTDStretch->getInput(); if (psp) { return psp->numSamples(); } } return 0; }
// Calculates 'effective' rate and tempo values from the // nominal control values. void SoundTouch::calcEffectiveRateAndTempo() { double oldTempo = tempo; double oldRate = rate; tempo = virtualTempo / virtualPitch; rate = virtualPitch * virtualRate; if (!TEST_FLOAT_EQUAL(rate,oldRate)) pRateTransposer->setRate(rate); if (!TEST_FLOAT_EQUAL(tempo, oldTempo)) pTDStretch->setTempo(tempo); #ifndef SOUNDTOUCH_PREVENT_CLICK_AT_RATE_CROSSOVER if (rate <= 1.0f) { if (output != pTDStretch) { FIFOSamplePipe *tempoOut; assert(output == pRateTransposer); // move samples in the current output buffer to the output of pTDStretch tempoOut = pTDStretch->getOutput(); tempoOut->moveSamples(*output); // move samples in pitch transposer's store buffer to tempo changer's input // deprecated : pTDStretch->moveSamples(*pRateTransposer->getStore()); output = pTDStretch; } } else #endif { if (output != pRateTransposer) { FIFOSamplePipe *transOut; assert(output == pTDStretch); // move samples in the current output buffer to the output of pRateTransposer transOut = pRateTransposer->getOutput(); transOut->moveSamples(*output); // move samples in tempo changer's input to pitch transposer's input pRateTransposer->moveSamples(*pTDStretch->getInput()); output = pRateTransposer; } } }
// Calculates 'effective' rate and tempo values from the // nominal control values. void SoundTouch::calcEffectiveRateAndTempo() { float oldTempo = tempo; float oldRate = rate; tempo = virtualTempo / virtualPitch; rate = virtualPitch * virtualRate; if (rate != oldRate) pRateTransposer->setRate(rate); if (tempo != oldTempo) pTDStretch->setTempo(tempo); if (rate > 1.0f) { if (output != pRateTransposer) { FIFOSamplePipe *transOut; assert(output == pTDStretch); // move samples in the current output buffer to the output of pRateTransposer transOut = pRateTransposer->getOutput(); transOut->moveSamples(*output); // move samples in tempo changer's input to pitch transposer's input pRateTransposer->moveSamples(*pTDStretch->getInput()); output = pRateTransposer; } } else { if (output != pTDStretch) { FIFOSamplePipe *tempoOut; assert(output == pRateTransposer); // move samples in the current output buffer to the output of pTDStretch tempoOut = pTDStretch->getOutput(); tempoOut->moveSamples(*output); // move samples in pitch transposer's store buffer to tempo changer's input pTDStretch->moveSamples(*pRateTransposer->getStore()); output = pTDStretch; } } }