From e7f77abc6864633ba7161ef29f089f491825ecfd Mon Sep 17 00:00:00 2001 From: jules Date: Mon, 24 Sep 2012 20:03:51 +0100 Subject: [PATCH] Audio plugins: new DllMain handling. --- .../AAX/juce_AAX_Wrapper.cpp | 14 +--- .../RTAS/juce_RTAS_DigiCode3.cpp | 76 +++++++++++-------- .../VST/juce_VST_Wrapper.cpp | 30 ++++---- .../mouse/juce_MouseCursor.cpp | 3 + 4 files changed, 66 insertions(+), 57 deletions(-) diff --git a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp index ada08fd7b8..c30b2d2ab4 100644 --- a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp @@ -51,14 +51,10 @@ #include "AAX_IViewContainer.h" #if JUCE_WINDOWS -static HINSTANCE moduleInstance = 0; - -extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD selector, LPVOID) +void __stdcall DllMainAAX (HINSTANCE instance, DWORD reason) { - if (selector == DLL_PROCESS_ATTACH) - moduleInstance = instance; - - return true; + if (reason == DLL_PROCESS_ATTACH) + Process::setCurrentModuleInstanceHandle (instance); } #endif @@ -140,10 +136,6 @@ struct AAXClasses private: static void initialise() { - #if JUCE_WINDOWS - Process::setCurrentModuleInstanceHandle (moduleInstance); - #endif - initialiseJuce_GUI(); } diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp index b73d644390..6c14ad2858 100644 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp +++ b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp @@ -31,9 +31,9 @@ #if JucePlugin_Build_RTAS -#include "juce_RTAS_DigiCode_Header.h" + #include "juce_RTAS_DigiCode_Header.h" -/* + /* This file is used to include and build the required digidesign CPP files without your project needing to reference the files directly. Because these files will be found via your include path, this means that the project doesn't have to change to cope with people's SDKs being in different @@ -46,47 +46,63 @@ If you get an error building the includes statements below, check your paths - there's a full list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp -*/ + */ -#if WINDOWS_VERSION -//============================================================================== - - #undef _UNICODE - #undef UNICODE - - #if JucePlugin_Build_VST + #if WINDOWS_VERSION + #undef _UNICODE + #undef UNICODE #define DllMain DllMainRTAS #include #undef DllMain + #include - extern BOOL WINAPI DllMainVST (HINSTANCE instance, DWORD dwReason, LPVOID); - - // This overloaded DllMain can work as either an RTAS or a VST.. - extern "C" BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD ul_reason_for_call, LPVOID lpReserved) - { - if (GetModuleHandleA ("DAE.DLL") != 0) - return DllMainRTAS (hInstance, ul_reason_for_call, lpReserved); - else - return DllMainVST (hInstance, ul_reason_for_call, lpReserved); - } #else - #include + #include + #include #endif - #include + #else + + #if _MSC_VER + short __stdcall NewPlugIn (void*) { return 0; } + short __stdcall _PI_GetRoutineDescriptor (long, void*) { return 0; } + #endif -#else - //============================================================================== - #include - #include #endif -#else +//============================================================================== #if _MSC_VER - short __stdcall NewPlugIn (void*) { return 0; } - short __stdcall _PI_GetRoutineDescriptor (long, void*) { return 0; } -#endif + #if ! JucePlugin_Build_RTAS + #include + #endif + #if JucePlugin_Build_VST + extern void __stdcall DllMainVST (HINSTANCE, DWORD); + #endif + + #if JucePlugin_Build_AAX + extern void __stdcall DllMainAAX (HINSTANCE, DWORD); + #endif + + extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD reason, LPVOID reserved) + { + (void) reserved; + + #if JucePlugin_Build_VST + DllMainVST (instance, reason); + #endif + + #if JucePlugin_Build_AAX + DllMainAAX (instance, reason); + #endif + + #if JucePlugin_Build_RTAS + if (GetModuleHandleA ("DAE.DLL") != 0) + return DllMainRTAS (instance, reason, reserved); + #endif + + return TRUE; + } #endif diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp index faf09fb69a..964d15df19 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp @@ -1477,19 +1477,23 @@ namespace } } +#if ! JUCE_WINDOWS + #define JUCE_EXPORTED_FUNCTION extern "C" __attribute__ ((visibility("default"))) +#endif + //============================================================================== // Mac startup code.. #if JUCE_MAC - extern "C" __attribute__ ((visibility("default"))) AEffect* VSTPluginMain (audioMasterCallback audioMaster); - extern "C" __attribute__ ((visibility("default"))) AEffect* VSTPluginMain (audioMasterCallback audioMaster) + JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster); + JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster) { initialiseMac(); return pluginEntryPoint (audioMaster); } - extern "C" __attribute__ ((visibility("default"))) AEffect* main_macho (audioMasterCallback audioMaster); - extern "C" __attribute__ ((visibility("default"))) AEffect* main_macho (audioMasterCallback audioMaster) + JUCE_EXPORTED_FUNCTION AEffect* main_macho (audioMasterCallback audioMaster); + JUCE_EXPORTED_FUNCTION AEffect* main_macho (audioMasterCallback audioMaster) { initialiseMac(); return pluginEntryPoint (audioMaster); @@ -1499,15 +1503,15 @@ namespace // Linux startup code.. #elif JUCE_LINUX - extern "C" __attribute__ ((visibility("default"))) AEffect* VSTPluginMain (audioMasterCallback audioMaster) + JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster); + JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster) { SharedMessageThread::getInstance(); return pluginEntryPoint (audioMaster); } - extern "C" __attribute__ ((visibility("default"))) AEffect* main_plugin (audioMasterCallback audioMaster) asm ("main"); - - extern "C" __attribute__ ((visibility("default"))) AEffect* main_plugin (audioMasterCallback audioMaster) + JUCE_EXPORTED_FUNCTION AEffect* main_plugin (audioMasterCallback audioMaster) asm ("main"); + JUCE_EXPORTED_FUNCTION AEffect* main_plugin (audioMasterCallback audioMaster) { return VSTPluginMain (audioMaster); } @@ -1532,16 +1536,10 @@ namespace } #endif - #if JucePlugin_Build_RTAS - BOOL WINAPI DllMainVST (HINSTANCE instance, DWORD dwReason, LPVOID) - #else - extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD dwReason, LPVOID) - #endif + void __stdcall DllMainVST (HINSTANCE instance, DWORD reason) { - if (dwReason == DLL_PROCESS_ATTACH) + if (reason == DLL_PROCESS_ATTACH) Process::setCurrentModuleInstanceHandle (instance); - - return TRUE; } #endif diff --git a/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp b/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp index 8cfab6042a..b38d764733 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp @@ -38,6 +38,9 @@ struct CustomMouseCursorInfo Image image; const Point hotspot; float scaleFactor; + +private: + JUCE_DECLARE_NON_COPYABLE (CustomMouseCursorInfo); }; class MouseCursor::SharedCursorHandle