| @@ -1,12 +1,26 @@ | |||
| /* | |||
| ============================================================================== | |||
| Arpeggiator.cpp | |||
| Created: 23 Nov 2015 3:08:33pm | |||
| Author: Fabian Renn | |||
| This file is part of the JUCE library. | |||
| Copyright (c) 2015 - ROLI Ltd. | |||
| Permission is granted to use this software under the terms of either: | |||
| a) the GPL v2 (or any later version) | |||
| b) the Affero GPL v3 | |||
| Details of these licenses can be found at: www.gnu.org/licenses | |||
| JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
| A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
| ------------------------------------------------------------------------------ | |||
| To release a closed-source product which uses JUCE, commercial licenses are | |||
| available: visit www.juce.com for more information. | |||
| ============================================================================== | |||
| */ | |||
| */ | |||
| #include "../JuceLibraryCode/JuceHeader.h" | |||
| #include "../../GenericEditor.h" | |||
| @@ -1,9 +1,23 @@ | |||
| /* | |||
| ============================================================================== | |||
| GainProcessor.cpp | |||
| Created: 23 Nov 2015 3:08:33pm | |||
| Author: Fabian Renn | |||
| This file is part of the JUCE library. | |||
| Copyright (c) 2015 - ROLI Ltd. | |||
| Permission is granted to use this software under the terms of either: | |||
| a) the GPL v2 (or any later version) | |||
| b) the Affero GPL v3 | |||
| Details of these licenses can be found at: www.gnu.org/licenses | |||
| JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
| A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
| ------------------------------------------------------------------------------ | |||
| To release a closed-source product which uses JUCE, commercial licenses are | |||
| available: visit www.juce.com for more information. | |||
| ============================================================================== | |||
| */ | |||
| @@ -1,12 +1,26 @@ | |||
| /* | |||
| ============================================================================== | |||
| ============================================================================== | |||
| GenericEditor.h | |||
| Created: 23 Nov 2015 3:08:33pm | |||
| Author: Fabian Renn | |||
| This file is part of the JUCE library. | |||
| Copyright (c) 2015 - ROLI Ltd. | |||
| ============================================================================== | |||
| */ | |||
| Permission is granted to use this software under the terms of either: | |||
| a) the GPL v2 (or any later version) | |||
| b) the Affero GPL v3 | |||
| Details of these licenses can be found at: www.gnu.org/licenses | |||
| JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
| A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
| ------------------------------------------------------------------------------ | |||
| To release a closed-source product which uses JUCE, commercial licenses are | |||
| available: visit www.juce.com for more information. | |||
| ============================================================================== | |||
| */ | |||
| class GenericEditor : public AudioProcessorEditor, | |||
| public SliderListener, | |||
| @@ -1,9 +1,23 @@ | |||
| /* | |||
| ============================================================================== | |||
| MultiOutSynth.cpp | |||
| Created: 23 Nov 2015 3:08:33pm | |||
| Author: Fabian Renn | |||
| This file is part of the JUCE library. | |||
| Copyright (c) 2015 - ROLI Ltd. | |||
| Permission is granted to use this software under the terms of either: | |||
| a) the GPL v2 (or any later version) | |||
| b) the Affero GPL v3 | |||
| Details of these licenses can be found at: www.gnu.org/licenses | |||
| JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
| A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
| ------------------------------------------------------------------------------ | |||
| To release a closed-source product which uses JUCE, commercial licenses are | |||
| available: visit www.juce.com for more information. | |||
| ============================================================================== | |||
| */ | |||
| @@ -1,12 +1,26 @@ | |||
| /* | |||
| ============================================================================== | |||
| ============================================================================== | |||
| NoiseGate.cpp | |||
| Created: 23 Nov 2015 3:08:33pm | |||
| Author: Fabian Renn | |||
| This file is part of the JUCE library. | |||
| Copyright (c) 2015 - ROLI Ltd. | |||
| ============================================================================== | |||
| */ | |||
| Permission is granted to use this software under the terms of either: | |||
| a) the GPL v2 (or any later version) | |||
| b) the Affero GPL v3 | |||
| Details of these licenses can be found at: www.gnu.org/licenses | |||
| JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
| A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
| ------------------------------------------------------------------------------ | |||
| To release a closed-source product which uses JUCE, commercial licenses are | |||
| available: visit www.juce.com for more information. | |||
| ============================================================================== | |||
| */ | |||
| #include "../JuceLibraryCode/JuceHeader.h" | |||
| #include "../../GenericEditor.h" | |||
| @@ -1,9 +1,23 @@ | |||
| /* | |||
| ============================================================================== | |||
| Spatializer.cpp | |||
| Created: 23 Nov 2015 3:08:33pm | |||
| Author: Fabian Renn | |||
| This file is part of the JUCE library. | |||
| Copyright (c) 2015 - ROLI Ltd. | |||
| Permission is granted to use this software under the terms of either: | |||
| a) the GPL v2 (or any later version) | |||
| b) the Affero GPL v3 | |||
| Details of these licenses can be found at: www.gnu.org/licenses | |||
| JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
| A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
| ------------------------------------------------------------------------------ | |||
| To release a closed-source product which uses JUCE, commercial licenses are | |||
| available: visit www.juce.com for more information. | |||
| ============================================================================== | |||
| */ | |||
| @@ -0,0 +1,172 @@ | |||
| # Automatically generated makefile, created by the Introjucer | |||
| # Don't edit this file! Your changes will be overwritten when you re-save the Introjucer project! | |||
| # (this disables dependency generation if multiple architectures are set) | |||
| DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) | |||
| ifndef CONFIG | |||
| CONFIG=Debug | |||
| endif | |||
| ifeq ($(CONFIG),Debug) | |||
| BINDIR := build | |||
| LIBDIR := build | |||
| OBJDIR := build/intermediate/Debug | |||
| OUTDIR := build | |||
| ifeq ($(TARGET_ARCH),) | |||
| TARGET_ARCH := -march=native | |||
| endif | |||
| CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../../modules | |||
| CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -fPIC -O0 -Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion | |||
| CXXFLAGS += $(CFLAGS) -std=c++11 | |||
| LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -Wl,--no-undefined -shared -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt | |||
| TARGET := Surround.so | |||
| BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) | |||
| CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) | |||
| endif | |||
| ifeq ($(CONFIG),Release) | |||
| BINDIR := build | |||
| LIBDIR := build | |||
| OBJDIR := build/intermediate/Release | |||
| OUTDIR := build | |||
| ifeq ($(TARGET_ARCH),) | |||
| TARGET_ARCH := -march=native | |||
| endif | |||
| CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../../modules | |||
| CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -fPIC -O3 -Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion | |||
| CXXFLAGS += $(CFLAGS) -std=c++11 | |||
| LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -Wl,--no-undefined -shared -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt | |||
| TARGET := Surround.so | |||
| BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) | |||
| CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) | |||
| endif | |||
| OBJECTS := \ | |||
| $(OBJDIR)/SurroundProcessor_c7ed9c55.o \ | |||
| $(OBJDIR)/juce_audio_basics_78a7818f.o \ | |||
| $(OBJDIR)/juce_audio_devices_7278ae8d.o \ | |||
| $(OBJDIR)/juce_audio_formats_a0f9f82d.o \ | |||
| $(OBJDIR)/juce_audio_processors_38c55c47.o \ | |||
| $(OBJDIR)/juce_core_4ab0871.o \ | |||
| $(OBJDIR)/juce_cryptography_7a2c84cb.o \ | |||
| $(OBJDIR)/juce_data_structures_9bbaa16d.o \ | |||
| $(OBJDIR)/juce_events_4bb1d465.o \ | |||
| $(OBJDIR)/juce_graphics_8bdbf949.o \ | |||
| $(OBJDIR)/juce_gui_basics_dcbf9445.o \ | |||
| $(OBJDIR)/juce_gui_extra_2814130d.o \ | |||
| $(OBJDIR)/juce_opengl_bf9fc91.o \ | |||
| $(OBJDIR)/juce_PluginUtilities_c8a83799.o \ | |||
| $(OBJDIR)/juce_video_11f0932d.o \ | |||
| $(OBJDIR)/juce_VST_Wrapper_371bbba2.o \ | |||
| $(OBJDIR)/juce_VST3_Wrapper_e8b59460.o \ | |||
| .PHONY: clean | |||
| $(OUTDIR)/$(TARGET): $(OBJECTS) $(RESOURCES) | |||
| @echo Linking Surround | |||
| -@mkdir -p $(BINDIR) | |||
| -@mkdir -p $(LIBDIR) | |||
| -@mkdir -p $(OUTDIR) | |||
| @$(BLDCMD) | |||
| clean: | |||
| @echo Cleaning Surround | |||
| @$(CLEANCMD) | |||
| strip: | |||
| @echo Stripping Surround | |||
| -@strip --strip-unneeded $(OUTDIR)/$(TARGET) | |||
| $(OBJDIR)/SurroundProcessor_c7ed9c55.o: ../../Source/SurroundProcessor.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling SurroundProcessor.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_audio_basics_78a7818f.o: ../../../../../modules/juce_audio_basics/juce_audio_basics.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_audio_basics.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_audio_devices_7278ae8d.o: ../../../../../modules/juce_audio_devices/juce_audio_devices.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_audio_devices.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_audio_formats_a0f9f82d.o: ../../../../../modules/juce_audio_formats/juce_audio_formats.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_audio_formats.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_audio_processors_38c55c47.o: ../../../../../modules/juce_audio_processors/juce_audio_processors.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_audio_processors.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_core_4ab0871.o: ../../../../../modules/juce_core/juce_core.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_core.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_cryptography_7a2c84cb.o: ../../../../../modules/juce_cryptography/juce_cryptography.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_cryptography.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_data_structures_9bbaa16d.o: ../../../../../modules/juce_data_structures/juce_data_structures.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_data_structures.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_events_4bb1d465.o: ../../../../../modules/juce_events/juce_events.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_events.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_graphics_8bdbf949.o: ../../../../../modules/juce_graphics/juce_graphics.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_graphics.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_gui_basics_dcbf9445.o: ../../../../../modules/juce_gui_basics/juce_gui_basics.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_gui_basics.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_gui_extra_2814130d.o: ../../../../../modules/juce_gui_extra/juce_gui_extra.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_gui_extra.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_opengl_bf9fc91.o: ../../../../../modules/juce_opengl/juce_opengl.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_opengl.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_PluginUtilities_c8a83799.o: ../../../../../modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_PluginUtilities.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_video_11f0932d.o: ../../../../../modules/juce_video/juce_video.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_video.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_VST_Wrapper_371bbba2.o: ../../../../../modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_VST_Wrapper.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_VST3_Wrapper_e8b59460.o: ../../../../../modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_VST3_Wrapper.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| -include $(OBJECTS:%.o=%.d) | |||
| @@ -0,0 +1,46 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist> | |||
| <dict> | |||
| <key>CFBundleExecutable</key> | |||
| <string>${EXECUTABLE_NAME}</string> | |||
| <key>CFBundleIconFile</key> | |||
| <string></string> | |||
| <key>CFBundleIdentifier</key> | |||
| <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | |||
| <key>CFBundleName</key> | |||
| <string>Surround</string> | |||
| <key>CFBundlePackageType</key> | |||
| <string>TDMw</string> | |||
| <key>CFBundleSignature</key> | |||
| <string>PTul</string> | |||
| <key>CFBundleShortVersionString</key> | |||
| <string>1.0.0</string> | |||
| <key>CFBundleVersion</key> | |||
| <string>1.0.0</string> | |||
| <key>NSHumanReadableCopyright</key> | |||
| <string></string> | |||
| <key>NSHighResolutionCapable</key> | |||
| <true/> | |||
| <key>AudioComponents</key> | |||
| <array> | |||
| <dict> | |||
| <key>name</key> | |||
| <string>ROLI Ltd.: Surround</string> | |||
| <key>description</key> | |||
| <string>Surround</string> | |||
| <key>factoryFunction</key> | |||
| <string>SurroundAUFactory</string> | |||
| <key>manufacturer</key> | |||
| <string>ROLI</string> | |||
| <key>type</key> | |||
| <string>aumu</string> | |||
| <key>subtype</key> | |||
| <string>Srrd</string> | |||
| <key>version</key> | |||
| <integer>65536</integer> | |||
| </dict> | |||
| </array> | |||
| </dict> | |||
| </plist> | |||
| @@ -0,0 +1,19 @@ | |||
| Microsoft Visual Studio Solution File, Format Version 11.00 | |||
| # Visual Studio 2015 | |||
| Project("{F9FF67DA-4C83-1DEF-FCA5-8D74F96886D5}") = "Surround", "Surround.vcxproj", "{01DA4F69-1E8D-E195-1DB6-491234B0D5E3}" | |||
| EndProject | |||
| Global | |||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
| Debug|x64 = Debug|x64 | |||
| Release|x64 = Release|x64 | |||
| EndGlobalSection | |||
| GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
| {01DA4F69-1E8D-E195-1DB6-491234B0D5E3}.Debug|x64.ActiveCfg = Debug|x64 | |||
| {01DA4F69-1E8D-E195-1DB6-491234B0D5E3}.Debug|x64.Build.0 = Debug|x64 | |||
| {01DA4F69-1E8D-E195-1DB6-491234B0D5E3}.Release|x64.ActiveCfg = Release|x64 | |||
| {01DA4F69-1E8D-E195-1DB6-491234B0D5E3}.Release|x64.Build.0 = Release|x64 | |||
| EndGlobalSection | |||
| GlobalSection(SolutionProperties) = preSolution | |||
| HideSolutionNode = FALSE | |||
| EndGlobalSection | |||
| EndGlobal | |||
| @@ -0,0 +1,29 @@ | |||
| #ifdef JUCE_USER_DEFINED_RC_FILE | |||
| #include JUCE_USER_DEFINED_RC_FILE | |||
| #else | |||
| #undef WIN32_LEAN_AND_MEAN | |||
| #define WIN32_LEAN_AND_MEAN | |||
| #include <windows.h> | |||
| VS_VERSION_INFO VERSIONINFO | |||
| FILEVERSION 1,0,0,0 | |||
| BEGIN | |||
| BLOCK "StringFileInfo" | |||
| BEGIN | |||
| BLOCK "040904E4" | |||
| BEGIN | |||
| VALUE "FileDescription", "Surround\0" | |||
| VALUE "FileVersion", "1.0.0\0" | |||
| VALUE "ProductName", "Surround\0" | |||
| VALUE "ProductVersion", "1.0.0\0" | |||
| END | |||
| END | |||
| BLOCK "VarFileInfo" | |||
| BEGIN | |||
| VALUE "Translation", 0x409, 1252 | |||
| END | |||
| END | |||
| #endif | |||
| @@ -0,0 +1,334 @@ | |||
| /* | |||
| IMPORTANT! This file is auto-generated each time you save your | |||
| project - if you alter its contents, your changes may be overwritten! | |||
| There's a section below where you can add your own custom code safely, and the | |||
| Introjucer will preserve the contents of that block, but the best way to change | |||
| any of these definitions is by using the Introjucer's project settings. | |||
| Any commented-out settings will assume their default values. | |||
| */ | |||
| #ifndef __JUCE_APPCONFIG_S8Q71Q__ | |||
| #define __JUCE_APPCONFIG_S8Q71Q__ | |||
| //============================================================================== | |||
| // [BEGIN_USER_CODE_SECTION] | |||
| // (You can add your own code in this section, and the Introjucer will not overwrite it) | |||
| // [END_USER_CODE_SECTION] | |||
| //============================================================================== | |||
| #define JUCE_MODULE_AVAILABLE_juce_audio_basics 1 | |||
| #define JUCE_MODULE_AVAILABLE_juce_audio_devices 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_core 1 | |||
| #define JUCE_MODULE_AVAILABLE_juce_cryptography 1 | |||
| #define JUCE_MODULE_AVAILABLE_juce_data_structures 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_video 1 | |||
| //============================================================================== | |||
| #ifndef JUCE_STANDALONE_APPLICATION | |||
| #define JUCE_STANDALONE_APPLICATION 0 | |||
| #endif | |||
| //============================================================================== | |||
| // juce_audio_devices flags: | |||
| #ifndef JUCE_ASIO | |||
| //#define JUCE_ASIO | |||
| #endif | |||
| #ifndef JUCE_WASAPI | |||
| //#define JUCE_WASAPI | |||
| #endif | |||
| #ifndef JUCE_WASAPI_EXCLUSIVE | |||
| //#define JUCE_WASAPI_EXCLUSIVE | |||
| #endif | |||
| #ifndef JUCE_DIRECTSOUND | |||
| //#define JUCE_DIRECTSOUND | |||
| #endif | |||
| #ifndef JUCE_ALSA | |||
| //#define JUCE_ALSA | |||
| #endif | |||
| #ifndef JUCE_JACK | |||
| //#define JUCE_JACK | |||
| #endif | |||
| #ifndef JUCE_USE_ANDROID_OPENSLES | |||
| //#define JUCE_USE_ANDROID_OPENSLES | |||
| #endif | |||
| #ifndef JUCE_USE_CDREADER | |||
| //#define JUCE_USE_CDREADER | |||
| #endif | |||
| #ifndef JUCE_USE_CDBURNER | |||
| //#define JUCE_USE_CDBURNER | |||
| #endif | |||
| //============================================================================== | |||
| // juce_audio_formats flags: | |||
| #ifndef JUCE_USE_FLAC | |||
| //#define JUCE_USE_FLAC | |||
| #endif | |||
| #ifndef JUCE_USE_OGGVORBIS | |||
| //#define JUCE_USE_OGGVORBIS | |||
| #endif | |||
| #ifndef JUCE_USE_MP3AUDIOFORMAT | |||
| //#define JUCE_USE_MP3AUDIOFORMAT | |||
| #endif | |||
| #ifndef JUCE_USE_LAME_AUDIO_FORMAT | |||
| //#define JUCE_USE_LAME_AUDIO_FORMAT | |||
| #endif | |||
| #ifndef JUCE_USE_WINDOWS_MEDIA_FORMAT | |||
| //#define JUCE_USE_WINDOWS_MEDIA_FORMAT | |||
| #endif | |||
| //============================================================================== | |||
| // juce_audio_processors flags: | |||
| #ifndef JUCE_PLUGINHOST_VST | |||
| //#define JUCE_PLUGINHOST_VST | |||
| #endif | |||
| #ifndef JUCE_PLUGINHOST_VST3 | |||
| //#define JUCE_PLUGINHOST_VST3 | |||
| #endif | |||
| #ifndef JUCE_PLUGINHOST_AU | |||
| //#define JUCE_PLUGINHOST_AU | |||
| #endif | |||
| //============================================================================== | |||
| // juce_core flags: | |||
| #ifndef JUCE_FORCE_DEBUG | |||
| //#define JUCE_FORCE_DEBUG | |||
| #endif | |||
| #ifndef JUCE_LOG_ASSERTIONS | |||
| //#define JUCE_LOG_ASSERTIONS | |||
| #endif | |||
| #ifndef JUCE_CHECK_MEMORY_LEAKS | |||
| //#define JUCE_CHECK_MEMORY_LEAKS | |||
| #endif | |||
| #ifndef JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |||
| //#define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES | |||
| #endif | |||
| #ifndef JUCE_INCLUDE_ZLIB_CODE | |||
| //#define JUCE_INCLUDE_ZLIB_CODE | |||
| #endif | |||
| #ifndef JUCE_USE_CURL | |||
| //#define JUCE_USE_CURL | |||
| #endif | |||
| //============================================================================== | |||
| // juce_graphics flags: | |||
| #ifndef JUCE_USE_COREIMAGE_LOADER | |||
| //#define JUCE_USE_COREIMAGE_LOADER | |||
| #endif | |||
| #ifndef JUCE_USE_DIRECTWRITE | |||
| //#define JUCE_USE_DIRECTWRITE | |||
| #endif | |||
| //============================================================================== | |||
| // juce_gui_basics flags: | |||
| #ifndef JUCE_ENABLE_REPAINT_DEBUGGING | |||
| //#define JUCE_ENABLE_REPAINT_DEBUGGING | |||
| #endif | |||
| #ifndef JUCE_USE_XSHM | |||
| //#define JUCE_USE_XSHM | |||
| #endif | |||
| #ifndef JUCE_USE_XRENDER | |||
| //#define JUCE_USE_XRENDER | |||
| #endif | |||
| #ifndef JUCE_USE_XCURSOR | |||
| //#define JUCE_USE_XCURSOR | |||
| #endif | |||
| //============================================================================== | |||
| // juce_gui_extra flags: | |||
| #ifndef JUCE_WEB_BROWSER | |||
| //#define JUCE_WEB_BROWSER | |||
| #endif | |||
| #ifndef JUCE_ENABLE_LIVE_CONSTANT_EDITOR | |||
| //#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR | |||
| #endif | |||
| //============================================================================== | |||
| // juce_video flags: | |||
| #ifndef JUCE_DIRECTSHOW | |||
| //#define JUCE_DIRECTSHOW | |||
| #endif | |||
| #ifndef JUCE_MEDIAFOUNDATION | |||
| //#define JUCE_MEDIAFOUNDATION | |||
| #endif | |||
| #ifndef JUCE_QUICKTIME | |||
| #define JUCE_QUICKTIME 0 | |||
| #endif | |||
| #ifndef JUCE_USE_CAMERA | |||
| //#define JUCE_USE_CAMERA | |||
| #endif | |||
| //============================================================================== | |||
| // Audio plugin settings.. | |||
| #ifndef JucePlugin_Build_VST | |||
| #define JucePlugin_Build_VST 1 | |||
| #endif | |||
| #ifndef JucePlugin_Build_VST3 | |||
| #define JucePlugin_Build_VST3 1 | |||
| #endif | |||
| #ifndef JucePlugin_Build_AU | |||
| #define JucePlugin_Build_AU 1 | |||
| #endif | |||
| #ifndef JucePlugin_Build_RTAS | |||
| #define JucePlugin_Build_RTAS 0 | |||
| #endif | |||
| #ifndef JucePlugin_Build_AAX | |||
| #define JucePlugin_Build_AAX 1 | |||
| #endif | |||
| #ifndef JucePlugin_Name | |||
| #define JucePlugin_Name "Surround" | |||
| #endif | |||
| #ifndef JucePlugin_Desc | |||
| #define JucePlugin_Desc "Surround" | |||
| #endif | |||
| #ifndef JucePlugin_Manufacturer | |||
| #define JucePlugin_Manufacturer "ROLI Ltd." | |||
| #endif | |||
| #ifndef JucePlugin_ManufacturerWebsite | |||
| #define JucePlugin_ManufacturerWebsite "" | |||
| #endif | |||
| #ifndef JucePlugin_ManufacturerEmail | |||
| #define JucePlugin_ManufacturerEmail "" | |||
| #endif | |||
| #ifndef JucePlugin_ManufacturerCode | |||
| #define JucePlugin_ManufacturerCode 'ROLI' | |||
| #endif | |||
| #ifndef JucePlugin_PluginCode | |||
| #define JucePlugin_PluginCode 'Srrd' | |||
| #endif | |||
| #ifndef JucePlugin_IsSynth | |||
| #define JucePlugin_IsSynth 1 | |||
| #endif | |||
| #ifndef JucePlugin_WantsMidiInput | |||
| #define JucePlugin_WantsMidiInput 0 | |||
| #endif | |||
| #ifndef JucePlugin_ProducesMidiOutput | |||
| #define JucePlugin_ProducesMidiOutput 0 | |||
| #endif | |||
| #ifndef JucePlugin_IsMidiEffect | |||
| #define JucePlugin_IsMidiEffect 0 | |||
| #endif | |||
| #ifndef JucePlugin_SilenceInProducesSilenceOut | |||
| #define JucePlugin_SilenceInProducesSilenceOut 0 | |||
| #endif | |||
| #ifndef JucePlugin_EditorRequiresKeyboardFocus | |||
| #define JucePlugin_EditorRequiresKeyboardFocus 0 | |||
| #endif | |||
| #ifndef JucePlugin_Version | |||
| #define JucePlugin_Version 1.0.0 | |||
| #endif | |||
| #ifndef JucePlugin_VersionCode | |||
| #define JucePlugin_VersionCode 0x10000 | |||
| #endif | |||
| #ifndef JucePlugin_VersionString | |||
| #define JucePlugin_VersionString "1.0.0" | |||
| #endif | |||
| #ifndef JucePlugin_VSTUniqueID | |||
| #define JucePlugin_VSTUniqueID JucePlugin_PluginCode | |||
| #endif | |||
| #ifndef JucePlugin_VSTCategory | |||
| #define JucePlugin_VSTCategory kPlugCategSynth | |||
| #endif | |||
| #ifndef JucePlugin_AUMainType | |||
| #define JucePlugin_AUMainType kAudioUnitType_MusicDevice | |||
| #endif | |||
| #ifndef JucePlugin_AUSubType | |||
| #define JucePlugin_AUSubType JucePlugin_PluginCode | |||
| #endif | |||
| #ifndef JucePlugin_AUExportPrefix | |||
| #define JucePlugin_AUExportPrefix SurroundAU | |||
| #endif | |||
| #ifndef JucePlugin_AUExportPrefixQuoted | |||
| #define JucePlugin_AUExportPrefixQuoted "SurroundAU" | |||
| #endif | |||
| #ifndef JucePlugin_AUManufacturerCode | |||
| #define JucePlugin_AUManufacturerCode JucePlugin_ManufacturerCode | |||
| #endif | |||
| #ifndef JucePlugin_CFBundleIdentifier | |||
| #define JucePlugin_CFBundleIdentifier com.ROLI.Surround | |||
| #endif | |||
| #ifndef JucePlugin_RTASCategory | |||
| #define JucePlugin_RTASCategory ePlugInCategory_SWGenerators | |||
| #endif | |||
| #ifndef JucePlugin_RTASManufacturerCode | |||
| #define JucePlugin_RTASManufacturerCode JucePlugin_ManufacturerCode | |||
| #endif | |||
| #ifndef JucePlugin_RTASProductId | |||
| #define JucePlugin_RTASProductId JucePlugin_PluginCode | |||
| #endif | |||
| #ifndef JucePlugin_RTASDisableBypass | |||
| #define JucePlugin_RTASDisableBypass 0 | |||
| #endif | |||
| #ifndef JucePlugin_RTASDisableMultiMono | |||
| #define JucePlugin_RTASDisableMultiMono 0 | |||
| #endif | |||
| #ifndef JucePlugin_AAXIdentifier | |||
| #define JucePlugin_AAXIdentifier com.ROLI.Surround | |||
| #endif | |||
| #ifndef JucePlugin_AAXManufacturerCode | |||
| #define JucePlugin_AAXManufacturerCode JucePlugin_ManufacturerCode | |||
| #endif | |||
| #ifndef JucePlugin_AAXProductId | |||
| #define JucePlugin_AAXProductId JucePlugin_PluginCode | |||
| #endif | |||
| #ifndef JucePlugin_AAXCategory | |||
| #define JucePlugin_AAXCategory AAX_ePlugInCategory_Dynamics | |||
| #endif | |||
| #ifndef JucePlugin_AAXDisableBypass | |||
| #define JucePlugin_AAXDisableBypass 0 | |||
| #endif | |||
| #ifndef JucePlugin_AAXDisableMultiMono | |||
| #define JucePlugin_AAXDisableMultiMono 0 | |||
| #endif | |||
| #endif // __JUCE_APPCONFIG_S8Q71Q__ | |||
| @@ -0,0 +1,47 @@ | |||
| /* | |||
| IMPORTANT! This file is auto-generated each time you save your | |||
| project - if you alter its contents, your changes may be overwritten! | |||
| This is the header file that your files should include in order to get all the | |||
| JUCE library headers. You should avoid including the JUCE headers directly in | |||
| your own source files, because that wouldn't pick up the correct configuration | |||
| options for your app. | |||
| */ | |||
| #ifndef __APPHEADERFILE_S8Q71Q__ | |||
| #define __APPHEADERFILE_S8Q71Q__ | |||
| #include "AppConfig.h" | |||
| #include "modules/juce_audio_basics/juce_audio_basics.h" | |||
| #include "modules/juce_audio_devices/juce_audio_devices.h" | |||
| #include "modules/juce_audio_formats/juce_audio_formats.h" | |||
| #include "modules/juce_audio_plugin_client/juce_audio_plugin_client.h" | |||
| #include "modules/juce_audio_processors/juce_audio_processors.h" | |||
| #include "modules/juce_core/juce_core.h" | |||
| #include "modules/juce_cryptography/juce_cryptography.h" | |||
| #include "modules/juce_data_structures/juce_data_structures.h" | |||
| #include "modules/juce_events/juce_events.h" | |||
| #include "modules/juce_graphics/juce_graphics.h" | |||
| #include "modules/juce_gui_basics/juce_gui_basics.h" | |||
| #include "modules/juce_gui_extra/juce_gui_extra.h" | |||
| #include "modules/juce_opengl/juce_opengl.h" | |||
| #include "modules/juce_video/juce_video.h" | |||
| #if ! DONT_SET_USING_JUCE_NAMESPACE | |||
| // If your code uses a lot of JUCE classes, then this will obviously save you | |||
| // a lot of typing, but can be disabled by setting DONT_SET_USING_JUCE_NAMESPACE. | |||
| using namespace juce; | |||
| #endif | |||
| #if ! JUCE_DONT_DECLARE_PROJECTINFO | |||
| namespace ProjectInfo | |||
| { | |||
| const char* const projectName = "Surround"; | |||
| const char* const versionString = "1.0.0"; | |||
| const int versionNumber = 0x10000; | |||
| } | |||
| #endif | |||
| #endif // __APPHEADERFILE_S8Q71Q__ | |||
| @@ -0,0 +1,12 @@ | |||
| Important Note!! | |||
| ================ | |||
| The purpose of this folder is to contain files that are auto-generated by the Introjucer, | |||
| and ALL files in this folder will be mercilessly DELETED and completely re-written whenever | |||
| the Introjucer saves your project. | |||
| Therefore, it's a bad idea to make any manual changes to the files in here, or to | |||
| put any of your own files in here if you don't want to lose them. (Of course you may choose | |||
| to add the folder's contents to your version-control system so that you can re-merge your own | |||
| modifications after the Introjucer has saved its changes). | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_audio_basics/juce_audio_basics.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_audio_devices/juce_audio_devices.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_audio_formats/juce_audio_formats.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_audio_processors/juce_audio_processors.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_core/juce_core.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_cryptography/juce_cryptography.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_data_structures/juce_data_structures.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_events/juce_events.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_graphics/juce_graphics.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_gui_basics/juce_gui_basics.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_gui_extra/juce_gui_extra.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_opengl/juce_opengl.h" | |||
| @@ -0,0 +1,4 @@ | |||
| // This is an auto-generated file to redirect any included | |||
| // module headers to the correct external folder. | |||
| #include "../../../../../../modules/juce_video/juce_video.h" | |||
| @@ -0,0 +1,123 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE library. | |||
| Copyright (c) 2015 - ROLI Ltd. | |||
| Permission is granted to use this software under the terms of either: | |||
| a) the GPL v2 (or any later version) | |||
| b) the Affero GPL v3 | |||
| Details of these licenses can be found at: www.gnu.org/licenses | |||
| JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
| A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
| ------------------------------------------------------------------------------ | |||
| To release a closed-source product which uses JUCE, commercial licenses are | |||
| available: visit www.juce.com for more information. | |||
| ============================================================================== | |||
| */ | |||
| class ChannelClickListener | |||
| { | |||
| public: | |||
| virtual ~ChannelClickListener() {} | |||
| virtual void channelButtonClicked (int channelIndex) = 0; | |||
| }; | |||
| class SurroundEditor : public AudioProcessorEditor, | |||
| public ButtonListener, | |||
| private Timer | |||
| { | |||
| public: | |||
| SurroundEditor (AudioProcessor& parent) | |||
| : AudioProcessorEditor (parent), | |||
| currentChannelLayout (AudioChannelSet::disabled()), | |||
| noChannelsLabel ("noChannelsLabel", "Input disabled") | |||
| { | |||
| addAndMakeVisible (noChannelsLabel); | |||
| setSize (640, 64); | |||
| timerCallback(); | |||
| startTimer (500); | |||
| } | |||
| ~SurroundEditor() | |||
| { | |||
| } | |||
| void resized() override | |||
| { | |||
| Rectangle<int> r = getLocalBounds(); | |||
| noChannelsLabel.setBounds (r); | |||
| if (channelButtons.size() > 0) | |||
| { | |||
| const int buttonWidth = r.getWidth() / channelButtons.size(); | |||
| for (int i = 0; i < channelButtons.size(); ++i) | |||
| channelButtons[i]->setBounds (r.removeFromLeft (buttonWidth)); | |||
| } | |||
| } | |||
| void paint (Graphics& g) override | |||
| { | |||
| g.fillAll (Colours::white); | |||
| } | |||
| void buttonClicked (Button* btn) override | |||
| { | |||
| if (TextButton* textButton = dynamic_cast<TextButton*> (btn)) | |||
| { | |||
| const int channelIndex = channelButtons.indexOf (textButton); | |||
| if (ChannelClickListener* listener = dynamic_cast<ChannelClickListener*> (getAudioProcessor())) | |||
| listener->channelButtonClicked (channelIndex); | |||
| } | |||
| } | |||
| private: | |||
| void timerCallback() override | |||
| { | |||
| const AudioChannelSet& channelSet = getAudioProcessor()->busArrangement.outputBuses.getReference (0).channels; | |||
| if (channelSet != currentChannelLayout) | |||
| { | |||
| currentChannelLayout = channelSet; | |||
| channelButtons.clear(); | |||
| if (currentChannelLayout == AudioChannelSet::disabled()) | |||
| { | |||
| noChannelsLabel.setVisible (true); | |||
| } | |||
| else | |||
| { | |||
| const int numChannels = currentChannelLayout.size(); | |||
| for (int i = 0; i < numChannels; ++i) | |||
| { | |||
| const String channelName = | |||
| AudioChannelSet::getAbbreviatedChannelTypeName (currentChannelLayout.getTypeOfChannel (i)); | |||
| TextButton* newButton; | |||
| channelButtons.add (newButton = new TextButton (channelName, channelName)); | |||
| newButton->addListener (this); | |||
| addAndMakeVisible (newButton); | |||
| } | |||
| noChannelsLabel.setVisible (false); | |||
| resized(); | |||
| } | |||
| } | |||
| } | |||
| AudioChannelSet currentChannelLayout; | |||
| Label noChannelsLabel; | |||
| OwnedArray<TextButton> channelButtons; | |||
| }; | |||
| @@ -0,0 +1,133 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE library. | |||
| Copyright (c) 2015 - ROLI Ltd. | |||
| Permission is granted to use this software under the terms of either: | |||
| a) the GPL v2 (or any later version) | |||
| b) the Affero GPL v3 | |||
| Details of these licenses can be found at: www.gnu.org/licenses | |||
| JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
| A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
| ------------------------------------------------------------------------------ | |||
| To release a closed-source product which uses JUCE, commercial licenses are | |||
| available: visit www.juce.com for more information. | |||
| ============================================================================== | |||
| */ | |||
| #include "../JuceLibraryCode/JuceHeader.h" | |||
| #include "SurroundEditor.h" | |||
| //============================================================================== | |||
| /** | |||
| */ | |||
| class SurroundProcessor : public AudioProcessor, public ChannelClickListener | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| SurroundProcessor() | |||
| { | |||
| } | |||
| ~SurroundProcessor() {} | |||
| //============================================================================== | |||
| void prepareToPlay (double sampleRate, int samplesPerBlock) override | |||
| { | |||
| channelClicked = 0; | |||
| sampleOffset = static_cast<int> (std::ceil (sampleRate)); | |||
| ignoreUnused (samplesPerBlock); | |||
| } | |||
| void releaseResources() override {} | |||
| void processBlock (AudioSampleBuffer& buffer, MidiBuffer&) override | |||
| { | |||
| buffer.clear(); | |||
| const int fillSamples | |||
| = jmin (static_cast<int> (std::ceil (getSampleRate())) - sampleOffset, buffer.getNumSamples()); | |||
| float* channelBuffer = buffer.getWritePointer (channelClicked); | |||
| const float freq = 440.f / static_cast<float> (getSampleRate()); | |||
| for (int i = 0; i < fillSamples; ++i) | |||
| channelBuffer[i] = std::sin (2.0f * static_cast<float> (M_PI) * freq * static_cast<float> (sampleOffset++)); | |||
| } | |||
| //============================================================================== | |||
| AudioProcessorEditor* createEditor() override { return new SurroundEditor (*this); } | |||
| bool hasEditor() const override { return true; } | |||
| //============================================================================== | |||
| bool setPreferredBusArrangement (bool isInputBus, int busIndex, | |||
| const AudioChannelSet& preferred) override | |||
| { | |||
| if ( preferred == AudioChannelSet::mono() | |||
| || preferred == AudioChannelSet::stereo() | |||
| || preferred == AudioChannelSet::createLCR() | |||
| || preferred == AudioChannelSet::createLCRS() | |||
| || preferred == AudioChannelSet::quadraphonic() | |||
| || preferred == AudioChannelSet::pentagonal() | |||
| || preferred == AudioChannelSet::hexagonal() | |||
| || preferred == AudioChannelSet::octagonal() | |||
| || preferred == AudioChannelSet::ambisonic() | |||
| || preferred == AudioChannelSet::create5point0() | |||
| || preferred == AudioChannelSet::create5point1() | |||
| || preferred == AudioChannelSet::create6point0() | |||
| || preferred == AudioChannelSet::create6point1() | |||
| || preferred == AudioChannelSet::create7point0() | |||
| || preferred == AudioChannelSet::create7point1() | |||
| || preferred == AudioChannelSet::createFront7point0() | |||
| || preferred == AudioChannelSet::createFront7point1()) | |||
| return AudioProcessor::setPreferredBusArrangement (isInputBus, busIndex, preferred); | |||
| return false; | |||
| } | |||
| //============================================================================== | |||
| const String getName() const override { return "Surround PlugIn"; } | |||
| bool acceptsMidi() const override { return false; } | |||
| bool producesMidi() const override { return false; } | |||
| bool silenceInProducesSilenceOut() const override { return true; } | |||
| double getTailLengthSeconds() const override { return 0; } | |||
| //============================================================================== | |||
| int getNumPrograms() override { return 1; } | |||
| int getCurrentProgram() override { return 0; } | |||
| void setCurrentProgram (int) override {} | |||
| const String getProgramName (int) override { return String(); } | |||
| void changeProgramName (int , const String& ) override { } | |||
| //============================================================================== | |||
| void getStateInformation (MemoryBlock&) override {} | |||
| void setStateInformation (const void* , int) override {} | |||
| void channelButtonClicked (int channelIndex) override | |||
| { | |||
| channelClicked = channelIndex; | |||
| sampleOffset = 0; | |||
| } | |||
| private: | |||
| int channelClicked; | |||
| int sampleOffset; | |||
| //============================================================================== | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SurroundProcessor) | |||
| }; | |||
| //============================================================================== | |||
| // This creates new instances of the plugin.. | |||
| AudioProcessor* JUCE_CALLTYPE createPluginFilter() | |||
| { | |||
| return new SurroundProcessor(); | |||
| } | |||
| @@ -0,0 +1,115 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <JUCERPROJECT id="S8q71q" name="Surround" projectType="audioplug" version="1.0.0" | |||
| bundleIdentifier="com.ROLI.Surround" includeBinaryInAppConfig="1" | |||
| buildVST="1" buildVST3="1" buildAU="1" buildRTAS="0" buildAAX="1" | |||
| pluginName="Surround" pluginDesc="Surround" pluginManufacturer="ROLI Ltd." | |||
| pluginManufacturerCode="ROLI" pluginCode="Srrd" pluginChannelConfigs="" | |||
| pluginIsSynth="1" pluginWantsMidiIn="0" pluginProducesMidiOut="0" | |||
| pluginIsMidiEffectPlugin="0" pluginSilenceInIsSilenceOut="0" | |||
| pluginEditorRequiresKeys="0" pluginAUExportPrefix="SurroundAU" | |||
| pluginRTASCategory="" aaxIdentifier="com.ROLI.Surround" pluginAAXCategory="AAX_ePlugInCategory_Dynamics" | |||
| jucerVersion="4.1.0"> | |||
| <MAINGROUP id="dEAH7t" name="Surround"> | |||
| <GROUP id="{1CB41212-BD0E-AC71-15E8-C40AD59BD2EE}" name="Source"> | |||
| <FILE id="sLk2ic" name="SurroundProcessor.cpp" compile="1" resource="0" | |||
| file="Source/SurroundProcessor.cpp"/> | |||
| <FILE id="oVnvtx" name="SurroundEditor.h" compile="0" resource="0" | |||
| file="Source/SurroundEditor.h"/> | |||
| </GROUP> | |||
| </MAINGROUP> | |||
| <EXPORTFORMATS> | |||
| <XCODE_MAC targetFolder="Builds/MacOSX" postbuildCommand=" # This script takes the build product and copies it to the AU, VST, VST3, RTAS and AAX folders, depending on # which plugin types you've built original=$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME # this looks inside the binary to detect which platforms are needed.. copyAU=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'AudioUnit' | wc -l` copyVST=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'VSTPlugin' | wc -l` copyVST3=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'GetPluginFactory' | wc -l` copyRTAS=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'CProcess' | wc -l` copyAAX=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'ACFStartup' | wc -l` if [ $copyAU -gt 0 ]; then echo "Copying to AudioUnit folder..." AUDir=~/Library/Audio/Plug-Ins/Components mkdir -p "$AUDir" AU=$AUDir/$PRODUCT_NAME.component if [ -d "$AU" ]; then rm -r "$AU" fi cp -r "$original" "$AU" sed -i "" -e 's/TDMwPTul/BNDLPTul/g' "$AU/Contents/PkgInfo" sed -i "" -e 's/TDMw/BNDL/g' "$AU/Contents/$INFOPLIST_FILE" fi if [ $copyVST -gt 0 ]; then echo "Copying to VST folder..." VSTDir=~/Library/Audio/Plug-Ins/VST mkdir -p "$VSTDir" VST=$VSTDir/$PRODUCT_NAME.vst if [ -d "$VST" ]; then rm -r "$VST" fi cp -r "$original" "$VST" sed -i "" -e 's/TDMwPTul/BNDLPTul/g' "$VST/Contents/PkgInfo" sed -i "" -e 's/TDMw/BNDL/g' "$VST/Contents/$INFOPLIST_FILE" fi if [ $copyVST3 -gt 0 ]; then echo "Copying to VST3 folder..." VST3Dir=~/Library/Audio/Plug-Ins/VST3 mkdir -p "$VST3Dir" VST3=$VST3Dir/$PRODUCT_NAME.vst3 if [ -d "$VST3" ]; then rm -r "$VST3" fi cp -r "$original" "$VST3" sed -i "" -e 's/TDMwPTul/BNDLPTul/g' "$VST3/Contents/PkgInfo" sed -i "" -e 's/TDMw/BNDL/g' "$VST3/Contents/$INFOPLIST_FILE" fi if [ $copyRTAS -gt 0 ]; then echo "Copying to RTAS folder..." RTASDir=/Library/Application\ Support/Digidesign/Plug-Ins if [ -d "$RTASDir" ]; then RTAS=$RTASDir/$PRODUCT_NAME.dpm if [ -d "$RTAS" ]; then rm -r "$RTAS" fi cp -r "$original" "$RTAS" fi fi if [ $copyAAX -gt 0 ]; then echo "Copying to AAX folder..." if [ -d "/Applications/ProTools_3PDev/Plug-Ins" ]; then AAX1="/Applications/ProTools_3PDev/Plug-Ins/$PRODUCT_NAME.aaxplugin" if [ -d "$AAX1" ]; then rm -r "$AAX1" fi cp -R -H "$original" "$AAX1" fi if [ -d "/Library/Application Support/Avid/Audio/Plug-Ins" ]; then AAX2="/Library/Application Support/Avid/Audio/Plug-Ins/$PRODUCT_NAME.aaxplugin" if [ -d "$AAX2" ]; then rm -r "$AAX2" fi cp -R -H "$original" "$AAX2" fi fi " | |||
| vstFolder="" vst3Folder="" aaxFolder="" extraDefs="" extraCompilerFlags="-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" osxSDK="default" osxCompatibility="default" osxArchitecture="default" | |||
| isDebug="1" optimisation="1" targetName="Surround" cppLibType="libstdc++"/> | |||
| <CONFIGURATION name="Release" osxSDK="default" osxCompatibility="default" osxArchitecture="default" | |||
| isDebug="0" optimisation="3" targetName="Surround" cppLibType="libstdc++"/> | |||
| </CONFIGURATIONS> | |||
| <MODULEPATHS> | |||
| <MODULEPATH id="juce_core" path="../../../modules"/> | |||
| <MODULEPATH id="juce_events" path="../../../modules"/> | |||
| <MODULEPATH id="juce_graphics" path="../../../modules"/> | |||
| <MODULEPATH id="juce_data_structures" path="../../../modules"/> | |||
| <MODULEPATH id="juce_gui_basics" path="../../../modules"/> | |||
| <MODULEPATH id="juce_gui_extra" path="../../../modules"/> | |||
| <MODULEPATH id="juce_cryptography" path="../../../modules"/> | |||
| <MODULEPATH id="juce_video" path="../../../modules"/> | |||
| <MODULEPATH id="juce_opengl" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_basics" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_devices" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_formats" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_processors" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_plugin_client" path="../../../modules"/> | |||
| </MODULEPATHS> | |||
| </XCODE_MAC> | |||
| <VS2015 targetFolder="Builds/VisualStudio2015" vstFolder="" vst3Folder="" | |||
| aaxFolder="" toolset="v140_xp"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" winWarningLevel="4" generateManifest="1" winArchitecture="x64" | |||
| isDebug="1" optimisation="1" targetName="Surround" useRuntimeLibDLL="0"/> | |||
| <CONFIGURATION name="Release" winWarningLevel="4" generateManifest="1" winArchitecture="x64" | |||
| isDebug="0" optimisation="3" targetName="Surround" useRuntimeLibDLL="0"/> | |||
| </CONFIGURATIONS> | |||
| <MODULEPATHS> | |||
| <MODULEPATH id="juce_core" path="../../../modules"/> | |||
| <MODULEPATH id="juce_events" path="../../../modules"/> | |||
| <MODULEPATH id="juce_graphics" path="../../../modules"/> | |||
| <MODULEPATH id="juce_data_structures" path="../../../modules"/> | |||
| <MODULEPATH id="juce_gui_basics" path="../../../modules"/> | |||
| <MODULEPATH id="juce_gui_extra" path="../../../modules"/> | |||
| <MODULEPATH id="juce_cryptography" path="../../../modules"/> | |||
| <MODULEPATH id="juce_video" path="../../../modules"/> | |||
| <MODULEPATH id="juce_opengl" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_basics" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_devices" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_formats" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_processors" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_plugin_client" path="../../../modules"/> | |||
| </MODULEPATHS> | |||
| </VS2015> | |||
| <LINUX_MAKE targetFolder="Builds/LinuxMakefile" vstFolder="" vst3Folder="" | |||
| extraDefs="" extraCompilerFlags="-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion"> | |||
| <CONFIGURATIONS> | |||
| <CONFIGURATION name="Debug" libraryPath="/usr/X11R6/lib/" isDebug="1" optimisation="1" | |||
| targetName="Surround"/> | |||
| <CONFIGURATION name="Release" libraryPath="/usr/X11R6/lib/" isDebug="0" optimisation="3" | |||
| targetName="Surround"/> | |||
| </CONFIGURATIONS> | |||
| <MODULEPATHS> | |||
| <MODULEPATH id="juce_core" path="../../../modules"/> | |||
| <MODULEPATH id="juce_events" path="../../../modules"/> | |||
| <MODULEPATH id="juce_graphics" path="../../../modules"/> | |||
| <MODULEPATH id="juce_data_structures" path="../../../modules"/> | |||
| <MODULEPATH id="juce_gui_basics" path="../../../modules"/> | |||
| <MODULEPATH id="juce_gui_extra" path="../../../modules"/> | |||
| <MODULEPATH id="juce_cryptography" path="../../../modules"/> | |||
| <MODULEPATH id="juce_video" path="../../../modules"/> | |||
| <MODULEPATH id="juce_opengl" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_basics" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_devices" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_formats" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_processors" path="../../../modules"/> | |||
| <MODULEPATH id="juce_audio_plugin_client" path="../../../modules"/> | |||
| </MODULEPATHS> | |||
| </LINUX_MAKE> | |||
| </EXPORTFORMATS> | |||
| <MODULES> | |||
| <MODULE id="juce_audio_basics" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_audio_devices" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_audio_formats" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_audio_plugin_client" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_audio_processors" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_core" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_cryptography" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_data_structures" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_events" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_graphics" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_gui_basics" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_gui_extra" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_opengl" showAllCode="1" useLocalCopy="0"/> | |||
| <MODULE id="juce_video" showAllCode="1" useLocalCopy="0"/> | |||
| </MODULES> | |||
| <JUCEOPTIONS JUCE_QUICKTIME="disabled"/> | |||
| </JUCERPROJECT> | |||
| @@ -113,6 +113,15 @@ struct AAXClasses | |||
| return AAX::IsParameterIDEqual (paramID, cDefaultMasterBypassID) != 0; | |||
| } | |||
| // maps a channel index of an AAX format to an index of a juce format | |||
| struct AAXChannelStreamOrder | |||
| { | |||
| AAX_EStemFormat aaxStemFormat; | |||
| AudioChannelSet::ChannelType speakerOrder[8]; | |||
| }; | |||
| static AAXChannelStreamOrder aaxChannelOrder[]; | |||
| static AAX_EStemFormat getFormatForAudioChannelSet (const AudioChannelSet& set, bool ignoreLayout) noexcept | |||
| { | |||
| // if the plug-in ignores layout, it is ok to convert between formats only by their numchannnels | |||
| @@ -221,6 +230,24 @@ struct AAXClasses | |||
| return Colours::black; | |||
| } | |||
| static int juceChannelIndexToAax (int juceIndex, const AudioChannelSet& channelSet) | |||
| { | |||
| AAX_EStemFormat currentLayout = getFormatForAudioChannelSet (channelSet, false); | |||
| int layoutIndex; | |||
| for (layoutIndex = 0; aaxChannelOrder[layoutIndex].aaxStemFormat != currentLayout; ++layoutIndex) | |||
| if (aaxChannelOrder[layoutIndex].aaxStemFormat == 0) return juceIndex; | |||
| const AAXChannelStreamOrder& channelOrder = aaxChannelOrder[layoutIndex]; | |||
| const AudioChannelSet::ChannelType channelType = channelSet.getTypeOfChannel (static_cast<int> (juceIndex)); | |||
| for (int i = 0; i < 8 && channelOrder.speakerOrder[i] != 0; ++i) | |||
| if (channelOrder.speakerOrder[i] == channelType) | |||
| return i; | |||
| return juceIndex; | |||
| } | |||
| //============================================================================== | |||
| class JuceAAX_Processor; | |||
| @@ -841,7 +868,7 @@ struct AAXClasses | |||
| jassert (idx < (mainNumIns + 1)); | |||
| if (idx < mainNumIns) | |||
| return inputs[idx]; | |||
| return inputs[inputLayoutMap[idx]]; | |||
| return (sidechain != -1 ? inputs[sidechain] : sideChainBuffer.getData()); | |||
| } | |||
| @@ -862,26 +889,32 @@ struct AAXClasses | |||
| { | |||
| const int mainNumIns = numIns > 0 ? pluginInstance->busArrangement.inputBuses.getReference (0).channels.size() : 0; | |||
| const int sidechain = busUtils.getNumEnabledBuses (true) >= 2 ? sideChainBufferIdx : -1; | |||
| const int numChans = jmax (numIns, numOuts); | |||
| if (numChans == 0) return; | |||
| if (channelList.size() <= numChans) | |||
| channelList.insertMultiple (-1, nullptr, 1 + numChans - channelList.size()); | |||
| float** channels = channelList.getRawDataPointer(); | |||
| if (numOuts >= numIns) | |||
| { | |||
| for (int i = 0; i < numOuts; ++i) | |||
| channels[i] = outputs[outputLayoutMap[i]]; | |||
| for (int i = 0; i < numIns; ++i) | |||
| memcpy (outputs[i], getAudioBufferForInput (inputs, sidechain, mainNumIns, i), (size_t) bufferSize * sizeof (float)); | |||
| memcpy (channels[i], getAudioBufferForInput (inputs, sidechain, mainNumIns, i), (size_t) bufferSize * sizeof (float)); | |||
| process (outputs, numOuts, bufferSize, bypass, midiNodeIn, midiNodesOut); | |||
| process (channels, numOuts, bufferSize, bypass, midiNodeIn, midiNodesOut); | |||
| } | |||
| else | |||
| { | |||
| if (channelList.size() <= numIns) | |||
| channelList.insertMultiple (-1, nullptr, 1 + numIns - channelList.size()); | |||
| float** channels = channelList.getRawDataPointer(); | |||
| for (int i = 0; i < numOuts; ++i) | |||
| channels[i] = outputs[outputLayoutMap[i]]; | |||
| for (int i = 0; i < numOuts; ++i) | |||
| { | |||
| memcpy (outputs[i], getAudioBufferForInput (inputs, sidechain, mainNumIns, i), (size_t) bufferSize * sizeof (float)); | |||
| channels[i] = outputs[i]; | |||
| } | |||
| memcpy (channels[i], getAudioBufferForInput (inputs, sidechain, mainNumIns, i), (size_t) bufferSize * sizeof (float)); | |||
| for (int i = numOuts; i < numIns; ++i) | |||
| channels[i] = const_cast<float*> (getAudioBufferForInput (inputs, sidechain, mainNumIns, i)); | |||
| @@ -1062,6 +1095,9 @@ struct AAXClasses | |||
| || (busUtils.getBusCount (false) > 0 && busUtils.getChannelSet (false, 0) != outputSet) | |||
| || (hasSidechain && busUtils.getNumChannels(true, 1) != 1)) | |||
| return AAX_ERROR_UNIMPLEMENTED; | |||
| rebuildChannelMapArrays (true); | |||
| rebuildChannelMapArrays (false); | |||
| #endif | |||
| audioProcessor.setRateAndBufferSizeDetails (sampleRate, maxBufferSize); | |||
| @@ -1073,6 +1109,30 @@ struct AAXClasses | |||
| return AAX_SUCCESS; | |||
| } | |||
| void rebuildChannelMapArrays (bool isInput) | |||
| { | |||
| Array<int>& layoutMap = isInput ? inputLayoutMap : outputLayoutMap; | |||
| layoutMap.clear(); | |||
| const int n = isInput ? jmin (busUtils.getBusCount (true), 1) : busUtils.getBusCount (false); | |||
| int chOffset = 0; | |||
| for (int busIdx = 0; busIdx < n; ++busIdx) | |||
| { | |||
| const AudioChannelSet channelFormat = busUtils.getChannelSet (isInput, busIdx); | |||
| if (channelFormat != AudioChannelSet::disabled()) | |||
| { | |||
| const int numChannels = channelFormat.size(); | |||
| for (int ch = 0; ch < numChannels; ++ch) | |||
| layoutMap.add (juceChannelIndexToAax (ch, channelFormat) + chOffset); | |||
| chOffset += numChannels; | |||
| } | |||
| } | |||
| } | |||
| ScopedJuceInitialiser_GUI libraryInitialiser; | |||
| ScopedPointer<AudioProcessor> pluginInstance; | |||
| @@ -1084,6 +1144,7 @@ struct AAXClasses | |||
| int lastBufferSize, maxBufferSize; | |||
| bool hasSidechain; | |||
| HeapBlock<float> sideChainBuffer; | |||
| Array<int> inputLayoutMap, outputLayoutMap; | |||
| struct ChunkMemoryBlock : public ReferenceCountedObject | |||
| { | |||
| @@ -1448,6 +1509,25 @@ struct AAXClasses | |||
| } | |||
| }; | |||
| //============================================================================== | |||
| AAXClasses::AAXChannelStreamOrder AAXClasses::aaxChannelOrder[] = | |||
| { | |||
| {AAX_eStemFormat_Mono, {AudioChannelSet::centre, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown}}, | |||
| {AAX_eStemFormat_Stereo, {AudioChannelSet::left, AudioChannelSet::right, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown}}, | |||
| {AAX_eStemFormat_LCR, {AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown}}, | |||
| {AAX_eStemFormat_LCRS, {AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::surround, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown}}, | |||
| {AAX_eStemFormat_Quad, {AudioChannelSet::left, AudioChannelSet::right, AudioChannelSet::surroundLeft, AudioChannelSet::surroundRight, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown}}, | |||
| {AAX_eStemFormat_5_0, {AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::surroundLeft, AudioChannelSet::surroundRight, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown}}, | |||
| {AAX_eStemFormat_5_1, {AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::surroundLeft, AudioChannelSet::surroundRight, AudioChannelSet::subbass, AudioChannelSet::unknown, AudioChannelSet::unknown}}, | |||
| {AAX_eStemFormat_6_0, {AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::surroundLeft, AudioChannelSet::surround, AudioChannelSet::surroundRight, AudioChannelSet::unknown, AudioChannelSet::unknown}}, | |||
| {AAX_eStemFormat_6_1, {AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::surroundLeft, AudioChannelSet::surround, AudioChannelSet::surroundRight, AudioChannelSet::subbass, AudioChannelSet::unknown}}, | |||
| {AAX_eStemFormat_7_0_SDDS, {AudioChannelSet::left, AudioChannelSet::centreLeft, AudioChannelSet::centre, AudioChannelSet::centreRight, AudioChannelSet::right, AudioChannelSet::surroundLeft, AudioChannelSet::surroundRight, AudioChannelSet::unknown}}, | |||
| {AAX_eStemFormat_7_0_DTS, {AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::sideLeft, AudioChannelSet::sideRight, AudioChannelSet::surroundLeft, AudioChannelSet::surroundRight, AudioChannelSet::unknown}}, | |||
| {AAX_eStemFormat_7_1_SDDS, {AudioChannelSet::left, AudioChannelSet::centreLeft, AudioChannelSet::centre, AudioChannelSet::centreRight, AudioChannelSet::right, AudioChannelSet::surroundLeft, AudioChannelSet::surroundRight, AudioChannelSet::subbass}}, | |||
| {AAX_eStemFormat_7_1_DTS, {AudioChannelSet::left, AudioChannelSet::centre, AudioChannelSet::right, AudioChannelSet::sideLeft, AudioChannelSet::sideRight, AudioChannelSet::surroundLeft, AudioChannelSet::surroundRight, AudioChannelSet::subbass}}, | |||
| {AAX_eStemFormat_None, {AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown, AudioChannelSet::unknown}}, | |||
| }; | |||
| //============================================================================== | |||
| AAX_Result JUCE_CDECL GetEffectDescriptions (AAX_ICollection*); | |||
| AAX_Result JUCE_CDECL GetEffectDescriptions (AAX_ICollection* collection) | |||
| @@ -1007,20 +1007,23 @@ public: | |||
| for (unsigned int chIdx = 0; chIdx < numOutChannels; ++chIdx) | |||
| { | |||
| int mappedInChIdx = numInChannels > 0 ? inputLayoutMap.getReference (static_cast<int> (busIdx))[static_cast<int> (chIdx)] : 0; | |||
| int mappedOutChIdx = outputLayoutMap.getReference (static_cast<int> (busIdx))[static_cast<int> (chIdx)]; | |||
| const bool isOutputInterleaved = (numOutChannels > 1) && (outBuffer.mNumberBuffers == 1); | |||
| float* outData = isOutputInterleaved ? scratchBuffers[scratchIdx++] : static_cast<float*> (outBuffer.mBuffers[chIdx].mData); | |||
| float* outData = isOutputInterleaved ? scratchBuffers[scratchIdx++] : static_cast<float*> (outBuffer.mBuffers[mappedOutChIdx].mData); | |||
| if (chIdx < numInChannels) | |||
| { | |||
| const AudioBufferList& inBuffer = input->GetBufferList(); | |||
| const bool isInputInterleaved = (numInChannels > 1) && (inBuffer.mNumberBuffers == 1); | |||
| const float* inData = static_cast<float*> (inBuffer.mBuffers[isInputInterleaved ? 0 : chIdx].mData); | |||
| const float* inData = static_cast<float*> (inBuffer.mBuffers[isInputInterleaved ? 0 : mappedInChIdx].mData); | |||
| if (isInputInterleaved) | |||
| { | |||
| for (unsigned int i = 0; i < nFrames; ++i) | |||
| { | |||
| outData [i] = inData[chIdx]; | |||
| outData [i] = inData[mappedInChIdx]; | |||
| inData += numInChannels; | |||
| } | |||
| } | |||
| @@ -1038,15 +1041,17 @@ public: | |||
| for (unsigned int chIdx = 0; chIdx < numInChannels; ++chIdx) | |||
| { | |||
| int mappedInChIdx = inputLayoutMap.getReference (static_cast<int> (busIdx))[static_cast<int> (chIdx)]; | |||
| float* buffer = isInputInterleaved ? scratchBuffers[scratchIdx++] | |||
| : static_cast<float*> (inBuffer.mBuffers[chIdx].mData); | |||
| : static_cast<float*> (inBuffer.mBuffers[mappedInChIdx].mData); | |||
| if (isInputInterleaved) | |||
| { | |||
| const float* inData = static_cast<float*> (inBuffer.mBuffers[0].mData); | |||
| for (unsigned int i = 0; i < nFrames; ++i) | |||
| { | |||
| buffer [i] = inData [chIdx]; | |||
| buffer [i] = inData [mappedInChIdx]; | |||
| inData += numInChannels; | |||
| } | |||
| } | |||
| @@ -1107,14 +1112,16 @@ public: | |||
| for (unsigned int chIdx = 0; chIdx < numOutChannels; ++chIdx) | |||
| { | |||
| float* outData = static_cast<float*> (outBuffer.mBuffers[isOutputInterleaved ? 0 : chIdx].mData); | |||
| int mappedOutChIdx = outputLayoutMap.getReference (static_cast<int> (busIdx))[static_cast<int> (chIdx)]; | |||
| float* outData = static_cast<float*> (outBuffer.mBuffers[isOutputInterleaved ? 0 : mappedOutChIdx].mData); | |||
| const float* buffer = static_cast<float*> (channels [idx++]); | |||
| if (isOutputInterleaved) | |||
| { | |||
| for (unsigned int i = 0; i < nFrames; ++i) | |||
| { | |||
| outData [chIdx] = buffer[i]; | |||
| outData [mappedOutChIdx] = buffer[i]; | |||
| outData += numOutChannels; | |||
| } | |||
| } | |||
| @@ -1521,6 +1528,7 @@ private: | |||
| Array<AUChannelInfo> channelInfo; | |||
| Array<Array<AudioChannelLayoutTag> > supportedInputLayouts, supportedOutputLayouts; | |||
| Array<AudioChannelLayoutTag> currentInputLayout, currentOutputLayout; | |||
| Array<Array<int> > inputLayoutMap, outputLayoutMap; | |||
| //============================================================================== | |||
| static OSStatus scopeToDirection (AudioUnitScope scope, bool& isInput) noexcept | |||
| @@ -1580,6 +1588,12 @@ private: | |||
| const int numInputElements = static_cast<int> (GetScope(kAudioUnitScope_Input). GetNumberOfElements()); | |||
| const int numOutputElements = static_cast<int> (GetScope(kAudioUnitScope_Output).GetNumberOfElements()); | |||
| inputLayoutMap. clear(); | |||
| outputLayoutMap.clear(); | |||
| inputLayoutMap. resize (numInputElements); | |||
| outputLayoutMap.resize (numOutputElements); | |||
| for (int i = 0; i < numInputElements; ++i) | |||
| if ((err = syncProcessorWithAudioUnitForBus (true, i)) != noErr) return err; | |||
| @@ -1612,8 +1626,17 @@ private: | |||
| if (numChannels != tagNumChannels) | |||
| return kAudioUnitErr_FormatNotSupported; | |||
| if (juceFilter->setPreferredBusArrangement (isInput, busNr, CALayoutTagToChannelSet(currentLayoutTag))) | |||
| return noErr; | |||
| const AudioChannelSet channelFormat = CALayoutTagToChannelSet(currentLayoutTag); | |||
| if (! juceFilter->setPreferredBusArrangement (isInput, busNr, channelFormat)) | |||
| return kAudioUnitErr_FormatNotSupported; | |||
| Array<int>& layoutMap = (isInput ? inputLayoutMap : outputLayoutMap).getReference (busNr); | |||
| for (int i = 0; i < numChannels; ++i) | |||
| layoutMap.add (auChannelIndexToJuce (i, channelFormat)); | |||
| return noErr; | |||
| } | |||
| else | |||
| jassertfalse; | |||
| @@ -1853,6 +1876,50 @@ private: | |||
| } | |||
| //============================================================================== | |||
| // maps a channel index into an AU format to an index of a juce format | |||
| struct AUChannelStreamOrder | |||
| { | |||
| AudioChannelLayoutTag auLayoutTag; | |||
| AudioChannelLabel speakerOrder[8]; | |||
| }; | |||
| static AUChannelStreamOrder auChannelStreamOrder[]; | |||
| static int auChannelIndexToJuce (int auIndex, const AudioChannelSet& channelSet) | |||
| { | |||
| if (auIndex >= 8) return auIndex; | |||
| AudioChannelLayoutTag currentLayout = ChannelSetToCALayoutTag (channelSet); | |||
| int layoutIndex; | |||
| for (layoutIndex = 0; auChannelStreamOrder[layoutIndex].auLayoutTag != currentLayout; ++layoutIndex) | |||
| if (auChannelStreamOrder[layoutIndex].auLayoutTag == 0) return auIndex; | |||
| const AudioChannelSet::ChannelType channelType | |||
| = CoreAudioChannelLabelToJuceType (auChannelStreamOrder[layoutIndex].speakerOrder[auIndex]); | |||
| const int juceIndex = channelSet.getChannelTypes().indexOf (channelType); | |||
| return juceIndex >= 0 ? juceIndex : auIndex; | |||
| } | |||
| static int juceChannelIndexToAu (int juceIndex, const AudioChannelSet& channelSet) | |||
| { | |||
| AudioChannelLayoutTag currentLayout = ChannelSetToCALayoutTag (channelSet); | |||
| int layoutIndex; | |||
| for (layoutIndex = 0; auChannelStreamOrder[layoutIndex].auLayoutTag != currentLayout; ++layoutIndex) | |||
| if (auChannelStreamOrder[layoutIndex].auLayoutTag == 0) return juceIndex; | |||
| const AUChannelStreamOrder& channelOrder = auChannelStreamOrder[layoutIndex]; | |||
| const AudioChannelSet::ChannelType channelType = channelSet.getTypeOfChannel (juceIndex); | |||
| for (int i = 0; i < 8 && channelOrder.speakerOrder[i] != 0; ++i) | |||
| if (CoreAudioChannelLabelToJuceType (channelOrder.speakerOrder[i]) == channelType) | |||
| return i; | |||
| return juceIndex; | |||
| } | |||
| static AudioChannelSet::ChannelType CoreAudioChannelLabelToJuceType (AudioChannelLabel label) noexcept | |||
| { | |||
| if (label >= kAudioChannelLabel_Discrete_0 && label <= kAudioChannelLabel_Discrete_65535) | |||
| @@ -1887,10 +1954,58 @@ private: | |||
| case kAudioChannelLabel_RearSurroundRight: return AudioChannelSet::topRearRight; | |||
| case kAudioChannelLabel_TopBackCenter: return AudioChannelSet::topRearCentre; | |||
| case kAudioChannelLabel_LFE2: return AudioChannelSet::subbass2; | |||
| case kAudioChannelLabel_LeftWide: return AudioChannelSet::wideLeft; | |||
| case kAudioChannelLabel_RightWide: return AudioChannelSet::wideRight; | |||
| case kAudioChannelLabel_Ambisonic_W: return AudioChannelSet::ambisonicW; | |||
| case kAudioChannelLabel_Ambisonic_X: return AudioChannelSet::ambisonicX; | |||
| case kAudioChannelLabel_Ambisonic_Y: return AudioChannelSet::ambisonicY; | |||
| case kAudioChannelLabel_Ambisonic_Z: return AudioChannelSet::ambisonicZ; | |||
| default: return AudioChannelSet::unknown; | |||
| } | |||
| } | |||
| static AudioChannelLabel JuceChannelTypeToCoreAudioLabel (const AudioChannelSet::ChannelType& label) noexcept | |||
| { | |||
| if (label >= AudioChannelSet::discreteChannel0) | |||
| { | |||
| const unsigned int discreteChannelNum = label - AudioChannelSet::discreteChannel0;; | |||
| return static_cast<AudioChannelLabel> (kAudioChannelLabel_Discrete_0 + discreteChannelNum); | |||
| } | |||
| switch (label) | |||
| { | |||
| case AudioChannelSet::centre: return kAudioChannelLabel_Center; | |||
| case AudioChannelSet::left: return kAudioChannelLabel_Left; | |||
| case AudioChannelSet::right: return kAudioChannelLabel_Right; | |||
| case AudioChannelSet::subbass: return kAudioChannelLabel_LFEScreen; | |||
| case AudioChannelSet::surroundLeft: return kAudioChannelLabel_LeftSurround; | |||
| case AudioChannelSet::surroundRight: return kAudioChannelLabel_RightSurround; | |||
| case AudioChannelSet::centreLeft: return kAudioChannelLabel_LeftCenter; | |||
| case AudioChannelSet::centreRight: return kAudioChannelLabel_RightCenter; | |||
| case AudioChannelSet::surround: return kAudioChannelLabel_CenterSurround; | |||
| case AudioChannelSet::sideLeft: return kAudioChannelLabel_LeftSurroundDirect; | |||
| case AudioChannelSet::sideRight: return kAudioChannelLabel_RightSurroundDirect; | |||
| case AudioChannelSet::topMiddle: return kAudioChannelLabel_TopCenterSurround; | |||
| case AudioChannelSet::topFrontLeft: return kAudioChannelLabel_VerticalHeightLeft; | |||
| case AudioChannelSet::topFrontRight: return kAudioChannelLabel_VerticalHeightRight; | |||
| case AudioChannelSet::topFrontCentre: return kAudioChannelLabel_VerticalHeightCenter; | |||
| case AudioChannelSet::topRearLeft: return kAudioChannelLabel_RearSurroundLeft; | |||
| case AudioChannelSet::topRearRight: return kAudioChannelLabel_RearSurroundRight; | |||
| case AudioChannelSet::topRearCentre: return kAudioChannelLabel_TopBackCenter; | |||
| case AudioChannelSet::subbass2: return kAudioChannelLabel_LFE2; | |||
| case AudioChannelSet::wideLeft: return kAudioChannelLabel_LeftWide; | |||
| case AudioChannelSet::wideRight: return kAudioChannelLabel_RightWide; | |||
| case AudioChannelSet::ambisonicW: return kAudioChannelLabel_Ambisonic_W; | |||
| case AudioChannelSet::ambisonicX: return kAudioChannelLabel_Ambisonic_X; | |||
| case AudioChannelSet::ambisonicY: return kAudioChannelLabel_Ambisonic_Y; | |||
| case AudioChannelSet::ambisonicZ: return kAudioChannelLabel_Ambisonic_Z; | |||
| case AudioChannelSet::unknown: return kAudioChannelLabel_Unknown; | |||
| case AudioChannelSet::discreteChannel0: return kAudioChannelLabel_Discrete_0; | |||
| } | |||
| return kAudioChannelLabel_Unknown; | |||
| } | |||
| static AudioChannelSet CoreAudioChannelBitmapToJuceType (UInt32 bitmap) noexcept | |||
| { | |||
| AudioChannelSet set; | |||
| @@ -1955,6 +2070,10 @@ private: | |||
| case kAudioChannelLayoutTag_MPEG_7_1_C: return AudioChannelSet::create7point1(); | |||
| case kAudioChannelLayoutTag_AudioUnit_7_0_Front: return AudioChannelSet::createFront7point0(); | |||
| case kAudioChannelLayoutTag_AudioUnit_7_1_Front: return AudioChannelSet::createFront7point1(); | |||
| case kAudioChannelLayoutTag_MPEG_3_0_A: | |||
| case kAudioChannelLayoutTag_MPEG_3_0_B: return AudioChannelSet::createLCR(); | |||
| case kAudioChannelLayoutTag_MPEG_4_0_A: | |||
| case kAudioChannelLayoutTag_MPEG_4_0_B: return AudioChannelSet::createLCRS(); | |||
| } | |||
| if (int numChannels = static_cast<int> (tag) & 0xffff) | |||
| @@ -1969,6 +2088,8 @@ private: | |||
| { | |||
| if (set == AudioChannelSet::mono()) return kAudioChannelLayoutTag_Mono; | |||
| if (set == AudioChannelSet::stereo()) return kAudioChannelLayoutTag_Stereo; | |||
| if (set == AudioChannelSet::createLCR()) return kAudioChannelLayoutTag_MPEG_3_0_A; | |||
| if (set == AudioChannelSet::createLCRS()) return kAudioChannelLayoutTag_MPEG_4_0_A; | |||
| if (set == AudioChannelSet::quadraphonic()) return kAudioChannelLayoutTag_Quadraphonic; | |||
| if (set == AudioChannelSet::pentagonal()) return kAudioChannelLayoutTag_Pentagonal; | |||
| if (set == AudioChannelSet::hexagonal()) return kAudioChannelLayoutTag_Hexagonal; | |||
| @@ -2024,6 +2145,31 @@ private: | |||
| JUCE_DECLARE_NON_COPYABLE (JuceAU) | |||
| }; | |||
| JuceAU::AUChannelStreamOrder JuceAU::auChannelStreamOrder[] = | |||
| { | |||
| {kAudioChannelLayoutTag_Mono, {kAudioChannelLabel_Center, 0, 0, 0, 0, 0, 0, 0}}, | |||
| {kAudioChannelLayoutTag_Stereo, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, 0, 0, 0, 0, 0, 0}}, | |||
| {kAudioChannelLayoutTag_StereoHeadphones, {kAudioChannelLabel_HeadphonesLeft, kAudioChannelLabel_HeadphonesRight, 0, 0, 0, 0, 0, 0}}, | |||
| {kAudioChannelLayoutTag_Binaural, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, 0, 0, 0, 0, 0, 0}}, | |||
| {kAudioChannelLayoutTag_Quadraphonic, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, 0, 0, 0, 0}}, | |||
| {kAudioChannelLayoutTag_Pentagonal, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, kAudioChannelLabel_Center, 0, 0, 0}}, | |||
| {kAudioChannelLayoutTag_Hexagonal, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, kAudioChannelLabel_Center, kAudioChannelLabel_CenterSurround, 0, 0}}, | |||
| {kAudioChannelLayoutTag_Octagonal, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, kAudioChannelLabel_Center, kAudioChannelLabel_CenterSurround, kAudioChannelLabel_LeftWide, kAudioChannelLabel_RightWide}}, | |||
| {kAudioChannelLayoutTag_Ambisonic_B_Format, {kAudioChannelLabel_Ambisonic_W, kAudioChannelLabel_Ambisonic_X, kAudioChannelLabel_Ambisonic_Y, kAudioChannelLabel_Ambisonic_Z, 0, 0, 0, 0}}, | |||
| {kAudioChannelLayoutTag_MPEG_5_0_B, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, kAudioChannelLabel_Center, 0, 0, 0}}, | |||
| {kAudioChannelLayoutTag_MPEG_5_1_A, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_Center, kAudioChannelLabel_LFEScreen, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, 0, 0}}, | |||
| {kAudioChannelLayoutTag_AudioUnit_6_0, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, kAudioChannelLabel_Center, kAudioChannelLabel_CenterSurround, 0, 0}}, | |||
| {kAudioChannelLayoutTag_MPEG_6_1_A, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_Center, kAudioChannelLabel_LFEScreen, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, kAudioChannelLabel_CenterSurround, 0}}, | |||
| {kAudioChannelLayoutTag_AudioUnit_7_0, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, kAudioChannelLabel_Center, kAudioChannelLabel_RearSurroundLeft, kAudioChannelLabel_RearSurroundRight, 0}}, | |||
| {kAudioChannelLayoutTag_MPEG_7_1_C, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_Center, kAudioChannelLabel_LFEScreen, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, kAudioChannelLabel_RearSurroundLeft, kAudioChannelLabel_RearSurroundRight}}, | |||
| {kAudioChannelLayoutTag_AudioUnit_7_0_Front,{kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, kAudioChannelLabel_Center, kAudioChannelLabel_LeftCenter, kAudioChannelLabel_RightCenter, 0}}, | |||
| {kAudioChannelLayoutTag_AudioUnit_7_1_Front,{kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_Center, kAudioChannelLabel_LFEScreen, kAudioChannelLabel_LeftSurround, kAudioChannelLabel_RightSurround, kAudioChannelLabel_LeftCenter, kAudioChannelLabel_RightCenter}}, | |||
| {kAudioChannelLayoutTag_MPEG_3_0_A, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_Center, 0, 0, 0, 0, 0}}, | |||
| {kAudioChannelLayoutTag_MPEG_3_0_B, {kAudioChannelLabel_Center, kAudioChannelLabel_Left, kAudioChannelLabel_Right, 0, 0, 0, 0, 0}}, | |||
| {kAudioChannelLayoutTag_MPEG_4_0_A, {kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_Center, kAudioChannelLabel_CenterSurround, 0, 0, 0, 0}}, | |||
| {kAudioChannelLayoutTag_MPEG_4_0_B, {kAudioChannelLabel_Center, kAudioChannelLabel_Left, kAudioChannelLabel_Right, kAudioChannelLabel_CenterSurround, 0, 0, 0, 0}}, | |||
| {0, {0,0,0,0,0,0,0,0}} | |||
| }; | |||
| //============================================================================== | |||
| #if BUILD_AU_CARBON_UI | |||
| @@ -287,8 +287,14 @@ public: | |||
| { | |||
| PluginBusUtilities::ScopedBusRestorer busRestorer (busUtils); | |||
| maxNumInChannels = jmin (busUtils.getBusCount (true) > 0 ? busUtils.getSupportedBusLayouts (true, 0).maxNumberOfChannels() : 0, hostOnlySupportsStereo() ? 2 : 8); | |||
| maxNumOutChannels = jmin (busUtils.getBusCount (false) > 0 ? busUtils.getSupportedBusLayouts (false, 0).maxNumberOfChannels() : 0, hostOnlySupportsStereo() ? 2 : 8); | |||
| maxNumInChannels = busUtils.getBusCount (true) > 0 ? busUtils.getSupportedBusLayouts (true, 0).maxNumberOfChannels() : 0; | |||
| maxNumOutChannels = busUtils.getBusCount (false) > 0 ? busUtils.getSupportedBusLayouts (false, 0).maxNumberOfChannels() : 0; | |||
| if (hostOnlySupportsStereo()) | |||
| { | |||
| maxNumInChannels = jmin (maxNumInChannels, 2); | |||
| maxNumOutChannels = jmin (maxNumOutChannels, 2); | |||
| } | |||
| // try setting the number of channels | |||
| if (maxNumInChannels > 0) | |||
| @@ -302,6 +308,10 @@ public: | |||
| maxNumInChannels = busUtils.findTotalNumChannels (true); | |||
| maxNumOutChannels = busUtils.findTotalNumChannels (false); | |||
| if ((busUtils.getBusCount (true) > 0 && busUtils.getDefaultLayoutForBus (true, 0) .size() > maxNumInChannels) | |||
| || (busUtils.getBusCount (false) > 0 && busUtils.getDefaultLayoutForBus (false, 0).size() > maxNumOutChannels)) | |||
| busRestorer.release(); | |||
| } | |||
| filter->setRateAndBufferSizeDetails (0, 0); | |||
| @@ -1067,8 +1077,13 @@ public: | |||
| const AudioProcessor::AudioProcessorBus& busInfo = busUtils.getFilterBus (direction).getReference (busIdx); | |||
| busInfo.name.copyToUTF8 (properties.label, (size_t) (kVstMaxLabelLen - 1)); | |||
| busInfo.name.copyToUTF8 (properties.shortLabel, (size_t) (kVstMaxShortLabelLen - 1)); | |||
| String channelName = busInfo.name; | |||
| channelName += | |||
| String (" ") + AudioChannelSet::getAbbreviatedChannelTypeName (busInfo.channels.getTypeOfChannel(index)); | |||
| channelName.copyToUTF8 (properties.label, (size_t) (kVstMaxLabelLen - 1)); | |||
| channelName.copyToUTF8 (properties.shortLabel, (size_t) (kVstMaxShortLabelLen - 1)); | |||
| properties.flags = kVstPinUseSpeaker | kVstPinIsActive; | |||
| properties.arrangementType = SpeakerMappings::channelSetToVstArrangementType (busInfo.channels); | |||
| @@ -1767,7 +1782,7 @@ private: | |||
| const PluginHostType host (getHostType ()); | |||
| // there are probably more hosts that need listing here | |||
| return host.isAbletonLive() || host.isReaper(); | |||
| return host.isAbletonLive(); | |||
| } | |||
| //============================================================================== | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVSTWrapper) | |||
| @@ -350,7 +350,11 @@ private: | |||
| case 2: | |||
| sets.add (AudioChannelSet::stereo()); | |||
| break; | |||
| case 3: | |||
| sets.add (AudioChannelSet::createLCR()); | |||
| break; | |||
| case 4: | |||
| sets.add (AudioChannelSet::createLCRS()); | |||
| sets.add (AudioChannelSet::quadraphonic()); | |||
| sets.add (AudioChannelSet::ambisonic()); | |||
| break; | |||
| @@ -28,8 +28,11 @@ bool AudioChannelSet::operator== (const AudioChannelSet& other) const noexcept | |||
| bool AudioChannelSet::operator!= (const AudioChannelSet& other) const noexcept { return channels != other.channels; } | |||
| bool AudioChannelSet::operator< (const AudioChannelSet& other) const noexcept { return channels < other.channels; } | |||
| const char* AudioChannelSet::getChannelTypeName (AudioChannelSet::ChannelType type) noexcept | |||
| String AudioChannelSet::getChannelTypeName (AudioChannelSet::ChannelType type) | |||
| { | |||
| if (type >= discreteChannel0) | |||
| return String ("Discrete ") + String (type - discreteChannel0 + 1); | |||
| switch (type) | |||
| { | |||
| case left: return NEEDS_TRANS("Left"); | |||
| @@ -63,8 +66,11 @@ const char* AudioChannelSet::getChannelTypeName (AudioChannelSet::ChannelType ty | |||
| return "Unknown"; | |||
| } | |||
| const char* AudioChannelSet::getAbbreviatedChannelTypeName (AudioChannelSet::ChannelType type) noexcept | |||
| String AudioChannelSet::getAbbreviatedChannelTypeName (AudioChannelSet::ChannelType type) | |||
| { | |||
| if (type >= discreteChannel0) | |||
| return String (type - discreteChannel0 + 1); | |||
| switch (type) | |||
| { | |||
| case left: return "L"; | |||
| @@ -151,17 +157,17 @@ AudioChannelSet AudioChannelSet::mono() { return AudioChannelSet ( | |||
| AudioChannelSet AudioChannelSet::stereo() { return AudioChannelSet ((1u << left) | (1u << right)); } | |||
| AudioChannelSet AudioChannelSet::createLCR() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre)); } | |||
| AudioChannelSet AudioChannelSet::createLCRS() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << surround)); } | |||
| AudioChannelSet AudioChannelSet::quadraphonic() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << sideLeft) | (1u << sideRight)); } | |||
| AudioChannelSet AudioChannelSet::pentagonal() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << sideLeft) | (1u << sideRight) | (1u << centre)); } | |||
| AudioChannelSet AudioChannelSet::hexagonal() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << sideLeft) | (1u << sideRight) | (1u << centre) | (1u << surround)); } | |||
| AudioChannelSet AudioChannelSet::octagonal() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << sideLeft) | (1u << sideRight) | (1u << centre) | (1u << surround) | (1u << wideLeft) | (1u << wideRight)); } | |||
| AudioChannelSet AudioChannelSet::quadraphonic() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << surroundLeft) | (1u << surroundRight)); } | |||
| AudioChannelSet AudioChannelSet::pentagonal() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << surroundLeft) | (1u << surroundRight) | (1u << centre)); } | |||
| AudioChannelSet AudioChannelSet::hexagonal() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << surroundLeft) | (1u << surroundRight) | (1u << centre) | (1u << surround)); } | |||
| AudioChannelSet AudioChannelSet::octagonal() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << surroundLeft) | (1u << surroundRight) | (1u << centre) | (1u << surround) | (1u << wideLeft) | (1u << wideRight)); } | |||
| AudioChannelSet AudioChannelSet::ambisonic() { return AudioChannelSet ((1u << ambisonicW) | (1u << ambisonicX) | (1u << ambisonicY) | (1u << ambisonicZ)); } | |||
| AudioChannelSet AudioChannelSet::create5point0() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << surroundLeft) | (1u << surroundRight)); } | |||
| AudioChannelSet AudioChannelSet::create5point1() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << subbass) | (1u << surroundLeft) | (1u << surroundRight)); } | |||
| AudioChannelSet AudioChannelSet::create6point0() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << surroundLeft) | (1u << surroundRight) | (1u << surround)); } | |||
| AudioChannelSet AudioChannelSet::create6point1() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << subbass) | (1u << surroundLeft) | (1u << surroundRight) | (1u << surround)); } | |||
| AudioChannelSet AudioChannelSet::create7point0() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << surroundLeft) | (1u << surroundRight) | (1u << topRearLeft) | (1u << topRearRight)); } | |||
| AudioChannelSet AudioChannelSet::create7point1() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << subbass) | (1u << surroundLeft) | (1u << surroundRight) | (1u << topRearLeft) | (1u << topRearRight)); } | |||
| AudioChannelSet AudioChannelSet::create7point0() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << surroundLeft) | (1u << surroundRight) | (1u << sideLeft) | (1u << sideRight)); } | |||
| AudioChannelSet AudioChannelSet::create7point1() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << subbass) | (1u << surroundLeft) | (1u << surroundRight) | (1u << sideLeft) | (1u << sideRight)); } | |||
| AudioChannelSet AudioChannelSet::createFront7point0() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << surroundLeft) | (1u << surroundRight) | (1u << centreLeft) | (1u << centreRight)); } | |||
| AudioChannelSet AudioChannelSet::createFront7point1() { return AudioChannelSet ((1u << left) | (1u << right) | (1u << centre) | (1u << subbass) | (1u << surroundLeft) | (1u << surroundRight) | (1u << centreLeft) | (1u << centreRight)); } | |||
| @@ -145,10 +145,10 @@ public: | |||
| }; | |||
| /** Returns the name of a given channel type. For example, this method may return "Surround Left". */ | |||
| static const char* getChannelTypeName (ChannelType) noexcept; | |||
| static String getChannelTypeName (ChannelType); | |||
| /** Returns the abbreviated name of a channel type. For example, this method may return "Ls". */ | |||
| static const char* getAbbreviatedChannelTypeName (ChannelType) noexcept; | |||
| static String getAbbreviatedChannelTypeName (ChannelType); | |||
| //============================================================================== | |||
| /** Adds a channel to the set. */ | |||