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 aaa1a16800..3a6a351dc1 100644 --- a/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm +++ b/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm @@ -78,8 +78,8 @@ using namespace juce; struct AudioProcessorHolder : public ReferenceCountedObject { - AudioProcessorHolder() {} - AudioProcessorHolder (AudioProcessor* p) : processor (p) {} + AudioProcessorHolder() = default; + explicit AudioProcessorHolder (AudioProcessor* p) : processor (p) {} AudioProcessor& operator*() noexcept { return *processor; } AudioProcessor* operator->() noexcept { return processor.get(); } AudioProcessor* get() noexcept { return processor.get(); } @@ -225,7 +225,7 @@ public: } //============================================================================== - AUAudioUnitPreset* getCurrentPreset() + AUAudioUnitPreset* getCurrentPreset() const { return factoryPresets.getAtIndex (getAudioProcessor().getCurrentProgram()); } @@ -235,12 +235,12 @@ public: getAudioProcessor().setCurrentProgram (static_cast ([preset number])); } - NSArray* getFactoryPresets() + NSArray* getFactoryPresets() const { return factoryPresets.get(); } - NSDictionary* getFullState() + NSDictionary* getFullState() const { NSMutableDictionary* retval = [[NSMutableDictionary alloc] init]; @@ -316,12 +316,12 @@ public: [modifiedState release]; } - AUParameterTree* getParameterTree() + AUParameterTree* getParameterTree() const { return paramTree.get(); } - NSArray* parametersForOverviewWithCount (int count) + NSArray* parametersForOverviewWithCount (int count) const { const int n = static_cast ([overviewParams.get() count]); @@ -335,21 +335,21 @@ public: } //============================================================================== - NSTimeInterval getLatency() + NSTimeInterval getLatency() const { auto& p = getAudioProcessor(); return p.getLatencySamples() / p.getSampleRate(); } - NSTimeInterval getTailTime() + NSTimeInterval getTailTime() const { return getAudioProcessor().getTailLengthSeconds(); } //============================================================================== - AUAudioUnitBusArray* getInputBusses() { return inputBusses.get(); } - AUAudioUnitBusArray* getOutputBusses() { return outputBusses.get(); } - NSArray* getChannelCapabilities() { return channelCapabilities.get(); } + AUAudioUnitBusArray* getInputBusses() const { return inputBusses.get(); } + AUAudioUnitBusArray* getOutputBusses() const { return outputBusses.get(); } + NSArray* getChannelCapabilities() const { return channelCapabilities.get(); } bool shouldChangeToFormat (AVAudioFormat* format, AUAudioUnitBus* auBus) { @@ -396,7 +396,7 @@ public: } //============================================================================== - int getVirtualMIDICableCount() + int getVirtualMIDICableCount() const { #if JucePlugin_WantsMidiInput return 1; @@ -405,12 +405,12 @@ public: #endif } - bool getSupportsMPE() + bool getSupportsMPE() const { return getAudioProcessor().supportsMPE(); } - NSArray* getMIDIOutputNames() + NSArray* getMIDIOutputNames() const { #if JucePlugin_ProducesMidiOutput return @[@"MIDI Out"]; @@ -420,8 +420,8 @@ public: } //============================================================================== - AUInternalRenderBlock getInternalRenderBlock() { return internalRenderBlock; } - bool getRenderingOffline() { return getAudioProcessor().isNonRealtime(); } + AUInternalRenderBlock getInternalRenderBlock() const { return internalRenderBlock; } + bool getRenderingOffline() const { return getAudioProcessor().isNonRealtime(); } void setRenderingOffline (bool offline) { auto& processor = getAudioProcessor(); @@ -436,7 +436,7 @@ public: } } - bool getShouldBypassEffect() + bool getShouldBypassEffect() const { if (bypassParam != nullptr) return (bypassParam->getValue() != 0.0f); @@ -1084,7 +1084,7 @@ private: } // When parameters are discrete we need to use integer values. - float getMaximumParameterValue (AudioProcessorParameter* juceParam) + float getMaximumParameterValue (AudioProcessorParameter* juceParam) const { #if JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE ignoreUnused (juceParam); @@ -1536,7 +1536,7 @@ private: } } - AUValue getValue (AUParameter* param) + AUValue getValue (AUParameter* param) const { if (param != nullptr) { diff --git a/modules/juce_core/native/juce_mac_ObjCHelpers.h b/modules/juce_core/native/juce_mac_ObjCHelpers.h index 8995472d65..ac67c4d75a 100644 --- a/modules/juce_core/native/juce_mac_ObjCHelpers.h +++ b/modules/juce_core/native/juce_mac_ObjCHelpers.h @@ -492,13 +492,31 @@ Class* getJuceClassFromNSObject (NSObject* obj) return obj != nullptr ? getIvar (obj, "cppObject") : nullptr; } -template -ReturnT (^CreateObjCBlock(Class* object, ReturnT (Class::*fn)(Params...))) (Params...) +namespace detail { - __block Class* _this = object; - __block ReturnT (Class::*_fn)(Params...) = fn; +template struct Signature; +template struct Signature {}; - return [[^ReturnT (Params... params) { return (_this->*_fn) (params...); } copy] autorelease]; +template +constexpr auto getSignature (Result (Class::*) (Args...)) { return Signature{}; } + +template +constexpr auto getSignature (Result (Class::*) (Args...) const) { return Signature{}; } + +template +auto createObjCBlockImpl (Class* object, Fn func, Signature) +{ + __block auto _this = object; + __block auto _func = func; + + return [[^Result (Params... params) { return (_this->*_func) (params...); } copy] autorelease]; +} +} // namespace detail + +template +auto CreateObjCBlock (Class* object, MemberFunc fn) +{ + return detail::createObjCBlockImpl (object, fn, detail::getSignature (fn)); } template