Files
hot-step-cpp-ROCm/engine/vendor/vst3sdk/public.sdk/source/vst/aaxwrapper/aaxwrapper.h
T
2026-08-16 18:24:52 +07:00

179 lines
6.7 KiB
C++

//------------------------------------------------------------------------
// Project : VST SDK
//
// Category : Helpers
// Filename : public.sdk/source/vst/aaxwrapper/aaxwrapper.h
// Created by : Steinberg, 08/2017
// Description : VST 3 -> AAX Wrapper
//
//-----------------------------------------------------------------------------
// 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.
//-----------------------------------------------------------------------------
/// \cond ignore
#pragma once
#include "public.sdk/source/vst/basewrapper/basewrapper.h"
#include "base/thread/include/flock.h"
#include <bitset>
#include <list>
#include <memory>
struct AAX_Plugin_Desc;
struct AAX_Effect_Desc;
class AAX_IComponentDescriptor;
class AAXWrapper_Parameters;
class AAXWrapper_GUI;
namespace Steinberg {
namespace Vst {
class IAudioProcessor;
class IEditController;
}
}
struct AAXWrapper_Context
{
void* ptr[1]; // array of numDataPointers pointers
};
//------------------------------------------------------------------------
class AAXWrapper : public Steinberg::Vst::BaseWrapper,
public Steinberg::Vst::IComponentHandler2,
public Steinberg::Vst::IVst3ToAAXWrapper
{
public:
// static creation method (will owned factory)
static AAXWrapper* create (Steinberg::IPluginFactory* factory,
const Steinberg::TUID vst3ComponentID, AAX_Plugin_Desc* desc,
AAXWrapper_Parameters* p);
AAXWrapper (Steinberg::Vst::BaseWrapper::SVST3Config& config, AAXWrapper_Parameters* p, AAX_Plugin_Desc* desc);
~AAXWrapper ();
//--- VST 3 Interfaces ------------------------------------------------------
// IHostApplication
Steinberg::tresult PLUGIN_API getName (Steinberg::Vst::String128 name) SMTG_OVERRIDE;
// IComponentHandler
Steinberg::tresult PLUGIN_API beginEdit (Steinberg::Vst::ParamID tag) SMTG_OVERRIDE;
Steinberg::tresult PLUGIN_API performEdit (
Steinberg::Vst::ParamID tag, Steinberg::Vst::ParamValue valueNormalized) SMTG_OVERRIDE;
Steinberg::tresult PLUGIN_API endEdit (Steinberg::Vst::ParamID tag) SMTG_OVERRIDE;
Steinberg::tresult PLUGIN_API restartComponent (Steinberg::int32 flags) SMTG_OVERRIDE;
// IComponentHandler2
Steinberg::tresult PLUGIN_API setDirty (Steinberg::TBool state) SMTG_OVERRIDE;
Steinberg::tresult PLUGIN_API requestOpenEditor (
Steinberg::FIDString name = Steinberg::Vst::ViewType::kEditor) SMTG_OVERRIDE;
Steinberg::tresult PLUGIN_API startGroupEdit () SMTG_OVERRIDE;
Steinberg::tresult PLUGIN_API finishGroupEdit () SMTG_OVERRIDE;
// FUnknown
DEF_INTERFACES_2 (Steinberg::Vst::IComponentHandler2, Steinberg::Vst::IVst3ToAAXWrapper, BaseWrapper);
REFCOUNT_METHODS (BaseWrapper);
// AAXWrapper_Parameters callbacks
void setGUI (AAXWrapper_GUI* gui) { mAAXGUI = gui; }
Steinberg::int32 /*AAX_Result*/ getParameterInfo (const char* aaxId,
Steinberg::Vst::ParameterInfo& paramInfo);
Steinberg::int32 /*AAX_Result*/ ResetFieldData (Steinberg::int32 index, void* inData,
Steinberg::uint32 inDataSize);
Steinberg::int32 Process (AAXWrapper_Context* instance);
Steinberg::uint32 getNumMIDIports () const { return mCountMIDIports; }
void setSideChainEnable (bool enable);
bool generatePageTables (const char* outputFile);
void setRenderingOffline (bool val);
static void DescribeAlgorithmComponent (AAX_IComponentDescriptor* outDesc,
const AAX_Effect_Desc* desc,
const AAX_Plugin_Desc* pdesc);
//--- ---------------------------------------------------------------------
Steinberg::uint32 getNumAAXOutputs () const { return mAAXOutputs; }
//------------------------------------------------------------------------
// BaseWrapper overrides ---------------------------------
//------------------------------------------------------------------------
bool init () SMTG_OVERRIDE;
bool _sizeWindow (Steinberg::int32 width, Steinberg::int32 height) SMTG_OVERRIDE;
void onTimer (Steinberg::Timer* timer) SMTG_OVERRIDE;
Steinberg::int32 _getChunk (void** data, bool isPreset) SMTG_OVERRIDE;
Steinberg::int32 _setChunk (void* data, Steinberg::int32 byteSize, bool isPreset) SMTG_OVERRIDE;
void setupProcessTimeInfo () SMTG_OVERRIDE;
//------------------------------------------------------------------------
private:
void processOutputParametersChanges () SMTG_OVERRIDE;
Steinberg::tresult setupBusArrangements (AAX_Plugin_Desc* desc);
Steinberg::int32 countSidechainBusChannels (Steinberg::Vst::BusDirection dir,
Steinberg::uint64& scBusBitset);
void guessActiveOutputs (float** out, Steinberg::uint32 num);
void updateActiveOutputState ();
AAXWrapper_Parameters* mAAXParams = nullptr;
AAXWrapper_GUI* mAAXGUI = nullptr;
Steinberg::uint32 mAAXOutputs = 0;
Steinberg::Base::Thread::FLock mSyncCalls; // synchronize calls expected in the same thread in VST3
AAX_Plugin_Desc* mPluginDesc = nullptr;
Steinberg::uint32 mCountMIDIports = 0;
// as of ProTools 12 (?) the context struct does no longer allow unused slots,
// so we have to generate indices into the context struct dynamically
// context pointer to AAXWrapper always first
static const Steinberg::int32 idxContext = 0;
static const Steinberg::int32 idxBufferSize = 1;
Steinberg::int32 idxInputChannels = -1;
Steinberg::int32 idxOutputChannels = -1;
Steinberg::int32 idxSideChainInputChannels = -1;
Steinberg::int32 idxMidiPorts = -1;
Steinberg::int32 idxAuxOutputs = -1;
Steinberg::int32 idxMeters = -1;
Steinberg::int32 numDataPointers = 0;
static const Steinberg::int32 maxActiveChannels = 128;
std::bitset<maxActiveChannels> mActiveChannels;
std::bitset<maxActiveChannels> mPropagatedChannels;
Steinberg::uint32 mCntMeters = 0;
std::unique_ptr<Steinberg::Vst::ParamID[]> mMeterIds;
struct GetChunkMessage;
void* mainThread = nullptr;
Steinberg::Base::Thread::FLock msgQueueLock;
std::list<GetChunkMessage*> msgQueue;
float mBypassGain = 1.0;
float* mMetersTmp = nullptr;
Steinberg::Vst::TQuarterNotes mLastPpqPos = 0;
Steinberg::Vst::TQuarterNotes mNextPpqPos = 0;
bool mWantsSetChunk = false;
bool mSettingChunk = false;
bool mSimulateBypass = false;
bool mBypass = false;
bool mPresetChanged = false;
bool mBypassBeforePresetChanged = false;
bool mWantsSetChunkIsPreset = false;
friend class AAXWrapper_Parameters;
friend class AAXWrapper_GUI;
};
/// \endcond