fmodex/fmod/lib/vst/aeffectx.h

1004 lines
33 KiB
C
Executable file

//-------------------------------------------------------------------------------------------------------
// VST Plug-Ins SDK
// Version 2.3 Extension
// © 2003, Steinberg Media Technologies, All Rights Reserved
//-------------------------------------------------------------------------------------------------------
#ifndef __aeffectx__
#define __aeffectx__
#ifndef __AEffect__
#include "AEffect.h"
#endif
#include <string.h> // for strcpy
#if PRAGMA_STRUCT_ALIGN || __MWERKS__
#pragma options align=mac68k
#elif defined __BORLANDC__
#pragma -a8
#elif defined(WIN32) || defined(__FLAT__)
#pragma pack(push)
#pragma pack(8)
#endif
//-------------------------------------------------
// VstEvent
//-------------------------------------------------
typedef struct VstEvent VstEvent;
typedef struct VstMidiEvent VstMidiEvent;
typedef struct VstEvents VstEvents;
struct VstEvent // a generic timestamped event
{
long type; // see enum below
long byteSize; // of this event, excl. type and byteSize
long deltaFrames; // sample frames related to the current block start sample position
long flags; // generic flags, none defined yet (0)
char data[16]; // size may vary but is usually 16
};
//----VstEvent Types-------------------------------
enum
{
kVstMidiType = 1, // midi event, can be cast as VstMidiEvent (see below)
kVstAudioType, // audio
kVstVideoType, // video
kVstParameterType, // parameter
kVstTriggerType, // trigger
kVstSysExType // midi system exclusive
// ...etc
};
struct VstEvents // a block of events for the current audio block
{
long numEvents;
long reserved; // zero
VstEvent* events[2]; // variable
};
//---Defined Events--------------------------------
struct VstMidiEvent // to be casted from a VstEvent
{
long type; // kVstMidiType
long byteSize; // 24
long deltaFrames; // sample frames related to the current block start sample position
long flags; // none defined yet
long noteLength; // (in sample frames) of entire note, if available, else 0
long noteOffset; // offset into note from note start if available, else 0
char midiData[4]; // 1 thru 3 midi bytes; midiData[3] is reserved (zero)
char detune; // -64 to +63 cents; for scales other than 'well-tempered' ('microtuning')
char noteOffVelocity;
char reserved1; // zero
char reserved2; // zero
};
//-------------------------------------------------
// VstTimeInfo
//-------------------------------------------------
typedef struct VstTimeInfo VstTimeInfo;
// VstTimeInfo as requested via audioMasterGetTime (getTimeInfo())
// refers to the current time slice. note the new slice is
// already started when processEvents() is called
struct VstTimeInfo
{
double samplePos; // current location
double sampleRate;
double nanoSeconds; // system time
double ppqPos; // 1 ppq
double tempo; // in bpm
double barStartPos; // last bar start, in 1 ppq
double cycleStartPos; // 1 ppq
double cycleEndPos; // 1 ppq
long timeSigNumerator; // time signature
long timeSigDenominator;
long smpteOffset;
long smpteFrameRate; // 0:24, 1:25, 2:29.97, 3:30, 4:29.97 df, 5:30 df
long samplesToNextClock; // midi clock resolution (24 ppq), can be negative
long flags; // see below
};
enum
{
kVstTransportChanged = 1, // Indicates that Playing, Cycle or Recording has changed
kVstTransportPlaying = 1 << 1,
kVstTransportCycleActive = 1 << 2,
kVstTransportRecording = 1 << 3,
kVstAutomationWriting = 1 << 6,
kVstAutomationReading = 1 << 7,
// flags which indicate which of the fields in this VstTimeInfo
// are valid; samplePos and sampleRate are always valid
kVstNanosValid = 1 << 8,
kVstPpqPosValid = 1 << 9,
kVstTempoValid = 1 << 10,
kVstBarsValid = 1 << 11,
kVstCyclePosValid = 1 << 12, // start and end
kVstTimeSigValid = 1 << 13,
kVstSmpteValid = 1 << 14,
kVstClockValid = 1 << 15
};
//-------------------------------------------------
// Variable IO for Offline Processing
//-------------------------------------------------
typedef struct VstVariableIo VstVariableIo;
struct VstVariableIo
{
float **inputs;
float **outputs;
long numSamplesInput;
long numSamplesOutput;
long *numSamplesInputProcessed;
long *numSamplesOutputProcessed;
};
//-------------------------------------------------
// AudioMaster OpCodes
//-------------------------------------------------
enum
{
//---from here VST 2.0 extension opcodes------------------------------------------------------
// VstEvents + VstTimeInfo
audioMasterWantMidi = audioMasterPinConnected + 2, // <value> is a filter which is currently ignored
audioMasterGetTime, // returns const VstTimeInfo* (or 0 if not supported)
// <value> should contain a mask indicating which fields are required
// (see valid masks above), as some items may require extensive
// conversions
audioMasterProcessEvents, // VstEvents* in <ptr>
audioMasterSetTime, // VstTimenfo* in <ptr>, filter in <value>, not supported
audioMasterTempoAt, // returns tempo (in bpm * 10000) at sample frame location passed in <value>
// parameters
audioMasterGetNumAutomatableParameters,
audioMasterGetParameterQuantization, // returns the integer value for +1.0 representation,
// or 1 if full single float precision is maintained
// in automation. parameter index in <value> (-1: all, any)
// connections, configuration
audioMasterIOChanged, // numInputs and/or numOutputs has changed
audioMasterNeedIdle, // plug needs idle calls (outside its editor window)
audioMasterSizeWindow, // index: width, value: height
audioMasterGetSampleRate,
audioMasterGetBlockSize,
audioMasterGetInputLatency,
audioMasterGetOutputLatency,
audioMasterGetPreviousPlug, // input pin in <value> (-1: first to come), returns cEffect*
audioMasterGetNextPlug, // output pin in <value> (-1: first to come), returns cEffect*
// realtime info
audioMasterWillReplaceOrAccumulate, // returns: 0: not supported, 1: replace, 2: accumulate
audioMasterGetCurrentProcessLevel, // returns: 0: not supported,
// 1: currently in user thread (gui)
// 2: currently in audio thread (where process is called)
// 3: currently in 'sequencer' thread (midi, timer etc)
// 4: currently offline processing and thus in user thread
// other: not defined, but probably pre-empting user thread.
audioMasterGetAutomationState, // returns 0: not supported, 1: off, 2:read, 3:write, 4:read/write
// offline
audioMasterOfflineStart,
audioMasterOfflineRead, // ptr points to offline structure, see below. return 0: error, 1 ok
audioMasterOfflineWrite, // same as read
audioMasterOfflineGetCurrentPass,
audioMasterOfflineGetCurrentMetaPass,
// other
audioMasterSetOutputSampleRate, // for variable i/o, sample rate in <opt>
audioMasterGetSpeakerArrangement, // result in ret
audioMasterGetOutputSpeakerArrangement = audioMasterGetSpeakerArrangement,
audioMasterGetVendorString, // fills <ptr> with a string identifying the vendor (max 64 char)
audioMasterGetProductString, // fills <ptr> with a string with product name (max 64 char)
audioMasterGetVendorVersion, // returns vendor-specific version
audioMasterVendorSpecific, // no definition, vendor specific handling
audioMasterSetIcon, // void* in <ptr>, format not defined yet
audioMasterCanDo, // string in ptr, see below
audioMasterGetLanguage, // see enum
audioMasterOpenWindow, // returns platform specific ptr
audioMasterCloseWindow, // close window, platform specific handle in <ptr>
audioMasterGetDirectory, // get plug directory, FSSpec on MAC, else char*
audioMasterUpdateDisplay, // something has changed, update 'multi-fx' display
//---from here VST 2.1 extension opcodes------------------------------------------------------
audioMasterBeginEdit, // begin of automation session (when mouse down), parameter index in <index>
audioMasterEndEdit, // end of automation session (when mouse up), parameter index in <index>
audioMasterOpenFileSelector, // open a fileselector window with VstFileSelect* in <ptr>
//---from here VST 2.2 extension opcodes------------------------------------------------------
audioMasterCloseFileSelector, // close a fileselector operation with VstFileSelect* in <ptr>: Must be always called after an open !
audioMasterEditFile, // open an editor for audio (defined by XML text in ptr)
audioMasterGetChunkFile, // get the native path of currently loading bank or project
// (called from writeChunk) void* in <ptr> (char[2048], or sizeof(FSSpec))
//---from here VST 2.3 extension opcodes------------------------------------------------------
audioMasterGetInputSpeakerArrangement // result a VstSpeakerArrangement in ret
};
//-------------------------------------------------
// Language
//-------------------------------------------------
enum VstHostLanguage
{
kVstLangEnglish = 1,
kVstLangGerman,
kVstLangFrench,
kVstLangItalian,
kVstLangSpanish,
kVstLangJapanese
};
//-------------------------------------------------
// Dispatcher OpCodes
//-------------------------------------------------
enum
{
//---from here VST 2.0 extension opcodes---------------------------------------------------------
// VstEvents
effProcessEvents = effSetChunk + 1, // VstEvents* in <ptr>
// parameters and programs
effCanBeAutomated, // parameter index in <index>
effString2Parameter, // parameter index in <index>, string in <ptr>
effGetNumProgramCategories, // no arguments. this is for dividing programs into groups (like GM)
effGetProgramNameIndexed, // get program name of category <value>, program <index> into <ptr>.
// category (that is, <value>) may be -1, in which case program indices
// are enumerated linearily (as usual); otherwise, each category starts
// over with index 0.
effCopyProgram, // copy current program to destination <index>
// note: implies setParameter
// connections, configuration
effConnectInput, // input at <index> has been (dis-)connected;
// <value> == 0: disconnected, else connected
effConnectOutput, // same as input
effGetInputProperties, // <index>, VstPinProperties* in ptr, return != 0 => true
effGetOutputProperties, // dto
effGetPlugCategory, // no parameter, return value is category
// realtime
effGetCurrentPosition, // for external dsp, see flag bits below
effGetDestinationBuffer, // for external dsp, see flag bits below. returns float*
// offline
effOfflineNotify, // ptr = VstAudioFile array, value = count, index = start flag
effOfflinePrepare, // ptr = VstOfflineTask array, value = count
effOfflineRun, // dto
// other
effProcessVarIo, // VstVariableIo* in <ptr>
effSetSpeakerArrangement, // VstSpeakerArrangement* pluginInput in <value>
// VstSpeakerArrangement* pluginOutput in <ptr>
effSetBlockSizeAndSampleRate, // block size in <value>, sampleRate in <opt>
effSetBypass, // onOff in <value> (0 = off)
effGetEffectName, // char* name (max 32 bytes) in <ptr>
effGetErrorText, // char* text (max 256 bytes) in <ptr>
effGetVendorString, // fills <ptr> with a string identifying the vendor (max 64 char)
effGetProductString, // fills <ptr> with a string with product name (max 64 char)
effGetVendorVersion, // returns vendor-specific version
effVendorSpecific, // no definition, vendor specific handling
effCanDo, // <ptr>
effGetTailSize, // returns tail size; 0 is default (return 1 for 'no tail')
effIdle, // idle call in response to audioMasterneedIdle. must
// return 1 to keep idle calls beeing issued
// gui
effGetIcon, // void* in <ptr>, not yet defined
effSetViewPosition, // set view position (in window) to x <index> y <value>
// and...
effGetParameterProperties, // of param <index>, VstParameterProperties* in <ptr>
effKeysRequired, // returns 0: needs keys (default for 1.0 plugs), 1: don't need
effGetVstVersion, // returns 2 for VST 2; older versions return 0; 2100 for VST 2.1
effNumV2Opcodes,
// note that effNumOpcodes doesn't apply anymore
//---from here VST 2.1 extension opcodes---------------------------------------------------------
effEditKeyDown = effNumV2Opcodes, // Character in <index>, virtual in <value>, modifiers in <opt>,
// return -1 if not used, return 1 if used
effEditKeyUp, // Character in <index>, virtual in <value>, modifiers in <opt>
// return -1 if not used, return 1 if used
effSetEditKnobMode, // Mode in <value>: 0: circular, 1:circular relativ, 2:linear
// midi plugins channeldependent programs
effGetMidiProgramName, // Passed <ptr> points to MidiProgramName struct.
// struct will be filled with information for 'thisProgramIndex'.
// returns number of used programIndexes.
// if 0 is returned, no MidiProgramNames supported.
effGetCurrentMidiProgram, // Returns the programIndex of the current program.
// passed <ptr> points to MidiProgramName struct.
// struct will be filled with information for the current program.
effGetMidiProgramCategory, // Passed <ptr> points to MidiProgramCategory struct.
// struct will be filled with information for 'thisCategoryIndex'.
// returns number of used categoryIndexes.
// if 0 is returned, no MidiProgramCategories supported.
effHasMidiProgramsChanged, // Returns 1 if the MidiProgramNames or MidiKeyNames
// had changed on this channel, 0 otherwise. <ptr> ignored.
effGetMidiKeyName, // Passed <ptr> points to MidiKeyName struct.
// struct will be filled with information for 'thisProgramIndex' and
// 'thisKeyNumber'. If keyName is "" the standard name of the key
// will be displayed. If 0 is returned, no MidiKeyNames are
// defined for 'thisProgramIndex'.
effBeginSetProgram, // Called before a new program is loaded
effEndSetProgram, // Called when the program is loaded
effNumV2_1Opcodes,
//---from here VST 2.3 extension opcodes---------------------------------------------------------
effGetSpeakerArrangement = effNumV2_1Opcodes, // VstSpeakerArrangement** pluginInput in <value>
// VstSpeakerArrangement** pluginOutput in <ptr>
effShellGetNextPlugin, // This opcode is only called, if plugin is of type kPlugCategShell.
// returns the next plugin's uniqueID.
// <ptr> points to a char buffer of size 64, which is to be filled
// with the name of the plugin including the terminating zero.
effStartProcess, // Called before the start of process call
effStopProcess, // Called after the stop of process call
effSetTotalSampleToProcess, // Called in offline (non RealTime) Process before process is called, indicates how many sample will be processed
effSetPanLaw, // PanLaw : Type (Linear, Equal Power,.. see enum PanLaw Type) in <value>,
// Gain in <opt>: for Linear : [1.0 => 0dB PanLaw], [~0.58 => -4.5dB], [0.5 => -6.02dB]
effBeginLoadBank, // Called before a Bank is loaded, <ptr> points to VstPatchChunkInfo structure
// return -1 if the Bank can not be loaded, return 1 if it can be loaded else 0 (for compatibility)
effBeginLoadProgram, // Called before a Program is loaded, <ptr> points to VstPatchChunkInfo structure
// return -1 if the Program can not be loaded, return 1 if it can be loaded else 0 (for compatibility)
effNumV2_3Opcodes
};
//-------------------------------------------------
// Parameter Properties
//-------------------------------------------------
typedef struct VstParameterProperties VstParameterProperties;
struct VstParameterProperties
{
float stepFloat;
float smallStepFloat;
float largeStepFloat;
char label[64];
long flags; // see below
long minInteger;
long maxInteger;
long stepInteger;
long largeStepInteger;
char shortLabel[8]; // recommended: 6 + delimiter
// the following are for remote controller display purposes.
// note that the kVstParameterSupportsDisplayIndex flag must be set.
// host can scan all parameters, and find out in what order
// to display them:
short displayIndex; // for remote controllers, the index where this parameter
// should be displayed (starting with 0)
// host can also possibly display the parameter group (category), such as
// ---------------------------
// Osc 1
// Wave Detune Octave Mod
// ---------------------------
// if the plug supports it (flag kVstParameterSupportsDisplayCategory)
short category; // 0: no category, else group index + 1
short numParametersInCategory;
short reserved;
char categoryLabel[24]; // for instance, "Osc 1"
char future[16];
};
//---Parameter Properties Flags--------------------
enum
{
kVstParameterIsSwitch = 1 << 0,
kVstParameterUsesIntegerMinMax = 1 << 1,
kVstParameterUsesFloatStep = 1 << 2,
kVstParameterUsesIntStep = 1 << 3,
kVstParameterSupportsDisplayIndex = 1 << 4,
kVstParameterSupportsDisplayCategory = 1 << 5,
kVstParameterCanRamp = 1 << 6
};
//-------------------------------------------------
// Pin Properties
//-------------------------------------------------
typedef struct VstPinProperties VstPinProperties;
struct VstPinProperties
{
char label[64];
long flags; // see pin properties flags
long arrangementType;
char shortLabel[8]; // recommended: 6 + delimiter
char future[48];
};
//---Pin Properties Flags--------------------------
enum
{
kVstPinIsActive = 1 << 0,
kVstPinIsStereo = 1 << 1,
kVstPinUseSpeaker = 1 << 2
};
//-------------------------------------------------
// Plugin Category
//-------------------------------------------------
enum VstPlugCategory
{
kPlugCategUnknown = 0,
kPlugCategEffect,
kPlugCategSynth,
kPlugCategAnalysis,
kPlugCategMastering,
kPlugCategSpacializer, // 'panners'
kPlugCategRoomFx, // delays and reverbs
kPlugSurroundFx, // dedicated surround processor
kPlugCategRestoration,
kPlugCategOfflineProcess,
kPlugCategShell, // plugin which is only a container of plugins.
kPlugCategGenerator
};
//-------------------------------------------------
// Midi Plugins Channel Dependent Programs
//-------------------------------------------------
typedef struct MidiProgramName MidiProgramName;
typedef struct MidiProgramCategory MidiProgramCategory;
typedef struct MidiKeyName MidiKeyName;
struct MidiProgramName
{
long thisProgramIndex; // >= 0. fill struct for this program index.
char name[64];
char midiProgram; // -1:off, 0-127
char midiBankMsb; // -1:off, 0-127
char midiBankLsb; // -1:off, 0-127
char reserved; // zero
long parentCategoryIndex; // -1:no parent category
long flags; // omni etc, see below
};
//---MidiProgramName Flags-------------------------
enum
{
kMidiIsOmni = 1 // default is multi. for omni mode, channel 0
// is used for inquiries and program changes
};
//---MidiProgramName-------------------------------
struct MidiProgramCategory
{
long thisCategoryIndex; // >= 0. fill struct for this category index.
char name[64];
long parentCategoryIndex; // -1:no parent category
long flags; // reserved, none defined yet, zero.
};
//---MidiKeyName-----------------------------------
struct MidiKeyName
{
long thisProgramIndex; // >= 0. fill struct for this program index.
long thisKeyNumber; // 0 - 127. fill struct for this key number.
char keyName[64];
long reserved; // zero
long flags; // reserved, none defined yet, zero.
};
//-------------------------------------------------
// Flags Bits
//-------------------------------------------------
enum
{
effFlagsIsSynth = 1 << 8, // host may assign mixer channels for its outputs
effFlagsNoSoundInStop = 1 << 9, // does not produce sound when input is all silence
effFlagsExtIsAsync = 1 << 10, // for external dsp; plug returns immedeately from process()
// host polls plug position (current block) via effGetCurrentPosition
effFlagsExtHasBuffer = 1 << 11 // external dsp, may have their own output buffe (32 bit float)
// host then requests this via effGetDestinationBuffer
};
//-------------------------------------------------
// Surround Setup
//-------------------------------------------------
typedef struct VstSpeakerProperties VstSpeakerProperties;
typedef struct VstSpeakerArrangement VstSpeakerArrangement;
//---Speaker Properties----------------------------
struct VstSpeakerProperties
{ // units: range: except:
float azimuth; // rad -PI...PI 10.f for LFE channel
float elevation; // rad -PI/2...PI/2 10.f for LFE channel
float radius; // meter 0.f for LFE channel
float reserved; // 0.
char name[64]; // for new setups, new names should be given (L/R/C... won't do)
long type; // speaker type
char future[28];
};
// note: the origin for azimuth is right (as by math conventions dealing with radians);
// the elevation origin is also right, visualizing a rotation of a circle across the
// -pi/pi axis of the horizontal circle. thus, an elevation of -pi/2 corresponds
// to bottom, and a speaker standing on the left, and 'beaming' upwards would have
// an azimuth of -pi, and an elevation of pi/2.
// for user interface representation, grads are more likely to be used, and the
// origins will obviously 'shift' accordingly.
//---Speaker Arrangement---------------------------
struct VstSpeakerArrangement
{
long type; // (was float lfeGain; // LFE channel gain is adjusted [dB] higher than other channels)
long numChannels; // number of channels in this speaker arrangement
VstSpeakerProperties speakers[8]; // variable
};
//---Speaker Types---------------------------------
enum
{
kSpeakerUndefined = 0x7fffffff, // Undefinded
kSpeakerM = 0, // Mono (M)
kSpeakerL, // Left (L)
kSpeakerR, // Right (R)
kSpeakerC, // Center (C)
kSpeakerLfe, // Subbass (Lfe)
kSpeakerLs, // Left Surround (Ls)
kSpeakerRs, // Right Surround (Rs)
kSpeakerLc, // Left of Center (Lc)
kSpeakerRc, // Right of Center (Rc)
kSpeakerS, // Surround (S)
kSpeakerCs = kSpeakerS, // Center of Surround (Cs) = Surround (S)
kSpeakerSl, // Side Left (Sl)
kSpeakerSr, // Side Right (Sr)
kSpeakerTm, // Top Middle (Tm)
kSpeakerTfl, // Top Front Left (Tfl)
kSpeakerTfc, // Top Front Center (Tfc)
kSpeakerTfr, // Top Front Right (Tfr)
kSpeakerTrl, // Top Rear Left (Trl)
kSpeakerTrc, // Top Rear Center (Trc)
kSpeakerTrr, // Top Rear Right (Trr)
kSpeakerLfe2 // Subbass 2 (Lfe2)
};
// user-defined speaker types (to be extended in the negative range)
// (will be handled as their corresponding speaker types with abs values:
// e.g abs(kSpeakerU1) == kSpeakerL, abs(kSpeakerU2) == kSpeakerR)
enum
{
kSpeakerU32 = -32,
kSpeakerU31,
kSpeakerU30,
kSpeakerU29,
kSpeakerU28,
kSpeakerU27,
kSpeakerU26,
kSpeakerU25,
kSpeakerU24,
kSpeakerU23,
kSpeakerU22,
kSpeakerU21,
kSpeakerU20, // == kSpeakerLfe2
kSpeakerU19, // == kSpeakerTrr
kSpeakerU18, // == kSpeakerTrc
kSpeakerU17, // == kSpeakerTrl
kSpeakerU16, // == kSpeakerTfr
kSpeakerU15, // == kSpeakerTfc
kSpeakerU14, // == kSpeakerTfl
kSpeakerU13, // == kSpeakerTm
kSpeakerU12, // == kSpeakerSr
kSpeakerU11, // == kSpeakerSl
kSpeakerU10, // == kSpeakerCs
kSpeakerU9, // == kSpeakerS
kSpeakerU8, // == kSpeakerRc
kSpeakerU7, // == kSpeakerLc
kSpeakerU6, // == kSpeakerRs
kSpeakerU5, // == kSpeakerLs
kSpeakerU4, // == kSpeakerLfe
kSpeakerU3, // == kSpeakerC
kSpeakerU2, // == kSpeakerR
kSpeakerU1 // == kSpeakerL
};
//---Speaker Arrangement Types---------------------
enum
{
kSpeakerArrUserDefined = -2,
kSpeakerArrEmpty = -1,
kSpeakerArrMono = 0, // M
kSpeakerArrStereo, // L R
kSpeakerArrStereoSurround, // Ls Rs
kSpeakerArrStereoCenter, // Lc Rc
kSpeakerArrStereoSide, // Sl Sr
kSpeakerArrStereoCLfe, // C Lfe
kSpeakerArr30Cine, // L R C
kSpeakerArr30Music, // L R S
kSpeakerArr31Cine, // L R C Lfe
kSpeakerArr31Music, // L R Lfe S
kSpeakerArr40Cine, // L R C S (LCRS)
kSpeakerArr40Music, // L R Ls Rs (Quadro)
kSpeakerArr41Cine, // L R C Lfe S (LCRS+Lfe)
kSpeakerArr41Music, // L R Lfe Ls Rs (Quadro+Lfe)
kSpeakerArr50, // L R C Ls Rs
kSpeakerArr51, // L R C Lfe Ls Rs
kSpeakerArr60Cine, // L R C Ls Rs Cs
kSpeakerArr60Music, // L R Ls Rs Sl Sr
kSpeakerArr61Cine, // L R C Lfe Ls Rs Cs
kSpeakerArr61Music, // L R Lfe Ls Rs Sl Sr
kSpeakerArr70Cine, // L R C Ls Rs Lc Rc
kSpeakerArr70Music, // L R C Ls Rs Sl Sr
kSpeakerArr71Cine, // L R C Lfe Ls Rs Lc Rc
kSpeakerArr71Music, // L R C Lfe Ls Rs Sl Sr
kSpeakerArr80Cine, // L R C Ls Rs Lc Rc Cs
kSpeakerArr80Music, // L R C Ls Rs Cs Sl Sr
kSpeakerArr81Cine, // L R C Lfe Ls Rs Lc Rc Cs
kSpeakerArr81Music, // L R C Lfe Ls Rs Cs Sl Sr
kSpeakerArr102, // L R C Lfe Ls Rs Tfl Tfc Tfr Trl Trr Lfe2
kNumSpeakerArr
};
//-------------------------------------------------
// Offline Processing
//-------------------------------------------------
typedef struct VstOfflineTask VstOfflineTask;
typedef struct VstAudioFile VstAudioFile;
typedef struct VstAudioFileMarker VstAudioFileMarker;
struct VstOfflineTask
{
char processName[96]; // set by plug
// audio access
double readPosition; // set by plug/host
double writePosition; // set by plug/host
long readCount; // set by plug/host
long writeCount; // set by plug
long sizeInputBuffer; // set by host
long sizeOutputBuffer; // set by host
void* inputBuffer; // set by host
void* outputBuffer; // set by host
double positionToProcessFrom; // set by host
double numFramesToProcess; // set by host
double maxFramesToWrite; // set by plug
// other data access
void* extraBuffer; // set by plug
long value; // set by host or plug
long index; // set by host or plug
// file attributes
double numFramesInSourceFile; // set by host
double sourceSampleRate; // set by host or plug
double destinationSampleRate; // set by host or plug
long numSourceChannels; // set by host or plug
long numDestinationChannels; // set by host or plug
long sourceFormat; // set by host
long destinationFormat; // set by plug
char outputText[512]; // set by plug or host
// progress notification
double progress; // set by plug
long progressMode; // reserved for future
char progressText[100]; // set by plug
long flags; // set by host and plug; see VstOfflineTaskFlags
long returnValue; // reserved for future
void* hostOwned; // set by host
void* plugOwned; // set by plug
char future[1024];
};
//---VstOfflineTask Flags--------------------------
enum VstOfflineTaskFlags
{
// set by host
kVstOfflineUnvalidParameter = 1 << 0,
kVstOfflineNewFile = 1 << 1,
// set by plug
kVstOfflinePlugError = 1 << 10,
kVstOfflineInterleavedAudio = 1 << 11,
kVstOfflineTempOutputFile = 1 << 12,
kVstOfflineFloatOutputFile = 1 << 13,
kVstOfflineRandomWrite = 1 << 14,
kVstOfflineStretch = 1 << 15,
kVstOfflineNoThread = 1 << 16
};
//---Option passed to offlineRead/offlineWrite-----
enum VstOfflineOption
{
kVstOfflineAudio, // reading/writing audio samples
kVstOfflinePeaks, // reading graphic representation
kVstOfflineParameter, // reading/writing parameters
kVstOfflineMarker, // reading/writing marker
kVstOfflineCursor, // reading/moving edit cursor
kVstOfflineSelection, // reading/changing selection
kVstOfflineQueryFiles // to request the host to call asynchronously offlineNotify
};
//---Structure passed to offlineNotify and offlineStart
struct VstAudioFile
{
long flags; // see enum VstAudioFileFlags
void* hostOwned; // any data private to host
void* plugOwned; // any data private to plugin
char name[100]; // file title
long uniqueId; // uniquely identify a file during a session
double sampleRate; // file sample rate
long numChannels; // number of channels (1 for mono, 2 for stereo...)
double numFrames; // number of frames in the audio file
long format; // reserved for future
double editCursorPosition; // -1 if no such cursor
double selectionStart; // frame index of first selected frame, or -1
double selectionSize; // number of frames in selection, or 0
long selectedChannelsMask; // 1 bit per channel
long numMarkers; // number of markers in the file
long timeRulerUnit; // see doc for possible values
double timeRulerOffset; // offset in time ruler (positive or negative)
double tempo; // as bpm
long timeSigNumerator; // time signature numerator
long timeSigDenominator; // time signature denominator
long ticksPerBlackNote; // resolution
long smpteFrameRate; // smpte rate (set as in VstTimeInfo)
char future[64];
};
//---VstAudioFile Flags----------------------------
enum VstAudioFileFlags
{
// set by host (in call offlineNotify)
kVstOfflineReadOnly = 1 << 0,
kVstOfflineNoRateConversion = 1 << 1,
kVstOfflineNoChannelChange = 1 << 2,
// Set by plug (in function offlineStart)
kVstOfflineCanProcessSelection = 1 << 10,
kVstOfflineNoCrossfade = 1 << 11,
kVstOfflineWantRead = 1 << 12,
kVstOfflineWantWrite = 1 << 13,
kVstOfflineWantWriteMarker = 1 << 14,
kVstOfflineWantMoveCursor = 1 << 15,
kVstOfflineWantSelect = 1 << 16
};
//---VstAudioFileMarker----------------------------
struct VstAudioFileMarker
{
double position;
char name[32];
long type;
long id;
long reserved;
};
//-------------------------------------------------
// Others
//-------------------------------------------------
//---Structure used for openWindow and closeWindow
struct VstWindow
{
char title[128]; // title
short xPos; // position and size
short yPos;
short width;
short height;
long style; // 0: with title, 1: without title
void *parent; // parent of this window
void *userHandle; // reserved
void *winHandle; // reserved
char future[104];
};
//---Structure and enum used for keyUp/keyDown-----
struct VstKeyCode
{
long character;
unsigned char virt; // see enum VstVirtualKey
unsigned char modifier; // see enum VstModifierKey
};
//---Used by member virt of VstKeyCode-------------
enum VstVirtualKey
{
VKEY_BACK = 1,
VKEY_TAB,
VKEY_CLEAR,
VKEY_RETURN,
VKEY_PAUSE,
VKEY_ESCAPE,
VKEY_SPACE,
VKEY_NEXT,
VKEY_END,
VKEY_HOME,
VKEY_LEFT,
VKEY_UP,
VKEY_RIGHT,
VKEY_DOWN,
VKEY_PAGEUP,
VKEY_PAGEDOWN,
VKEY_SELECT,
VKEY_PRINT,
VKEY_ENTER,
VKEY_SNAPSHOT,
VKEY_INSERT,
VKEY_DELETE,
VKEY_HELP,
VKEY_NUMPAD0,
VKEY_NUMPAD1,
VKEY_NUMPAD2,
VKEY_NUMPAD3,
VKEY_NUMPAD4,
VKEY_NUMPAD5,
VKEY_NUMPAD6,
VKEY_NUMPAD7,
VKEY_NUMPAD8,
VKEY_NUMPAD9,
VKEY_MULTIPLY,
VKEY_ADD,
VKEY_SEPARATOR,
VKEY_SUBTRACT,
VKEY_DECIMAL,
VKEY_DIVIDE,
VKEY_F1,
VKEY_F2,
VKEY_F3,
VKEY_F4,
VKEY_F5,
VKEY_F6,
VKEY_F7,
VKEY_F8,
VKEY_F9,
VKEY_F10,
VKEY_F11,
VKEY_F12,
VKEY_NUMLOCK,
VKEY_SCROLL,
VKEY_SHIFT,
VKEY_CONTROL,
VKEY_ALT,
VKEY_EQUALS
};
//---Used by member modifier of VstKeyCode---------
enum VstModifierKey
{
MODIFIER_SHIFT = 1<<0, // Shift
MODIFIER_ALTERNATE = 1<<1, // Alt
MODIFIER_COMMAND = 1<<2, // Control on Mac
MODIFIER_CONTROL = 1<<3 // Ctrl on PC, Apple on Mac
};
//---Used by audioMasterOpenFileSelector-----------
struct VstFileType
{
VstFileType (char* _name, char *_macType, char *_dosType, char *_unixType = 0, char *_mimeType1 = 0, char *_mimeType2 = 0)
{
if (_name)
strcpy (name, _name);
if (_macType)
strcpy (macType, _macType);
if (_dosType)
strcpy (dosType, _dosType);
if (_unixType)
strcpy (unixType, _unixType);
if (_mimeType1)
strcpy (mimeType1, _mimeType1);
if (_mimeType2)
strcpy (mimeType2, _mimeType2);
}
char name[128];
char macType[8];
char dosType[8];
char unixType[8];
char mimeType1[128];
char mimeType2[128];
};
struct VstFileSelect
{
long command; // see enum kVstFileLoad....
long type; // see enum kVstFileType...
long macCreator; // optional: 0 = no creator
long nbFileTypes; // nb of fileTypes to used
VstFileType *fileTypes; // list of fileTypes
char title[1024]; // text display in the file selector's title
char *initialPath; // initial path
char *returnPath; // use with kVstFileLoad and kVstDirectorySelect
// if null is passed, the host will allocated memory
// the plugin should then called closeOpenFileSelector for freeing memory
long sizeReturnPath;
char **returnMultiplePaths; // use with kVstMultipleFilesLoad
// the host allocates this array. The plugin should then called closeOpenFileSelector for freeing memory
long nbReturnPath; // number of selected paths
long reserved; // reserved for host application
char future[116]; // future use
};
enum {
kVstFileLoad = 0,
kVstFileSave,
kVstMultipleFilesLoad,
kVstDirectorySelect,
kVstFileType = 0
};
//---Structure used for effBeginLoadBank/effBeginLoadProgram--
struct VstPatchChunkInfo
{
long version; // Format Version (should be 1)
long pluginUniqueID;// UniqueID of the plugin
long pluginVersion; // Plugin Version
long numElements; // Number of Programs (Bank) or Parameters (Program)
char future[48];
};
//---PanLaw Type-----------------------------------
enum
{
kLinearPanLaw = 0, // L = pan * M; R = (1 - pan) * M;
kEqualPowerPanLaw // L = pow (pan, 0.5) * M; R = pow ((1 - pan), 0.5) * M;
};
#if PRAGMA_STRUCT_ALIGN || __MWERKS__
#pragma options align=reset
#elif defined(WIN32) || defined(__FLAT__)
#pragma pack(pop)
#elif defined __BORLANDC__
#pragma -a-
#endif
#endif