|
- /*
- ==============================================================================
-
- 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
|