aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Blanchard <anton@ozlabs.org>2020-08-02 23:50:43 +0200
committerEric Wild <ewild@sysmocom.de>2020-08-02 23:50:59 +0200
commit49f9b2df2a2126ead28a958ebf04f2a0822adbe0 (patch)
tree9e6a5d7fd4dc63f9652573fd8daa68d0020a8674
parent137c568c6094433ce7f038cdfd4f25106c2b4b21 (diff)
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 buffers. 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> Signed-off-by: Eric Wild <ewild@sysmocom.de>
-rw-r--r--lib/soapy/soapy_source_c.cc11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/soapy/soapy_source_c.cc b/lib/soapy/soapy_source_c.cc
index a645361..5c683c9 100644
--- a/lib/soapy/soapy_source_c.cc
+++ b/lib/soapy/soapy_source_c.cc
@@ -96,9 +96,14 @@ 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;
+ int retries = 1;
+
+ do {
+ ret = _device->readStream(
+ _stream, &output_items[0],
+ noutput_items, flags, timeNs);
+ } while (retries-- && (ret == SOAPY_SDR_OVERFLOW));
if (ret < 0) return 0; //call again
return ret;