Tidy, and avoid warnings from over-reading from ring buffer

This commit is contained in:
Chris Cannam
2022-05-23 20:55:56 +01:00
parent 89c8683aaf
commit cd0ee3e4f6

View File

@@ -113,9 +113,9 @@ R3StretcherImpl::process(const float *const *input, size_t samples, bool final)
{ {
//!!! todo: final //!!! todo: final
m_parameters.logger("process called"); //!!! m_parameters.logger("process called");
if (final) { if (final) {
m_parameters.logger("final = true"); // m_parameters.logger("final = true");
m_draining = true; m_draining = true;
} }
@@ -143,7 +143,7 @@ R3StretcherImpl::process(const float *const *input, size_t samples, bool final)
int int
R3StretcherImpl::available() const R3StretcherImpl::available() const
{ {
m_parameters.logger("available called"); //!!! m_parameters.logger("available called");
int av = int(m_channelData[0]->outbuf->getReadSpace()); int av = int(m_channelData[0]->outbuf->getReadSpace());
if (av == 0 && m_draining) return -1; if (av == 0 && m_draining) return -1;
else return av; else return av;
@@ -152,7 +152,7 @@ R3StretcherImpl::available() const
size_t size_t
R3StretcherImpl::retrieve(float *const *output, size_t samples) const R3StretcherImpl::retrieve(float *const *output, size_t samples) const
{ {
m_parameters.logger("retrieve called"); //!!! m_parameters.logger("retrieve called");
size_t got = samples; size_t got = samples;
for (size_t c = 0; c < m_parameters.channels; ++c) { for (size_t c = 0; c < m_parameters.channels; ++c) {
@@ -185,21 +185,33 @@ R3StretcherImpl::consume()
double instantaneousRatio = double(outhop) / double(m_inhop); double instantaneousRatio = double(outhop) / double(m_inhop);
while ((m_draining || m_channelData[0]->inbuf->getReadSpace() >= longest) && while (m_channelData.at(0)->outbuf->getWriteSpace() >= outhop) {
m_channelData[0]->outbuf->getWriteSpace() >= outhop) {
m_parameters.logger("consume looping"); //!!! m_parameters.logger("consume looping");
if (m_draining && m_channelData[0]->inbuf->getReadSpace() == 0) { int readSpace = m_channelData.at(0)->inbuf->getReadSpace();
if (readSpace < longest) {
if (m_draining) {
if (readSpace == 0) {
break; break;
} }
} else {
break;
}
}
for (int c = 0; c < m_parameters.channels; ++c) { for (int c = 0; c < m_parameters.channels; ++c) {
auto cd = m_channelData.at(c); auto cd = m_channelData.at(c);
auto longestScale = cd->scales.at(longest); auto longestScale = cd->scales.at(longest);
auto buf = longestScale->timeDomainFrame.data();
cd->inbuf->peek(longestScale->timeDomainFrame.data(), longest); if (readSpace < longest) {
v_zero(buf, longest);
cd->inbuf->peek(buf, readSpace);
} else {
cd->inbuf->peek(buf, longest);
}
for (auto it: cd->scales) { for (auto it: cd->scales) {
int fftSize = it.first; int fftSize = it.first;
@@ -207,17 +219,10 @@ R3StretcherImpl::consume()
if (fftSize == longest) continue; if (fftSize == longest) continue;
int offset = (longest - fftSize) / 2; int offset = (longest - fftSize) / 2;
m_scaleData.at(fftSize)->analysisWindow.cut m_scaleData.at(fftSize)->analysisWindow.cut
(longestScale->timeDomainFrame.data() + offset, (buf + offset, scale->timeDomainFrame.data());
scale->timeDomainFrame.data());
} }
m_scaleData.at(longest)->analysisWindow.cut m_scaleData.at(longest)->analysisWindow.cut(buf);
(longestScale->timeDomainFrame.data());
}
for (int c = 0; c < m_parameters.channels; ++c) {
auto cd = m_channelData.at(c);
for (auto it: cd->scales) { for (auto it: cd->scales) {
int fftSize = it.first; int fftSize = it.first;
@@ -229,13 +234,11 @@ R3StretcherImpl::consume()
v_scale(scale->mag.data(), 1.f / float(fftSize), v_scale(scale->mag.data(), 1.f / float(fftSize),
scale->mag.size()); scale->mag.size());
} }
}
for (int c = 0; c < m_parameters.channels; ++c) {
auto cd = m_channelData.at(c);
auto classifyScale = cd->scales.at(classify); auto classifyScale = cd->scales.at(classify);
cd->prevSegmentation = cd->segmentation; cd->prevSegmentation = cd->segmentation;
cd->segmentation = cd->segmenter->segment(classifyScale->mag.data()); cd->segmentation =
cd->segmenter->segment(classifyScale->mag.data());
m_troughPicker.findNearestAndNextPeaks m_troughPicker.findNearestAndNextPeaks
(classifyScale->mag.data(), 3, nullptr, (classifyScale->mag.data(), 3, nullptr,
classifyScale->nextTroughs.data()); classifyScale->nextTroughs.data());
@@ -340,10 +343,16 @@ R3StretcherImpl::consume()
v_zero(acc.data() + n, outhop); v_zero(acc.data() + n, outhop);
} }
cd->outbuf->write(cd->mixdown.data(), outhop); cd->outbuf->write(cd->mixdown.data(), outhop);
if (readSpace < m_inhop) {
// This should happen only when draining
cd->inbuf->skip(readSpace);
} else {
cd->inbuf->skip(m_inhop); cd->inbuf->skip(m_inhop);
} }
} }
} }
}
} }