kopia lustrzana https://github.com/jameshball/osci-render
251 wiersze
8.5 KiB
C++
251 wiersze
8.5 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE framework.
|
|
Copyright (c) Raw Material Software Limited
|
|
|
|
JUCE is an open source framework subject to commercial or open source
|
|
licensing.
|
|
|
|
By downloading, installing, or using the JUCE framework, or combining the
|
|
JUCE framework with any other source code, object code, content or any other
|
|
copyrightable work, you agree to the terms of the JUCE End User Licence
|
|
Agreement, and all incorporated terms including the JUCE Privacy Policy and
|
|
the JUCE Website Terms of Service, as applicable, which will bind you. If you
|
|
do not agree to the terms of these agreements, we will not license the JUCE
|
|
framework to you, and you must discontinue the installation or download
|
|
process and cease use of the JUCE framework.
|
|
|
|
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
|
|
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
|
|
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
|
|
|
|
Or:
|
|
|
|
You may also use this code under the terms of the AGPLv3:
|
|
https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
|
|
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
|
|
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
|
|
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
#include <juce_core/system/juce_TargetPlatform.h>
|
|
|
|
#if JucePlugin_Build_Standalone
|
|
|
|
#if ! JUCE_MODULE_AVAILABLE_juce_audio_utils
|
|
#error To compile AudioUnitv3 and/or Standalone plug-ins, you need to add the juce_audio_utils and juce_audio_devices modules!
|
|
#endif
|
|
|
|
#include <juce_core/system/juce_TargetPlatform.h>
|
|
#include <juce_audio_plugin_client/detail/juce_CheckSettingMacros.h>
|
|
|
|
#include <juce_audio_plugin_client/detail/juce_IncludeSystemHeaders.h>
|
|
#include <juce_audio_plugin_client/detail/juce_IncludeModuleHeaders.h>
|
|
#include <juce_gui_basics/native/juce_WindowsHooks_windows.h>
|
|
#include <juce_audio_plugin_client/detail/juce_PluginUtilities.h>
|
|
|
|
#include <juce_audio_devices/juce_audio_devices.h>
|
|
#include <juce_gui_extra/juce_gui_extra.h>
|
|
#include <juce_audio_utils/juce_audio_utils.h>
|
|
|
|
// You can set this flag in your build if you need to specify a different
|
|
// standalone JUCEApplication class for your app to use. If you don't
|
|
// set it then by default we'll just create a simple one as below.
|
|
#if JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP
|
|
|
|
// #include <juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h>
|
|
#include "CustomStandaloneFilterWindow.h"
|
|
|
|
namespace juce
|
|
{
|
|
|
|
//==============================================================================
|
|
class CustomStandaloneFilterApp final : public JUCEApplication
|
|
{
|
|
public:
|
|
CustomStandaloneFilterApp()
|
|
{
|
|
PropertiesFile::Options options;
|
|
|
|
options.applicationName = CharPointer_UTF8 (JucePlugin_Name);
|
|
options.filenameSuffix = ".settings";
|
|
options.osxLibrarySubFolder = "Application Support";
|
|
#if JUCE_LINUX || JUCE_BSD
|
|
options.folderName = "~/.config";
|
|
#else
|
|
options.folderName = "";
|
|
#endif
|
|
|
|
appProperties.setStorageParameters (options);
|
|
}
|
|
|
|
const String getApplicationName() override { return CharPointer_UTF8 (JucePlugin_Name); }
|
|
const String getApplicationVersion() override { return JucePlugin_VersionString; }
|
|
bool moreThanOneInstanceAllowed() override { return true; }
|
|
void anotherInstanceStarted (const String& commandLine) override
|
|
{
|
|
if (mainWindow != nullptr)
|
|
{
|
|
mainWindow->toFront(true);
|
|
|
|
if (mainWindow->pluginHolder != nullptr && mainWindow->pluginHolder->commandLineCallback != nullptr) {
|
|
mainWindow->pluginHolder->commandLineCallback(commandLine);
|
|
}
|
|
}
|
|
}
|
|
|
|
virtual StandaloneFilterWindow* createWindow(const String& commandLine)
|
|
{
|
|
if (Desktop::getInstance().getDisplays().displays.isEmpty())
|
|
{
|
|
// No displays are available, so no window will be created!
|
|
jassertfalse;
|
|
return nullptr;
|
|
}
|
|
|
|
return new StandaloneFilterWindow (getApplicationName(),
|
|
LookAndFeel::getDefaultLookAndFeel().findColour (ResizableWindow::backgroundColourId),
|
|
createPluginHolder(commandLine));
|
|
}
|
|
|
|
virtual std::unique_ptr<StandalonePluginHolder> createPluginHolder(const String& commandLine)
|
|
{
|
|
constexpr auto autoOpenMidiDevices =
|
|
#if (JUCE_ANDROID || JUCE_IOS) && ! JUCE_DONT_AUTO_OPEN_MIDI_DEVICES_ON_MOBILE
|
|
true;
|
|
#else
|
|
false;
|
|
#endif
|
|
|
|
|
|
#ifdef JucePlugin_PreferredChannelConfigurations
|
|
constexpr StandalonePluginHolder::PluginInOuts channels[] { JucePlugin_PreferredChannelConfigurations };
|
|
const Array<StandalonePluginHolder::PluginInOuts> channelConfig (channels, juce::numElementsInArray (channels));
|
|
#else
|
|
const Array<StandalonePluginHolder::PluginInOuts> channelConfig;
|
|
#endif
|
|
|
|
return std::make_unique<StandalonePluginHolder> (appProperties.getUserSettings(),
|
|
commandLine,
|
|
false,
|
|
String{},
|
|
nullptr,
|
|
channelConfig,
|
|
autoOpenMidiDevices);
|
|
}
|
|
|
|
//==============================================================================
|
|
void initialise (const String& commandLine) override
|
|
{
|
|
mainWindow = rawToUniquePtr(createWindow(commandLine));
|
|
|
|
if (mainWindow != nullptr)
|
|
{
|
|
#if JUCE_STANDALONE_FILTER_WINDOW_USE_KIOSK_MODE
|
|
Desktop::getInstance().setKioskModeComponent (mainWindow.get(), false);
|
|
#endif
|
|
|
|
mainWindow->setVisible (true);
|
|
}
|
|
else
|
|
{
|
|
pluginHolder = createPluginHolder(commandLine);
|
|
}
|
|
}
|
|
|
|
void shutdown() override
|
|
{
|
|
pluginHolder = nullptr;
|
|
mainWindow = nullptr;
|
|
appProperties.saveIfNeeded();
|
|
}
|
|
|
|
//==============================================================================
|
|
void systemRequestedQuit() override
|
|
{
|
|
if (pluginHolder != nullptr)
|
|
pluginHolder->savePluginState();
|
|
|
|
if (mainWindow != nullptr)
|
|
mainWindow->pluginHolder->savePluginState();
|
|
|
|
if (ModalComponentManager::getInstance()->cancelAllModalComponents())
|
|
{
|
|
Timer::callAfterDelay (100, []()
|
|
{
|
|
if (auto app = JUCEApplicationBase::getInstance())
|
|
app->systemRequestedQuit();
|
|
});
|
|
}
|
|
else
|
|
{
|
|
quit();
|
|
}
|
|
}
|
|
|
|
protected:
|
|
ApplicationProperties appProperties;
|
|
std::unique_ptr<StandaloneFilterWindow> mainWindow;
|
|
|
|
private:
|
|
std::unique_ptr<StandalonePluginHolder> pluginHolder;
|
|
};
|
|
|
|
} // namespace juce
|
|
|
|
#if JucePlugin_Build_Standalone && JUCE_IOS
|
|
|
|
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes")
|
|
|
|
using namespace juce;
|
|
|
|
bool JUCE_CALLTYPE juce_isInterAppAudioConnected()
|
|
{
|
|
if (auto holder = StandalonePluginHolder::getInstance())
|
|
return holder->isInterAppAudioConnected();
|
|
|
|
return false;
|
|
}
|
|
|
|
void JUCE_CALLTYPE juce_switchToHostApplication()
|
|
{
|
|
if (auto holder = StandalonePluginHolder::getInstance())
|
|
holder->switchToHostApplication();
|
|
}
|
|
|
|
Image JUCE_CALLTYPE juce_getIAAHostIcon (int size)
|
|
{
|
|
if (auto holder = StandalonePluginHolder::getInstance())
|
|
return holder->getIAAHostIcon (size);
|
|
|
|
return Image();
|
|
}
|
|
|
|
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#if JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP
|
|
// extern juce::JUCEApplicationBase* juce_CreateApplication();
|
|
JUCE_CREATE_APPLICATION_DEFINE (juce::CustomStandaloneFilterApp)
|
|
|
|
#if JUCE_IOS
|
|
extern void* juce_GetIOSCustomDelegateClass();
|
|
#endif
|
|
|
|
#else
|
|
JUCE_CREATE_APPLICATION_DEFINE (juce::CustomStandaloneFilterApp)
|
|
#endif
|
|
|
|
#if ! JUCE_USE_CUSTOM_PLUGIN_STANDALONE_ENTRYPOINT
|
|
// JUCE_MAIN_FUNCTION_DEFINITION
|
|
#endif
|
|
|
|
#endif
|