Skip to content

Commit

Permalink
Buffer sizes fixes (see #616)
Browse files Browse the repository at this point in the history
  • Loading branch information
Aang23 committed Jan 31, 2024
1 parent b0f5ca7 commit 99044be
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 8 deletions.
11 changes: 7 additions & 4 deletions plugins/sdr_sources/bladerf_sdr_support/bladerf_sdr_source.cpp
Expand Up @@ -188,10 +188,13 @@ void BladeRFSource::start()
bladerf_set_bandwidth(bladerf_dev_obj, BLADERF_CHANNEL_RX(channel_id), std::clamp<uint64_t>(current_samplerate, bladerf_range_bandwidth->min, bladerf_range_bandwidth->max), NULL);

// Setup and start streaming
sample_buffer_size = std::min<int>(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<int>(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
Expand Down
4 changes: 3 additions & 1 deletion plugins/sdr_sources/limesdr_sdr_support/lime_sdr.h
Expand Up @@ -55,7 +55,9 @@ class LimeSDRSource : public dsp::DSPSampleSource
lms_stream_meta_t md;
#endif

int buffer_size = std::min<int>(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<int>(samplerate_widget.get_value() / 250, dsp::STREAM_BUFFER_SIZE);
logger->trace("LimeSDR Buffer size %d", buffer_size);

while (thread_should_run)
{
Expand Down
4 changes: 3 additions & 1 deletion plugins/sdr_sources/mirisdr_sdr_support/mirisdr_sdr.h
Expand Up @@ -36,7 +36,9 @@ class MiriSdrSource : public dsp::DSPSampleSource

void mainThread()
{
int buffer_size = std::min<int>(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<int>(samplerate_widget.get_value() / 250, dsp::STREAM_BUFFER_SIZE);
logger->trace("MiriSDR Buffer size %d", buffer_size);

while (thread_should_run)
{
Expand Down
4 changes: 3 additions & 1 deletion plugins/sdr_sources/rtlsdr_sdr_support/rtlsdr_sdr.h
Expand Up @@ -35,7 +35,9 @@ class RtlSdrSource : public dsp::DSPSampleSource

void mainThread()
{
int buffer_size = std::min<int>(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<int>(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)
{
Expand Down
5 changes: 4 additions & 1 deletion plugins/sdr_sources/soapy_sdr_support/soapysdr_sdr.h
Expand Up @@ -50,7 +50,10 @@ class SoapySdrSource : public dsp::DSPSampleSource

void mainThread()
{
int buffer_size = std::min<int>(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<int>(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;

Expand Down
6 changes: 6 additions & 0 deletions src-core/common/dsp_source_sink/dsp_sample_source.h
Expand Up @@ -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<int>(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<dsp::stream<complex_t>>(); }; // Start streaming samples
Expand Down

0 comments on commit 99044be

Please sign in to comment.