30 m_discoveredTopologyLabel = std::make_unique<juce::Label>(
"TopologyLabel",
"Available Mema sessions:");
31 addAndMakeVisible(m_discoveredTopologyLabel.get());
33 m_discoveredTopologyTreeView = std::make_unique<JUCEAppBasics::ServiceTopologyTreeView>(
true);
34 m_discoveredTopologyTreeView->setDefaultOpenness(
true);
35 addAndMakeVisible(m_discoveredTopologyTreeView.get());
37 m_selectServiceButton = std::make_unique<juce::TextButton>(
"Join session",
"Join the selected Mema session.");
38 m_selectServiceButton->onClick = [=]() {
41 auto item =
dynamic_cast<JUCEAppBasics::MasterServiceTreeViewItem*
>(m_discoveredTopologyTreeView->getSelectedItem(0));
46 addAndMakeVisible(m_selectServiceButton.get());
60 auto labelHeight = 35;
61 auto buttonHeight = 35;
63 auto maxDiscoveryElmsWidth = 450;
64 auto maxDiscoveryElmsHeight = 350;
66 auto bounds = getLocalBounds().reduced(2*margin);
67 if (bounds.getWidth() > maxDiscoveryElmsWidth)
69 auto hmargin = int((bounds.getWidth() - maxDiscoveryElmsWidth) * 0.5f);
70 bounds.removeFromLeft(hmargin);
71 bounds.removeFromRight(hmargin);
73 if (bounds.getHeight() > maxDiscoveryElmsHeight)
75 auto vmargin = int((bounds.getHeight() - maxDiscoveryElmsHeight) * 0.5f);
76 bounds.removeFromTop(vmargin);
77 bounds.removeFromBottom(vmargin);
80 if (m_selectServiceButton)
81 m_selectServiceButton->setBounds(bounds.removeFromBottom(buttonHeight));
82 bounds.removeFromBottom(margin);
83 if (m_discoveredTopologyLabel)
84 m_discoveredTopologyLabel->setBounds(bounds.removeFromTop(labelHeight));
85 if (m_discoveredTopologyTreeView)
86 m_discoveredTopologyTreeView->setBounds(bounds);
105 auto testSocket = std::make_unique<juce::DatagramSocket>();
106 testSocket->setEnablePortReuse(
true);
109 auto conflictTitle =
"Service discovery error";
110 auto conflictInfo =
"Unable to discover Mema instances\nas the discovery broadcast port cannot be used.";
111 juce::AlertWindow::showOkCancelBox(juce::MessageBoxIconType::WarningIcon, conflictTitle, conflictInfo,
"Retry",
"Quit",
nullptr, juce::ModalCallbackFunction::create([
this, serviceTypeUIDBase, serviceTypeUID](
int result) {
115 juce::JUCEApplication::getInstance()->quit();
120 m_serviceTopologyManager = std::make_unique<JUCEAppBasics::ServiceTopologyManager>(
121 serviceTypeUIDBase, serviceTypeUID,
122 JUCEAppBasics::ServiceTopologyManager::getServiceDescription(),
127 m_serviceTopologyManager->onDiscoveredTopologyChanged = [=]() {
128 if (m_serviceTopologyManager)
129 setDiscoveredServiceTopology(m_serviceTopologyManager->getDiscoveredServiceTopology());
135 std::vector<JUCEAppBasics::SessionMasterAwareService> services;
136 services.reserve(m_serviceTopologyManager->getDiscoveredServiceTopology().size());
137 for (
auto const& serviceKV : m_serviceTopologyManager->getDiscoveredServiceTopology())
138 services.push_back(serviceKV.first);
147void MemaClientDiscoverComponent::setDiscoveredServiceTopology(
const JUCEAppBasics::SessionServiceTopology& topology)