Implemented buddy leader logic

pull/60/head
f4exb 2017-07-03 08:59:48 +02:00
rodzic bceafe6f2c
commit 8da0464a54
5 zmienionych plików z 52 dodań i 2 usunięć

Wyświetl plik

@ -36,7 +36,8 @@ DeviceSinkAPI::DeviceSinkAPI(MainWindow *mainWindow,
m_channelWindow(channelWindow), m_channelWindow(channelWindow),
m_sampleSinkSequence(0), m_sampleSinkSequence(0),
m_sampleSinkPluginGUI(0), m_sampleSinkPluginGUI(0),
m_buddySharedPtr(0) m_buddySharedPtr(0),
m_isBuddyLeader(false)
{ {
} }
@ -464,9 +465,16 @@ void DeviceSinkAPI::clearBuddiesLists()
{ {
std::vector<DeviceSourceAPI*>::iterator itSource = m_sourceBuddies.begin(); std::vector<DeviceSourceAPI*>::iterator itSource = m_sourceBuddies.begin();
std::vector<DeviceSinkAPI*>::iterator itSink = m_sinkBuddies.begin(); std::vector<DeviceSinkAPI*>::iterator itSink = m_sinkBuddies.begin();
bool leaderElected = false;
for (;itSource != m_sourceBuddies.end(); ++itSource) for (;itSource != m_sourceBuddies.end(); ++itSource)
{ {
if (isBuddyLeader() && !leaderElected)
{
(*itSource)->setBuddyLeader(true);
leaderElected = true;
}
(*itSource)->removeSinkBuddy(this); (*itSource)->removeSinkBuddy(this);
} }
@ -474,6 +482,12 @@ void DeviceSinkAPI::clearBuddiesLists()
for (;itSink != m_sinkBuddies.end(); ++itSink) for (;itSink != m_sinkBuddies.end(); ++itSink)
{ {
if (isBuddyLeader() && !leaderElected)
{
(*itSink)->setBuddyLeader(true);
leaderElected = true;
}
(*itSink)->removeSinkBuddy(this); (*itSink)->removeSinkBuddy(this);
} }

Wyświetl plik

@ -98,6 +98,8 @@ public:
void clearBuddiesLists(); void clearBuddiesLists();
void *getBuddySharedPtr() const { return m_buddySharedPtr; } void *getBuddySharedPtr() const { return m_buddySharedPtr; }
void setBuddySharedPtr(void *ptr) { m_buddySharedPtr = ptr; } void setBuddySharedPtr(void *ptr) { m_buddySharedPtr = ptr; }
bool isBuddyLeader() const { return m_isBuddyLeader; }
void setBuddyLeader(bool isBuddyLeader) { m_isBuddyLeader = isBuddyLeader; }
protected: protected:
struct ChannelInstanceRegistration struct ChannelInstanceRegistration
@ -146,6 +148,7 @@ protected:
std::vector<DeviceSourceAPI*> m_sourceBuddies; //!< Device source APIs referencing the same physical device std::vector<DeviceSourceAPI*> m_sourceBuddies; //!< Device source APIs referencing the same physical device
std::vector<DeviceSinkAPI*> m_sinkBuddies; //!< Device sink APIs referencing the same physical device std::vector<DeviceSinkAPI*> m_sinkBuddies; //!< Device sink APIs referencing the same physical device
void *m_buddySharedPtr; void *m_buddySharedPtr;
bool m_isBuddyLeader;
friend class MainWindow; friend class MainWindow;
friend class DeviceSourceAPI; friend class DeviceSourceAPI;

Wyświetl plik

@ -36,7 +36,8 @@ DeviceSourceAPI::DeviceSourceAPI(MainWindow *mainWindow,
m_channelWindow(channelWindow), m_channelWindow(channelWindow),
m_sampleSourceSequence(0), m_sampleSourceSequence(0),
m_sampleSourcePluginGUI(0), m_sampleSourcePluginGUI(0),
m_buddySharedPtr(0) m_buddySharedPtr(0),
m_isBuddyLeader(false)
{ {
} }
@ -461,9 +462,16 @@ void DeviceSourceAPI::clearBuddiesLists()
{ {
std::vector<DeviceSourceAPI*>::iterator itSource = m_sourceBuddies.begin(); std::vector<DeviceSourceAPI*>::iterator itSource = m_sourceBuddies.begin();
std::vector<DeviceSinkAPI*>::iterator itSink = m_sinkBuddies.begin(); std::vector<DeviceSinkAPI*>::iterator itSink = m_sinkBuddies.begin();
bool leaderElected = false;
for (;itSource != m_sourceBuddies.end(); ++itSource) for (;itSource != m_sourceBuddies.end(); ++itSource)
{ {
if (isBuddyLeader() && !leaderElected)
{
(*itSource)->setBuddyLeader(true);
leaderElected = true;
}
(*itSource)->removeSourceBuddy(this); (*itSource)->removeSourceBuddy(this);
} }
@ -471,6 +479,12 @@ void DeviceSourceAPI::clearBuddiesLists()
for (;itSink != m_sinkBuddies.end(); ++itSink) for (;itSink != m_sinkBuddies.end(); ++itSink)
{ {
if (isBuddyLeader() && !leaderElected)
{
(*itSink)->setBuddyLeader(true);
leaderElected = true;
}
(*itSink)->removeSourceBuddy(this); (*itSink)->removeSourceBuddy(this);
} }

Wyświetl plik

@ -99,6 +99,8 @@ public:
void clearBuddiesLists(); void clearBuddiesLists();
void *getBuddySharedPtr() const { return m_buddySharedPtr; } void *getBuddySharedPtr() const { return m_buddySharedPtr; }
void setBuddySharedPtr(void *ptr) { m_buddySharedPtr = ptr; } void setBuddySharedPtr(void *ptr) { m_buddySharedPtr = ptr; }
bool isBuddyLeader() const { return m_isBuddyLeader; }
void setBuddyLeader(bool isBuddyLeader) { m_isBuddyLeader = isBuddyLeader; }
protected: protected:
struct ChannelInstanceRegistration struct ChannelInstanceRegistration
@ -147,6 +149,7 @@ protected:
std::vector<DeviceSourceAPI*> m_sourceBuddies; //!< Device source APIs referencing the same physical device std::vector<DeviceSourceAPI*> m_sourceBuddies; //!< Device source APIs referencing the same physical device
std::vector<DeviceSinkAPI*> m_sinkBuddies; //!< Device sink APIs referencing the same physical device std::vector<DeviceSinkAPI*> m_sinkBuddies; //!< Device sink APIs referencing the same physical device
void *m_buddySharedPtr; void *m_buddySharedPtr;
bool m_isBuddyLeader;
friend class MainWindow; friend class MainWindow;
friend class DeviceSinkAPI; friend class DeviceSinkAPI;

Wyświetl plik

@ -804,6 +804,8 @@ void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unus
// add to buddies list // add to buddies list
std::vector<DeviceUISet*>::iterator it = m_deviceUIs.begin(); std::vector<DeviceUISet*>::iterator it = m_deviceUIs.begin();
int nbOfBuddies = 0;
for (; it != m_deviceUIs.end(); ++it) for (; it != m_deviceUIs.end(); ++it)
{ {
if (*it != deviceUI) // do not add to itself 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())) (deviceUI->m_deviceSourceAPI->getSampleSourceSerial() == (*it)->m_deviceSourceAPI->getSampleSourceSerial()))
{ {
(*it)->m_deviceSourceAPI->addSourceBuddy(deviceUI->m_deviceSourceAPI); (*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())) (deviceUI->m_deviceSourceAPI->getSampleSourceSerial() == (*it)->m_deviceSinkAPI->getSampleSinkSerial()))
{ {
(*it)->m_deviceSinkAPI->addSourceBuddy(deviceUI->m_deviceSourceAPI); (*it)->m_deviceSinkAPI->addSourceBuddy(deviceUI->m_deviceSourceAPI);
nbOfBuddies++;
} }
} }
} }
} }
if (nbOfBuddies == 0) {
deviceUI->m_deviceSourceAPI->setBuddyLeader(true);
}
// constructs new GUI and input object // constructs new GUI and input object
QWidget *gui; QWidget *gui;
PluginManager::SamplingDevice *sampleSourceDevice = (PluginManager::SamplingDevice *) devicePtr; PluginManager::SamplingDevice *sampleSourceDevice = (PluginManager::SamplingDevice *) devicePtr;
@ -866,6 +874,8 @@ void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused
// add to buddies list // add to buddies list
std::vector<DeviceUISet*>::iterator it = m_deviceUIs.begin(); std::vector<DeviceUISet*>::iterator it = m_deviceUIs.begin();
int nbOfBuddies = 0;
for (; it != m_deviceUIs.end(); ++it) for (; it != m_deviceUIs.end(); ++it)
{ {
if (*it != deviceUI) // do not add to itself 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())) (deviceUI->m_deviceSinkAPI->getSampleSinkSerial() == (*it)->m_deviceSourceAPI->getSampleSourceSerial()))
{ {
(*it)->m_deviceSourceAPI->addSinkBuddy(deviceUI->m_deviceSinkAPI); (*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())) (deviceUI->m_deviceSinkAPI->getSampleSinkSerial() == (*it)->m_deviceSinkAPI->getSampleSinkSerial()))
{ {
(*it)->m_deviceSinkAPI->addSinkBuddy(deviceUI->m_deviceSinkAPI); (*it)->m_deviceSinkAPI->addSinkBuddy(deviceUI->m_deviceSinkAPI);
nbOfBuddies++;
} }
} }
} }
} }
if (nbOfBuddies == 0) {
deviceUI->m_deviceSinkAPI->setBuddyLeader(true);
}
// constructs new GUI and output object // constructs new GUI and output object
QWidget *gui; QWidget *gui;
PluginManager::SamplingDevice *sampleSinkDevice = (PluginManager::SamplingDevice *) devicePtr; PluginManager::SamplingDevice *sampleSinkDevice = (PluginManager::SamplingDevice *) devicePtr;