16 std::vector<float*> offsetBuffer(numChannels);
17 for (
auto i = 0u; i < numChannels; ++i)
19 offsetBuffer[i] = buffer[i] + offset;
27 const auto timeRatio =
params.timeRatio.value_or(1.);
28 const auto pitchRatio =
params.pitchRatio.value_or(1.);
35 auto timeAndPitch = std::make_unique<staffpad::TimeAndPitch>();
36 timeAndPitch->setup(
static_cast<int>(numChannels),
maxBlockSize);
37 timeAndPitch->setTimeStretchAndPitchFactor(timeRatio, pitchRatio);
45 : mAudioSource(audioSource)
47 , mNumChannels(numChannels)
48 , mTimeRatio(parameters.timeRatio.value_or(1.))
60 auto numOutputSamples = 0u;
61 while (numOutputSamples < outputLen)
63 auto numOutputSamplesAvailable =
65 while (numOutputSamplesAvailable == 0)
68 while (numRequired > 0)
73 numRequired -= numSamplesToFeed;
75 numOutputSamplesAvailable =
78 while (numOutputSamples < outputLen && numOutputSamplesAvailable > 0)
80 const auto numSamplesToGet =
82 static_cast<int>(outputLen - numOutputSamples) });
86 numOutputSamplesAvailable -= numSamplesToGet;
87 numOutputSamples += numSamplesToGet;
99 auto numOutputSamplesToDiscard =
102 while (numOutputSamplesToDiscard > 0)
105 while (numRequired > 0)
110 numRequired -= numSamplesToFeed;
112 const auto totalNumSamplesToRetrieve =
std::min(
114 numOutputSamplesToDiscard);
115 auto totalNumRetrievedSamples = 0;
116 while (totalNumRetrievedSamples < totalNumSamplesToRetrieve)
118 const auto numSamplesToRetrieve =
std::min(
119 maxBlockSize, totalNumSamplesToRetrieve - totalNumRetrievedSamples);
121 totalNumRetrievedSamples += numSamplesToRetrieve;
123 numOutputSamplesToDiscard -= totalNumSamplesToRetrieve;
EffectDistortionSettings params
StaffPadTimeAndPitch(size_t numChannels, TimeAndPitchSource &, const Parameters &)
TimeAndPitchSource & mAudioSource
const std::unique_ptr< staffpad::TimeAndPitch > mTimeAndPitch
void GetSamples(float *const *, size_t) override
const size_t mNumChannels
AudioContainer mReadBuffer
static bool IsPassThroughMode(double stretchRatio)
virtual void Pull(float *const *, size_t samplesPerChannel)=0
std::unique_ptr< staffpad::TimeAndPitch > MaybeCreateTimeAndPitch(size_t numChannels, const TimeAndPitchInterface::Parameters ¶ms)
std::vector< float * > GetOffsetBuffer(float *const *buffer, size_t numChannels, size_t offset)
constexpr auto maxBlockSize
float *const * Get() const