From 89196c40b28f7852fabb7a07b8db317b79c79add Mon Sep 17 00:00:00 2001
From: f4exb <f4exb06@gmail.com>
Date: Sat, 30 Apr 2022 12:52:25 +0200
Subject: [PATCH] Massive UI revamping (v7): Make soapy SDR support optional.
 Fixes #718

---
 sdrbase/mainparser.cpp           | 10 +++++++---
 sdrbase/mainparser.h             |  3 +++
 sdrbase/plugin/pluginmanager.cpp |  9 ++++++++-
 sdrbase/plugin/pluginmanager.h   |  2 ++
 sdrgui/mainwindow.cpp            |  1 +
 sdrsrv/mainserver.cpp            |  1 +
 6 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/sdrbase/mainparser.cpp b/sdrbase/mainparser.cpp
index 4f1a4bab6..fa96f6033 100644
--- a/sdrbase/mainparser.cpp
+++ b/sdrbase/mainparser.cpp
@@ -35,12 +35,14 @@ MainParser::MainParser() :
         "FFTW Wisdom file.",
         "file",
         ""),
-    m_scratchOption("scratch", "Start from scratch (no current config).")
+    m_scratchOption("scratch", "Start from scratch (no current config)."),
+    m_soapyOption("soapy", "Activate Soapy SDR support.")
 {
 
     m_serverAddress = "";   // Bind to any address
     m_serverPort = 8091;
     m_scratch = false;
+    m_soapy = false;
     m_fftwfWindowFileName = "";
 
     m_parser.setApplicationDescription("Software Defined Radio application");
@@ -51,6 +53,7 @@ MainParser::MainParser() :
     m_parser.addOption(m_serverPortOption);
     m_parser.addOption(m_fftwfWisdomOption);
     m_parser.addOption(m_scratchOption);
+    m_parser.addOption(m_soapyOption);
 }
 
 MainParser::~MainParser()
@@ -94,10 +97,11 @@ void MainParser::parse(const QCoreApplication& app)
     }
 
     // FFTWF wisdom file
-
     m_fftwfWindowFileName = m_parser.value(m_fftwfWisdomOption);
 
     // Scratch mode
-
     m_scratch = m_parser.isSet(m_scratchOption);
+
+    // Soapy SDR support
+    m_soapy = m_parser.isSet(m_soapyOption);
 }
diff --git a/sdrbase/mainparser.h b/sdrbase/mainparser.h
index a04541909..f472d2733 100644
--- a/sdrbase/mainparser.h
+++ b/sdrbase/mainparser.h
@@ -35,6 +35,7 @@ public:
     const QString& getServerAddress() const { return m_serverAddress; }
     uint16_t getServerPort() const { return m_serverPort; }
     bool getScratch() const { return m_scratch; }
+    bool getSoapy() const { return m_soapy; }
     const QString& getFFTWFWisdomFileName() const { return m_fftwfWindowFileName; }
 
 private:
@@ -42,12 +43,14 @@ private:
     uint16_t m_serverPort;
     QString  m_fftwfWindowFileName;
     bool m_scratch;
+    bool m_soapy;
 
     QCommandLineParser m_parser;
     QCommandLineOption m_serverAddressOption;
     QCommandLineOption m_serverPortOption;
     QCommandLineOption m_fftwfWisdomOption;
     QCommandLineOption m_scratchOption;
+    QCommandLineOption m_soapyOption;
 };
 
 
diff --git a/sdrbase/plugin/pluginmanager.cpp b/sdrbase/plugin/pluginmanager.cpp
index 79073b952..64229029f 100644
--- a/sdrbase/plugin/pluginmanager.cpp
+++ b/sdrbase/plugin/pluginmanager.cpp
@@ -53,7 +53,8 @@ const QString PluginManager::m_testMIMODeviceTypeID = "sdrangel.samplemimo.testm
 
 PluginManager::PluginManager(QObject* parent) :
 	QObject(parent),
-    m_pluginAPI(this)
+    m_pluginAPI(this),
+    m_enableSoapy(false)
 {
 }
 
@@ -216,6 +217,12 @@ void PluginManager::loadPluginsDir(const QDir& dir)
     {
         if (QLibrary::isLibrary(fileName))
         {
+            if (!m_enableSoapy && (fileName.contains("libinputsoapysdr") || (fileName.contains("liboutputsoapysdr"))))
+            {
+                qInfo("PluginManager::loadPluginsDir: Soapy SDR disabled skipping %s", qPrintable(fileName));
+                continue;
+            }
+
             qDebug("PluginManager::loadPluginsDir: fileName: %s", qPrintable(fileName));
 
             QPluginLoader* pluginLoader = new QPluginLoader(pluginsDir.absoluteFilePath(fileName));
diff --git a/sdrbase/plugin/pluginmanager.h b/sdrbase/plugin/pluginmanager.h
index 71713810c..763af09e9 100644
--- a/sdrbase/plugin/pluginmanager.h
+++ b/sdrbase/plugin/pluginmanager.h
@@ -57,6 +57,7 @@ public:
 	~PluginManager();
 
 	PluginAPI *getPluginAPI() { return &m_pluginAPI; }
+    void setEnableSoapy(bool enableSoapy) { m_enableSoapy = enableSoapy; }
 	void loadPlugins(const QString& pluginsSubDir);
 	void loadPluginsPart(const QString& pluginsSubDir);
 	void loadPluginsFinal();
@@ -124,6 +125,7 @@ private:
 
 	PluginAPI m_pluginAPI;
 	Plugins m_plugins;
+    bool m_enableSoapy;
 
 	PluginAPI::ChannelRegistrations m_rxChannelRegistrations;           //!< Channel plugins register here
 	PluginAPI::ChannelRegistrations m_txChannelRegistrations;           //!< Channel plugins register here
diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp
index 08dfa2faa..14e535310 100644
--- a/sdrgui/mainwindow.cpp
+++ b/sdrgui/mainwindow.cpp
@@ -185,6 +185,7 @@ MainWindow::MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parse
 
     m_pluginManager = new PluginManager(this);
     m_mainCore->m_pluginManager = m_pluginManager;
+    m_pluginManager->setEnableSoapy(parser.getSoapy());
     m_pluginManager->loadPlugins(QString("plugins"));
     m_pluginManager->loadPluginsNonDiscoverable(m_mainCore->m_settings.getDeviceUserArgs());
 
diff --git a/sdrsrv/mainserver.cpp b/sdrsrv/mainserver.cpp
index 5380041f0..a02632844 100644
--- a/sdrsrv/mainserver.cpp
+++ b/sdrsrv/mainserver.cpp
@@ -59,6 +59,7 @@ MainServer::MainServer(qtwebapp::LoggerWithFile *logger, const MainParser& parse
 
     qDebug() << "MainServer::MainServer: load plugins...";
     m_mainCore->m_pluginManager = new PluginManager(this);
+    m_mainCore->m_pluginManager->setEnableSoapy(parser.getSoapy());
     m_mainCore->m_pluginManager->loadPlugins(QString("pluginssrv"));
 
     connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleMessages()), Qt::QueuedConnection);