Files
hot-step-cpp-ROCm/engine/vendor/vst3sdk/public.sdk/source/vst/vsteditcontroller.h
T
2026-08-16 18:24:52 +07:00

358 lines
14 KiB
C++

//------------------------------------------------------------------------
// 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 <map>
#include <string>
#include <vector>
//------------------------------------------------------------------------
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<IComponentHandler> componentHandler;
IPtr<IComponentHandler2> 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<EditController> 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<std::string, std::u16string>;
using StringVector = std::vector<std::u16string>;
using ProgramInfoVector = std::vector<StringMap>;
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<int16, std::u16string>;
using PitchNamesVector = std::vector<PitchNameMap>;
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<int32> (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<IPtr<ProgramList>>;
using ProgramIndexMap = std::map<ProgramListID, ProgramListVector::size_type>;
using UnitVector = std::vector<IPtr<Unit>>;
UnitVector units;
ProgramListVector programLists;
ProgramIndexMap programIndexMap;
UnitID selectedUnit {kRootUnitId};
};
//------------------------------------------------------------------------
} // namespace Vst
} // namespace Steinberg