mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-02-07 04:10:08 +00:00
160 lines
5.4 KiB
C++
160 lines
5.4 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE library.
|
|
Copyright (c) 2022 - Raw Material Software Limited
|
|
|
|
JUCE is an open source library subject to commercial or open-source
|
|
licensing.
|
|
|
|
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
|
|
Agreement and JUCE Privacy Policy.
|
|
|
|
End User License Agreement: www.juce.com/juce-7-licence
|
|
Privacy Policy: www.juce.com/juce-privacy-policy
|
|
|
|
Or: You may also use this code under the terms of the GPL v3 (see
|
|
www.gnu.org/licenses).
|
|
|
|
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
|
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
|
DISCLAIMED.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
namespace juce::midi_ci
|
|
{
|
|
|
|
/**
|
|
Accumulates message chunks that have been sent by another device in response
|
|
to a transaction initiated by a local device.
|
|
|
|
@tags{Audio}
|
|
*/
|
|
class InitiatorPropertyExchangeCache
|
|
{
|
|
public:
|
|
InitiatorPropertyExchangeCache();
|
|
~InitiatorPropertyExchangeCache();
|
|
|
|
InitiatorPropertyExchangeCache (InitiatorPropertyExchangeCache&&) noexcept;
|
|
InitiatorPropertyExchangeCache& operator= (InitiatorPropertyExchangeCache&&) noexcept;
|
|
|
|
JUCE_DECLARE_NON_COPYABLE (InitiatorPropertyExchangeCache)
|
|
|
|
/** Holds a token that can be used to stop waiting for a reply, along with
|
|
an identifier byte that uniquely identifies an ongoing transaction.
|
|
|
|
@tags{Audio}
|
|
*/
|
|
struct TokenAndId
|
|
{
|
|
TokenAndId() = default;
|
|
TokenAndId (ErasedScopeGuard tokenIn, std::byte idIn)
|
|
: token (std::move (tokenIn)), id (idIn) {}
|
|
|
|
bool isValid() const { return (id & std::byte { 0x80 }) == std::byte{}; }
|
|
|
|
ErasedScopeGuard token{};
|
|
std::byte id { 0x80 };
|
|
};
|
|
|
|
/** Picks an unused request ID, and prepares the cache for that ID to accumulate message chunks.
|
|
|
|
Incoming chunks added with addChunk are generated by another device acting as a responder.
|
|
*/
|
|
TokenAndId primeCache (uint8_t maxSimultaneousRequests,
|
|
std::function<void (const PropertyExchangeResult&)> onDone,
|
|
std::function<void (std::byte)> onTerminate);
|
|
|
|
/** Adds a message chunk for the provided transaction id. */
|
|
void addChunk (std::byte b, const Message::DynamicSizePropertyExchange& chunk);
|
|
|
|
/** Updates the transaction state based on the contents of the provided notification. */
|
|
void notify (std::byte b, Span<const std::byte> header);
|
|
|
|
/** Returns the number of transactions that have been started but not finished. */
|
|
int countOngoingTransactions() const;
|
|
|
|
/** Returns true if there are any transactions in progress that
|
|
haven't yet received replies.
|
|
*/
|
|
bool isAwaitingResponse() const;
|
|
|
|
private:
|
|
class Impl;
|
|
std::unique_ptr<Impl> pimpl;
|
|
};
|
|
|
|
//==============================================================================
|
|
/**
|
|
Accumulates message chunks that form a request initiated by a remote device.
|
|
|
|
@tags{Audio}
|
|
*/
|
|
class ResponderPropertyExchangeCache
|
|
{
|
|
public:
|
|
ResponderPropertyExchangeCache();
|
|
~ResponderPropertyExchangeCache();
|
|
|
|
ResponderPropertyExchangeCache (ResponderPropertyExchangeCache&&) noexcept;
|
|
ResponderPropertyExchangeCache& operator= (ResponderPropertyExchangeCache&&) noexcept;
|
|
|
|
JUCE_DECLARE_NON_COPYABLE (ResponderPropertyExchangeCache)
|
|
|
|
/** Prepares the cache for the given requestId to accumulate message chunks.
|
|
|
|
Incoming chunks added with addChunk are generated by another device acting as an initiator.
|
|
*/
|
|
void primeCache (uint8_t maxSimultaneousTransactions,
|
|
std::function<void (const PropertyExchangeResult&)> onDone,
|
|
std::byte id);
|
|
|
|
/** Adds a message chunk for the provided transaction id. */
|
|
void addChunk (std::byte b, const Message::DynamicSizePropertyExchange& chunk);
|
|
|
|
/** Updates the transaction state based on the contents of the provided notification. */
|
|
void notify (std::byte b, Span<const std::byte> header);
|
|
|
|
/** Returns the number of transactions that have been started but not finished. */
|
|
int countOngoingTransactions() const;
|
|
|
|
private:
|
|
class Impl;
|
|
std::unique_ptr<Impl> pimpl;
|
|
};
|
|
|
|
//==============================================================================
|
|
/**
|
|
An interface for objects that provide resources for property exchange
|
|
transactions.
|
|
|
|
@tags{Audio}
|
|
*/
|
|
class CacheProvider
|
|
{
|
|
public:
|
|
virtual ~CacheProvider() = default;
|
|
|
|
/** Returns a set containing all of the MUIDs currently known to the provider. */
|
|
virtual std::set<MUID> getDiscoveredMuids() const = 0;
|
|
|
|
/** Returns a property exchange cache for accumulating replies to transactions
|
|
we initiated.
|
|
*/
|
|
virtual InitiatorPropertyExchangeCache* getCacheForMuidAsInitiator (MUID m) = 0;
|
|
|
|
/** Returns a property exchange cache for accumulating requests initiated
|
|
by other devices.
|
|
*/
|
|
virtual ResponderPropertyExchangeCache* getCacheForMuidAsResponder (MUID m) = 0;
|
|
|
|
/** Returns the maximum sysex size supported by the device with the
|
|
given MUID.
|
|
*/
|
|
virtual int getMaxSysexSizeForMuid (MUID m) const = 0;
|
|
};
|
|
|
|
} // namespace juce::midi_ci
|