From bbcf4464542d39f81ee812b0d3eb7cbfd895a46b Mon Sep 17 00:00:00 2001 From: jules Date: Thu, 23 Jan 2014 09:47:01 +0000 Subject: [PATCH] VST3 hosting fixes. --- .../format_types/juce_VST3PluginFormat.cpp | 62 ++++++++++--------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp index b7528cc3cf..232cbed119 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -299,9 +299,10 @@ static int getNumSingleDirectionChannelsFor (Vst::IComponent* component, return numChannels; } -static void activateAllBussesOfType (Vst::IComponent* component, - bool activateInputs, - bool activateAudioChannels) +static void setStateForAllBussesOfType (Vst::IComponent* component, + bool state, + bool activateInputs, + bool activateAudioChannels) { jassert (component != nullptr); @@ -310,7 +311,7 @@ static void activateAllBussesOfType (Vst::IComponent* component, const Steinberg::int32 numBuses = component->getBusCount (mediaType, direction); for (Steinberg::int32 i = numBuses; --i >= 0;) - warnOnFailure (component->activateBus (mediaType, direction, i, true)); + warnOnFailure (component->activateBus (mediaType, direction, i, state)); } //============================================================================== @@ -1712,7 +1713,6 @@ public: : module (handle), numInputAudioBusses (0), numOutputAudioBusses (0), - resultBuffer (1, 1), inputParameterChanges (new ParameterChangeList()), outputParameterChanges (new ParameterChangeList()), midiInputs (new MidiEventList()), @@ -1794,7 +1794,8 @@ public: return module != nullptr ? module->name : String::empty; } - typedef Array > BusMap; + typedef Array ChannelMap; + typedef Array BusMap; /** Assigns a series of AudioSampleBuffer's channels to an AudioBusBuffers' @@ -1802,7 +1803,7 @@ public: according to the AudioSampleBuffer */ void associateBufferTo (Vst::AudioBusBuffers& vstBuffers, - BusMap& busMap, + ChannelMap& channelMap, const AudioSampleBuffer& buffer, int numChannels, int channelStartOffset, int sampleOffset = 0) noexcept @@ -1810,13 +1811,12 @@ public: const int channelEnd = numChannels + channelStartOffset; jassert (channelEnd >= 0 && channelEnd <= buffer.getNumChannels()); - busMap.add (Array()); - Array& chans = busMap.getReference (busMap.size() - 1); + channelMap.clearQuick(); for (int i = channelStartOffset; i < channelEnd; ++i) - chans.add (buffer.getSampleData (i, sampleOffset)); + channelMap.add (buffer.getSampleData (i, sampleOffset)); - vstBuffers.channelBuffers32 = chans.getRawDataPointer(); + vstBuffers.channelBuffers32 = channelMap.getRawDataPointer(); vstBuffers.numChannels = numChannels; vstBuffers.silenceFlags = 0; } @@ -1825,10 +1825,7 @@ public: AudioSampleBuffer& source, int numBusses, bool isInput) { - result.clearQuick(); - BusMap& busMapToUse = isInput ? inputBusMap : outputBusMap; - busMapToUse.clearQuick(); int channelIndexOffset = 0; @@ -1840,9 +1837,13 @@ public: const int numChansForBus = BigInteger ((int64) arrangement).countNumberOfSetBits(); - result.add (Vst::AudioBusBuffers()); + if (i >= result.size()) + result.add (Vst::AudioBusBuffers()); - associateBufferTo (result.getReference (i), busMapToUse, source, + if (i >= busMapToUse.size()) + busMapToUse.add (ChannelMap()); + + associateBufferTo (result.getReference (i), busMapToUse.getReference (i), source, BigInteger ((int64) arrangement).countNumberOfSetBits(), channelIndexOffset); @@ -1866,8 +1867,6 @@ public: setup.sampleRate = sampleRate; setup.processMode = isNonRealtime() ? kOffline : kRealtime; - resultBuffer.setSize (numOutputs, estimatedSamplesPerBlock, false, true, true); - warnOnFailure (processor->setupProcessing (setup)); if (! isComponentInitialised) @@ -1875,8 +1874,7 @@ public: editController->setComponentHandler (host); - warnOnFailure (component->setActive (true)); - warnOnFailure (processor->setProcessing (true)); + setStateForAllBusses (true); Array inArrangements, outArrangements; @@ -1885,13 +1883,16 @@ public: warnOnFailure (processor->setBusArrangements (inArrangements.getRawDataPointer(), numInputAudioBusses, outArrangements.getRawDataPointer(), numOutputAudioBusses)); + + warnOnFailure (component->setActive (true)); + warnOnFailure (processor->setProcessing (true)); } void releaseResources() override { JUCE_TRY { - resultBuffer.setSize (1, 1, false, true, true); + setStateForAllBusses (false); if (processor != nullptr) processor->setProcessing (false); @@ -1929,7 +1930,6 @@ public: associateTo (data, midiMessages); processor->process (data); - buffer = resultBuffer; MidiEventList::toMidiBuffer (midiMessages, *midiOutputs); } @@ -2154,7 +2154,6 @@ private: as very poorly specified by the Steinberg SDK */ int numInputAudioBusses, numOutputAudioBusses; - AudioSampleBuffer resultBuffer; BusMap inputBusMap, outputBusMap; Array inputBusses, outputBusses; @@ -2369,12 +2368,17 @@ private: if (componentHandler2 == nullptr) componentHandler2.loadFrom (editController); } + void setStateForAllBusses (bool newState) + { + setStateForAllBussesOfType (component, newState, true, true); // Activate/deactivate audio inputs + setStateForAllBussesOfType (component, newState, false, true); // Activate/deactivate audio outputs + setStateForAllBussesOfType (component, newState, true, false); // Activate/deactivate MIDI inputs + setStateForAllBussesOfType (component, newState, false, false); // Activate/deactivate MIDI outputs + } + void setupIO() { - activateAllBussesOfType (component, true, true); // Activate audio inputs - activateAllBussesOfType (component, false, true); // Activate audio outputs - activateAllBussesOfType (component, true, false); // Activate MIDI inputs - activateAllBussesOfType (component, false, false); // Activate MIDI outputs + setStateForAllBusses (true); Vst::ProcessSetup setup; setup.symbolicSampleSize = Vst::kSample32; @@ -2421,10 +2425,8 @@ private: //============================================================================== void associateTo (Vst::ProcessData& destination, AudioSampleBuffer& buffer) { - resultBuffer.clear(); - mapAudioSampleBufferToBusses (inputBusses, buffer, numInputAudioBusses, true); - mapAudioSampleBufferToBusses (outputBusses, resultBuffer, numOutputAudioBusses, false); + mapAudioSampleBufferToBusses (outputBusses, buffer, numOutputAudioBusses, false); destination.inputs = inputBusses.getRawDataPointer(); destination.outputs = outputBusses.getRawDataPointer();