Tidy, and avoid warnings from over-reading from ring buffer
This commit is contained in:
@@ -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();
|
||||||
break;
|
if (readSpace < longest) {
|
||||||
|
if (m_draining) {
|
||||||
|
if (readSpace == 0) {
|
||||||
|
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,7 +343,13 @@ 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);
|
||||||
cd->inbuf->skip(m_inhop);
|
|
||||||
|
if (readSpace < m_inhop) {
|
||||||
|
// This should happen only when draining
|
||||||
|
cd->inbuf->skip(readSpace);
|
||||||
|
} else {
|
||||||
|
cd->inbuf->skip(m_inhop);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user