/* ============================================================================== 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 { /** Combines a parameter ID and a version hint. */ class ParameterID { public: ParameterID() = default; /** Constructs an instance. Note that this constructor implicitly converts from Strings and string-like types. @param identifier A string that uniquely identifies a single parameter @param versionHint Influences parameter ordering in Audio Unit plugins. Used to provide backwards compatibility of Audio Unit plugins in Logic and GarageBand. @see AudioProcessorParameter(int) */ template > ParameterID (StringLike&& identifier, int versionHint = 0) : paramID (std::forward (identifier)), version (versionHint) {} /** @see AudioProcessorParameterWithID::paramID */ auto getParamID() const { return paramID; } /** @see AudioProcessorParameter(int) */ auto getVersionHint() const { return version; } private: String paramID; int version = 0; }; /** An instance of this class may be passed to the constructor of an AudioProcessorParameterWithID to set optional characteristics of that parameter. */ class AudioProcessorParameterWithIDAttributes { using This = AudioProcessorParameterWithIDAttributes; public: using Category = AudioProcessorParameter::Category; /** An optional label for the parameter's value */ JUCE_NODISCARD auto withLabel (String x) const { return withMember (*this, &This::label, std::move (x)); } /** The semantics of this parameter */ JUCE_NODISCARD auto withCategory (Category x) const { return withMember (*this, &This::category, std::move (x)); } /** @see AudioProcessorParameter::isMetaParameter() */ JUCE_NODISCARD auto withMeta (bool x) const { return withMember (*this, &This::meta, std::move (x)); } /** @see AudioProcessorParameter::isAutomatable() */ JUCE_NODISCARD auto withAutomatable (bool x) const { return withMember (*this, &This::automatable, std::move (x)); } /** @see AudioProcessorParameter::isOrientationInverted() */ JUCE_NODISCARD auto withInverted (bool x) const { return withMember (*this, &This::inverted, std::move (x)); } /** An optional label for the parameter's value */ JUCE_NODISCARD auto getLabel() const { return label; } /** The semantics of this parameter */ JUCE_NODISCARD auto getCategory() const { return category; } /** @see AudioProcessorParameter::isMetaParameter() */ JUCE_NODISCARD auto getMeta() const { return meta; } /** @see AudioProcessorParameter::isAutomatable() */ JUCE_NODISCARD auto getAutomatable() const { return automatable; } /** @see AudioProcessorParameter::isOrientationInverted() */ JUCE_NODISCARD auto getInverted() const { return inverted; } private: String label; Category category = AudioProcessorParameter::genericParameter; bool meta = false, automatable = true, inverted = false; }; //============================================================================== /** This abstract base class is used by some AudioProcessorParameter helper classes. @see AudioParameterFloat, AudioParameterInt, AudioParameterBool, AudioParameterChoice @tags{Audio} */ class JUCE_API AudioProcessorParameterWithID : public HostedAudioProcessorParameter { public: /** The creation of this object requires providing a name and ID which will be constant for its lifetime. Given that AudioProcessorParameterWithID is abstract, you'll probably call this constructor from a derived class constructor, e.g. @code MyParameterType (String paramID, String name, String label, bool automatable) : AudioProcessorParameterWithID (paramID, name, AudioProcessorParameterWithIDAttributes().withLabel (label) .withAutomatable (automatable)) { } @endcode @param parameterID Specifies the identifier, and optionally the parameter's version hint. @param parameterName The user-facing parameter name. @param attributes Other parameter properties. */ AudioProcessorParameterWithID (const ParameterID& parameterID, const String& parameterName, const AudioProcessorParameterWithIDAttributes& attributes = {}); /** The creation of this object requires providing a name and ID which will be constant for its lifetime. @param parameterID Used to uniquely identify the parameter @param parameterName The user-facing name of the parameter @param parameterLabel An optional label for the parameter's value @param parameterCategory The semantics of this parameter */ [[deprecated ("Prefer the signature taking an Attributes argument")]] AudioProcessorParameterWithID (const ParameterID& parameterID, const String& parameterName, const String& parameterLabel, Category parameterCategory = AudioProcessorParameter::genericParameter) : AudioProcessorParameterWithID (parameterID, parameterName, AudioProcessorParameterWithIDAttributes().withLabel (parameterLabel) .withCategory (parameterCategory)) { } /** Provides access to the parameter's ID string. */ const String paramID; /** Provides access to the parameter's name. */ const String name; /** Provides access to the parameter's label. */ const String label; /** Provides access to the parameter's category. */ const Category category; String getName (int) const override; String getLabel() const override; Category getCategory() const override; String getParameterID() const override { return paramID; } bool isMetaParameter() const override { return meta; } bool isAutomatable() const override { return automatable; } bool isOrientationInverted() const override { return inverted; } private: bool meta = false, automatable = true, inverted = false; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorParameterWithID) }; } // namespace juce