From 6eb2636499dc5d3a6dad5765ed3a2efcb976e926 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 20 Sep 2015 21:48:37 -0400 Subject: [PATCH] Fix device init and switching --- src/sdr/SDRDeviceInfo.cpp | 4 ++-- src/sdr/SDRDeviceInfo.h | 8 ++++--- src/sdr/SoapySDRThread.cpp | 43 +++++++++++++++++++++----------------- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/sdr/SDRDeviceInfo.cpp b/src/sdr/SDRDeviceInfo.cpp index 0e558b7..6a0958a 100644 --- a/src/sdr/SDRDeviceInfo.cpp +++ b/src/sdr/SDRDeviceInfo.cpp @@ -153,11 +153,11 @@ void SDRDeviceInfo::setTimestamps(bool timestamps) { this->timestamps = timestamps; } -void SDRDeviceInfo::setDeviceArgs(std::string deviceArgs) { +void SDRDeviceInfo::setDeviceArgs(SoapySDR::Kwargs deviceArgs) { this->deviceArgs = deviceArgs; } -std::string SDRDeviceInfo::getDeviceArgs() { +SoapySDR::Kwargs SDRDeviceInfo::getDeviceArgs() { return deviceArgs; // return "driver=" + driver + "," + getDriver() + "=" + std::to_string(getIndex()); } diff --git a/src/sdr/SDRDeviceInfo.h b/src/sdr/SDRDeviceInfo.h index c91b21c..774f34a 100644 --- a/src/sdr/SDRDeviceInfo.h +++ b/src/sdr/SDRDeviceInfo.h @@ -3,6 +3,8 @@ #include #include +#include + /* ---------------------------------------------------- -- Device identification @@ -111,14 +113,14 @@ public: const std::vector& getChannels() const; - void setDeviceArgs(std::string deviceArgs); - std::string getDeviceArgs(); + void setDeviceArgs(SoapySDR::Kwargs deviceArgs); + SoapySDR::Kwargs getDeviceArgs(); private: int index; std::string name, serial, product, manufacturer, tuner; std::string driver, hardware; bool timestamps, available; - std::string deviceArgs; + SoapySDR::Kwargs deviceArgs; std::vector channels; }; diff --git a/src/sdr/SoapySDRThread.cpp b/src/sdr/SoapySDRThread.cpp index 4e0b435..be743e8 100644 --- a/src/sdr/SoapySDRThread.cpp +++ b/src/sdr/SoapySDRThread.cpp @@ -74,7 +74,6 @@ std::vector *SDRThread::enumerate_devices() { for (size_t i = 0; i < results.size(); i++) { std::cout << "Found device " << i << std::endl; SDRDeviceInfo *dev = new SDRDeviceInfo(); - std::string devArgs(""); for (SoapySDR::Kwargs::const_iterator it = results[i].begin(); it != results[i].end(); ++it) { std::cout << " " << it->first << " = " << it->second << std::endl; if (it->first == "driver") { @@ -82,19 +81,13 @@ std::vector *SDRThread::enumerate_devices() { } else if (it->first == "label") { dev->setName(it->second); } - if (devArgs.size()) { - devArgs.append(","); - } - devArgs.append(it->first); - devArgs.append("="); - devArgs.append(it->second); } - dev->setDeviceArgs(devArgs); + dev->setDeviceArgs(results[i]); dev->setIndex(deviceIndexes[dev->getDriver()]); deviceIndexes[dev->getDriver()]++; - std::cout << "Make device " << dev->getDeviceArgs() << std::endl; + std::cout << "Make device " << i << std::endl; try { SoapySDR::Device *device = SoapySDR::Device::make(dev->getDeviceArgs()); SoapySDR::Kwargs info = device->getHardwareInfo(); @@ -123,12 +116,12 @@ std::vector *SDRThread::enumerate_devices() { } void SDRThread::run() { -//#ifdef __APPLE__ -// pthread_t tID = pthread_self(); // ID of this thread -// int priority = sched_get_priority_max( SCHED_FIFO) - 1; -// sched_param prio = { priority }; // scheduling priority of thread -// pthread_setschedparam(tID, SCHED_FIFO, &prio); -//#endif +#ifdef __APPLE__ + pthread_t tID = pthread_self(); // ID of this thread + int priority = sched_get_priority_max( SCHED_FIFO) - 1; + sched_param prio = { priority }; // scheduling priority of thread + pthread_setschedparam(tID, SCHED_FIFO, &prio); +#endif std::cout << "SDR thread initializing.." << std::endl; @@ -153,13 +146,16 @@ void SDRThread::run() { SDRDeviceInfo *dev = devs[deviceId]; - - SoapySDR::Device *device = SoapySDR::Device::make(dev->getDeviceArgs()+",direct_samp="+std::to_string(devConfig->getDirectSampling())+",buffers=6,buflen=16384"); + SoapySDR::Kwargs args = dev->getDeviceArgs(); + args["direct_samp"] = std::to_string(devConfig->getDirectSampling()); + args["buffers"] = "8"; + args["buflen"] = "16384"; + SoapySDR::Device *device = SoapySDR::Device::make(args); device->setSampleRate(SOAPY_SDR_RX,0,sampleRate.load()); device->setFrequency(SOAPY_SDR_RX,0,"RF",frequency - offset.load()); device->setFrequency(SOAPY_SDR_RX,0,"CORR",ppm); - device->setGainMode(SOAPY_SDR_RX,0, true); + device->setGainMode(SOAPY_SDR_RX,0,true); SoapySDR::Stream *stream = device->setupStream(SOAPY_SDR_RX,"CF32"); device->activateStream(stream); @@ -236,7 +232,16 @@ void SDRThread::run() { device->closeStream(stream); SoapySDR::Device::unmake(device); - device = SoapySDR::Device::make(dev->getDeviceArgs()+",direct_samp="+std::to_string(devConfig->getDirectSampling())+",buffers=6,buflen=16384"); + deviceId = new_device; + dev = devs[deviceId]; + device_changed = false; + + SoapySDR::Kwargs args = dev->getDeviceArgs(); + args["direct_samp"] = std::to_string(devConfig->getDirectSampling()); + args["buffers"] = "8"; + args["buflen"] = "16384"; + + device = SoapySDR::Device::make(args); device->setSampleRate(SOAPY_SDR_RX,0,sampleRate.load()); device->setFrequency(SOAPY_SDR_RX,0,"RF",frequency - offset.load());