mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
204 lines
5.9 KiB
C++
204 lines
5.9 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE library.
|
|
Copyright (c) 2020 - Raw Material Software Limited
|
|
|
|
JUCE is an open source library subject to commercial or open-source
|
|
licensing.
|
|
|
|
The code included in this file is provided under the terms of the ISC license
|
|
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
|
To use, copy, modify, and/or distribute this software for any purpose with or
|
|
without fee is hereby granted provided that the above copyright notice and
|
|
this permission notice appear in all copies.
|
|
|
|
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
|
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
|
DISCLAIMED.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
//==============================================================================
|
|
/** These can be useful when debugging the topology. */
|
|
|
|
#ifndef LOG_BLOCKS_CONNECTIVITY
|
|
#define LOG_BLOCKS_CONNECTIVITY 0
|
|
#endif
|
|
|
|
#ifndef LOG_BLOCKS_PINGS
|
|
#define LOG_BLOCKS_PINGS 0
|
|
#endif
|
|
|
|
#ifndef DUMP_BANDWIDTH_STATS
|
|
#define DUMP_BANDWIDTH_STATS 0
|
|
#endif
|
|
|
|
#ifndef DUMP_TOPOLOGY
|
|
#define DUMP_TOPOLOGY 0
|
|
#endif
|
|
|
|
#define TOPOLOGY_LOG(text) \
|
|
JUCE_BLOCK_WITH_FORCED_SEMICOLON (juce::String buf ("Topology Src: "); \
|
|
juce::Logger::outputDebugString (buf << text);)
|
|
|
|
#if LOG_BLOCKS_CONNECTIVITY
|
|
#define LOG_CONNECTIVITY(text) TOPOLOGY_LOG(text)
|
|
#else
|
|
#define LOG_CONNECTIVITY(text)
|
|
#endif
|
|
|
|
#if LOG_BLOCKS_PINGS
|
|
#define LOG_PING(text) TOPOLOGY_LOG(text)
|
|
#else
|
|
#define LOG_PING(text)
|
|
#endif
|
|
|
|
#if DUMP_BANDWIDTH_STATS
|
|
#include "internal/juce_BandwidthStatsLogger.cpp"
|
|
#endif
|
|
|
|
#include "internal/juce_MidiDeviceConnection.cpp"
|
|
#include "internal/juce_MIDIDeviceDetector.cpp"
|
|
#include "internal/juce_DeviceInfo.cpp"
|
|
#include "internal/juce_DepreciatedVersionReader.cpp"
|
|
#include "internal/juce_BlockSerialReader.cpp"
|
|
#include "internal/juce_ConnectedDeviceGroup.cpp"
|
|
#include "internal/juce_BlockImplementation.cpp"
|
|
#include "internal/juce_Detector.cpp"
|
|
#include "internal/juce_DetectorHolder.cpp"
|
|
|
|
namespace juce
|
|
{
|
|
|
|
//==============================================================================
|
|
PhysicalTopologySource::PhysicalTopologySource (bool startDetached)
|
|
{
|
|
if (! startDetached)
|
|
setActive (true);
|
|
}
|
|
|
|
PhysicalTopologySource::PhysicalTopologySource (DeviceDetector& detectorToUse, bool startDetached)
|
|
: customDetector (&detectorToUse)
|
|
{
|
|
if (! startDetached)
|
|
setActive (true);
|
|
}
|
|
|
|
PhysicalTopologySource::~PhysicalTopologySource()
|
|
{
|
|
setActive (false);
|
|
}
|
|
|
|
void PhysicalTopologySource::setActive (bool shouldBeActive)
|
|
{
|
|
JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
|
|
|
|
if (isActive() == shouldBeActive)
|
|
return;
|
|
|
|
if (shouldBeActive)
|
|
{
|
|
if (customDetector == nullptr)
|
|
detector = std::make_unique<DetectorHolder>(*this);
|
|
else
|
|
detector = std::make_unique<DetectorHolder>(*this, *customDetector);
|
|
|
|
detector->detector->activeTopologySources.add (this);
|
|
}
|
|
else
|
|
{
|
|
detector->detector->detach (this);
|
|
detector.reset();
|
|
}
|
|
|
|
listeners.call ([] (TopologySource::Listener& l){ l.topologyChanged(); });
|
|
}
|
|
|
|
bool PhysicalTopologySource::isActive() const
|
|
{
|
|
return detector != nullptr;
|
|
}
|
|
|
|
bool PhysicalTopologySource::isLockedFromOutside() const
|
|
{
|
|
if (detector != nullptr && detector->detector != nullptr)
|
|
return detector->detector->deviceDetector.isLockedFromOutside();
|
|
|
|
return false;
|
|
}
|
|
|
|
BlockTopology PhysicalTopologySource::getCurrentTopology() const
|
|
{
|
|
JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED // This method must only be called from the message thread!
|
|
|
|
if (detector != nullptr)
|
|
return detector->detector->currentTopology;
|
|
|
|
return {};
|
|
}
|
|
|
|
void PhysicalTopologySource::cancelAllActiveTouches() noexcept
|
|
{
|
|
if (detector != nullptr)
|
|
detector->detector->cancelAllActiveTouches();
|
|
}
|
|
|
|
bool PhysicalTopologySource::hasOwnServiceTimer() const { return false; }
|
|
void PhysicalTopologySource::handleTimerTick()
|
|
{
|
|
if (detector != nullptr)
|
|
detector->handleTimerTick();
|
|
}
|
|
|
|
PhysicalTopologySource::DeviceConnection::DeviceConnection() {}
|
|
PhysicalTopologySource::DeviceConnection::~DeviceConnection() {}
|
|
|
|
PhysicalTopologySource::DeviceDetector::DeviceDetector() {}
|
|
PhysicalTopologySource::DeviceDetector::~DeviceDetector() {}
|
|
|
|
const char* const* PhysicalTopologySource::getStandardLittleFootFunctions() noexcept
|
|
{
|
|
return BlocksProtocol::ledProgramLittleFootFunctions;
|
|
}
|
|
|
|
template <typename ListType>
|
|
static bool collectionsMatch (const ListType& list1, const ListType& list2) noexcept
|
|
{
|
|
if (list1.size() != list2.size())
|
|
return false;
|
|
|
|
for (auto&& b : list1)
|
|
if (! list2.contains (b))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool BlockTopology::operator== (const BlockTopology& other) const noexcept
|
|
{
|
|
return collectionsMatch (connections, other.connections) && collectionsMatch (blocks, other.blocks);
|
|
}
|
|
|
|
bool BlockTopology::operator!= (const BlockTopology& other) const noexcept
|
|
{
|
|
return ! operator== (other);
|
|
}
|
|
|
|
bool BlockDeviceConnection::operator== (const BlockDeviceConnection& other) const noexcept
|
|
{
|
|
return (device1 == other.device1 && device2 == other.device2
|
|
&& connectionPortOnDevice1 == other.connectionPortOnDevice1
|
|
&& connectionPortOnDevice2 == other.connectionPortOnDevice2)
|
|
|| (device1 == other.device2 && device2 == other.device1
|
|
&& connectionPortOnDevice1 == other.connectionPortOnDevice2
|
|
&& connectionPortOnDevice2 == other.connectionPortOnDevice1);
|
|
}
|
|
|
|
bool BlockDeviceConnection::operator!= (const BlockDeviceConnection& other) const noexcept
|
|
{
|
|
return ! operator== (other);
|
|
}
|
|
|
|
} // namespace juce
|