From ef64e046b060c6fdd2fa17d3cfcb74518946bc6e Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 24 Sep 2021 20:26:11 +0100 Subject: [PATCH] Implement v3_process_context_requirements Signed-off-by: falkTX --- distrho/src/DistrhoPluginVST3.cpp | 70 +++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 3 deletions(-) diff --git a/distrho/src/DistrhoPluginVST3.cpp b/distrho/src/DistrhoPluginVST3.cpp index 2a6e4153..7849072b 100644 --- a/distrho/src/DistrhoPluginVST3.cpp +++ b/distrho/src/DistrhoPluginVST3.cpp @@ -824,7 +824,6 @@ public: (fTimePosition.bbt.bar-1); fPlugin.setTimePosition(fTimePosition); - } #endif @@ -1387,6 +1386,63 @@ struct dpf_edit_controller : v3_edit_controller_cpp { } }; +// -------------------------------------------------------------------------------------------------------------------- +// dpf_process_context_requirements + +struct v3_process_context_requirements_cpp : v3_funknown { + v3_process_context_requirements req; +}; + +struct dpf_process_context_requirements : v3_process_context_requirements_cpp { + dpf_process_context_requirements() + { + static const uint8_t* kSupportedInterfaces[] = { + v3_funknown_iid, + v3_process_context_requirements_iid + }; + + // ------------------------------------------------------------------------------------------------------------ + // v3_funknown + + query_interface = []V3_API(void* self, const v3_tuid iid, void** iface) -> v3_result + { + d_stdout("dpf_process_context_requirements::query_interface => %p %s %p", self, tuid2str(iid), iface); + *iface = NULL; + DISTRHO_SAFE_ASSERT_RETURN(self != nullptr, V3_NO_INTERFACE); + + for (const uint8_t* interface_iid : kSupportedInterfaces) + { + if (v3_tuid_match(interface_iid, iid)) + { + *iface = self; + return V3_OK; + } + } + + return V3_NO_INTERFACE; + }; + + // this is used statically, so we don't have to care here + ref = []V3_API(void*) -> uint32_t { return 1; }; + unref = []V3_API(void*) -> uint32_t { return 0; }; + + // ------------------------------------------------------------------------------------------------------------ + // v3_process_context_requirements + + req.get_process_context_requirements = []V3_API(void*) -> uint32_t + { + return 0x0 + |V3_PROCESS_CTX_NEED_CONTINUOUS_TIME // V3_PROCESS_CTX_CONT_TIME_VALID + |V3_PROCESS_CTX_NEED_PROJECT_TIME // V3_PROCESS_CTX_PROJECT_TIME_VALID + |V3_PROCESS_CTX_NEED_TEMPO // V3_PROCESS_CTX_TEMPO_VALID + |V3_PROCESS_CTX_NEED_TIME_SIG // V3_PROCESS_CTX_TIME_SIG_VALID + |V3_PROCESS_CTX_NEED_TRANSPORT_STATE; // V3_PROCESS_CTX_PLAYING + }; + } + + DISTRHO_PREVENT_HEAP_ALLOCATION +}; + // -------------------------------------------------------------------------------------------------------------------- // dpf_audio_processor @@ -1404,7 +1460,7 @@ struct dpf_audio_processor : v3_audio_processor_cpp { self(s), vst3(v) { - static const uint8_t* kSupportedInterfaces[] = { + static const uint8_t* kSupportedInterfacesBase[] = { v3_funknown_iid, v3_audio_processor_iid }; @@ -1418,7 +1474,7 @@ struct dpf_audio_processor : v3_audio_processor_cpp { *iface = NULL; DISTRHO_SAFE_ASSERT_RETURN(self != nullptr, V3_NO_INTERFACE); - for (const uint8_t* interface_iid : kSupportedInterfaces) + for (const uint8_t* interface_iid : kSupportedInterfacesBase) { if (v3_tuid_match(interface_iid, iid)) { @@ -1427,6 +1483,14 @@ struct dpf_audio_processor : v3_audio_processor_cpp { } } + if (v3_tuid_match(v3_process_context_requirements_iid, iid)) + { + static dpf_process_context_requirements context_req; + static dpf_process_context_requirements* context_req_ptr = &context_req;; + *iface = &context_req_ptr; + return V3_OK; + } + return V3_NO_INTERFACE; };