123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*
- * 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 <atomic>
- #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<bool> m_isProcessing = false;
- // Static memory for host-to-plugin pointers
- union
- {
- Vst::VstSpeakerArrangement speakerArrangement;
- char name[256];
- } m_host2PlugMem;
- std::vector<char> m_eventCache; // Cached VST (MIDI) events
- std::vector<char> m_fileSelectCache; // Cached VstFileSelect data
- // Pointers to sample data
- std::vector<void *> 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<char> &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<typename buf_t>
- 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
|