Browse Source

Fix various multi-bus issues and add support for consistent surround channel ordering

tags/2021-05-28
hogliux 9 years ago
parent
commit
a53eda27d4
40 changed files with 8806 additions and 60 deletions
  1. +18
    -4
      examples/PlugInSamples/Arpeggiator/Source/Arpeggiator.cpp
  2. +17
    -3
      examples/PlugInSamples/GainPlugIn/Source/GainProcessor.cpp
  3. +20
    -6
      examples/PlugInSamples/GenericEditor.h
  4. +17
    -3
      examples/PlugInSamples/MultiOutSynth/Source/MultiOutSynth.cpp
  5. +20
    -6
      examples/PlugInSamples/NoiseGate/Source/NoiseGate.cpp
  6. +17
    -3
      examples/PlugInSamples/Spatializer/Source/Spatializer.cpp
  7. +172
    -0
      examples/PlugInSamples/Surround/Builds/LinuxMakefile/Makefile
  8. +46
    -0
      examples/PlugInSamples/Surround/Builds/MacOSX/Info.plist
  9. BIN
      examples/PlugInSamples/Surround/Builds/MacOSX/RecentFilesMenuTemplate.nib
  10. +2399
    -0
      examples/PlugInSamples/Surround/Builds/MacOSX/Surround.xcodeproj/project.pbxproj
  11. +19
    -0
      examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.sln
  12. +1813
    -0
      examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj
  13. +3113
    -0
      examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj.filters
  14. +29
    -0
      examples/PlugInSamples/Surround/Builds/VisualStudio2015/resources.rc
  15. +334
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/AppConfig.h
  16. +47
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/JuceHeader.h
  17. +12
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/ReadMe.txt
  18. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h
  19. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h
  20. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h
  21. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h
  22. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h
  23. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_core/juce_core.h
  24. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.h
  25. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h
  26. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_events/juce_events.h
  27. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_graphics/juce_graphics.h
  28. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h
  29. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.h
  30. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_opengl/juce_opengl.h
  31. +4
    -0
      examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_video/juce_video.h
  32. +123
    -0
      examples/PlugInSamples/Surround/Source/SurroundEditor.h
  33. +133
    -0
      examples/PlugInSamples/Surround/Source/SurroundProcessor.cpp
  34. +115
    -0
      examples/PlugInSamples/Surround/Surround.jucer
  35. +91
    -11
      modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp
  36. +155
    -9
      modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm
  37. +20
    -5
      modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp
  38. +4
    -0
      modules/juce_audio_plugin_client/utility/juce_PluginBusUtilities.h
  39. +14
    -8
      modules/juce_audio_processors/processors/juce_AudioChannelSet.cpp
  40. +2
    -2
      modules/juce_audio_processors/processors/juce_AudioChannelSet.h

+ 18
- 4
examples/PlugInSamples/Arpeggiator/Source/Arpeggiator.cpp View File

@@ -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"


+ 17
- 3
examples/PlugInSamples/GainPlugIn/Source/GainProcessor.cpp View File

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


+ 20
- 6
examples/PlugInSamples/GenericEditor.h View File

@@ -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,


+ 17
- 3
examples/PlugInSamples/MultiOutSynth/Source/MultiOutSynth.cpp View File

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


+ 20
- 6
examples/PlugInSamples/NoiseGate/Source/NoiseGate.cpp View File

@@ -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"


+ 17
- 3
examples/PlugInSamples/Spatializer/Source/Spatializer.cpp View File

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


+ 172
- 0
examples/PlugInSamples/Surround/Builds/LinuxMakefile/Makefile View File

@@ -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)

+ 46
- 0
examples/PlugInSamples/Surround/Builds/MacOSX/Info.plist View File

@@ -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>

BIN
examples/PlugInSamples/Surround/Builds/MacOSX/RecentFilesMenuTemplate.nib View File


+ 2399
- 0
examples/PlugInSamples/Surround/Builds/MacOSX/Surround.xcodeproj/project.pbxproj
File diff suppressed because it is too large
View File


+ 19
- 0
examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.sln View File

@@ -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

+ 1813
- 0
examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj
File diff suppressed because it is too large
View File


+ 3113
- 0
examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj.filters
File diff suppressed because it is too large
View File


+ 29
- 0
examples/PlugInSamples/Surround/Builds/VisualStudio2015/resources.rc View File

@@ -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

+ 334
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/AppConfig.h View File

@@ -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__

+ 47
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/JuceHeader.h View File

@@ -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__

+ 12
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/ReadMe.txt View File

@@ -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).

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_core/juce_core.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_events/juce_events.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_graphics/juce_graphics.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_opengl/juce_opengl.h View File

@@ -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"

+ 4
- 0
examples/PlugInSamples/Surround/JuceLibraryCode/modules/juce_video/juce_video.h View File

@@ -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"

+ 123
- 0
examples/PlugInSamples/Surround/Source/SurroundEditor.h View File

@@ -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;
};

+ 133
- 0
examples/PlugInSamples/Surround/Source/SurroundProcessor.cpp View File

@@ -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();
}

+ 115
- 0
examples/PlugInSamples/Surround/Surround.jucer View File

@@ -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="&#13;&#10;# This script takes the build product and copies it to the AU, VST, VST3, RTAS and AAX folders, depending on &#13;&#10;# which plugin types you've built&#13;&#10;&#13;&#10;original=$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME&#13;&#10;&#13;&#10;# this looks inside the binary to detect which platforms are needed.. &#13;&#10;copyAU=&#96;nm -g &quot;$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH&quot; | grep -i 'AudioUnit' | wc -l&#96;&#13;&#10;copyVST=&#96;nm -g &quot;$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH&quot; | grep -i 'VSTPlugin' | wc -l&#96;&#13;&#10;copyVST3=&#96;nm -g &quot;$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH&quot; | grep -i 'GetPluginFactory' | wc -l&#96;&#13;&#10;copyRTAS=&#96;nm -g &quot;$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH&quot; | grep -i 'CProcess' | wc -l&#96;&#13;&#10;copyAAX=&#96;nm -g &quot;$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH&quot; | grep -i 'ACFStartup' | wc -l&#96;&#13;&#10;&#13;&#10;if [ $copyAU -gt 0 ]; then&#13;&#10; echo &quot;Copying to AudioUnit folder...&quot;&#13;&#10; AUDir=~/Library/Audio/Plug-Ins/Components&#13;&#10; mkdir -p &quot;$AUDir&quot;&#13;&#10; AU=$AUDir/$PRODUCT_NAME.component&#13;&#10; if [ -d &quot;$AU&quot; ]; then &#13;&#10; rm -r &quot;$AU&quot;&#13;&#10; fi&#13;&#10;&#13;&#10; cp -r &quot;$original&quot; &quot;$AU&quot;&#13;&#10; sed -i &quot;&quot; -e 's/TDMwPTul/BNDLPTul/g' &quot;$AU/Contents/PkgInfo&quot;&#13;&#10; sed -i &quot;&quot; -e 's/TDMw/BNDL/g' &quot;$AU/Contents/$INFOPLIST_FILE&quot;&#13;&#10;fi&#13;&#10;&#13;&#10;if [ $copyVST -gt 0 ]; then&#13;&#10; echo &quot;Copying to VST folder...&quot;&#13;&#10; VSTDir=~/Library/Audio/Plug-Ins/VST&#13;&#10; mkdir -p &quot;$VSTDir&quot;&#13;&#10; VST=$VSTDir/$PRODUCT_NAME.vst&#13;&#10; if [ -d &quot;$VST&quot; ]; then &#13;&#10; rm -r &quot;$VST&quot;&#13;&#10; fi&#13;&#10;&#13;&#10; cp -r &quot;$original&quot; &quot;$VST&quot;&#13;&#10; sed -i &quot;&quot; -e 's/TDMwPTul/BNDLPTul/g' &quot;$VST/Contents/PkgInfo&quot;&#13;&#10; sed -i &quot;&quot; -e 's/TDMw/BNDL/g' &quot;$VST/Contents/$INFOPLIST_FILE&quot;&#13;&#10;fi&#13;&#10;&#13;&#10;if [ $copyVST3 -gt 0 ]; then&#13;&#10; echo &quot;Copying to VST3 folder...&quot;&#13;&#10; VST3Dir=~/Library/Audio/Plug-Ins/VST3&#13;&#10; mkdir -p &quot;$VST3Dir&quot;&#13;&#10; VST3=$VST3Dir/$PRODUCT_NAME.vst3&#13;&#10; if [ -d &quot;$VST3&quot; ]; then &#13;&#10; rm -r &quot;$VST3&quot;&#13;&#10; fi&#13;&#10;&#13;&#10; cp -r &quot;$original&quot; &quot;$VST3&quot;&#13;&#10; sed -i &quot;&quot; -e 's/TDMwPTul/BNDLPTul/g' &quot;$VST3/Contents/PkgInfo&quot;&#13;&#10; sed -i &quot;&quot; -e 's/TDMw/BNDL/g' &quot;$VST3/Contents/$INFOPLIST_FILE&quot;&#13;&#10;fi&#13;&#10;&#13;&#10;if [ $copyRTAS -gt 0 ]; then&#13;&#10; echo &quot;Copying to RTAS folder...&quot;&#13;&#10; RTASDir=/Library/Application\ Support/Digidesign/Plug-Ins&#13;&#10; if [ -d &quot;$RTASDir&quot; ]; then&#13;&#10; RTAS=$RTASDir/$PRODUCT_NAME.dpm&#13;&#10; if [ -d &quot;$RTAS&quot; ]; then&#13;&#10; rm -r &quot;$RTAS&quot;&#13;&#10; fi&#13;&#10;&#13;&#10; cp -r &quot;$original&quot; &quot;$RTAS&quot;&#13;&#10; fi&#13;&#10;fi&#13;&#10;&#13;&#10;if [ $copyAAX -gt 0 ]; then&#13;&#10; echo &quot;Copying to AAX folder...&quot;&#13;&#10;&#13;&#10; if [ -d &quot;/Applications/ProTools_3PDev/Plug-Ins&quot; ]; then&#13;&#10; AAX1=&quot;/Applications/ProTools_3PDev/Plug-Ins/$PRODUCT_NAME.aaxplugin&quot;&#13;&#10;&#13;&#10; if [ -d &quot;$AAX1&quot; ]; then&#13;&#10; rm -r &quot;$AAX1&quot;&#13;&#10; fi&#13;&#10;&#13;&#10; cp -R -H &quot;$original&quot; &quot;$AAX1&quot;&#13;&#10; fi&#13;&#10;&#13;&#10; if [ -d &quot;/Library/Application Support/Avid/Audio/Plug-Ins&quot; ]; then&#13;&#10; AAX2=&quot;/Library/Application Support/Avid/Audio/Plug-Ins/$PRODUCT_NAME.aaxplugin&quot;&#13;&#10;&#13;&#10; if [ -d &quot;$AAX2&quot; ]; then&#13;&#10; rm -r &quot;$AAX2&quot;&#13;&#10; fi&#13;&#10;&#13;&#10; cp -R -H &quot;$original&quot; &quot;$AAX2&quot;&#13;&#10; fi&#13;&#10;fi&#13;&#10;"
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>

+ 91
- 11
modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp View File

@@ -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)


+ 155
- 9
modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm View File

@@ -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


+ 20
- 5
modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp View File

@@ -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)


+ 4
- 0
modules/juce_audio_plugin_client/utility/juce_PluginBusUtilities.h View File

@@ -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;


+ 14
- 8
modules/juce_audio_processors/processors/juce_AudioChannelSet.cpp View File

@@ -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)); }


+ 2
- 2
modules/juce_audio_processors/processors/juce_AudioChannelSet.h View File

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


Loading…
Cancel
Save