358 lines
14 KiB
C++
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
|