From 46b16cb9210db0b998bb0e123ed0b3f6c625bb4a Mon Sep 17 00:00:00 2001 From: jules Date: Sun, 20 Jan 2013 19:19:00 +0000 Subject: [PATCH] AAX midi out. --- .../AAX/juce_AAX_Wrapper.cpp | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) 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 de0f90e5e2..c4778cba70 100644 --- a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp @@ -183,6 +183,7 @@ struct AAXClasses int32_t* bufferSize; int32_t* bypass; AAX_IMIDINode* midiNodeIn; + AAX_IMIDINode* midiNodeOut; PluginInstanceInfo* pluginInstance; int32_t* isPrepared; @@ -197,6 +198,7 @@ struct AAXClasses bufferSize = AAX_FIELD_INDEX (JUCEAlgorithmContext, bufferSize), bypass = AAX_FIELD_INDEX (JUCEAlgorithmContext, bypass), midiNodeIn = AAX_FIELD_INDEX (JUCEAlgorithmContext, midiNodeIn), + midiNodeOut = AAX_FIELD_INDEX (JUCEAlgorithmContext, midiNodeOut), pluginInstance = AAX_FIELD_INDEX (JUCEAlgorithmContext, pluginInstance), preparedFlag = AAX_FIELD_INDEX (JUCEAlgorithmContext, isPrepared) }; @@ -503,7 +505,7 @@ struct AAXClasses } void process (const float* const* inputs, float* const* outputs, const int bufferSize, - const bool bypass, AAX_IMIDINode* midiNodeIn) + const bool bypass, AAX_IMIDINode* midiNodeIn, AAX_IMIDINode* midiNodeOut) { const int numIns = pluginInstance->getNumInputChannels(); const int numOuts = pluginInstance->getNumOutputChannels(); @@ -513,7 +515,7 @@ struct AAXClasses for (int i = 0; i < numIns; ++i) memcpy (outputs[i], inputs[i], bufferSize * sizeof (float)); - process (outputs, numOuts, bufferSize, bypass, midiNodeIn); + process (outputs, numOuts, bufferSize, bypass, midiNodeIn, midiNoteOut); } else { @@ -531,7 +533,7 @@ struct AAXClasses for (int i = numOuts; i < numIns; ++i) channels[i] = const_cast (inputs[i]); - process (channels, numIns, bufferSize, bypass, midiNodeIn); + process (channels, numIns, bufferSize, bypass, midiNodeIn, midiNoteOut); } } @@ -566,7 +568,7 @@ struct AAXClasses }; void process (float* const* channels, const int numChans, const int bufferSize, - const bool bypass, AAX_IMIDINode* midiNodeIn) + const bool bypass, AAX_IMIDINode* midiNodeIn, AAX_IMIDINode* midiNodeOut) { AudioSampleBuffer buffer (channels, numChans, bufferSize); @@ -598,6 +600,31 @@ struct AAXClasses else pluginInstance->processBlock (buffer, midiBuffer); } + + #if JucePlugin_ProducesMidiOutput + { + const juce::uint8* midiEventData; + int midiEventSize, midiEventPosition; + MidiBuffer::Iterator i (midiBuffer); + + AAX_CMidiPacket packet; + packet.mIsImmediate = false; + + while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) + { + jassert (isPositiveAndBelow (midiEventPosition, bufferSize)); + + if (midiEventSize <= 4) + { + packet.mTimestamp = (uint32_t) midiEventPosition; + packet.mLength = (uint32_t) midiEventSize; + memcpy (packet.mData, midiEventData, midiEventSize); + + check (midiNodeOut->PostMIDIPacket (&packet)); + } + } + } + #endif } void addBypassParameter() @@ -689,7 +716,7 @@ struct AAXClasses i.pluginInstance->parameters.process (i.inputChannels, i.outputChannels, *(i.bufferSize), *(i.bypass) != 0, - i.midiNodeIn); + i.midiNodeIn, i.midiNodeOut); } } @@ -707,6 +734,11 @@ struct AAXClasses JucePlugin_Name, 0xffff)); #endif + #if JucePlugin_ProducesMidiOutput + check (desc.AddMIDINode (JUCEAlgorithmIDs::midiNodeOut, AAX_eMIDINodeType_LocalOutput, + JucePlugin_Name " Out", 0xffff)); + #endif + check (desc.AddPrivateData (JUCEAlgorithmIDs::pluginInstance, sizeof (PluginInstanceInfo))); // Create a property map