Fix some non-realtime-safe operations reported by Stoat
This commit is contained in:
@@ -24,7 +24,7 @@
|
|||||||
#ifndef RUBBERBAND_STRETCHERIMPL_H
|
#ifndef RUBBERBAND_STRETCHERIMPL_H
|
||||||
#define RUBBERBAND_STRETCHERIMPL_H
|
#define RUBBERBAND_STRETCHERIMPL_H
|
||||||
|
|
||||||
#include "../rubberband/RubberBandStretcher.h"
|
#include "../../rubberband/RubberBandStretcher.h"
|
||||||
|
|
||||||
#include "../common/Window.h"
|
#include "../common/Window.h"
|
||||||
#include "../common/FFT.h"
|
#include "../common/FFT.h"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#include "R3StretcherImpl.h"
|
#include "R3StretcherImpl.h"
|
||||||
|
|
||||||
#include "common/VectorOpsComplex.h"
|
#include "../common/VectorOpsComplex.h"
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
@@ -112,6 +112,7 @@ R3StretcherImpl::getSamplesRequired() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//!!! __attribute__((annotate("realtime")))
|
||||||
void
|
void
|
||||||
R3StretcherImpl::process(const float *const *input, size_t samples, bool final)
|
R3StretcherImpl::process(const float *const *input, size_t samples, bool final)
|
||||||
{
|
{
|
||||||
@@ -144,6 +145,7 @@ R3StretcherImpl::process(const float *const *input, size_t samples, bool final)
|
|||||||
consume();
|
consume();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//!!! __attribute__((annotate("realtime")))
|
||||||
int
|
int
|
||||||
R3StretcherImpl::available() const
|
R3StretcherImpl::available() const
|
||||||
{
|
{
|
||||||
@@ -153,6 +155,7 @@ R3StretcherImpl::available() const
|
|||||||
else return av;
|
else return av;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//!!! __attribute__((annotate("realtime")))
|
||||||
size_t
|
size_t
|
||||||
R3StretcherImpl::retrieve(float *const *output, size_t samples) const
|
R3StretcherImpl::retrieve(float *const *output, size_t samples) const
|
||||||
{
|
{
|
||||||
@@ -209,9 +212,15 @@ R3StretcherImpl::consume()
|
|||||||
|
|
||||||
for (int c = 0; c < m_parameters.channels; ++c) {
|
for (int c = 0; c < m_parameters.channels; ++c) {
|
||||||
|
|
||||||
auto cd = m_channelData.at(c);
|
// Our ChannelData, ScaleData, and ChannelScaleData maps
|
||||||
auto longestScale = cd->scales.at(longest);
|
// contain shared_ptrs; whenever we put one in a variable
|
||||||
auto buf = longestScale->timeDomain.data();
|
// in here we should use a reference, to avoid copying the
|
||||||
|
// shared_ptr (which is not realtime safe). Same goes for
|
||||||
|
// the map iterators.
|
||||||
|
|
||||||
|
auto &cd = m_channelData.at(c);
|
||||||
|
auto &longestScale = cd->scales.at(longest);
|
||||||
|
double *buf = longestScale->timeDomain.data();
|
||||||
|
|
||||||
if (readSpace < longest) {
|
if (readSpace < longest) {
|
||||||
v_zero(buf, longest);
|
v_zero(buf, longest);
|
||||||
@@ -220,9 +229,9 @@ R3StretcherImpl::consume()
|
|||||||
cd->inbuf->peek(buf, longest);
|
cd->inbuf->peek(buf, longest);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto it: cd->scales) {
|
for (auto &it: cd->scales) {
|
||||||
int fftSize = it.first;
|
int fftSize = it.first;
|
||||||
auto scale = it.second;
|
auto &scale = it.second;
|
||||||
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
|
||||||
@@ -231,9 +240,9 @@ R3StretcherImpl::consume()
|
|||||||
|
|
||||||
m_scaleData.at(longest)->analysisWindow.cut(buf);
|
m_scaleData.at(longest)->analysisWindow.cut(buf);
|
||||||
|
|
||||||
for (auto it: cd->scales) {
|
for (auto &it: cd->scales) {
|
||||||
int fftSize = it.first;
|
int fftSize = it.first;
|
||||||
auto scale = it.second;
|
auto &scale = it.second;
|
||||||
|
|
||||||
v_fftshift(scale->timeDomain.data(), fftSize);
|
v_fftshift(scale->timeDomain.data(), fftSize);
|
||||||
m_scaleData.at(fftSize)->fft.forward
|
m_scaleData.at(fftSize)->fft.forward
|
||||||
@@ -258,7 +267,7 @@ R3StretcherImpl::consume()
|
|||||||
scale->mag.size());
|
scale->mag.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
auto classifyScale = cd->scales.at(classify);
|
auto &classifyScale = cd->scales.at(classify);
|
||||||
cd->prevSegmentation = cd->segmentation;
|
cd->prevSegmentation = cd->segmentation;
|
||||||
cd->segmentation =
|
cd->segmentation =
|
||||||
cd->segmenter->segment(classifyScale->mag.data());
|
cd->segmenter->segment(classifyScale->mag.data());
|
||||||
@@ -275,11 +284,11 @@ R3StretcherImpl::consume()
|
|||||||
cd->guidance);
|
cd->guidance);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto it : m_channelData[0]->scales) {
|
for (auto &it : m_channelData[0]->scales) {
|
||||||
int fftSize = it.first;
|
int fftSize = it.first;
|
||||||
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 classifyScale = cd->scales.at(fftSize);
|
auto &classifyScale = cd->scales.at(fftSize);
|
||||||
m_channelAssembly.mag[c] = classifyScale->mag.data();
|
m_channelAssembly.mag[c] = classifyScale->mag.data();
|
||||||
m_channelAssembly.phase[c] = classifyScale->phase.data();
|
m_channelAssembly.phase[c] = classifyScale->phase.data();
|
||||||
m_channelAssembly.guidance[c] = &cd->guidance;
|
m_channelAssembly.guidance[c] = &cd->guidance;
|
||||||
@@ -297,10 +306,10 @@ R3StretcherImpl::consume()
|
|||||||
|
|
||||||
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);
|
||||||
|
|
||||||
for (auto it : cd->scales) {
|
for (auto &it : cd->scales) {
|
||||||
auto scale = it.second;
|
auto &scale = it.second;
|
||||||
int bufSize = scale->bufSize;
|
int bufSize = scale->bufSize;
|
||||||
// copy to prevMag before filtering
|
// copy to prevMag before filtering
|
||||||
v_copy(scale->prevMag.data(), scale->mag.data(), bufSize);
|
v_copy(scale->prevMag.data(), scale->mag.data(), bufSize);
|
||||||
@@ -309,8 +318,8 @@ R3StretcherImpl::consume()
|
|||||||
|
|
||||||
for (const auto &band : cd->guidance.fftBands) {
|
for (const auto &band : cd->guidance.fftBands) {
|
||||||
int fftSize = band.fftSize;
|
int fftSize = band.fftSize;
|
||||||
auto scale = cd->scales.at(fftSize);
|
auto &scale = cd->scales.at(fftSize);
|
||||||
auto scaleData = m_scaleData.at(fftSize);
|
auto &scaleData = m_scaleData.at(fftSize);
|
||||||
|
|
||||||
//!!! messy and slow, but leave it until we've
|
//!!! messy and slow, but leave it until we've
|
||||||
//!!! discovered whether we need a window accumulator
|
//!!! discovered whether we need a window accumulator
|
||||||
@@ -337,10 +346,10 @@ R3StretcherImpl::consume()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto it : cd->scales) {
|
for (auto &it : cd->scales) {
|
||||||
int fftSize = it.first;
|
int fftSize = it.first;
|
||||||
auto scale = it.second;
|
auto &scale = it.second;
|
||||||
auto scaleData = m_scaleData.at(fftSize);
|
auto &scaleData = m_scaleData.at(fftSize);
|
||||||
|
|
||||||
for (const auto &b : m_guideConfiguration.fftBandLimits) {
|
for (const auto &b : m_guideConfiguration.fftBandLimits) {
|
||||||
if (b.fftSize == fftSize) {
|
if (b.fftSize == fftSize) {
|
||||||
@@ -373,20 +382,20 @@ R3StretcherImpl::consume()
|
|||||||
scale->accumulator.data() + toOffset);
|
scale->accumulator.data() + toOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto mixptr = cd->mixdown.data();
|
double *mixptr = cd->mixdown.data();
|
||||||
v_zero(mixptr, outhop);
|
v_zero(mixptr, outhop);
|
||||||
|
|
||||||
for (auto it : cd->scales) {
|
for (auto &it : cd->scales) {
|
||||||
auto scale = it.second;
|
auto &scale = it.second;
|
||||||
v_add(mixptr, scale->accumulator.data(), outhop);
|
v_add(mixptr, scale->accumulator.data(), outhop);
|
||||||
}
|
}
|
||||||
|
|
||||||
cd->outbuf->write(mixptr, outhop);
|
cd->outbuf->write(mixptr, outhop);
|
||||||
|
|
||||||
for (auto it : cd->scales) {
|
for (auto &it : cd->scales) {
|
||||||
int fftSize = it.first;
|
int fftSize = it.first;
|
||||||
auto scale = it.second;
|
auto &scale = it.second;
|
||||||
auto accptr = scale->accumulator.data();
|
double *accptr = scale->accumulator.data();
|
||||||
|
|
||||||
int n = scale->accumulator.size() - outhop;
|
int n = scale->accumulator.size() - outhop;
|
||||||
v_move(accptr, accptr + outhop, n);
|
v_move(accptr, accptr + outhop, n);
|
||||||
|
|||||||
Reference in New Issue
Block a user