AudioProcessorGraph for a VST Plugin

I’ve pasted some code from different places, so I hope it all makes sense.

This is the main filter: .h

[code]class MyFilter : public AudioProcessor,
public ChangeBroadcaster
{
public:
MyFilter();
~MyFilter();

void prepareToPlay (double sampleRate, int samplesPerBlock);
void releaseResources();

void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages);

AudioProcessorEditor* createEditor();

const String getName() const;

int getNumParameters();

float getParameter (int index);
void setParameter (int index, float newValue);

const String getParameterName (int index);
const String getParameterText (int index);

const String getInputChannelName (const int channelIndex) const;
const String getOutputChannelName (const int channelIndex) const;
bool isInputChannelStereoPair (int index) const;
bool isOutputChannelStereoPair (int index) const;

bool acceptsMidi() const;
bool producesMidi() const;

int getNumPrograms()                                        { return 0; }
int getCurrentProgram()                                     { return 0; }
void setCurrentProgram (int index)                          { }
const String getProgramName (int index)                     { return String::empty; }
void changeProgramName (int index, const String& newName)   { }

void getStateInformation (MemoryBlock& destData);
void setStateInformation (const void* data, int sizeInBytes);

juce_UseDebuggingNewOperator

private:
AudioProcessorGraph graph;

AudioProcessorGraph::AudioGraphIOProcessor* ioProcIn;
AudioProcessorGraph::AudioGraphIOProcessor* ioProcOut;
AudioProcessorGraph::AudioGraphIOProcessor* ioProcMidiIn;

AudioProcessorGraph::Node* ioProcInNode;
AudioProcessorGraph::Node* ioProcOutNode;
AudioProcessorGraph::Node* ioProcMidiInNode;

MyAudioProcessor* myProcessor;

};[/code]
.cpp

[code]MyFilter::MyFilter()
: ioProcIn (0),
ioProcOut (0),
ioProcMidiIn (0),
ioProcOutNode (0),
ioProcMidiInNode (0)
{
ioProcOut = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode);
ioProcMidiIn = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::midiInputNode);

ioProcOutNode = graph.addNode (ioProcOut);
ioProcMidiInNode = graph.addNode (ioProcMidiIn);

AudioProcessorGraph::Node* sbNode = graph.addNode (myProcessor = new MyAudioProcessor());
myProcessor->setNodeID (sbNode->id);

}

MyFilter::~MyFilter()
{
}

//==============================================================================
const String MyFilter::getName() const
{
return “My Plugin”;
}

int MyFilter::getNumParameters()
{
return 1;
}

float MyFilter::getParameter (int index)
{
return 0.0f;
}

void MyFilter::setParameter (int index, float newValue)
{
}

const String MyFilter::getParameterName (int index)
{
return String::empty;
}

const String MyFilter::getParameterText (int index)
{
return String::empty;
}

const String MyFilter::getInputChannelName (const int channelIndex) const
{
return String (channelIndex + 1);
}

const String MyFilter::getOutputChannelName (const int channelIndex) const
{
return String (channelIndex + 1);
}

bool MyFilter::isInputChannelStereoPair (int index) const
{
return false;
}

bool MyFilter::isOutputChannelStereoPair (int index) const
{
return false;
}

bool MyFilter::acceptsMidi() const
{
return true;
}

bool MyFilter::producesMidi() const
{
return true;
}

//==============================================================================
void MyFilter::prepareToPlay (double sampleRate, int samplesPerBlock)
{
// do your pre-playback setup stuff here…
graph.setPlayConfigDetails (getNumInputChannels(), getNumOutputChannels(), sampleRate, samplesPerBlock);

graph.prepareToPlay (sampleRate, samplesPerBlock);


graph.addConnection (myProcessor->getNodeID(), 0, ioProcOutNode->id, 0);
graph.addConnection (myProcessor->getNodeID(), 1, ioProcOutNode->id, 1);

}

void MyFilter::releaseResources()
{
// when playback stops, you can use this as an opportunity to free up any
// spare memory, etc.

graph.releaseResources();

}

void MyFilter::processBlock (AudioSampleBuffer& buffer,
MidiBuffer& midiMessages)
{
graph.processBlock (buffer, midiMessages);
}

//==============================================================================
AudioProcessorEditor* MyFilter::createEditor()
{
return new MainEditorComponent (this);
}

//==============================================================================
void MyFilter::getStateInformation (MemoryBlock& destData)
{
}

void MyFilter::setStateInformation (const void* data, int sizeInBytes)
{
}[/code]

And I’m hooking up a MyAudioProcessor* in to the grap, just for this example I’m making all the connections in prepareToPlay method.

Here’s MyAudioProcessor .h

[code]class MyAudioProcessor : public AudioProcessor
{
public:
MyAudioProcessor();
~MyAudioProcessor();

const String getName() const;
void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock);
void releaseResources();
void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages);

const String getInputChannelName (const int channelIndex) const;
const String getOutputChannelName (const int channelIndex) const;

bool isInputChannelStereoPair (int index) const;
bool isOutputChannelStereoPair (int index) const;

bool acceptsMidi() const;
bool producesMidi() const;

AudioProcessorEditor* createEditor() { return 0; }

int getNumParameters() { return 1; }
const String getParameterName (int parameterIndex) { return String::empty; }
float getParameter (int parameterIndex) { return 0.0f; }
const String getParameterText (int parameterIndex) { return String::empty; }
void setParameter (int parameterIndex, float newValue) {  }

int getNumPrograms() { return 1; }
int getCurrentProgram() { return 0; }
void setCurrentProgram (int index) { }
const String getProgramName (int index) { return String::empty; }
void changeProgramName (int index, const String& newName) { }

void getStateInformation (MemoryBlock& destData) { }
void getCurrentProgramStateInformation (MemoryBlock& destData) { }
void setStateInformation (const void* data, int sizeInBytes) { }

void setNodeID (int32 newNodeID) { nodeID = newNodeID; }
int32 getNodeID() { return nodeID; }

private:
int32 nodeID;
MixerAudioSource* mixer;
};[/code]

.cpp

MyAudioProcessor::MyAudioProcessor() { } MyAudioProcessor::~MyAudioProcessor() { } const String MyAudioProcessor::getName() const { return "My Audio Processor"; } void MyAudioProcessor::prepareToPlay (double sampleRate, int estimatedSamplesPerBlock) { setPlayConfigDetails (0, 2, sampleRate, estimatedSamplesPerBlock); } void MyAudioProcessor::releaseResources() { } void MyAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) { } const String MyAudioProcessor::getInputChannelName (const int channelIndex) const { return String (channelIndex + 1); } const String MyAudioProcessor::getOutputChannelName (const int channelIndex) const { return String (channelIndex + 1); } bool MyAudioProcessor::isInputChannelStereoPair (int index) const { return false; } bool MyAudioProcessor::isOutputChannelStereoPair (int index) const { return false; } bool MyAudioProcessor::acceptsMidi() const { return false; } bool MyAudioProcessor::producesMidi() const { return false; }

HTH