From 3fd1346d08563875bfd61298364cfaa5db02a716 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 9 Aug 2015 04:09:05 +0200 Subject: [PATCH] Make DSP engine global static. Let DSP engine have its own report queue dostonct from Main Window message queue --- include-gpl/dsp/dspengine.h | 7 +++-- include-gpl/mainwindow.h | 2 +- include-gpl/plugin/pluginmanager.h | 5 +++- sdrbase/dsp/dspengine.cpp | 12 +++++--- sdrbase/mainwindow.cpp | 46 ++++++++++++++++++++---------- sdrbase/plugin/pluginmanager.cpp | 18 ++++++++---- 6 files changed, 62 insertions(+), 28 deletions(-) diff --git a/include-gpl/dsp/dspengine.h b/include-gpl/dsp/dspengine.h index 60ca4e2af..1dea972cf 100644 --- a/include-gpl/dsp/dspengine.h +++ b/include-gpl/dsp/dspengine.h @@ -44,10 +44,13 @@ public: StError }; - DSPEngine(MessageQueue* reportQueue, QObject* parent = NULL); + DSPEngine(QObject* parent = NULL); ~DSPEngine(); + static DSPEngine *instance(); + MessageQueue* getMessageQueue() { return &m_messageQueue; } + MessageQueue* getReportQueue() { return &m_reportQueue; } void start(); void stop(); @@ -72,7 +75,7 @@ public: private: MessageQueue m_messageQueue; - MessageQueue* m_reportQueue; + MessageQueue m_reportQueue; State m_state; diff --git a/include-gpl/mainwindow.h b/include-gpl/mainwindow.h index 7b4521456..bc5c6f202 100644 --- a/include-gpl/mainwindow.h +++ b/include-gpl/mainwindow.h @@ -116,6 +116,7 @@ private: void applySettings(); private slots: + void handleDSPMessages(); void handleMessages(); void updateStatus(); void on_action_Start_triggered(); @@ -127,7 +128,6 @@ private slots: void on_action_View_Fullscreen_toggled(bool checked); void on_presetSave_clicked(); void on_presetUpdate_clicked(); - void on_presetLastLoad_clicked(); void on_presetLoad_clicked(); void on_presetDelete_clicked(); void on_presetTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); diff --git a/include-gpl/plugin/pluginmanager.h b/include-gpl/plugin/pluginmanager.h index 41605f108..45d97f782 100644 --- a/include-gpl/plugin/pluginmanager.h +++ b/include-gpl/plugin/pluginmanager.h @@ -19,16 +19,19 @@ class SDRANGELOVE_API PluginManager : public QObject { Q_OBJECT public: - struct Plugin { + struct Plugin + { QString filename; QPluginLoader* loader; PluginInterface* plugin; + Plugin(const QString& _filename, QPluginLoader* pluginLoader, PluginInterface* _plugin) : filename(_filename), loader(pluginLoader), plugin(_plugin) { } }; + typedef QList Plugins; explicit PluginManager(MainWindow* mainWindow, DSPEngine* dspEngine, QObject* parent = NULL); diff --git a/sdrbase/dsp/dspengine.cpp b/sdrbase/dsp/dspengine.cpp index 66c068625..6e5deda6b 100644 --- a/sdrbase/dsp/dspengine.cpp +++ b/sdrbase/dsp/dspengine.cpp @@ -23,10 +23,8 @@ #include "dsp/dspcommands.h" #include "dsp/samplesource/samplesource.h" -DSPEngine::DSPEngine(MessageQueue* reportQueue, QObject* parent) : +DSPEngine::DSPEngine(QObject* parent) : QThread(parent), - m_messageQueue(), - m_reportQueue(reportQueue), m_state(StNotStarted), m_sampleSource(NULL), m_sampleSinks(), @@ -48,6 +46,12 @@ DSPEngine::~DSPEngine() wait(); } +Q_GLOBAL_STATIC(DSPEngine, dspEngine) +DSPEngine *DSPEngine::instance() +{ + return dspEngine; +} + void DSPEngine::start() { DSPPing cmd; @@ -349,7 +353,7 @@ void DSPEngine::generateReport() if(needReport) { Message* rep = DSPEngineReport::create(m_sampleRate, m_centerFrequency); - rep->submit(m_reportQueue); + rep->submit(&m_reportQueue); } } diff --git a/sdrbase/mainwindow.cpp b/sdrbase/mainwindow.cpp index 9b829dd38..356fed30a 100644 --- a/sdrbase/mainwindow.cpp +++ b/sdrbase/mainwindow.cpp @@ -45,7 +45,7 @@ MainWindow::MainWindow(QWidget* parent) : m_audioDeviceInfo(new AudioDeviceInfo), m_messageQueue(new MessageQueue), m_settings(), - m_dspEngine(new DSPEngine(m_messageQueue)), + m_dspEngine(DSPEngine::instance()), m_lastEngineState((DSPEngine::State)-1), m_startOsmoSDRUpdateAfterStop(false), m_inputGUI(0), @@ -54,6 +54,8 @@ MainWindow::MainWindow(QWidget* parent) : m_sampleFileName(std::string("./test.sdriq")), m_pluginManager(new PluginManager(this, m_dspEngine)) { + m_dspEngine->start(); + ui->setupUi(this); delete ui->mainToolBar; createStatusBar(); @@ -83,6 +85,7 @@ MainWindow::MainWindow(QWidget* parent) : ui->menu_Window->addAction(ui->channelDock->toggleViewAction()); connect(m_messageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleMessages()), Qt::QueuedConnection); + connect(m_dspEngine->getReportQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleDSPMessages()), Qt::QueuedConnection); connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); @@ -90,11 +93,12 @@ MainWindow::MainWindow(QWidget* parent) : m_masterTimer.start(50); m_pluginManager->loadPlugins(); + bool sampleSourceSignalsBlocked = ui->sampleSource->blockSignals(true); m_pluginManager->fillSampleSourceSelector(ui->sampleSource); ui->sampleSource->blockSignals(sampleSourceSignalsBlocked); - m_dspEngine->start(); + //m_dspEngine->start(); m_spectrumVis = new SpectrumVis(ui->glSpectrum); m_dspEngine->addSink(m_spectrumVis); @@ -311,12 +315,18 @@ void MainWindow::applySettings() updateSampleRate(); } -void MainWindow::handleMessages() +void MainWindow::handleDSPMessages() { Message* message; - while((message = m_messageQueue->accept()) != 0) { + + while ((message = m_dspEngine->getReportQueue()->accept()) != 0) + { qDebug("Message: %s", message->getIdentifier()); - if(DSPEngineReport::match(message)) { + + std::cerr << "MainWindow::handleDSPMessages: " << message->getIdentifier() << std::endl; + + if (DSPEngineReport::match(message)) + { DSPEngineReport* rep = (DSPEngineReport*)message; m_sampleRate = rep->getSampleRate(); m_centerFrequency = rep->getCenterFrequency(); @@ -324,11 +334,23 @@ void MainWindow::handleMessages() updateCenterFreqDisplay(); updateSampleRate(); message->completed(); - std::cerr << "MainWindow::handleMessages: m_fileSink->configure" << std::endl; m_fileSink->configure(m_dspEngine->getMessageQueue(), m_sampleFileName, m_sampleRate, m_centerFrequency); - } else { - if(!m_pluginManager->handleMessage(message)) - message->completed(); + } + } +} + +void MainWindow::handleMessages() +{ + Message* message; + + while ((message = m_messageQueue->accept()) != 0) + { + qDebug("Message: %s", message->getIdentifier()); + + std::cerr << "MainWindow::handleMessages: " << message->getIdentifier() << std::endl; + + if (!m_pluginManager->handleMessage(message)) { + message->completed(); } } } @@ -458,12 +480,6 @@ void MainWindow::on_presetUpdate_clicked() } } -void MainWindow::on_presetLastLoad_clicked() -{ - m_settings.load(); - applySettings(); -} - void MainWindow::on_presetLoad_clicked() { QTreeWidgetItem* item = ui->presetTree->currentItem(); diff --git a/sdrbase/plugin/pluginmanager.cpp b/sdrbase/plugin/pluginmanager.cpp index e6bdbe3a7..f4b804101 100644 --- a/sdrbase/plugin/pluginmanager.cpp +++ b/sdrbase/plugin/pluginmanager.cpp @@ -35,8 +35,9 @@ void PluginManager::loadPlugins() qSort(m_plugins); - for(Plugins::const_iterator it = m_plugins.begin(); it != m_plugins.end(); ++it) + for(Plugins::const_iterator it = m_plugins.begin(); it != m_plugins.end(); ++it) { it->plugin->initPlugin(&m_pluginAPI); + } updateSampleSourceDevices(); } @@ -289,20 +290,27 @@ int PluginManager::selectSampleSource(const QString& source) void PluginManager::loadPlugins(const QDir& dir) { QDir pluginsDir(dir); - foreach(QString fileName, pluginsDir.entryList(QDir::Files)) { + + foreach (QString fileName, pluginsDir.entryList(QDir::Files)) + { QPluginLoader* loader = new QPluginLoader(pluginsDir.absoluteFilePath(fileName)); PluginInterface* plugin = qobject_cast(loader->instance()); - if(loader->isLoaded()) + + if (loader->isLoaded()) { qWarning("loaded plugin %s", qPrintable(fileName)); - if(plugin != NULL) { + } + + if (plugin != NULL) { m_plugins.append(Plugin(fileName, loader, plugin)); } else { loader->unload(); delete loader; } } - foreach(QString dirName, pluginsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) + + foreach (QString dirName, pluginsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { loadPlugins(pluginsDir.absoluteFilePath(dirName)); + } } void PluginManager::renameChannelInstances()