From 99044be156e1e9d5fe3fc78102f74703fbe32f86 Mon Sep 17 00:00:00 2001 From: Aang23 Date: Wed, 31 Jan 2024 14:08:56 +0100 Subject: [PATCH] Buffer sizes fixes (see #616) --- .../bladerf_sdr_support/bladerf_sdr_source.cpp | 11 +++++++---- plugins/sdr_sources/limesdr_sdr_support/lime_sdr.h | 4 +++- plugins/sdr_sources/mirisdr_sdr_support/mirisdr_sdr.h | 4 +++- plugins/sdr_sources/rtlsdr_sdr_support/rtlsdr_sdr.h | 4 +++- plugins/sdr_sources/soapy_sdr_support/soapysdr_sdr.h | 5 ++++- src-core/common/dsp_source_sink/dsp_sample_source.h | 6 ++++++ 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/plugins/sdr_sources/bladerf_sdr_support/bladerf_sdr_source.cpp b/plugins/sdr_sources/bladerf_sdr_support/bladerf_sdr_source.cpp index 5b8a36ccf..1b278bd67 100644 --- a/plugins/sdr_sources/bladerf_sdr_support/bladerf_sdr_source.cpp +++ b/plugins/sdr_sources/bladerf_sdr_support/bladerf_sdr_source.cpp @@ -188,10 +188,13 @@ void BladeRFSource::start() bladerf_set_bandwidth(bladerf_dev_obj, BLADERF_CHANNEL_RX(channel_id), std::clamp(current_samplerate, bladerf_range_bandwidth->min, bladerf_range_bandwidth->max), NULL); // Setup and start streaming - sample_buffer_size = std::min(current_samplerate / 250, dsp::STREAM_BUFFER_SIZE); - sample_buffer_size = (sample_buffer_size / 1024) * 1024; - if (sample_buffer_size < 1024) - sample_buffer_size = 1024; + sample_buffer_size = calculate_buffer_size_from_samplerate(samplerate_widget.get_value()); + // sample_buffer_size = std::min(current_samplerate / 250, dsp::STREAM_BUFFER_SIZE); + // sample_buffer_size = (sample_buffer_size / 1024) * 1024; + // if (sample_buffer_size < 1024) + // sample_buffer_size = 1024; + logger->trace("BladeRF Buffer size %d", sample_buffer_size); + #ifdef BLADERF_HAS_WIDEBAND bladerf_sync_config(bladerf_dev_obj, BLADERF_RX_X1, is_8bit ? BLADERF_FORMAT_SC8_Q7 : BLADERF_FORMAT_SC16_Q11, 16, sample_buffer_size, 8, 4000); #else diff --git a/plugins/sdr_sources/limesdr_sdr_support/lime_sdr.h b/plugins/sdr_sources/limesdr_sdr_support/lime_sdr.h index d828cf806..64f088127 100644 --- a/plugins/sdr_sources/limesdr_sdr_support/lime_sdr.h +++ b/plugins/sdr_sources/limesdr_sdr_support/lime_sdr.h @@ -55,7 +55,9 @@ class LimeSDRSource : public dsp::DSPSampleSource lms_stream_meta_t md; #endif - int buffer_size = std::min(samplerate_widget.get_value() / 250, dsp::STREAM_BUFFER_SIZE); + int buffer_size = calculate_buffer_size_from_samplerate(samplerate_widget.get_value()); + // int buffer_size = std::min(samplerate_widget.get_value() / 250, dsp::STREAM_BUFFER_SIZE); + logger->trace("LimeSDR Buffer size %d", buffer_size); while (thread_should_run) { diff --git a/plugins/sdr_sources/mirisdr_sdr_support/mirisdr_sdr.h b/plugins/sdr_sources/mirisdr_sdr_support/mirisdr_sdr.h index 92efd9073..027dc3633 100644 --- a/plugins/sdr_sources/mirisdr_sdr_support/mirisdr_sdr.h +++ b/plugins/sdr_sources/mirisdr_sdr_support/mirisdr_sdr.h @@ -36,7 +36,9 @@ class MiriSdrSource : public dsp::DSPSampleSource void mainThread() { - int buffer_size = std::min(samplerate_widget.get_value() / 250, dsp::STREAM_BUFFER_SIZE); + int buffer_size = calculate_buffer_size_from_samplerate(samplerate_widget.get_value()); + // int buffer_size = std::min(samplerate_widget.get_value() / 250, dsp::STREAM_BUFFER_SIZE); + logger->trace("MiriSDR Buffer size %d", buffer_size); while (thread_should_run) { diff --git a/plugins/sdr_sources/rtlsdr_sdr_support/rtlsdr_sdr.h b/plugins/sdr_sources/rtlsdr_sdr_support/rtlsdr_sdr.h index 9e682cd24..2ee98913c 100644 --- a/plugins/sdr_sources/rtlsdr_sdr_support/rtlsdr_sdr.h +++ b/plugins/sdr_sources/rtlsdr_sdr_support/rtlsdr_sdr.h @@ -35,7 +35,9 @@ class RtlSdrSource : public dsp::DSPSampleSource void mainThread() { - int buffer_size = std::min(roundf(samplerate_widget.get_value() / (250 * 512)) * 512, dsp::STREAM_BUFFER_SIZE); + int buffer_size = calculate_buffer_size_from_samplerate(samplerate_widget.get_value()); + // std::min(roundf(samplerate_widget.get_value() / (250 * 512)) * 512, dsp::STREAM_BUFFER_SIZE); + logger->trace("RTL-SDR Buffer size %d", buffer_size); while (thread_should_run) { diff --git a/plugins/sdr_sources/soapy_sdr_support/soapysdr_sdr.h b/plugins/sdr_sources/soapy_sdr_support/soapysdr_sdr.h index 8ea50893e..da3b3d2dd 100644 --- a/plugins/sdr_sources/soapy_sdr_support/soapysdr_sdr.h +++ b/plugins/sdr_sources/soapy_sdr_support/soapysdr_sdr.h @@ -50,7 +50,10 @@ class SoapySdrSource : public dsp::DSPSampleSource void mainThread() { - int buffer_size = std::min(roundf(samplerate_widget.get_value() / (250 * 512)) * 512, dsp::STREAM_BUFFER_SIZE); + int buffer_size = calculate_buffer_size_from_samplerate(samplerate_widget.get_value()); + // int buffer_size = std::min(roundf(samplerate_widget.get_value() / (250 * 512)) * 512, dsp::STREAM_BUFFER_SIZE); + logger->trace("SoapySDR Buffer size %d", buffer_size); + int flags = 0; long long time_ms = 0; diff --git a/src-core/common/dsp_source_sink/dsp_sample_source.h b/src-core/common/dsp_source_sink/dsp_sample_source.h index 14181bf01..54f0d0c24 100644 --- a/src-core/common/dsp_source_sink/dsp_sample_source.h +++ b/src-core/common/dsp_source_sink/dsp_sample_source.h @@ -30,6 +30,12 @@ namespace dsp uint64_t d_frequency; uint64_t d_sdr_id; + protected: + inline int calculate_buffer_size_from_samplerate(int samplerate, int buffer_per_sec = 60, int blocksize = 512) + { + return std::min(ceil((double)samplerate / double(buffer_per_sec * blocksize)) * blocksize, dsp::STREAM_BUFFER_SIZE); + } + public: virtual void open() = 0; // Open the device, source, etc, but don't start the stream yet virtual void start() { output_stream = std::make_shared>(); }; // Start streaming samples