diff options
| author | pepper <pepper@chimecrisis.com> | 2015-01-31 21:41:28 -0800 |
|---|---|---|
| committer | pepper <pepper@chimecrisis.com> | 2015-01-31 21:41:28 -0800 |
| commit | 97587996ee9db30ce00190bdcedd8210490b99f5 (patch) | |
| tree | d8554969ac496be3a1b02a159f2a4b5b79f9492e /vstgui.sf/vstgui/plugguieditor.cpp | |
backup vst 2.4
Diffstat (limited to 'vstgui.sf/vstgui/plugguieditor.cpp')
| -rw-r--r-- | vstgui.sf/vstgui/plugguieditor.cpp | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/vstgui.sf/vstgui/plugguieditor.cpp b/vstgui.sf/vstgui/plugguieditor.cpp new file mode 100644 index 0000000..c1f1599 --- /dev/null +++ b/vstgui.sf/vstgui/plugguieditor.cpp @@ -0,0 +1,301 @@ +//----------------------------------------------------------------------------- +// VST Plug-Ins SDK +// VSTGUI: Graphical User Interface Framework for VST plugins +// +// Version 3.0 Date : 30/06/04 +// +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// VSTGUI LICENSE +// © 2004, Steinberg Media Technologies, All Rights Reserved +//----------------------------------------------------------------------------- +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Steinberg Media Technologies nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. +//----------------------------------------------------------------------------- + +#ifndef __plugguieditor__ +#include "plugguieditor.h" +#endif + +#define kIdleRate 100 // host idle rate in ms +#define kIdleRate2 50 +#define kIdleRateMin 4 // minimum time between 2 idles in ms + +#if WINDOWS +static struct tagMSG windowsMessage; +#endif + +//----------------------------------------------------------------------------- +// PluginGUIEditor Implementation +//----------------------------------------------------------------------------- +/*! @class PluginGUIEditor +This is the same as the AEffGUIEditor class except that this one allows +the VSTGUI lib to build without VST dependencies. +*/ +PluginGUIEditor::PluginGUIEditor (void *pEffect) + : effect (pEffect), frame (0), inIdleStuff (false) +{ + systemWindow = 0; + lLastTicks = getTicks (); + + #if WINDOWS + OleInitialize (0); + #endif + #if MACX + void InitMachOLibrary (); + InitMachOLibrary (); + #endif +} + +//----------------------------------------------------------------------------- +PluginGUIEditor::~PluginGUIEditor () +{ + #if WINDOWS + OleUninitialize (); + #endif + #if MACX + void ExitMachOLibrary (); + ExitMachOLibrary (); + #endif +} + +//----------------------------------------------------------------------------- +void PluginGUIEditor::draw (ERect *ppErect) +{ + if (frame) + { + if (ppErect) + { + CRect r (ppErect->left, ppErect->top, ppErect->right, ppErect->bottom); + CDrawContext context (frame, NULL, systemWindow); + frame->drawRect (&context, r); + } + else + frame->draw (); + } +} + +//----------------------------------------------------------------------------- +bool PluginGUIEditor::open (void *ptr) +{ + systemWindow = ptr; + return true; +} + +//----------------------------------------------------------------------------- +void PluginGUIEditor::idle () +{ + if (frame) + frame->idle (); +} + +//----------------------------------------------------------------------------- +long PluginGUIEditor::knobMode = kCircularMode; + +//----------------------------------------------------------------------------- +long PluginGUIEditor::setKnobMode (int val) +{ + PluginGUIEditor::knobMode = val; + return 1; +} + +//----------------------------------------------------------------------------- +bool PluginGUIEditor::onWheel (float distance) +{ + if (frame) + { + CDrawContext context (frame, NULL, systemWindow); + CPoint where; + context.getMouseLocation (where); + return frame->onWheel (&context, where, distance); + } + + return false; +} + +//----------------------------------------------------------------------------- +void PluginGUIEditor::wait (unsigned long ms) +{ + #if MAC + unsigned long ticks; + Delay (ms * 60 / 1000, &ticks); + + #elif WINDOWS + Sleep (ms); + + #endif +} + +//----------------------------------------------------------------------------- +unsigned long PluginGUIEditor::getTicks () +{ + #if MAC + return (TickCount () * 1000) / 60; + + #elif WINDOWS + return (unsigned long)GetTickCount (); + + #endif + + return 0; +} + +//----------------------------------------------------------------------------- +void PluginGUIEditor::doIdleStuff () +{ + // get the current time + unsigned long currentTicks = getTicks (); + + // YG TEST idle (); + if (currentTicks < lLastTicks) + { + #if (MAC && TARGET_API_MAC_CARBON) + RunCurrentEventLoop (kEventDurationMillisecond * kIdleRateMin); + #else + wait (kIdleRateMin); + #endif + currentTicks += kIdleRateMin; + if (currentTicks < lLastTicks - kIdleRate2) + return; + } + idle (); // TEST + + #if WINDOWS + if (PeekMessage (&windowsMessage, NULL, WM_PAINT, WM_PAINT, PM_REMOVE)) + DispatchMessage (&windowsMessage); + + #elif MACX + EventRef event; + EventTypeSpec eventTypes[] = { {kEventClassWindow, kEventWindowUpdate}, {kEventClassWindow, kEventWindowDrawContent} }; + if (ReceiveNextEvent (GetEventTypeCount (eventTypes), eventTypes, kEventDurationNoWait, true, &event) == noErr) + { + SendEventToEventTarget (event, GetEventDispatcherTarget ()); + ReleaseEvent (event); + } + #endif + + // save the next time + lLastTicks = currentTicks + kIdleRate; +} + +//----------------------------------------------------------------------------- +long PluginGUIEditor::getRect (ERect **ppErect) +{ + *ppErect = ▭ + return true; +} + +#if MACX +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +extern "C" { +#include <mach-o/dyld.h> +#include <mach-o/ldsyms.h> +} +#include <CoreFoundation/CFBundle.h> + +BEGIN_NAMESPACE_VSTGUI + +void* gBundleRef = 0; + +END_NAMESPACE_VSTGUI + +#if USE_NAMESPACE +#define VSTGUI_BUNDLEREF VSTGUI::gBundleRef +#else +#define VSTGUI_BUNDLEREF gBundleRef +#endif + +#if PLUGGUI_STANDALONE +void InitMachOLibrary () +{ + VSTGUI_BUNDLEREF = CFBundleGetMainBundle (); +} + +void ExitMachOLibrary () {} +#else +// ----------------------------------------------------------------------------- +static CFBundleRef _CFXBundleCreateFromImageName (CFAllocatorRef allocator, const char* image_name); +static CFBundleRef _CFXBundleCreateFromImageName (CFAllocatorRef allocator, const char* image_name) +{ + CFURLRef myBundleExecutableURL = CFURLCreateFromFileSystemRepresentation (allocator, (const unsigned char*)image_name, strlen (image_name), false); + if (myBundleExecutableURL == 0) + return 0; + + CFURLRef myBundleContentsMacOSURL = CFURLCreateCopyDeletingLastPathComponent (allocator, myBundleExecutableURL); // Delete Versions/Current/Executable + CFRelease (myBundleExecutableURL); + if (myBundleContentsMacOSURL == 0) + return 0; + + CFURLRef myBundleContentsURL = CFURLCreateCopyDeletingLastPathComponent (allocator, myBundleContentsMacOSURL); // Delete Current + CFRelease (myBundleContentsMacOSURL); + if (myBundleContentsURL == 0) + return 0; + + CFURLRef theBundleURL = CFURLCreateCopyDeletingLastPathComponent (allocator, myBundleContentsURL); // Delete Versions + CFRelease (myBundleContentsURL); + if (theBundleURL == 0) + return 0; + + CFBundleRef result = CFBundleCreate (allocator, theBundleURL); + CFRelease (theBundleURL); + + return result; +} + +// ----------------------------------------------------------------------------- +void InitMachOLibrary (); +void InitMachOLibrary () +{ + const mach_header* header = &_mh_bundle_header; + if (header == 0) + return; + + const char* imagename = 0; + /* determine the image name, TODO: ther have to be a better way */ + int cnt = _dyld_image_count(); + for (int idx1 = 1; idx1 < cnt; idx1++) + { + if (_dyld_get_image_header(idx1) == header) + { + imagename = _dyld_get_image_name(idx1); + break; + } + } + if (imagename == 0) + return; + /* get the bundle of a header, TODO: ther have to be a better way */ + VSTGUI_BUNDLEREF = _CFXBundleCreateFromImageName (NULL, imagename); +} + +// ----------------------------------------------------------------------------- +void ExitMachOLibrary (); +void ExitMachOLibrary () +{ + if (VSTGUI_BUNDLEREF) + CFRelease (VSTGUI_BUNDLEREF); +} + +#endif +#endif |
