@@ -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. */ | |||