diff --git a/core/src/dsp/routing.h b/core/src/dsp/routing.h index 42e0f616..588118e1 100644 --- a/core/src/dsp/routing.h +++ b/core/src/dsp/routing.h @@ -1,6 +1,8 @@ #pragma once #include +#include #include +#include #include namespace dsp { @@ -62,18 +64,22 @@ namespace dsp { }; + + // NOTE: I'm not proud of this, it's BAD and just taken from the previous DSP, but it works... template class Reshaper : public generic_block> { public: Reshaper() {} - Reshaper(stream* in) { init(in); } + Reshaper(stream* in, int keep, int skip) { init(in, keep, skip); } ~Reshaper() { generic_block>::stop(); } - void init(stream* in) { + void init(stream* in, int keep, int skip) { _in = in; - buffer = (T*)volk_malloc(STREAM_BUFFER_SIZE * sizeof(T), volk_get_alignment()); + _keep = keep; + _skip = skip; + ringBuf.init(keep * 2); generic_block>::registerInput(_in); generic_block>::registerOutput(&out); } @@ -87,19 +93,92 @@ namespace dsp { generic_block>::tempStart(); } + void setKeep(int keep) { + std::lock_guard lck(generic_block>::ctrlMtx); + generic_block>::tempStop(); + generic_block>::unregisterInput(_in); + _keep = keep; + generic_block>::registerInput(_in); + generic_block>::tempStart(); + } + + void setSkip(int skip) { + std::lock_guard lck(generic_block>::ctrlMtx); + generic_block>::tempStop(); + generic_block>::unregisterInput(_in); + _skip = skip; + generic_block>::registerInput(_in); + generic_block>::tempStart(); + } + int run() { int count = _in->read(); + if (count < 0) { return -1; } + ringBuf.write(_in->data, count); _in->flush(); - return count; } stream out; private: + void doStart() { + workThread = std::thread(&Reshaper::loop, this); + bufferWorkerThread = std::thread(&Reshaper::bufferWorker, this); + } + + void loop() { + while (run() >= 0); + } + + void doStop() { + _in->stopReader(); + ringBuf.stopReader(); + out.stopWriter(); + ringBuf.stopWriter(); + + if (workThread.joinable()) { + workThread.join(); + } + if (bufferWorkerThread.joinable()) { + bufferWorkerThread.join(); + } + + _in->clearReadStop(); + ringBuf.clearReadStop(); + out.clearWriteStop(); + ringBuf.clearWriteStop(); + } + + void bufferWorker() { + complex_t* buf = new complex_t[_keep]; + bool delay = _skip < 0; + + int readCount = std::min(_keep + _skip, _keep); + int skip = std::max(_skip, 0); + int delaySize = (-_skip) * sizeof(complex_t); + + complex_t* start = &buf[std::max(-_skip, 0)]; + complex_t* delayStart = &buf[_keep + _skip]; + + while (true) { + if (delay) { + memmove(buf, delayStart, delaySize); + } + if (ringBuf.readAndSkip(start, readCount, skip) < 0) { break; }; + if (out.aquire() < 0) { break; } + memcpy(out.data, buf, _keep * sizeof(complex_t)); + out.write(_keep); + } + delete[] buf; + } + stream* _in; - T* buffer; int _outBlockSize; - int readCount; + RingBuffer ringBuf; + std::thread bufferWorkerThread; + std::thread workThread; + int _keep, _skip; + }; } \ No newline at end of file diff --git a/core/src/gui/main_window.cpp b/core/src/gui/main_window.cpp index fa16bf46..73e8af55 100644 --- a/core/src/gui/main_window.cpp +++ b/core/src/gui/main_window.cpp @@ -48,6 +48,10 @@ int fftSize = 8192 * 8; std::vector _data; std::vector fftTaps; void fftHandler(dsp::complex_t* samples, int count, void* ctx) { + if (count < fftSize) { + return; + } + memcpy(fft_in, samples, count * sizeof(dsp::complex_t)); fftwf_execute(p); int half = fftSize / 2; diff --git a/core/src/signal_path/dsp.cpp b/core/src/signal_path/dsp.cpp index cc6f52fa..528e658b 100644 --- a/core/src/signal_path/dsp.cpp +++ b/core/src/signal_path/dsp.cpp @@ -12,7 +12,8 @@ void SignalPath::init(uint64_t sampleRate, int fftRate, int fftSize, dsp::stream split.init(input); - reshape.init(&fftStream); + reshape.init(&fftStream, fftSize, (sampleRate / fftRate) - fftSize); + split.bindStream(&fftStream); fftHandlerSink.init(&reshape.out, fftHandler, NULL); } @@ -20,16 +21,14 @@ void SignalPath::setSampleRate(double sampleRate) { this->sampleRate = sampleRate; split.stop(); - //fftBlockDec.stop(); - //fftHandlerSink.stop(); for (auto const& [name, vfo] : vfos) { vfo.vfo->stop(); } // Claculate skip to maintain a constant fft rate - //int skip = (sampleRate / fftRate) - fftSize; - //fftBlockDec.setSkip(skip); + int skip = (sampleRate / fftRate) - fftSize; + reshape.setSkip(skip); // TODO: Tell modules that the block size has changed (maybe?) @@ -38,8 +37,6 @@ void SignalPath::setSampleRate(double sampleRate) { vfo.vfo->start(); } - //fftHandlerSink.start(); - //fftBlockDec.start(); split.start(); } diff --git a/root_dev/config.json b/root_dev/config.json index 09598df2..a0d5f381 100644 --- a/root_dev/config.json +++ b/root_dev/config.json @@ -3,7 +3,7 @@ "Radio": { "device": "Speakers (Realtek High Definiti", "sampleRate": 48000.0, - "volume": 0.51953125 + "volume": 0.7265625 }, "Radio 1": { "device": "Speakers (Realtek High Definition Audio)", @@ -32,7 +32,7 @@ "Display" ], "menuWidth": 300, - "min": -100.0, + "min": -52.20588302612305, "showWaterfall": true, "source": "", "sourceSettings": {}, diff --git a/root_dev/recordings/audio_19-16-25_02-11-2020.wav b/root_dev/recordings/audio_19-16-25_02-11-2020.wav deleted file mode 100644 index 578536fb..00000000 Binary files a/root_dev/recordings/audio_19-16-25_02-11-2020.wav and /dev/null differ diff --git a/root_dev/recordings/audio_20-21-27_02-11-2020.wav b/root_dev/recordings/audio_20-21-27_02-11-2020.wav deleted file mode 100644 index 74d9a1c1..00000000 Binary files a/root_dev/recordings/audio_20-21-27_02-11-2020.wav and /dev/null differ diff --git a/root_dev/recordings/audio_20-21-55_02-11-2020.wav b/root_dev/recordings/audio_20-21-55_02-11-2020.wav deleted file mode 100644 index 3abba16f..00000000 Binary files a/root_dev/recordings/audio_20-21-55_02-11-2020.wav and /dev/null differ diff --git a/root_dev/recordings/audio_22-55-07_03-11-2020.wav b/root_dev/recordings/audio_22-55-07_03-11-2020.wav deleted file mode 100644 index c7de3d78..00000000 Binary files a/root_dev/recordings/audio_22-55-07_03-11-2020.wav and /dev/null differ diff --git a/root_dev/recordings/audio_23-11-22_03-11-2020.wav b/root_dev/recordings/audio_23-11-22_03-11-2020.wav deleted file mode 100644 index e73b7874..00000000 Binary files a/root_dev/recordings/audio_23-11-22_03-11-2020.wav and /dev/null differ diff --git a/root_dev/recordings/baseband_20-21-19_02-11-2020.wav b/root_dev/recordings/baseband_20-21-19_02-11-2020.wav deleted file mode 100644 index 89730c67..00000000 Binary files a/root_dev/recordings/baseband_20-21-19_02-11-2020.wav and /dev/null differ diff --git a/root_dev/soapy_source_config.json b/root_dev/soapy_source_config.json index 9fbc5e6f..18a48d4a 100644 --- a/root_dev/soapy_source_config.json +++ b/root_dev/soapy_source_config.json @@ -19,9 +19,9 @@ }, "HackRF One #0 901868dc282c8f8b": { "gains": { - "AMP": 13.86299991607666, + "AMP": 0.0, "LNA": 24.711999893188477, - "VGA": 14.282999992370605 + "VGA": 16.02899932861328 }, "sampleRate": 8000000.0 },