Fix latency calculations in resample-before modes. This affects realtime use in the non-recommended realtime pitch modes (i.e. those other than HighConsistency)

This commit is contained in:
Chris Cannam
2023-02-20 15:26:12 +00:00
parent afd1b1f86c
commit 1368ba87ee
3 changed files with 217 additions and 34 deletions

View File

@@ -667,6 +667,7 @@ R2Stretcher::configure()
size_t rbs =
lrintf(ceil((m_increment * m_timeRatio * 2) / m_pitchScale));
if (rbs < m_increment * 16) rbs = m_increment * 16;
if (rbs < m_aWindowSize * 2) rbs = m_aWindowSize * 2;
m_channelData[c]->setResampleBufSize(rbs);
}
}
@@ -823,14 +824,28 @@ size_t
R2Stretcher::getPreferredStartPad() const
{
if (!m_realtime) return 0;
return m_aWindowSize/2;
size_t pad = m_aWindowSize / 2;
if (resampleBeforeStretching()) {
return size_t(ceil(pad * m_pitchScale));
} else {
return pad;
}
}
size_t
R2Stretcher::getStartDelay() const
{
if (!m_realtime) return 0;
return lrint((m_aWindowSize/2) / m_pitchScale);
size_t pad = m_aWindowSize / 2;
if (resampleBeforeStretching()) {
return pad;
} else {
return size_t(ceil(pad / m_pitchScale));
}
}
void
@@ -1202,6 +1217,10 @@ R2Stretcher::getSamplesRequired() const
}
}
}
if (resampleBeforeStretching() && m_pitchScale > 1.0) {
reqd = size_t(ceil(double(reqd) * m_pitchScale));
}
return reqd;
}