@@ -0,0 +1,469 @@ | |||
/* | |||
============================================================================== | |||
Build options for juce static library | |||
============================================================================== | |||
*/ | |||
#ifndef BUILD_JUCE_APPCONFIG_H_INCLUDED | |||
#define BUILD_JUCE_APPCONFIG_H_INCLUDED | |||
#define JUCE_MODULE_AVAILABLE_juce_audio_basics 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_audio_formats 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_audio_plugin_client 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_audio_processors 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_audio_utils 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_blocks_basics 0 | |||
#define JUCE_MODULE_AVAILABLE_juce_box2d 0 | |||
#define JUCE_MODULE_AVAILABLE_juce_core 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_cryptography 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_data_structures 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_dsp 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_events 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_graphics 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_gui_basics 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_gui_extra 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_opengl 1 | |||
#define JUCE_MODULE_AVAILABLE_juce_osc 0 | |||
#define JUCE_MODULE_AVAILABLE_juce_product_unlocking 0 | |||
#define JUCE_MODULE_AVAILABLE_juce_video 0 | |||
// optional | |||
#ifndef JUCE_MODULE_AVAILABLE_juce_audio_devices | |||
#define JUCE_MODULE_AVAILABLE_juce_audio_devices 0 | |||
#endif | |||
// FIXME needed for some plugins | |||
#define JUCE_MODAL_LOOPS_PERMITTED 1 | |||
//============================================================================= | |||
#define JUCE_STANDALONE_APPLICATION 0 | |||
#define JUCE_REPORT_APP_USAGE 0 | |||
#define JUCE_DISPLAY_SPLASH_SCREEN 0 | |||
#define JUCE_USE_DARK_SPLASH_SCREEN 0 | |||
//============================================================================= | |||
// juce_audio_basics | |||
#ifdef __ARM_NEON__ | |||
#define JUCE_USE_ARM_NEON 1 | |||
#endif | |||
#ifdef __SSE2__ | |||
#define JUCE_USE_SSE_INTRINSICS 1 | |||
#endif | |||
//============================================================================= | |||
// juce_audio_devices | |||
/** Config: JUCE_ASIO | |||
Enables ASIO audio devices (MS Windows only). | |||
Turning this on means that you'll need to have the Steinberg ASIO SDK installed | |||
on your Windows build machine. | |||
See the comments in the ASIOAudioIODevice class's header file for more | |||
info about this. | |||
*/ | |||
#define JUCE_ASIO 0 | |||
/** Config: JUCE_WASAPI | |||
Enables WASAPI audio devices (Windows Vista and above). | |||
*/ | |||
#define JUCE_WASAPI 0 | |||
/** Config: JUCE_DIRECTSOUND | |||
Enables DirectSound audio (MS Windows only). | |||
*/ | |||
#define JUCE_DIRECTSOUND 0 | |||
/** Config: JUCE_ALSA | |||
Enables ALSA audio devices (Linux only). | |||
*/ | |||
#if LINUX | |||
#define JUCE_ALSA 1 | |||
#define JUCE_ALSA_MIDI_NAME "JuceMidi" | |||
#else | |||
#define JUCE_ALSA 0 | |||
#endif | |||
/** Config: JUCE_JACK | |||
Enables JACK audio devices (Linux only). | |||
*/ | |||
#define JUCE_JACK 0 | |||
/** Config: JUCE_USE_ANDROID_OPENSLES | |||
Enables OpenSLES devices (Android only). | |||
*/ | |||
#define JUCE_USE_ANDROID_OPENSLES 0 | |||
/** Config: JUCE_USE_CDREADER | |||
Enables the AudioCDReader class (on supported platforms). | |||
*/ | |||
#define JUCE_USE_CDREADER 0 | |||
/** Config: JUCE_USE_CDBURNER | |||
Enables the AudioCDBurner class (on supported platforms). | |||
*/ | |||
#define JUCE_USE_CDBURNER 0 | |||
//============================================================================= | |||
// juce_audio_formats | |||
/** Config: JUCE_USE_FLAC | |||
Enables the FLAC audio codec classes (available on all platforms). | |||
If your app doesn't need to read FLAC files, you might want to disable this to | |||
reduce the size of your codebase and build time. | |||
*/ | |||
#define JUCE_USE_FLAC 1 | |||
/** Config: JUCE_USE_OGGVORBIS | |||
Enables the Ogg-Vorbis audio codec classes (available on all platforms). | |||
If your app doesn't need to read Ogg-Vorbis files, you might want to disable this to | |||
reduce the size of your codebase and build time. | |||
*/ | |||
#define JUCE_USE_OGGVORBIS 1 | |||
/** Config: JUCE_USE_MP3AUDIOFORMAT | |||
Enables the software-based MP3AudioFormat class. | |||
IMPORTANT DISCLAIMER: By choosing to enable the JUCE_USE_MP3AUDIOFORMAT flag and to compile | |||
this MP3 code into your software, you do so AT YOUR OWN RISK! By doing so, you are agreeing | |||
that Raw Material Software is in no way responsible for any patent, copyright, or other | |||
legal issues that you may suffer as a result. | |||
The code in juce_MP3AudioFormat.cpp is NOT guaranteed to be free from infringements of 3rd-party | |||
intellectual property. If you wish to use it, please seek your own independent advice about the | |||
legality of doing so. If you are not willing to accept full responsibility for the consequences | |||
of using this code, then do not enable this setting. | |||
*/ | |||
#define JUCE_USE_MP3AUDIOFORMAT 0 | |||
/** Config: JUCE_USE_LAME_AUDIO_FORMAT | |||
Enables the LameEncoderAudioFormat class. | |||
*/ | |||
#define JUCE_USE_LAME_AUDIO_FORMAT 0 | |||
/** Config: JUCE_USE_WINDOWS_MEDIA_FORMAT | |||
Enables the Windows Media SDK codecs. | |||
*/ | |||
#define JUCE_USE_WINDOWS_MEDIA_FORMAT 0 | |||
//============================================================================= | |||
// juce_audio_processors | |||
/** Config: JUCE_PLUGINHOST_VST | |||
Enables the VST audio plugin hosting classes. This requires the Steinberg VST SDK to be | |||
installed on your machine. | |||
@see VSTPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU, JUCE_PLUGINHOST_VST3 | |||
*/ | |||
#define JUCE_PLUGINHOST_VST 1 | |||
/** Config: JUCE_PLUGINHOST_VST3 | |||
Enables the VST3 audio plugin hosting classes. This requires the Steinberg VST3 SDK to be | |||
installed on your machine. | |||
@see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_AU | |||
*/ | |||
#if 0 //MAC || WINDOWS | |||
#define JUCE_PLUGINHOST_VST3 1 | |||
#else | |||
#define JUCE_PLUGINHOST_VST3 0 | |||
#endif | |||
/** Config: JUCE_PLUGINHOST_AU | |||
Enables the AudioUnit plugin hosting classes. This is Mac-only, of course. | |||
@see AudioUnitPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_VST3 | |||
*/ | |||
#if MAC | |||
#define JUCE_PLUGINHOST_AU 1 | |||
#else | |||
#define JUCE_PLUGINHOST_AU 0 | |||
#endif | |||
#if LINUX | |||
#define JUCE_PLUGINHOST_LADSPA 1 | |||
#else | |||
#define JUCE_PLUGINHOST_LADSPA 0 | |||
#endif | |||
//============================================================================= | |||
// juce_audio_utils | |||
//============================================================================= | |||
// juce_core | |||
/** Config: JUCE_FORCE_DEBUG | |||
Normally, JUCE_DEBUG is set to 1 or 0 based on compiler and project settings, | |||
but if you define this value, you can override this to force it to be true or false. | |||
*/ | |||
#define JUCE_FORCE_DEBUG 0 | |||
/** Config: JUCE_LOG_ASSERTIONS | |||
If this flag is enabled, the the jassert and jassertfalse macros will always use Logger::writeToLog() | |||
to write a message when an assertion happens. | |||
Enabling it will also leave this turned on in release builds. When it's disabled, | |||
however, the jassert and jassertfalse macros will not be compiled in a | |||
release build. | |||
@see jassert, jassertfalse, Logger | |||
*/ | |||
#define JUCE_LOG_ASSERTIONS 1 | |||
/** Config: JUCE_CHECK_MEMORY_LEAKS | |||
Enables a memory-leak check for certain objects when the app terminates. See the LeakedObjectDetector | |||
class and the JUCE_LEAK_DETECTOR macro for more details about enabling leak checking for specific classes. | |||
*/ | |||
#ifdef DEBUG | |||
#define JUCE_CHECK_MEMORY_LEAKS 1 | |||
#else | |||
#define JUCE_CHECK_MEMORY_LEAKS 0 | |||
#endif | |||
/** Config: JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |||
In a Visual C++ build, this can be used to stop the required system libs being | |||
automatically added to the link stage. | |||
*/ | |||
#define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES 0 | |||
/* Config: JUCE_INCLUDE_ZLIB_CODE | |||
This can be used to disable Juce's embedded 3rd-party zlib code. | |||
You might need to tweak this if you're linking to an external zlib library in your app, | |||
but for normal apps, this option should be left alone. | |||
If you disable this, you might also want to set a value for JUCE_ZLIB_INCLUDE_PATH, to | |||
specify the path where your zlib headers live. | |||
*/ | |||
#define JUCE_INCLUDE_ZLIB_CODE 1 | |||
/** Config: JUCE_USE_CURL | |||
Enables http/https support via libcurl (Linux only). Enabling this will add an additional | |||
run-time dynmic dependency to libcurl. | |||
If you disable this then https/ssl support will not be available on linux. | |||
*/ | |||
#define JUCE_USE_CURL 0 | |||
/* Config: JUCE_CATCH_UNHANDLED_EXCEPTIONS | |||
If enabled, this will add some exception-catching code to forward unhandled exceptions | |||
to your JUCEApplication::unhandledException() callback. | |||
*/ | |||
#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 0 | |||
/** Config: JUCE_ALLOW_STATIC_NULL_VARIABLES | |||
If disabled, this will turn off dangerous static globals like String::empty, var::null, etc | |||
which can cause nasty order-of-initialisation problems if they are referenced during static | |||
constructor code. | |||
*/ | |||
#define JUCE_ALLOW_STATIC_NULL_VARIABLES 0 | |||
#define JUCE_STRING_UTF_TYPE 8 | |||
#define JUCE_USE_VFORK 1 | |||
//============================================================================= | |||
// juce_cryptography | |||
//============================================================================= | |||
// juce_data_structures | |||
//============================================================================= | |||
// juce_dsp | |||
/** Config: JUCE_ASSERTION_FIRFILTER | |||
When this flag is enabled, an assertion will be generated during the | |||
execution of DEBUG configurations if you use a FIRFilter class to process | |||
FIRCoefficients with a size higher than 128, to tell you that's it would be | |||
more efficient to use the Convolution class instead. It is enabled by | |||
default, but you may want to disable it if you really want to process such | |||
a filter in the time domain. | |||
*/ | |||
#define JUCE_ASSERTION_FIRFILTER 0 | |||
/** Config: JUCE_DSP_USE_INTEL_MKL | |||
If this flag is set, then JUCE will use Intel's MKL for JUCE's FFT and | |||
convolution classes. | |||
The folder containing the mkl_dfti.h header must be in your header | |||
search paths when using this flag. You also need to add all the necessary | |||
intel mkl libraries to the "External Libraries to Link" field in the | |||
Projucer. | |||
*/ | |||
#define JUCE_DSP_USE_INTEL_MKL 0 | |||
/** Config: JUCE_DSP_USE_SHARED_FFTW | |||
If this flag is set, then JUCE will search for the fftw shared libraries | |||
at runtime and use the library for JUCE's FFT and convolution classes. | |||
If the library is not found, then JUCE's fallback FFT routines will be used. | |||
This is especially useful on linux as fftw often comes pre-installed on | |||
popular linux distros. | |||
You must respect the FFTW license when enabling this option. | |||
*/ | |||
#define JUCE_DSP_USE_SHARED_FFTW 1 | |||
/** Config: JUCE_DSP_USE_STATIC_FFTW | |||
If this flag is set, then JUCE will use the statically linked fftw libraries | |||
for JUCE's FFT and convolution classes. | |||
You must add the fftw header/library folder to the extra header/library search | |||
paths of your JUCE project. You also need to add the fftw library itself | |||
to the extra libraries supplied to your JUCE project during linking. | |||
You must respect the FFTW license when enabling this option. | |||
*/ | |||
#define JUCE_DSP_USE_STATIC_FFTW 0 | |||
/** Config: JUCE_DSP_ENABLE_SNAP_TO_ZERO | |||
Enables code in the dsp module to avoid floating point denormals during the | |||
processing of some of the dsp module's filters. | |||
Enabling this will add a slight performance overhead to the DSP module's | |||
filters and algorithms. If your audio app already disables denormals altogether | |||
(for exmaple, by using the ScopedNoDenormals class or the | |||
FloatVectorOperations::disableDenormalisedNumberSupport method), then you | |||
can safely disable this flag to shave off a few cpu cycles from the DSP module's | |||
filters and algorithms. | |||
*/ | |||
#define JUCE_DSP_ENABLE_SNAP_TO_ZERO 0 | |||
//============================================================================= | |||
// juce_events | |||
//============================================================================= | |||
// juce_graphics | |||
//============================================================================= | |||
/** Config: JUCE_USE_COREIMAGE_LOADER | |||
On OSX, enabling this flag means that the CoreImage codecs will be used to load | |||
PNG/JPEG/GIF files. It is enabled by default, but you may want to disable it if | |||
you'd rather use libpng, libjpeg, etc. | |||
*/ | |||
#if MAC | |||
#define JUCE_USE_COREIMAGE_LOADER 1 | |||
#else | |||
#define JUCE_USE_COREIMAGE_LOADER 0 | |||
#endif | |||
/** Config: JUCE_USE_DIRECTWRITE | |||
Enabling this flag means that DirectWrite will be used when available for font | |||
management and layout. | |||
*/ | |||
#define JUCE_USE_DIRECTWRITE 0 | |||
#define JUCE_INCLUDE_PNGLIB_CODE 1 | |||
#define JUCE_INCLUDE_JPEGLIB_CODE 1 | |||
#if MAC | |||
#define USE_COREGRAPHICS_RENDERING 1 | |||
#else | |||
#define USE_COREGRAPHICS_RENDERING 0 | |||
#endif | |||
//============================================================================= | |||
// juce_gui_basics | |||
/** Config: JUCE_ENABLE_REPAINT_DEBUGGING | |||
If this option is turned on, each area of the screen that gets repainted will | |||
flash in a random colour, so that you can see exactly which bits of your | |||
components are being drawn. | |||
*/ | |||
#define JUCE_ENABLE_REPAINT_DEBUGGING 0 | |||
/** JUCE_USE_XRANDR: Enables Xrandr multi-monitor support (Linux only). | |||
Unless you specifically want to disable this, it's best to leave this option turned on. | |||
Note that your users do not need to have Xrandr installed for your JUCE app to run, as | |||
the availability of Xrandr is queried during runtime. | |||
*/ | |||
#define JUCE_USE_XRANDR 0 | |||
/** JUCE_USE_XINERAMA: Enables Xinerama multi-monitor support (Linux only). | |||
Unless you specifically want to disable this, it's best to leave this option turned on. | |||
*/ | |||
#define JUCE_USE_XINERAMA 0 | |||
/** Config: JUCE_USE_XSHM | |||
Enables X shared memory for faster rendering on Linux. This is best left turned on | |||
unless you have a good reason to disable it. | |||
*/ | |||
#if LINUX | |||
#define JUCE_USE_XSHM 1 | |||
#else | |||
#define JUCE_USE_XSHM 0 | |||
#endif | |||
/** Config: JUCE_USE_XRENDER | |||
Enables XRender to allow semi-transparent windowing on Linux. | |||
*/ | |||
#define JUCE_USE_XRENDER 0 | |||
/** Config: JUCE_USE_XCURSOR | |||
Uses XCursor to allow ARGB cursor on Linux. This is best left turned on unless you have | |||
a good reason to disable it. | |||
*/ | |||
#if LINUX | |||
#define JUCE_USE_XCURSOR 1 | |||
#else | |||
#define JUCE_USE_XCURSOR 0 | |||
#endif | |||
#if LINUX | |||
#define JUCE_DISABLE_NATIVE_FILECHOOSERS 1 | |||
#endif | |||
//============================================================================= | |||
// juce_gui_extra | |||
/** Config: JUCE_WEB_BROWSER | |||
This lets you disable the WebBrowserComponent class (Mac and Windows). | |||
If you're not using any embedded web-pages, turning this off may reduce your code size. | |||
*/ | |||
#define JUCE_WEB_BROWSER 0 | |||
/** Config: JUCE_ENABLE_LIVE_CONSTANT_EDITOR | |||
This lets you turn on the JUCE_ENABLE_LIVE_CONSTANT_EDITOR support. See the documentation | |||
for that macro for more details. | |||
*/ | |||
#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 0 | |||
//============================================================================= | |||
// juce_opengl | |||
#define JUCE_OPENGL3 1 | |||
//============================================================================= | |||
// Linux embed build | |||
#if JUCE_AUDIOPROCESSOR_NO_GUI | |||
#undef JUCE_MODULE_AVAILABLE_juce_graphics | |||
#undef JUCE_MODULE_AVAILABLE_juce_gui_basics | |||
#undef JUCE_MODULE_AVAILABLE_juce_gui_extra | |||
#undef JUCE_MODULE_AVAILABLE_juce_opengl | |||
#define JUCE_MODULE_AVAILABLE_juce_graphics 0 | |||
#define JUCE_MODULE_AVAILABLE_juce_gui_basics 0 | |||
#define JUCE_MODULE_AVAILABLE_juce_gui_extra 0 | |||
#define JUCE_MODULE_AVAILABLE_juce_opengl 0 | |||
#undef JUCE_ALSA | |||
#undef JUCE_PLUGINHOST_LADSPA | |||
#undef JUCE_PLUGINHOST_VST | |||
#define JUCE_ALSA 0 | |||
#define JUCE_PLUGINHOST_LADSPA 0 | |||
#define JUCE_PLUGINHOST_VST 0 | |||
#endif | |||
#endif // BUILD_JUCE_APPCONFIG_H_INCLUDED |
@@ -0,0 +1,82 @@ | |||
############################################################################### | |||
if linux_embed | |||
juce61_srcs = [ | |||
'source/modules/juce_audio_basics/juce_audio_basics.cpp', | |||
'source/modules/juce_audio_formats/juce_audio_formats.cpp', | |||
'source/modules/juce_audio_processors/juce_audio_processors.cpp', | |||
'source/modules/juce_audio_utils/juce_audio_utils.cpp', | |||
'source/modules/juce_core/juce_core.cpp', | |||
'source/modules/juce_cryptography/juce_cryptography.cpp', | |||
'source/modules/juce_data_structures/juce_data_structures.cpp', | |||
'source/modules/juce_dsp/juce_dsp.cpp', | |||
'source/modules/juce_events/juce_events.cpp', | |||
] | |||
else | |||
juce61_srcs = [ | |||
'source/modules/juce_audio_basics/juce_audio_basics.cpp', | |||
'source/modules/juce_audio_formats/juce_audio_formats.cpp', | |||
'source/modules/juce_audio_processors/juce_audio_processors.cpp', | |||
'source/modules/juce_audio_utils/juce_audio_utils.cpp', | |||
'source/modules/juce_core/juce_core.cpp', | |||
'source/modules/juce_cryptography/juce_cryptography.cpp', | |||
'source/modules/juce_data_structures/juce_data_structures.cpp', | |||
'source/modules/juce_dsp/juce_dsp.cpp', | |||
'source/modules/juce_events/juce_events.cpp', | |||
'source/modules/juce_graphics/juce_graphics.cpp', | |||
'source/modules/juce_gui_basics/juce_gui_basics.cpp', | |||
'source/modules/juce_gui_extra/juce_gui_extra.cpp', | |||
'source/modules/juce_opengl/juce_opengl.cpp', | |||
] | |||
endif | |||
juce61_devices_srcs = [ | |||
'source/modules/juce_audio_devices/juce_audio_devices.cpp', | |||
] | |||
juce61_extra_cpp_args = [ | |||
'-std=gnu++14', | |||
'-Wno-non-virtual-dtor', | |||
] | |||
if os_windows | |||
juce61_extra_cpp_args += [ | |||
'-D_NATIVE_WCHAR_T_DEFINED', | |||
'-D__wchar_t=wchar_t', | |||
'-Wno-unknown-pragmas', | |||
] | |||
if host_machine.cpu() == 'x86' | |||
juce61_extra_cpp_args += [ | |||
'-mpreferred-stack-boundary=2', | |||
] | |||
endif | |||
endif | |||
lib_juce6 = static_library('juce61', | |||
sources: juce61_srcs, | |||
include_directories: [ | |||
include_directories('.'), | |||
include_directories('source'), | |||
include_directories('source/modules'), | |||
include_directories('../juced/source/dependancies/ladspa_sdk/src'), | |||
], | |||
cpp_args: build_flags_cpp + juce61_extra_cpp_args, | |||
dependencies: dependencies, | |||
pic: true, | |||
install: false, | |||
) | |||
lib_juce61_device = static_library('juce61-devices', | |||
sources: juce61_devices_srcs, | |||
include_directories: [ | |||
include_directories('.'), | |||
include_directories('source'), | |||
include_directories('source/modules'), | |||
], | |||
cpp_args: build_flags_cpp + juce61_extra_cpp_args + ['-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1'], | |||
dependencies: dependencies_devices, | |||
pic: true, | |||
install: false, | |||
) | |||
############################################################################### |
@@ -0,0 +1,14 @@ | |||
diff --git a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp | |||
index c6b87f32c..eeed76ba0 100644 | |||
--- a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp | |||
+++ b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp | |||
@@ -232,8 +232,8 @@ void AudioDeviceManager::createAudioDeviceTypes (OwnedArray<AudioIODeviceType>& | |||
addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_CoreAudio()); | |||
addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_iOSAudio()); | |||
addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_Bela()); | |||
- addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_ALSA()); | |||
addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_JACK()); | |||
+ addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_ALSA()); | |||
addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_Oboe()); | |||
addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_OpenSLES()); | |||
addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_Android()); |
@@ -0,0 +1,99 @@ | |||
diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp | |||
index 54a7cb635..d475d93e2 100644 | |||
--- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp | |||
+++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp | |||
@@ -61,7 +61,7 @@ JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996 4100) | |||
#define PRAGMA_ALIGN_SUPPORTED 1 | |||
#endif | |||
-#if ! JUCE_MSVC | |||
+#if ! JUCE_WINDOWS | |||
#define __cdecl | |||
#endif | |||
diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp | |||
index 91e82f087..211246aed 100644 | |||
--- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp | |||
+++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp | |||
@@ -64,9 +64,6 @@ JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4355) | |||
#ifndef WM_APPCOMMAND | |||
#define WM_APPCOMMAND 0x0319 | |||
#endif | |||
- | |||
- extern "C" void _fpreset(); | |||
- extern "C" void _clearfp(); | |||
#elif ! JUCE_WINDOWS | |||
static void _fpreset() {} | |||
static void _clearfp() {} | |||
diff --git a/modules/juce_gui_basics/juce_gui_basics.cpp b/modules/juce_gui_basics/juce_gui_basics.cpp | |||
index 644774631..fed316924 100644 | |||
--- a/modules/juce_gui_basics/juce_gui_basics.cpp | |||
+++ b/modules/juce_gui_basics/juce_gui_basics.cpp | |||
@@ -67,9 +67,12 @@ | |||
#include <vfw.h> | |||
#include <commdlg.h> | |||
#include <commctrl.h> | |||
- #include <UIAutomation.h> | |||
#include <sapi.h> | |||
+ #if JUCE_MSVC | |||
+ #include <UIAutomation.h> | |||
+ #endif | |||
+ | |||
#if JUCE_WEB_BROWSER | |||
#include <exdisp.h> | |||
#include <exdispid.h> | |||
@@ -308,13 +311,15 @@ JUCE_END_IGNORE_WARNINGS_GCC_LIKE | |||
#include "native/juce_mac_MouseCursor.mm" | |||
#elif JUCE_WINDOWS | |||
- #include "native/accessibility/juce_win32_ComInterfaces.h" | |||
- #include "native/accessibility/juce_win32_WindowsUIAWrapper.h" | |||
- #include "native/accessibility/juce_win32_AccessibilityElement.h" | |||
- #include "native/accessibility/juce_win32_UIAHelpers.h" | |||
- #include "native/accessibility/juce_win32_UIAProviders.h" | |||
- #include "native/accessibility/juce_win32_AccessibilityElement.cpp" | |||
- #include "native/accessibility/juce_win32_Accessibility.cpp" | |||
+ #if JUCE_MSVC | |||
+ #include "native/accessibility/juce_win32_ComInterfaces.h" | |||
+ #include "native/accessibility/juce_win32_WindowsUIAWrapper.h" | |||
+ #include "native/accessibility/juce_win32_AccessibilityElement.h" | |||
+ #include "native/accessibility/juce_win32_UIAHelpers.h" | |||
+ #include "native/accessibility/juce_win32_UIAProviders.h" | |||
+ #include "native/accessibility/juce_win32_AccessibilityElement.cpp" | |||
+ #include "native/accessibility/juce_win32_Accessibility.cpp" | |||
+ #endif | |||
#include "native/juce_win32_Windowing.cpp" | |||
#include "native/juce_win32_DragAndDrop.cpp" | |||
#include "native/juce_win32_FileChooser.cpp" | |||
diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp | |||
index 4ffc09d9a..e5886ca31 100644 | |||
--- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp | |||
+++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp | |||
@@ -1519,8 +1519,10 @@ public: | |||
// do this first to avoid messages arriving for this window before it's destroyed | |||
JuceWindowIdentifier::setAsJUCEWindow (hwnd, false); | |||
+ #if JUCE_MSVC | |||
if (isAccessibilityActive) | |||
WindowsAccessibility::revokeUIAMapEntriesForWindow (hwnd); | |||
+ #endif | |||
shadower = nullptr; | |||
currentTouches.deleteAllTouchesForPeer (this); | |||
@@ -4052,6 +4054,7 @@ private: | |||
case WM_GETDLGCODE: | |||
return DLGC_WANTALLKEYS; | |||
+ #if JUCE_MSVC | |||
case WM_GETOBJECT: | |||
{ | |||
if (static_cast<long> (lParam) == WindowsAccessibility::getUiaRootObjectId()) | |||
@@ -4070,6 +4073,7 @@ private: | |||
break; | |||
} | |||
+ #endif | |||
default: | |||
break; | |||
} |
@@ -0,0 +1,13 @@ | |||
diff --git a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp | |||
index f06e0781d..4914d918c 100644 | |||
--- a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp | |||
+++ b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp | |||
@@ -25,7 +25,7 @@ | |||
#if JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD) | |||
-#include <ladspa.h> | |||
+#include "ladspa.h" | |||
namespace juce | |||
{ |
@@ -0,0 +1,127 @@ | |||
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp | |||
index 038fbb5d7..d450e9a5a 100644 | |||
--- a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp | |||
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp | |||
@@ -40,8 +40,6 @@ AudioProcessorEditor::AudioProcessorEditor (AudioProcessor* p) noexcept : proce | |||
AudioProcessorEditor::~AudioProcessorEditor() | |||
{ | |||
- splashScreen.deleteAndZero(); | |||
- | |||
// if this fails, then the wrapper hasn't called editorBeingDeleted() on the | |||
// filter for some reason.. | |||
jassert (processor.getActiveEditor() != this); | |||
@@ -56,23 +54,6 @@ void AudioProcessorEditor::hostMIDIControllerIsAvailable (bool) { | |||
void AudioProcessorEditor::initialise() | |||
{ | |||
- /* | |||
- ========================================================================== | |||
- In accordance with the terms of the JUCE 6 End-Use License Agreement, the | |||
- JUCE Code in SECTION A cannot be removed, changed or otherwise rendered | |||
- ineffective unless you have a JUCE Indie or Pro license, or are using | |||
- JUCE under the GPL v3 license. | |||
- | |||
- End User License Agreement: www.juce.com/juce-6-licence | |||
- ========================================================================== | |||
- */ | |||
- | |||
- // BEGIN SECTION A | |||
- | |||
- splashScreen = new JUCESplashScreen (*this); | |||
- | |||
- // END SECTION A | |||
- | |||
attachConstrainer (&defaultConstrainer); | |||
resizeListener.reset (new AudioProcessorEditorListener (*this)); | |||
addComponentListener (resizeListener.get()); | |||
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h | |||
index 896d018c7..88e342e97 100644 | |||
--- a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h | |||
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h | |||
@@ -235,7 +235,6 @@ private: | |||
ComponentBoundsConstrainer defaultConstrainer; | |||
ComponentBoundsConstrainer* constrainer = nullptr; | |||
AudioProcessorEditorHostContext* hostContext = nullptr; | |||
- Component::SafePointer<Component> splashScreen; | |||
AffineTransform hostScaleTransform; | |||
JUCE_DECLARE_NON_COPYABLE (AudioProcessorEditor) | |||
diff --git a/modules/juce_gui_basics/juce_gui_basics.cpp b/modules/juce_gui_basics/juce_gui_basics.cpp | |||
index fed316924..2e0036430 100644 | |||
--- a/modules/juce_gui_basics/juce_gui_basics.cpp | |||
+++ b/modules/juce_gui_basics/juce_gui_basics.cpp | |||
@@ -250,7 +250,6 @@ namespace juce | |||
#include "misc/juce_BubbleComponent.cpp" | |||
#include "misc/juce_DropShadower.cpp" | |||
#include "misc/juce_FocusOutline.cpp" | |||
-#include "misc/juce_JUCESplashScreen.cpp" | |||
#include "layout/juce_FlexBox.cpp" | |||
#include "layout/juce_GridItem.cpp" | |||
diff --git a/modules/juce_gui_basics/juce_gui_basics.h b/modules/juce_gui_basics/juce_gui_basics.h | |||
index 5eaf306fc..205dc36f6 100644 | |||
--- a/modules/juce_gui_basics/juce_gui_basics.h | |||
+++ b/modules/juce_gui_basics/juce_gui_basics.h | |||
@@ -262,7 +262,6 @@ namespace juce | |||
#include "buttons/juce_ToolbarButton.h" | |||
#include "misc/juce_DropShadower.h" | |||
#include "misc/juce_FocusOutline.h" | |||
-#include "misc/juce_JUCESplashScreen.h" | |||
#include "widgets/juce_TreeView.h" | |||
#include "windows/juce_TopLevelWindow.h" | |||
#include "windows/juce_MessageBoxOptions.h" | |||
diff --git a/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp b/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp | |||
index 437475c7e..74f8e709d 100644 | |||
--- a/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp | |||
+++ b/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp | |||
@@ -41,8 +41,6 @@ ResizableWindow::ResizableWindow (const String& name, Colour bkgnd, bool shouldA | |||
ResizableWindow::~ResizableWindow() | |||
{ | |||
- splashScreen.deleteAndZero(); | |||
- | |||
// Don't delete or remove the resizer components yourself! They're managed by the | |||
// ResizableWindow, and you should leave them alone! You may have deleted them | |||
// accidentally by careless use of deleteAllChildren()..? | |||
@@ -60,27 +58,6 @@ ResizableWindow::~ResizableWindow() | |||
void ResizableWindow::initialise (const bool shouldAddToDesktop) | |||
{ | |||
- /* | |||
- ========================================================================== | |||
- | |||
- In accordance with the terms of the JUCE 6 End-Use License Agreement, the | |||
- JUCE Code in SECTION A cannot be removed, changed or otherwise rendered | |||
- ineffective unless you have a JUCE Indie or Pro license, or are using | |||
- JUCE under the GPL v3 license. | |||
- | |||
- End User License Agreement: www.juce.com/juce-6-licence | |||
- | |||
- ========================================================================== | |||
- */ | |||
- | |||
- // BEGIN SECTION A | |||
- | |||
- #if ! JucePlugin_Build_Standalone | |||
- splashScreen = new JUCESplashScreen (*this); | |||
- #endif | |||
- | |||
- // END SECTION A | |||
- | |||
defaultConstrainer.setMinimumOnscreenAmounts (0x10000, 16, 24, 16); | |||
lastNonFullScreenPos.setBounds (50, 50, 256, 256); | |||
diff --git a/modules/juce_gui_basics/windows/juce_ResizableWindow.h b/modules/juce_gui_basics/windows/juce_ResizableWindow.h | |||
index e185adde4..521331dff 100644 | |||
--- a/modules/juce_gui_basics/windows/juce_ResizableWindow.h | |||
+++ b/modules/juce_gui_basics/windows/juce_ResizableWindow.h | |||
@@ -391,7 +391,7 @@ protected: | |||
private: | |||
//============================================================================== | |||
- Component::SafePointer<Component> contentComponent, splashScreen; | |||
+ Component::SafePointer<Component> contentComponent; | |||
bool ownsContentComponent = false, resizeToFitContent = false, fullscreen = false, canDrag = true, dragStarted = false; | |||
ComponentDragger dragger; | |||
Rectangle<int> lastNonFullScreenPos; |
@@ -0,0 +1,46 @@ | |||
diff --git a/modules/juce_core/native/juce_posix_SharedCode.h b/modules/juce_core/native/juce_posix_SharedCode.h | |||
index dbf06043a..8bdfd4629 100644 | |||
--- a/modules/juce_core/native/juce_posix_SharedCode.h | |||
+++ b/modules/juce_core/native/juce_posix_SharedCode.h | |||
@@ -611,12 +611,39 @@ File juce_getExecutableFile() | |||
auto localSymbol = (void*) juce_getExecutableFile; | |||
dladdr (localSymbol, &exeInfo); | |||
- return CharPointer_UTF8 (exeInfo.dli_fname); | |||
+ | |||
+ const CharPointer_UTF8 filename (exeInfo.dli_fname); | |||
+ | |||
+ // if the filename is absolute simply return it | |||
+ if (File::isAbsolutePath (filename)) | |||
+ return filename; | |||
+ | |||
+ // if the filename is relative construct from CWD | |||
+ if (filename[0] == '.') | |||
+ return File::getCurrentWorkingDirectory().getChildFile (filename).getFullPathName(); | |||
+ | |||
+ // filename is abstract, look up in PATH | |||
+ if (const char* const envpath = ::getenv ("PATH")) | |||
+ { | |||
+ StringArray paths (StringArray::fromTokens (envpath, ":", "")); | |||
+ | |||
+ for (int i=paths.size(); --i>=0;) | |||
+ { | |||
+ const File filepath (File (paths[i]).getChildFile (filename)); | |||
+ | |||
+ if (filepath.existsAsFile()) | |||
+ return filepath.getFullPathName(); | |||
+ } | |||
+ } | |||
+ | |||
+ // if we reach this, we failed to find ourselves... | |||
+ jassertfalse; | |||
+ return filename; | |||
} | |||
}; | |||
static String filename = DLAddrReader::getFilename(); | |||
- return File::getCurrentWorkingDirectory().getChildFile (filename); | |||
+ return filename; | |||
} | |||
//============================================================================== |
@@ -0,0 +1,119 @@ | |||
diff --git a/modules/juce_core/native/juce_linux_Files.cpp b/modules/juce_core/native/juce_linux_Files.cpp | |||
index 22f989acf..e5dc06676 100644 | |||
--- a/modules/juce_core/native/juce_linux_Files.cpp | |||
+++ b/modules/juce_core/native/juce_linux_Files.cpp | |||
@@ -223,15 +223,21 @@ bool Process::openDocument (const String& fileName, const String& parameters) | |||
const char* const argv[] = { "/bin/sh", "-c", cmdString.toUTF8(), nullptr }; | |||
+#if JUCE_USE_VFORK | |||
+ const auto cpid = vfork(); | |||
+#else | |||
const auto cpid = fork(); | |||
+#endif | |||
if (cpid == 0) | |||
{ | |||
+#if ! JUCE_USE_VFORK | |||
setsid(); | |||
+#endif | |||
// Child process | |||
- execve (argv[0], (char**) argv, environ); | |||
- exit (0); | |||
+ if (execve (argv[0], (char**) argv, environ) < 0) | |||
+ _exit (0); | |||
} | |||
return cpid >= 0; | |||
diff --git a/modules/juce_core/native/juce_mac_Files.mm b/modules/juce_core/native/juce_mac_Files.mm | |||
index eff20c841..f67e7871a 100644 | |||
--- a/modules/juce_core/native/juce_mac_Files.mm | |||
+++ b/modules/juce_core/native/juce_mac_Files.mm | |||
@@ -92,23 +92,22 @@ namespace MacFileHelpers | |||
#else | |||
static bool launchExecutable (const String& pathAndArguments) | |||
{ | |||
- auto cpid = fork(); | |||
+ const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), nullptr }; | |||
+ | |||
+#if JUCE_USE_VFORK | |||
+ const auto cpid = vfork(); | |||
+#else | |||
+ const auto cpid = fork(); | |||
+#endif | |||
if (cpid == 0) | |||
{ | |||
- const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), nullptr }; | |||
- | |||
// Child process | |||
- if (execve (argv[0], (char**) argv, nullptr) < 0) | |||
- exit (0); | |||
- } | |||
- else | |||
- { | |||
- if (cpid < 0) | |||
- return false; | |||
+ if (execvp (argv[0], (char**) argv) < 0) | |||
+ _exit (0); | |||
} | |||
- return true; | |||
+ return cpid >= 0; | |||
} | |||
#endif | |||
} | |||
diff --git a/modules/juce_core/native/juce_posix_SharedCode.h b/modules/juce_core/native/juce_posix_SharedCode.h | |||
index 8bdfd4629..2e96f3b04 100644 | |||
--- a/modules/juce_core/native/juce_posix_SharedCode.h | |||
+++ b/modules/juce_core/native/juce_posix_SharedCode.h | |||
@@ -1125,7 +1125,18 @@ public: | |||
if (pipe (pipeHandles) == 0) | |||
{ | |||
- auto result = fork(); | |||
+ Array<char*> argv; | |||
+ for (auto& arg : arguments) | |||
+ if (arg.isNotEmpty()) | |||
+ argv.add (const_cast<char*> (arg.toRawUTF8())); | |||
+ | |||
+ argv.add (nullptr); | |||
+ | |||
+#if JUCE_USE_VFORK | |||
+ const pid_t result = vfork(); | |||
+#else | |||
+ const pid_t result = fork(); | |||
+#endif | |||
if (result < 0) | |||
{ | |||
@@ -1134,6 +1145,7 @@ public: | |||
} | |||
else if (result == 0) | |||
{ | |||
+#if ! JUCE_USE_VFORK | |||
// we're the child process.. | |||
close (pipeHandles[0]); // close the read handle | |||
@@ -1148,17 +1160,10 @@ public: | |||
dup2 (open ("/dev/null", O_WRONLY), STDERR_FILENO); | |||
close (pipeHandles[1]); | |||
+#endif | |||
- Array<char*> argv; | |||
- | |||
- for (auto& arg : arguments) | |||
- if (arg.isNotEmpty()) | |||
- argv.add (const_cast<char*> (arg.toRawUTF8())); | |||
- | |||
- argv.add (nullptr); | |||
- | |||
- execvp (exe.toRawUTF8(), argv.getRawDataPointer()); | |||
- _exit (-1); | |||
+ if (execvp (exe.toRawUTF8(), argv.getRawDataPointer()) < 0) | |||
+ _exit (-1); | |||
} | |||
else | |||
{ |
@@ -0,0 +1,61 @@ | |||
diff --git a/modules/juce_core/native/juce_posix_SharedCode.h b/modules/juce_core/native/juce_posix_SharedCode.h | |||
index 2e96f3b04..f4bb0b84f 100644 | |||
--- a/modules/juce_core/native/juce_posix_SharedCode.h | |||
+++ b/modules/juce_core/native/juce_posix_SharedCode.h | |||
@@ -1260,6 +1260,11 @@ public: | |||
return 0; | |||
} | |||
+ int getPID() const noexcept | |||
+ { | |||
+ return childPID; | |||
+ } | |||
+ | |||
int childPID = 0; | |||
int pipeHandle = 0; | |||
int exitCode = -1; | |||
diff --git a/modules/juce_core/native/juce_win32_Threads.cpp b/modules/juce_core/native/juce_win32_Threads.cpp | |||
index 1a4004353..5f64b9e72 100644 | |||
--- a/modules/juce_core/native/juce_win32_Threads.cpp | |||
+++ b/modules/juce_core/native/juce_win32_Threads.cpp | |||
@@ -487,6 +487,11 @@ public: | |||
return (uint32) exitCode; | |||
} | |||
+ int getPID() const noexcept | |||
+ { | |||
+ return 0; | |||
+ } | |||
+ | |||
bool ok; | |||
private: | |||
diff --git a/modules/juce_core/threads/juce_ChildProcess.cpp b/modules/juce_core/threads/juce_ChildProcess.cpp | |||
index 2e5f14330..ab36fbace 100644 | |||
--- a/modules/juce_core/threads/juce_ChildProcess.cpp | |||
+++ b/modules/juce_core/threads/juce_ChildProcess.cpp | |||
@@ -81,6 +81,11 @@ String ChildProcess::readAllProcessOutput() | |||
} | |||
+uint32 ChildProcess::getPID() const noexcept | |||
+{ | |||
+ return activeProcess != nullptr ? activeProcess->getPID() : 0; | |||
+} | |||
+ | |||
//============================================================================== | |||
//============================================================================== | |||
#if JUCE_UNIT_TESTS | |||
diff --git a/modules/juce_core/threads/juce_ChildProcess.h b/modules/juce_core/threads/juce_ChildProcess.h | |||
index 47a26281b..74dbb11ab 100644 | |||
--- a/modules/juce_core/threads/juce_ChildProcess.h | |||
+++ b/modules/juce_core/threads/juce_ChildProcess.h | |||
@@ -101,6 +101,8 @@ public: | |||
*/ | |||
bool kill(); | |||
+ uint32 getPID() const noexcept; | |||
+ | |||
private: | |||
//============================================================================== | |||
class ActiveProcess; |
@@ -0,0 +1,39 @@ | |||
diff --git a/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp b/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp | |||
index 283502159..a9fcce2b7 100644 | |||
--- a/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp | |||
+++ b/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp | |||
@@ -26,6 +26,7 @@ | |||
namespace juce | |||
{ | |||
+#if JUCE_MODAL_LOOPS_PERMITTED | |||
static bool exeIsAvailable (String executable) | |||
{ | |||
ChildProcess child; | |||
@@ -255,10 +256,11 @@ private: | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Native) | |||
}; | |||
+#endif | |||
bool FileChooser::isPlatformDialogAvailable() | |||
{ | |||
- #if JUCE_DISABLE_NATIVE_FILECHOOSERS | |||
+ #if JUCE_DISABLE_NATIVE_FILECHOOSERS || ! JUCE_MODAL_LOOPS_PERMITTED | |||
return false; | |||
#else | |||
static bool canUseNativeBox = exeIsAvailable ("zenity") || exeIsAvailable ("kdialog"); | |||
@@ -268,7 +270,13 @@ bool FileChooser::isPlatformDialogAvailable() | |||
std::shared_ptr<FileChooser::Pimpl> FileChooser::showPlatformDialog (FileChooser& owner, int flags, FilePreviewComponent*) | |||
{ | |||
+#if JUCE_MODAL_LOOPS_PERMITTED | |||
return std::make_shared<Native> (owner, flags); | |||
+#else | |||
+ ignoreUnused (owner); | |||
+ ignoreUnused (flags); | |||
+ return nullptr; | |||
+#endif | |||
} | |||
} // namespace juce |
@@ -0,0 +1,109 @@ | |||
diff --git a/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp b/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp | |||
index 0c7da61de..ca9ff3b90 100644 | |||
--- a/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp | |||
+++ b/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp | |||
@@ -842,7 +842,7 @@ void MainHostWindow::showAudioSettings() | |||
o.componentToCentreAround = this; | |||
o.dialogBackgroundColour = getLookAndFeel().findColour (ResizableWindow::backgroundColourId); | |||
o.escapeKeyTriggersCloseButton = true; | |||
- o.useNativeTitleBar = false; | |||
+ o.useNativeTitleBar = true; | |||
o.resizable = false; | |||
auto* w = o.create(); | |||
diff --git a/modules/juce_gui_basics/windows/juce_DialogWindow.cpp b/modules/juce_gui_basics/windows/juce_DialogWindow.cpp | |||
index 37067b2fe..f0ffad5d4 100644 | |||
--- a/modules/juce_gui_basics/windows/juce_DialogWindow.cpp | |||
+++ b/modules/juce_gui_basics/windows/juce_DialogWindow.cpp | |||
@@ -134,7 +134,8 @@ void DialogWindow::showDialog (const String& dialogTitle, | |||
Colour backgroundColour, | |||
const bool escapeKeyTriggersCloseButton, | |||
const bool resizable, | |||
- const bool useBottomRightCornerResizer) | |||
+ const bool useBottomRightCornerResizer, | |||
+ const bool useNativeTitleBar) | |||
{ | |||
LaunchOptions o; | |||
o.dialogTitle = dialogTitle; | |||
@@ -142,9 +143,9 @@ void DialogWindow::showDialog (const String& dialogTitle, | |||
o.componentToCentreAround = componentToCentreAround; | |||
o.dialogBackgroundColour = backgroundColour; | |||
o.escapeKeyTriggersCloseButton = escapeKeyTriggersCloseButton; | |||
- o.useNativeTitleBar = false; | |||
o.resizable = resizable; | |||
o.useBottomRightCornerResizer = useBottomRightCornerResizer; | |||
+ o.useNativeTitleBar = useNativeTitleBar; | |||
o.launchAsync(); | |||
} | |||
@@ -156,7 +157,8 @@ int DialogWindow::showModalDialog (const String& dialogTitle, | |||
Colour backgroundColour, | |||
const bool escapeKeyTriggersCloseButton, | |||
const bool resizable, | |||
- const bool useBottomRightCornerResizer) | |||
+ const bool useBottomRightCornerResizer, | |||
+ const bool useNativeTitleBar) | |||
{ | |||
LaunchOptions o; | |||
o.dialogTitle = dialogTitle; | |||
@@ -164,9 +166,9 @@ int DialogWindow::showModalDialog (const String& dialogTitle, | |||
o.componentToCentreAround = componentToCentreAround; | |||
o.dialogBackgroundColour = backgroundColour; | |||
o.escapeKeyTriggersCloseButton = escapeKeyTriggersCloseButton; | |||
- o.useNativeTitleBar = false; | |||
o.resizable = resizable; | |||
o.useBottomRightCornerResizer = useBottomRightCornerResizer; | |||
+ o.useNativeTitleBar = useNativeTitleBar; | |||
return o.runModal(); | |||
} | |||
diff --git a/modules/juce_gui_basics/windows/juce_DialogWindow.h b/modules/juce_gui_basics/windows/juce_DialogWindow.h | |||
index faf25900f..a7ed9734b 100644 | |||
--- a/modules/juce_gui_basics/windows/juce_DialogWindow.h | |||
+++ b/modules/juce_gui_basics/windows/juce_DialogWindow.h | |||
@@ -199,7 +199,8 @@ public: | |||
Colour backgroundColour, | |||
bool escapeKeyTriggersCloseButton, | |||
bool shouldBeResizable = false, | |||
- bool useBottomRightCornerResizer = false); | |||
+ bool useBottomRightCornerResizer = false, | |||
+ bool useNativeTitleBar = true); | |||
#if JUCE_MODAL_LOOPS_PERMITTED | |||
/** Easy way of quickly showing a dialog box containing a given component. | |||
@@ -245,7 +246,8 @@ public: | |||
Colour backgroundColour, | |||
bool escapeKeyTriggersCloseButton, | |||
bool shouldBeResizable = false, | |||
- bool useBottomRightCornerResizer = false); | |||
+ bool useBottomRightCornerResizer = false, | |||
+ bool useNativeTitleBar = true); | |||
#endif | |||
diff --git a/modules/juce_gui_basics/windows/juce_TopLevelWindow.h b/modules/juce_gui_basics/windows/juce_TopLevelWindow.h | |||
index 92ec8eca4..7bdca6698 100644 | |||
--- a/modules/juce_gui_basics/windows/juce_TopLevelWindow.h | |||
+++ b/modules/juce_gui_basics/windows/juce_TopLevelWindow.h | |||
@@ -154,7 +154,7 @@ protected: | |||
private: | |||
friend class TopLevelWindowManager; | |||
friend class ResizableWindow; | |||
- bool useDropShadow = true, useNativeTitleBar = false, isCurrentlyActive = false; | |||
+ bool useDropShadow = true, useNativeTitleBar = true, isCurrentlyActive = false; | |||
std::unique_ptr<DropShadower> shadower; | |||
std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override; | |||
diff --git a/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp b/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp | |||
index f3efdc347..82407343c 100644 | |||
--- a/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp | |||
+++ b/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp | |||
@@ -92,7 +92,7 @@ void PreferencesPanel::showInDialogBox (const String& dialogTitle, int dialogWid | |||
o.dialogTitle = dialogTitle; | |||
o.dialogBackgroundColour = backgroundColour; | |||
o.escapeKeyTriggersCloseButton = false; | |||
- o.useNativeTitleBar = false; | |||
+ o.useNativeTitleBar = true; | |||
o.resizable = false; | |||
o.launchAsync(); |
@@ -0,0 +1,23 @@ | |||
diff --git a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp | |||
index 2ea809908..ee9615b02 100644 | |||
--- a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp | |||
+++ b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp | |||
@@ -2939,10 +2939,14 @@ void XWindowSystem::setWindowType (::Window windowH, int styleFlags) const | |||
if (atoms.windowType != None) | |||
{ | |||
- auto hint = (styleFlags & ComponentPeer::windowIsTemporary) != 0 | |||
- || ((styleFlags & ComponentPeer::windowHasDropShadow) == 0 && Desktop::canUseSemiTransparentWindows()) | |||
- ? XWindowSystemUtilities::Atoms::getIfExists (display, "_NET_WM_WINDOW_TYPE_COMBO") | |||
- : XWindowSystemUtilities::Atoms::getIfExists (display, "_NET_WM_WINDOW_TYPE_NORMAL"); | |||
+ Atom hint = None; | |||
+ | |||
+ if (styleFlags & ComponentPeer::windowIsTemporary) | |||
+ hint = XWindowSystemUtilities::Atoms::getIfExists (display, "_NET_WM_WINDOW_TYPE_TOOLTIP"); | |||
+ else if ((styleFlags & ComponentPeer::windowHasDropShadow) == 0 && Desktop::canUseSemiTransparentWindows()) | |||
+ hint = XWindowSystemUtilities::Atoms::getIfExists (display, "_NET_WM_WINDOW_TYPE_COMBO"); | |||
+ else | |||
+ hint = XWindowSystemUtilities::Atoms::getIfExists (display, "_NET_WM_WINDOW_TYPE_NORMAL"); | |||
if (hint != None) | |||
xchangeProperty (windowH, atoms.windowType, XA_ATOM, 32, &hint, 1); |
@@ -0,0 +1,14 @@ | |||
diff --git a/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h b/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h | |||
index 1a56fcf22..5a433ac82 100644 | |||
--- a/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h | |||
+++ b/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h | |||
@@ -63,7 +63,9 @@ typedef AudioComponentInstance AudioUnit; | |||
} | |||
@endcode | |||
*/ | |||
+#ifndef _VESTIGE_H | |||
struct AEffect; | |||
+#endif | |||
//============================================================================== | |||
namespace juce |
@@ -0,0 +1,24 @@ | |||
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/modules/juce_audio_processors/processors/juce_AudioProcessor.h | |||
index d4ef6fb4a..1062b14f9 100644 | |||
--- a/modules/juce_audio_processors/processors/juce_AudioProcessor.h | |||
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.h | |||
@@ -1118,6 +1118,11 @@ public: | |||
/** This method is called when the layout of the audio processor changes. */ | |||
virtual void processorLayoutsChanged(); | |||
+ //============================================================================== | |||
+ /** LV2 specific calls, saving/restore as string. */ | |||
+ virtual String getStateInformationString () { return String(); } | |||
+ virtual void setStateInformationString (const String&) {} | |||
+ | |||
//============================================================================== | |||
/** Adds a listener that will be called when an aspect of this processor changes. */ | |||
virtual void addListener (AudioProcessorListener* newListener); | |||
@@ -1202,6 +1207,7 @@ public: | |||
wrapperType_AudioUnitv3, | |||
wrapperType_RTAS, | |||
wrapperType_AAX, | |||
+ wrapperType_LV2, | |||
wrapperType_Standalone, | |||
wrapperType_Unity | |||
}; |
@@ -0,0 +1,14 @@ | |||
diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp | |||
index d475d93e2..7c3cdf702 100644 | |||
--- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp | |||
+++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp | |||
@@ -252,9 +252,6 @@ public: | |||
// You must at least have some channels | |||
jassert (processor->isMidiEffect() || (maxNumInChannels > 0 || maxNumOutChannels > 0)); | |||
- if (processor->isMidiEffect()) | |||
- maxNumInChannels = maxNumOutChannels = 2; | |||
- | |||
#ifdef JucePlugin_PreferredChannelConfigurations | |||
processor->setPlayConfigDetails (maxNumInChannels, maxNumOutChannels, 44100.0, 1024); | |||
#endif |
@@ -0,0 +1,13 @@ | |||
diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp | |||
index 7c3cdf702..98cdd68a1 100644 | |||
--- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp | |||
+++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp | |||
@@ -1799,7 +1799,7 @@ private: | |||
pointer_sized_int handleGetPlugInName (VstOpCodeArguments args) | |||
{ | |||
- String (JucePlugin_Name).copyToUTF8 ((char*) args.ptr, 64 + 1); | |||
+ String (processor->getName()).copyToUTF8 ((char*) args.ptr, 64 + 1); | |||
return 1; | |||
} | |||
@@ -0,0 +1,304 @@ | |||
diff --git a/modules/juce_audio_processors/juce_audio_processors.cpp b/modules/juce_audio_processors/juce_audio_processors.cpp | |||
index 49c6e390e..6640a8aff 100644 | |||
--- a/modules/juce_audio_processors/juce_audio_processors.cpp | |||
+++ b/modules/juce_audio_processors/juce_audio_processors.cpp | |||
@@ -34,7 +34,9 @@ | |||
#define JUCE_CORE_INCLUDE_NATIVE_HEADERS 1 | |||
#define JUCE_CORE_INCLUDE_OBJC_HELPERS 1 | |||
-#define JUCE_GUI_BASICS_INCLUDE_XHEADERS 1 | |||
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
+ #define JUCE_GUI_BASICS_INCLUDE_XHEADERS 1 | |||
+#endif | |||
#define JUCE_GUI_BASICS_INCLUDE_SCOPED_THREAD_DPI_AWARENESS_SETTER 1 | |||
#define JUCE_GRAPHICS_INCLUDE_COREGRAPHICS_HELPERS 1 | |||
@@ -49,7 +51,7 @@ | |||
#endif | |||
#endif | |||
-#if (JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_VST3) && (JUCE_LINUX || JUCE_BSD) | |||
+#if (JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_VST3) && (JUCE_LINUX || JUCE_BSD) && ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
#include <X11/Xlib.h> | |||
#include <X11/Xutil.h> | |||
#include <sys/utsname.h> | |||
@@ -188,17 +190,21 @@ private: | |||
#include "format_types/juce_LegacyAudioParameter.cpp" | |||
#include "processors/juce_AudioProcessor.cpp" | |||
#include "processors/juce_AudioPluginInstance.cpp" | |||
-#include "processors/juce_AudioProcessorEditor.cpp" | |||
#include "processors/juce_AudioProcessorGraph.cpp" | |||
-#include "processors/juce_GenericAudioProcessorEditor.cpp" | |||
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
+ #include "processors/juce_AudioProcessorEditor.cpp" | |||
+ #include "processors/juce_GenericAudioProcessorEditor.cpp" | |||
+#endif | |||
#include "processors/juce_PluginDescription.cpp" | |||
#include "format_types/juce_LADSPAPluginFormat.cpp" | |||
#include "format_types/juce_VSTPluginFormat.cpp" | |||
#include "format_types/juce_VST3PluginFormat.cpp" | |||
#include "format_types/juce_AudioUnitPluginFormat.mm" | |||
-#include "scanning/juce_KnownPluginList.cpp" | |||
-#include "scanning/juce_PluginDirectoryScanner.cpp" | |||
-#include "scanning/juce_PluginListComponent.cpp" | |||
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
+ #include "scanning/juce_KnownPluginList.cpp" | |||
+ #include "scanning/juce_PluginDirectoryScanner.cpp" | |||
+ #include "scanning/juce_PluginListComponent.cpp" | |||
+#endif | |||
#include "processors/juce_AudioProcessorParameterGroup.cpp" | |||
#include "utilities/juce_AudioProcessorParameterWithID.cpp" | |||
#include "utilities/juce_RangedAudioParameter.cpp" | |||
@@ -206,6 +212,13 @@ private: | |||
#include "utilities/juce_AudioParameterInt.cpp" | |||
#include "utilities/juce_AudioParameterBool.cpp" | |||
#include "utilities/juce_AudioParameterChoice.cpp" | |||
-#include "utilities/juce_ParameterAttachments.cpp" | |||
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
+ #include "utilities/juce_ParameterAttachments.cpp" | |||
+#endif | |||
#include "utilities/juce_AudioProcessorValueTreeState.cpp" | |||
#include "utilities/juce_PluginHostType.cpp" | |||
+ | |||
+#if JUCE_AUDIOPROCESSOR_NO_GUI | |||
+// commonly used classes in DSP code | |||
+namespace juce { Colour::Colour(juce::uint32) noexcept {} } | |||
+#endif | |||
diff --git a/modules/juce_audio_processors/juce_audio_processors.h b/modules/juce_audio_processors/juce_audio_processors.h | |||
index 6e6b90e97..25dcf0f06 100644 | |||
--- a/modules/juce_audio_processors/juce_audio_processors.h | |||
+++ b/modules/juce_audio_processors/juce_audio_processors.h | |||
@@ -122,14 +122,18 @@ | |||
#include "processors/juce_AudioProcessorParameter.h" | |||
#include "processors/juce_HostedAudioProcessorParameter.h" | |||
#include "processors/juce_AudioProcessorEditorHostContext.h" | |||
-#include "processors/juce_AudioProcessorEditor.h" | |||
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
+ #include "processors/juce_AudioProcessorEditor.h" | |||
+#endif | |||
#include "processors/juce_AudioProcessorListener.h" | |||
#include "processors/juce_AudioProcessorParameterGroup.h" | |||
#include "processors/juce_AudioProcessor.h" | |||
#include "processors/juce_PluginDescription.h" | |||
#include "processors/juce_AudioPluginInstance.h" | |||
#include "processors/juce_AudioProcessorGraph.h" | |||
-#include "processors/juce_GenericAudioProcessorEditor.h" | |||
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
+ #include "processors/juce_GenericAudioProcessorEditor.h" | |||
+#endif | |||
#include "format/juce_AudioPluginFormat.h" | |||
#include "format/juce_AudioPluginFormatManager.h" | |||
#include "scanning/juce_KnownPluginList.h" | |||
@@ -146,6 +150,8 @@ | |||
#include "utilities/juce_AudioParameterInt.h" | |||
#include "utilities/juce_AudioParameterBool.h" | |||
#include "utilities/juce_AudioParameterChoice.h" | |||
-#include "utilities/juce_ParameterAttachments.h" | |||
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
+ #include "utilities/juce_ParameterAttachments.h" | |||
+#endif | |||
#include "utilities/juce_AudioProcessorValueTreeState.h" | |||
#include "utilities/juce_PluginHostType.h" | |||
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp | |||
index fbf91cb84..8c84aec59 100644 | |||
--- a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp | |||
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp | |||
@@ -50,12 +50,14 @@ AudioProcessor::AudioProcessor (const BusesProperties& ioConfig) | |||
AudioProcessor::~AudioProcessor() | |||
{ | |||
+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
{ | |||
const ScopedLock sl (activeEditorLock); | |||
// ooh, nasty - the editor should have been deleted before its AudioProcessor. | |||
jassert (activeEditor == nullptr); | |||
} | |||
+ #endif | |||
#if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING | |||
// This will fail if you've called beginParameterChangeGesture() for one | |||
@@ -865,6 +867,7 @@ void AudioProcessor::audioIOChanged (bool busNumberChanged, bool channelNumChang | |||
processorLayoutsChanged(); | |||
} | |||
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
//============================================================================== | |||
void AudioProcessor::editorBeingDeleted (AudioProcessorEditor* const editor) noexcept | |||
{ | |||
@@ -901,6 +904,7 @@ AudioProcessorEditor* AudioProcessor::createEditorIfNeeded() | |||
return ed; | |||
} | |||
+#endif | |||
//============================================================================== | |||
void AudioProcessor::getCurrentProgramStateInformation (juce::MemoryBlock& destData) | |||
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/modules/juce_audio_processors/processors/juce_AudioProcessor.h | |||
index 1062b14f9..120e5571e 100644 | |||
--- a/modules/juce_audio_processors/processors/juce_AudioProcessor.h | |||
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.h | |||
@@ -928,6 +928,7 @@ public: | |||
*/ | |||
virtual void setNonRealtime (bool isNonRealtime) noexcept; | |||
+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
//============================================================================== | |||
/** Creates the processor's GUI. | |||
@@ -977,6 +978,7 @@ public: | |||
This may call createEditor() internally to create the component. | |||
*/ | |||
AudioProcessorEditor* createEditorIfNeeded(); | |||
+ #endif | |||
//============================================================================== | |||
/** Returns the default number of steps for a parameter. | |||
@@ -1193,9 +1195,11 @@ public: | |||
virtual CurveData getResponseCurve (CurveData::Type /*curveType*/) const { return {}; } | |||
+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
//============================================================================== | |||
/** Not for public use - this is called before deleting an editor component. */ | |||
void editorBeingDeleted (AudioProcessorEditor*) noexcept; | |||
+ #endif | |||
/** Flags to indicate the type of plugin context in which a processor is being used. */ | |||
enum WrapperType | |||
@@ -1226,7 +1230,9 @@ public: | |||
struct TrackProperties | |||
{ | |||
String name; // The name of the track - this will be empty if the track name is not known | |||
+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
Colour colour; // The colour of the track - this will be transparentBlack if the colour is not known | |||
+ #endif | |||
// other properties may be added in the future | |||
}; | |||
@@ -1469,7 +1475,9 @@ private: | |||
//============================================================================== | |||
Array<AudioProcessorListener*> listeners; | |||
+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
Component::SafePointer<AudioProcessorEditor> activeEditor; | |||
+ #endif | |||
double currentSampleRate = 0; | |||
int blockSize = 0, latencySamples = 0; | |||
bool suspended = false; | |||
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp | |||
index f9999c802..2e114a4ad 100644 | |||
--- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp | |||
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp | |||
@@ -1557,8 +1557,10 @@ bool AudioProcessorGraph::AudioGraphIOProcessor::producesMidi() const | |||
bool AudioProcessorGraph::AudioGraphIOProcessor::isInput() const noexcept { return type == audioInputNode || type == midiInputNode; } | |||
bool AudioProcessorGraph::AudioGraphIOProcessor::isOutput() const noexcept { return type == audioOutputNode || type == midiOutputNode; } | |||
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
bool AudioProcessorGraph::AudioGraphIOProcessor::hasEditor() const { return false; } | |||
AudioProcessorEditor* AudioProcessorGraph::AudioGraphIOProcessor::createEditor() { return nullptr; } | |||
+#endif | |||
int AudioProcessorGraph::AudioGraphIOProcessor::getNumPrograms() { return 0; } | |||
int AudioProcessorGraph::AudioGraphIOProcessor::getCurrentProgram() { return 0; } | |||
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h | |||
index 7b6ab003a..795154b7e 100644 | |||
--- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h | |||
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h | |||
@@ -357,8 +357,10 @@ public: | |||
bool acceptsMidi() const override; | |||
bool producesMidi() const override; | |||
+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
bool hasEditor() const override; | |||
AudioProcessorEditor* createEditor() override; | |||
+ #endif | |||
int getNumPrograms() override; | |||
int getCurrentProgram() override; | |||
@@ -394,8 +396,10 @@ public: | |||
bool acceptsMidi() const override; | |||
bool producesMidi() const override; | |||
+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
bool hasEditor() const override { return false; } | |||
AudioProcessorEditor* createEditor() override { return nullptr; } | |||
+ #endif | |||
int getNumPrograms() override { return 0; } | |||
int getCurrentProgram() override { return 0; } | |||
void setCurrentProgram (int) override { } | |||
diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp | |||
index bf4b55026..a131040a7 100644 | |||
--- a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp | |||
+++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp | |||
@@ -484,6 +484,7 @@ void AudioProcessorValueTreeState::timerCallback() | |||
} | |||
//============================================================================== | |||
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
template <typename Attachment, typename Control> | |||
std::unique_ptr<Attachment> makeAttachment (const AudioProcessorValueTreeState& stateToUse, | |||
const String& parameterID, | |||
@@ -516,6 +517,7 @@ AudioProcessorValueTreeState::ButtonAttachment::ButtonAttachment (AudioProcessor | |||
: attachment (makeAttachment<ButtonParameterAttachment> (stateToUse, parameterID, button)) | |||
{ | |||
} | |||
+#endif | |||
//============================================================================== | |||
//============================================================================== | |||
diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h | |||
index e1125680f..fdd1b6c98 100644 | |||
--- a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h | |||
+++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h | |||
@@ -431,6 +431,7 @@ public: | |||
friend class AudioProcessorValueTreeState::ParameterAdapter; | |||
}; | |||
+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
//============================================================================== | |||
/** An object of this class maintains a connection between a Slider and a parameter | |||
in an AudioProcessorValueTreeState. | |||
@@ -498,6 +499,7 @@ public: | |||
std::unique_ptr<ButtonParameterAttachment> attachment; | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ButtonAttachment) | |||
}; | |||
+ #endif | |||
private: | |||
//============================================================================== | |||
diff --git a/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp b/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp | |||
index 6f38cb8ca..6d40cbdd8 100644 | |||
--- a/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp | |||
+++ b/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp | |||
@@ -70,6 +70,7 @@ bool PluginHostType::isInAAXAudioSuite (AudioProcessor& processor) | |||
return false; | |||
} | |||
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
Image PluginHostType::getHostIcon (int size) const | |||
{ | |||
ignoreUnused (size); | |||
@@ -86,6 +87,7 @@ Image PluginHostType::getHostIcon (int size) const | |||
return Image(); | |||
} | |||
+#endif | |||
const char* PluginHostType::getHostDescription() const noexcept | |||
{ | |||
diff --git a/modules/juce_audio_processors/utilities/juce_PluginHostType.h b/modules/juce_audio_processors/utilities/juce_PluginHostType.h | |||
index a11bc52d5..2e2acb3b2 100644 | |||
--- a/modules/juce_audio_processors/utilities/juce_PluginHostType.h | |||
+++ b/modules/juce_audio_processors/utilities/juce_PluginHostType.h | |||
@@ -207,8 +207,10 @@ public: | |||
bool isInterAppAudioConnected() const; | |||
/** Switches to the host application when Inter-App Audio is used on iOS. */ | |||
void switchToHostApplication() const; | |||
+ #if ! JUCE_AUDIOPROCESSOR_NO_GUI | |||
/** Gets the host app's icon when Inter-App Audio is used on iOS. */ | |||
Image getHostIcon (int size) const; | |||
+ #endif | |||
//============================================================================== | |||
/** Returns the complete absolute path of the host application executable. */ |
@@ -0,0 +1,34 @@ | |||
diff --git a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp | |||
index d00412b35..6cf86fa4c 100644 | |||
--- a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp | |||
+++ b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp | |||
@@ -166,6 +166,7 @@ private: | |||
void operator() (LPWSTR ptr) const noexcept { CoTaskMemFree (ptr); } | |||
}; | |||
+ #if JUCE_MSVC | |||
bool showDialog (IFileDialog& dialog, bool async) | |||
{ | |||
FILEOPENDIALOGOPTIONS flags = {}; | |||
@@ -383,6 +384,7 @@ private: | |||
return result; | |||
} | |||
+ #endif | |||
Array<URL> openDialogPreVista (bool async) | |||
{ | |||
@@ -499,11 +501,13 @@ private: | |||
const Remover remover (*this); | |||
+ #if JUCE_MSVC | |||
if (SystemStats::getOperatingSystemType() >= SystemStats::WinVista | |||
&& customComponent == nullptr) | |||
{ | |||
return openDialogVistaAndUp (async); | |||
} | |||
+ #endif | |||
return openDialogPreVista (async); | |||
} |
@@ -0,0 +1,20 @@ | |||
diff --git a/modules/juce_opengl/native/juce_OpenGLExtensions.h b/modules/juce_opengl/native/juce_OpenGLExtensions.h | |||
index 4f75ae5b7..bacc4b266 100644 | |||
--- a/modules/juce_opengl/native/juce_OpenGLExtensions.h | |||
+++ b/modules/juce_opengl/native/juce_OpenGLExtensions.h | |||
@@ -83,7 +83,14 @@ namespace juce | |||
X (glCheckFramebufferStatus) \ | |||
X (glFramebufferTexture2D) \ | |||
X (glFramebufferRenderbuffer) \ | |||
- X (glGetFramebufferAttachmentParameteriv) | |||
+ X (glGetFramebufferAttachmentParameteriv) \ | |||
+ X (glTransformFeedbackVaryings) \ | |||
+ X (glBeginTransformFeedback) \ | |||
+ X (glEndTransformFeedback) \ | |||
+ X (glBindBufferBase) \ | |||
+ X (glMapBufferRange) \ | |||
+ X (glUnmapBuffer) | |||
+ | |||
/** @internal This macro contains a list of GL extension functions that need to be dynamically loaded on Windows/Linux. | |||
@see OpenGLExtensionFunctions |
@@ -0,0 +1,91 @@ | |||
 | |||
JUCE is an open-source cross-platform C++ application framework for creating high quality | |||
desktop and mobile applications, including VST, VST3, AU, AUv3, RTAS and AAX audio plug-ins. | |||
JUCE can be easily integrated with existing projects via CMake, or can be used as a project | |||
generation tool via the [Projucer](https://juce.com/discover/projucer), which supports | |||
exporting projects for Xcode (macOS and iOS), Visual Studio, Android Studio, Code::Blocks | |||
and Linux Makefiles as well as containing a source code editor. | |||
## Getting Started | |||
The JUCE repository contains a [master](https://github.com/juce-framework/JUCE/tree/master) | |||
and [develop](https://github.com/juce-framework/JUCE/tree/develop) branch. The develop branch | |||
contains the latest bugfixes and features and is periodically merged into the master | |||
branch in stable [tagged releases](https://github.com/juce-framework/JUCE/releases) | |||
(the latest release containing pre-built binaries can be also downloaded from the | |||
[JUCE website](https://juce.com/get-juce)). | |||
JUCE projects can be managed with either the Projucer (JUCE's own project-configuration | |||
tool) or with CMake. | |||
### The Projucer | |||
The repository doesn't contain a pre-built Projucer so you will need to build it | |||
for your platform - Xcode, Visual Studio and Linux Makefile projects are located in | |||
[extras/Projucer/Builds](/extras/Projucer/Builds) | |||
(the minimum system requirements are listed in the __System Requirements__ section below). | |||
The Projucer can then be used to create new JUCE projects, view tutorials and run examples. | |||
It is also possible to include the JUCE modules source code in an existing project directly, | |||
or build them into a static or dynamic library which can be linked into a project. | |||
For further help getting started, please refer to the JUCE | |||
[documentation](https://juce.com/learn/documentation) and | |||
[tutorials](https://juce.com/learn/tutorials). | |||
### CMake | |||
Version 3.15 or higher is required. To use CMake, you will need to install it, | |||
either from your system package manager or from the [official download | |||
page](https://cmake.org/download/). For comprehensive documentation on JUCE's | |||
CMake API, see the [JUCE CMake documentation](/docs/CMake%20API.md). For | |||
examples which may be useful as starting points for new CMake projects, see the | |||
[CMake examples directory](/examples/CMake). | |||
#### Building Examples | |||
To use CMake to build the examples and extras bundled with JUCE, simply clone | |||
JUCE and then run the following commands, replacing "DemoRunner" with the name | |||
of the target you wish to build. | |||
cd /path/to/JUCE | |||
cmake . -B cmake-build -DJUCE_BUILD_EXAMPLES=ON -DJUCE_BUILD_EXTRAS=ON | |||
cmake --build cmake-build --target DemoRunner | |||
## Minimum System Requirements | |||
#### Building JUCE Projects | |||
- __macOS/iOS__: Xcode 9.2 (macOS 10.12.6) | |||
- __Windows__: Windows 8.1 and Visual Studio 2015 Update 3 64-bit | |||
- __Linux__: g++ 5.0 or Clang 3.4 (for a full list of dependencies, see | |||
[here](/docs/Linux%20Dependencies.md)). | |||
- __Android__: Android Studio on Windows, macOS or Linux | |||
#### Deployment Targets | |||
- __macOS__: macOS 10.7 | |||
- __Windows__: Windows Vista | |||
- __Linux__: Mainstream Linux distributions | |||
- __iOS__: iOS 9.0 | |||
- __Android__: Jelly Bean (API 16) | |||
## Contributing | |||
Please see our [contribution guidelines](.github/contributing.md). | |||
## License | |||
The core JUCE modules (juce_audio_basics, juce_audio_devices, juce_core and juce_events) | |||
are permissively licensed under the terms of the | |||
[ISC license](http://www.isc.org/downloads/software-support-policy/isc-license/). | |||
Other modules are covered by a | |||
[GPL/Commercial license](https://www.gnu.org/licenses/gpl-3.0.en.html). | |||
There are multiple commercial licensing tiers for JUCE, with different terms for each: | |||
- JUCE Personal (developers or startup businesses with revenue under 50K USD) - free | |||
- JUCE Indie (small businesses with revenue under 500K USD) - $40/month | |||
- JUCE Pro (no revenue limit) - $130/month | |||
- JUCE Educational (no revenue limit) - free for bona fide educational institutes | |||
For full terms see [LICENSE.md](LICENSE.md). |
@@ -0,0 +1,276 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library. | |||
Copyright (c) 2020 - Raw Material Software Limited | |||
JUCE is an open source library subject to commercial or open-source | |||
licensing. | |||
The code included in this file is provided under the terms of the ISC license | |||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission | |||
To use, copy, modify, and/or distribute this software for any purpose with or | |||
without fee is hereby granted provided that the above copyright notice and | |||
this permission notice appear in all copies. | |||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
DISCLAIMED. | |||
============================================================================== | |||
*/ | |||
namespace juce | |||
{ | |||
//============================================================================== | |||
/** | |||
A subclass of AudioPlayHead can supply information about the position and | |||
status of a moving play head during audio playback. | |||
One of these can be supplied to an AudioProcessor object so that it can find | |||
out about the position of the audio that it is rendering. | |||
@see AudioProcessor::setPlayHead, AudioProcessor::getPlayHead | |||
@tags{Audio} | |||
*/ | |||
class JUCE_API AudioPlayHead | |||
{ | |||
protected: | |||
//============================================================================== | |||
AudioPlayHead() = default; | |||
public: | |||
virtual ~AudioPlayHead() = default; | |||
//============================================================================== | |||
/** Frame rate types. */ | |||
enum FrameRateType | |||
{ | |||
fps23976 = 0, | |||
fps24 = 1, | |||
fps25 = 2, | |||
fps2997 = 3, | |||
fps30 = 4, | |||
fps2997drop = 5, | |||
fps30drop = 6, | |||
fps60 = 7, | |||
fps60drop = 8, | |||
fpsUnknown = 99 | |||
}; | |||
/** More descriptive frame rate type. */ | |||
class JUCE_API FrameRate | |||
{ | |||
public: | |||
/** Creates a frame rate with a base rate of 0. */ | |||
FrameRate() = default; | |||
/** Creates a FrameRate instance from a FrameRateType. */ | |||
FrameRate (FrameRateType type) : FrameRate (fromType (type)) {} | |||
/** Gets the FrameRateType that matches the state of this FrameRate. | |||
Returns fpsUnknown if this FrameRate cannot be represented by any of the | |||
other enum fields. | |||
*/ | |||
FrameRateType getType() const | |||
{ | |||
switch (base) | |||
{ | |||
case 24: return pulldown ? fps23976 : fps24; | |||
case 25: return fps25; | |||
case 30: return pulldown ? (drop ? fps2997drop : fps2997) | |||
: (drop ? fps30drop : fps30); | |||
case 60: return drop ? fps60drop : fps60; | |||
} | |||
return fpsUnknown; | |||
} | |||
/** Returns the plain rate, without taking pulldown into account. */ | |||
int getBaseRate() const { return base; } | |||
/** Returns true if drop-frame timecode is in use. */ | |||
bool isDrop() const { return drop; } | |||
/** Returns true if the effective framerate is actually equal to the base rate divided by 1.001 */ | |||
bool isPullDown() const { return pulldown; } | |||
/** Returns the actual rate described by this object, taking pulldown into account. */ | |||
double getEffectiveRate() const { return pulldown ? (double) base / 1.001 : (double) base; } | |||
/** Returns a copy of this object with the specified base rate. */ | |||
JUCE_NODISCARD FrameRate withBaseRate (int x) const { return with (&FrameRate::base, x); } | |||
/** Returns a copy of this object with drop frames enabled or disabled, as specified. */ | |||
JUCE_NODISCARD FrameRate withDrop (bool x = true) const { return with (&FrameRate::drop, x); } | |||
/** Returns a copy of this object with pulldown enabled or disabled, as specified. */ | |||
JUCE_NODISCARD FrameRate withPullDown (bool x = true) const { return with (&FrameRate::pulldown, x); } | |||
/** Returns true if this instance is equal to other. */ | |||
bool operator== (const FrameRate& other) const | |||
{ | |||
const auto tie = [] (const FrameRate& x) { return std::tie (x.base, x.drop, x.pulldown); }; | |||
return tie (*this) == tie (other); | |||
} | |||
/** Returns true if this instance is not equal to other. */ | |||
bool operator!= (const FrameRate& other) const { return ! (*this == other); } | |||
private: | |||
static FrameRate fromType (FrameRateType type) | |||
{ | |||
switch (type) | |||
{ | |||
case fps23976: return FrameRate().withBaseRate (24).withPullDown(); | |||
case fps24: return FrameRate().withBaseRate (24); | |||
case fps25: return FrameRate().withBaseRate (25); | |||
case fps2997: return FrameRate().withBaseRate (30).withPullDown(); | |||
case fps30: return FrameRate().withBaseRate (30); | |||
case fps2997drop: return FrameRate().withBaseRate (30).withDrop().withPullDown(); | |||
case fps30drop: return FrameRate().withBaseRate (30).withDrop(); | |||
case fps60: return FrameRate().withBaseRate (60); | |||
case fps60drop: return FrameRate().withBaseRate (60).withDrop(); | |||
case fpsUnknown: break; | |||
} | |||
return {}; | |||
} | |||
template <typename Member, typename Value> | |||
FrameRate with (Member&& member, Value&& value) const | |||
{ | |||
auto copy = *this; | |||
copy.*member = std::forward<Value> (value); | |||
return copy; | |||
} | |||
int base = 0; | |||
bool drop = false, pulldown = false; | |||
}; | |||
//============================================================================== | |||
/** This structure is filled-in by the AudioPlayHead::getCurrentPosition() method. | |||
*/ | |||
struct JUCE_API CurrentPositionInfo | |||
{ | |||
/** The tempo in BPM */ | |||
double bpm = 120.0; | |||
/** Time signature numerator, e.g. the 3 of a 3/4 time sig */ | |||
int timeSigNumerator = 4; | |||
/** Time signature denominator, e.g. the 4 of a 3/4 time sig */ | |||
int timeSigDenominator = 4; | |||
/** The current play position, in samples from the start of the timeline. */ | |||
int64 timeInSamples = 0; | |||
/** The current play position, in seconds from the start of the timeline. */ | |||
double timeInSeconds = 0; | |||
/** For timecode, the position of the start of the timeline, in seconds from 00:00:00:00. */ | |||
double editOriginTime = 0; | |||
/** The current play position, in units of quarter-notes. */ | |||
double ppqPosition = 0; | |||
/** The position of the start of the last bar, in units of quarter-notes. | |||
This is the time from the start of the timeline to the start of the current | |||
bar, in ppq units. | |||
Note - this value may be unavailable on some hosts, e.g. Pro-Tools. If | |||
it's not available, the value will be 0. | |||
*/ | |||
double ppqPositionOfLastBarStart = 0; | |||
/** The video frame rate, if applicable. */ | |||
FrameRate frameRate = FrameRateType::fps23976; | |||
/** True if the transport is currently playing. */ | |||
bool isPlaying = false; | |||
/** True if the transport is currently recording. | |||
(When isRecording is true, then isPlaying will also be true). | |||
*/ | |||
bool isRecording = false; | |||
/** The current cycle start position in units of quarter-notes. | |||
Note that not all hosts or plugin formats may provide this value. | |||
@see isLooping | |||
*/ | |||
double ppqLoopStart = 0; | |||
/** The current cycle end position in units of quarter-notes. | |||
Note that not all hosts or plugin formats may provide this value. | |||
@see isLooping | |||
*/ | |||
double ppqLoopEnd = 0; | |||
/** True if the transport is currently looping. */ | |||
bool isLooping = false; | |||
//============================================================================== | |||
bool operator== (const CurrentPositionInfo& other) const noexcept | |||
{ | |||
const auto tie = [] (const CurrentPositionInfo& i) | |||
{ | |||
return std::tie (i.timeInSamples, | |||
i.ppqPosition, | |||
i.editOriginTime, | |||
i.ppqPositionOfLastBarStart, | |||
i.frameRate, | |||
i.isPlaying, | |||
i.isRecording, | |||
i.bpm, | |||
i.timeSigNumerator, | |||
i.timeSigDenominator, | |||
i.ppqLoopStart, | |||
i.ppqLoopEnd, | |||
i.isLooping); | |||
}; | |||
return tie (*this) == tie (other); | |||
} | |||
bool operator!= (const CurrentPositionInfo& other) const noexcept | |||
{ | |||
return ! operator== (other); | |||
} | |||
void resetToDefault() | |||
{ | |||
*this = CurrentPositionInfo{}; | |||
} | |||
}; | |||
//============================================================================== | |||
/** Fills-in the given structure with details about the transport's | |||
position at the start of the current processing block. If this method returns | |||
false then the current play head position is not available and the given | |||
structure will be undefined. | |||