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 cf5c997..9d981a7 100644 --- a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp @@ -934,8 +934,21 @@ namespace AAXClasses AAX_Result NotificationReceived (AAX_CTypeID type, const void* data, uint32_t size) override { - if (type == AAX_eNotificationEvent_EnteringOfflineMode) pluginInstance->setNonRealtime (true); - if (type == AAX_eNotificationEvent_ExitingOfflineMode) pluginInstance->setNonRealtime (false); + switch(type) + { + case AAX_eNotificationEvent_EnteringOfflineMode: + pluginInstance->setNonRealtime (true); + break; + + case AAX_eNotificationEvent_ExitingOfflineMode: + pluginInstance->setNonRealtime (false); + break; + + case AAX_eNotificationEvent_TrackNameChanged: + jassert(data); + pluginInstance->trackNameChanged(((AAX_IString*)data)->Get()); + break; + } return AAX_CEffectParameters::NotificationReceived (type, data, size); } diff --git a/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm b/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm index adc403c..9842d2b 100644 --- a/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm +++ b/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm @@ -166,6 +166,8 @@ public: if (syncAudioUnitWithProcessor() != noErr) jassertfalse; + + AddPropertyListener(kAudioUnitProperty_ContextName, &JuceAU::AudioUnitPropertyChanged, this); } ~JuceAU() @@ -246,6 +248,25 @@ public: } } + static void AudioUnitPropertyChanged( + void * inRefCon, + AudioUnit inUnit, + AudioUnitPropertyID inID, + AudioUnitScope inScope, + AudioUnitElement inElement) + { + JuceAU* This = (JuceAU*)inRefCon; + jassert(This); + + switch(inID) + { + case kAudioUnitProperty_ContextName: + auto contextName = String::fromCFString(This->mContextName); + This->juceFilter->trackNameChanged(contextName); + break; + } + } + //============================================================================== static OSStatus ComponentEntryDispatch (ComponentParameters* params, JuceAU* effect) { diff --git a/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm b/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm index 2e436f6..3784176 100644 --- a/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm +++ b/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm @@ -106,6 +106,38 @@ private: AudioProcessorHolder& operator= (AudioProcessorHolder&) JUCE_DELETED_FUNCTION; }; + +/* +// helper class for registering an observer for the contextName obj-c property +@interface JuceAudioUnitv3ContextNameChangedObserver:NSObject +{ +} +@end + +@implementation JuceAudioUnitv3ContextNameChangedObserver +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + jassert(context); + + NSString* newTrackName = [change objectForKey:NSKeyValueChangeNewKey]; + if(newTrackName) + { + if(auto holder = (AudioProcessorHolder*)context) + { + if(auto processor = holder->get()) + { + auto test = [newTrackName stringByAppendingString:@"AUv3"]; + processor->trackNameChanged(String::fromUTF8([test UTF8String])); + //processor->trackNameChanged(String::fromUTF8([newTrackName UTF8String])); + } + } + } +} +@end +template <> struct ContainerDeletePolicy { static void destroy (NSObject* o) { [o release]; } }; +*/ + + //============================================================================== class JuceAudioUnitv3Base { @@ -345,6 +377,9 @@ public: [paramTree removeParameterObserver: editorObserverToken]; editorObserverToken = nullptr; } + + //[au removeObserver:contextNameChangedObserver forKeyPath:@"contextName"]; + //contextNameChangedObserver = nullptr; } //============================================================================== @@ -405,6 +440,9 @@ public: addAudioUnitBusses (true); addAudioUnitBusses (false); + + //contextNameChangedObserver = [JuceAudioUnitv3ContextNameChangedObserver alloc]; + //[au addObserver:contextNameChangedObserver forKeyPath:@"contextName" options:NSKeyValueObservingOptionNew context:processorHolder.get()]; } //============================================================================== @@ -1275,6 +1313,8 @@ private: AudioTimeStamp lastTimeStamp; CurrentPositionInfo lastAudioHead; + + //ScopedPointer contextNameChangedObserver; }; const double JuceAudioUnitv3::kDefaultSampleRate = 44100.0; diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp index b07ecd4..c70a5ce 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -1012,6 +1012,7 @@ class JuceVST3Component : public Vst::IComponent, public Vst::IAudioProcessor, public Vst::IUnitInfo, public Vst::IConnectionPoint, + public Vst::ChannelContext::IInfoListener, public AudioPlayHead { public: @@ -1967,6 +1968,31 @@ public: return kResultTrue; } + tresult PLUGIN_API setChannelContextInfos (Vst::IAttributeList* list) override + { + // see ivstchannelcontextinfo.h for an example that retrieves more properties like Plug-in Channel Location (kPreVolumeFader, etc.) + jassert(pluginInstance); + + if (list) + { + // get the Channel Name where we, as Plug-in, are instantiated + Vst::String128 name; + if (list->getString (Vst::ChannelContext::kChannelNameKey, name, sizeof (name)) == kResultTrue) + { + pluginInstance->trackNameChanged(toString(name)); + } + + // get the Channel Color + int64 color; + if (list->getInt (Vst::ChannelContext::kChannelColorKey, color) == kResultTrue) + { + pluginInstance->trackColourChanged(Colour((uint32)color)); + } + } + + return kResultTrue; + } + private: //============================================================================== Atomic refCount; diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/modules/juce_audio_processors/processors/juce_AudioProcessor.h index 3b637d5..63689b8 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessor.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.h @@ -820,7 +820,18 @@ public: /** Returns true if this is a midi effect plug-in and does no audio processing. */ virtual bool isMidiEffect() const { return false; } - //============================================================================== + /** This gets called when the track- or context name changes. This is currently only supported + by AudioUnits, AAX and VST3. + */ + virtual void trackNameChanged(const String& newName) {} + + /** This gets called when the track- or context colour changes. This is currently only supported + by VST3. + */ + virtual void trackColourChanged(const Colour& colour) {} + + + //============================================================================== /** This returns a critical section that will automatically be locked while the host is calling the processBlock() method.