|
- //------------------------------------------------------------------------
- // Project : VST SDK
- //
- // Category : Interfaces
- // Filename : pluginterfaces/vst/ivstaudioprocessor.h
- // Created by : Steinberg, 10/2005
- // Description : VST Audio Processing Interfaces
- //
- //-----------------------------------------------------------------------------
- // 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 "ivstcomponent.h"
- #include "vstspeaker.h"
-
- //------------------------------------------------------------------------
- #include "pluginterfaces/base/falignpush.h"
- //------------------------------------------------------------------------
-
- //------------------------------------------------------------------------
- /** Class Category Name for Audio Processor Component */
- //------------------------------------------------------------------------
- #ifndef kVstAudioEffectClass
- #define kVstAudioEffectClass "Audio Module Class"
- #endif
-
- //------------------------------------------------------------------------
- namespace Steinberg {
- namespace Vst {
- class IEventList;
- class IParameterChanges;
- struct ProcessContext;
-
- //------------------------------------------------------------------------
- /** Component Types used as subCategories in PClassInfo2 */
- //------------------------------------------------------------------------
- namespace PlugType
- {
- /**
- \defgroup plugType Plug-in Type used for subCategories */
- /*@{*/
- //------------------------------------------------------------------------
- const CString kFxAnalyzer = "Fx|Analyzer"; ///< Scope, FFT-Display, Loudness Processing...
- const CString kFxDelay = "Fx|Delay"; ///< Delay, Multi-tap Delay, Ping-Pong Delay...
- const CString kFxDistortion = "Fx|Distortion"; ///< Amp Simulator, Sub-Harmonic, SoftClipper...
- const CString kFxDynamics = "Fx|Dynamics"; ///< Compressor, Expander, Gate, Limiter, Maximizer, Tape Simulator, EnvelopeShaper...
- const CString kFxEQ = "Fx|EQ"; ///< Equalization, Graphical EQ...
- const CString kFxFilter = "Fx|Filter"; ///< WahWah, ToneBooster, Specific Filter,...
- const CString kFx = "Fx"; ///< others type (not categorized)
- const CString kFxInstrument = "Fx|Instrument"; ///< Fx which could be loaded as Instrument too
- const CString kFxInstrumentExternal = "Fx|Instrument|External"; ///< Fx which could be loaded as Instrument too and is external (wrapped Hardware)
- const CString kFxSpatial = "Fx|Spatial"; ///< MonoToStereo, StereoEnhancer,...
- const CString kFxGenerator = "Fx|Generator"; ///< Tone Generator, Noise Generator...
- const CString kFxMastering = "Fx|Mastering"; ///< Dither, Noise Shaping,...
- const CString kFxModulation = "Fx|Modulation"; ///< Phaser, Flanger, Chorus, Tremolo, Vibrato, AutoPan, Rotary, Cloner...
- const CString kFxPitchShift = "Fx|Pitch Shift"; ///< Pitch Processing, Pitch Correction, Vocal Tuning...
- const CString kFxRestoration = "Fx|Restoration"; ///< Denoiser, Declicker,...
- const CString kFxReverb = "Fx|Reverb"; ///< Reverberation, Room Simulation, Convolution Reverb...
- const CString kFxSurround = "Fx|Surround"; ///< dedicated to surround processing: LFE Splitter, Bass Manager...
- const CString kFxTools = "Fx|Tools"; ///< Volume, Mixer, Tuner...
- const CString kFxNetwork = "Fx|Network"; ///< using Network
-
- const CString kInstrument = "Instrument"; ///< Effect used as instrument (sound generator), not as insert
- const CString kInstrumentDrum = "Instrument|Drum"; ///< Instrument for Drum sounds
- const CString kInstrumentExternal = "Instrument|External";///< External Instrument (wrapped Hardware)
- const CString kInstrumentPiano = "Instrument|Piano"; ///< Instrument for Piano sounds
- const CString kInstrumentSampler = "Instrument|Sampler"; ///< Instrument based on Samples
- const CString kInstrumentSynth = "Instrument|Synth"; ///< Instrument based on Synthesis
- const CString kInstrumentSynthSampler = "Instrument|Synth|Sampler"; ///< Instrument based on Synthesis and Samples
-
- const CString kSpatial = "Spatial"; ///< used for SurroundPanner
- const CString kSpatialFx = "Spatial|Fx"; ///< used for SurroundPanner and as insert effect
- const CString kOnlyRealTime = "OnlyRT"; ///< indicates that it supports only realtime process call, no processing faster than realtime
- const CString kOnlyOfflineProcess = "OnlyOfflineProcess"; ///< used for Plug-in offline processing (will not work as normal insert Plug-in)
- const CString kNoOfflineProcess = "NoOfflineProcess"; ///< will be NOT used for Plug-in offline processing (will work as normal insert Plug-in)
- const CString kUpDownMix = "Up-Downmix"; ///< used for Mixconverter/Up-Mixer/Down-Mixer
- const CString kAnalyzer = "Analyzer"; ///< Meter, Scope, FFT-Display, not selectable as insert plugin
- const CString kAmbisonics = "Ambisonics"; ///< used for Ambisonics channel (FX or Panner/Mixconverter/Up-Mixer/Down-Mixer when combined with other category)
-
- const CString kMono = "Mono"; ///< used for Mono only Plug-in [optional]
- const CString kStereo = "Stereo"; ///< used for Stereo only Plug-in [optional]
- const CString kSurround = "Surround"; ///< used for Surround only Plug-in [optional]
-
- //------------------------------------------------------------------------
- /*@}*/
- }
-
- //------------------------------------------------------------------------
- /** Component Flags used as classFlags in PClassInfo2 */
- //------------------------------------------------------------------------
- enum ComponentFlags
- {
- //------------------------------------------------------------------------
- kDistributable = 1 << 0, ///< Component can be run on remote computer
- kSimpleModeSupported = 1 << 1 ///< Component supports simple IO mode (or works in simple mode anyway) see \ref vst3IoMode
- //------------------------------------------------------------------------
- };
-
- //------------------------------------------------------------------------
- /** Symbolic sample size.
- \see ProcessSetup, ProcessData */
- //------------------------------------------------------------------------
- enum SymbolicSampleSizes
- {
- kSample32, ///< 32-bit precision
- kSample64 ///< 64-bit precision
- };
-
- //------------------------------------------------------------------------
- /** Processing mode informs the Plug-in about the context and at which frequency the process call is called.
- VST3 defines 3 modes:
- - kRealtime: each process call is called at a realtime frequency (defined by [numSamples of ProcessData] / samplerate).
- The Plug-in should always try to process as fast as possible in order to let enough time slice to other Plug-ins.
- - kPrefetch: each process call could be called at a variable frequency (jitter, slower / faster than realtime),
- the Plug-in should process at the same quality level than realtime, Plug-in must not slow down to realtime
- (e.g. disk streaming)!
- The host should avoid to process in kPrefetch mode such sampler based Plug-in.
- - kOffline: each process call could be faster than realtime or slower, higher quality than realtime could be used.
- Plug-ins using disk streaming should be sure that they have enough time in the process call for streaming,
- if needed by slowing down to realtime or slower.
- .
- Note about Process Modes switching:
- -Switching between kRealtime and kPrefetch process modes are done in realtime thread without need of calling
- IAudioProcessor::setupProcessing, the Plug-in should check in process call the member processMode of ProcessData
- in order to know in which mode it is processed.
- -Switching between kRealtime (or kPrefetch) and kOffline requires that the host calls IAudioProcessor::setupProcessing
- in order to inform the Plug-in about this mode change.
- .
- \see ProcessSetup, ProcessData */
- //------------------------------------------------------------------------
- enum ProcessModes
- {
- kRealtime, ///< realtime processing
- kPrefetch, ///< prefetch processing
- kOffline ///< offline processing
- };
-
- //------------------------------------------------------------------------
- /** kNoTail
- *
- * to be returned by getTailSamples when no tail is wanted
- \see IAudioProcessor::getTailSamples */
- //------------------------------------------------------------------------
- static const uint32 kNoTail = 0;
- //------------------------------------------------------------------------
- /** kInfiniteTail
- *
- * to be returned by getTailSamples when infinite tail is wanted
- \see IAudioProcessor::getTailSamples */
- //------------------------------------------------------------------------
- static const uint32 kInfiniteTail = kMaxInt32u;
-
- //------------------------------------------------------------------------
- /** Audio processing setup.
- \see IAudioProcessor::setupProcessing */
- //------------------------------------------------------------------------
- struct ProcessSetup
- {
- //------------------------------------------------------------------------
- int32 processMode; ///< \ref ProcessModes
- int32 symbolicSampleSize; ///< \ref SymbolicSampleSizes
- int32 maxSamplesPerBlock; ///< maximum number of samples per audio block
- SampleRate sampleRate; ///< sample rate
- //------------------------------------------------------------------------
- };
-
- //------------------------------------------------------------------------
- /** Processing buffers of an audio bus.
- This structure contains the processing buffer for each channel of an audio bus.
- - The number of channels (numChannels) must always match the current bus arrangement.
- It could be set to value '0' when the host wants to flush the parameters (when the Plug-in is not processed).
- - The size of the channel buffer array must always match the number of channels. So the host
- must always supply an array for the channel buffers, regardless if the
- bus is active or not. However, if an audio bus is currently inactive, the actual sample
- buffer addresses are safe to be null.
- - The silence flag is set when every sample of the according buffer has the value '0'. It is
- intended to be used as help for optimizations allowing a Plug-in to reduce processing activities.
- But even if this flag is set for a channel, the channel buffers must still point to valid memory!
- This flag is optional. A host is free to support it or not.
- .
- \see ProcessData */
- //------------------------------------------------------------------------
- struct AudioBusBuffers
- {
- AudioBusBuffers () : numChannels (0), silenceFlags (0), channelBuffers64 (0) {}
-
- //------------------------------------------------------------------------
- int32 numChannels; ///< number of audio channels in bus
- uint64 silenceFlags; ///< Bitset of silence state per channel
- union
- {
- Sample32** channelBuffers32; ///< sample buffers to process with 32-bit precision
- Sample64** channelBuffers64; ///< sample buffers to process with 64-bit precision
- };
- //------------------------------------------------------------------------
- };
-
- //------------------------------------------------------------------------
- /** Any data needed in audio processing.
- The host prepares AudioBusBuffers for each input/output bus,
- regardless of the bus activation state. Bus buffer indices always match
- with bus indices used in IComponent::getBusInfo of media type kAudio.
- \see AudioBusBuffers, IParameterChanges, IEventList, ProcessContext */
- //------------------------------------------------------------------------
- struct ProcessData
- {
- ProcessData ()
- : processMode (0), symbolicSampleSize (kSample32), numSamples (0), numInputs (0)
- , numOutputs (0), inputs (0), outputs (0), inputParameterChanges (0), outputParameterChanges (0)
- , inputEvents (0), outputEvents (0), processContext (0) {}
-
- //------------------------------------------------------------------------
- int32 processMode; ///< processing mode - value of \ref ProcessModes
- int32 symbolicSampleSize; ///< sample size - value of \ref SymbolicSampleSizes
- int32 numSamples; ///< number of samples to process
- int32 numInputs; ///< number of audio input buses
- int32 numOutputs; ///< number of audio output buses
- AudioBusBuffers* inputs; ///< buffers of input buses
- AudioBusBuffers* outputs; ///< buffers of output buses
-
- IParameterChanges* inputParameterChanges; ///< incoming parameter changes for this block
- IParameterChanges* outputParameterChanges; ///< outgoing parameter changes for this block (optional)
- IEventList* inputEvents; ///< incoming events for this block (optional)
- IEventList* outputEvents; ///< outgoing events for this block (optional)
- ProcessContext* processContext; ///< processing context (optional, but most welcome)
- //------------------------------------------------------------------------
- };
-
- //------------------------------------------------------------------------
- /** Audio Processing Interface.
- \ingroup vstIPlug vst300
- - [plug imp]
- - [extends IComponent]
- - [released: 3.0.0]
- - [mandatory]
-
- This interface must always be supported by audio processing Plug-ins. */
- //------------------------------------------------------------------------
- class IAudioProcessor: public FUnknown
- {
- public:
- //------------------------------------------------------------------------
- /** Try to set (from host) a predefined arrangement for inputs and outputs.
- The host should always deliver the same number of input and output buses than the Plug-in needs
- (see \ref IComponent::getBusCount).
- The Plug-in returns kResultFalse if wanted arrangements are not supported.
- If the Plug-in accepts these arrangements, it should modify its buses to match the new arrangements
- (asked by the host with IComponent::getInfo () or IAudioProcessor::getBusArrangement ()) and then return kResultTrue.
- If the Plug-in does not accept these arrangements, but can adapt its current arrangements (according to the wanted ones),
- it should modify its buses arrangements and return kResultFalse. */
- virtual tresult PLUGIN_API setBusArrangements (SpeakerArrangement* inputs, int32 numIns,
- SpeakerArrangement* outputs, int32 numOuts) = 0;
-
- /** Gets the bus arrangement for a given direction (input/output) and index.
- Note: IComponent::getInfo () and IAudioProcessor::getBusArrangement () should be always return the same
- information about the buses arrangements. */
- virtual tresult PLUGIN_API getBusArrangement (BusDirection dir, int32 index, SpeakerArrangement& arr) = 0;
-
- /** Asks if a given sample size is supported see \ref SymbolicSampleSizes. */
- virtual tresult PLUGIN_API canProcessSampleSize (int32 symbolicSampleSize) = 0;
-
- /** Gets the current Latency in samples.
- The returned value defines the group delay or the latency of the Plug-in. For example, if the Plug-in internally needs
- to look in advance (like compressors) 512 samples then this Plug-in should report 512 as latency.
- If during the use of the Plug-in this latency change, the Plug-in has to inform the host by
- using IComponentHandler::restartComponent (kLatencyChanged), this could lead to audio playback interruption
- because the host has to recompute its internal mixer delay compensation.
- Note that for player live recording this latency should be zero or small. */
- virtual uint32 PLUGIN_API getLatencySamples () = 0;
-
- /** Called in disable state (not active) before processing will begin. */
- virtual tresult PLUGIN_API setupProcessing (ProcessSetup& setup) = 0;
-
- /** Informs the Plug-in about the processing state. This will be called before any process calls start with true and after with false.
- Note that setProcessing (false) may be called after setProcessing (true) without any process calls.
- In this call the Plug-in should do only light operation (no memory allocation or big setup reconfiguration),
- this could be used to reset some buffers (like Delay line or Reverb). */
- virtual tresult PLUGIN_API setProcessing (TBool state) = 0;
-
- /** The Process call, where all information (parameter changes, event, audio buffer) are passed. */
- virtual tresult PLUGIN_API process (ProcessData& data) = 0;
-
- /** Gets tail size in samples. For example, if the Plug-in is a Reverb Plug-in and it knows that
- the maximum length of the Reverb is 2sec, then it has to return in getTailSamples()
- (in VST2 it was getGetTailSize ()): 2*sampleRate.
- This information could be used by host for offline processing, process optimization and
- downmix (avoiding signal cut (clicks)).
- It should return:
- - kNoTail when no tail
- - x * sampleRate when x Sec tail.
- - kInfiniteTail when infinite tail. */
- virtual uint32 PLUGIN_API getTailSamples () = 0;
-
- //------------------------------------------------------------------------
- static const FUID iid;
- };
-
- DECLARE_CLASS_IID (IAudioProcessor, 0x42043F99, 0xB7DA453C, 0xA569E79D, 0x9AAEC33D)
-
- //------------------------------------------------------------------------
- /** Extended IAudioProcessor interface for a component.
- \ingroup vstIPlug vst310
- - [plug imp]
- - [extends IAudioProcessor]
- - [released: 3.1.0]
- - [optional]
-
- Inform the Plug-in about how long from the moment of generation/acquiring (from file or from Input)
- it will take for its input to arrive, and how long it will take for its output to be presented (to output or to Speaker).
-
- Note for Input Presentation Latency: when reading from file, the first Plug-in will have an input presentation latency set to zero.
- When monitoring audio input from a Audio Device, then this initial input latency will be the input latency of the Audio Device itself.
-
- Note for Output Presentation Latency: when writing to a file, the last Plug-in will have an output presentation latency set to zero.
- When the output of this Plug-in is connected to a Audio Device then this initial output latency will be the output
- latency of the Audio Device itself.
-
- A value of zero means either no latency or an unknown latency.
-
- Each Plug-in adding a latency (returning a none zero value for IAudioProcessor::getLatencySamples) will modify the input
- presentation latency of the next Plug-ins in the mixer routing graph and will modify the output presentation latency
- of the previous Plug-ins.
-
- \n
- \image html "iaudiopresentationlatency_usage.png"
- \n
- \see IAudioProcessor
- \see IComponent*/
- //------------------------------------------------------------------------
- class IAudioPresentationLatency: public FUnknown
- {
- public:
- //------------------------------------------------------------------------
- /** Informs the Plug-in about the Audio Presentation Latency in samples for a given direction (kInput/kOutput) and bus index. */
- virtual tresult PLUGIN_API setAudioPresentationLatencySamples (BusDirection dir, int32 busIndex, uint32 latencyInSamples) = 0;
-
- //------------------------------------------------------------------------
- static const FUID iid;
- };
-
- DECLARE_CLASS_IID (IAudioPresentationLatency, 0x309ECE78, 0xEB7D4fae, 0x8B2225D9, 0x09FD08B6)
-
- //------------------------------------------------------------------------
- } // namespace Vst
- } // namespace Steinberg
-
- //------------------------------------------------------------------------
- #include "pluginterfaces/base/falignpop.h"
- //------------------------------------------------------------------------
|