//----------------------------------------------------------------------------- // Project : VST SDK // // Category : Helpers // Filename : public.sdk/source/vst/interappaudio/VST3Plugin.h // Created by : Steinberg, 08/2013. // Description : VST 3 InterAppAudio // Flags : clang-format SMTGSequencer // //----------------------------------------------------------------------------- // 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 /// \cond ignore #import "AudioIO.h" #import "public.sdk/source/vst/hosting/eventlist.h" #import "public.sdk/source/vst/hosting/parameterchanges.h" #import "public.sdk/source/vst/hosting/processdata.h" #import "public.sdk/source/vst/utility/ringbuffer.h" #import "base/source/fobject.h" #import "base/source/timer.h" #import "pluginterfaces/vst/ivstaudioprocessor.h" #import "pluginterfaces/vst/ivsteditcontroller.h" #import "pluginterfaces/vst/ivstprocesscontext.h" #import #import #ifndef __OBJC__ struct NSData; #endif namespace Steinberg { namespace Vst { namespace InterAppAudio { static const int32 kMaxUIEvents = 100; //------------------------------------------------------------------------ class VST3Plugin : public FObject, public IComponentHandler, public IAudioIOProcessor, public ITimerCallback { public: //------------------------------------------------------------------------ VST3Plugin (); virtual ~VST3Plugin (); bool init (); IEditController* getEditController () const { return editController; } IAudioProcessor* getAudioProcessor () const { return processor; } tresult scheduleEventFromUI (Event& event); NSData* getProcessorState (); bool setProcessorState (NSData* data); NSData* getControllerState (); bool setControllerState (NSData* data); OBJ_METHODS (VST3Plugin, FObject) REFCOUNT_METHODS (FObject) DEFINE_INTERFACES DEF_INTERFACE (IComponentHandler) END_DEFINE_INTERFACES (FObject) protected: typedef std::map NoteIDPitchMap; typedef uint32 ChannelAndCtrlNumber; typedef std::map MIDIControllerToParamIDMap; void createProcessorAndController (); void updateProcessContext (AudioIO* audioIO); MIDIControllerToParamIDMap createMIDIControllerToParamIDMap (); // IComponentHandler tresult PLUGIN_API beginEdit (ParamID id) override; tresult PLUGIN_API performEdit (ParamID id, ParamValue valueNormalized) override; tresult PLUGIN_API endEdit (ParamID id) override; tresult PLUGIN_API restartComponent (int32 flags) override; // IAudioIOProcessor void willStartAudio (AudioIO* audioIO) override; void didStopAudio (AudioIO* audioIO) override; void onMIDIEvent (UInt32 status, UInt32 data1, UInt32 data2, UInt32 sampleOffset, bool withinRealtimeThread) override; void process (const AudioTimeStamp* timeStamp, UInt32 busNumber, UInt32 numFrames, AudioBufferList* ioData, bool& outputIsSilence, AudioIO* audioIO) override; // ITimerCallback void onTimer (Timer* timer) override; IAudioProcessor* processor {nullptr}; IEditController* editController {nullptr}; Timer* timer {nullptr}; HostProcessData processData; ProcessContext processContext; ParameterChangeTransfer inputParamChangeTransfer; ParameterChangeTransfer outputParamChangeTransfer; ParameterChanges inputParamChanges; ParameterChanges outputParamChanges; EventList inputEvents; NoteIDPitchMap noteIDPitchMap; std::atomic lastNodeID {0}; bool processing {false}; MIDIControllerToParamIDMap midiControllerToParamIDMap; OneReaderOneWriter::RingBuffer uiScheduledEvents; static ChannelAndCtrlNumber channelAndCtrlNumber (uint16 channel, CtrlNumber ctrler) { return (channel << 16) + ctrler; } }; //------------------------------------------------------------------------ } // namespace InterAppAudio } // namespace Vst } // namespace Steinberg /// \endcond