From 8da0464a544d20b69982e8d4fb98da8b1543efc5 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 3 Jul 2017 08:59:48 +0200 Subject: [PATCH] Implemented buddy leader logic --- sdrbase/device/devicesinkapi.cpp | 16 +++++++++++++++- sdrbase/device/devicesinkapi.h | 3 +++ sdrbase/device/devicesourceapi.cpp | 16 +++++++++++++++- sdrbase/device/devicesourceapi.h | 3 +++ sdrbase/mainwindow.cpp | 16 ++++++++++++++++ 5 files changed, 52 insertions(+), 2 deletions(-) diff --git a/sdrbase/device/devicesinkapi.cpp b/sdrbase/device/devicesinkapi.cpp index 36da095e3..9120d534c 100644 --- a/sdrbase/device/devicesinkapi.cpp +++ b/sdrbase/device/devicesinkapi.cpp @@ -36,7 +36,8 @@ DeviceSinkAPI::DeviceSinkAPI(MainWindow *mainWindow, m_channelWindow(channelWindow), m_sampleSinkSequence(0), m_sampleSinkPluginGUI(0), - m_buddySharedPtr(0) + m_buddySharedPtr(0), + m_isBuddyLeader(false) { } @@ -464,9 +465,16 @@ void DeviceSinkAPI::clearBuddiesLists() { std::vector::iterator itSource = m_sourceBuddies.begin(); std::vector::iterator itSink = m_sinkBuddies.begin(); + bool leaderElected = false; for (;itSource != m_sourceBuddies.end(); ++itSource) { + if (isBuddyLeader() && !leaderElected) + { + (*itSource)->setBuddyLeader(true); + leaderElected = true; + } + (*itSource)->removeSinkBuddy(this); } @@ -474,6 +482,12 @@ void DeviceSinkAPI::clearBuddiesLists() for (;itSink != m_sinkBuddies.end(); ++itSink) { + if (isBuddyLeader() && !leaderElected) + { + (*itSink)->setBuddyLeader(true); + leaderElected = true; + } + (*itSink)->removeSinkBuddy(this); } diff --git a/sdrbase/device/devicesinkapi.h b/sdrbase/device/devicesinkapi.h index 5f9008230..6fa1cd1cb 100644 --- a/sdrbase/device/devicesinkapi.h +++ b/sdrbase/device/devicesinkapi.h @@ -98,6 +98,8 @@ public: void clearBuddiesLists(); void *getBuddySharedPtr() const { return m_buddySharedPtr; } void setBuddySharedPtr(void *ptr) { m_buddySharedPtr = ptr; } + bool isBuddyLeader() const { return m_isBuddyLeader; } + void setBuddyLeader(bool isBuddyLeader) { m_isBuddyLeader = isBuddyLeader; } protected: struct ChannelInstanceRegistration @@ -146,6 +148,7 @@ protected: std::vector m_sourceBuddies; //!< Device source APIs referencing the same physical device std::vector m_sinkBuddies; //!< Device sink APIs referencing the same physical device void *m_buddySharedPtr; + bool m_isBuddyLeader; friend class MainWindow; friend class DeviceSourceAPI; diff --git a/sdrbase/device/devicesourceapi.cpp b/sdrbase/device/devicesourceapi.cpp index 175b88067..d1cfdb02e 100644 --- a/sdrbase/device/devicesourceapi.cpp +++ b/sdrbase/device/devicesourceapi.cpp @@ -36,7 +36,8 @@ DeviceSourceAPI::DeviceSourceAPI(MainWindow *mainWindow, m_channelWindow(channelWindow), m_sampleSourceSequence(0), m_sampleSourcePluginGUI(0), - m_buddySharedPtr(0) + m_buddySharedPtr(0), + m_isBuddyLeader(false) { } @@ -461,9 +462,16 @@ void DeviceSourceAPI::clearBuddiesLists() { std::vector::iterator itSource = m_sourceBuddies.begin(); std::vector::iterator itSink = m_sinkBuddies.begin(); + bool leaderElected = false; for (;itSource != m_sourceBuddies.end(); ++itSource) { + if (isBuddyLeader() && !leaderElected) + { + (*itSource)->setBuddyLeader(true); + leaderElected = true; + } + (*itSource)->removeSourceBuddy(this); } @@ -471,6 +479,12 @@ void DeviceSourceAPI::clearBuddiesLists() for (;itSink != m_sinkBuddies.end(); ++itSink) { + if (isBuddyLeader() && !leaderElected) + { + (*itSink)->setBuddyLeader(true); + leaderElected = true; + } + (*itSink)->removeSourceBuddy(this); } diff --git a/sdrbase/device/devicesourceapi.h b/sdrbase/device/devicesourceapi.h index 331b01625..175a03558 100644 --- a/sdrbase/device/devicesourceapi.h +++ b/sdrbase/device/devicesourceapi.h @@ -99,6 +99,8 @@ public: void clearBuddiesLists(); void *getBuddySharedPtr() const { return m_buddySharedPtr; } void setBuddySharedPtr(void *ptr) { m_buddySharedPtr = ptr; } + bool isBuddyLeader() const { return m_isBuddyLeader; } + void setBuddyLeader(bool isBuddyLeader) { m_isBuddyLeader = isBuddyLeader; } protected: struct ChannelInstanceRegistration @@ -147,6 +149,7 @@ protected: std::vector m_sourceBuddies; //!< Device source APIs referencing the same physical device std::vector m_sinkBuddies; //!< Device sink APIs referencing the same physical device void *m_buddySharedPtr; + bool m_isBuddyLeader; friend class MainWindow; friend class DeviceSinkAPI; diff --git a/sdrbase/mainwindow.cpp b/sdrbase/mainwindow.cpp index 61a465faa..ef7a9f6e8 100644 --- a/sdrbase/mainwindow.cpp +++ b/sdrbase/mainwindow.cpp @@ -804,6 +804,8 @@ void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unus // add to buddies list std::vector::iterator it = m_deviceUIs.begin(); + int nbOfBuddies = 0; + for (; it != m_deviceUIs.end(); ++it) { if (*it != deviceUI) // do not add to itself @@ -814,6 +816,7 @@ void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unus (deviceUI->m_deviceSourceAPI->getSampleSourceSerial() == (*it)->m_deviceSourceAPI->getSampleSourceSerial())) { (*it)->m_deviceSourceAPI->addSourceBuddy(deviceUI->m_deviceSourceAPI); + nbOfBuddies++; } } @@ -823,11 +826,16 @@ void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unus (deviceUI->m_deviceSourceAPI->getSampleSourceSerial() == (*it)->m_deviceSinkAPI->getSampleSinkSerial())) { (*it)->m_deviceSinkAPI->addSourceBuddy(deviceUI->m_deviceSourceAPI); + nbOfBuddies++; } } } } + if (nbOfBuddies == 0) { + deviceUI->m_deviceSourceAPI->setBuddyLeader(true); + } + // constructs new GUI and input object QWidget *gui; PluginManager::SamplingDevice *sampleSourceDevice = (PluginManager::SamplingDevice *) devicePtr; @@ -866,6 +874,8 @@ void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused // add to buddies list std::vector::iterator it = m_deviceUIs.begin(); + int nbOfBuddies = 0; + for (; it != m_deviceUIs.end(); ++it) { if (*it != deviceUI) // do not add to itself @@ -876,6 +886,7 @@ void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused (deviceUI->m_deviceSinkAPI->getSampleSinkSerial() == (*it)->m_deviceSourceAPI->getSampleSourceSerial())) { (*it)->m_deviceSourceAPI->addSinkBuddy(deviceUI->m_deviceSinkAPI); + nbOfBuddies++; } } @@ -885,11 +896,16 @@ void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused (deviceUI->m_deviceSinkAPI->getSampleSinkSerial() == (*it)->m_deviceSinkAPI->getSampleSinkSerial())) { (*it)->m_deviceSinkAPI->addSinkBuddy(deviceUI->m_deviceSinkAPI); + nbOfBuddies++; } } } } + if (nbOfBuddies == 0) { + deviceUI->m_deviceSinkAPI->setBuddyLeader(true); + } + // constructs new GUI and output object QWidget *gui; PluginManager::SamplingDevice *sampleSinkDevice = (PluginManager::SamplingDevice *) devicePtr;