diff --git a/sdrbase/CMakeLists.txt b/sdrbase/CMakeLists.txt
index 3b5ce6b70..38a5e8e2e 100644
--- a/sdrbase/CMakeLists.txt
+++ b/sdrbase/CMakeLists.txt
@@ -45,7 +45,7 @@ set(sdrbase_SOURCES
device/devicesourceapi.cpp
device/devicesinkapi.cpp
-# device/deviceenumerator.cpp
+ device/deviceenumerator.cpp
settings/preferences.cpp
settings/preset.cpp
@@ -127,7 +127,7 @@ set(sdrbase_HEADERS
device/devicesourceapi.h
device/devicesinkapi.h
-# device/deviceenumerator.h
+ device/deviceenumerator.h
plugin/plugininstancegui.h
plugin/plugininterface.h
diff --git a/sdrbase/device/deviceenumerator.cpp b/sdrbase/device/deviceenumerator.cpp
new file mode 100644
index 000000000..7399bba0a
--- /dev/null
+++ b/sdrbase/device/deviceenumerator.cpp
@@ -0,0 +1,179 @@
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2016 Edouard Griffiths, F4EXB //
+// //
+// 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 . //
+///////////////////////////////////////////////////////////////////////////////////
+
+#include
+
+#include "plugin/pluginmanager.h"
+#include "deviceenumerator.h"
+
+Q_GLOBAL_STATIC(DeviceEnumerator, deviceEnumerator)
+DeviceEnumerator *DeviceEnumerator::instance()
+{
+ return deviceEnumerator;
+}
+
+DeviceEnumerator::DeviceEnumerator()
+{}
+
+DeviceEnumerator::~DeviceEnumerator()
+{}
+
+void DeviceEnumerator::enumerateRxDevices(PluginManager *pluginManager)
+{
+ m_rxEnumeration.clear();
+ PluginAPI::SamplingDeviceRegistrations& rxDeviceRegistrations = pluginManager->getSourceDeviceRegistrations();
+ int index = 0;
+
+ for (int i = 0; i < rxDeviceRegistrations.count(); i++)
+ {
+ PluginInterface::SamplingDevices samplingDevices = rxDeviceRegistrations[i].m_plugin->enumSampleSources();
+
+ for (int j = 0; j < samplingDevices.count(); j++)
+ {
+ m_rxEnumeration.push_back(
+ DeviceEnumeration(
+ samplingDevices[j],
+ rxDeviceRegistrations[i].m_plugin,
+ index
+ )
+ );
+ index++;
+ }
+ }
+}
+
+void DeviceEnumerator::enumerateTxDevices(PluginManager *pluginManager)
+{
+ m_txEnumeration.clear();
+ PluginAPI::SamplingDeviceRegistrations& txDeviceRegistrations = pluginManager->getSinkDeviceRegistrations();
+ int index = 0;
+
+ for (int i = 0; i < txDeviceRegistrations.count(); i++)
+ {
+ PluginInterface::SamplingDevices samplingDevices = txDeviceRegistrations[i].m_plugin->enumSampleSources();
+
+ for (int j = 0; j < samplingDevices.count(); j++)
+ {
+ m_rxEnumeration.push_back(
+ DeviceEnumeration(
+ samplingDevices[j],
+ txDeviceRegistrations[i].m_plugin,
+ index
+ )
+ );
+ index++;
+ }
+ }
+}
+
+void DeviceEnumerator::listRxDeviceNames(QList& list, std::vector& indexes) const
+{
+ for (DevicesEnumeration::const_iterator it = m_rxEnumeration.begin(); it != m_rxEnumeration.end(); ++it)
+ {
+ if ((it->m_samplingDevice.claimed < 0) || (it->m_samplingDevice.type == PluginInterface::SamplingDevice::BuiltInDevice))
+ {
+ list.append(it->m_samplingDevice.displayedName);
+ indexes.push_back(it->m_index);
+ }
+ }
+}
+
+void DeviceEnumerator::listTxDeviceNames(QList& list, std::vector& indexes) const
+{
+ for (DevicesEnumeration::const_iterator it = m_txEnumeration.begin(); it != m_txEnumeration.end(); ++it)
+ {
+ if ((it->m_samplingDevice.claimed < 0) || (it->m_samplingDevice.type == PluginInterface::SamplingDevice::BuiltInDevice))
+ {
+ list.append(it->m_samplingDevice.displayedName);
+ indexes.push_back(it->m_index);
+ }
+ }
+}
+
+void DeviceEnumerator::changeRxSelection(int tabIndex, int deviceIndex)
+{
+ for (DevicesEnumeration::iterator it = m_rxEnumeration.begin(); it != m_rxEnumeration.end(); ++it)
+ {
+ if (it->m_samplingDevice.claimed == tabIndex) {
+ it->m_samplingDevice.claimed = -1;
+ }
+ if (it->m_index == deviceIndex) {
+ it->m_samplingDevice.claimed = tabIndex;
+ }
+ }
+}
+
+void DeviceEnumerator::changeTxSelection(int tabIndex, int deviceIndex)
+{
+ for (DevicesEnumeration::iterator it = m_txEnumeration.begin(); it != m_txEnumeration.end(); ++it)
+ {
+ if (it->m_samplingDevice.claimed == tabIndex) {
+ it->m_samplingDevice.claimed = -1;
+ }
+ if (it->m_index == deviceIndex) {
+ it->m_samplingDevice.claimed = tabIndex;
+ }
+ }
+}
+
+int DeviceEnumerator::getFileSourceDeviceIndex() const
+{
+ for (DevicesEnumeration::const_iterator it = m_rxEnumeration.begin(); it != m_rxEnumeration.end(); ++it)
+ {
+ if (it->m_samplingDevice.id == PluginManager::getFileSourceDeviceId()) {
+ return it->m_index;
+ }
+ }
+
+ return -1;
+}
+
+int DeviceEnumerator::getFileSinkDeviceIndex() const
+{
+ for (DevicesEnumeration::const_iterator it = m_txEnumeration.begin(); it != m_txEnumeration.end(); ++it)
+ {
+ if (it->m_samplingDevice.id == PluginManager::getFileSinkDeviceId()) {
+ return it->m_index;
+ }
+ }
+
+ return -1;
+}
+
+int DeviceEnumerator::getRxSamplingDeviceIndex(const QString& deviceId, int sequence)
+{
+ for (DevicesEnumeration::iterator it = m_rxEnumeration.begin(); it != m_rxEnumeration.end(); ++it)
+ {
+ if ((it->m_samplingDevice.id == deviceId) && (it->m_samplingDevice.sequence == sequence)) {
+ return it->m_index;
+ }
+ }
+
+ return -1;
+}
+
+int DeviceEnumerator::getTxSamplingDeviceIndex(const QString& deviceId, int sequence)
+{
+ for (DevicesEnumeration::iterator it = m_txEnumeration.begin(); it != m_txEnumeration.end(); ++it)
+ {
+ if ((it->m_samplingDevice.id == deviceId) && (it->m_samplingDevice.sequence == sequence)) {
+ return it->m_index;
+ }
+ }
+
+ return -1;
+}
+
diff --git a/sdrbase/device/deviceenumerator.h b/sdrbase/device/deviceenumerator.h
new file mode 100644
index 000000000..36d4f4e41
--- /dev/null
+++ b/sdrbase/device/deviceenumerator.h
@@ -0,0 +1,69 @@
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2016 Edouard Griffiths, F4EXB //
+// //
+// 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_DEVICE_DEVICEENUMERATOR_H_
+#define SDRBASE_DEVICE_DEVICEENUMERATOR_H_
+
+#include
+
+#include "plugin/plugininterface.h"
+
+class PluginManager;
+
+class DeviceEnumerator
+{
+public:
+ DeviceEnumerator();
+ ~DeviceEnumerator();
+
+ static DeviceEnumerator *instance();
+
+ void enumerateRxDevices(PluginManager *pluginManager);
+ void enumerateTxDevices(PluginManager *pluginManager);
+ void listRxDeviceNames(QList& list, std::vector& indexes) const;
+ void listTxDeviceNames(QList& list, std::vector& indexes) const;
+ void changeRxSelection(int tabIndex, int deviceIndex);
+ void changeTxSelection(int tabIndex, int deviceIndex);
+ PluginInterface::SamplingDevice getRxSamplingDevice(int deviceIndex) const { return m_rxEnumeration[deviceIndex].m_samplingDevice; }
+ PluginInterface::SamplingDevice getTxSamplingDevice(int deviceIndex) const { return m_txEnumeration[deviceIndex].m_samplingDevice; }
+ PluginInterface *getRxPluginInterface(int deviceIndex) { return m_rxEnumeration[deviceIndex].m_pluginInterface; }
+ PluginInterface *getTxPluginInterface(int deviceIndex) { return m_txEnumeration[deviceIndex].m_pluginInterface; }
+ int getFileSourceDeviceIndex() const;
+ int getFileSinkDeviceIndex() const;
+ int getRxSamplingDeviceIndex(const QString& deviceId, int sequence);
+ int getTxSamplingDeviceIndex(const QString& deviceId, int sequence);
+
+private:
+ struct DeviceEnumeration
+ {
+ PluginInterface::SamplingDevice m_samplingDevice;
+ PluginInterface *m_pluginInterface;
+ int m_index;
+
+ DeviceEnumeration(const PluginInterface::SamplingDevice& samplingDevice, PluginInterface *pluginInterface, int index) :
+ m_samplingDevice(samplingDevice),
+ m_pluginInterface(pluginInterface),
+ m_index(index)
+ {}
+ };
+
+ typedef std::vector DevicesEnumeration;
+
+ DevicesEnumeration m_rxEnumeration;
+ DevicesEnumeration m_txEnumeration;
+};
+
+#endif /* SDRBASE_DEVICE_DEVICEENUMERATOR_H_ */
diff --git a/sdrbase/plugin/pluginapi.h b/sdrbase/plugin/pluginapi.h
index 1820e697a..0cc629fa9 100644
--- a/sdrbase/plugin/pluginapi.h
+++ b/sdrbase/plugin/pluginapi.h
@@ -17,6 +17,18 @@ class SDRANGEL_API PluginAPI : public QObject {
Q_OBJECT
public:
+ struct SamplingDeviceRegistration //!< This is the device registration
+ {
+ QString m_deviceId;
+ PluginInterface* m_plugin;
+ SamplingDeviceRegistration(const QString& deviceId, PluginInterface* plugin) :
+ m_deviceId(deviceId),
+ m_plugin(plugin)
+ { }
+ };
+
+ typedef QList SamplingDeviceRegistrations;
+
struct ChannelRegistration
{
QString m_channelId; //!< Channel or device type ID
diff --git a/sdrbase/plugin/pluginmanager.cpp b/sdrbase/plugin/pluginmanager.cpp
index ab5c23a37..559cb47b6 100644
--- a/sdrbase/plugin/pluginmanager.cpp
+++ b/sdrbase/plugin/pluginmanager.cpp
@@ -24,6 +24,7 @@
#include
#include "device/devicesourceapi.h"
#include "device/devicesinkapi.h"
+#include "device/deviceenumerator.h"
#include "settings/preset.h"
#include "util/message.h"
#include "dsp/dspdevicesourceengine.h"
@@ -71,9 +72,8 @@ void PluginManager::loadPlugins()
it->pluginInterface->initPlugin(&m_pluginAPI);
}
- // TODO: enumerate with DeviceEnumerator
- updateSampleSourceDevices();
- updateSampleSinkDevices();
+ DeviceEnumerator::instance()->enumerateRxDevices(this);
+ DeviceEnumerator::instance()->enumerateTxDevices(this);
}
void PluginManager::registerRxChannel(const QString& channelName, PluginInterface* plugin)
@@ -100,7 +100,7 @@ void PluginManager::registerSampleSource(const QString& sourceName, PluginInterf
<< plugin->getPluginDescriptor().displayedName.toStdString().c_str()
<< " with source name " << sourceName.toStdString().c_str();
- m_sampleSourceRegistrations.append(SamplingDeviceRegistration(sourceName, plugin));
+ m_sampleSourceRegistrations.append(PluginAPI::SamplingDeviceRegistration(sourceName, plugin));
}
void PluginManager::registerSampleSink(const QString& sinkName, PluginInterface* plugin)
@@ -109,418 +109,7 @@ void PluginManager::registerSampleSink(const QString& sinkName, PluginInterface*
<< plugin->getPluginDescriptor().displayedName.toStdString().c_str()
<< " with sink name " << sinkName.toStdString().c_str();
- m_sampleSinkRegistrations.append(SamplingDeviceRegistration(sinkName, plugin));
-}
-
-void PluginManager::updateSampleSourceDevices()
-{
- m_sampleSourceDevices.clear();
-
- for(int i = 0; i < m_sampleSourceRegistrations.count(); ++i)
- {
- PluginInterface::SamplingDevices ssd = m_sampleSourceRegistrations[i].m_plugin->enumSampleSources();
-
- for(int j = 0; j < ssd.count(); ++j)
- {
- m_sampleSourceDevices.append(SamplingDevice(m_sampleSourceRegistrations[i].m_plugin,
- ssd[j].displayedName,
- ssd[j].hardwareId,
- ssd[j].id,
- ssd[j].serial,
- ssd[j].sequence));
- qDebug("PluginManager::updateSampleSourceDevices: %s %s %s %s %d",
- qPrintable(ssd[j].displayedName),
- qPrintable(ssd[j].hardwareId),
- qPrintable(ssd[j].id),
- qPrintable(ssd[j].serial),
- ssd[j].sequence);
- }
- }
-}
-
-void PluginManager::updateSampleSinkDevices()
-{
- m_sampleSinkDevices.clear();
-
- for(int i = 0; i < m_sampleSinkRegistrations.count(); ++i)
- {
- PluginInterface::SamplingDevices ssd = m_sampleSinkRegistrations[i].m_plugin->enumSampleSinks();
-
- for(int j = 0; j < ssd.count(); ++j)
- {
- m_sampleSinkDevices.append(SamplingDevice(m_sampleSinkRegistrations[i].m_plugin,
- ssd[j].displayedName,
- ssd[j].hardwareId,
- ssd[j].id,
- ssd[j].serial,
- ssd[j].sequence));
- qDebug("PluginManager::updateSampleSinkDevices: %s %s %s %s %d",
- qPrintable(ssd[j].displayedName),
- qPrintable(ssd[j].hardwareId),
- qPrintable(ssd[j].id),
- qPrintable(ssd[j].serial),
- ssd[j].sequence);
- }
- }
-}
-
-void PluginManager::duplicateLocalSampleSourceDevices(uint deviceUID)
-{
- if (deviceUID == 0) {
- return;
- }
-
- SamplingDevice *sdrDaemonSSD0 = 0;
- SamplingDevice *fileSourceSSD0 = 0;
- bool duplicateSDRDaemon = true;
- bool duplicateFileSource = true;
-
- for(int i = 0; i < m_sampleSourceDevices.count(); ++i)
- {
- if (m_sampleSourceDevices[i].m_deviceId == m_sdrDaemonSourceDeviceTypeID) // SDRdaemon
- {
- if (m_sampleSourceDevices[i].m_deviceSequence == 0) { // reference to device 0
- sdrDaemonSSD0 = &m_sampleSourceDevices[i];
- }
- else if (m_sampleSourceDevices[i].m_deviceSequence == deviceUID) { // already there
- duplicateSDRDaemon = false;
- }
- }
- else if (m_sampleSourceDevices[i].m_deviceId == m_fileSourceDeviceTypeID) // File Source
- {
- if (m_sampleSourceDevices[i].m_deviceSequence == 0) { // reference to device 0
- fileSourceSSD0 = &m_sampleSourceDevices[i];
- }
- else if (m_sampleSourceDevices[i].m_deviceSequence == deviceUID) { // already there
- duplicateFileSource = false;
- }
- }
- }
-
- if (sdrDaemonSSD0 && duplicateSDRDaemon) // append item for a new instance
- {
- m_sampleSourceDevices.append(
- SamplingDevice(
- sdrDaemonSSD0->m_plugin,
- QString("SDRdaemonSource[%1]").arg(deviceUID),
- sdrDaemonSSD0->m_hadrwareId,
- sdrDaemonSSD0->m_deviceId,
- sdrDaemonSSD0->m_deviceSerial,
- deviceUID
- )
- );
- }
-
- if (fileSourceSSD0 && duplicateFileSource) // append item for a new instance
- {
- m_sampleSourceDevices.append(
- SamplingDevice(
- fileSourceSSD0->m_plugin,
- QString("FileSource[%1]").arg(deviceUID),
- fileSourceSSD0->m_hadrwareId,
- fileSourceSSD0->m_deviceId,
- fileSourceSSD0->m_deviceSerial,
- deviceUID
- )
- );
- }
-}
-
-void PluginManager::duplicateLocalSampleSinkDevices(uint deviceUID)
-{
- if (deviceUID == 0) {
- return;
- }
-
- SamplingDevice *fileSinkSSD0 = 0;
- bool duplicateFileSink = true;
-
- for(int i = 0; i < m_sampleSinkDevices.count(); ++i)
- {
- if (m_sampleSinkDevices[i].m_deviceId == m_fileSinkDeviceTypeID) // File Sink
- {
- if (m_sampleSinkDevices[i].m_deviceSequence == 0) { // reference to device 0
- fileSinkSSD0 = &m_sampleSinkDevices[i];
- }
- else if (m_sampleSinkDevices[i].m_deviceSequence == deviceUID) { // already there
- duplicateFileSink = false;
- }
- }
- }
-
- if (fileSinkSSD0 && duplicateFileSink) // append item for a new instance
- {
- m_sampleSinkDevices.append(
- SamplingDevice(
- fileSinkSSD0->m_plugin,
- QString("FileSink[%1]").arg(deviceUID),
- fileSinkSSD0->m_hadrwareId,
- fileSinkSSD0->m_deviceId,
- fileSinkSSD0->m_deviceSerial,
- deviceUID
- )
- );
- }
-}
-
-void PluginManager::fillSampleSourceSelector(
- QComboBox* comboBox __attribute__((unused)),
- uint deviceUID __attribute__((unused)))
-{
-// comboBox->clear();
-//
-// for(int i = 0; i < m_sampleSourceDevices.count(); i++)
-// {
-// // For "local" devices show only ones that concern this device set
-// if ((m_sampleSourceDevices[i].m_deviceId == m_sdrDaemonSourceDeviceTypeID)
-// || (m_sampleSourceDevices[i].m_deviceId == m_fileSourceDeviceTypeID))
-// {
-// if (deviceUID != m_sampleSourceDevices[i].m_deviceSequence) {
-// continue;
-// }
-// }
-//
-// comboBox->addItem(m_sampleSourceDevices[i].m_displayName, qVariantFromValue((void *) &m_sampleSourceDevices[i]));
-// }
-}
-
-void PluginManager::fillSampleSinkSelector(
- QComboBox* comboBox __attribute__((unused)),
- uint deviceUID __attribute__((unused)))
-{
-// comboBox->clear();
-//
-// for(int i = 0; i < m_sampleSinkDevices.count(); i++)
-// {
-// // For "local" devices show only ones that concern this device set
-// if (m_sampleSinkDevices[i].m_deviceId == m_fileSinkDeviceTypeID)
-// {
-// if (deviceUID != m_sampleSinkDevices[i].m_deviceSequence) {
-// continue;
-// }
-// }
-//
-// comboBox->addItem(m_sampleSinkDevices[i].m_displayName, qVariantFromValue((void *) &m_sampleSinkDevices[i]));
-// }
-}
-
-int PluginManager::selectSampleSourceByIndex(int index, DeviceSourceAPI *deviceAPI)
-{
- qDebug("PluginManager::selectSampleSourceByIndex: index: %d", index);
-
- if (m_sampleSourceDevices.count() == 0)
- {
- return -1;
- }
-
- if (index < 0)
- {
- return -1;
- }
-
- if (index >= m_sampleSourceDevices.count())
- {
- index = 0;
- }
-
- qDebug() << "PluginManager::selectSampleSourceByIndex: m_sampleSource at index " << index
- << " hid: " << m_sampleSourceDevices[index].m_hadrwareId.toStdString().c_str()
- << " id: " << m_sampleSourceDevices[index].m_deviceId.toStdString().c_str()
- << " ser: " << m_sampleSourceDevices[index].m_deviceSerial.toStdString().c_str()
- << " seq: " << m_sampleSourceDevices[index].m_deviceSequence;
-
- deviceAPI->stopAcquisition();
-
- deviceAPI->setSampleSourceSequence(m_sampleSourceDevices[index].m_deviceSequence);
- deviceAPI->setHardwareId(m_sampleSourceDevices[index].m_hadrwareId);
- deviceAPI->setSampleSourceId(m_sampleSourceDevices[index].m_deviceId);
- deviceAPI->setSampleSourceSerial(m_sampleSourceDevices[index].m_deviceSerial);
- deviceAPI->setSampleSourceDisplayName(m_sampleSourceDevices[index].m_displayName);
- deviceAPI->setSampleSourcePluginInterface(m_sampleSourceDevices[index].m_plugin);
-
- return index;
-}
-
-int PluginManager::selectSampleSourceBySerialOrSequence(const QString& sourceId, const QString& sourceSerial, uint32_t sourceSequence, DeviceSourceAPI *deviceAPI)
-{
- qDebug("PluginManager::selectSampleSourceBySequence by sequence: id: %s ser: %s seq: %d", qPrintable(sourceId), qPrintable(sourceSerial), sourceSequence);
-
- int index = -1;
- int index_matchingSequence = -1;
- int index_firstOfKind = -1;
-
- for (int i = 0; i < m_sampleSourceDevices.count(); i++)
- {
- if (m_sampleSourceDevices[i].m_deviceId == sourceId)
- {
- index_firstOfKind = i;
-
- if (m_sampleSourceDevices[i].m_deviceSerial == sourceSerial)
- {
- index = i; // exact match
- break;
- }
-
- if (m_sampleSourceDevices[i].m_deviceSequence == sourceSequence)
- {
- index_matchingSequence = i;
- }
- }
- }
-
- if(index == -1) // no exact match
- {
- if (index_matchingSequence == -1) // no matching sequence
- {
- if (index_firstOfKind == -1) // no matching device type
- {
- if(m_sampleSourceDevices.count() > 0) // take first if any
- {
- index = 0;
- }
- else
- {
- return -1; // return if no device attached
- }
- }
- else
- {
- index = index_firstOfKind; // take first that matches device type
- }
- }
- else
- {
- index = index_matchingSequence; // take the one that matches the sequence in the device type
- }
- }
-
- qDebug() << "PluginManager::selectSampleSourceBySequence: m_sampleSource at index " << index
- << " hid: " << m_sampleSourceDevices[index].m_hadrwareId.toStdString().c_str()
- << " id: " << m_sampleSourceDevices[index].m_deviceId.toStdString().c_str()
- << " ser: " << m_sampleSourceDevices[index].m_deviceSerial.toStdString().c_str()
- << " seq: " << m_sampleSourceDevices[index].m_deviceSequence;
-
- deviceAPI->stopAcquisition();
-
- // m_sampleSourcePluginGUI = pluginGUI;
- deviceAPI->setSampleSourceSequence(m_sampleSourceDevices[index].m_deviceSequence);
- deviceAPI->setHardwareId(m_sampleSourceDevices[index].m_hadrwareId);
- deviceAPI->setSampleSourceId(m_sampleSourceDevices[index].m_deviceId);
- deviceAPI->setSampleSourceSerial(m_sampleSourceDevices[index].m_deviceSerial);
- deviceAPI->setSampleSourceDisplayName(m_sampleSourceDevices[index].m_displayName);
- deviceAPI->setSampleSourcePluginInterface(m_sampleSourceDevices[index].m_plugin);
-
- return index;
-}
-
-int PluginManager::selectSampleSinkBySerialOrSequence(const QString& sinkId, const QString& sinkSerial, uint32_t sinkSequence, DeviceSinkAPI *deviceAPI)
-{
- qDebug("PluginManager::selectSampleSinkBySerialOrSequence by sequence: id: %s ser: %s seq: %d", qPrintable(sinkId), qPrintable(sinkSerial), sinkSequence);
-
- int index = -1;
- int index_matchingSequence = -1;
- int index_firstOfKind = -1;
-
- for (int i = 0; i < m_sampleSinkDevices.count(); i++)
- {
- if (m_sampleSinkDevices[i].m_deviceId == sinkId)
- {
- index_firstOfKind = i;
-
- if (m_sampleSinkDevices[i].m_deviceSerial == sinkSerial)
- {
- index = i; // exact match
- break;
- }
-
- if (m_sampleSinkDevices[i].m_deviceSequence == sinkSequence)
- {
- index_matchingSequence = i;
- }
- }
- }
-
- if(index == -1) // no exact match
- {
- if (index_matchingSequence == -1) // no matching sequence
- {
- if (index_firstOfKind == -1) // no matching device type
- {
- if(m_sampleSinkDevices.count() > 0) // take first if any
- {
- index = 0;
- }
- else
- {
- return -1; // return if no device attached
- }
- }
- else
- {
- index = index_firstOfKind; // take first that matches device type
- }
- }
- else
- {
- index = index_matchingSequence; // take the one that matches the sequence in the device type
- }
- }
-
- qDebug() << "PluginManager::selectSampleSinkBySerialOrSequence: m_sampleSink at index " << index
- << " hid: " << m_sampleSinkDevices[index].m_hadrwareId.toStdString().c_str()
- << " id: " << m_sampleSinkDevices[index].m_deviceId.toStdString().c_str()
- << " ser: " << m_sampleSinkDevices[index].m_deviceSerial.toStdString().c_str()
- << " seq: " << m_sampleSinkDevices[index].m_deviceSequence;
-
- deviceAPI->stopGeneration();
-
- // m_sampleSourcePluginGUI = pluginGUI;
- deviceAPI->setSampleSinkSequence(m_sampleSinkDevices[index].m_deviceSequence);
- deviceAPI->setHardwareId(m_sampleSinkDevices[index].m_hadrwareId);
- deviceAPI->setSampleSinkId(m_sampleSinkDevices[index].m_deviceId);
- deviceAPI->setSampleSinkSerial(m_sampleSinkDevices[index].m_deviceSerial);
- deviceAPI->setSampleSinkDisplayName(m_sampleSinkDevices[index].m_displayName);
- deviceAPI->setSampleSinkPluginInterface(m_sampleSinkDevices[index].m_plugin);
-
- return index;
-}
-
-void PluginManager::selectSampleSourceByDevice(void *devicePtr, DeviceSourceAPI *deviceAPI)
-{
- SamplingDevice *sampleSourceDevice = (SamplingDevice *) devicePtr;
-
- qDebug() << "PluginManager::selectSampleSourceByDevice: "
- << " hid: " << sampleSourceDevice->m_hadrwareId.toStdString().c_str()
- << " id: " << sampleSourceDevice->m_deviceId.toStdString().c_str()
- << " ser: " << sampleSourceDevice->m_deviceSerial.toStdString().c_str()
- << " seq: " << sampleSourceDevice->m_deviceSequence;
-
- // m_sampleSourcePluginGUI = pluginGUI;
- deviceAPI->setSampleSourceSequence(sampleSourceDevice->m_deviceSequence);
- deviceAPI->setHardwareId(sampleSourceDevice->m_hadrwareId);
- deviceAPI->setSampleSourceId(sampleSourceDevice->m_deviceId);
- deviceAPI->setSampleSourceSerial(sampleSourceDevice->m_deviceSerial);
- deviceAPI->setSampleSourceDisplayName(sampleSourceDevice->m_displayName);
- deviceAPI->setSampleSourcePluginInterface(sampleSourceDevice->m_plugin);
-}
-
-void PluginManager::selectSampleSinkByDevice(void *devicePtr, DeviceSinkAPI *deviceAPI)
-{
- SamplingDevice *sampleSinkDevice = (SamplingDevice *) devicePtr;
-
- qDebug() << "PluginManager::selectSampleSinkByDevice: "
- << " hid: " << sampleSinkDevice->m_hadrwareId.toStdString().c_str()
- << " id: " << sampleSinkDevice->m_deviceId.toStdString().c_str()
- << " ser: " << sampleSinkDevice->m_deviceSerial.toStdString().c_str()
- << " seq: " << sampleSinkDevice->m_deviceSequence;
-
- // m_sampleSourcePluginGUI = pluginGUI;
- deviceAPI->setSampleSinkSequence(sampleSinkDevice->m_deviceSequence);
- deviceAPI->setHardwareId(sampleSinkDevice->m_hadrwareId);
- deviceAPI->setSampleSinkId(sampleSinkDevice->m_deviceId);
- deviceAPI->setSampleSinkSerial(sampleSinkDevice->m_deviceSerial);
- deviceAPI->setSampleSinkDisplayName(sampleSinkDevice->m_displayName);
- deviceAPI->setSampleSinkPluginInterface(sampleSinkDevice->m_plugin);
+ m_sampleSinkRegistrations.append(PluginAPI::SamplingDeviceRegistration(sinkName, plugin));
}
void PluginManager::loadPlugins(const QDir& dir)
@@ -566,15 +155,6 @@ void PluginManager::loadPlugins(const QDir& dir)
}
}
-PluginInterface* PluginManager::getPluginInterfaceAt(int index)
-{
- if (index < m_sampleSourceDevices.size()) {
- return m_sampleSourceDevices[index].m_plugin;
- } else {
- return 0;
- }
-}
-
void PluginManager::listTxChannels(QList& list)
{
list.clear();
diff --git a/sdrbase/plugin/pluginmanager.h b/sdrbase/plugin/pluginmanager.h
index c0abb24e9..a49c634b9 100644
--- a/sdrbase/plugin/pluginmanager.h
+++ b/sdrbase/plugin/pluginmanager.h
@@ -51,45 +51,21 @@ public:
void registerTxChannel(const QString& channelName, PluginInterface* plugin);
void registerSampleSink(const QString& sourceName, PluginInterface* plugin);
+ PluginAPI::SamplingDeviceRegistrations& getSourceDeviceRegistrations() { return m_sampleSourceRegistrations; }
+ PluginAPI::SamplingDeviceRegistrations& getSinkDeviceRegistrations() { return m_sampleSinkRegistrations; }
PluginAPI::ChannelRegistrations *getRxChannelRegistrations() { return &m_rxChannelRegistrations; }
PluginAPI::ChannelRegistrations *getTxChannelRegistrations() { return &m_txChannelRegistrations; }
- void updateSampleSourceDevices();
- void duplicateLocalSampleSourceDevices(uint deviceUID);
- void fillSampleSourceSelector(QComboBox* comboBox, uint deviceUID);
-
- void updateSampleSinkDevices();
- void duplicateLocalSampleSinkDevices(uint deviceUID);
- void fillSampleSinkSelector(QComboBox* comboBox, uint deviceUID);
-
- int selectSampleSourceByIndex(int index, DeviceSourceAPI *deviceAPI);
- int selectSampleSourceBySerialOrSequence(const QString& sourceId, const QString& sourceSerial, uint32_t sourceSequence, DeviceSourceAPI *deviceAPI);
- void selectSampleSourceByDevice(void *devicePtr, DeviceSourceAPI *deviceAPI);
-
- int selectSampleSinkBySerialOrSequence(const QString& sinkId, const QString& sinkSerial, uint32_t sinkSequence, DeviceSinkAPI *deviceAPI);
- void selectSampleSinkByDevice(void *devicePtr, DeviceSinkAPI *deviceAPI);
-
- PluginInterface* getPluginInterfaceAt(int index);
-
void createRxChannelInstance(int channelPluginIndex, DeviceUISet *deviceUISet);
void listRxChannels(QList& list);
void createTxChannelInstance(int channelPluginIndex, DeviceUISet *deviceUISet);
void listTxChannels(QList& list);
+ static const QString& getFileSourceDeviceId() { return m_fileSourceDeviceTypeID; }
+ static const QString& getFileSinkDeviceId() { return m_fileSinkDeviceTypeID; }
+
private:
- struct SamplingDeviceRegistration //!< This is the channel registration
- {
- QString m_deviceId;
- PluginInterface* m_plugin;
- SamplingDeviceRegistration(const QString& deviceId, PluginInterface* plugin) :
- m_deviceId(deviceId),
- m_plugin(plugin)
- { }
- };
-
- typedef QList SamplingDeviceRegistrations;
-
struct SamplingDevice { //!< This is the device registration
PluginInterface* m_plugin;
QString m_displayName;
@@ -118,13 +94,11 @@ private:
PluginAPI m_pluginAPI;
Plugins m_plugins;
- PluginAPI::ChannelRegistrations m_rxChannelRegistrations; //!< Channel plugins register here
- SamplingDeviceRegistrations m_sampleSourceRegistrations; //!< Input source plugins (one per device kind) register here
- SamplingDevices m_sampleSourceDevices; //!< Instances of input sources present in the system
+ PluginAPI::ChannelRegistrations m_rxChannelRegistrations; //!< Channel plugins register here
+ PluginAPI::SamplingDeviceRegistrations m_sampleSourceRegistrations; //!< Input source plugins (one per device kind) register here
- PluginAPI::ChannelRegistrations m_txChannelRegistrations; //!< Channel plugins register here
- SamplingDeviceRegistrations m_sampleSinkRegistrations; //!< Output sink plugins (one per device kind) register here
- SamplingDevices m_sampleSinkDevices; //!< Instances of output sinks present in the system
+ PluginAPI::ChannelRegistrations m_txChannelRegistrations; //!< Channel plugins register here
+ PluginAPI::SamplingDeviceRegistrations m_sampleSinkRegistrations; //!< Output sink plugins (one per device kind) register here
// "Local" sample source device IDs
static const QString m_sdrDaemonSourceHardwareID; //!< SDRdaemon source hardware ID
diff --git a/sdrbase/settings/mainsettings.h b/sdrbase/settings/mainsettings.h
index d5659745b..ea261ca06 100644
--- a/sdrbase/settings/mainsettings.h
+++ b/sdrbase/settings/mainsettings.h
@@ -25,6 +25,8 @@ public:
Preset* getWorkingPreset() { return &m_workingPreset; }
int getSourceIndex() const { return m_preferences.getSourceIndex(); }
void setSourceIndex(int value) { m_preferences.setSourceIndex(value); }
+ const QString& getSourceDeviceId() const { return m_preferences.getSourceDevice(); }
+ void setSourceDeviceId(const QString& deviceId) { m_preferences.setSourceDevice(deviceId); }
void setLatitude(float latitude) { m_preferences.setLatitude(latitude); }
void setLongitude(float longitude) { m_preferences.setLongitude(longitude); }
diff --git a/sdrgui/CMakeLists.txt b/sdrgui/CMakeLists.txt
index a7bfc1b8f..efb8149df 100644
--- a/sdrgui/CMakeLists.txt
+++ b/sdrgui/CMakeLists.txt
@@ -29,6 +29,7 @@ set(sdrgui_SOURCES
gui/presetitem.cpp
gui/rollupwidget.cpp
gui/samplingdevicecontrol.cpp
+ gui/samplingdevicedialog.cpp
gui/scale.cpp
gui/scaleengine.cpp
gui/transverterbutton.cpp
@@ -75,6 +76,7 @@ set(sdrgui_HEADERS
gui/presetitem.h
gui/rollupwidget.h
gui/samplingdevicecontrol.h
+ gui/samplingdevicedialog.h
gui/scale.h
gui/scaleengine.h
gui/transverterbutton.h
@@ -111,6 +113,7 @@ set(sdrgui_FORMS
gui/pluginsdialog.ui
gui/audiodialog.ui
gui/samplingdevicecontrol.ui
+ gui/samplingdevicedialog.ui
gui/myposdialog.ui
gui/transverterdialog.ui
)
diff --git a/sdrgui/device/deviceuiset.cpp b/sdrgui/device/deviceuiset.cpp
index db255fada..175e14994 100644
--- a/sdrgui/device/deviceuiset.cpp
+++ b/sdrgui/device/deviceuiset.cpp
@@ -32,7 +32,7 @@
#include "deviceuiset.h"
-DeviceUISet::DeviceUISet(int tabIndex, QTimer& timer)
+DeviceUISet::DeviceUISet(int tabIndex, bool rxElseTx, QTimer& timer)
{
m_spectrum = new GLSpectrum;
m_spectrumVis = new SpectrumVis(m_spectrum);
@@ -40,7 +40,7 @@ DeviceUISet::DeviceUISet(int tabIndex, QTimer& timer)
m_spectrumGUI = new GLSpectrumGUI;
m_spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, m_spectrum);
m_channelWindow = new ChannelWindow;
- m_samplingDeviceControl = new SamplingDeviceControl(tabIndex);
+ m_samplingDeviceControl = new SamplingDeviceControl(tabIndex, rxElseTx);
m_deviceSourceEngine = 0;
m_deviceSourceAPI = 0;
m_deviceSinkEngine = 0;
diff --git a/sdrgui/device/deviceuiset.h b/sdrgui/device/deviceuiset.h
index 0e33d53f5..74e2cd13d 100644
--- a/sdrgui/device/deviceuiset.h
+++ b/sdrgui/device/deviceuiset.h
@@ -45,7 +45,7 @@ struct DeviceUISet
DeviceSinkAPI *m_deviceSinkAPI;
QByteArray m_mainWindowState;
- DeviceUISet(int tabIndex, QTimer& timer);
+ DeviceUISet(int tabIndex, bool rxElseTx, QTimer& timer);
~DeviceUISet();
GLSpectrum *getSpectrum() { return m_spectrum; } //!< Direct spectrum getter
diff --git a/sdrgui/gui/samplingdevicecontrol.cpp b/sdrgui/gui/samplingdevicecontrol.cpp
index cf68101f9..cf56f7641 100644
--- a/sdrgui/gui/samplingdevicecontrol.cpp
+++ b/sdrgui/gui/samplingdevicecontrol.cpp
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2015 Edouard Griffiths, F4EXB //
+// Copyright (C) 2015-2017 Edouard Griffiths, F4EXB //
// //
// 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 //
@@ -14,17 +14,20 @@
// along with this program. If not, see . //
///////////////////////////////////////////////////////////////////////////////////
-#include "gui/samplingdevicecontrol.h"
-#include "gui/pluginsdialog.h"
+#include "samplingdevicecontrol.h"
+#include "samplingdevicedialog.h"
#include "plugin/pluginmanager.h"
+#include "device/deviceenumerator.h"
#include "ui_samplingdevicecontrol.h"
-SamplingDeviceControl::SamplingDeviceControl(int tabIndex, QWidget* parent) :
+SamplingDeviceControl::SamplingDeviceControl(int tabIndex, bool rxElseTx, QWidget* parent) :
QWidget(parent),
ui(new Ui::SamplingDeviceControl),
m_pluginManager(0),
- m_deviceTabIndex(tabIndex)
+ m_deviceTabIndex(tabIndex),
+ m_rxElseTx(rxElseTx),
+ m_selectedDeviceIndex(-1)
{
ui->setupUi(this);
}
@@ -34,14 +37,40 @@ SamplingDeviceControl::~SamplingDeviceControl()
delete ui;
}
-QComboBox *SamplingDeviceControl::getDeviceSelector()
+void SamplingDeviceControl::on_deviceChange_clicked()
{
- return ui->deviceSelect;
+ SamplingDeviceDialog dialog(m_rxElseTx, m_deviceTabIndex, this);
+ dialog.exec();
+
+ if (dialog.getSelectedDeviceIndex() >= 0)
+ {
+ m_selectedDeviceIndex = dialog.getSelectedDeviceIndex();
+ setSelectedDeviceIndex(m_selectedDeviceIndex);
+ emit changed();
+ }
}
-QPushButton *SamplingDeviceControl::getDeviceSelectionConfirm()
+void SamplingDeviceControl::on_deviceReload_clicked()
{
- return ui->deviceConfirm;
+ if (m_selectedDeviceIndex >= 0) {
+ emit changed();
+ }
+}
+
+void SamplingDeviceControl::setSelectedDeviceIndex(int index)
+{
+ if (m_rxElseTx)
+ {
+ PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(index);
+ ui->deviceSelectedText->setText(samplingDevice.displayedName);
+ }
+ else
+ {
+ PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(index);
+ ui->deviceSelectedText->setText(samplingDevice.displayedName);
+ }
+
+ m_selectedDeviceIndex = index;
}
QComboBox *SamplingDeviceControl::getChannelSelector()
diff --git a/sdrgui/gui/samplingdevicecontrol.h b/sdrgui/gui/samplingdevicecontrol.h
index 58dea4932..621d26654 100644
--- a/sdrgui/gui/samplingdevicecontrol.h
+++ b/sdrgui/gui/samplingdevicecontrol.h
@@ -37,19 +37,29 @@ class SDRANGEL_API SamplingDeviceControl : public QWidget {
Q_OBJECT
public:
- explicit SamplingDeviceControl(int tabIndex, QWidget* parent = 0);
+ explicit SamplingDeviceControl(int tabIndex, bool rxElseTx, QWidget* parent = 0);
~SamplingDeviceControl();
+ int getSelectedDeviceIndex() const { return m_selectedDeviceIndex; }
+ void setSelectedDeviceIndex(int index);
+
void setPluginManager(PluginManager *pluginManager) { m_pluginManager = pluginManager; }
- QComboBox *getDeviceSelector();
- QPushButton *getDeviceSelectionConfirm();
QComboBox *getChannelSelector();
QPushButton *getAddChannelButton();
+private slots:
+ void on_deviceChange_clicked();
+ void on_deviceReload_clicked();
+
private:
Ui::SamplingDeviceControl* ui;
PluginManager *m_pluginManager;
int m_deviceTabIndex;
+ bool m_rxElseTx;
+ int m_selectedDeviceIndex;
+
+signals:
+ void changed();
};
diff --git a/sdrgui/gui/samplingdevicecontrol.ui b/sdrgui/gui/samplingdevicecontrol.ui
index 6afb39add..3866aa90e 100644
--- a/sdrgui/gui/samplingdevicecontrol.ui
+++ b/sdrgui/gui/samplingdevicecontrol.ui
@@ -35,20 +35,29 @@
3
-
+
+ 2
+
+
+ 2
+
+
+ 2
+
+
2
-
-
-
-
- Select sampling device
+
+
+ Device
-
-
+
24
@@ -62,14 +71,34 @@
- Confirm and change sampling device
+ Change sampling device
- :/checkmark.png:/checkmark.png
+ :/choose.png:/choose.png
+
+
+
+ -
+
+
+
+ 24
+ 16777215
+
+
+
+ Reload sampling device
+
+
+
+
+
+
+ :/recycle.png:/recycle.png
diff --git a/sdrgui/gui/samplingdevicedialog.cpp b/sdrgui/gui/samplingdevicedialog.cpp
new file mode 100644
index 000000000..752fba4fe
--- /dev/null
+++ b/sdrgui/gui/samplingdevicedialog.cpp
@@ -0,0 +1,63 @@
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2017 F4EXB //
+// written by Edouard Griffiths //
+// //
+// OpenGL interface modernization. //
+// See: http://doc.qt.io/qt-5/qopenglshaderprogram.html //
+// //
+// 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 . //
+///////////////////////////////////////////////////////////////////////////////////
+
+#include "samplingdevicedialog.h"
+#include "ui_samplingdevicedialog.h"
+#include "device/deviceenumerator.h"
+
+
+SamplingDeviceDialog::SamplingDeviceDialog(bool rxElseTx, int deviceTabIndex, QWidget* parent) :
+ QDialog(parent),
+ ui(new Ui::SamplingDeviceDialog),
+ m_rxElseTx(rxElseTx),
+ m_deviceTabIndex(deviceTabIndex),
+ m_selectedDeviceIndex(-1)
+{
+ ui->setupUi(this);
+
+ QList deviceDisplayNames;
+
+ if (m_rxElseTx) {
+ DeviceEnumerator::instance()->listRxDeviceNames(deviceDisplayNames, m_deviceIndexes);
+ } else {
+ DeviceEnumerator::instance()->listTxDeviceNames(deviceDisplayNames, m_deviceIndexes);
+ }
+
+ QStringList devicesNamesList(deviceDisplayNames);
+ ui->deviceSelect->addItems(devicesNamesList);
+}
+
+SamplingDeviceDialog::~SamplingDeviceDialog()
+{
+ delete ui;
+}
+
+void SamplingDeviceDialog::accept()
+{
+ m_selectedDeviceIndex = m_deviceIndexes[ui->deviceSelect->currentIndex()];
+
+ if (m_rxElseTx) {
+ DeviceEnumerator::instance()->changeRxSelection(m_deviceTabIndex, m_selectedDeviceIndex);
+ } else {
+ DeviceEnumerator::instance()->changeTxSelection(m_deviceTabIndex, m_selectedDeviceIndex);
+ }
+
+ QDialog::accept();
+}
diff --git a/sdrgui/gui/samplingdevicedialog.h b/sdrgui/gui/samplingdevicedialog.h
new file mode 100644
index 000000000..6e771fa33
--- /dev/null
+++ b/sdrgui/gui/samplingdevicedialog.h
@@ -0,0 +1,50 @@
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2017 F4EXB //
+// written by Edouard Griffiths //
+// //
+// OpenGL interface modernization. //
+// See: http://doc.qt.io/qt-5/qopenglshaderprogram.html //
+// //
+// 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 SDRGUI_GUI_SAMPLINGDEVICEDIALOG_H_
+#define SDRGUI_GUI_SAMPLINGDEVICEDIALOG_H_
+
+#include
+#include
+
+namespace Ui {
+ class SamplingDeviceDialog;
+}
+
+class SamplingDeviceDialog : public QDialog {
+ Q_OBJECT
+
+public:
+ explicit SamplingDeviceDialog(bool rxElseTx, int deviceTabIndex, QWidget* parent = 0);
+ ~SamplingDeviceDialog();
+ int getSelectedDeviceIndex() const { return m_selectedDeviceIndex; }
+
+private:
+ Ui::SamplingDeviceDialog* ui;
+ bool m_rxElseTx;
+ int m_deviceTabIndex;
+ int m_selectedDeviceIndex;
+ std::vector m_deviceIndexes;
+
+private slots:
+ void accept();
+};
+
+#endif /* SDRGUI_GUI_SAMPLINGDEVICEDIALOG_H_ */
diff --git a/sdrgui/gui/samplingdevicedialog.ui b/sdrgui/gui/samplingdevicedialog.ui
new file mode 100644
index 000000000..7555e1677
--- /dev/null
+++ b/sdrgui/gui/samplingdevicedialog.ui
@@ -0,0 +1,91 @@
+
+
+ SamplingDeviceDialog
+
+
+
+ 0
+ 0
+ 324
+ 139
+
+
+
+
+ Sans Serif
+ 9
+
+
+
+ Select sampling device
+
+
+ -
+
+
+
+ 16777215
+ 70
+
+
+
+ Select from list
+
+
+
-
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
+
+
+ buttonBox
+
+
+
+
+ buttonBox
+ accepted()
+ SamplingDeviceDialog
+ accept()
+
+
+ 257
+ 194
+
+
+ 157
+ 203
+
+
+
+
+ buttonBox
+ rejected()
+ SamplingDeviceDialog
+ reject()
+
+
+ 314
+ 194
+
+
+ 286
+ 203
+
+
+
+
+
diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp
index 57d2d8d08..2c853a0eb 100644
--- a/sdrgui/mainwindow.cpp
+++ b/sdrgui/mainwindow.cpp
@@ -30,6 +30,7 @@
#include "device/devicesourceapi.h"
#include "device/devicesinkapi.h"
#include "device/deviceuiset.h"
+#include "device/deviceenumerator.h"
#include "audio/audiodeviceinfo.h"
#include "gui/indicator.h"
#include "gui/presetitem.h"
@@ -138,37 +139,43 @@ MainWindow::MainWindow(QWidget* parent) :
qDebug() << "MainWindow::MainWindow: select SampleSource from settings...";
- int sampleSourceIndex = m_settings.getSourceIndex();
- sampleSourceIndex = m_pluginManager->selectSampleSourceByIndex(sampleSourceIndex, m_deviceUIs.back()->m_deviceSourceAPI);
+ int deviceIndex = DeviceEnumerator::instance()->getRxSamplingDeviceIndex(m_settings.getSourceDeviceId(), m_settings.getSourceIndex());
- if (sampleSourceIndex < 0)
+ if (deviceIndex >= 0)
{
- qCritical("MainWindow::MainWindow: no sample source. Exit");
- exit(0);
+ // delete previous plugin GUI
+ m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
+ m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourcePluginInstanceGUI());
+ m_deviceUIs.back()->m_deviceSourceAPI->resetSampleSourceId();
+ m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceInput(
+ m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource());
+ m_deviceUIs.back()->m_deviceSourceAPI->clearBuddiesLists(); // clear old API buddies lists
+
+ m_deviceUIs.back()->m_samplingDeviceControl->setSelectedDeviceIndex(deviceIndex);
+
+ PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(deviceIndex);
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceSequence(samplingDevice.sequence);
+ m_deviceUIs.back()->m_deviceSourceAPI->setHardwareId(samplingDevice.hardwareId);
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceId(samplingDevice.id);
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceSerial(samplingDevice.serial);
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceDisplayName(samplingDevice.displayedName);
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(deviceIndex));
+
+ DeviceSampleSource *source = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceInput(
+ m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), m_deviceUIs.back()->m_deviceSourceAPI);
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSource(source);
+ QWidget *gui;
+ PluginInstanceGUI *pluginGUI = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI(
+ m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(),
+ &gui,
+ m_deviceUIs.back());
+ m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue());
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInstanceGUI(pluginGUI);
+ setDeviceGUI(0, gui, m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceDisplayName());
}
- // delete previous plugin GUI
- m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
- m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourcePluginInstanceGUI());
-
- DeviceSampleSource *source = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceInput(
- m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), m_deviceUIs.back()->m_deviceSourceAPI);
- m_deviceUIs.back()->m_deviceSourceAPI->setSampleSource(source);
- QWidget *gui;
- PluginInstanceGUI *pluginGUI = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI(
- m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(),
- &gui,
- m_deviceUIs.back());
- m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue());
- m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInstanceGUI(pluginGUI);
- setDeviceGUI(0, gui, m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceDisplayName());
-
m_deviceUIs.back()->m_deviceSourceAPI->setBuddyLeader(true); // the first device is always the leader
- bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(true);
- m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->setCurrentIndex(sampleSourceIndex);
- m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(sampleSourceSignalsBlocked);
-
qDebug() << "MainWindow::MainWindow: load current preset settings...";
loadPresetSettings(m_settings.getWorkingPreset(), 0);
@@ -205,7 +212,7 @@ void MainWindow::addSourceDevice()
sprintf(uidCStr, "UID:%d", dspDeviceSourceEngineUID);
int deviceTabIndex = m_deviceUIs.size();
- m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, m_masterTimer));
+ m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, true, m_masterTimer));
m_deviceUIs.back()->m_deviceSourceEngine = dspDeviceSourceEngine;
char tabNameCStr[16];
@@ -227,24 +234,28 @@ void MainWindow::addSourceDevice()
ui->tabSpectraGUI->addTab(m_deviceUIs.back()->m_spectrumGUI, tabNameCStr);
ui->tabChannels->addTab(m_deviceUIs.back()->m_channelWindow, tabNameCStr);
- bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(true);
- m_pluginManager->duplicateLocalSampleSourceDevices(dspDeviceSourceEngineUID);
- // FIXME: replace with the device selection dialog based on static enumeration
- m_pluginManager->fillSampleSourceSelector(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector(), dspDeviceSourceEngineUID);
+ connect(m_deviceUIs.back()->m_samplingDeviceControl, SIGNAL(changed()), this, SLOT(on_sampleSource_changed()));
- connect(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelectionConfirm(), SIGNAL(clicked(bool)), this, SLOT(on_sampleSource_confirmClicked(bool)));
-
- m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(sampleSourceSignalsBlocked);
ui->tabInputsSelect->addTab(m_deviceUIs.back()->m_samplingDeviceControl, tabNameCStr);
ui->tabInputsSelect->setTabToolTip(deviceTabIndex, QString(uidCStr));
// Create a file source instance by default
- m_pluginManager->selectSampleSourceBySerialOrSequence("sdrangel.samplesource.filesource", "0", 0, m_deviceUIs.back()->m_deviceSourceAPI);
+ int fileSourceDeviceIndex = DeviceEnumerator::instance()->getFileSourceDeviceIndex();
+ PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(fileSourceDeviceIndex);
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceSequence(samplingDevice.sequence);
+ m_deviceUIs.back()->m_deviceSourceAPI->setHardwareId(samplingDevice.hardwareId);
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceId(samplingDevice.id);
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceSerial(samplingDevice.serial);
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceDisplayName(samplingDevice.displayedName);
+ m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(fileSourceDeviceIndex));
+
+ m_deviceUIs.back()->m_samplingDeviceControl->setSelectedDeviceIndex(fileSourceDeviceIndex);
// delete previous plugin GUI
m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourcePluginInstanceGUI());
+
DeviceSampleSource *source = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceInput(
m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), m_deviceUIs.back()->m_deviceSourceAPI);
m_deviceUIs.back()->m_deviceSourceAPI->setSampleSource(source);
@@ -256,7 +267,6 @@ void MainWindow::addSourceDevice()
m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue());
m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInstanceGUI(pluginGUI);
setDeviceGUI(deviceTabIndex, gui, m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceDisplayName());
-
}
void MainWindow::addSinkDevice()
@@ -269,7 +279,7 @@ void MainWindow::addSinkDevice()
sprintf(uidCStr, "UID:%d", dspDeviceSinkEngineUID);
int deviceTabIndex = m_deviceUIs.size();
- m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, m_masterTimer));
+ m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, false, m_masterTimer));
m_deviceUIs.back()->m_deviceSourceEngine = 0;
m_deviceUIs.back()->m_deviceSinkEngine = dspDeviceSinkEngine;
@@ -293,19 +303,22 @@ void MainWindow::addSinkDevice()
ui->tabSpectraGUI->addTab(m_deviceUIs.back()->m_spectrumGUI, tabNameCStr);
ui->tabChannels->addTab(m_deviceUIs.back()->m_channelWindow, tabNameCStr);
- bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(true);
- m_pluginManager->duplicateLocalSampleSinkDevices(dspDeviceSinkEngineUID);
- // FIXME: replace with the device selection dialog based on static enumeration
- m_pluginManager->fillSampleSinkSelector(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector(), dspDeviceSinkEngineUID);
+ connect(m_deviceUIs.back()->m_samplingDeviceControl, SIGNAL(changed()), this, SLOT(on_sampleSink_changed()));
- connect(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelectionConfirm(), SIGNAL(clicked(bool)), this, SLOT(on_sampleSink_confirmClicked(bool)));
-
- m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(sampleSourceSignalsBlocked);
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);
+ int fileSinkDeviceIndex = DeviceEnumerator::instance()->getFileSinkDeviceIndex();
+ PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(fileSinkDeviceIndex);
+ m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkSequence(samplingDevice.sequence);
+ m_deviceUIs.back()->m_deviceSinkAPI->setHardwareId(samplingDevice.hardwareId);
+ m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkId(samplingDevice.id);
+ m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkSerial(samplingDevice.serial);
+ m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkDisplayName(samplingDevice.displayedName);
+ m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkPluginInterface(DeviceEnumerator::instance()->getTxPluginInterface(fileSinkDeviceIndex));
+
+ m_deviceUIs.back()->m_samplingDeviceControl->setSelectedDeviceIndex(fileSinkDeviceIndex);
// delete previous plugin GUI if it exists
m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
@@ -862,7 +875,7 @@ void MainWindow::on_action_DV_Serial_triggered(bool checked)
}
}
-void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unused)))
+void MainWindow::on_sampleSource_changed()
{
// Do it in the currently selected source tab
int currentSourceTabIndex = ui->tabInputsSelect->currentIndex();
@@ -872,8 +885,6 @@ void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unus
qDebug("MainWindow::on_sampleSource_confirmClicked: tab at %d", currentSourceTabIndex);
DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex];
deviceUI->m_deviceSourceAPI->saveSourceSettings(m_settings.getWorkingPreset()); // save old API settings
- int selectedComboIndex = deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex();
- void *devicePtr = deviceUI->m_samplingDeviceControl->getDeviceSelector()->itemData(selectedComboIndex).value();
deviceUI->m_deviceSourceAPI->stopAcquisition();
// deletes old UI and input object
@@ -885,7 +896,13 @@ void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unus
deviceUI->m_deviceSourceAPI->getSampleSource());
deviceUI->m_deviceSourceAPI->clearBuddiesLists(); // clear old API buddies lists
- m_pluginManager->selectSampleSourceByDevice(devicePtr, deviceUI->m_deviceSourceAPI); // sets the new API
+ PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(deviceUI->m_samplingDeviceControl->getSelectedDeviceIndex());
+ deviceUI->m_deviceSourceAPI->setSampleSourceSequence(samplingDevice.sequence);
+ deviceUI->m_deviceSourceAPI->setHardwareId(samplingDevice.hardwareId);
+ deviceUI->m_deviceSourceAPI->setSampleSourceId(samplingDevice.id);
+ deviceUI->m_deviceSourceAPI->setSampleSourceSerial(samplingDevice.serial);
+ deviceUI->m_deviceSourceAPI->setSampleSourceDisplayName(samplingDevice.displayedName);
+ deviceUI->m_deviceSourceAPI->setSampleSourcePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(deviceUI->m_samplingDeviceControl->getSelectedDeviceIndex()));
// add to buddies list
std::vector::iterator it = m_deviceUIs.begin();
@@ -936,14 +953,15 @@ void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unus
deviceUI->m_deviceSourceAPI->loadSourceSettings(m_settings.getWorkingPreset()); // load new API settings
- if (currentSourceTabIndex == 0)
+ if (currentSourceTabIndex == 0) // save as default starting device
{
- m_settings.setSourceIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex());
+ m_settings.setSourceIndex(samplingDevice.sequence);
+ m_settings.setSourceDeviceId(samplingDevice.id);
}
}
}
-void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused)))
+void MainWindow::on_sampleSink_changed()
{
// Do it in the currently selected source tab
int currentSinkTabIndex = ui->tabInputsSelect->currentIndex();
@@ -953,8 +971,6 @@ void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused
qDebug("MainWindow::on_sampleSink_confirmClicked: tab at %d", currentSinkTabIndex);
DeviceUISet *deviceUI = m_deviceUIs[currentSinkTabIndex];
deviceUI->m_deviceSinkAPI->saveSinkSettings(m_settings.getWorkingPreset()); // save old API settings
- int selectedComboIndex = deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex();
- void *devicePtr = deviceUI->m_samplingDeviceControl->getDeviceSelector()->itemData(selectedComboIndex).value();
deviceUI->m_deviceSinkAPI->stopGeneration();
// deletes old UI and output object
@@ -966,7 +982,13 @@ void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused
deviceUI->m_deviceSinkAPI->getSampleSink());
deviceUI->m_deviceSinkAPI->clearBuddiesLists(); // clear old API buddies lists
- m_pluginManager->selectSampleSinkByDevice(devicePtr, deviceUI->m_deviceSinkAPI); // sets the new API
+ PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(deviceUI->m_samplingDeviceControl->getSelectedDeviceIndex());
+ deviceUI->m_deviceSinkAPI->setSampleSinkSequence(samplingDevice.sequence);
+ deviceUI->m_deviceSinkAPI->setHardwareId(samplingDevice.hardwareId);
+ deviceUI->m_deviceSinkAPI->setSampleSinkId(samplingDevice.id);
+ deviceUI->m_deviceSinkAPI->setSampleSinkSerial(samplingDevice.serial);
+ deviceUI->m_deviceSinkAPI->setSampleSinkDisplayName(samplingDevice.displayedName);
+ deviceUI->m_deviceSinkAPI->setSampleSinkPluginInterface(DeviceEnumerator::instance()->getTxPluginInterface(deviceUI->m_samplingDeviceControl->getSelectedDeviceIndex()));
// add to buddies list
std::vector::iterator it = m_deviceUIs.begin();
@@ -1043,7 +1065,6 @@ void MainWindow::on_channel_addClicked(bool checked __attribute__((unused)))
m_pluginManager->createTxChannelInstance(deviceUI->m_samplingDeviceControl->getChannelSelector()->currentIndex(), deviceUI);
}
}
-
}
void MainWindow::on_action_About_triggered()
@@ -1074,62 +1095,6 @@ void MainWindow::on_action_reloadDevices_triggered()
{
QMessageBox::information(this, tr("Message"), tr("Not implemented"));
return;
-
-// // all devices must be stopped
-// std::vector::iterator it = m_deviceUIs.begin();
-// for (; it != m_deviceUIs.end(); ++it)
-// {
-// if ((*it)->m_deviceSourceEngine) // it is a source device
-// {
-// if ((*it)->m_deviceSourceEngine->state() == DSPDeviceSourceEngine::StRunning)
-// {
-// QMessageBox::information(this, tr("Message"), tr("Stop all devices for reload to take effect"));
-// return;
-// }
-// }
-//
-// if ((*it)->m_deviceSinkEngine) // it is a sink device
-// {
-// if ((*it)->m_deviceSinkEngine->state() == DSPDeviceSinkEngine::StRunning)
-// {
-// QMessageBox::information(this, tr("Message"), tr("Stop all devices for reload to take effect"));
-// return;
-// }
-// }
-// }
-//
-// // re-scan devices
-// m_pluginManager->updateSampleSourceDevices();
-// m_pluginManager->updateSampleSinkDevices();
-//
-// // re-populate device selectors keeping the same selection
-// it = m_deviceUIs.begin();
-// for (; it != m_deviceUIs.end(); ++it)
-// {
-// if ((*it)->m_deviceSourceEngine) // it is a source device
-// {
-// QComboBox *deviceSelectorComboBox = (*it)->m_samplingDeviceControl->getDeviceSelector();
-// bool sampleSourceSignalsBlocked = deviceSelectorComboBox->blockSignals(true);
-// uint dspDeviceSourceEngineUID = (*it)->m_deviceSourceEngine->getUID();
-// m_pluginManager->duplicateLocalSampleSourceDevices(dspDeviceSourceEngineUID);
-// m_pluginManager->fillSampleSourceSelector(deviceSelectorComboBox, dspDeviceSourceEngineUID);
-// int newIndex = m_pluginManager->getSampleSourceSelectorIndex(deviceSelectorComboBox, (*it)->m_deviceSourceAPI);
-// deviceSelectorComboBox->setCurrentIndex(newIndex);
-// deviceSelectorComboBox->blockSignals(sampleSourceSignalsBlocked);
-// }
-//
-// if ((*it)->m_deviceSinkEngine) // it is a sink device
-// {
-// QComboBox *deviceSelectorComboBox = (*it)->m_samplingDeviceControl->getDeviceSelector();
-// bool sampleSinkSignalsBlocked = deviceSelectorComboBox->blockSignals(true);
-// uint dspDeviceSinkEngineUID = (*it)->m_deviceSinkEngine->getUID();
-// m_pluginManager->duplicateLocalSampleSinkDevices(dspDeviceSinkEngineUID);
-// m_pluginManager->fillSampleSinkSelector(deviceSelectorComboBox, dspDeviceSinkEngineUID);
-// int newIndex = m_pluginManager->getSampleSinkSelectorIndex(deviceSelectorComboBox, (*it)->m_deviceSinkAPI);
-// deviceSelectorComboBox->setCurrentIndex(newIndex);
-// deviceSelectorComboBox->blockSignals(sampleSinkSignalsBlocked);
-// }
-// }
}
void MainWindow::on_action_Exit_triggered()
diff --git a/sdrgui/mainwindow.h b/sdrgui/mainwindow.h
index b626a6812..e5b37b832 100644
--- a/sdrgui/mainwindow.h
+++ b/sdrgui/mainwindow.h
@@ -140,8 +140,8 @@ private slots:
void on_action_Audio_triggered();
void on_action_DV_Serial_triggered(bool checked);
void on_action_My_Position_triggered();
- void on_sampleSource_confirmClicked(bool checked);
- void on_sampleSink_confirmClicked(bool checked);
+ void on_sampleSource_changed();
+ void on_sampleSink_changed();
void on_channel_addClicked(bool checked);
void on_action_Loaded_Plugins_triggered();
void on_action_About_triggered();
diff --git a/sdrgui/resources/choose.png b/sdrgui/resources/choose.png
new file mode 100644
index 000000000..25193d6e7
Binary files /dev/null and b/sdrgui/resources/choose.png differ
diff --git a/sdrgui/resources/res.qrc b/sdrgui/resources/res.qrc
index 816192ae1..ce9b3853b 100644
--- a/sdrgui/resources/res.qrc
+++ b/sdrgui/resources/res.qrc
@@ -79,5 +79,6 @@
stream.png
antenna.png
link.png
+ choose.png