diff --git a/examples/audio plugin host/Source/GraphEditorPanel.cpp b/examples/audio plugin host/Source/GraphEditorPanel.cpp index e25a7516b8..68ec082bf4 100644 --- a/examples/audio plugin host/Source/GraphEditorPanel.cpp +++ b/examples/audio plugin host/Source/GraphEditorPanel.cpp @@ -1091,14 +1091,14 @@ private: //============================================================================== GraphDocumentComponent::GraphDocumentComponent (AudioPluginFormatManager& formatManager, AudioDeviceManager* deviceManager_) - : graph (formatManager), deviceManager (deviceManager_), + : graph (new FilterGraph (formatManager)), deviceManager (deviceManager_), graphPlayer (getAppProperties().getUserSettings()->getBoolValue ("doublePrecisionProcessing", false)) { - addAndMakeVisible (graphPanel = new GraphEditorPanel (graph)); + addAndMakeVisible (graphPanel = new GraphEditorPanel (*graph)); deviceManager->addChangeListener (graphPanel); - graphPlayer.setProcessor (&graph.getGraph()); + graphPlayer.setProcessor (&graph->getGraph()); keyState.addListener (&graphPlayer.getMidiMessageCollector()); @@ -1115,16 +1115,9 @@ GraphDocumentComponent::GraphDocumentComponent (AudioPluginFormatManager& format GraphDocumentComponent::~GraphDocumentComponent() { - deviceManager->removeAudioCallback (&graphPlayer); - deviceManager->removeMidiInputCallback (String::empty, &graphPlayer.getMidiMessageCollector()); - deviceManager->removeChangeListener (graphPanel); + releaseGraph(); - deleteAllChildren(); - - graphPlayer.setProcessor (nullptr); keyState.removeListener (&graphPlayer.getMidiMessageCollector()); - - graph.clear(); } void GraphDocumentComponent::resized() @@ -1146,3 +1139,15 @@ void GraphDocumentComponent::unfocusKeyboardComponent() { keyboardComp->unfocusAllComponents(); } + +void GraphDocumentComponent::releaseGraph() +{ + deviceManager->removeAudioCallback (&graphPlayer); + deviceManager->removeMidiInputCallback (String::empty, &graphPlayer.getMidiMessageCollector()); + deviceManager->removeChangeListener (graphPanel); + + deleteAllChildren(); + + graphPlayer.setProcessor (nullptr); + graph = nullptr; +} diff --git a/examples/audio plugin host/Source/GraphEditorPanel.h b/examples/audio plugin host/Source/GraphEditorPanel.h index 9b67ed2b99..9c3ee5285a 100644 --- a/examples/audio plugin host/Source/GraphEditorPanel.h +++ b/examples/audio plugin host/Source/GraphEditorPanel.h @@ -91,7 +91,7 @@ public: inline void setDoublePrecision (bool doublePrecision) { graphPlayer.setDoublePrecisionProcessing (doublePrecision); } //============================================================================== - FilterGraph graph; + ScopedPointer graph; //============================================================================== void resized(); @@ -99,6 +99,9 @@ public: //============================================================================== void unfocusKeyboardComponent(); + //============================================================================== + void releaseGraph(); + private: //============================================================================== AudioDeviceManager* deviceManager; diff --git a/examples/audio plugin host/Source/HostStartup.cpp b/examples/audio plugin host/Source/HostStartup.cpp index 52184579d3..30a489b068 100644 --- a/examples/audio plugin host/Source/HostStartup.cpp +++ b/examples/audio plugin host/Source/HostStartup.cpp @@ -94,7 +94,8 @@ public: if (fileToOpen.existsAsFile()) if (GraphDocumentComponent* graph = mainWindow->getGraphEditor()) - graph->graph.loadFrom (fileToOpen, true); + if (FilterGraph* ioGraph = graph->graph.get()) + ioGraph->loadFrom (fileToOpen, true); } void shutdown() override diff --git a/examples/audio plugin host/Source/MainHostWindow.cpp b/examples/audio plugin host/Source/MainHostWindow.cpp index d59c112ab6..d7808fa802 100644 --- a/examples/audio plugin host/Source/MainHostWindow.cpp +++ b/examples/audio plugin host/Source/MainHostWindow.cpp @@ -105,7 +105,9 @@ MainHostWindow::MainHostWindow() ->getIntValue ("pluginSortMethod", KnownPluginList::sortByManufacturer); knownPluginList.addChangeListener (this); - getGraphEditor()->graph.addChangeListener (this); + + if (FilterGraph* filterGraph = getGraphEditor()->graph.get()) + filterGraph->addChangeListener (this); addKeyListener (getCommandManager().getKeyMappings()); @@ -131,7 +133,9 @@ MainHostWindow::~MainHostWindow() #endif knownPluginList.removeChangeListener (this); - getGraphEditor()->graph.removeChangeListener (this); + + if (FilterGraph* filterGraph = getGraphEditor()->graph.get()) + filterGraph->removeChangeListener (this); getAppProperties().getUserSettings()->setValue ("mainWindowPos", getWindowStateAsString()); clearContentComponent(); @@ -147,8 +151,12 @@ bool MainHostWindow::tryToQuitApplication() PluginWindow::closeAllCurrentlyOpenWindows(); if (getGraphEditor() == nullptr - || getGraphEditor()->graph.saveIfNeededAndUserAgrees() == FileBasedDocument::savedOk) + || getGraphEditor()->graph->saveIfNeededAndUserAgrees() == FileBasedDocument::savedOk) { + // Some plug-ins do not want [NSApp stop] to be called + // before the plug-ins are not deallocated. + getGraphEditor()->releaseGraph(); + JUCEApplication::quit(); return true; } @@ -172,11 +180,11 @@ void MainHostWindow::changeListenerCallback (ChangeBroadcaster* changed) getAppProperties().saveIfNeeded(); } } - else if (changed == &getGraphEditor()->graph) + else if (changed == getGraphEditor()->graph) { String title = JUCEApplication::getInstance()->getApplicationName(); - File f = getGraphEditor()->graph.getFile(); + File f = getGraphEditor()->graph->getFile(); if (f.existsAsFile()) title = f.getFileName() + " - " + title; @@ -260,7 +268,8 @@ void MainHostWindow::menuItemSelected (int menuItemID, int /*topLevelMenuIndex*/ if (menuItemID == 250) { if (graphEditor != nullptr) - graphEditor->graph.clear(); + if (FilterGraph* filterGraph = getGraphEditor()->graph.get()) + filterGraph->clear(); } else if (menuItemID >= 100 && menuItemID < 200) { @@ -268,8 +277,10 @@ void MainHostWindow::menuItemSelected (int menuItemID, int /*topLevelMenuIndex*/ recentFiles.restoreFromString (getAppProperties().getUserSettings() ->getValue ("recentFilterGraphFiles")); - if (graphEditor != nullptr && graphEditor->graph.saveIfNeededAndUserAgrees() == FileBasedDocument::savedOk) - graphEditor->graph.loadFrom (recentFiles.getFile (menuItemID - 100), true); + if (graphEditor != nullptr + && getGraphEditor()->graph != nullptr + && graphEditor->graph->saveIfNeededAndUserAgrees() == FileBasedDocument::savedOk) + graphEditor->graph->loadFrom (recentFiles.getFile (menuItemID - 100), true); } else if (menuItemID >= 200 && menuItemID < 210) { @@ -411,23 +422,23 @@ bool MainHostWindow::perform (const InvocationInfo& info) switch (info.commandID) { case CommandIDs::newFile: - if (graphEditor != nullptr && graphEditor->graph.saveIfNeededAndUserAgrees() == FileBasedDocument::savedOk) - graphEditor->graph.newDocument(); + if (graphEditor != nullptr && graphEditor->graph != nullptr && graphEditor->graph->saveIfNeededAndUserAgrees() == FileBasedDocument::savedOk) + graphEditor->graph->newDocument(); break; case CommandIDs::open: - if (graphEditor != nullptr && graphEditor->graph.saveIfNeededAndUserAgrees() == FileBasedDocument::savedOk) - graphEditor->graph.loadFromUserSpecifiedFile (true); + if (graphEditor != nullptr && graphEditor->graph != nullptr && graphEditor->graph->saveIfNeededAndUserAgrees() == FileBasedDocument::savedOk) + graphEditor->graph->loadFromUserSpecifiedFile (true); break; case CommandIDs::save: - if (graphEditor != nullptr) - graphEditor->graph.save (true, true); + if (graphEditor != nullptr && graphEditor->graph != nullptr) + graphEditor->graph->save (true, true); break; case CommandIDs::saveAs: - if (graphEditor != nullptr) - graphEditor->graph.saveAs (File::nonexistent, true, true, true); + if (graphEditor != nullptr && graphEditor->graph != nullptr) + graphEditor->graph->saveAs (File::nonexistent, true, true, true); break; case CommandIDs::showPluginListEditor: @@ -506,8 +517,8 @@ void MainHostWindow::showAudioSettings() GraphDocumentComponent* const graphEditor = getGraphEditor(); - if (graphEditor != nullptr) - graphEditor->graph.removeIllegalConnections(); + if (graphEditor != nullptr && graphEditor->graph != nullptr) + graphEditor->graph->removeIllegalConnections(); } bool MainHostWindow::isInterestedInFileDrag (const StringArray&) @@ -535,8 +546,9 @@ void MainHostWindow::filesDropped (const StringArray& files, int x, int y) { if (files.size() == 1 && File (files[0]).hasFileExtension (filenameSuffix)) { - if (graphEditor->graph.saveIfNeededAndUserAgrees() == FileBasedDocument::savedOk) - graphEditor->graph.loadFrom (File (files[0]), true); + if (FilterGraph* filterGraph = graphEditor->graph.get()) + if (filterGraph->saveIfNeededAndUserAgrees() == FileBasedDocument::savedOk) + filterGraph->loadFrom (File (files[0]), true); } else {