From 3e1236f89826f3738bb4663d90ddd4ac996e3b4c Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 23 May 2016 00:21:13 +0200 Subject: [PATCH] Multi device support: SDRdaemon and FileSource plugins: allow one instance per device set with only the one coresponding to the device set accessible for selection --- sdrbase/mainwindow.cpp | 36 +++++++------ sdrbase/mainwindow.h | 2 +- sdrbase/plugin/pluginmanager.cpp | 89 ++++++++++++++++++++++++++++++-- sdrbase/plugin/pluginmanager.h | 13 +++-- 4 files changed, 115 insertions(+), 25 deletions(-) diff --git a/sdrbase/mainwindow.cpp b/sdrbase/mainwindow.cpp index d1460d8e7..1d6986c2d 100644 --- a/sdrbase/mainwindow.cpp +++ b/sdrbase/mainwindow.cpp @@ -194,6 +194,7 @@ void MainWindow::addDevice() ui->tabChannels->addTab(m_deviceUIs.back()->m_channelWindow, tabNameCStr); bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(true); + m_pluginManager->duplicateLocalSampleSourceDevices(dspDeviceEngineUID); m_pluginManager->fillSampleSourceSelector(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector(), dspDeviceEngineUID); connect(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelectionConfirm(), SIGNAL(clicked(bool)), this, SLOT(on_sampleSource_confirmClicked(bool))); @@ -658,21 +659,21 @@ void MainWindow::on_action_DV_Serial_triggered(bool checked) } } -void MainWindow::on_sampleSource_currentIndexChanged(int index) -{ - // Do it in the currently selected source tab - int currentSourceTabIndex = ui->tabInputsSelect->currentIndex(); - - if (currentSourceTabIndex >= 0) - { - qDebug("MainWindow::on_sampleSource_currentIndexChanged: tab at %d", currentSourceTabIndex); - DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex]; - deviceUI->m_deviceAPI->saveSourceSettings(m_settings.getWorkingPreset()); - m_pluginManager->selectSampleSourceByIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(), deviceUI->m_deviceAPI); - m_settings.setSourceIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex()); - deviceUI->m_deviceAPI->loadSourceSettings(m_settings.getWorkingPreset()); - } -} +//void MainWindow::on_sampleSource_currentIndexChanged(int index) +//{ +// // Do it in the currently selected source tab +// int currentSourceTabIndex = ui->tabInputsSelect->currentIndex(); +// +// if (currentSourceTabIndex >= 0) +// { +// qDebug("MainWindow::on_sampleSource_currentIndexChanged: tab at %d", currentSourceTabIndex); +// DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex]; +// deviceUI->m_deviceAPI->saveSourceSettings(m_settings.getWorkingPreset()); +// m_pluginManager->selectSampleSourceByIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(), deviceUI->m_deviceAPI); +// m_settings.setSourceIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex()); +// deviceUI->m_deviceAPI->loadSourceSettings(m_settings.getWorkingPreset()); +// } +//} void MainWindow::on_sampleSource_confirmClicked(bool checked) { @@ -684,7 +685,10 @@ void MainWindow::on_sampleSource_confirmClicked(bool checked) qDebug("MainWindow::on_sampleSource_currentIndexChanged: tab at %d", currentSourceTabIndex); DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex]; deviceUI->m_deviceAPI->saveSourceSettings(m_settings.getWorkingPreset()); - m_pluginManager->selectSampleSourceByIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(), deviceUI->m_deviceAPI); + int selectedComboIndex = deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(); + void *devicePtr = deviceUI->m_samplingDeviceControl->getDeviceSelector()->itemData(selectedComboIndex).value(); + m_pluginManager->selectSampleSourceByDevice(devicePtr, deviceUI->m_deviceAPI); +// m_pluginManager->selectSampleSourceByIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(), deviceUI->m_deviceAPI); m_settings.setSourceIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex()); deviceUI->m_deviceAPI->loadSourceSettings(m_settings.getWorkingPreset()); } diff --git a/sdrbase/mainwindow.h b/sdrbase/mainwindow.h index 5af1f7515..c0835a1ba 100644 --- a/sdrbase/mainwindow.h +++ b/sdrbase/mainwindow.h @@ -149,7 +149,7 @@ private slots: void on_presetTree_itemActivated(QTreeWidgetItem *item, int column); void on_action_Audio_triggered(); void on_action_DV_Serial_triggered(bool checked); - void on_sampleSource_currentIndexChanged(int index); +// void on_sampleSource_currentIndexChanged(int index); void on_sampleSource_confirmClicked(bool checked); void on_action_Loaded_Plugins_triggered(); void on_action_About_triggered(); diff --git a/sdrbase/plugin/pluginmanager.cpp b/sdrbase/plugin/pluginmanager.cpp index 9c42a12aa..4a58ddb2a 100644 --- a/sdrbase/plugin/pluginmanager.cpp +++ b/sdrbase/plugin/pluginmanager.cpp @@ -84,21 +84,81 @@ void PluginManager::updateSampleSourceDevices() } } +void PluginManager::duplicateLocalSampleSourceDevices(uint deviceUID) +{ + if (deviceUID == 0) { + return; + } + + SampleSourceDevice *sdrDaemonSSD0 = 0; + SampleSourceDevice *fileSourceSSD0 = 0; + bool duplicateSDRDaemon = true; + bool duplicateFileSource = true; + + for(int i = 0; i < m_sampleSourceDevices.count(); ++i) + { + if (m_sampleSourceDevices[i].m_sourceId == m_sdrDaemonDeviceTypeID) // SDRdaemon + { + if (m_sampleSourceDevices[i].m_sourceSequence == 0) { // reference to device 0 + sdrDaemonSSD0 = &m_sampleSourceDevices[i]; + } + else if (m_sampleSourceDevices[i].m_sourceSequence == deviceUID) { // already there + duplicateSDRDaemon = false; + } + } + else if (m_sampleSourceDevices[i].m_sourceId == m_fileSourceDeviceTypeID) // File Source + { + if (m_sampleSourceDevices[i].m_sourceSequence == 0) { // reference to device 0 + fileSourceSSD0 = &m_sampleSourceDevices[i]; + } + else if (m_sampleSourceDevices[i].m_sourceSequence == deviceUID) { // already there + duplicateFileSource = false; + } + } + } + + if (sdrDaemonSSD0 && duplicateSDRDaemon) // append item for a new instance + { + m_sampleSourceDevices.append( + SampleSourceDevice( + sdrDaemonSSD0->m_plugin, + QString("SDRdaemon[%1]").arg(deviceUID), + sdrDaemonSSD0->m_sourceId, + sdrDaemonSSD0->m_sourceSerial, + deviceUID + ) + ); + } + + if (fileSourceSSD0 && duplicateFileSource) // append item for a new instance + { + m_sampleSourceDevices.append( + SampleSourceDevice( + fileSourceSSD0->m_plugin, + QString("FileSource[%1]").arg(deviceUID), + fileSourceSSD0->m_sourceId, + fileSourceSSD0->m_sourceSerial, + deviceUID + ) + ); + } +} + void PluginManager::fillSampleSourceSelector(QComboBox* comboBox, uint deviceUID) { comboBox->clear(); for(int i = 0; i < m_sampleSourceDevices.count(); i++) { - // There can be only one instance of file source and SDRdaemon plugins + // For "local" devices show only ones that concern this device set if ((m_sampleSourceDevices[i].m_sourceId == m_sdrDaemonDeviceTypeID) || (m_sampleSourceDevices[i].m_sourceId == m_fileSourceDeviceTypeID)) { - if (deviceUID != 0) { + if (deviceUID != m_sampleSourceDevices[i].m_sourceSequence) { continue; } } - comboBox->addItem(m_sampleSourceDevices[i].m_displayName, i); + comboBox->addItem(m_sampleSourceDevices[i].m_displayName, qVariantFromValue((void *) &m_sampleSourceDevices[i])); } } @@ -266,6 +326,29 @@ int PluginManager::selectSampleSourceBySerialOrSequence(const QString& sourceId, return index; } +void PluginManager::selectSampleSourceByDevice(void *devicePtr, DeviceAPI *deviceAPI) +{ + SampleSourceDevice *sampleSourceDevice = (SampleSourceDevice *) devicePtr; + + qDebug() << "PluginManager::selectSampleSourceByDevice: " + << " id: " << sampleSourceDevice->m_sourceId.toStdString().c_str() + << " ser: " << sampleSourceDevice->m_sourceSerial.toStdString().c_str() + << " seq: " << sampleSourceDevice->m_sourceSequence; + + deviceAPI->stopAcquisition(); + deviceAPI->setSampleSourcePluginGUI(0); // this effectively destroys the previous GUI if it exists + + QWidget *gui; + PluginGUI *pluginGUI = sampleSourceDevice->m_plugin->createSampleSourcePluginGUI(sampleSourceDevice->m_sourceId, &gui, deviceAPI); + + // m_sampleSourcePluginGUI = pluginGUI; + deviceAPI->setSampleSourceSequence(sampleSourceDevice->m_sourceSequence); + deviceAPI->setSampleSourceId(sampleSourceDevice->m_sourceId); + deviceAPI->setSampleSourceSerial(sampleSourceDevice->m_sourceSerial); + deviceAPI->setSampleSourcePluginGUI(pluginGUI); + deviceAPI->setInputGUI(gui, sampleSourceDevice->m_displayName); +} + void PluginManager::loadPlugins(const QDir& dir) { QDir pluginsDir(dir); diff --git a/sdrbase/plugin/pluginmanager.h b/sdrbase/plugin/pluginmanager.h index daaeae768..aa77f491f 100644 --- a/sdrbase/plugin/pluginmanager.h +++ b/sdrbase/plugin/pluginmanager.h @@ -48,11 +48,13 @@ public: PluginAPI::ChannelRegistrations *getChannelRegistrations() { return &m_channelRegistrations; } void updateSampleSourceDevices(); + void duplicateLocalSampleSourceDevices(uint deviceUID); void fillSampleSourceSelector(QComboBox* comboBox, uint deviceUID); int selectSampleSourceByIndex(int index, DeviceAPI *deviceAPI); int selectFirstSampleSource(const QString& sourceId, DeviceAPI *deviceAPI); int selectSampleSourceBySerialOrSequence(const QString& sourceId, const QString& sourceSerial, int sourceSequence, DeviceAPI *deviceAPI); + void selectSampleSourceByDevice(void *devicePtr, DeviceAPI *deviceAPI); void populateChannelComboBox(QComboBox *channels); void createChannelInstance(int channelPluginIndex, DeviceAPI *deviceAPI); @@ -95,12 +97,13 @@ private: MainWindow* m_mainWindow; Plugins m_plugins; - PluginAPI::ChannelRegistrations m_channelRegistrations; //!< Channel plugins register here - SampleSourceRegistrations m_sampleSourceRegistrations; //!< Input source plugins (one per device kind) register here - SampleSourceDevices m_sampleSourceDevices; //!< Instances of input sources present in the system + PluginAPI::ChannelRegistrations m_channelRegistrations; //!< Channel plugins register here + SampleSourceRegistrations m_sampleSourceRegistrations; //!< Input source plugins (one per device kind) register here + SampleSourceDevices m_sampleSourceDevices; //!< Instances of input sources present in the system - static const QString m_sdrDaemonDeviceTypeID; - static const QString m_fileSourceDeviceTypeID; + // "Local" sample source device IDs + static const QString m_sdrDaemonDeviceTypeID; //!< SDRdaemon source plugin ID + static const QString m_fileSourceDeviceTypeID; //!< FileSource source plugin ID // QString m_sampleSourceId; // QString m_sampleSourceSerial;