mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
161 lines
5.9 KiB
C++
161 lines
5.9 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
|
|
{
|
|
|
|
/**
|
|
Holds a profile ID, along with the number of supported and active channels
|
|
corresponding to that profile.
|
|
|
|
@tags{Audio}
|
|
*/
|
|
struct ProfileStateEntry
|
|
{
|
|
Profile profile; ///< A MIDI-CI profile ID
|
|
SupportedAndActive state; ///< The number of channels corresponding to the profile
|
|
|
|
bool operator< (const Profile& other) const { return profile < other; }
|
|
bool operator< (const ProfileStateEntry& other) const { return profile < other.profile; }
|
|
};
|
|
|
|
//==============================================================================
|
|
/**
|
|
Holds the number of channels that are supported and activated for all profiles
|
|
at a particular channel address.
|
|
|
|
@tags{Audio}
|
|
*/
|
|
class ChannelProfileStates
|
|
{
|
|
public:
|
|
using Entry = ProfileStateEntry;
|
|
|
|
/** Returns the number of channels that are supported and active for the
|
|
given profile.
|
|
*/
|
|
SupportedAndActive get (const Profile& profile) const;
|
|
|
|
/** Returns all profiles that are active at this address. */
|
|
std::vector<Profile> getActive() const;
|
|
|
|
/** Returns all profiles that are supported but inactive at this address. */
|
|
std::vector<Profile> getInactive() const;
|
|
|
|
/** Sets the number of channels that are supported/active for a given profile. */
|
|
void set (const Profile& profile, SupportedAndActive state);
|
|
|
|
/** Removes the record of a particular profile, equivalent to removing support. */
|
|
void erase (const Profile& profile);
|
|
|
|
/** Gets a const iterator over all profiles, for range-for compatibility. */
|
|
auto begin() const { return entries.begin(); }
|
|
|
|
/** Gets a const iterator over all profiles, for range-for compatibility. */
|
|
auto end() const { return entries.end(); }
|
|
|
|
/** Returns true if no profiles are supported. */
|
|
auto empty() const { return entries.empty(); }
|
|
|
|
/** Returns the number of profiles that are supported at this address. */
|
|
auto size() const { return entries.size(); }
|
|
|
|
private:
|
|
std::vector<Entry> entries;
|
|
};
|
|
|
|
//==============================================================================
|
|
/**
|
|
Contains profile states for each channel in a group, along with the state
|
|
of profiles that apply to the group itself.
|
|
|
|
@tags{Audio}
|
|
*/
|
|
class GroupProfileStates
|
|
{
|
|
template <typename This>
|
|
static auto getStateForDestinationImpl (This& t, ChannelInGroup destination) -> decltype (&t.groupState)
|
|
{
|
|
if (destination == ChannelInGroup::wholeGroup)
|
|
return &t.groupState;
|
|
|
|
if (const auto index = (size_t) destination; index < t.channelStates.size())
|
|
return &t.channelStates[index];
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
public:
|
|
/** Returns the profile state for the group or a contained channel as appropriate.
|
|
Returns nullptr if ChannelInGroup refers to a whole function block.
|
|
*/
|
|
auto* getStateForDestination (ChannelInGroup d) { return getStateForDestinationImpl (*this, d); }
|
|
|
|
/** Returns the profile state for the group or a contained channel as appropriate.
|
|
Returns nullptr if ChannelInGroup refers to a whole function block.
|
|
*/
|
|
auto* getStateForDestination (ChannelInGroup d) const { return getStateForDestinationImpl (*this, d); }
|
|
|
|
std::array<ChannelProfileStates, 16> channelStates; ///< Profile states for each channel in the group
|
|
ChannelProfileStates groupState; ///< Profile states for the group itself
|
|
};
|
|
|
|
//==============================================================================
|
|
/**
|
|
Contains profile states for each group and channel in a function block, along with the state
|
|
of profiles that apply to the function block itself.
|
|
|
|
@tags{Audio}
|
|
*/
|
|
class BlockProfileStates
|
|
{
|
|
template <typename This>
|
|
static auto getStateForDestinationImpl (This& t, ChannelAddress address) -> decltype (&t.blockState)
|
|
{
|
|
if (address.isBlock())
|
|
return &t.blockState;
|
|
|
|
if (const auto index = (size_t) address.getGroup(); index < t.groupStates.size())
|
|
return t.groupStates[index].getStateForDestination (address.getChannel());
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
public:
|
|
/** Returns the profile state for the function block, group, or channel as appropriate.
|
|
Returns nullptr if the address refers to a non-existent channel or group.
|
|
*/
|
|
auto* getStateForDestination (ChannelAddress address) { return getStateForDestinationImpl (*this, address); }
|
|
|
|
/** Returns the profile state for the function block, group, or channel as appropriate.
|
|
Returns nullptr if the address refers to a non-existent channel or group.
|
|
*/
|
|
auto* getStateForDestination (ChannelAddress address) const { return getStateForDestinationImpl (*this, address); }
|
|
|
|
std::array<GroupProfileStates, 16> groupStates; ///< Profile states for each group in the function block
|
|
ChannelProfileStates blockState; ///< Profile states for the whole function block
|
|
};
|
|
|
|
} // namespace juce::midi_ci
|