diff --git a/src/dsp/resampling.h b/src/dsp/resampling.h index 09d183e7..4626422c 100644 --- a/src/dsp/resampling.h +++ b/src/dsp/resampling.h @@ -148,9 +148,6 @@ namespace dsp { if (running) { return; } - if (blockSize < 1 ) { - return; - } _blockSize = blockSize; output.setMaxLatency(blockSize * 2); } @@ -159,9 +156,6 @@ namespace dsp { if (running) { return; } - if (skip < 0 ) { - skip = 0; - } _skip = skip; } @@ -170,9 +164,20 @@ namespace dsp { private: static void _worker(BlockDecimator* _this) { complex_t* buf = new complex_t[_this->_blockSize]; + bool delay = _this->_skip < 0; + + int readCount = std::min(_this->_blockSize + _this->_skip, _this->_blockSize); + int skip = std::max(_this->_skip, 0); + int delaySize = (-_this->_skip) * sizeof(complex_t); + + complex_t* start = &buf[std::max(-_this->_skip, 0)]; + complex_t* delayStart = &buf[_this->_blockSize + _this->_skip]; + while (true) { - int read = _this->_input->readAndSkip(buf, _this->_blockSize, _this->_skip); - if (read < 0) { break; }; + if (delay) { + memmove(buf, delayStart, delaySize); + } + if (_this->_input->readAndSkip(start, readCount, skip) < 0) { break; }; if (_this->output.write(buf, _this->_blockSize) < 0) { break; }; } delete[] buf; diff --git a/src/signal_path.cpp b/src/signal_path.cpp index 0ef19947..0a02ab18 100644 --- a/src/signal_path.cpp +++ b/src/signal_path.cpp @@ -46,7 +46,8 @@ void SignalPath::setSampleRate(float sampleRate) { dcBiasRemover.setBlockSize(inputBlockSize); split.setBlockSize(inputBlockSize); - fftBlockDec.setSkip((sampleRate / fftRate) - fftSize); + int skip = (sampleRate / fftRate) - fftSize; + fftBlockDec.setSkip(skip); mainVFO.setInputSampleRate(sampleRate, inputBlockSize); // // Reset the modulator and audio systems