Multi device support: code cleanup and fixed lock on exit

This commit is contained in:
f4exb 2016-05-17 00:04:27 +02:00
parent 3f2b3cdea3
commit 86b04a4d62
8 changed files with 46 additions and 302 deletions

View File

@ -196,18 +196,19 @@ void DeviceAPI::freeAll()
for(int i = 0; i < m_channelInstanceRegistrations.count(); i++)
{
qDebug("PluginManager::loadSettings: destroying channel [%s]", qPrintable(m_channelInstanceRegistrations[i].m_channelName));
qDebug("DeviceAPI::freeAll: destroying channel [%s]", qPrintable(m_channelInstanceRegistrations[i].m_channelName));
m_channelInstanceRegistrations[i].m_gui->destroy();
}
// if(m_sampleSourcePluginGUI != 0)
// {
// m_deviceEngine->setSource(0);
// m_sampleSourcePluginGUI->destroy();
// m_sampleSourcePluginGUI = 0;
// m_sampleSourceId.clear();
// }
if(m_sampleSourcePluginGUI != 0)
{
qDebug("DeviceAPI::freeAll: destroying m_sampleSourcePluginGUI");
m_deviceEngine->setSource(0);
m_sampleSourcePluginGUI->destroy();
m_sampleSourcePluginGUI = 0;
m_sampleSourceId.clear();
}
}
void DeviceAPI::loadSourceSettings(const Preset* preset)

View File

@ -23,7 +23,8 @@
SamplingDeviceControl::SamplingDeviceControl(QWidget* parent) :
QWidget(parent),
ui(new Ui::SamplingDeviceControl),
m_pluginManager(0)
m_pluginManager(0),
m_deviceAPI(0)
{
ui->setupUi(this);
}

View File

@ -109,6 +109,9 @@ MainWindow::MainWindow(QWidget* parent) :
"QTabWidget::pane { border: 1px solid #C06900; } "
"QTabBar::tab:selected { background: rgb(128,70,0); }");
m_pluginManager = new PluginManager(this);
m_pluginManager->loadPlugins();
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleMessages()), Qt::QueuedConnection);
connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
@ -116,44 +119,29 @@ MainWindow::MainWindow(QWidget* parent) :
m_masterTimer.start(50);
qDebug() << "MainWindow::MainWindow: m_pluginManager->loadPlugins ...";
qDebug() << "MainWindow::MainWindow: add the first device...";
addDevice(); // add the first device
// DSPDeviceEngine *dspDeviceEngine = m_dspEngine->addDeviceEngine();
// dspDeviceEngine->start();
//
// m_deviceUIs.push_back(new DeviceUISet(m_masterTimer));
//
// m_pluginManager = new PluginManager(this, dspDeviceEngine, m_deviceUIs.back()->m_spectrum);
// m_pluginManager->loadPlugins();
//
// ui->tabSpectra->addTab(m_deviceUIs.back()->m_spectrum, "X0");
// ui->tabSpectraGUI->addTab(m_deviceUIs.back()->m_spectrumGUI, "X0");
// dspDeviceEngine->addSink(m_deviceUIs.back()->m_spectrumVis);
// ui->tabChannels->addTab(m_deviceUIs.back()->m_channelWindow, "X0");
// bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_sampleSource->blockSignals(true);
// m_pluginManager->fillSampleSourceSelector(m_deviceUIs.back()->m_sampleSource);
// connect(m_deviceUIs.back()->m_sampleSource, SIGNAL(currentIndexChanged(int)), this, SLOT(on_sampleSource_currentIndexChanged(int)));
// m_deviceUIs.back()->m_sampleSource->blockSignals(sampleSourceSignalsBlocked);
// ui->tabInputsSelect->addTab(m_deviceUIs.back()->m_sampleSource, "X0");
qDebug() << "MainWindow::MainWindow: loadSettings...";
qDebug() << "MainWindow::MainWindow: load settings...";
loadSettings();
qDebug() << "MainWindow::MainWindow: select SampleSource from settings...";
int sampleSourceIndex = m_settings.getSourceIndex();
sampleSourceIndex = m_deviceUIs.back()->m_pluginManager->selectSampleSourceByIndex(sampleSourceIndex, m_deviceUIs.back()->m_deviceAPI);
sampleSourceIndex = m_pluginManager->selectSampleSourceByIndex(sampleSourceIndex, m_deviceUIs.back()->m_deviceAPI);
if (sampleSourceIndex >= 0)
if (sampleSourceIndex < 0)
{
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);
qCritical("MainWindow::MainWindow: no sample source. Exit");
exit(0);
}
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());
@ -166,9 +154,9 @@ MainWindow::MainWindow(QWidget* parent) :
updatePresetControls();
qDebug() << "MainWindow::MainWindow: end";
connect(ui->tabInputsView, SIGNAL(currentChanged(int)), this, SLOT(tabInputViewIndexChanged()));
qDebug() << "MainWindow::MainWindow: end";
}
MainWindow::~MainWindow()
@ -180,6 +168,7 @@ MainWindow::~MainWindow()
removeLastDevice();
}
delete m_pluginManager;
delete m_dateTimeWidget;
delete m_showSystemWidget;
@ -199,16 +188,10 @@ void MainWindow::addDevice()
m_deviceUIs.back()->m_deviceEngine = dspDeviceEngine;
DeviceAPI *deviceAPI = new DeviceAPI(this, m_deviceUIs.size()-1, dspDeviceEngine, m_deviceUIs.back()->m_spectrum, m_deviceUIs.back()->m_channelWindow);
m_deviceUIs.back()->m_deviceAPI = deviceAPI;
// TODO: do not create one plugin manager per device. Use device API instead
PluginManager *pluginManager = new PluginManager(this, m_deviceUIs.size()-1, dspDeviceEngine);
m_deviceUIs.back()->m_pluginManager = pluginManager;
pluginManager->loadPlugins();
m_deviceUIs.back()->m_samplingDeviceControl->setDeviceAPI(deviceAPI);
m_deviceUIs.back()->m_samplingDeviceControl->setPluginManager(pluginManager);
m_deviceUIs.back()->m_samplingDeviceControl->setPluginManager(m_pluginManager);
m_deviceUIs.back()->m_samplingDeviceControl->populateChannelSelector();
dspDeviceEngine->addSink(m_deviceUIs.back()->m_spectrumVis);
@ -217,7 +200,7 @@ void MainWindow::addDevice()
ui->tabChannels->addTab(m_deviceUIs.back()->m_channelWindow, tabNameCStr);
bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(true);
pluginManager->fillSampleSourceSelector(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector());
m_pluginManager->fillSampleSourceSelector(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector());
connect(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector(), SIGNAL(currentIndexChanged(int)), this, SLOT(on_sampleSource_currentIndexChanged(int)));
m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(sampleSourceSignalsBlocked);
ui->tabInputsSelect->addTab(m_deviceUIs.back()->m_samplingDeviceControl, tabNameCStr);
@ -235,21 +218,19 @@ void MainWindow::removeLastDevice()
// PluginManager destructor does freeAll() which does stopAcquistion() but stopAcquistion()
// can be done several times only the first is active so it is fine to do it here
// On the other hand freeAll() must be executed only once
//delete m_deviceUIs.back()->m_pluginManager;
//m_deviceUIs.back()->m_pluginManager->freeAll();
//delete m_deviceUIs.back()->m_deviceAPI; // TODO: reinstate when plugin manager is not created for each device
m_deviceUIs.back()->m_deviceAPI->freeAll();
ui->tabChannels->removeTab(ui->tabChannels->count() - 1);
lastDeviceEngine->stop();
m_dspEngine->removeLastDeviceEngine();
ui->tabInputsView->removeTab(ui->tabInputsView->count() - 1);
ui->tabInputsSelect->removeTab(ui->tabInputsSelect->count() - 1);
delete m_deviceUIs.back();
lastDeviceEngine->stop();
m_dspEngine->removeLastDeviceEngine();
m_deviceUIs.pop_back();
}
@ -314,9 +295,8 @@ void MainWindow::loadPresetSettings(const Preset* preset)
if (currentSourceTabIndex >= 0)
{
DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex];
PluginAPI pluginAPI(deviceUI->m_pluginManager, this);
deviceUI->m_spectrumGUI->deserialize(preset->getSpectrumConfig());
deviceUI->m_deviceAPI->loadChannelSettings(preset, &pluginAPI);
deviceUI->m_deviceAPI->loadChannelSettings(preset, &(m_pluginManager->m_pluginAPI));
deviceUI->m_deviceAPI->loadSourceSettings(preset);
}
@ -428,11 +408,6 @@ void MainWindow::handleMessages()
{
qDebug("MainWindow::handleMessages: message: %s", message->getIdentifier());
delete message;
//
// if (!m_pluginManager->handleMessage(*message))
// {
// delete message;
// }
}
}
@ -677,7 +652,7 @@ void MainWindow::on_sampleSource_currentIndexChanged(int index)
DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex];
deviceUI->m_deviceAPI->saveSourceSettings(m_settings.getWorkingPreset());
//deviceUI->m_pluginManager->saveSourceSettings(m_settings.getWorkingPreset());
deviceUI->m_pluginManager->selectSampleSourceByIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(), deviceUI->m_deviceAPI);
m_pluginManager->selectSampleSourceByIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(), deviceUI->m_deviceAPI);
m_settings.setSourceIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex());
//deviceUI->m_pluginManager->loadSourceSettings(m_settings.getWorkingPreset());
@ -729,7 +704,8 @@ MainWindow::DeviceUISet::DeviceUISet(QTimer& timer)
m_channelWindow = new ChannelWindow;
m_samplingDeviceControl = new SamplingDeviceControl;
m_deviceEngine = 0;
m_pluginManager = 0;
m_deviceAPI = 0;
// m_pluginManager = 0;
// m_spectrum needs to have its font to be set since it cannot be inherited from the main window
QFont font;

View File

@ -61,7 +61,6 @@ public:
ChannelWindow *m_channelWindow;
SamplingDeviceControl *m_samplingDeviceControl;
DSPDeviceEngine *m_deviceEngine;
PluginManager *m_pluginManager;
DeviceAPI *m_deviceAPI;
DeviceUISet(QTimer& timer);
@ -87,16 +86,13 @@ private:
};
Ui::MainWindow* ui;
AudioDeviceInfo* m_audioDeviceInfo;
MessageQueue m_inputMessageQueue;
MainSettings m_settings;
std::vector<DeviceUISet*> m_deviceUIs;
DSPEngine* m_dspEngine;
PluginManager* m_pluginManager;
QTimer m_masterTimer;
QTimer m_statusTimer;

View File

@ -13,16 +13,6 @@ void PluginAPI::registerChannel(const QString& channelName, PluginInterface* plu
m_pluginManager->registerChannel(channelName, plugin);
}
//void PluginAPI::registerChannelInstance(const QString& channelName, PluginGUI* pluginGUI)
//{
// m_pluginManager->registerChannelInstance(channelName, pluginGUI);
//}
//
//void PluginAPI::removeChannelInstance(PluginGUI* pluginGUI)
//{
// m_pluginManager->removeChannelInstance(pluginGUI);
//}
void PluginAPI::registerSampleSource(const QString& sourceName, PluginInterface* plugin)
{
m_pluginManager->registerSampleSource(sourceName, plugin);

View File

@ -35,8 +35,6 @@ public:
// Channel stuff
void registerChannel(const QString& channelName, PluginInterface* plugin);
// void registerChannelInstance(const QString& channelName, PluginGUI* pluginGUI);
// void removeChannelInstance(PluginGUI* pluginGUI);
ChannelRegistrations *getChannelRegistrations();
// Sample Source stuff
@ -53,7 +51,6 @@ protected:
~PluginAPI();
friend class PluginManager;
friend class MainWindow;
};
#endif // INCLUDE_PLUGINAPI_H

View File

@ -14,12 +14,10 @@
#include <QDebug>
PluginManager::PluginManager(MainWindow* mainWindow, uint deviceTabIndex, DSPDeviceEngine* dspDeviceEngine, QObject* parent) :
PluginManager::PluginManager(MainWindow* mainWindow, QObject* parent) :
QObject(parent),
m_pluginAPI(this, mainWindow),
m_mainWindow(mainWindow),
m_deviceTabIndex(deviceTabIndex),
m_dspDeviceEngine(dspDeviceEngine),
m_sampleSourceId(),
m_sampleSourceSerial(),
m_sampleSourceSequence(0),
@ -29,7 +27,7 @@ PluginManager::PluginManager(MainWindow* mainWindow, uint deviceTabIndex, DSPDev
PluginManager::~PluginManager()
{
freeAll();
// freeAll();
}
void PluginManager::loadPlugins()
@ -59,23 +57,6 @@ void PluginManager::registerChannel(const QString& channelName, PluginInterface*
m_channelRegistrations.append(PluginAPI::ChannelRegistration(channelName, plugin));
}
//void PluginManager::registerChannelInstance(const QString& channelName, PluginGUI* pluginGUI)
//{
// m_channelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI));
// renameChannelInstances();
//}
//
//void PluginManager::removeChannelInstance(PluginGUI* pluginGUI)
//{
// for(ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it) {
// if(it->m_gui == pluginGUI) {
// m_channelInstanceRegistrations.erase(it);
// break;
// }
// }
// renameChannelInstances();
//}
void PluginManager::registerSampleSource(const QString& sourceName, PluginInterface* plugin)
{
qDebug() << "PluginManager::registerSampleSource "
@ -85,169 +66,6 @@ void PluginManager::registerSampleSource(const QString& sourceName, PluginInterf
m_sampleSourceRegistrations.append(SampleSourceRegistration(sourceName, plugin));
}
//void PluginManager::loadChannelSettings(const Preset* preset, DeviceAPI *deviceAPI)
//{
// fprintf(stderr, "PluginManager::loadSettings: Loading preset [%s | %s]\n", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
//
// // copy currently open channels and clear list
// ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations;
// m_channelInstanceRegistrations.clear();
//
// for(int i = 0; i < preset->getChannelCount(); i++)
// {
// const Preset::ChannelConfig& channelConfig = preset->getChannelConfig(i);
// ChannelInstanceRegistration reg;
//
// // if we have one instance available already, use it
//
// for(int i = 0; i < openChannels.count(); i++)
// {
// qDebug("PluginManager::loadSettings: channels compare [%s] vs [%s]", qPrintable(openChannels[i].m_channelName), qPrintable(channelConfig.m_channel));
//
// if(openChannels[i].m_channelName == channelConfig.m_channel)
// {
// qDebug("PluginManager::loadSettings: channel [%s] found", qPrintable(openChannels[i].m_channelName));
// reg = openChannels.takeAt(i);
// m_channelInstanceRegistrations.append(reg);
// break;
// }
// }
//
// // if we haven't one already, create one
//
// if(reg.m_gui == NULL)
// {
// for(int i = 0; i < m_channelRegistrations.count(); i++)
// {
// if(m_channelRegistrations[i].m_channelName == channelConfig.m_channel)
// {
// qDebug("PluginManager::loadSettings: creating new channel [%s]", qPrintable(channelConfig.m_channel));
// reg = ChannelInstanceRegistration(channelConfig.m_channel, m_channelRegistrations[i].m_plugin->createChannel(channelConfig.m_channel, deviceAPI));
// break;
// }
// }
// }
//
// if(reg.m_gui != NULL)
// {
// qDebug("PluginManager::loadSettings: deserializing channel [%s]", qPrintable(channelConfig.m_channel));
// reg.m_gui->deserialize(channelConfig.m_config);
// }
// }
//
// // everything, that is still "available" is not needed anymore
// for(int i = 0; i < openChannels.count(); i++)
// {
// qDebug("PluginManager::loadSettings: destroying spare channel [%s]", qPrintable(openChannels[i].m_channelName));
// openChannels[i].m_gui->destroy();
// }
//
// renameChannelInstances();
//
//// loadSourceSettings(preset); // FIXME
//}
//void PluginManager::loadSourceSettings(const Preset* preset)
//{
// fprintf(stderr, "PluginManager::loadSourceSettings: Loading preset [%s | %s]\n", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
//
// if(m_sampleSourcePluginGUI != 0)
// {
// const QByteArray* sourceConfig = preset->findBestSourceConfig(m_sampleSourceId, m_sampleSourceSerial, m_sampleSourceSequence);
//
// if (sourceConfig != 0)
// {
// qDebug() << "PluginManager::loadSettings: deserializing source " << qPrintable(m_sampleSourceId);
// m_sampleSourcePluginGUI->deserialize(*sourceConfig);
// }
//
// qint64 centerFrequency = preset->getCenterFrequency();
// m_sampleSourcePluginGUI->setCenterFrequency(centerFrequency);
// }
//}
// sort by increasing delta frequency and type (i.e. name)
bool PluginManager::ChannelInstanceRegistration::operator<(const ChannelInstanceRegistration& other) const {
if (m_gui && other.m_gui) {
if (m_gui->getCenterFrequency() == other.m_gui->getCenterFrequency()) {
return m_gui->getName() < other.m_gui->getName();
} else {
return m_gui->getCenterFrequency() < other.m_gui->getCenterFrequency();
}
} else {
return false;
}
}
//void PluginManager::saveSettings(Preset* preset)
//{
// qDebug("PluginManager::saveSettings");
//// saveSourceSettings(preset); // FIXME
//
// qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.end()); // sort by increasing delta frequency and type
//
// for(int i = 0; i < m_channelInstanceRegistrations.count(); i++)
// {
// preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize());
// }
//}
//void PluginManager::saveSourceSettings(Preset* preset)
//{
// qDebug("PluginManager::saveSourceSettings");
//
// if(m_sampleSourcePluginGUI != NULL)
// {
// preset->addOrUpdateSourceConfig(m_sampleSourceId, m_sampleSourceSerial, m_sampleSourceSequence, m_sampleSourcePluginGUI->serialize());
// //preset->setSourceConfig(m_sampleSourceId, m_sampleSourceSerial, m_sampleSourceSequence, m_sampleSourcePluginGUI->serialize());
// preset->setCenterFrequency(m_sampleSourcePluginGUI->getCenterFrequency());
// }
//}
void PluginManager::freeAll()
{
m_dspDeviceEngine->stopAcquistion();
while(!m_channelInstanceRegistrations.isEmpty()) {
ChannelInstanceRegistration reg(m_channelInstanceRegistrations.takeLast());
reg.m_gui->destroy();
}
if(m_sampleSourcePluginGUI != NULL) {
m_dspDeviceEngine->setSource(NULL);
m_sampleSourcePluginGUI->destroy();
m_sampleSourcePluginGUI = NULL;
m_sampleSourceId.clear();
}
}
//bool PluginManager::handleMessage(const Message& message)
//{
// if (m_sampleSourcePluginGUI != 0)
// {
// if ((message.getDestination() == 0) || (message.getDestination() == m_sampleSourcePluginGUI))
// {
// if (m_sampleSourcePluginGUI->handleMessage(message))
// {
// return true;
// }
// }
// }
//
// for (ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it)
// {
// if ((message.getDestination() == 0) || (message.getDestination() == it->m_gui))
// {
// if (it->m_gui->handleMessage(message))
// {
// return true;
// }
// }
// }
//
// return false;
//}
void PluginManager::updateSampleSourceDevices()
{
m_sampleSourceDevices.clear();
@ -498,13 +316,6 @@ void PluginManager::loadPlugins(const QDir& dir)
}
}
void PluginManager::renameChannelInstances()
{
for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) {
m_channelInstanceRegistrations[i].m_gui->setName(QString("%1:%2").arg(m_channelInstanceRegistrations[i].m_channelName).arg(i));
}
}
void PluginManager::populateChannelComboBox(QComboBox *channels)
{
for(PluginAPI::ChannelRegistrations::iterator it = m_channelRegistrations.begin(); it != m_channelRegistrations.end(); ++it)

View File

@ -35,7 +35,7 @@ public:
typedef QList<Plugin> Plugins;
explicit PluginManager(MainWindow* mainWindow, uint deviceTabIndex, DSPDeviceEngine* dspDeviceEngine, QObject* parent = NULL);
explicit PluginManager(MainWindow* mainWindow, QObject* parent = NULL);
~PluginManager();
void loadPlugins();
@ -43,21 +43,10 @@ public:
// Callbacks from the plugins
void registerChannel(const QString& channelName, PluginInterface* plugin);
// void registerChannelInstance(const QString& channelName, PluginGUI* pluginGUI);
// void removeChannelInstance(PluginGUI* pluginGUI);
void registerSampleSource(const QString& sourceName, PluginInterface* plugin);
PluginAPI::ChannelRegistrations *getChannelRegistrations() { return &m_channelRegistrations; }
// void loadChannelSettings(const Preset* preset, DeviceAPI *deviceAPI);
// void loadSourceSettings(const Preset* preset);
// void saveSettings(Preset* preset);
// void saveSourceSettings(Preset* preset);
void freeAll();
// bool handleMessage(const Message& message);
void updateSampleSourceDevices();
void fillSampleSourceSelector(QComboBox* comboBox);
@ -68,24 +57,7 @@ public:
void populateChannelComboBox(QComboBox *channels);
void createChannelInstance(int channelPluginIndex, DeviceAPI *deviceAPI);
PluginAPI *getAPI(MainWindow *mainWindow);
private:
struct ChannelInstanceRegistration {
QString m_channelName;
PluginGUI* m_gui;
ChannelInstanceRegistration() :
m_channelName(),
m_gui(NULL)
{ }
ChannelInstanceRegistration(const QString& channelName, PluginGUI* pluginGUI) :
m_channelName(channelName),
m_gui(pluginGUI)
{ }
bool operator<(const ChannelInstanceRegistration& other) const;
};
typedef QList<ChannelInstanceRegistration> ChannelInstanceRegistrations;
struct SampleSourceRegistration {
QString m_sourceId;
PluginInterface* m_plugin;
@ -94,6 +66,7 @@ private:
m_plugin(plugin)
{ }
};
typedef QList<SampleSourceRegistration> SampleSourceRegistrations;
struct SampleSourceDevice {
@ -115,16 +88,14 @@ private:
m_sourceSequence(sourceSequence)
{ }
};
typedef QList<SampleSourceDevice> SampleSourceDevices;
PluginAPI m_pluginAPI;
MainWindow* m_mainWindow;
uint m_deviceTabIndex;
DSPDeviceEngine* m_dspDeviceEngine;
Plugins m_plugins;
PluginAPI::ChannelRegistrations m_channelRegistrations; //!< Channel plugins register here
ChannelInstanceRegistrations m_channelInstanceRegistrations; // TODO: remove
SampleSourceRegistrations m_sampleSourceRegistrations; //!< Input source plugins (one per device kind) register here
SampleSourceDevices m_sampleSourceDevices; //!< Instances of input sources present in the system
@ -134,7 +105,8 @@ private:
PluginGUI* m_sampleSourcePluginGUI;
void loadPlugins(const QDir& dir);
void renameChannelInstances();
friend class MainWindow;
};
static inline bool operator<(const PluginManager::Plugin& a, const PluginManager::Plugin& b)