Merge pull request #2 from rolandoislas/develop

Merge develop into master
This commit is contained in:
Rolando Islas
2016-01-01 21:05:20 -07:00
7 changed files with 279 additions and 66 deletions
+2 -1
View File
@@ -1,2 +1,3 @@
Builds/ Builds/
JuceLibraryCode/ JuceLibraryCode/
lib/
+89 -16
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<JUCERPROJECT id="NTe0XB0ij" name="Light Host" projectType="guiapp" version="1.0.0" <JUCERPROJECT id="NTe0XB0ij" name="Light Host" projectType="guiapp" version="1.1.0"
juceLinkage="amalg_multi" juceFolder="../../../juce" buildVST="1" juceLinkage="amalg_multi" juceFolder="../../../juce" buildVST="1"
buildRTAS="0" buildAU="1" vstFolderMac="~/SDKs/vstsdk2.4" vstFolderPC="c:\SDKs\vstsdk2.4" buildRTAS="0" buildAU="1" vstFolderMac="~/SDKs/vstsdk2.4" vstFolderPC="c:\SDKs\vstsdk2.4"
rtasFolderMac="~/SDKs/PT_80_SDK" rtasFolderPC="c:\SDKs\PT_80_SDK" rtasFolderMac="~/SDKs/PT_80_SDK" rtasFolderPC="c:\SDKs\PT_80_SDK"
@@ -24,22 +24,94 @@
headerPath="" cppLanguageStandard="c++11" cppLibType="libc++"/> headerPath="" cppLanguageStandard="c++11" cppLibType="libc++"/>
</CONFIGURATIONS> </CONFIGURATIONS>
<MODULEPATHS> <MODULEPATHS>
<MODULEPATH id="juce_video" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_video" path="lib\juce"/>
<MODULEPATH id="juce_opengl" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_opengl" path="lib\juce"/>
<MODULEPATH id="juce_gui_extra" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_gui_extra" path="lib\juce"/>
<MODULEPATH id="juce_gui_basics" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_gui_basics" path="lib\juce"/>
<MODULEPATH id="juce_graphics" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_graphics" path="lib\juce"/>
<MODULEPATH id="juce_events" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_events" path="lib\juce"/>
<MODULEPATH id="juce_data_structures" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_data_structures" path="lib\juce"/>
<MODULEPATH id="juce_cryptography" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_cryptography" path="lib\juce"/>
<MODULEPATH id="juce_core" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_core" path="lib\juce"/>
<MODULEPATH id="juce_audio_utils" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_audio_utils" path="lib\juce"/>
<MODULEPATH id="juce_audio_processors" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_audio_processors" path="lib\juce"/>
<MODULEPATH id="juce_audio_formats" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_audio_formats" path="lib\juce"/>
<MODULEPATH id="juce_audio_devices" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_audio_devices" path="lib\juce"/>
<MODULEPATH id="juce_audio_basics" path="../../../../Applications/Projucer/modules"/> <MODULEPATH id="juce_audio_basics" path="lib\juce"/>
</MODULEPATHS> </MODULEPATHS>
</XCODE_MAC> </XCODE_MAC>
<VS2015 targetFolder="Builds/VisualStudio2015" vstFolder="" vst3Folder=""
smallIcon="pmwje3" bigIcon="kxxp8K" userNotes="Place ASIO SDK headers in juce folder.">
<CONFIGURATIONS>
<CONFIGURATION name="Debug" winWarningLevel="4" generateManifest="1" winArchitecture="x64"
isDebug="1" optimisation="1" targetName="Light Host"/>
<CONFIGURATION name="Release" winWarningLevel="4" generateManifest="1" winArchitecture="x64"
isDebug="0" optimisation="3" targetName="Light Host"/>
</CONFIGURATIONS>
<MODULEPATHS>
<MODULEPATH id="juce_video" path="lib\juce"/>
<MODULEPATH id="juce_opengl" path="lib\juce"/>
<MODULEPATH id="juce_gui_extra" path="lib\juce"/>
<MODULEPATH id="juce_gui_basics" path="lib\juce"/>
<MODULEPATH id="juce_graphics" path="lib\juce"/>
<MODULEPATH id="juce_events" path="lib\juce"/>
<MODULEPATH id="juce_data_structures" path="lib\juce"/>
<MODULEPATH id="juce_cryptography" path="lib\juce"/>
<MODULEPATH id="juce_core" path="lib\juce"/>
<MODULEPATH id="juce_audio_utils" path="lib\juce"/>
<MODULEPATH id="juce_audio_processors" path="lib\juce"/>
<MODULEPATH id="juce_audio_formats" path="lib\juce"/>
<MODULEPATH id="juce_audio_devices" path="lib\juce"/>
<MODULEPATH id="juce_audio_basics" path="lib\juce"/>
</MODULEPATHS>
</VS2015>
<CODEBLOCKS_LINUX targetFolder="Builds/CodeBlocksLinux" vstFolder="" vst3Folder=""
smallIcon="pmwje3" bigIcon="kxxp8K" userNotes="Header search path for Steinberg SDK not being added to codeblocks.">
<CONFIGURATIONS>
<CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="Light Host"/>
<CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Light Host"/>
</CONFIGURATIONS>
<MODULEPATHS>
<MODULEPATH id="juce_video" path="lib/juce"/>
<MODULEPATH id="juce_opengl" path="lib/juce"/>
<MODULEPATH id="juce_gui_extra" path="lib/juce"/>
<MODULEPATH id="juce_gui_basics" path="lib/juce"/>
<MODULEPATH id="juce_graphics" path="lib/juce"/>
<MODULEPATH id="juce_events" path="lib/juce"/>
<MODULEPATH id="juce_data_structures" path="lib/juce"/>
<MODULEPATH id="juce_cryptography" path="lib/juce"/>
<MODULEPATH id="juce_core" path="lib/juce"/>
<MODULEPATH id="juce_audio_utils" path="lib/juce"/>
<MODULEPATH id="juce_audio_processors" path="lib/juce"/>
<MODULEPATH id="juce_audio_formats" path="lib/juce"/>
<MODULEPATH id="juce_audio_devices" path="lib/juce"/>
<MODULEPATH id="juce_audio_basics" path="lib/juce"/>
</MODULEPATHS>
</CODEBLOCKS_LINUX>
<LINUX_MAKE targetFolder="Builds/LinuxMakefile" vstFolder="" vst3Folder="">
<CONFIGURATIONS>
<CONFIGURATION name="Debug" libraryPath="/usr/X11R6/lib/" isDebug="1" optimisation="1"
targetName="Light Host"/>
<CONFIGURATION name="Release" libraryPath="/usr/X11R6/lib/" isDebug="0" optimisation="3"
targetName="Light Host"/>
</CONFIGURATIONS>
<MODULEPATHS>
<MODULEPATH id="juce_video" path="lib/juce"/>
<MODULEPATH id="juce_opengl" path="lib/juce"/>
<MODULEPATH id="juce_gui_extra" path="lib/juce"/>
<MODULEPATH id="juce_gui_basics" path="lib/juce"/>
<MODULEPATH id="juce_graphics" path="lib/juce"/>
<MODULEPATH id="juce_events" path="lib/juce"/>
<MODULEPATH id="juce_data_structures" path="lib/juce"/>
<MODULEPATH id="juce_cryptography" path="lib/juce"/>
<MODULEPATH id="juce_core" path="lib/juce"/>
<MODULEPATH id="juce_audio_utils" path="lib/juce"/>
<MODULEPATH id="juce_audio_processors" path="lib/juce"/>
<MODULEPATH id="juce_audio_formats" path="lib/juce"/>
<MODULEPATH id="juce_audio_devices" path="lib/juce"/>
<MODULEPATH id="juce_audio_basics" path="lib/juce"/>
</MODULEPATHS>
</LINUX_MAKE>
</EXPORTFORMATS> </EXPORTFORMATS>
<MAINGROUP id="YdWL7hi7p" name="Light Host"> <MAINGROUP id="YdWL7hi7p" name="Light Host">
<GROUP id="{1B23ABDC-E658-7C9C-3584-0C960D2AE323}" name="Source"> <GROUP id="{1B23ABDC-E658-7C9C-3584-0C960D2AE323}" name="Source">
@@ -63,7 +135,7 @@
JUCE_QUICKTIME="disabled" JUCE_USE_FLAC="disabled" JUCE_USE_OGGVORBIS="disabled" JUCE_QUICKTIME="disabled" JUCE_USE_FLAC="disabled" JUCE_USE_OGGVORBIS="disabled"
JUCE_USE_CDBURNER="disabled" JUCE_USE_CDREADER="disabled" JUCE_USE_CAMERA="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_VST="enabled" JUCE_PLUGINHOST_AU="enabled" JUCE_WEB_BROWSER="disabled"
JUCE_PLUGINHOST_VST3="enabled"/> JUCE_PLUGINHOST_VST3="enabled" JUCE_ASIO="enabled"/>
<MODULES> <MODULES>
<MODULE id="juce_audio_basics" showAllCode="1"/> <MODULE id="juce_audio_basics" showAllCode="1"/>
<MODULE id="juce_audio_devices" showAllCode="1"/> <MODULE id="juce_audio_devices" showAllCode="1"/>
@@ -82,5 +154,6 @@
</MODULES> </MODULES>
<LIVE_SETTINGS> <LIVE_SETTINGS>
<OSX headerPath=""/> <OSX headerPath=""/>
<WINDOWS/>
</LIVE_SETTINGS> </LIVE_SETTINGS>
</JUCERPROJECT> </JUCERPROJECT>
+3 -1
View File
@@ -23,7 +23,9 @@ public:
LookAndFeel::setDefaultLookAndFeel (&lookAndFeel); LookAndFeel::setDefaultLookAndFeel (&lookAndFeel);
mainWindow = new IconMenu(); mainWindow = new IconMenu();
Process::setDockIconVisible(false); #if JUCE_MAC
Process::setDockIconVisible(false);
#endif
File fileToOpen; File fileToOpen;
+153 -44
View File
@@ -9,11 +9,63 @@
#include "../JuceLibraryCode/JuceHeader.h" #include "../JuceLibraryCode/JuceHeader.h"
#include "IconMenu.hpp" #include "IconMenu.hpp"
#include "PluginWindow.h" #include "PluginWindow.h"
#include <ctime>
#if JUCE_WINDOWS
#include "Windows.h"
#endif
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);
setUsingNativeTitleBar(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.removePluginsLackingInputOutput();
#if JUCE_MAC
Process::setDockIconVisible(false);
#endif
owner.pluginListWindow = nullptr;
}
private:
IconMenu& owner;
};
IconMenu::IconMenu() IconMenu::IconMenu()
{ {
// Initiialization // Initiialization
formatManager.addDefaultFormats(); formatManager.addDefaultFormats();
#if JUCE_WINDOWS
x = y = 0;
#endif
// Audio device // Audio device
ScopedPointer<XmlElement> savedAudioState (getAppProperties().getUserSettings()->getXmlValue("audioDeviceState")); ScopedPointer<XmlElement> savedAudioState (getAppProperties().getUserSettings()->getXmlValue("audioDeviceState"));
deviceManager.initialise(256, 256, savedAudioState, true); deviceManager.initialise(256, 256, savedAudioState, true);
@@ -32,10 +84,15 @@ IconMenu::IconMenu()
loadActivePlugins(); loadActivePlugins();
activePluginList.addChangeListener(this); activePluginList.addChangeListener(this);
// Set menu icon // Set menu icon
if (exec("defaults read -g AppleInterfaceStyle").compare("Dark") == 1) #if JUCE_MAC
setIconImage(ImageFileFormat::loadFrom(BinaryData::menu_icon_white_png, BinaryData::menu_icon_white_pngSize)); if (exec("defaults read -g AppleInterfaceStyle").compare("Dark") == 1)
else setIconImage(ImageFileFormat::loadFrom(BinaryData::menu_icon_white_png, BinaryData::menu_icon_white_pngSize));
setIconImage(ImageFileFormat::loadFrom(BinaryData::menu_icon_png, BinaryData::menu_icon_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
setIconTooltip(JUCEApplication::getInstance()->getApplicationName());
}; };
IconMenu::~IconMenu() IconMenu::~IconMenu()
@@ -47,18 +104,20 @@ void IconMenu::loadActivePlugins()
{ {
graph.clear(); graph.clear();
inputNode = graph.addNode(new AudioProcessorGraph::AudioGraphIOProcessor(AudioProcessorGraph::AudioGraphIOProcessor::audioInputNode), 1); 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) if (activePluginList.getNumTypes() == 0)
{ {
graph.addConnection(1, 0, 2, 0); graph.addConnection(1, 0, 2, 0);
graph.addConnection(1, 1, 2, 1); graph.addConnection(1, 1, 2, 1);
} }
int pluginTime = 0;
for (int i = 0; i < activePluginList.getNumTypes(); i++) for (int i = 0; i < activePluginList.getNumTypes(); i++)
{ {
PluginDescription plugin = *activePluginList.getType(i); PluginDescription plugin = getNextPluginOlderThanTime(pluginTime);
String errorMessage; String errorMessage;
AudioPluginInstance* instance = formatManager.createPluginInstance(plugin, graph.getSampleRate(), graph.getBlockSize(), 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); String savedPluginState = getAppProperties().getUserSettings()->getValue(pluginUid);
MemoryBlock savedPluginBinary; MemoryBlock savedPluginBinary;
savedPluginBinary.fromBase64Encoding(savedPluginState); savedPluginBinary.fromBase64Encoding(savedPluginState);
@@ -85,6 +144,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) void IconMenu::changeListenerCallback(ChangeBroadcaster* changed)
{ {
if (changed == &knownPluginList) if (changed == &knownPluginList)
@@ -103,11 +183,11 @@ void IconMenu::changeListenerCallback(ChangeBroadcaster* changed)
{ {
getAppProperties().getUserSettings()->setValue ("pluginListActive", savedPluginList); getAppProperties().getUserSettings()->setValue ("pluginListActive", savedPluginList);
getAppProperties().saveIfNeeded(); getAppProperties().saveIfNeeded();
loadActivePlugins();
} }
} }
} }
#if JUCE_MAC
std::string IconMenu::exec(const char* cmd) std::string IconMenu::exec(const char* cmd)
{ {
std::shared_ptr<FILE> pipe(popen(cmd, "r"), pclose); std::shared_ptr<FILE> pipe(popen(cmd, "r"), pclose);
@@ -121,6 +201,7 @@ std::string IconMenu::exec(const char* cmd)
} }
return result; return result;
} }
#endif
void IconMenu::timerCallback() void IconMenu::timerCallback()
{ {
@@ -129,16 +210,18 @@ void IconMenu::timerCallback()
menu.addSectionHeader(JUCEApplication::getInstance()->getApplicationName()); menu.addSectionHeader(JUCEApplication::getInstance()->getApplicationName());
if (menuIconLeftClicked) { if (menuIconLeftClicked) {
menu.addItem(1, "Preferences"); menu.addItem(1, "Preferences");
menu.addItem(2, "Reload Plugins"); menu.addItem(2, "Edit Plugins");
menu.addSeparator(); menu.addSeparator();
// Active plugins // Active plugins
int time = 0;
for (int i = 0; i < activePluginList.getNumTypes(); i++) for (int i = 0; i < activePluginList.getNumTypes(); i++)
{ {
PopupMenu options; PopupMenu options;
options.addItem(i+3, "Edit"); options.addItem(i+3, "Edit");
options.addItem(activePluginList.getNumTypes()+i+3, "Delete"); options.addItem(activePluginList.getNumTypes()+i+3, "Delete");
// TODO bypass // TODO bypass
menu.addSubMenu(activePluginList.getType(i)->name, options); PluginDescription plugin = getNextPluginOlderThanTime(time);
menu.addSubMenu(plugin.name, options);
} }
menu.addSeparator(); menu.addSeparator();
// All plugins // All plugins
@@ -148,12 +231,28 @@ void IconMenu::timerCallback()
{ {
menu.addItem(1, "Quit"); menu.addItem(1, "Quit");
} }
#if JUCE_MAC || JUCE_LINUX
menu.showMenuAsync(PopupMenu::Options().withTargetComponent(this), ModalCallbackFunction::forComponent(menuInvocationCallback, this)); 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);
x = iconLocation.x;
y = iconLocation.y;
}
juce::Rectangle<int> rect(x, y, 1, 1);
menu.showMenuAsync(PopupMenu::Options().withTargetScreenArea(rect), ModalCallbackFunction::forComponent(menuInvocationCallback, this));
#endif
} }
void IconMenu::mouseDown(const MouseEvent& e) void IconMenu::mouseDown(const MouseEvent& e)
{ {
Process::setDockIconVisible(true); #if JUCE_MAC
Process::setDockIconVisible(true);
#endif
Process::makeForegroundProcess(); Process::makeForegroundProcess();
menuIconLeftClicked = e.mods.isLeftButtonDown(); menuIconLeftClicked = e.mods.isLeftButtonDown();
startTimer(50); startTimer(50);
@@ -167,9 +266,11 @@ void IconMenu::menuInvocationCallback(int id, IconMenu* im)
im->savePluginStates(); im->savePluginStates();
return JUCEApplication::getInstance()->quit(); return JUCEApplication::getInstance()->quit();
} }
#if JUCE_MAC
// Click elsewhere // Click elsewhere
if (id == 0 && !PluginWindow::containsActiveWindows()) if (id == 0 && !PluginWindow::containsActiveWindows())
Process::setDockIconVisible(false); Process::setDockIconVisible(false);
#endif
// Audio settings // Audio settings
if (id == 1) if (id == 1)
im->showAudioSettings(); im->showAudioSettings();
@@ -183,14 +284,31 @@ void IconMenu::menuInvocationCallback(int id, IconMenu* im)
if (id > im->activePluginList.getNumTypes() + 2 && id <= im->activePluginList.getNumTypes() * 2 + 2) if (id > im->activePluginList.getNumTypes() + 2 && id <= im->activePluginList.getNumTypes() * 2 + 2)
{ {
im->deletePluginStates(); 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 // Add plugin
else if (id > im->activePluginList.getNumTypes() + 2) else if (id > im->activePluginList.getNumTypes() + 2)
{ {
im->deletePluginStates(); 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;
int t = time(0);
getAppProperties().getUserSettings()->setValue(key, t);
getAppProperties().saveIfNeeded();
im->activePluginList.addType(plugin);
im->savePluginStates();
im->loadActivePlugins();
} }
// Show active plugin GUI // Show active plugin GUI
else else
@@ -208,7 +326,8 @@ void IconMenu::deletePluginStates()
{ {
for (int i = 0; i < activePluginList.getNumTypes(); i++) 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().getUserSettings()->removeValue(pluginUid);
getAppProperties().saveIfNeeded(); getAppProperties().saveIfNeeded();
} }
@@ -218,11 +337,14 @@ void IconMenu::savePluginStates()
{ {
for (int i = 0; i < activePluginList.getNumTypes(); i++) for (int i = 0; i < activePluginList.getNumTypes(); i++)
{ {
AudioProcessor& processor = *graph.getNodeForId(i+3)->getProcessor(); AudioProcessorGraph::Node* node = graph.getNodeForId(i+3);
String pluginUid = "pluginState-" + std::to_string(i); if (node == nullptr)
break;
AudioProcessor& processor = *node->getProcessor();
String pluginUid;
pluginUid << "pluginState-" << i;
MemoryBlock savedStateBinary; MemoryBlock savedStateBinary;
processor.getStateInformation(savedStateBinary); processor.getStateInformation(savedStateBinary);
ScopedPointer<XmlElement> savedStateXml(XmlElement::createTextElement(savedStateBinary.toBase64Encoding()));
getAppProperties().getUserSettings()->setValue(pluginUid, savedStateBinary.toBase64Encoding()); getAppProperties().getUserSettings()->setValue(pluginUid, savedStateBinary.toBase64Encoding());
getAppProperties().saveIfNeeded(); getAppProperties().saveIfNeeded();
} }
@@ -252,33 +374,20 @@ void IconMenu::showAudioSettings()
void IconMenu::reloadPlugins() 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 (pluginListWindow == nullptr)
pluginListWindow = new PluginListWindow(*this, formatManager);
pluginListWindow->toFront(true);
} }
void IconMenu::doReload(int id, IconMenu* im) void IconMenu::removePluginsLackingInputOutput()
{ {
// Canceled std::vector<int> removeIndex;
if (id == 0) for (int i = 0; i < knownPluginList.getNumTypes(); i++)
return Process::setDockIconVisible(false); {
// Scan PluginDescription* plugin = knownPluginList.getType(i);
const File deadMansPedalFile (getAppProperties().getUserSettings()->getFile().getSiblingFile("RecentlyCrashedPluginsList")); if (plugin->numInputChannels < 2 || plugin->numOutputChannels < 2)
String pluginName; removeIndex.push_back(i);
for (int i = 0; i < im->formatManager.getNumFormats(); i++) }
{ for (int i = 0; i < removeIndex.size(); i++)
im->scanner = new PluginDirectoryScanner(im->knownPluginList, *im->formatManager.getFormat(i), im->formatManager.getFormat(i)->getDefaultLocationsToSearch(), true, deadMansPedalFile); knownPluginList.removeType(removeIndex[i] - i);
while (im->scanner->scanNextFile(true, pluginName)) { }
}
// Remove plugins without inputs and/or outputs
std::vector<int> 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.");
Process::setDockIconVisible(false);
} }
+10 -3
View File
@@ -18,16 +18,19 @@ public:
~IconMenu(); ~IconMenu();
void mouseDown(const MouseEvent&); void mouseDown(const MouseEvent&);
static void menuInvocationCallback(int id, IconMenu*); static void menuInvocationCallback(int id, IconMenu*);
static void doReload(int id, IconMenu*);
void changeListenerCallback(ChangeBroadcaster* changed); void changeListenerCallback(ChangeBroadcaster* changed);
private: private:
#if JUCE_MAC
std::string exec(const char* cmd); std::string exec(const char* cmd);
#endif
void timerCallback(); void timerCallback();
void reloadPlugins(); void reloadPlugins();
void showAudioSettings(); void showAudioSettings();
void loadActivePlugins(); void loadActivePlugins();
void savePluginStates(); void savePluginStates();
void deletePluginStates(); void deletePluginStates();
PluginDescription getNextPluginOlderThanTime(int &time);
void removePluginsLackingInputOutput();
AudioDeviceManager deviceManager; AudioDeviceManager deviceManager;
AudioPluginFormatManager formatManager; AudioPluginFormatManager formatManager;
@@ -41,8 +44,12 @@ private:
AudioProcessorPlayer player; AudioProcessorPlayer player;
AudioProcessorGraph::Node *inputNode; AudioProcessorGraph::Node *inputNode;
AudioProcessorGraph::Node *outputNode; AudioProcessorGraph::Node *outputNode;
#if JUCE_WINDOWS
class ScanThread; int x, y;
#endif
class PluginListWindow;
ScopedPointer<PluginListWindow> pluginListWindow;
}; };
#endif /* IconMenu_hpp */ #endif /* IconMenu_hpp */
+13
View File
@@ -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
+9 -1
View File
@@ -1,4 +1,12 @@
Light Host Light Host
--- ---
A simple VST/AU host for OS X that sits in the menubar. 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