//-------------------------------------------------------------------------------------------------------
// VST Plug-Ins SDK
// Version 2.4       $Date: 2006/06/20 12:42:46 $
//
// Category     : VST 2.x Classes
// Filename     : audioeffectx.h
// Created by   : Steinberg Media Technologies
// Description  : Class AudioEffectX extends AudioEffect with new features. You should derive
//                your plug-in from AudioEffectX.
//
// © 2006, Steinberg Media Technologies, All Rights Reserved
//-------------------------------------------------------------------------------------------------------

#ifndef __audioeffectx__
#define __audioeffectx__

#include "audioeffect.h"    // Version 1.0 base class AudioEffect

#include "pluginterfaces/vst2.x/aeffectx.h" // Version 2.x 'C' Extensions and Structures

//-------------------------------------------------------------------------------------------------------
/** Extended VST Effect Class (VST 2.x). */
//-------------------------------------------------------------------------------------------------------
class AudioEffectX : public AudioEffect
{
public:
    AudioEffectX (audioMasterCallback audioMaster, VstInt32 numPrograms, VstInt32 numParams); ///< Create an \e AudioEffectX object

//-------------------------------------------------------------------------------------------------------
/// \name Parameters
//-------------------------------------------------------------------------------------------------------
//@{
    virtual bool canParameterBeAutomated (VstInt32 index) { return true; }          ///< Indicates if a parameter can be automated
    virtual bool string2parameter (VstInt32 index, char* text) { return false; }    ///< Convert a string representation to a parameter value
    virtual bool getParameterProperties (VstInt32 index, VstParameterProperties* p) { return false; } ///< Return parameter properties

#if VST_2_1_EXTENSIONS
    virtual bool beginEdit (VstInt32 index);  ///< To be called before #setParameterAutomated (on Mouse Down). This will be used by the Host for specific Automation Recording.
    virtual bool endEdit (VstInt32 index);    ///< To be called after #setParameterAutomated (on Mouse Up)
#endif // VST_2_1_EXTENSIONS
//@}

//-------------------------------------------------------------------------------------------------------
/// \name Programs and Persistence
//-------------------------------------------------------------------------------------------------------
//@{
    virtual bool getProgramNameIndexed (VstInt32 category, VstInt32 index, char* text) { return false; } ///< Fill \e text with name of program \e index (\e category deprecated in VST 2.4)

#if VST_2_1_EXTENSIONS
    virtual bool beginSetProgram () { return false; }   ///< Called before a program is loaded
    virtual bool endSetProgram () { return false; }     ///< Called after a program was loaded
#endif // VST_2_1_EXTENSIONS

#if VST_2_3_EXTENSIONS
    virtual VstInt32 beginLoadBank (VstPatchChunkInfo* ptr) { return 0; }       ///< Called before a Bank is loaded.
    virtual VstInt32 beginLoadProgram (VstPatchChunkInfo* ptr) { return 0; }    ///< Called before a Program is loaded. (called before #beginSetProgram).
#endif // VST_2_3_EXTENSIONS
//@}

//-------------------------------------------------------------------------------------------------------
/// \name Connections and Configuration
//-------------------------------------------------------------------------------------------------------
//@{
    virtual bool ioChanged ();              ///< Tell Host numInputs and/or numOutputs and/or initialDelay (and/or numParameters: to be avoid) have changed

    virtual double updateSampleRate ();     ///< Returns sample rate from Host (may issue setSampleRate())
    virtual VstInt32 updateBlockSize ();    ///< Returns block size from Host (may issue getBlockSize())
    virtual VstInt32 getInputLatency ();    ///< Returns the Audio (maybe ASIO) input latency values
    virtual VstInt32 getOutputLatency ();   ///< Returns the Audio (maybe ASIO) output latency values

    virtual bool getInputProperties (VstInt32 index, VstPinProperties* properties) { return false; } ///< Return the \e properties of output \e index
    virtual bool getOutputProperties (VstInt32 index, VstPinProperties* properties) { return false; }///< Return the \e properties of input \e index

    virtual bool setSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput) { return false; } ///< Set the plug-in's speaker arrangements
    virtual bool getSpeakerArrangement (VstSpeakerArrangement** pluginInput, VstSpeakerArrangement** pluginOutput) { *pluginInput = 0; *pluginOutput = 0; return false; } ///< Return the plug-in's speaker arrangements
    virtual bool setBypass (bool onOff) { return false; }               ///< For 'soft-bypass' (this could be automated (in Audio Thread) that why you could NOT call iochanged (if needed) in this function, do it in fxidle).

#if VST_2_3_EXTENSIONS
    virtual bool setPanLaw (VstInt32 type, float val) { return false; } ///< Set the Panning Law used by the Host @see VstPanLawType.
#endif // VST_2_3_EXTENSIONS

#if VST_2_4_EXTENSIONS
    virtual bool setProcessPrecision (VstInt32 precision) { return false; } ///< Set floating-point precision used for processing (32 or 64 bit)

    virtual VstInt32 getNumMidiInputChannels ()  { return 0; }              ///< Returns number of MIDI input channels used [0, 16]
    virtual VstInt32 getNumMidiOutputChannels () { return 0; }              ///< Returns number of MIDI output channels used [0, 16]
#endif // VST_2_4_EXTENSIONS
//@}

//-------------------------------------------------------------------------------------------------------
/// \name Realtime
//-------------------------------------------------------------------------------------------------------
//@{
    virtual VstTimeInfo* getTimeInfo (VstInt32 filter); ///< Get time information from Host
    virtual VstInt32 getCurrentProcessLevel ();         ///< Returns the Host's process level
    virtual VstInt32 getAutomationState ();             ///< Returns the Host's automation state

    virtual VstInt32 processEvents (VstEvents* events) { return 0; }    ///< Called when new MIDI events come in
    bool sendVstEventsToHost (VstEvents* events);                       ///< Send MIDI events back to Host application

#if VST_2_3_EXTENSIONS
    virtual VstInt32 startProcess () { return 0; }      ///< Called one time before the start of process call. This indicates that the process call will be interrupted (due to Host reconfiguration or bypass state when the plug-in doesn't support softBypass)
    virtual VstInt32 stopProcess () { return 0;}        ///< Called after the stop of process call
#endif // VST_2_3_EXTENSIONS
//@}

//-------------------------------------------------------------------------------------------------------
/// \name Variable I/O (Offline)
//-------------------------------------------------------------------------------------------------------
//@{
    virtual bool processVariableIo (VstVariableIo* varIo) { return false; }     ///< Used for variable I/O processing (offline processing like timestreching)

#if VST_2_3_EXTENSIONS
    virtual VstInt32 setTotalSampleToProcess (VstInt32 value) { return value; } ///< Called in offline mode before process() or processVariableIo ()
#endif // VST_2_3_EXTENSIONS
    //@}

//-------------------------------------------------------------------------------------------------------
/// \name Host Properties
//-------------------------------------------------------------------------------------------------------
//@{
    virtual bool getHostVendorString (char* text);  ///< Fills \e text with a string identifying the vendor
    virtual bool getHostProductString (char* text); ///< Fills \e text with a string with product name
    virtual VstInt32 getHostVendorVersion ();       ///< Returns vendor-specific version (for example 3200 for Nuendo 3.2)
    virtual VstIntPtr hostVendorSpecific (VstInt32 lArg1, VstIntPtr lArg2, void* ptrArg, float floatArg);   ///< No specific definition
    virtual VstInt32 canHostDo (char* text);        ///< Reports what the Host is able to do (#hostCanDos in audioeffectx.cpp)
    virtual VstInt32 getHostLanguage ();            ///< Returns the Host's language (#VstHostLanguage)
//@}

//-------------------------------------------------------------------------------------------------------
/// \name Plug-in Properties
//-------------------------------------------------------------------------------------------------------
//@{
    virtual void isSynth (bool state = true);       ///< Set if plug-in is a synth
    virtual void noTail (bool state = true);        ///< Plug-in won't produce output signals while there is no input
    virtual VstInt32 getGetTailSize () { return 0; }///< Returns tail size; 0 is default (return 1 for 'no tail'), used in offline processing too
    virtual void* getDirectory ();                  ///< Returns the plug-in's directory
    virtual bool getEffectName (char* name) { return false; }   ///< Fill \e text with a string identifying the effect
    virtual bool getVendorString (char* text) { return false; } ///< Fill \e text with a string identifying the vendor
    virtual bool getProductString (char* text) { return false; }///< Fill \e text with a string identifying the product name
    virtual VstInt32 getVendorVersion () { return 0; }          ///< Return vendor-specific version
    virtual VstIntPtr vendorSpecific (VstInt32 lArg, VstIntPtr lArg2, void* ptrArg, float floatArg) { return 0; } ///< No definition, vendor specific handling
    virtual VstInt32 canDo (char* text) { return 0; }           ///< Reports what the plug-in is able to do (#plugCanDos in audioeffectx.cpp)
    virtual VstInt32 getVstVersion () { return kVstVersion; }   ///< Returns the current VST Version (#kVstVersion)
    virtual VstPlugCategory getPlugCategory ();     ///< Specify a category that fits the plug (#VstPlugCategory)
//@}

//-------------------------------------------------------------------------------------------------------
/// \name MIDI Channel Programs
//-------------------------------------------------------------------------------------------------------
//@{
#if VST_2_1_EXTENSIONS
    virtual VstInt32 getMidiProgramName (VstInt32 channel, MidiProgramName* midiProgramName) { return 0; }      ///< Fill \e midiProgramName with information for 'thisProgramIndex'.
    virtual VstInt32 getCurrentMidiProgram (VstInt32 channel, MidiProgramName* currentProgram) { return -1; }   ///< Fill \e currentProgram with information for the current MIDI program.
    virtual VstInt32 getMidiProgramCategory (VstInt32 channel, MidiProgramCategory* category) { return 0; }     ///< Fill \e category with information for 'thisCategoryIndex'.
    virtual bool hasMidiProgramsChanged (VstInt32 channel) { return false; } ///< Return true if the #MidiProgramNames, #MidiKeyNames or #MidiControllerNames had changed on this MIDI channel.
    virtual bool getMidiKeyName (VstInt32 channel, MidiKeyName* keyName) { return false; } ///< Fill \e keyName with information for 'thisProgramIndex' and 'thisKeyNumber'
#endif // VST_2_1_EXTENSIONS
//@}

//-------------------------------------------------------------------------------------------------------
/// \name Others
//-------------------------------------------------------------------------------------------------------
//@{
    virtual bool updateDisplay (); ///< Something has changed in plug-in, request an update display like program (MIDI too) and parameters list in Host
    virtual bool sizeWindow (VstInt32 width, VstInt32 height);  ///< Requests to resize the editor window

#if VST_2_1_EXTENSIONS
    virtual bool openFileSelector (VstFileSelect* ptr);         ///< Open a Host File selector (see aeffectx.h for #VstFileSelect definition)
#endif // VST_2_1_EXTENSIONS

#if VST_2_2_EXTENSIONS
    virtual bool closeFileSelector (VstFileSelect* ptr);        ///< Close the Host File selector which was opened by #openFileSelector
#endif // VST_2_2_EXTENSIONS

#if VST_2_3_EXTENSIONS
    virtual VstInt32 getNextShellPlugin (char* name) { return 0; }   ///< This opcode is only called, if the plug-in is of type #kPlugCategShell, in order to extract all included sub-plugin´s names.
#endif // VST_2_3_EXTENSIONS
//@}

//-------------------------------------------------------------------------------------------------------
/// \name Tools
//-------------------------------------------------------------------------------------------------------
//@{
#if VST_2_3_EXTENSIONS
    virtual bool allocateArrangement (VstSpeakerArrangement** arrangement, VstInt32 nbChannels);///< Allocate memory for a #VstSpeakerArrangement
    virtual bool deallocateArrangement (VstSpeakerArrangement** arrangement);           ///< Delete/free memory for an allocated speaker arrangement
    virtual bool copySpeaker (VstSpeakerProperties* to, VstSpeakerProperties* from);    ///< Copy properties \e from to \e to
    virtual bool matchArrangement (VstSpeakerArrangement** to, VstSpeakerArrangement* from);    ///< "to" is deleted, then created and initialized with the same values as "from" ones ("from" must exist).
#endif // VST_2_3_EXTENSIONS
//@}

//-------------------------------------------------------------------------------------------------------
// Offline
//-------------------------------------------------------------------------------------------------------
/// @cond ignore
    virtual bool offlineRead (VstOfflineTask* offline, VstOfflineOption option, bool readSource = true);
    virtual bool offlineWrite (VstOfflineTask* offline, VstOfflineOption option);
    virtual bool offlineStart (VstAudioFile* ptr, VstInt32 numAudioFiles, VstInt32 numNewAudioFiles);
    virtual VstInt32 offlineGetCurrentPass ();
    virtual VstInt32 offlineGetCurrentMetaPass ();
    virtual bool offlineNotify (VstAudioFile* ptr, VstInt32 numAudioFiles, bool start) { return false; }
    virtual bool offlinePrepare (VstOfflineTask* offline, VstInt32 count) { return false; }
    virtual bool offlineRun (VstOfflineTask* offline, VstInt32 count) { return false; }
    virtual VstInt32 offlineGetNumPasses () { return 0; }
    virtual VstInt32 offlineGetNumMetaPasses () { return 0; }

//-------------------------------------------------------------------------------------------------------
// AudioEffect overrides
//-------------------------------------------------------------------------------------------------------
    virtual VstIntPtr dispatcher (VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt);
    virtual void resume ();

//-------------------------------------------------------------------------------------------------------
// Deprecated methods
//-------------------------------------------------------------------------------------------------------
    virtual void DECLARE_VST_DEPRECATED (wantEvents) (VstInt32 filter = 1);
    virtual VstInt32 DECLARE_VST_DEPRECATED (tempoAt) (VstInt32 pos);
    virtual VstInt32 DECLARE_VST_DEPRECATED (getNumAutomatableParameters) ();
    virtual VstInt32 DECLARE_VST_DEPRECATED (getParameterQuantization) ();
    virtual VstInt32 DECLARE_VST_DEPRECATED (getNumCategories) () { return 1L; }
    virtual bool DECLARE_VST_DEPRECATED (copyProgram) (VstInt32 destination) { return false; }
    virtual bool DECLARE_VST_DEPRECATED (needIdle) ();
    virtual AEffect* DECLARE_VST_DEPRECATED (getPreviousPlug) (VstInt32 input);
    virtual AEffect* DECLARE_VST_DEPRECATED (getNextPlug) (VstInt32 output);
    virtual void DECLARE_VST_DEPRECATED (inputConnected) (VstInt32 index, bool state) {}
    virtual void DECLARE_VST_DEPRECATED (outputConnected) (VstInt32 index, bool state) {}
    virtual VstInt32 DECLARE_VST_DEPRECATED (willProcessReplacing) ();
    virtual void DECLARE_VST_DEPRECATED (wantAsyncOperation) (bool state = true);
    virtual void DECLARE_VST_DEPRECATED (hasExternalBuffer) (bool state = true);
    virtual VstInt32 DECLARE_VST_DEPRECATED (reportCurrentPosition) () { return 0; }
    virtual float* DECLARE_VST_DEPRECATED (reportDestinationBuffer) () { return 0; }
    virtual void DECLARE_VST_DEPRECATED (setOutputSamplerate) (float samplerate);
    virtual VstSpeakerArrangement* DECLARE_VST_DEPRECATED (getInputSpeakerArrangement) ();
    virtual VstSpeakerArrangement* DECLARE_VST_DEPRECATED (getOutputSpeakerArrangement) ();
    virtual void* DECLARE_VST_DEPRECATED (openWindow) (DECLARE_VST_DEPRECATED (VstWindow)*);
    virtual bool DECLARE_VST_DEPRECATED (closeWindow) (DECLARE_VST_DEPRECATED (VstWindow)*);
    virtual void DECLARE_VST_DEPRECATED (setBlockSizeAndSampleRate) (VstInt32 _blockSize, float _sampleRate) { blockSize = _blockSize; sampleRate = _sampleRate; }
    virtual bool DECLARE_VST_DEPRECATED (getErrorText) (char* text) { return false; }
    virtual void* DECLARE_VST_DEPRECATED (getIcon) () { return 0; }
    virtual bool DECLARE_VST_DEPRECATED (setViewPosition) (VstInt32 x, VstInt32 y) { return false; }
    virtual VstInt32 DECLARE_VST_DEPRECATED (fxIdle) () { return 0; }
    virtual bool DECLARE_VST_DEPRECATED (keysRequired) () { return false; }

#if VST_2_2_EXTENSIONS
    virtual bool DECLARE_VST_DEPRECATED (getChunkFile) (void* nativePath);      ///< Returns in platform format the path of the current chunk (could be called in #setChunk ()) (FSSpec on MAC else char*)
#endif // VST_2_2_EXTENSIONS
/// @endcond
//-------------------------------------------------------------------------------------------------------
};

#endif //__audioeffectx__
