From 9dd99a45300e408ed2bdf2326f4c86da5d93dd1c Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 16 Sep 2017 11:34:25 +0200 Subject: [PATCH] Separate construction/destruction for the sink output plugin core and the GUI --- .../bladerfoutput/bladerfoutput.cpp | 5 + .../samplesink/bladerfoutput/bladerfoutput.h | 1 + .../bladerfoutput/bladerfoutputgui.cpp | 4 +- plugins/samplesink/filesink/filesinkgui.cpp | 3 +- .../samplesink/filesink/filesinkoutput.cpp | 5 + plugins/samplesink/filesink/filesinkoutput.h | 1 + .../samplesink/hackrfoutput/hackrfoutput.cpp | 5 + .../samplesink/hackrfoutput/hackrfoutput.h | 1 + .../hackrfoutput/hackrfoutputgui.cpp | 4 +- .../limesdroutput/limesdroutput.cpp | 5 + .../samplesink/limesdroutput/limesdroutput.h | 1 + .../limesdroutput/limesdroutputgui.cpp | 6 +- .../sdrdaemonsink/sdrdaemonsinkgui.cpp | 3 +- .../sdrdaemonsink/sdrdaemonsinkoutput.cpp | 5 + .../sdrdaemonsink/sdrdaemonsinkoutput.h | 1 + sdrbase/device/devicesinkapi.cpp | 30 ++--- sdrbase/device/devicesinkapi.h | 9 +- sdrbase/dsp/devicesamplesink.h | 113 +++++++++--------- sdrbase/dsp/dspdevicesinkengine.h | 1 + sdrbase/mainwindow.cpp | 33 +++-- sdrbase/plugin/plugininterface.cpp | 5 + sdrbase/plugin/plugininterface.h | 1 + 22 files changed, 143 insertions(+), 99 deletions(-) diff --git a/plugins/samplesink/bladerfoutput/bladerfoutput.cpp b/plugins/samplesink/bladerfoutput/bladerfoutput.cpp index 81a6d4239..6d0258823 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutput.cpp +++ b/plugins/samplesink/bladerfoutput/bladerfoutput.cpp @@ -51,6 +51,11 @@ BladerfOutput::~BladerfOutput() m_deviceAPI->setBuddySharedPtr(0); } +void BladerfOutput::destroy() +{ + delete this; +} + bool BladerfOutput::openDevice() { if (m_dev != 0) diff --git a/plugins/samplesink/bladerfoutput/bladerfoutput.h b/plugins/samplesink/bladerfoutput/bladerfoutput.h index 82473532d..958fea840 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutput.h +++ b/plugins/samplesink/bladerfoutput/bladerfoutput.h @@ -70,6 +70,7 @@ public: BladerfOutput(DeviceSinkAPI *deviceAPI); virtual ~BladerfOutput(); + virtual void destroy(); virtual bool start(); virtual void stop(); diff --git a/plugins/samplesink/bladerfoutput/bladerfoutputgui.cpp b/plugins/samplesink/bladerfoutput/bladerfoutputgui.cpp index d1c6095ca..b9f59a012 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutputgui.cpp +++ b/plugins/samplesink/bladerfoutput/bladerfoutputgui.cpp @@ -37,8 +37,7 @@ BladerfOutputGui::BladerfOutputGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : m_sampleRate(0), m_lastEngineState((DSPDeviceSinkEngine::State)-1) { - m_deviceSampleSink = new BladerfOutput(m_deviceAPI); - m_deviceAPI->setSink(m_deviceSampleSink); + m_deviceSampleSink = (BladerfOutput*) m_deviceAPI->getSampleSink(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -68,7 +67,6 @@ BladerfOutputGui::BladerfOutputGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : BladerfOutputGui::~BladerfOutputGui() { - delete m_deviceSampleSink; // Valgrind memcheck delete ui; } diff --git a/plugins/samplesink/filesink/filesinkgui.cpp b/plugins/samplesink/filesink/filesinkgui.cpp index 695c27120..9756e139b 100644 --- a/plugins/samplesink/filesink/filesinkgui.cpp +++ b/plugins/samplesink/filesink/filesinkgui.cpp @@ -65,9 +65,8 @@ FileSinkGui::FileSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : displaySettings(); - m_deviceSampleSink = new FileSinkOutput(m_deviceAPI); + m_deviceSampleSink = (FileSinkOutput*) m_deviceAPI->getSampleSink(); connect(m_deviceSampleSink->getOutputMessageQueueToGUI(), SIGNAL(messageEnqueued()), this, SLOT(handleSinkMessages())); - m_deviceAPI->setSink(m_deviceSampleSink); connect(m_deviceAPI->getDeviceEngineOutputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleDSPMessages()), Qt::QueuedConnection); } diff --git a/plugins/samplesink/filesink/filesinkoutput.cpp b/plugins/samplesink/filesink/filesinkoutput.cpp index 3f7ad4a89..123a1cac2 100644 --- a/plugins/samplesink/filesink/filesinkoutput.cpp +++ b/plugins/samplesink/filesink/filesinkoutput.cpp @@ -52,6 +52,11 @@ FileSinkOutput::~FileSinkOutput() stop(); } +void FileSinkOutput::destroy() +{ + delete this; +} + void FileSinkOutput::openFileStream() { if (m_ofstream.is_open()) { diff --git a/plugins/samplesink/filesink/filesinkoutput.h b/plugins/samplesink/filesink/filesinkoutput.h index f73900c09..c0725cd86 100644 --- a/plugins/samplesink/filesink/filesinkoutput.h +++ b/plugins/samplesink/filesink/filesinkoutput.h @@ -150,6 +150,7 @@ public: FileSinkOutput(DeviceSinkAPI *deviceAPI); virtual ~FileSinkOutput(); + virtual void destroy(); virtual bool start(); virtual void stop(); diff --git a/plugins/samplesink/hackrfoutput/hackrfoutput.cpp b/plugins/samplesink/hackrfoutput/hackrfoutput.cpp index ff4a12e93..4220ca1e0 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutput.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutput.cpp @@ -52,6 +52,11 @@ HackRFOutput::~HackRFOutput() m_deviceAPI->setBuddySharedPtr(0); } +void HackRFOutput::destroy() +{ + delete this; +} + bool HackRFOutput::openDevice() { if (m_dev != 0) diff --git a/plugins/samplesink/hackrfoutput/hackrfoutput.h b/plugins/samplesink/hackrfoutput/hackrfoutput.h index 8f7d5f20a..649896c65 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutput.h +++ b/plugins/samplesink/hackrfoutput/hackrfoutput.h @@ -70,6 +70,7 @@ public: HackRFOutput(DeviceSinkAPI *deviceAPI); virtual ~HackRFOutput(); + virtual void destroy(); virtual bool start(); virtual void stop(); diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp b/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp index 7b0787a3c..62d6e6ec2 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp @@ -40,8 +40,7 @@ HackRFOutputGui::HackRFOutputGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : m_deviceSampleSink(0), m_lastEngineState((DSPDeviceSinkEngine::State)-1) { - m_deviceSampleSink = new HackRFOutput(m_deviceAPI); - m_deviceAPI->setSink(m_deviceSampleSink); + m_deviceSampleSink = (HackRFOutput*) m_deviceAPI->getSampleSink(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -62,7 +61,6 @@ HackRFOutputGui::HackRFOutputGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : HackRFOutputGui::~HackRFOutputGui() { - delete m_deviceSampleSink; // Valgrind memcheck delete ui; } diff --git a/plugins/samplesink/limesdroutput/limesdroutput.cpp b/plugins/samplesink/limesdroutput/limesdroutput.cpp index bee8c3c53..3c4214daa 100644 --- a/plugins/samplesink/limesdroutput/limesdroutput.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutput.cpp @@ -59,6 +59,11 @@ LimeSDROutput::~LimeSDROutput() resumeBuddies(); } +void LimeSDROutput::destroy() +{ + delete this; +} + bool LimeSDROutput::openDevice() { // look for Tx buddies and get reference to common parameters diff --git a/plugins/samplesink/limesdroutput/limesdroutput.h b/plugins/samplesink/limesdroutput/limesdroutput.h index f5238644d..67026bff2 100644 --- a/plugins/samplesink/limesdroutput/limesdroutput.h +++ b/plugins/samplesink/limesdroutput/limesdroutput.h @@ -210,6 +210,7 @@ public: LimeSDROutput(DeviceSinkAPI *deviceAPI); virtual ~LimeSDROutput(); + virtual void destroy(); virtual bool start(); virtual void stop(); diff --git a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp index b4aec87c4..1de1fc26e 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp @@ -37,9 +37,8 @@ LimeSDROutputGUI::LimeSDROutputGUI(DeviceSinkAPI *deviceAPI, QWidget* parent) : m_statusCounter(0), m_deviceStatusCounter(0) { - m_limeSDROutput = new LimeSDROutput(m_deviceAPI); - m_sampleSink = (DeviceSampleSink *) m_limeSDROutput; - m_deviceAPI->setSink(m_sampleSink); + m_limeSDROutput = (LimeSDROutput*) m_deviceAPI->getSampleSink(); + m_deviceAPI->setSampleSink(m_sampleSink); ui->setupUi(this); @@ -81,7 +80,6 @@ LimeSDROutputGUI::LimeSDROutputGUI(DeviceSinkAPI *deviceAPI, QWidget* parent) : LimeSDROutputGUI::~LimeSDROutputGUI() { - delete m_sampleSink; // Valgrind memcheck delete ui; } diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp index 58d114243..59c38d0fb 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp @@ -83,9 +83,8 @@ SDRdaemonSinkGui::SDRdaemonSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - m_deviceSampleSink = new SDRdaemonSinkOutput(m_deviceAPI); + m_deviceSampleSink = (SDRdaemonSinkOutput*) m_deviceAPI->getSampleSink(); connect(m_deviceSampleSink->getOutputMessageQueueToGUI(), SIGNAL(messageEnqueued()), this, SLOT(handleSinkMessages())); - m_deviceAPI->setSink(m_deviceSampleSink); connect(m_deviceAPI->getDeviceEngineOutputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleDSPMessages()), Qt::QueuedConnection); diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp index cca653db5..ac61c8979 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp @@ -50,6 +50,11 @@ SDRdaemonSinkOutput::~SDRdaemonSinkOutput() stop(); } +void SDRdaemonSinkOutput::destroy() +{ + delete this; +} + bool SDRdaemonSinkOutput::start() { QMutexLocker mutexLocker(&m_mutex); diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.h b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.h index 8c5016272..f1b4b362b 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.h +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.h @@ -134,6 +134,7 @@ public: SDRdaemonSinkOutput(DeviceSinkAPI *deviceAPI); virtual ~SDRdaemonSinkOutput(); + virtual void destroy(); virtual bool start(); virtual void stop(); diff --git a/sdrbase/device/devicesinkapi.cpp b/sdrbase/device/devicesinkapi.cpp index 49082169c..682a82219 100644 --- a/sdrbase/device/devicesinkapi.cpp +++ b/sdrbase/device/devicesinkapi.cpp @@ -83,11 +83,16 @@ uint32_t DeviceSinkAPI::getNumberOfSources() return m_deviceSinkEngine->getNumberOfSources(); } -void DeviceSinkAPI::setSink(DeviceSampleSink* sink) +void DeviceSinkAPI::setSampleSink(DeviceSampleSink* sink) { m_deviceSinkEngine->setSink(sink); } +DeviceSampleSink *DeviceSinkAPI::getSampleSink() +{ + return m_deviceSinkEngine->getSink(); +} + bool DeviceSinkAPI::initGeneration() { return m_deviceSinkEngine->initGeneration(); @@ -157,6 +162,11 @@ void DeviceSinkAPI::setSampleSinkId(const QString& id) m_sampleSinkId = id; } +void DeviceSinkAPI::resetSampleSinkId() +{ + m_sampleSinkId.clear(); +} + void DeviceSinkAPI::setSampleSinkSerial(const QString& serial) { m_sampleSinkSerial = serial; @@ -180,12 +190,6 @@ void DeviceSinkAPI::setSampleSinkPluginInterface(PluginInterface *iface) void DeviceSinkAPI::setSampleSinkPluginInstanceUI(PluginInstanceUI *gui) { - if (m_sampleSinkPluginInstanceUI != 0) - { - m_sampleSinkPluginInstanceUI->destroy(); - m_sampleSinkId.clear(); - } - m_sampleSinkPluginInstanceUI = gui; } @@ -217,23 +221,13 @@ void DeviceSinkAPI::renameChannelInstances() } } -void DeviceSinkAPI::freeAll() +void DeviceSinkAPI::freeChannels() { for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) { qDebug("DeviceSinkAPI::freeAll: destroying channel [%s]", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); m_channelInstanceRegistrations[i].m_gui->destroy(); } - - - if(m_sampleSinkPluginInstanceUI != 0) - { - qDebug("DeviceSinkAPI::freeAll: destroying m_sampleSourcePluginGUI"); - m_deviceSinkEngine->setSink(0); - m_sampleSinkPluginInstanceUI->destroy(); - m_sampleSinkPluginInstanceUI = 0; - m_sampleSinkId.clear(); - } } void DeviceSinkAPI::loadSinkSettings(const Preset* preset) diff --git a/sdrbase/device/devicesinkapi.h b/sdrbase/device/devicesinkapi.h index ce00550b8..ee53ace7a 100644 --- a/sdrbase/device/devicesinkapi.h +++ b/sdrbase/device/devicesinkapi.h @@ -50,7 +50,8 @@ public: void addThreadedSource(ThreadedBasebandSampleSource* sink); //!< Add a baseband sample source that will run on its own thread to device engine void removeThreadedSource(ThreadedBasebandSampleSource* sink); //!< Remove a baseband sample source that runs on its own thread from device engine uint32_t getNumberOfSources(); - void setSink(DeviceSampleSink* sink); //!< Set device engine sample sink type + void setSampleSink(DeviceSampleSink* sink); //!< Set device engine sample sink type + DeviceSampleSink *getSampleSink(); //!< Return pointer to the device sample sink bool initGeneration(); //!< Initialize device engine generation sequence bool startGeneration(); //!< Start device engine generation sequence void stopGeneration(); //!< Stop device engine generation sequence @@ -67,6 +68,7 @@ public: void setHardwareId(const QString& id); void setSampleSinkId(const QString& id); + void resetSampleSinkId(); void setSampleSinkSerial(const QString& serial); void setSampleSinkDisplayName(const QString& serial); void setSampleSinkSequence(int sequence); @@ -77,13 +79,14 @@ public: const QString& getSampleSinkId() const { return m_sampleSinkId; } const QString& getSampleSinkSerial() const { return m_sampleSinkSerial; } const QString& getSampleSinkDisplayName() const { return m_sampleSinkDisplayName; } - PluginInterface *getSampleSinkPluginInterface() { return m_pluginInterface; } + PluginInterface *getPluginInterface() { return m_pluginInterface; } uint32_t getSampleSinkSequence() const { return m_sampleSinkSequence; } + PluginInstanceUI *getSampleSinkPluginInstanceGUI() { return m_sampleSinkPluginInstanceUI; } void registerChannelInstance(const QString& channelName, PluginInstanceUI* pluginGUI); void removeChannelInstance(PluginInstanceUI* pluginGUI); - void freeAll(); + void freeChannels(); void loadSinkSettings(const Preset* preset); void saveSinkSettings(Preset* preset); diff --git a/sdrbase/dsp/devicesamplesink.h b/sdrbase/dsp/devicesamplesink.h index 3a381faec..34846c52e 100644 --- a/sdrbase/dsp/devicesamplesink.h +++ b/sdrbase/dsp/devicesamplesink.h @@ -1,56 +1,57 @@ -/////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2016 F4EXB // -// written by Edouard Griffiths // -// // -// This program is free software; you can redistribute it and/or modify // -// it under the terms of the GNU General Public License as published by // -// the Free Software Foundation as version 3 of the License, or // -// // -// This program is distributed in the hope that it will be useful, // -// but WITHOUT ANY WARRANTY; without even the implied warranty of // -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // -// GNU General Public License V3 for more details. // -// // -// You should have received a copy of the GNU General Public License // -// along with this program. If not, see . // -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef SDRBASE_DSP_DEVICESAMPLESINK_H_ -#define SDRBASE_DSP_DEVICESAMPLESINK_H_ - -#include - -#include "samplesourcefifo.h" -#include "util/message.h" -#include "util/messagequeue.h" -#include "util/export.h" - -class SDRANGEL_API DeviceSampleSink : public QObject { - Q_OBJECT -public: - DeviceSampleSink(); - virtual ~DeviceSampleSink(); - - virtual bool start() = 0; - virtual void stop() = 0; - - virtual const QString& getDeviceDescription() const = 0; - virtual int getSampleRate() const = 0; //!< Sample rate exposed by the sink - virtual quint64 getCenterFrequency() const = 0; //!< Center frequency exposed by the sink - - virtual bool handleMessage(const Message& message) = 0; - - MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } - MessageQueue *getOutputMessageQueueToGUI() { return &m_outputMessageQueueToGUI; } - SampleSourceFifo* getSampleFifo() { return &m_sampleSourceFifo; } - -protected slots: - void handleInputMessages(); - -protected: - SampleSourceFifo m_sampleSourceFifo; - MessageQueue m_inputMessageQueue; //!< Input queue to the sink - MessageQueue m_outputMessageQueueToGUI; //!< Output queue specialized for the sink GUI -}; - -#endif /* SDRBASE_DSP_DEVICESAMPLESINK_H_ */ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2016 F4EXB // +// written by Edouard Griffiths // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef SDRBASE_DSP_DEVICESAMPLESINK_H_ +#define SDRBASE_DSP_DEVICESAMPLESINK_H_ + +#include + +#include "samplesourcefifo.h" +#include "util/message.h" +#include "util/messagequeue.h" +#include "util/export.h" + +class SDRANGEL_API DeviceSampleSink : public QObject { + Q_OBJECT +public: + DeviceSampleSink(); + virtual ~DeviceSampleSink(); + virtual void destroy() = 0; + + virtual bool start() = 0; + virtual void stop() = 0; + + virtual const QString& getDeviceDescription() const = 0; + virtual int getSampleRate() const = 0; //!< Sample rate exposed by the sink + virtual quint64 getCenterFrequency() const = 0; //!< Center frequency exposed by the sink + + virtual bool handleMessage(const Message& message) = 0; + + MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + MessageQueue *getOutputMessageQueueToGUI() { return &m_outputMessageQueueToGUI; } + SampleSourceFifo* getSampleFifo() { return &m_sampleSourceFifo; } + +protected slots: + void handleInputMessages(); + +protected: + SampleSourceFifo m_sampleSourceFifo; + MessageQueue m_inputMessageQueue; //!< Input queue to the sink + MessageQueue m_outputMessageQueueToGUI; //!< Output queue specialized for the sink GUI +}; + +#endif /* SDRBASE_DSP_DEVICESAMPLESINK_H_ */ diff --git a/sdrbase/dsp/dspdevicesinkengine.h b/sdrbase/dsp/dspdevicesinkengine.h index 6b1b0db94..c8825ed1b 100644 --- a/sdrbase/dsp/dspdevicesinkengine.h +++ b/sdrbase/dsp/dspdevicesinkengine.h @@ -64,6 +64,7 @@ public: void stopGeneration(); //!< Stop generation sequence void setSink(DeviceSampleSink* sink); //!< Set the sample sink type + DeviceSampleSink *getSink() { return m_deviceSampleSink; } void setSinkSequence(int sequence); //!< Set the sample sink sequence in type void addSource(BasebandSampleSource* source); //!< Add a baseband sample source diff --git a/sdrbase/mainwindow.cpp b/sdrbase/mainwindow.cpp index 893dfc58b..7b0e74226 100644 --- a/sdrbase/mainwindow.cpp +++ b/sdrbase/mainwindow.cpp @@ -276,12 +276,15 @@ void MainWindow::addSinkDevice() ui->tabInputsSelect->addTab(m_deviceUIs.back()->m_samplingDeviceControl, tabNameCStr); ui->tabInputsSelect->setTabToolTip(deviceTabIndex, QString(uidCStr)); + // create a file sink by default m_pluginManager->selectSampleSinkBySerialOrSequence("sdrangel.samplesink.filesink", "0", 0, m_deviceUIs.back()->m_deviceSinkAPI); - + DeviceSampleSink *sink = m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceOutput( + m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkId(), m_deviceUIs.back()->m_deviceSinkAPI); + m_deviceUIs.back()->m_deviceSinkAPI->setSampleSink(sink); QWidget *gui; - PluginInstanceUI *pluginGUI = m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkPluginInterface()->createSampleSinkPluginInstanceGUI( + PluginInstanceUI *pluginUI = m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceGUI( m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkId(), &gui, m_deviceUIs.back()->m_deviceSinkAPI); - m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkPluginInstanceUI(pluginGUI); + m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkPluginInstanceUI(pluginUI); setDeviceGUI(deviceTabIndex, gui, m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkDisplayName(), false); } @@ -333,8 +336,14 @@ void MainWindow::removeLastDevice() ui->tabSpectraGUI->removeTab(ui->tabSpectraGUI->count() - 1); ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1); - m_deviceUIs.back()->m_deviceSinkAPI->freeAll(); - m_deviceUIs.back()->m_deviceSinkAPI->clearBuddiesLists(); // remove old API from buddies lists + // deletes old UI and output object + m_deviceUIs.back()->m_deviceSinkAPI->freeChannels(); + m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( + m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkPluginInstanceGUI()); + m_deviceUIs.back()->m_deviceSinkAPI->resetSampleSinkId(); + m_deviceUIs.back()->m_deviceSinkAPI->clearBuddiesLists(); // clear old API buddies lists + m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->deleteSampleSinkPluginInstanceOutput( + m_deviceUIs.back()->m_deviceSinkAPI->getSampleSink()); ui->tabChannels->removeTab(ui->tabChannels->count() - 1); @@ -904,8 +913,13 @@ void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused void *devicePtr = deviceUI->m_samplingDeviceControl->getDeviceSelector()->itemData(selectedComboIndex).value(); deviceUI->m_deviceSinkAPI->stopGeneration(); - deviceUI->m_deviceSinkAPI->setSampleSinkPluginInstanceUI(0); // deletes old GUI and input object - deviceUI->m_deviceSinkAPI->clearBuddiesLists(); // remove old API from buddies lists + // deletes old UI and output object + deviceUI->m_deviceSinkAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( + deviceUI->m_deviceSinkAPI->getSampleSinkPluginInstanceGUI()); + deviceUI->m_deviceSinkAPI->resetSampleSinkId(); + deviceUI->m_deviceSinkAPI->clearBuddiesLists(); // clear old API buddies lists + deviceUI->m_deviceSinkAPI->getPluginInterface()->deleteSampleSinkPluginInstanceOutput( + deviceUI->m_deviceSinkAPI->getSampleSink()); m_pluginManager->selectSampleSinkByDevice(devicePtr, deviceUI->m_deviceSinkAPI); // sets the new API @@ -944,8 +958,11 @@ void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused } // constructs new GUI and output object + DeviceSampleSink *sink = deviceUI->m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceOutput( + deviceUI->m_deviceSinkAPI->getSampleSinkId(), deviceUI->m_deviceSinkAPI); + deviceUI->m_deviceSinkAPI->setSampleSink(sink); QWidget *gui; - PluginInstanceUI *pluginUI = deviceUI->m_deviceSinkAPI->getSampleSinkPluginInterface()->createSampleSinkPluginInstanceGUI( + PluginInstanceUI *pluginUI = deviceUI->m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceGUI( deviceUI->m_deviceSinkAPI->getSampleSinkId(), &gui, deviceUI->m_deviceSinkAPI); deviceUI->m_deviceSinkAPI->setSampleSinkPluginInstanceUI(pluginUI); setDeviceGUI(currentSinkTabIndex, gui, deviceUI->m_deviceSinkAPI->getSampleSinkDisplayName(), false); diff --git a/sdrbase/plugin/plugininterface.cpp b/sdrbase/plugin/plugininterface.cpp index 898930630..38cb20750 100644 --- a/sdrbase/plugin/plugininterface.cpp +++ b/sdrbase/plugin/plugininterface.cpp @@ -1,4 +1,5 @@ #include "dsp/devicesamplesource.h" +#include "dsp/devicesamplesink.h" #include "plugin/plugininterface.h" #include "plugininstanceui.h" @@ -18,3 +19,7 @@ void PluginInterface::deleteSampleSinkPluginInstanceGUI(PluginInstanceUI *ui) ui->destroy(); } +void PluginInterface::deleteSampleSinkPluginInstanceOutput(DeviceSampleSink *sink) +{ + sink->destroy(); +} diff --git a/sdrbase/plugin/plugininterface.h b/sdrbase/plugin/plugininterface.h index ee5348c2b..067cd1b15 100644 --- a/sdrbase/plugin/plugininterface.h +++ b/sdrbase/plugin/plugininterface.h @@ -69,6 +69,7 @@ public: virtual PluginInstanceUI* createSampleSinkPluginInstanceGUI(const QString& sinkId __attribute__((unused)), QWidget **widget __attribute__((unused)), DeviceSinkAPI *deviceAPI __attribute__((unused))) { return 0; } virtual DeviceSampleSink* createSampleSinkPluginInstanceOutput(const QString& sinkId __attribute__((unused)), DeviceSinkAPI *deviceAPI __attribute__((unused))) { return 0; } // creates the output "core" virtual void deleteSampleSinkPluginInstanceGUI(PluginInstanceUI *ui); + virtual void deleteSampleSinkPluginInstanceOutput(DeviceSampleSink *sink); }; Q_DECLARE_INTERFACE(PluginInterface, "SDRangel.PluginInterface/0.1");