# Very Basic Usage of AudioProcessorGraph

**URL:** <https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624>\
**Category:** Audio Plugins\
**Created:** [April 3, 2017, 11:38am UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624 "2017-04-03T11:38:27Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![hyakken](https://avatars.discourse-cdn.com/v4/letter/h/d9b06d/32.png) [@hyakken](https://forum.juce.com/u/hyakken)\
**Post date:** [April 3, 2017, 11:38am UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624/1 "2017-04-03T11:38:27Z")

</div>

Hello,

I’m trying to figure out how to use AudioProcessorGraph.  
I made simple plugin following this post.

> [@AudioProcessorGraph for a VST Plugin](https://forum.juce.com/t/audioprocessorgraph-for-a-vst-plugin/4545/2):
>
> 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 in…

Signal path is like this

Audio In —\> myProcessor ------\> Audio Out

private:

```
AudioProcessorGraph myGraph_;
AudioProcessorGraph::AudioGraphIOProcessor* ioProcIn_;
AudioProcessorGraph::AudioGraphIOProcessor* ioProcOut_;
AudioProcessorGraph::AudioGraphIOProcessor* ioProcMidiIn_;
AudioProcessorGraph::AudioGraphIOProcessor* ioProcMidiOut_;

AudioProcessorGraph::Node::Ptr ioProcInNode_;
AudioProcessorGraph::Node::Ptr ioProcOutNode_;
AudioProcessorGraph::Node::Ptr ioProcMidiInNode_;
AudioProcessorGraph::Node::Ptr ioProcMidiOutNode_;

MyAudioProcessor* myProcessor;

```

constructor:  
ioProcIn\_ = new AudioProcessorGraph::AudioGraphIOProcessor  
(AudioProcessorGraph::AudioGraphIOProcessor::audioInputNode);  
ioProcOut\_ = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode);  
ioProcMidiIn\_ = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::midiInputNode);  
ioProcInNode\_ = myGraph\_.addNode(ioProcIn\_);  
ioProcOutNode\_ = myGraph\_.addNode (ioProcOut\_);  
ioProcMidiInNode\_ = myGraph\_.addNode (ioProcMidiIn\_);

```
    AudioProcessorGraph::Node* sbNode = myGraph_.addNode (myProcessor = new MyAudioProcessor());
    myProcessor->setNodeID (sbNode->nodeId);

```

prepareToPlay:

```
myGraph_.setPlayConfigDetails (getTotalNumInputChannels(), getTotalNumOutputChannels(), sampleRate, samplesPerBlock);
myGraph_.prepareToPlay (sampleRate, samplesPerBlock);

myGraph_.addConnection (myProcessor->getNodeID(), 0, ioProcOutNode_->nodeId, 0);
myGraph_.addConnection (myProcessor->getNodeID(), 1, ioProcOutNode_->nodeId, 1);

```

processBlock:  
`myGraph_.processBlock (buffer, midiMessages);`

My plugin crashes immediately.

error log:

Thread 6 Crashed:: com.apple.audio.IOThread.client  
0 com.roli.pluginhost 0x000000010502c35c void juce::AudioProcessorGraph::processAudio(juce::AudioBuffer&, juce::MidiBuffer&) + 332  
1 com.yourcompany.AudioGraphTest 0x000000010d997845 juce::AudioProcessorGraph::processBlock(juce::AudioBuffer&, juce::MidiBuffer&) + 37 (juce\_AudioProcessorGraph.cpp:1496)  
2 com.yourcompany.AudioGraphTest 0x000000010d93ee3a AudioGraphTestAudioProcessor::processBlock(juce::AudioBuffer&, juce::MidiBuffer&) + 74 (PluginProcessor.cpp:185)  
3 com.yourcompany.AudioGraphTest 0x000000010d93b776 void JuceVSTWrapper::internalProcessReplacing(float\*\*, float\*\*, int, JuceVSTWrapper::VstTempBuffers&) + 1302 (juce\_VST\_Wrapper.cpp:475)  
4 com.yourcompany.AudioGraphTest 0x000000010d93b235 JuceVSTWrapper::processReplacing(float\*\*, float\*\*, int) + 149 (juce\_VST\_Wrapper.cpp:533)  
5 com.yourcompany.AudioGraphTest 0x000000010d930fb3 JuceVSTWrapper::processReplacingCB(VstEffectInterface\*, float\*\*, float\*\*, int) + 51 (juce\_VST\_Wrapper.cpp:538)  
6 com.roli.pluginhost 0x00000001050879ac juce::VSTPluginInstance::invokeProcessFunction(juce::AudioBuffer&, int) + 124  
7 com.roli.pluginhost 0x0000000105087582 void juce::VSTPluginInstance::processAudio(juce::AudioBuffer&, juce::MidiBuffer&) + 1186  
8 com.roli.pluginhost 0x0000000105039f2e juce::VSTPluginInstance::processBlock(juce::AudioBuffer&, juce::MidiBuffer&) + 126  
9 com.roli.pluginhost 0x0000000105048da6 juce::GraphRenderingOps::ProcessBufferOp::callProcess(juce::AudioBuffer&, juce::MidiBuffer&) + 70  
10 com.roli.pluginhost 0x0000000105048cfb void juce::GraphRenderingOps::ProcessBufferOp::perform(juce::AudioBuffer&, juce::OwnedArray\<juce::MidiBuffer, juce::DummyCriticalSection\> const&, int) + 267  
11 com.roli.pluginhost 0x0000000105048986 juce::GraphRenderingOps::AudioGraphRenderingOpjuce::GraphRenderingOps::ProcessBufferOp::perform(juce::AudioBuffer&, juce::OwnedArray\<juce::MidiBuffer, juce::DummyCriticalSection\> const&, int) + 54  
12 com.roli.pluginhost 0x000000010502c388 void juce::AudioProcessorGraph::processAudio(juce::AudioBuffer&, juce::MidiBuffer&) + 376  
13 com.roli.pluginhost 0x0000000104ff9535 juce::AudioProcessorGraph::processBlock(juce::AudioBuffer&, juce::MidiBuffer&) + 37  
14 com.roli.pluginhost 0x00000001050b9fac juce::AudioProcessorPlayer::audioDeviceIOCallback(float const\*\*, int, float\*\*, int, int) + 1372  
15 com.roli.pluginhost 0x0000000104fa4175 juce::AudioDeviceManager::audioDeviceIOCallbackInt(float const\*\*, int, float\*\*, int, int) + 693  
16 com.roli.pluginhost 0x0000000104facaaf juce::AudioDeviceManager::CallbackHandler::audioDeviceIOCallback(float const\*\*, int, float\*\*, int, int) + 63  
17 com.roli.pluginhost 0x0000000104fb5dfb juce::CoreAudioClasses::CoreAudioInternal::audioCallback(AudioBufferList const\*, AudioBufferList\*) + 475  
18 com.roli.pluginhost 0x0000000104fb5c0b juce::CoreAudioClasses::CoreAudioInternal::audioIOProc(unsigned int, AudioTimeStamp const\*, AudioBufferList const\*, AudioTimeStamp const\*, AudioBufferList\*, AudioTimeStamp const\*, void\*) + 59  
19 com.apple.audio.CoreAudio 0x00007fffd32668ce HALC\_ProxyIOContext::IOWorkLoop() + 5290  
20 com.apple.audio.CoreAudio 0x00007fffd3265264 HALC\_ProxyIOContext::IOThreadEntry(void\*) + 128  
21 com.apple.audio.CoreAudio 0x00007fffd3264fa3 HALB\_IOThread::Entry(void\*) + 75  
22 libsystem\_pthread.dylib 0x00007fffe90799af \_pthread\_body + 180  
23 libsystem\_pthread.dylib 0x00007fffe90798fb \_pthread\_start + 286  
24 libsystem\_pthread.dylib 0x00007fffe9079101 thread\_start + 13

//==========================================================  
Could anyone point me what is wrong?

Thank you for your help.

---

<div class="post-metadata">

**Author:** ![railjonrogut](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/railjonrogut/32/505_2.png) [@railjonrogut](https://forum.juce.com/u/railjonrogut)\
**Post date:** [April 3, 2017, 7:55pm UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624/2 "2017-04-03T19:55:03Z")

</div>

Check out my post in the now deprecated thread:

> [@(DEPRECATED) The ultimate JUCE 4.1 MultiBus Guide](https://forum.juce.com/t/deprecated-the-ultimate-juce-4-1-multibus-guide/16755/19):
>
> Okay – I modified the MultiOutSynth to use an AudioProcessorGraph which shows the issue… I’m not using the AudioProcessorGraph in the processBlock in this example… the issues lie outside there. Rail

Rail

---

<div class="post-metadata">

**Author:** ![hyakken](https://avatars.discourse-cdn.com/v4/letter/h/d9b06d/32.png) [@hyakken](https://forum.juce.com/u/hyakken)\
**Post date:** [April 4, 2017, 4:18am UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624/3 "2017-04-04T04:18:27Z")

</div>

Thank you for your reply.

I just tried your code.  
But I got some errors.

`/JUCE/examples/PlugInSamples/MultiOutSynth/Source/MultiOutSynth.cpp:83:72: Only virtual member functions can be marked 'override'`

It seems all those are related to setPreferredBusArrangement.

setPreferredBusArrangement is no longer available?  
I’m on Projucer v4.3.1.

Thank you for your help.

---

<div class="post-metadata">

**Author:** ![railjonrogut](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/railjonrogut/32/505_2.png) [@railjonrogut](https://forum.juce.com/u/railjonrogut)\
**Post date:** [April 4, 2017, 7:33am UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624/4 "2017-04-04T07:33:23Z")

</div>

Yes, that code in JUCE is deprecated… but the code on how to integrate the AudioProcessorGraph is still the same… so there’s enough in there to show you what to do with a new 4.3.1 JUCE project

Rail

---

<div class="post-metadata">

**Author:** ![hyakken](https://avatars.discourse-cdn.com/v4/letter/h/d9b06d/32.png) [@hyakken](https://forum.juce.com/u/hyakken)\
**Post date:** [April 4, 2017, 9:39am UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624/5 "2017-04-04T09:39:04Z")

</div>

Sorry I didn’t know the “deprecated” means.

I modified my code by referring to yours.  
But still no luck.

```
AudioGraphTestAudioProcessor::AudioGraphTestAudioProcessor()
#ifndef JucePlugin_PreferredChannelConfigurations
     : AudioProcessor (BusesProperties()
                     #if ! JucePlugin_IsMidiEffect
                      #if ! JucePlugin_IsSynth
                       .withInput ("Input", AudioChannelSet::stereo(), true)
                      #endif
                       .withOutput ("Output", AudioChannelSet::stereo(), true)
                     #endif
                       ),
#endif
:
myGraph_(new AudioProcessorGraph)
{
    myGraph_->setPlayConfigDetails (getTotalNumInputChannels(), getTotalNumOutputChannels(), 44100.0, 512);
    
    ioProcIn_ = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::audioInputNode);
    ioProcOut_ = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode);
    ioProcMidiIn_ = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::midiInputNode);
    ioProcMidiOut_ = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::midiInputNode);
    
    ioProcInNode_ = myGraph_->addNode (ioProcIn_);
    ioProcOutNode_ = myGraph_->addNode (ioProcOut_);
    ioProcMidiInNode_ = myGraph_->addNode (ioProcMidiIn_);
    ioProcMidiOutNode_= myGraph_->addNode (ioProcMidiOut_);
    
    myGraph_->addConnection (ioProcMidiInNode_->nodeId, juce::AudioProcessorGraph::midiChannelIndex,
                             ioProcMidiOutNode_->nodeId, juce::AudioProcessorGraph::midiChannelIndex);
    
    myAudioProcessor_ = new MyAudioProcessor();
    myAudioProcessor_->setPlayConfigDetails (getTotalNumInputChannels(), getTotalNumOutputChannels(), 44100.0, 512);
    myAudioUnit_ = myGraph_->addNode(myAudioProcessor_);
    
    myGraph_->addConnection(ioProcInNode_->nodeId, 0, myAudioUnit_->nodeId, 0);
    myGraph_->addConnection(ioProcInNode_->nodeId, 1, myAudioUnit_->nodeId, 1);
    
    myGraph_->addConnection(myAudioUnit_->nodeId, 0, ioProcOutNode_->nodeId, 0);
    myGraph_->addConnection(myAudioUnit_->nodeId, 1, ioProcOutNode_->nodeId, 1);

}

AudioGraphTestAudioProcessor::~AudioGraphTestAudioProcessor(){}

void AudioGraphTestAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
{
    ignoreUnused (samplesPerBlock);
    
    myGraph_->setRateAndBufferSizeDetails (sampleRate, samplesPerBlock);
    myGraph_->prepareToPlay (sampleRate, samplesPerBlock);
}

void AudioGraphTestAudioProcessor::releaseResources()
{
    myGraph_->releaseResources();
}

void AudioGraphTestAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages)
{
    myGraph_->processBlock(buffer, midiMessages);
}

```

`myGraph_->processBlock(buffer, midiMessages);`

Is this OK?

If I do this, my plugin doesn’t crash.  
`myAudioProcessor_->processBlock(buffer, midiMessages);`

But with this way AudioProcessorGraph doesn’t do anything.

---

<div class="post-metadata">

**Author:** ![railjonrogut](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/railjonrogut/32/505_2.png) [@railjonrogut](https://forum.juce.com/u/railjonrogut)\
**Post date:** [April 4, 2017, 10:58am UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624/6 "2017-04-04T10:58:43Z")

</div>

> [@SUBARU](#):
>
> myAudioProcessor\_ = new MyAudioProcessor();

Instead of an AudioProcessor you’d need an AudioPluginInstance object if you’re trying to host a plugin

Rail

---

<div class="post-metadata">

**Author:** ![hyakken](https://avatars.discourse-cdn.com/v4/letter/h/d9b06d/32.png) [@hyakken](https://forum.juce.com/u/hyakken)\
**Post date:** [April 4, 2017, 11:27am UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624/7 "2017-04-04T11:27:10Z")

</div>

My goal is handling my effect processors with AudioProcessorGraph.  
So I need to figure out how to handle AudioProcessor with AudioProcessorGraph.

I tried to make very simple signal path with AudioProcessorGraph.

Inside of my plugin:  
audio in —\> myAudioProcessor ----\> audio out

```
    myAudioProcessor_ = new MyAudioProcessor();
    myAudioProcessor_->setPlayConfigDetails (getTotalNumInputChannels(), getTotalNumOutputChannels(), 44100.0, 512);
    myAudioUnit_ = myGraph_->addNode(myAudioProcessor_);
    
    myGraph_->addConnection(ioProcInNode_->nodeId, 0, myAudioUnit_->nodeId, 0);
    myGraph_->addConnection(ioProcInNode_->nodeId, 1, myAudioUnit_->nodeId, 1);
    
    myGraph_->addConnection(myAudioUnit_->nodeId, 0, ioProcOutNode_->nodeId, 0);
    myGraph_->addConnection(myAudioUnit_->nodeId, 1, ioProcOutNode_->nodeId, 1);

```

Are these connections correct?  
I tired to connect audio input of my plugin to audio input of myAudioProceeesor.  
And audio out of myAudioProcessor to audio out of my plugin.

---

<div class="post-metadata">

**Author:** ![railjonrogut](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/railjonrogut/32/505_2.png) [@railjonrogut](https://forum.juce.com/u/railjonrogut)\
**Post date:** [April 4, 2017, 11:39am UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624/8 "2017-04-04T11:39:04Z")

</div>

What’s your myAudioProceeesor doing in it’s processBlock() ?

Rail

---

<div class="post-metadata">

**Author:** ![hyakken](https://avatars.discourse-cdn.com/v4/letter/h/d9b06d/32.png) [@hyakken](https://forum.juce.com/u/hyakken)\
**Post date:** [April 4, 2017, 11:42am UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624/9 "2017-04-04T11:42:01Z")

</div>

```
void MyAudioProcessor::prepareToPlay (double sampleRate, int estimatedSamplesPerBlock)
{
    setPlayConfigDetails (2, 2, sampleRate, estimatedSamplesPerBlock);
    
}
void MyAudioProcessor::releaseResources(){}

void MyAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages)
{

}

```

myAudioProcessor does nothing currently.

---

<div class="post-metadata">

**Author:** ![hyakken](https://avatars.discourse-cdn.com/v4/letter/h/d9b06d/32.png) [@hyakken](https://forum.juce.com/u/hyakken)\
**Post date:** [April 4, 2017, 11:56am UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624/10 "2017-04-04T11:56:57Z")

</div>

It seems my connections have problem.

```
myGraph_	juce::ScopedPointer<juce::AudioProcessorGraph>	
object	juce::AudioProcessorGraph *	0x101729aa0	0x0000000101729aa0
juce::AudioProcessor	juce::AudioProcessor	
juce::AsyncUpdater	juce::AsyncUpdater	
nodes	juce::ReferenceCountedArray<juce::AudioProcessorGraph::Node, juce::DummyCriticalSection>	
connections	juce::OwnedArray<juce::AudioProcessorGraph::Connection, juce::DummyCriticalSection>	
data	juce::ArrayAllocationBase<juce::AudioProcessorGraph::Connection *, juce::DummyCriticalSection>	
elements	juce::HeapBlock<juce::AudioProcessorGraph::Connection *, false>	
data	juce::AudioProcessorGraph::Connection **	NULL	0x0000000000000000
*data	juce::AudioProcessorGraph::Connection *	NULL	
[1]	juce::AudioProcessorGraph::Connection *	NULL	
[2]	juce::AudioProcessorGraph::Connection *	NULL	
[3]	juce::AudioProcessorGraph::Connection *	NULL	
[4]	juce::AudioProcessorGraph::Connection *	NULL	
numAllocated	int	0
numUsed	int	0

```

Does this mean none of connections are available?

---

<div class="post-metadata">

**Author:** ![hyakken](https://avatars.discourse-cdn.com/v4/letter/h/d9b06d/32.png) [@hyakken](https://forum.juce.com/u/hyakken)\
**Post date:** [April 4, 2017, 12:13pm UTC](https://forum.juce.com/t/very-basic-usage-of-audioprocessorgraph/21624/11 "2017-04-04T12:13:13Z")

</div>

I don’t know why but if I do following stuff in prepareToPlay rather than its constructor,  
those connections become available,  
But still my plugin crashes immediately.

```
void AudioGraphTestAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
{
    ignoreUnused (samplesPerBlock);
    
    myGraph_->setPlayConfigDetails (getTotalNumInputChannels(), getTotalNumOutputChannels(), 44100.0, 512);
    
    ioProcIn_ = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::audioInputNode);
    ioProcOut_ = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode);
    ioProcMidiIn_ = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::midiInputNode);
    ioProcMidiOut_ = new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::midiInputNode);
    
    ioProcInNode_ = myGraph_->addNode (ioProcIn_);
    ioProcOutNode_ = myGraph_->addNode (ioProcOut_);
    ioProcMidiInNode_ = myGraph_->addNode (ioProcMidiIn_);
    ioProcMidiOutNode_= myGraph_->addNode (ioProcMidiOut_);
    
    myGraph_->addConnection (ioProcMidiInNode_->nodeId, juce::AudioProcessorGraph::midiChannelIndex,
                             ioProcMidiOutNode_->nodeId, juce::AudioProcessorGraph::midiChannelIndex);
    
    myAudioProcessor_ = new MyAudioProcessor();
    myAudioProcessor_->setPlayConfigDetails (getTotalNumInputChannels(), getTotalNumOutputChannels(), 44100.0, 512);
    myAudioUnit_ = myGraph_->addNode(myAudioProcessor_);
    
    myGraph_->setRateAndBufferSizeDetails (sampleRate, samplesPerBlock);
    myGraph_->prepareToPlay (sampleRate, samplesPerBlock);
    
    myGraph_->addConnection(ioProcInNode_->nodeId, 0, myAudioUnit_->nodeId, 0);
    myGraph_->addConnection(ioProcInNode_->nodeId, 1, myAudioUnit_->nodeId, 1);
    
    myGraph_->addConnection(myAudioUnit_->nodeId, 0, ioProcOutNode_->nodeId, 0);
    myGraph_->addConnection(myAudioUnit_->nodeId, 1, ioProcOutNode_->nodeId, 1);

}
```
