From 17affa12743c852ef7b58c35cd6dfa17363dbb8d Mon Sep 17 00:00:00 2001 From: Rolando Islas Date: Wed, 30 Dec 2015 16:48:01 -0700 Subject: [PATCH 01/10] Added windows project and made JUCE path relative --- .gitignore | 3 ++- LightHost.jucer | 54 ++++++++++++++++++++++++++++++++++++------------- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 7a6185d..8878e26 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ Builds/ -JuceLibraryCode/ \ No newline at end of file +JuceLibraryCode/ +lib/ \ No newline at end of file diff --git a/LightHost.jucer b/LightHost.jucer index d7396ee..b44cc5e 100644 --- a/LightHost.jucer +++ b/LightHost.jucer @@ -24,22 +24,47 @@ headerPath="" cppLanguageStandard="c++11" cppLibType="libc++"/> - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -82,5 +107,6 @@ + From f9305ca0c53698205d8ecf74edb68097fa0c238f Mon Sep 17 00:00:00 2001 From: Rolando Islas Date: Wed, 30 Dec 2015 19:05:12 -0700 Subject: [PATCH 02/10] Make project windows (possibly Linux) compatible --- Source/HostStartup.cpp | 4 +- Source/IconMenu.cpp | 85 +++++++++++++++++++++++++++++++++++++----- Source/IconMenu.hpp | 10 +++-- 3 files changed, 85 insertions(+), 14 deletions(-) diff --git a/Source/HostStartup.cpp b/Source/HostStartup.cpp index 977ba24..b86a476 100644 --- a/Source/HostStartup.cpp +++ b/Source/HostStartup.cpp @@ -23,7 +23,9 @@ public: LookAndFeel::setDefaultLookAndFeel (&lookAndFeel); mainWindow = new IconMenu(); - Process::setDockIconVisible(false); + #if JUCE_MAC + Process::setDockIconVisible(false); + #endif File fileToOpen; diff --git a/Source/IconMenu.cpp b/Source/IconMenu.cpp index 384d918..55c3d6d 100644 --- a/Source/IconMenu.cpp +++ b/Source/IconMenu.cpp @@ -10,6 +10,48 @@ #include "IconMenu.hpp" #include "PluginWindow.h" +#if !JUCE_MAC +class IconMenu::PluginListWindow : public DocumentWindow +{ +public: + PluginListWindow(IconMenu& owner_, AudioPluginFormatManager& pluginFormatManager) + : DocumentWindow("Available Plugins", Colours::white, + DocumentWindow::minimiseButton | DocumentWindow::closeButton), + owner(owner_) + { + const File deadMansPedalFile(getAppProperties().getUserSettings() + ->getFile().getSiblingFile("RecentlyCrashedPluginsList")); + + setContentOwned(new PluginListComponent(pluginFormatManager, + owner.knownPluginList, + deadMansPedalFile, + getAppProperties().getUserSettings()), true); + + setResizable(true, false); + setResizeLimits(300, 400, 800, 1500); + setTopLeftPosition(60, 60); + + restoreWindowStateFromString(getAppProperties().getUserSettings()->getValue("listWindowPos")); + setVisible(true); + } + + ~PluginListWindow() + { + getAppProperties().getUserSettings()->setValue("listWindowPos", getWindowStateAsString()); + + clearContentComponent(); + } + + void closeButtonPressed() + { + owner.pluginListWindow = nullptr; + } + +private: + IconMenu& owner; +}; +#endif + IconMenu::IconMenu() { // Initiialization @@ -32,10 +74,14 @@ IconMenu::IconMenu() loadActivePlugins(); activePluginList.addChangeListener(this); // Set menu icon - if (exec("defaults read -g AppleInterfaceStyle").compare("Dark") == 1) - setIconImage(ImageFileFormat::loadFrom(BinaryData::menu_icon_white_png, BinaryData::menu_icon_white_pngSize)); - else - setIconImage(ImageFileFormat::loadFrom(BinaryData::menu_icon_png, BinaryData::menu_icon_pngSize)); + #if JUCE_MAC + if (exec("defaults read -g AppleInterfaceStyle").compare("Dark") == 1) + setIconImage(ImageFileFormat::loadFrom(BinaryData::menu_icon_white_png, BinaryData::menu_icon_white_pngSize)); + else + setIconImage(ImageFileFormat::loadFrom(BinaryData::menu_icon_png, BinaryData::menu_icon_pngSize)); + #else + setIconImage(ImageFileFormat::loadFrom(BinaryData::menu_icon_png, BinaryData::menu_icon_pngSize)); + #endif }; IconMenu::~IconMenu() @@ -58,7 +104,8 @@ void IconMenu::loadActivePlugins() PluginDescription plugin = *activePluginList.getType(i); String errorMessage; AudioPluginInstance* instance = formatManager.createPluginInstance(plugin, graph.getSampleRate(), graph.getBlockSize(), errorMessage); - String pluginUid = "pluginState-" + std::to_string(i); + String pluginUid; + pluginUid << "pluginState-" << i; String savedPluginState = getAppProperties().getUserSettings()->getValue(pluginUid); MemoryBlock savedPluginBinary; savedPluginBinary.fromBase64Encoding(savedPluginState); @@ -108,6 +155,7 @@ void IconMenu::changeListenerCallback(ChangeBroadcaster* changed) } } +#if JUCE_MAC std::string IconMenu::exec(const char* cmd) { std::shared_ptr pipe(popen(cmd, "r"), pclose); @@ -121,6 +169,7 @@ std::string IconMenu::exec(const char* cmd) } return result; } +#endif void IconMenu::timerCallback() { @@ -153,7 +202,9 @@ void IconMenu::timerCallback() void IconMenu::mouseDown(const MouseEvent& e) { - Process::setDockIconVisible(true); + #if JUCE_MAC + Process::setDockIconVisible(true); + #endif Process::makeForegroundProcess(); menuIconLeftClicked = e.mods.isLeftButtonDown(); startTimer(50); @@ -167,9 +218,11 @@ void IconMenu::menuInvocationCallback(int id, IconMenu* im) im->savePluginStates(); return JUCEApplication::getInstance()->quit(); } + #if JUCE_MAC // Click elsewhere if (id == 0 && !PluginWindow::containsActiveWindows()) Process::setDockIconVisible(false); + #endif // Audio settings if (id == 1) im->showAudioSettings(); @@ -208,7 +261,8 @@ void IconMenu::deletePluginStates() { for (int i = 0; i < activePluginList.getNumTypes(); i++) { - String pluginUid = "pluginState-" + std::to_string(i); + String pluginUid; + pluginUid << "pluginState-" << i; getAppProperties().getUserSettings()->removeValue(pluginUid); getAppProperties().saveIfNeeded(); } @@ -219,7 +273,8 @@ void IconMenu::savePluginStates() for (int i = 0; i < activePluginList.getNumTypes(); i++) { AudioProcessor& processor = *graph.getNodeForId(i+3)->getProcessor(); - String pluginUid = "pluginState-" + std::to_string(i); + String pluginUid; + pluginUid << "pluginState-" << i; MemoryBlock savedStateBinary; processor.getStateInformation(savedStateBinary); ScopedPointer savedStateXml(XmlElement::createTextElement(savedStateBinary.toBase64Encoding())); @@ -252,14 +307,22 @@ void IconMenu::showAudioSettings() void IconMenu::reloadPlugins() { - NativeMessageBox::showOkCancelBox(AlertWindow::AlertIconType::InfoIcon, "Reload Plugins?", "Confirm scan and load of any new or updated plugins.", this, ModalCallbackFunction::forComponent(doReload, this)); + #if JUCE_MAC + NativeMessageBox::showOkCancelBox(AlertWindow::AlertIconType::InfoIcon, "Reload Plugins?", "Confirm scan and load of any new or updated plugins.", this, ModalCallbackFunction::forComponent(doReloadWithDefaultLocations, this)); + #else + if (pluginListWindow == nullptr) + pluginListWindow = new PluginListWindow(*this, formatManager); + pluginListWindow->toFront(true); + #endif } -void IconMenu::doReload(int id, IconMenu* im) +void IconMenu::doReloadWithDefaultLocations(int id, IconMenu* im) { + #if JUCE_MAC // Canceled if (id == 0) return Process::setDockIconVisible(false); + #endif // Scan const File deadMansPedalFile (getAppProperties().getUserSettings()->getFile().getSiblingFile("RecentlyCrashedPluginsList")); String pluginName; @@ -280,5 +343,7 @@ void IconMenu::doReload(int id, IconMenu* im) im->knownPluginList.removeType(removeIndex[i] - i); // Finish NativeMessageBox::showMessageBox(AlertWindow::AlertIconType::InfoIcon, "Completed", "Plugins have been refreshed."); + #if JUCE_MAC Process::setDockIconVisible(false); + #endif } \ No newline at end of file diff --git a/Source/IconMenu.hpp b/Source/IconMenu.hpp index f1dcb39..8ea47d9 100644 --- a/Source/IconMenu.hpp +++ b/Source/IconMenu.hpp @@ -18,10 +18,12 @@ public: ~IconMenu(); void mouseDown(const MouseEvent&); static void menuInvocationCallback(int id, IconMenu*); - static void doReload(int id, IconMenu*); + static void doReloadWithDefaultLocations(int id, IconMenu*); void changeListenerCallback(ChangeBroadcaster* changed); private: + #if JUCE_MAC std::string exec(const char* cmd); + #endif void timerCallback(); void reloadPlugins(); void showAudioSettings(); @@ -41,8 +43,10 @@ private: AudioProcessorPlayer player; AudioProcessorGraph::Node *inputNode; AudioProcessorGraph::Node *outputNode; - - class ScanThread; + #if !JUCE_MAC + class PluginListWindow; + ScopedPointer pluginListWindow; + #endif }; #endif /* IconMenu_hpp */ From bef59ca31b90fb0eeabd05c6897bbba57362a584 Mon Sep 17 00:00:00 2001 From: Rolando Islas Date: Thu, 31 Dec 2015 02:16:17 -0700 Subject: [PATCH 03/10] Plugin order now preserved --- Source/IconMenu.cpp | 60 ++++++++++++++++++++++++++++++++++++++------- Source/IconMenu.hpp | 1 + 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/Source/IconMenu.cpp b/Source/IconMenu.cpp index 55c3d6d..132d3f3 100644 --- a/Source/IconMenu.cpp +++ b/Source/IconMenu.cpp @@ -9,6 +9,7 @@ #include "../JuceLibraryCode/JuceHeader.h" #include "IconMenu.hpp" #include "PluginWindow.h" +#include #if !JUCE_MAC class IconMenu::PluginListWindow : public DocumentWindow @@ -93,15 +94,16 @@ void IconMenu::loadActivePlugins() { graph.clear(); inputNode = graph.addNode(new AudioProcessorGraph::AudioGraphIOProcessor(AudioProcessorGraph::AudioGraphIOProcessor::audioInputNode), 1); - outputNode = graph.addNode(new AudioProcessorGraph::AudioGraphIOProcessor(AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode), 2); + outputNode = graph.addNode(new AudioProcessorGraph::AudioGraphIOProcessor(AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode), 2); if (activePluginList.getNumTypes() == 0) { graph.addConnection(1, 0, 2, 0); graph.addConnection(1, 1, 2, 1); } + int pluginTime = 0; for (int i = 0; i < activePluginList.getNumTypes(); i++) { - PluginDescription plugin = *activePluginList.getType(i); + PluginDescription plugin = getNextPluginOlderThanTime(pluginTime); String errorMessage; AudioPluginInstance* instance = formatManager.createPluginInstance(plugin, graph.getSampleRate(), graph.getBlockSize(), errorMessage); String pluginUid; @@ -132,6 +134,27 @@ void IconMenu::loadActivePlugins() } } +PluginDescription IconMenu::getNextPluginOlderThanTime(int &time) +{ + int timeStatic = time; + PluginDescription closest; + int diff = INT_MAX; + for (int i = 0; i < activePluginList.getNumTypes(); i++) + { + PluginDescription plugin = *activePluginList.getType(i); + String key = "pluginOrder-" + plugin.descriptiveName + plugin.version + plugin.pluginFormatName; + String pluginTimeString = getAppProperties().getUserSettings()->getValue(key); + int pluginTime = atoi(pluginTimeString.toStdString().c_str()); + if (pluginTime > timeStatic && abs(timeStatic - pluginTime) < diff) + { + diff = abs(timeStatic - pluginTime); + closest = plugin; + time = pluginTime; + } + } + return closest; +} + void IconMenu::changeListenerCallback(ChangeBroadcaster* changed) { if (changed == &knownPluginList) @@ -150,7 +173,6 @@ void IconMenu::changeListenerCallback(ChangeBroadcaster* changed) { getAppProperties().getUserSettings()->setValue ("pluginListActive", savedPluginList); getAppProperties().saveIfNeeded(); - loadActivePlugins(); } } } @@ -181,13 +203,15 @@ void IconMenu::timerCallback() menu.addItem(2, "Reload Plugins"); menu.addSeparator(); // Active plugins + int time = 0; for (int i = 0; i < activePluginList.getNumTypes(); i++) { PopupMenu options; options.addItem(i+3, "Edit"); options.addItem(activePluginList.getNumTypes()+i+3, "Delete"); // TODO bypass - menu.addSubMenu(activePluginList.getType(i)->name, options); + PluginDescription plugin = getNextPluginOlderThanTime(time); + menu.addSubMenu(plugin.name, options); } menu.addSeparator(); // All plugins @@ -236,14 +260,30 @@ void IconMenu::menuInvocationCallback(int id, IconMenu* im) if (id > im->activePluginList.getNumTypes() + 2 && id <= im->activePluginList.getNumTypes() * 2 + 2) { im->deletePluginStates(); - im->activePluginList.removeType(id - im->activePluginList.getNumTypes() - 3); - + + int index = id - im->activePluginList.getNumTypes() - 3; + PluginDescription plugin = *im->activePluginList.getType(index); + String key = "pluginOrder-" + plugin.descriptiveName + plugin.version + plugin.pluginFormatName; + getAppProperties().getUserSettings()->removeValue(key); + getAppProperties().saveIfNeeded(); + im->activePluginList.removeType(index); + + im->savePluginStates(); + im->loadActivePlugins(); } // Add plugin else if (id > im->activePluginList.getNumTypes() + 2) { im->deletePluginStates(); - im->activePluginList.addType(*im->knownPluginList.getType(im->knownPluginList.getIndexChosenByMenu(id))); + + PluginDescription plugin = *im->knownPluginList.getType(im->knownPluginList.getIndexChosenByMenu(id)); + String key = "pluginOrder-" + plugin.descriptiveName + plugin.version + plugin.pluginFormatName; + getAppProperties().getUserSettings()->setValue(key, time(0)); + getAppProperties().saveIfNeeded(); + im->activePluginList.addType(plugin); + + im->savePluginStates(); + im->loadActivePlugins(); } // Show active plugin GUI else @@ -272,12 +312,14 @@ void IconMenu::savePluginStates() { for (int i = 0; i < activePluginList.getNumTypes(); i++) { - AudioProcessor& processor = *graph.getNodeForId(i+3)->getProcessor(); + AudioProcessorGraph::Node* node = graph.getNodeForId(i+3); + if (node == nullptr) + break; + AudioProcessor& processor = *node->getProcessor(); String pluginUid; pluginUid << "pluginState-" << i; MemoryBlock savedStateBinary; processor.getStateInformation(savedStateBinary); - ScopedPointer savedStateXml(XmlElement::createTextElement(savedStateBinary.toBase64Encoding())); getAppProperties().getUserSettings()->setValue(pluginUid, savedStateBinary.toBase64Encoding()); getAppProperties().saveIfNeeded(); } diff --git a/Source/IconMenu.hpp b/Source/IconMenu.hpp index 8ea47d9..c6ced6f 100644 --- a/Source/IconMenu.hpp +++ b/Source/IconMenu.hpp @@ -30,6 +30,7 @@ private: void loadActivePlugins(); void savePluginStates(); void deletePluginStates(); + PluginDescription getNextPluginOlderThanTime(int &time); AudioDeviceManager deviceManager; AudioPluginFormatManager formatManager; From 33af87aaf2b9c85ea9d031d92ca2dfb35fc7a3d6 Mon Sep 17 00:00:00 2001 From: Rolando Islas Date: Thu, 31 Dec 2015 03:43:35 -0700 Subject: [PATCH 04/10] Plugin editor now used on all systems --- Source/IconMenu.cpp | 47 +++++++++++++-------------------------------- Source/IconMenu.hpp | 1 + 2 files changed, 14 insertions(+), 34 deletions(-) diff --git a/Source/IconMenu.cpp b/Source/IconMenu.cpp index 132d3f3..0554414 100644 --- a/Source/IconMenu.cpp +++ b/Source/IconMenu.cpp @@ -28,6 +28,7 @@ public: deadMansPedalFile, getAppProperties().getUserSettings()), true); + setUsingNativeTitleBar(true); setResizable(true, false); setResizeLimits(300, 400, 800, 1500); setTopLeftPosition(60, 60); @@ -200,7 +201,7 @@ void IconMenu::timerCallback() menu.addSectionHeader(JUCEApplication::getInstance()->getApplicationName()); if (menuIconLeftClicked) { menu.addItem(1, "Preferences"); - menu.addItem(2, "Reload Plugins"); + menu.addItem(2, "Edit Plugins"); menu.addSeparator(); // Active plugins int time = 0; @@ -349,43 +350,21 @@ void IconMenu::showAudioSettings() void IconMenu::reloadPlugins() { - #if JUCE_MAC - NativeMessageBox::showOkCancelBox(AlertWindow::AlertIconType::InfoIcon, "Reload Plugins?", "Confirm scan and load of any new or updated plugins.", this, ModalCallbackFunction::forComponent(doReloadWithDefaultLocations, this)); - #else if (pluginListWindow == nullptr) pluginListWindow = new PluginListWindow(*this, formatManager); pluginListWindow->toFront(true); - #endif + removePluginsLackingInputOutput(); } -void IconMenu::doReloadWithDefaultLocations(int id, IconMenu* im) +void IconMenu::removePluginsLackingInputOutput() { - #if JUCE_MAC - // Canceled - if (id == 0) - return Process::setDockIconVisible(false); - #endif - // Scan - const File deadMansPedalFile (getAppProperties().getUserSettings()->getFile().getSiblingFile("RecentlyCrashedPluginsList")); - String pluginName; - for (int i = 0; i < im->formatManager.getNumFormats(); i++) - { - im->scanner = new PluginDirectoryScanner(im->knownPluginList, *im->formatManager.getFormat(i), im->formatManager.getFormat(i)->getDefaultLocationsToSearch(), true, deadMansPedalFile); - while (im->scanner->scanNextFile(true, pluginName)) { } - } - // Remove plugins without inputs and/or outputs - std::vector removeIndex; - for (int i = 0; i < im->knownPluginList.getNumTypes(); i++) - { - PluginDescription* plugin = im->knownPluginList.getType(i); - if (plugin->numInputChannels < 2 || plugin->numOutputChannels < 2) - removeIndex.push_back(i); - } - for (int i = 0; i < removeIndex.size(); i++) - im->knownPluginList.removeType(removeIndex[i] - i); - // Finish - NativeMessageBox::showMessageBox(AlertWindow::AlertIconType::InfoIcon, "Completed", "Plugins have been refreshed."); - #if JUCE_MAC - Process::setDockIconVisible(false); - #endif + std::vector removeIndex; + for (int i = 0; i < knownPluginList.getNumTypes(); i++) + { + PluginDescription* plugin = knownPluginList.getType(i); + if (plugin->numInputChannels < 2 || plugin->numOutputChannels < 2) + removeIndex.push_back(i); + } + for (int i = 0; i < removeIndex.size(); i++) + knownPluginList.removeType(removeIndex[i] - i); } \ No newline at end of file diff --git a/Source/IconMenu.hpp b/Source/IconMenu.hpp index c6ced6f..a2f3d97 100644 --- a/Source/IconMenu.hpp +++ b/Source/IconMenu.hpp @@ -31,6 +31,7 @@ private: void savePluginStates(); void deletePluginStates(); PluginDescription getNextPluginOlderThanTime(int &time); + void removePluginsLackingInputOutput(); AudioDeviceManager deviceManager; AudioPluginFormatManager formatManager; From 3094d15f8fb6fab7b913bea0de0a85b6c5a7700e Mon Sep 17 00:00:00 2001 From: Rolando Islas Date: Thu, 31 Dec 2015 18:55:03 -0700 Subject: [PATCH 05/10] Fix menu position on Windows --- Source/IconMenu.cpp | 22 ++++++++++++++++++++++ Source/IconMenu.hpp | 5 ++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Source/IconMenu.cpp b/Source/IconMenu.cpp index 0554414..7f86dea 100644 --- a/Source/IconMenu.cpp +++ b/Source/IconMenu.cpp @@ -10,6 +10,9 @@ #include "IconMenu.hpp" #include "PluginWindow.h" #include +#if JUCE_WINDOWS +#include "Windows.h" +#endif #if !JUCE_MAC class IconMenu::PluginListWindow : public DocumentWindow @@ -58,6 +61,9 @@ IconMenu::IconMenu() { // Initiialization formatManager.addDefaultFormats(); + #if JUCE_WINDOWS + x = y = 0; + #endif // Audio device ScopedPointer savedAudioState (getAppProperties().getUserSettings()->getXmlValue("audioDeviceState")); deviceManager.initialise(256, 256, savedAudioState, true); @@ -84,6 +90,7 @@ IconMenu::IconMenu() #else setIconImage(ImageFileFormat::loadFrom(BinaryData::menu_icon_png, BinaryData::menu_icon_pngSize)); #endif + setIconTooltip(JUCEApplication::getInstance()->getApplicationName()); }; IconMenu::~IconMenu() @@ -222,7 +229,22 @@ void IconMenu::timerCallback() { menu.addItem(1, "Quit"); } + #if JUCE_MAC || JUCE_LINUX menu.showMenuAsync(PopupMenu::Options().withTargetComponent(this), ModalCallbackFunction::forComponent(menuInvocationCallback, this)); + #else + if (x == 0 || y == 0) + { + POINT iconLocation; + iconLocation.x = 0; + iconLocation.y = 0; + GetCursorPos(&iconLocation); + std::cout << ""; + x = iconLocation.x; + y = iconLocation.y; + } + juce::Rectangle rect(x, y, 1, 1); + menu.showMenuAsync(PopupMenu::Options().withTargetScreenArea(rect), ModalCallbackFunction::forComponent(menuInvocationCallback, this)); + #endif } void IconMenu::mouseDown(const MouseEvent& e) diff --git a/Source/IconMenu.hpp b/Source/IconMenu.hpp index a2f3d97..fd9bfbb 100644 --- a/Source/IconMenu.hpp +++ b/Source/IconMenu.hpp @@ -18,7 +18,6 @@ public: ~IconMenu(); void mouseDown(const MouseEvent&); static void menuInvocationCallback(int id, IconMenu*); - static void doReloadWithDefaultLocations(int id, IconMenu*); void changeListenerCallback(ChangeBroadcaster* changed); private: #if JUCE_MAC @@ -45,6 +44,10 @@ private: AudioProcessorPlayer player; AudioProcessorGraph::Node *inputNode; AudioProcessorGraph::Node *outputNode; + #if JUCE_WINDOWS + int x, y; + #endif + #if !JUCE_MAC class PluginListWindow; ScopedPointer pluginListWindow; From eaac345427afcc15de00a0fd0316184072b6ae22 Mon Sep 17 00:00:00 2001 From: Rolando Islas Date: Thu, 31 Dec 2015 22:50:17 -0700 Subject: [PATCH 06/10] Prepare for version 1.1.0 --- LightHost.jucer | 6 +++--- Source/IconMenu.cpp | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/LightHost.jucer b/LightHost.jucer index b44cc5e..92a45b6 100644 --- a/LightHost.jucer +++ b/LightHost.jucer @@ -1,6 +1,6 @@ - + smallIcon="pmwje3" bigIcon="kxxp8K" userNotes="Place ASIO SDK headers in juce folder."> @@ -88,7 +88,7 @@ JUCE_QUICKTIME="disabled" JUCE_USE_FLAC="disabled" JUCE_USE_OGGVORBIS="disabled" JUCE_USE_CDBURNER="disabled" JUCE_USE_CDREADER="disabled" JUCE_USE_CAMERA="disabled" JUCE_PLUGINHOST_VST="enabled" JUCE_PLUGINHOST_AU="enabled" JUCE_WEB_BROWSER="disabled" - JUCE_PLUGINHOST_VST3="enabled"/> + JUCE_PLUGINHOST_VST3="enabled" JUCE_ASIO="enabled"/> diff --git a/Source/IconMenu.cpp b/Source/IconMenu.cpp index 7f86dea..52c5906 100644 --- a/Source/IconMenu.cpp +++ b/Source/IconMenu.cpp @@ -238,7 +238,6 @@ void IconMenu::timerCallback() iconLocation.x = 0; iconLocation.y = 0; GetCursorPos(&iconLocation); - std::cout << ""; x = iconLocation.x; y = iconLocation.y; } From 2d1d98e22fdd24a2c5f9686c7fedc6ae26522c29 Mon Sep 17 00:00:00 2001 From: Rolando Islas Date: Fri, 1 Jan 2016 18:21:26 -0700 Subject: [PATCH 07/10] Building on Linux --- LightHost.jucer | 47 +++++++++++++++++++++++++++++++++++++++++++++ Source/IconMenu.cpp | 3 ++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/LightHost.jucer b/LightHost.jucer index 92a45b6..09ad20b 100644 --- a/LightHost.jucer +++ b/LightHost.jucer @@ -65,6 +65,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/IconMenu.cpp b/Source/IconMenu.cpp index 52c5906..9769d73 100644 --- a/Source/IconMenu.cpp +++ b/Source/IconMenu.cpp @@ -300,7 +300,8 @@ void IconMenu::menuInvocationCallback(int id, IconMenu* im) PluginDescription plugin = *im->knownPluginList.getType(im->knownPluginList.getIndexChosenByMenu(id)); String key = "pluginOrder-" + plugin.descriptiveName + plugin.version + plugin.pluginFormatName; - getAppProperties().getUserSettings()->setValue(key, time(0)); + int t = time(0); + getAppProperties().getUserSettings()->setValue(key, t); getAppProperties().saveIfNeeded(); im->activePluginList.addType(plugin); From 9d3d8a05a938d03b06b94035db7a5e0b41507a6a Mon Sep 17 00:00:00 2001 From: Rolando Islas Date: Fri, 1 Jan 2016 19:39:00 -0700 Subject: [PATCH 08/10] Fix OS X plugin list window not defined --- Source/IconMenu.cpp | 7 ++++--- Source/IconMenu.hpp | 2 -- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Source/IconMenu.cpp b/Source/IconMenu.cpp index 9769d73..25ac00f 100644 --- a/Source/IconMenu.cpp +++ b/Source/IconMenu.cpp @@ -14,7 +14,6 @@ #include "Windows.h" #endif -#if !JUCE_MAC class IconMenu::PluginListWindow : public DocumentWindow { public: @@ -49,13 +48,16 @@ public: void closeButtonPressed() { + owner.removePluginsLackingInputOutput(); + #if JUCE_MAC + Process::setDockIconVisible(false); + #endif owner.pluginListWindow = nullptr; } private: IconMenu& owner; }; -#endif IconMenu::IconMenu() { @@ -375,7 +377,6 @@ void IconMenu::reloadPlugins() if (pluginListWindow == nullptr) pluginListWindow = new PluginListWindow(*this, formatManager); pluginListWindow->toFront(true); - removePluginsLackingInputOutput(); } void IconMenu::removePluginsLackingInputOutput() diff --git a/Source/IconMenu.hpp b/Source/IconMenu.hpp index fd9bfbb..ada8d31 100644 --- a/Source/IconMenu.hpp +++ b/Source/IconMenu.hpp @@ -48,10 +48,8 @@ private: int x, y; #endif - #if !JUCE_MAC class PluginListWindow; ScopedPointer pluginListWindow; - #endif }; #endif /* IconMenu_hpp */ From f9b7600d5b4206ddb72c1cf12e0cbf7966525720 Mon Sep 17 00:00:00 2001 From: Rolando Islas Date: Fri, 1 Jan 2016 19:39:50 -0700 Subject: [PATCH 09/10] Added script to remove settings file for OS X --- Utilities/Reset Settings.command | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100755 Utilities/Reset Settings.command diff --git a/Utilities/Reset Settings.command b/Utilities/Reset Settings.command new file mode 100755 index 0000000..9474fbf --- /dev/null +++ b/Utilities/Reset Settings.command @@ -0,0 +1,13 @@ +deleteSettings() +{ + rm -f ~/Library/Preferences/Light\ Host.settings + echo "Settings reset." +} + +echo "Reset settings for Light Host?" +select yn in "Yes" "No"; do + case $yn in + Yes ) deleteSettings; break;; + No ) echo "Settings not altered."; break;; + esac +done \ No newline at end of file From 6c5d8e9316132a201ad7603937b01f4e62ccada1 Mon Sep 17 00:00:00 2001 From: Rolando Islas Date: Fri, 1 Jan 2016 20:35:46 -0700 Subject: [PATCH 10/10] Updated readme for cross platform --- readme.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 578038f..59e533a 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,12 @@ Light Host --- -A simple VST/AU host for OS X that sits in the menubar. \ No newline at end of file +A simple VST/AU host for OS X, Windows, and Linux that sits in the menubar. + +### Features + +- Add/remove plugins (AU/VST/VST3) +- Change output and input +- ASIO support for Windows +- Plugin states saved +- Saved plugin order