/* * Bridge.h * -------- * Purpose: VST plugin bridge (plugin side) * Notes : (currently none) * Authors: OpenMPT Devs * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. */ #pragma once #include "openmpt/all/BuildSettings.hpp" #include #include "BridgeCommon.h" OPENMPT_NAMESPACE_BEGIN class PluginBridge : private BridgeCommon { public: static bool m_fullMemDump; protected: enum TimerID : UINT { TIMER_IDLE = 1, }; static PluginBridge *m_latestInstance; static ATOM m_editorClassAtom; // Plugin Vst::AEffect *m_nativeEffect = nullptr; HMODULE m_library = nullptr; HWND m_window = nullptr; int m_windowWidth = 0, m_windowHeight = 0; std::atomic m_isProcessing = false; // Static memory for host-to-plugin pointers union { Vst::VstSpeakerArrangement speakerArrangement; char name[256]; } m_host2PlugMem; std::vector m_eventCache; // Cached VST (MIDI) events std::vector m_fileSelectCache; // Cached VstFileSelect data // Pointers to sample data std::vector m_sampleBuffers; uint32 m_mixBufSize = 0; HANDLE m_audioThread = nullptr; Event m_sigThreadExit; // Signal to kill audio thread bool m_needIdle = false; // Plugin needs idle time public: PluginBridge(const wchar_t *memName, HANDLE otherProcess); ~PluginBridge(); PluginBridge(const PluginBridge&) = delete; PluginBridge &operator=(const PluginBridge&) = delete; static void MainLoop(TCHAR *argv[]); protected: void RequestDelete(); bool SendToHost(BridgeMessage &sendMsg); void UpdateEffectStruct(); void CreateProcessingFile(std::vector &dispatchData); void ParseNextMessage(int msgID); void NewInstance(NewInstanceMsg &msg); void InitBridge(InitMsg &msg); void DispatchToPlugin(DispatchMsg &msg); void SetParameter(ParameterMsg &msg); void GetParameter(ParameterMsg &msg); void AutomateParameters(); void Process(); void ProcessReplacing(); void ProcessDoubleReplacing(); intptr_t DispatchToHost(Vst::VstOpcodeToHost opcode, int32 index, intptr_t value, void *ptr, float opt); void SendErrorMessage(const wchar_t *str); intptr_t Dispatch(Vst::VstOpcodeToPlugin opcode, int32 index, intptr_t value, void *ptr, float opt); template int32 BuildProcessPointers(buf_t **(&inPointers), buf_t **(&outPointers)); static DWORD WINAPI AudioThread(LPVOID param); void AudioThread(); static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static void CALLBACK IdleTimerProc(HWND hwnd, UINT message, UINT_PTR idTimer, DWORD dwTime); static intptr_t VSTCALLBACK MasterCallback(Vst::AEffect *effect, Vst::VstOpcodeToHost, int32 index, intptr_t value, void *ptr, float opt); }; OPENMPT_NAMESPACE_END