[PATCH] Loop in soapy_source_c::work() when readStream() returns SOAPY_SDR_OVERFLOW

Anton Blanchard anton at ozlabs.org
Wed Apr 15 12:38:13 UTC 2020

I'm using an Airspy HF+ Discovery with the Soapy driver. Whenever I turn
AGC off it stops receiving samples.

On closer inspection, switching AGC off results in samples stalling for
an extended period (hundreds of milliseconds). As such, we hit the
timeout in SoapyAirspyHF::readStream() and return SOAPY_SDR_TIMEOUT (-1).

Things go wrong at this point. It takes a long time before readStream()
is called again, presumably because we returned 0 from work(). By this
time our buffers have overflown, readStream() returns SOAPY_SDR_OVERFLOW
(-2) and work() returns 0. We loop forever, continually overflowing

Fix this by looping in soapy_source_c::work() when ->readStream() returns
SOAPY_SDR_OVERFLOW so that we consume the buffers straight away.

Signed-off-by: Anton Blanchard <anton at ozlabs.org>
 lib/soapy/soapy_source_c.cc | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/lib/soapy/soapy_source_c.cc b/lib/soapy/soapy_source_c.cc
index a645361..9dcc885 100644
--- a/lib/soapy/soapy_source_c.cc
+++ b/lib/soapy/soapy_source_c.cc
@@ -96,9 +96,13 @@ int soapy_source_c::work( int noutput_items,
     int flags = 0;
     long long timeNs = 0;
-    int ret = _device->readStream(
-        _stream, &output_items[0],
-        noutput_items, flags, timeNs);
+    int ret;
+    do {
+        ret = _device->readStream(
+            _stream, &output_items[0],
+            noutput_items, flags, timeNs);
+    } while (ret == SOAPY_SDR_OVERFLOW);
     if (ret < 0) return 0; //call again
     return ret;

More information about the osmocom-sdr mailing list