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