From 6d2df85ff7b4ea570ac8148af7167722f3be751d Mon Sep 17 00:00:00 2001 From: jules Date: Sun, 31 Aug 2014 16:29:30 +0100 Subject: [PATCH] Changed the RTAS wrapper to avoid needing to use an asyncupdater when first called. --- .../RTAS/juce_RTAS_Wrapper.cpp | 104 ++++++------------ 1 file changed, 32 insertions(+), 72 deletions(-) diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp index e3ccc2cb85..9d1cb97f3c 100644 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp @@ -157,10 +157,8 @@ class JucePlugInProcess : public CEffectProcessMIDI, public: //============================================================================== JucePlugInProcess() - : prepared (false), - sampleRate (44100.0) + : sampleRate (44100.0) { - asyncUpdater = new InternalAsyncUpdater (*this); juceFilter = createPluginFilterOfType (AudioProcessor::wrapperType_RTAS); AddChunk (juceChunkType, "Juce Audio Plugin Data"); @@ -178,11 +176,11 @@ public: midiBufferNode = nullptr; midiTransport = nullptr; - if (prepared) + if (juceFilter != nullptr) + { juceFilter->releaseResources(); - - juceFilter = nullptr; - asyncUpdater = nullptr; + juceFilter = nullptr; + } if (--numInstances == 0) { @@ -426,7 +424,7 @@ public: return dynamic_cast (fOurPlugInView); } - void GetViewRect (Rect* size) + void GetViewRect (Rect* size) override { if (JuceCustomUIView* const v = getView()) v->updateSize(); @@ -434,12 +432,12 @@ public: CEffectProcessRTAS::GetViewRect (size); } - CPlugInView* CreateCPlugInView() + CPlugInView* CreateCPlugInView() override { return new JuceCustomUIView (juceFilter, this); } - void SetViewPort (GrafPtr port) + void SetViewPort (GrafPtr port) override { CEffectProcessRTAS::SetViewPort (port); @@ -449,7 +447,7 @@ public: //============================================================================== protected: - ComponentResult GetDelaySamplesLong (long* aNumSamples) + ComponentResult GetDelaySamplesLong (long* aNumSamples) override { if (aNumSamples != nullptr) *aNumSamples = juceFilter != nullptr ? juceFilter->getLatencySamples() : 0; @@ -458,13 +456,17 @@ protected: } //============================================================================== - void EffectInit() + void EffectInit() override { + sampleRate = (double) GetSampleRate(); + jassert (sampleRate > 0); + const int maxBlockSize = (int) CEffectProcessRTAS::GetMaximumRTASQuantum(); + jassert (maxBlockSize > 0); + SFicPlugInStemFormats stems; GetProcessType()->GetStemFormats (&stems); - juceFilter->setPlayConfigDetails (fNumInputs, fNumOutputs, - juceFilter->getSampleRate(), juceFilter->getBlockSize()); + juceFilter->setPlayConfigDetails (fNumInputs, fNumOutputs, sampleRate, maxBlockSize); AddControl (new CPluginControl_OnOff ('bypa', "Master Bypass\nMastrByp\nMByp\nByp", false, true)); DefineMasterBypassControlIndex (bypassControlIndex); @@ -495,41 +497,19 @@ protected: } midiTransport = new CEffectMIDITransport (&mMIDIWorld); + midiEvents.ensureSize (2048); + + channels.calloc (jmax (juceFilter->getNumInputChannels(), + juceFilter->getNumOutputChannels())); juceFilter->setPlayHead (this); juceFilter->addListener (this); - midiEvents.ensureSize (2048); + juceFilter->prepareToPlay (sampleRate, maxBlockSize); } - void handleAsyncUpdate() + void RenderAudio (float** inputs, float** outputs, long numSamples) override { - if (! prepared) - { - sampleRate = gProcessGroup->GetSampleRate(); - jassert (sampleRate > 0); - - channels.calloc (jmax (juceFilter->getNumInputChannels(), - juceFilter->getNumOutputChannels())); - - juceFilter->setPlayConfigDetails (fNumInputs, fNumOutputs, - sampleRate, mRTGlobals->mHWBufferSizeInSamples); - - juceFilter->prepareToPlay (sampleRate, mRTGlobals->mHWBufferSizeInSamples); - - prepared = true; - } - } - - void RenderAudio (float** inputs, float** outputs, long numSamples) - { - if (! prepared) - { - asyncUpdater->triggerAsyncUpdate(); - bypassBuffers (inputs, outputs, numSamples); - return; - } - #if JucePlugin_WantsMidiInput midiEvents.clear(); @@ -623,7 +603,7 @@ protected: } //============================================================================== - ComponentResult GetChunkSize (OSType chunkID, long* size) + ComponentResult GetChunkSize (OSType chunkID, long* size) override { if (chunkID == juceChunkType) { @@ -637,7 +617,7 @@ protected: return CEffectProcessMIDI::GetChunkSize (chunkID, size); } - ComponentResult GetChunk (OSType chunkID, SFicPlugInChunk* chunk) + ComponentResult GetChunk (OSType chunkID, SFicPlugInChunk* chunk) override { if (chunkID == juceChunkType) { @@ -655,7 +635,7 @@ protected: return CEffectProcessMIDI::GetChunk (chunkID, chunk); } - ComponentResult SetChunk (OSType chunkID, SFicPlugInChunk* chunk) + ComponentResult SetChunk (OSType chunkID, SFicPlugInChunk* chunk) override { if (chunkID == juceChunkType) { @@ -674,7 +654,7 @@ protected: } //============================================================================== - ComponentResult UpdateControlValue (long controlIndex, long value) + ComponentResult UpdateControlValue (long controlIndex, long value) override { if (controlIndex != bypassControlIndex) juceFilter->setParameter (controlIndex - 2, longToFloat (value)); @@ -685,11 +665,8 @@ protected: } //============================================================================== - bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) + bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override { - // this method can only be called while the plugin is running - jassert (prepared); - Cmn_Float64 bpm = 120.0; Cmn_Int32 num = 4, denom = 4; Cmn_Int64 ticks = 0; @@ -750,40 +727,26 @@ protected: return true; } - void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) + void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override { SetControlValue (index + 2, floatToLong (newValue)); } - void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) + void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override { TouchControl (index + 2); } - void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) + void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override { ReleaseControl (index + 2); } - void audioProcessorChanged (AudioProcessor*) + void audioProcessorChanged (AudioProcessor*) override { // xxx is there an RTAS equivalent? } -public: - // Need to use an intermediate class here rather than inheriting from AsyncUpdater, so that it can - // be deleted before shutting down juce in our destructor. - class InternalAsyncUpdater : public AsyncUpdater - { - public: - InternalAsyncUpdater (JucePlugInProcess& p) : owner (p) {} - void handleAsyncUpdate() { owner.handleAsyncUpdate(); } - - private: - JucePlugInProcess& owner; - }; - - //============================================================================== private: ScopedPointer juceFilter; MidiBuffer midiEvents; @@ -791,11 +754,8 @@ private: ScopedPointer midiTransport; DirectMidiPacket midiBuffer [midiBufferSize]; - ScopedPointer asyncUpdater; - juce::MemoryBlock tempFilterData; - HeapBlock channels; - bool prepared; + HeapBlock channels; double sampleRate; static float longToFloat (const long n) noexcept