From 6cede7a667fa0891194efb44a0494992f2cc24d0 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 30 Oct 2018 10:02:32 +0100 Subject: [PATCH] SoapySDR support: output: open and close --- .../soapysdroutput/soapysdroutput.cpp | 110 +++++++++++++++++- .../soapysdroutput/soapysdroutput.h | 7 ++ 2 files changed, 115 insertions(+), 2 deletions(-) diff --git a/plugins/samplesink/soapysdroutput/soapysdroutput.cpp b/plugins/samplesink/soapysdroutput/soapysdroutput.cpp index 634bf396a..2cbcc484a 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutput.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutput.cpp @@ -15,11 +15,18 @@ /////////////////////////////////////////////////////////////////////////////////// #include "util/simpleserializer.h" +#include "dsp/dspcommands.h" +#include "dsp/dspengine.h" +#include "device/devicesinkapi.h" +#include "device/devicesourceapi.h" +#include "soapysdr/devicesoapysdr.h" #include "soapysdroutput.h" -SoapySDROutput::SoapySDROutput(DeviceSinkAPI *deviceAPI __attribute__((unused))) : - m_deviceDescription("SoapySDROutput") +SoapySDROutput::SoapySDROutput(DeviceSinkAPI *deviceAPI) : + m_deviceAPI(deviceAPI), + m_deviceDescription("SoapySDROutput"), + m_running(false) { } @@ -32,6 +39,105 @@ void SoapySDROutput::destroy() delete this; } +bool SoapySDROutput::openDevice() +{ + m_sampleSourceFifo.resize(96000 * 4); + + // look for Tx buddies and get reference to the device object + if (m_deviceAPI->getSinkBuddies().size() > 0) // look sink sibling first + { + qDebug("SoapySDROutput::openDevice: look in Tx buddies"); + + DeviceSinkAPI *sinkBuddy = m_deviceAPI->getSinkBuddies()[0]; + DeviceSoapySDRShared *deviceSoapySDRShared = (DeviceSoapySDRShared*) sinkBuddy->getBuddySharedPtr(); + + if (deviceSoapySDRShared == 0) + { + qCritical("SoapySDROutput::openDevice: the sink buddy shared pointer is null"); + return false; + } + + SoapySDR::Device *device = deviceSoapySDRShared->m_device; + + if (device == 0) + { + qCritical("SoapySDROutput::openDevice: cannot get device pointer from Tx buddy"); + return false; + } + + m_deviceShared.m_device = device; + } + // look for Rx buddies and get reference to the device object + else if (m_deviceAPI->getSourceBuddies().size() > 0) // then source + { + qDebug("SoapySDROutput::openDevice: look in Rx buddies"); + + DeviceSourceAPI *sourceBuddy = m_deviceAPI->getSourceBuddies()[0]; + DeviceSoapySDRShared *deviceSoapySDRShared = (DeviceSoapySDRShared*) sourceBuddy->getBuddySharedPtr(); + + if (deviceSoapySDRShared == 0) + { + qCritical("SoapySDROutput::openDevice: the source buddy shared pointer is null"); + return false; + } + + SoapySDR::Device *device = deviceSoapySDRShared->m_device; + + if (device == 0) + { + qCritical("SoapySDROutput::openDevice: cannot get device pointer from Rx buddy"); + return false; + } + + m_deviceShared.m_device = device; + } + // There are no buddies then create the first BladeRF2 device + else + { + qDebug("SoapySDROutput::openDevice: open device here"); + DeviceSoapySDR& deviceSoapySDR = DeviceSoapySDR::instance(); + m_deviceShared.m_device = deviceSoapySDR.openSoapySDR(m_deviceAPI->getSampleSinkSequence()); + + if (!m_deviceShared.m_device) + { + qCritical("SoapySDROutput::openDevice: cannot open SoapySDR device"); + return false; + } + } + + m_deviceShared.m_channel = m_deviceAPI->getItemIndex(); // publicly allocate channel + m_deviceShared.m_sink = this; + m_deviceAPI->setBuddySharedPtr(&m_deviceShared); // propagate common parameters to API + return true; +} + +void SoapySDROutput::closeDevice() +{ + if (m_deviceShared.m_device == 0) { // was never open + return; + } + + if (m_running) { + stop(); + } + +// if (m_thread) { // stills own the thread => transfer to a buddy +// moveThreadToBuddy(); +// } + + m_deviceShared.m_channel = -1; // publicly release channel + m_deviceShared.m_sink = 0; + + // No buddies so effectively close the device + + if ((m_deviceAPI->getSinkBuddies().size() == 0) && (m_deviceAPI->getSourceBuddies().size() == 0)) + { + DeviceSoapySDR& deviceSoapySDR = DeviceSoapySDR::instance(); + deviceSoapySDR.closeSoapySdr(m_deviceShared.m_device); + m_deviceShared.m_device = 0; + } +} + void SoapySDROutput::init() { } diff --git a/plugins/samplesink/soapysdroutput/soapysdroutput.h b/plugins/samplesink/soapysdroutput/soapysdroutput.h index 34355171e..f69336414 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutput.h +++ b/plugins/samplesink/soapysdroutput/soapysdroutput.h @@ -20,6 +20,7 @@ #include #include "dsp/devicesamplesink.h" +#include "soapysdr/devicesoapysdrshared.h" class DeviceSinkAPI; @@ -45,7 +46,13 @@ public: virtual bool handleMessage(const Message& message); private: + DeviceSinkAPI *m_deviceAPI; QString m_deviceDescription; + DeviceSoapySDRShared m_deviceShared; + bool m_running; + + bool openDevice(); + void closeDevice(); };