//------------------------------------------------------------------------ // Project : VST SDK // // Category : Helpers // Filename : public.sdk/source/vst/vsteditcontroller.h // Created by : Steinberg, 04/2005 // Description : VST Edit Controller Implementation // //----------------------------------------------------------------------------- // This file is part of a Steinberg SDK. It is subject to the license terms // in the LICENSE file found in the top-level directory of this distribution // and at www.steinberg.net/sdklicenses. // No part of the SDK, including this file, may be copied, modified, propagated, // or distributed except according to the terms contained in the LICENSE file. //----------------------------------------------------------------------------- #pragma once #include "public.sdk/source/vst/vstcomponentbase.h" #include "public.sdk/source/vst/vstparameters.h" #include "public.sdk/source/common/pluginview.h" #include "pluginterfaces/vst/ivsteditcontroller.h" #include "pluginterfaces/vst/ivstunits.h" #include #include #include //------------------------------------------------------------------------ namespace Steinberg { namespace Vst { class EditorView; //------------------------------------------------------------------------ /** Default implementation for a VST 3 edit controller. \ingroup vstClasses Can be used as base class for a specific controller implementation */ class EditController : public ComponentBase, public IEditController, public IEditController2 { public: //------------------------------------------------------------------------ EditController (); //---from IEditController------- tresult PLUGIN_API setComponentState (IBStream* state) SMTG_OVERRIDE; tresult PLUGIN_API setState (IBStream* state) SMTG_OVERRIDE; tresult PLUGIN_API getState (IBStream* state) SMTG_OVERRIDE; int32 PLUGIN_API getParameterCount () SMTG_OVERRIDE; tresult PLUGIN_API getParameterInfo (int32 paramIndex, ParameterInfo& info) SMTG_OVERRIDE; tresult PLUGIN_API getParamStringByValue (ParamID tag, ParamValue valueNormalized, String128 string) SMTG_OVERRIDE; tresult PLUGIN_API getParamValueByString (ParamID tag, TChar* string, ParamValue& valueNormalized) SMTG_OVERRIDE; ParamValue PLUGIN_API normalizedParamToPlain (ParamID tag, ParamValue valueNormalized) SMTG_OVERRIDE; ParamValue PLUGIN_API plainParamToNormalized (ParamID tag, ParamValue plainValue) SMTG_OVERRIDE; ParamValue PLUGIN_API getParamNormalized (ParamID tag) SMTG_OVERRIDE; tresult PLUGIN_API setParamNormalized (ParamID tag, ParamValue value) SMTG_OVERRIDE; tresult PLUGIN_API setComponentHandler (IComponentHandler* handler) SMTG_OVERRIDE; IPlugView* PLUGIN_API createView (FIDString /*name*/) SMTG_OVERRIDE {return nullptr;} //---from IEditController2------- tresult PLUGIN_API setKnobMode (KnobMode mode) SMTG_OVERRIDE { hostKnobMode = mode; return kResultTrue; } tresult PLUGIN_API openHelp (TBool /*onlyCheck*/) SMTG_OVERRIDE {return kResultFalse;} tresult PLUGIN_API openAboutBox (TBool /*onlyCheck*/) SMTG_OVERRIDE {return kResultFalse;} //---from ComponentBase--------- tresult PLUGIN_API initialize (FUnknown* context) SMTG_OVERRIDE; tresult PLUGIN_API terminate () SMTG_OVERRIDE; //---Internal Methods------- virtual tresult beginEdit (ParamID tag); ///< to be called before a serie of performEdit virtual tresult performEdit (ParamID tag, ParamValue valueNormalized); ///< will inform the host about the value change virtual tresult endEdit (ParamID tag); ///< to be called after a serie of performEdit virtual tresult startGroupEdit (); ///< calls IComponentHandler2::startGroupEdit() if host supports it virtual tresult finishGroupEdit (); ///< calls IComponentHandler2::finishGroupEdit() if host supports it virtual void editorDestroyed (EditorView* /*editor*/) {} ///< called from EditorView if it was destroyed virtual void editorAttached (EditorView* /*editor*/) {} ///< called from EditorView if it was attached to a parent virtual void editorRemoved (EditorView* /*editor*/) {} ///< called from EditorView if it was removed from a parent static KnobMode getHostKnobMode () { return hostKnobMode; } ///< return host knob mode /** Gets for a given tag the parameter object. */ virtual Parameter* getParameterObject (ParamID tag) { return parameters.getParameter (tag); } /** Gets for a given tag the parameter information. */ virtual tresult getParameterInfoByTag (ParamID tag, ParameterInfo& info); /** Calls IComponentHandler2::setDirty (state) if host supports it. */ virtual tresult setDirty (TBool state); /** Calls IComponentHandler2::requestOpenEditor (name) if host supports it. */ virtual tresult requestOpenEditor (FIDString name = ViewType::kEditor); //---Accessor Methods------- IComponentHandler* getComponentHandler () const { return componentHandler; } //---Interface--------- OBJ_METHODS (EditController, ComponentBase) DEFINE_INTERFACES DEF_INTERFACE (IEditController) DEF_INTERFACE (IEditController2) END_DEFINE_INTERFACES (ComponentBase) REFCOUNT_METHODS (ComponentBase) //------------------------------------------------------------------------ protected: IPtr componentHandler; IPtr componentHandler2; ParameterContainer parameters; static KnobMode hostKnobMode; }; //------------------------------------------------------------------------ /** View related to an edit controller. \ingroup vstClasses */ class EditorView : public CPluginView { public: //------------------------------------------------------------------------ EditorView (EditController* controller, ViewRect* size = nullptr); ~EditorView () override; /** Gets its controller part. */ EditController* getController () const { return controller; } //---from CPluginView------------- void attachedToParent () SMTG_OVERRIDE; void removedFromParent () SMTG_OVERRIDE; //------------------------------------------------------------------------ protected: IPtr controller; }; //------------------------------------------------------------------------ /** Unit element. \ingroup vstClasses */ class Unit : public FObject { public: //------------------------------------------------------------------------ Unit (const String128 name, UnitID unitId, UnitID parentUnitId = kRootUnitId, ProgramListID programListId = kNoProgramListId); Unit (const UnitInfo& unit); /** Returns its info. */ const UnitInfo& getInfo () const { return info; } /** Returns its Unit ID. */ UnitID getID () const { return info.id; } /** Sets a new Unit ID. */ void setID (UnitID newID) { info.id = newID; } /** Returns its Unit Name. */ const TChar* getName () const { return info.name; } /** Sets a new Unit Name. */ void setName (const String128 newName); /** Returns its ProgramList ID. */ ProgramListID getProgramListID () const { return info.programListId; } /** Sets a new ProgramList ID. */ void setProgramListID (ProgramListID newID) { info.programListId = newID; } OBJ_METHODS (Unit, FObject) //------------------------------------------------------------------------ protected: Unit (); UnitInfo info; }; //------------------------------------------------------------------------ /** ProgramList element. \ingroup vstClasses */ class ProgramList : public FObject { public: //------------------------------------------------------------------------ ProgramList (const String128 name, ProgramListID listId, UnitID unitId); ProgramList (const ProgramList& programList); const ProgramListInfo& getInfo () const { return info; } ProgramListID getID () const { return info.id; } const TChar* getName () const { return info.name; } int32 getCount () const { return info.programCount; } virtual tresult getProgramName (int32 programIndex, String128 name /*out*/); virtual tresult setProgramName (int32 programIndex, const String128 name /*in*/); virtual tresult getProgramInfo (int32 programIndex, CString attributeId, String128 value /*out*/); virtual tresult hasPitchNames (int32 programIndex) { (void)programIndex; return kResultFalse; } virtual tresult getPitchName (int32 programIndex, int16 midiPitch, String128 name /*out*/) { (void)programIndex; (void)midiPitch; (void)name; return kResultFalse; } /** Adds a program to the end of the list. returns the index of the program. */ virtual int32 addProgram (const String128 name); /** Sets a program attribute value. */ virtual bool setProgramInfo (int32 programIndex, CString attributeId, const String128 value); /** Creates and returns the program parameter. */ virtual Parameter* getParameter (); /** Clear all programs. */ virtual void clearPrograms (); OBJ_METHODS (ProgramList, FObject) //------------------------------------------------------------------------ protected: using StringMap = std::map; using StringVector = std::vector; using ProgramInfoVector = std::vector; ProgramListInfo info {}; UnitID unitId; StringVector programNames; ProgramInfoVector programInfos; Parameter* parameter {nullptr}; }; //------------------------------------------------------------------------ /** ProgramListWithPitchNames element. \ingroup vstClasses */ class ProgramListWithPitchNames : public ProgramList { public: ProgramListWithPitchNames (const String128 name, ProgramListID listId, UnitID unitId); /** Sets a name for the given program index and a given pitch. */ bool setPitchName (int32 programIndex, int16 pitch, const String128 pitchName); /** Removes the PitchName entry for the given program index and a given pitch. Returns true if * it was found and removed. */ bool removePitchName (int32 programIndex, int16 pitch); //---from ProgramList--------- int32 addProgram (const String128 name) SMTG_OVERRIDE; tresult hasPitchNames (int32 programIndex) SMTG_OVERRIDE; tresult getPitchName (int32 programIndex, int16 midiPitch, String128 name /*out*/) SMTG_OVERRIDE; OBJ_METHODS (ProgramListWithPitchNames, ProgramList) protected: using PitchNameMap = std::map; using PitchNamesVector = std::vector; PitchNamesVector pitchNames; }; //------------------------------------------------------------------------ /** Advanced implementation (support IUnitInfo) for a VST 3 edit controller. \ingroup vstClasses - [extends EditController] */ class EditControllerEx1 : public EditController, public IUnitInfo { public: EditControllerEx1 (); ~EditControllerEx1 () override; //---from ComponentBase--------- tresult PLUGIN_API terminate () SMTG_OVERRIDE; /** Adds a given unit. */ bool addUnit (Unit* unit); /** Adds a given program list. */ bool addProgramList (ProgramList* list); /** Returns the ProgramList associated to a given listId. */ ProgramList* getProgramList (ProgramListID listId) const; /** Notifies the host about program list changes. */ tresult notifyProgramListChange (ProgramListID listId, int32 programIndex = kAllProgramInvalid); //---from IUnitInfo------------------ int32 PLUGIN_API getUnitCount () SMTG_OVERRIDE { return static_cast (units.size ()); } tresult PLUGIN_API getUnitInfo (int32 unitIndex, UnitInfo& info /*out*/) SMTG_OVERRIDE; int32 PLUGIN_API getProgramListCount () SMTG_OVERRIDE; tresult PLUGIN_API getProgramListInfo (int32 listIndex, ProgramListInfo& info /*out*/) SMTG_OVERRIDE; tresult PLUGIN_API getProgramName (ProgramListID listId, int32 programIndex, String128 name /*out*/) SMTG_OVERRIDE; tresult PLUGIN_API getProgramInfo (ProgramListID listId, int32 programIndex, CString attributeId /*in*/, String128 attributeValue /*out*/) SMTG_OVERRIDE; tresult PLUGIN_API hasProgramPitchNames (ProgramListID listId, int32 programIndex) SMTG_OVERRIDE; tresult PLUGIN_API getProgramPitchName (ProgramListID listId, int32 programIndex, int16 midiPitch, String128 name /*out*/) SMTG_OVERRIDE; virtual tresult setProgramName (ProgramListID listId, int32 programIndex, const String128 name /*in*/); // units selection -------------------- UnitID PLUGIN_API getSelectedUnit () SMTG_OVERRIDE { return selectedUnit; } tresult PLUGIN_API selectUnit (UnitID unitId) SMTG_OVERRIDE { selectedUnit = unitId; return kResultTrue; } tresult PLUGIN_API getUnitByBus (MediaType /*type*/, BusDirection /*dir*/, int32 /*busIndex*/, int32 /*channel*/, UnitID& /*unitId*/ /*out*/) SMTG_OVERRIDE { return kResultFalse; } tresult PLUGIN_API setUnitProgramData (int32 /*listOrUnitId*/, int32 /*programIndex*/, IBStream* /*data*/) SMTG_OVERRIDE { return kResultFalse; } /** Notifies the host about the selected Unit. */ virtual tresult notifyUnitSelection (); //---from IDependent------------------ void PLUGIN_API update (FUnknown* changedUnknown, int32 message) SMTG_OVERRIDE; //---Interface--------- OBJ_METHODS (EditControllerEx1, EditController) DEFINE_INTERFACES DEF_INTERFACE (IUnitInfo) END_DEFINE_INTERFACES (EditController) REFCOUNT_METHODS (EditController) protected: using ProgramListVector = std::vector>; using ProgramIndexMap = std::map; using UnitVector = std::vector>; UnitVector units; ProgramListVector programLists; ProgramIndexMap programIndexMap; UnitID selectedUnit {kRootUnitId}; }; //------------------------------------------------------------------------ } // namespace Vst } // namespace Steinberg