mirror of
https://github.com/azahar-emu/soundtouch
synced 2025-11-13 02:20:05 +01:00
Added switch PREVENT_CLICK_AT_RATE_CROSSOVER to prevent click artifact at crossing the nominal pitch from either side
This commit is contained in:
parent
02483980a5
commit
dc4004e0c3
@ -139,4 +139,11 @@ namespace soundtouch
|
|||||||
#endif // INTEGER_SAMPLES
|
#endif // INTEGER_SAMPLES
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// When this #define is active, eliminates a clicking sound when the "rate" or "pitch"
|
||||||
|
// parameter setting crosses from value <1 to >=1 or vice versa during processing.
|
||||||
|
// Default is off as such crossover is untypical case and involves a slight sound
|
||||||
|
// quality compromise.
|
||||||
|
//#define PREVENT_CLICK_AT_RATE_CROSSOVER 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -243,7 +243,25 @@ void SoundTouch::calcEffectiveRateAndTempo()
|
|||||||
if (!TEST_FLOAT_EQUAL(rate,oldRate)) pRateTransposer->setRate(rate);
|
if (!TEST_FLOAT_EQUAL(rate,oldRate)) pRateTransposer->setRate(rate);
|
||||||
if (!TEST_FLOAT_EQUAL(tempo, oldTempo)) pTDStretch->setTempo(tempo);
|
if (!TEST_FLOAT_EQUAL(tempo, oldTempo)) pTDStretch->setTempo(tempo);
|
||||||
|
|
||||||
if (rate > 1.0f)
|
#ifndef 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
|
||||||
|
pTDStretch->moveSamples(*pRateTransposer->getStore());
|
||||||
|
|
||||||
|
output = pTDStretch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
if (output != pRateTransposer)
|
if (output != pRateTransposer)
|
||||||
{
|
{
|
||||||
@ -259,23 +277,6 @@ void SoundTouch::calcEffectiveRateAndTempo()
|
|||||||
output = pRateTransposer;
|
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -316,6 +317,7 @@ void SoundTouch::putSamples(const SAMPLETYPE *samples, uint nSamples)
|
|||||||
pTDStretch->putSamples(samples, nSamples);
|
pTDStretch->putSamples(samples, nSamples);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
#ifndef _PREVENT_CLICK_AT_RATE_CROSSOVER
|
||||||
else if (rate <= 1.0f)
|
else if (rate <= 1.0f)
|
||||||
{
|
{
|
||||||
// transpose the rate down, output the transposed sound to tempo changer buffer
|
// transpose the rate down, output the transposed sound to tempo changer buffer
|
||||||
@ -324,8 +326,8 @@ void SoundTouch::putSamples(const SAMPLETYPE *samples, uint nSamples)
|
|||||||
pTDStretch->moveSamples(*pRateTransposer);
|
pTDStretch->moveSamples(*pRateTransposer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
assert(rate > 1.0f);
|
|
||||||
// evaluate the tempo changer, then transpose the rate up,
|
// evaluate the tempo changer, then transpose the rate up,
|
||||||
assert(output == pRateTransposer);
|
assert(output == pRateTransposer);
|
||||||
pTDStretch->putSamples(samples, nSamples);
|
pTDStretch->putSamples(samples, nSamples);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user