From 89ecf8eb9c8550d57b40f8a1b425e10078bcfc01 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sat, 26 Sep 2015 20:39:33 -0400 Subject: [PATCH] SoapySDRThread readStream buffering tweak --- src/sdr/SoapySDRThread.cpp | 51 ++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/src/sdr/SoapySDRThread.cpp b/src/sdr/SoapySDRThread.cpp index 25e69cc..89c50f4 100644 --- a/src/sdr/SoapySDRThread.cpp +++ b/src/sdr/SoapySDRThread.cpp @@ -67,9 +67,24 @@ std::vector *SDRThread::enumerate_devices() { } std::cout << std::endl; - std::vector results = SoapySDR::Device::enumerate(); - std::map deviceIndexes; + + // Remote driver test.. +/* * / + SDRDeviceInfo *remoteDev = new SDRDeviceInfo(); + remoteDev->setDriver("remote"); + remoteDev->setName("SoapySDR Remote Test"); + SoapySDR::Kwargs remoteArgs; + remoteArgs["driver"] = "remote"; + remoteArgs["remote"] = "127.0.0.1"; +// remoteArgs["remote"] = "192.168.1.107"; + remoteArgs["remote:driver"] = "rtlsdr"; + remoteArgs["remote:format"] = "CS8"; + remoteArgs["buffers"] = "6"; + remoteArgs["buflen"] = "16384"; + remoteDev->setDeviceArgs(remoteArgs); + SDRThread::devs.push_back(remoteDev); +// */ for (size_t i = 0; i < results.size(); i++) { std::cout << "Found device " << i << std::endl; @@ -84,8 +99,6 @@ std::vector *SDRThread::enumerate_devices() { } dev->setDeviceArgs(results[i]); - dev->setIndex(deviceIndexes[dev->getDriver()]); - deviceIndexes[dev->getDriver()]++; std::cout << "Make device " << i << std::endl; try { @@ -294,26 +307,38 @@ void SDRThread::run() { } } + + SDRThreadIQData *dataOut = buffers.getBuffer(); + if (dataOut->data.size() != numElems * 2) { + dataOut->data.resize(numElems * 2); + } + + int n_read = 0; + while (n_read != numElems) { + int n_stream_read = device->readStream(stream, buffs, numElems-n_read, flags, timeNs); + if (n_stream_read > 0) { + memcpy(&dataOut->data[n_read * 2], buffs[0], n_stream_read * sizeof(float) * 2); + n_read += n_stream_read; + } else { + dataOut->data.resize(n_read); + break; + } + } - int n_read = device->readStream(stream, buffs, numElems, flags, timeNs); - -// std::cout << n_read << ", " << timeNs << std::endl; +// std::cout << n_read << std::endl; if (n_read > 0) { - SDRThreadIQData *dataOut = buffers.getBuffer(); - dataOut->setRefCount(1); dataOut->frequency = frequency; dataOut->sampleRate = sampleRate.load(); - - dataOut->data.resize(n_read * 2); - memcpy(&dataOut->data[0],buffs[0],n_read * sizeof(float) * 2); - + if (iqDataOutQueue != NULL) { iqDataOutQueue->push(dataOut); } else { dataOut->setRefCount(0); } + } else { + dataOut->setRefCount(0); } } device->deactivateStream(stream);