1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00
JUCE/modules/juce_midi_ci/ci/juce_CIProfileStates.h
2023-10-31 11:46:49 +00:00

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