| @@ -27622,6 +27622,7 @@ END_JUCE_NAMESPACE | |||
| #include <AudioUnit/AudioUnit.h> | |||
| #include <AudioUnit/AUCocoaUIView.h> | |||
| #include <CoreAudioKit/AUGenericView.h> | |||
| #if JUCE_MAC && JUCE_32BIT | |||
| #define JUCE_SUPPORT_CARBON 1 | |||
| @@ -28624,7 +28625,7 @@ static VoidArray activeWindows; | |||
| class AudioUnitPluginWindowCocoa : public AudioProcessorEditor | |||
| { | |||
| public: | |||
| AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& plugin_) | |||
| AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& plugin_, const bool createGenericViewIfNeeded) | |||
| : AudioProcessorEditor (&plugin_), | |||
| plugin (plugin_), | |||
| wrapper (0) | |||
| @@ -28637,7 +28638,7 @@ public: | |||
| setVisible (true); | |||
| setSize (100, 100); | |||
| createView(); | |||
| createView (createGenericViewIfNeeded); | |||
| } | |||
| ~AudioUnitPluginWindowCocoa() | |||
| @@ -28669,51 +28670,51 @@ private: | |||
| AudioUnitPluginInstance& plugin; | |||
| NSViewComponent* wrapper; | |||
| bool createView() | |||
| bool createView (const bool createGenericViewIfNeeded) | |||
| { | |||
| NSView* pluginView = 0; | |||
| UInt32 dataSize = 0; | |||
| Boolean isWritable = false; | |||
| if (AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, | |||
| 0, &dataSize, &isWritable) != noErr | |||
| || dataSize == 0) | |||
| { | |||
| return false; | |||
| } | |||
| if (AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, | |||
| 0, &dataSize, &isWritable) != noErr) | |||
| 0, &dataSize, &isWritable) == noErr | |||
| && dataSize != 0 | |||
| && AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, | |||
| 0, &dataSize, &isWritable) == noErr) | |||
| { | |||
| return false; | |||
| } | |||
| AudioUnitCocoaViewInfo* info = (AudioUnitCocoaViewInfo*) juce_calloc (dataSize); | |||
| NSView* pluginView = 0; | |||
| AudioUnitCocoaViewInfo* info = (AudioUnitCocoaViewInfo*) juce_calloc (dataSize); | |||
| if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, | |||
| 0, info, &dataSize) == noErr) | |||
| { | |||
| NSString* viewClassName = (NSString*) (info->mCocoaAUViewClass[0]); | |||
| NSString* path = (NSString*) CFURLCopyPath (info->mCocoaAUViewBundleLocation); | |||
| NSBundle* viewBundle = [NSBundle bundleWithPath: [path autorelease]]; | |||
| Class viewClass = [viewBundle classNamed: viewClassName]; | |||
| if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, | |||
| 0, info, &dataSize) == noErr) | |||
| { | |||
| NSString* viewClassName = (NSString*) (info->mCocoaAUViewClass[0]); | |||
| NSString* path = (NSString*) CFURLCopyPath (info->mCocoaAUViewBundleLocation); | |||
| NSBundle* viewBundle = [NSBundle bundleWithPath: [path autorelease]]; | |||
| Class viewClass = [viewBundle classNamed: viewClassName]; | |||
| if ([viewClass conformsToProtocol: @protocol (AUCocoaUIBase)] | |||
| && [viewClass instancesRespondToSelector: @selector (interfaceVersion)] | |||
| && [viewClass instancesRespondToSelector: @selector (uiViewForAudioUnit: withSize:)]) | |||
| { | |||
| id factory = [[[viewClass alloc] init] autorelease]; | |||
| pluginView = [factory uiViewForAudioUnit: plugin.audioUnit | |||
| withSize: NSMakeSize (getWidth(), getHeight())]; | |||
| } | |||
| if ([viewClass conformsToProtocol: @protocol (AUCocoaUIBase)] | |||
| && [viewClass instancesRespondToSelector: @selector (interfaceVersion)] | |||
| && [viewClass instancesRespondToSelector: @selector (uiViewForAudioUnit: withSize:)]) | |||
| { | |||
| id factory = [[[viewClass alloc] init] autorelease]; | |||
| pluginView = [factory uiViewForAudioUnit: plugin.audioUnit | |||
| withSize: NSMakeSize (getWidth(), getHeight())]; | |||
| for (int i = (dataSize - sizeof (CFURLRef)) / sizeof (CFStringRef); --i >= 0;) | |||
| { | |||
| CFRelease (info->mCocoaAUViewClass[i]); | |||
| CFRelease (info->mCocoaAUViewBundleLocation); | |||
| } | |||
| } | |||
| for (int i = (dataSize - sizeof (CFURLRef)) / sizeof (CFStringRef); --i >= 0;) | |||
| { | |||
| CFRelease (info->mCocoaAUViewClass[i]); | |||
| CFRelease (info->mCocoaAUViewBundleLocation); | |||
| } | |||
| juce_free (info); | |||
| } | |||
| juce_free (info); | |||
| if (createGenericViewIfNeeded && (pluginView == 0)) | |||
| pluginView = [[AUGenericView alloc] initWithAudioUnit: plugin.audioUnit]; | |||
| wrapper->setView (pluginView); | |||
| if (pluginView != 0) | |||
| @@ -28872,7 +28873,7 @@ private: | |||
| AudioProcessorEditor* AudioUnitPluginInstance::createEditor() | |||
| { | |||
| AudioProcessorEditor* w = new AudioUnitPluginWindowCocoa (*this); | |||
| AudioProcessorEditor* w = new AudioUnitPluginWindowCocoa (*this, false); | |||
| if (! ((AudioUnitPluginWindowCocoa*) w)->isValid()) | |||
| deleteAndZero (w); | |||
| @@ -28887,6 +28888,9 @@ AudioProcessorEditor* AudioUnitPluginInstance::createEditor() | |||
| } | |||
| #endif | |||
| if (w == 0) | |||
| w = new AudioUnitPluginWindowCocoa (*this, true); // use AUGenericView as a fallback | |||
| return w; | |||
| } | |||
| @@ -35,6 +35,7 @@ | |||
| #include <AudioUnit/AudioUnit.h> | |||
| #include <AudioUnit/AUCocoaUIView.h> | |||
| #include <CoreAudioKit/AUGenericView.h> | |||
| #if JUCE_MAC && JUCE_32BIT | |||
| #define JUCE_SUPPORT_CARBON 1 | |||
| @@ -838,7 +839,7 @@ static VoidArray activeWindows; | |||
| class AudioUnitPluginWindowCocoa : public AudioProcessorEditor | |||
| { | |||
| public: | |||
| AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& plugin_) | |||
| AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& plugin_, const bool createGenericViewIfNeeded) | |||
| : AudioProcessorEditor (&plugin_), | |||
| plugin (plugin_), | |||
| wrapper (0) | |||
| @@ -851,7 +852,7 @@ public: | |||
| setVisible (true); | |||
| setSize (100, 100); | |||
| createView(); | |||
| createView (createGenericViewIfNeeded); | |||
| } | |||
| ~AudioUnitPluginWindowCocoa() | |||
| @@ -883,51 +884,51 @@ private: | |||
| AudioUnitPluginInstance& plugin; | |||
| NSViewComponent* wrapper; | |||
| bool createView() | |||
| bool createView (const bool createGenericViewIfNeeded) | |||
| { | |||
| NSView* pluginView = 0; | |||
| UInt32 dataSize = 0; | |||
| Boolean isWritable = false; | |||
| if (AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, | |||
| 0, &dataSize, &isWritable) != noErr | |||
| || dataSize == 0) | |||
| { | |||
| return false; | |||
| } | |||
| if (AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, | |||
| 0, &dataSize, &isWritable) != noErr) | |||
| 0, &dataSize, &isWritable) == noErr | |||
| && dataSize != 0 | |||
| && AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, | |||
| 0, &dataSize, &isWritable) == noErr) | |||
| { | |||
| return false; | |||
| } | |||
| NSView* pluginView = 0; | |||
| AudioUnitCocoaViewInfo* info = (AudioUnitCocoaViewInfo*) juce_calloc (dataSize); | |||
| AudioUnitCocoaViewInfo* info = (AudioUnitCocoaViewInfo*) juce_calloc (dataSize); | |||
| if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, | |||
| 0, info, &dataSize) == noErr) | |||
| { | |||
| NSString* viewClassName = (NSString*) (info->mCocoaAUViewClass[0]); | |||
| NSString* path = (NSString*) CFURLCopyPath (info->mCocoaAUViewBundleLocation); | |||
| NSBundle* viewBundle = [NSBundle bundleWithPath: [path autorelease]]; | |||
| Class viewClass = [viewBundle classNamed: viewClassName]; | |||
| if ([viewClass conformsToProtocol: @protocol (AUCocoaUIBase)] | |||
| && [viewClass instancesRespondToSelector: @selector (interfaceVersion)] | |||
| && [viewClass instancesRespondToSelector: @selector (uiViewForAudioUnit: withSize:)]) | |||
| if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, | |||
| 0, info, &dataSize) == noErr) | |||
| { | |||
| id factory = [[[viewClass alloc] init] autorelease]; | |||
| pluginView = [factory uiViewForAudioUnit: plugin.audioUnit | |||
| withSize: NSMakeSize (getWidth(), getHeight())]; | |||
| } | |||
| NSString* viewClassName = (NSString*) (info->mCocoaAUViewClass[0]); | |||
| NSString* path = (NSString*) CFURLCopyPath (info->mCocoaAUViewBundleLocation); | |||
| NSBundle* viewBundle = [NSBundle bundleWithPath: [path autorelease]]; | |||
| Class viewClass = [viewBundle classNamed: viewClassName]; | |||
| if ([viewClass conformsToProtocol: @protocol (AUCocoaUIBase)] | |||
| && [viewClass instancesRespondToSelector: @selector (interfaceVersion)] | |||
| && [viewClass instancesRespondToSelector: @selector (uiViewForAudioUnit: withSize:)]) | |||
| { | |||
| id factory = [[[viewClass alloc] init] autorelease]; | |||
| pluginView = [factory uiViewForAudioUnit: plugin.audioUnit | |||
| withSize: NSMakeSize (getWidth(), getHeight())]; | |||
| } | |||
| for (int i = (dataSize - sizeof (CFURLRef)) / sizeof (CFStringRef); --i >= 0;) | |||
| { | |||
| CFRelease (info->mCocoaAUViewClass[i]); | |||
| CFRelease (info->mCocoaAUViewBundleLocation); | |||
| for (int i = (dataSize - sizeof (CFURLRef)) / sizeof (CFStringRef); --i >= 0;) | |||
| { | |||
| CFRelease (info->mCocoaAUViewClass[i]); | |||
| CFRelease (info->mCocoaAUViewBundleLocation); | |||
| } | |||
| } | |||
| juce_free (info); | |||
| } | |||
| juce_free (info); | |||
| if (createGenericViewIfNeeded && (pluginView == 0)) | |||
| pluginView = [[AUGenericView alloc] initWithAudioUnit: plugin.audioUnit]; | |||
| wrapper->setView (pluginView); | |||
| if (pluginView != 0) | |||
| @@ -1094,7 +1095,7 @@ private: | |||
| //============================================================================== | |||
| AudioProcessorEditor* AudioUnitPluginInstance::createEditor() | |||
| { | |||
| AudioProcessorEditor* w = new AudioUnitPluginWindowCocoa (*this); | |||
| AudioProcessorEditor* w = new AudioUnitPluginWindowCocoa (*this, false); | |||
| if (! ((AudioUnitPluginWindowCocoa*) w)->isValid()) | |||
| deleteAndZero (w); | |||
| @@ -1109,6 +1110,9 @@ AudioProcessorEditor* AudioUnitPluginInstance::createEditor() | |||
| } | |||
| #endif | |||
| if (w == 0) | |||
| w = new AudioUnitPluginWindowCocoa (*this, true); // use AUGenericView as a fallback | |||
| return w; | |||
| } | |||