From 0f6aab6af19b59487484ded1610b9db52e17ec32 Mon Sep 17 00:00:00 2001 From: jules Date: Fri, 2 Jan 2009 10:24:47 +0000 Subject: [PATCH] fixes for Mac MessageManager::callFunctionOnMessageThread, plugin file location in VST and RTAS plugins, and midi messages in VST plugins --- .../juce_mac_MessageManager.mm | 3 +- .../wrapper/RTAS/juce_RTAS_MacUtilities.mm | 209 +++++++++--------- .../wrapper/VST/juce_VST_Wrapper.cpp | 4 + juce_amalgamated.cpp | 6 +- juce_amalgamated.h | 3 + .../plugins/formats/juce_VSTMidiEventList.h | 3 + 6 files changed, 125 insertions(+), 103 deletions(-) diff --git a/build/macosx/platform_specific_code/juce_mac_MessageManager.mm b/build/macosx/platform_specific_code/juce_mac_MessageManager.mm index 649798c405..1853ab9fc2 100644 --- a/build/macosx/platform_specific_code/juce_mac_MessageManager.mm +++ b/build/macosx/platform_specific_code/juce_mac_MessageManager.mm @@ -359,7 +359,8 @@ void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* call [juceAppDelegate performSelectorOnMainThread: @selector (performCallback:) withObject: [NSData dataWithBytesNoCopy: &cmp - length: sizeof (cmp)] + length: sizeof (cmp) + freeWhenDone: NO] waitUntilDone: YES]; return cmp.result; diff --git a/extras/audio plugins/wrapper/RTAS/juce_RTAS_MacUtilities.mm b/extras/audio plugins/wrapper/RTAS/juce_RTAS_MacUtilities.mm index 5d54f709af..7febd75865 100644 --- a/extras/audio plugins/wrapper/RTAS/juce_RTAS_MacUtilities.mm +++ b/extras/audio plugins/wrapper/RTAS/juce_RTAS_MacUtilities.mm @@ -1,101 +1,108 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - JUCE is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -// If you get an error here, you might need to make sure that -// your build config files don't specify "C++" as one of the -// flags in OTHER_CFLAGS, because that stops the compiler building -// obj-c files correctly. -@class dummyclassname; - -#include -#include "../juce_PluginHeaders.h" - -#if JucePlugin_Build_RTAS - - -//============================================================================== -void initialiseMacRTAS() -{ - NSApplicationLoad(); -} - -void* attachSubWindow (void* hostWindowRef, Component* comp) -{ - const ScopedAutoReleasePool pool; - - NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: hostWindowRef]; - [hostWindow retain]; - [hostWindow setCanHide: YES]; - [hostWindow setReleasedWhenClosed: YES]; - - NSView* content = [hostWindow contentView]; - NSRect f = [content frame]; - f.size.width = comp->getWidth(); - f.size.height = comp->getHeight(); - [content setFrame: f]; - - NSPoint windowPos = [hostWindow convertBaseToScreen: f.origin]; - windowPos.y = [[NSScreen mainScreen] frame].size.height - (windowPos.y + f.size.height); - - comp->setTopLeftPosition ((int) windowPos.x, (int) windowPos.y); - -#if ! JucePlugin_EditorRequiresKeyboardFocus - comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); -#else - comp->addToDesktop (ComponentPeer::windowIsTemporary); -#endif - - comp->setVisible (true); - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - - [hostWindow addChildWindow: pluginWindow - ordered: NSWindowAbove]; - [hostWindow orderFront: nil]; - [pluginWindow orderFront: nil]; - return hostWindow; -} - -void removeSubWindow (void* nsWindow, Component* comp) -{ - const ScopedAutoReleasePool pool; - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* hostWindow = (NSWindow*) nsWindow; - NSWindow* pluginWindow = [pluginView window]; - - [hostWindow removeChildWindow: pluginWindow]; - comp->removeFromDesktop(); - [hostWindow release]; -} - -#endif +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the + GNU General Public License, as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later version. + + JUCE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +// If you get an error here, you might need to make sure that +// your build config files don't specify "C++" as one of the +// flags in OTHER_CFLAGS, because that stops the compiler building +// obj-c files correctly. +@class dummyclassname; + +#include +#include "../juce_PluginHeaders.h" + +#if JucePlugin_Build_RTAS + +BEGIN_JUCE_NAMESPACE + extern void juce_setCurrentExecutableFileNameFromBundleId (const String& bundleId) throw(); +END_JUCE_NAMESPACE + +//============================================================================== +void initialiseMacRTAS() +{ + NSApplicationLoad(); + +#if defined (JucePlugin_CFBundleIdentifier) + juce_setCurrentExecutableFileNameFromBundleId (JucePlugin_CFBundleIdentifier); +#endif +} + +void* attachSubWindow (void* hostWindowRef, Component* comp) +{ + const ScopedAutoReleasePool pool; + + NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: hostWindowRef]; + [hostWindow retain]; + [hostWindow setCanHide: YES]; + [hostWindow setReleasedWhenClosed: YES]; + + NSView* content = [hostWindow contentView]; + NSRect f = [content frame]; + f.size.width = comp->getWidth(); + f.size.height = comp->getHeight(); + [content setFrame: f]; + + NSPoint windowPos = [hostWindow convertBaseToScreen: f.origin]; + windowPos.y = [[NSScreen mainScreen] frame].size.height - (windowPos.y + f.size.height); + + comp->setTopLeftPosition ((int) windowPos.x, (int) windowPos.y); + +#if ! JucePlugin_EditorRequiresKeyboardFocus + comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); +#else + comp->addToDesktop (ComponentPeer::windowIsTemporary); +#endif + + comp->setVisible (true); + + NSView* pluginView = (NSView*) comp->getWindowHandle(); + NSWindow* pluginWindow = [pluginView window]; + + [hostWindow addChildWindow: pluginWindow + ordered: NSWindowAbove]; + [hostWindow orderFront: nil]; + [pluginWindow orderFront: nil]; + return hostWindow; +} + +void removeSubWindow (void* nsWindow, Component* comp) +{ + const ScopedAutoReleasePool pool; + + NSView* pluginView = (NSView*) comp->getWindowHandle(); + NSWindow* hostWindow = (NSWindow*) nsWindow; + NSWindow* pluginWindow = [pluginView window]; + + [hostWindow removeChildWindow: pluginWindow]; + comp->removeFromDesktop(); + [hostWindow release]; +} + +#endif diff --git a/extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp b/extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp index a31861f06a..c41d93a38c 100644 --- a/extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp +++ b/extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp @@ -1487,7 +1487,11 @@ extern "C" __declspec (dllexport) void* main (audioMasterCallback audioMaster) } #endif +#if JucePlugin_Build_RTAS BOOL WINAPI DllMainVST (HINSTANCE instance, DWORD dwReason, LPVOID) +#else +extern "C" BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD ul_reason_for_call, LPVOID lpReserved) +#endif { if (dwReason == DLL_PROCESS_ATTACH) PlatformUtilities::setCurrentModuleInstanceHandle (instance); diff --git a/juce_amalgamated.cpp b/juce_amalgamated.cpp index 334a23440a..2ca3a850d4 100644 --- a/juce_amalgamated.cpp +++ b/juce_amalgamated.cpp @@ -29626,6 +29626,9 @@ public: void clear() { numEventsUsed = 0; + + if (events != 0) + events->numEvents = 0; } void addEvent (const void* const midiData, const int numBytes, const int frameOffset) @@ -268922,7 +268925,8 @@ void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* call [juceAppDelegate performSelectorOnMainThread: @selector (performCallback:) withObject: [NSData dataWithBytesNoCopy: &cmp - length: sizeof (cmp)] + length: sizeof (cmp) + freeWhenDone: NO] waitUntilDone: YES]; return cmp.result; diff --git a/juce_amalgamated.h b/juce_amalgamated.h index 3724a984b1..35fb740344 100644 --- a/juce_amalgamated.h +++ b/juce_amalgamated.h @@ -34933,6 +34933,9 @@ public: void clear() { numEventsUsed = 0; + + if (events != 0) + events->numEvents = 0; } void addEvent (const void* const midiData, const int numBytes, const int frameOffset) diff --git a/src/juce_appframework/audio/plugins/formats/juce_VSTMidiEventList.h b/src/juce_appframework/audio/plugins/formats/juce_VSTMidiEventList.h index 59021a6e73..b51db0367b 100644 --- a/src/juce_appframework/audio/plugins/formats/juce_VSTMidiEventList.h +++ b/src/juce_appframework/audio/plugins/formats/juce_VSTMidiEventList.h @@ -59,6 +59,9 @@ public: void clear() { numEventsUsed = 0; + + if (events != 0) + events->numEvents = 0; } void addEvent (const void* const midiData, const int numBytes, const int frameOffset)