mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-09 23:34:20 +00:00
ARA Client: Add CMake support for creating plugins
This commit is contained in:
parent
5f4da905d7
commit
6c2881ce30
5 changed files with 176 additions and 7 deletions
|
|
@ -599,6 +599,40 @@ attributes directly to these creation functions, rather than adding them later.
|
||||||
Unlike the other `COPY_DIR` arguments, this argument does not have a default value so be sure
|
Unlike the other `COPY_DIR` arguments, this argument does not have a default value so be sure
|
||||||
to set it if you have enabled `COPY_PLUGIN_AFTER_BUILD` and the `Unity` format.
|
to set it if you have enabled `COPY_PLUGIN_AFTER_BUILD` and the `Unity` format.
|
||||||
|
|
||||||
|
`IS_ARA_EFFECT`
|
||||||
|
- May be either TRUE or FALSE (defaults to FALSE). If TRUE it enables additional codepaths in the
|
||||||
|
VST3 and AU plugin wrappers allowing compatible hosts to load the plugin with additional ARA
|
||||||
|
functionality. It will also add the preprocessor definition `JucePlugin_Enable_ARA=1`, which can
|
||||||
|
be used in preprocessor conditions inside the plugin code. You should not add this definition
|
||||||
|
using `target_compile_definitions` manually.
|
||||||
|
|
||||||
|
`ARA_FACTORY_ID`
|
||||||
|
- A globally unique and versioned identifier string. If not provided a sensible default will be
|
||||||
|
generated using the `BUNDLE_ID` and `VERSION` values. The version must be updated if e.g. the
|
||||||
|
plugin's (compatible) document archive ID(s) or its analysis or playback transformation
|
||||||
|
capabilities change.
|
||||||
|
|
||||||
|
`ARA_DOCUMENT_ARCHIVE_ID`
|
||||||
|
- Identifier string for document archives created by the document controller. This ID must be
|
||||||
|
globally unique and is shared only amongst document controllers that create the same archives and
|
||||||
|
produce the same render results based upon the same input data. This means that the ID must be
|
||||||
|
updated if the archive format changes in any way that is no longer downwards compatible. If not
|
||||||
|
provided a version independent default will be created that is only appropriate as long as the
|
||||||
|
format remains unchanged.
|
||||||
|
|
||||||
|
`ARA_ANALYSIS_TYPES`
|
||||||
|
- Defaults to having no analyzable types. Should be one or more of the following values if the
|
||||||
|
document controller has the corresponding analysis capability: `kARAContentTypeNotes`,
|
||||||
|
`kARAContentTypeTempoEntries`, `kARAContentTypeBarSignatures`, `kARAContentTypeStaticTuning `,
|
||||||
|
`kARAContentTypeKeySignatures`, `kARAContentTypeSheetChords`
|
||||||
|
|
||||||
|
`ARA_TRANSFORMATION_FLAGS`
|
||||||
|
- Defaults to `kARAPlaybackTransformationNoChanges`. If the document controller has the ability to
|
||||||
|
provide the corresponding change it should be one or more of:
|
||||||
|
`kARAPlaybackTransformationTimestretch`, `kARAPlaybackTransformationTimestretchReflectingTempo`,
|
||||||
|
`kARAPlaybackTransformationContentBasedFadeAtTail`,
|
||||||
|
`kARAPlaybackTransformationContentBasedFadeAtHead`
|
||||||
|
|
||||||
#### `juce_add_binary_data`
|
#### `juce_add_binary_data`
|
||||||
|
|
||||||
juce_add_binary_data(<name>
|
juce_add_binary_data(<name>
|
||||||
|
|
|
||||||
|
|
@ -1230,7 +1230,13 @@ function(_juce_configure_plugin_targets target)
|
||||||
JucePlugin_AAXDisableBypass=$<BOOL:$<TARGET_PROPERTY:${target},JUCE_DISABLE_AAX_BYPASS>>
|
JucePlugin_AAXDisableBypass=$<BOOL:$<TARGET_PROPERTY:${target},JUCE_DISABLE_AAX_BYPASS>>
|
||||||
JucePlugin_AAXDisableMultiMono=$<BOOL:$<TARGET_PROPERTY:${target},JUCE_DISABLE_AAX_MULTI_MONO>>
|
JucePlugin_AAXDisableMultiMono=$<BOOL:$<TARGET_PROPERTY:${target},JUCE_DISABLE_AAX_MULTI_MONO>>
|
||||||
JucePlugin_VSTNumMidiInputs=$<TARGET_PROPERTY:${target},JUCE_VST_NUM_MIDI_INS>
|
JucePlugin_VSTNumMidiInputs=$<TARGET_PROPERTY:${target},JUCE_VST_NUM_MIDI_INS>
|
||||||
JucePlugin_VSTNumMidiOutputs=$<TARGET_PROPERTY:${target},JUCE_VST_NUM_MIDI_OUTS>)
|
JucePlugin_VSTNumMidiOutputs=$<TARGET_PROPERTY:${target},JUCE_VST_NUM_MIDI_OUTS>
|
||||||
|
JucePlugin_Enable_ARA=$<BOOL:$<TARGET_PROPERTY:${target},JUCE_IS_ARA_EFFECT>>
|
||||||
|
JucePlugin_ARAFactoryID=$<TARGET_PROPERTY:${target},JUCE_ARA_FACTORY_ID>
|
||||||
|
JucePlugin_ARADocumentArchiveID=$<TARGET_PROPERTY:${target},JUCE_ARA_DOCUMENT_ARCHIVE_ID>
|
||||||
|
JucePlugin_ARACompatibleArchiveIDs=$<TARGET_PROPERTY:${target},JUCE_ARA_COMPATIBLE_ARCHIVE_IDS>
|
||||||
|
JucePlugin_ARAContentTypes=$<TARGET_PROPERTY:${target},JUCE_ARA_ANALYSIS_TYPES>
|
||||||
|
JucePlugin_ARATransformationFlags=$<TARGET_PROPERTY:${target},JUCE_ARA_TRANSFORMATION_FLAGS>)
|
||||||
|
|
||||||
set_target_properties(${target} PROPERTIES
|
set_target_properties(${target} PROPERTIES
|
||||||
POSITION_INDEPENDENT_CODE TRUE
|
POSITION_INDEPENDENT_CODE TRUE
|
||||||
|
|
@ -1511,6 +1517,84 @@ function(_juce_set_fallback_properties target)
|
||||||
get_target_property(plugin_name ${target} JUCE_PLUGIN_NAME)
|
get_target_property(plugin_name ${target} JUCE_PLUGIN_NAME)
|
||||||
string(MAKE_C_IDENTIFIER "${plugin_name}" plugin_name_sanitised)
|
string(MAKE_C_IDENTIFIER "${plugin_name}" plugin_name_sanitised)
|
||||||
_juce_set_property_if_not_set(${target} LV2URI "${company_website}/plugins/${plugin_name_sanitised}")
|
_juce_set_property_if_not_set(${target} LV2URI "${company_website}/plugins/${plugin_name_sanitised}")
|
||||||
|
|
||||||
|
# ARA configuration
|
||||||
|
# Analysis types
|
||||||
|
set(ara_analysis_type_strings
|
||||||
|
kARAContentTypeNotes
|
||||||
|
kARAContentTypeTempoEntries
|
||||||
|
kARAContentTypeBarSignatures
|
||||||
|
kARAContentTypeStaticTuning
|
||||||
|
kARAContentTypeKeySignatures
|
||||||
|
kARAContentTypeSheetChords)
|
||||||
|
|
||||||
|
get_target_property(actual_ara_analysis_types ${target} JUCE_ARA_ANALYSIS_TYPES)
|
||||||
|
|
||||||
|
set(ara_analysis_types_int "")
|
||||||
|
|
||||||
|
foreach(category_string IN LISTS actual_ara_analysis_types)
|
||||||
|
list(FIND ara_analysis_type_strings ${category_string} ara_index)
|
||||||
|
|
||||||
|
if(ara_index GREATER_EQUAL 0)
|
||||||
|
set(ara_analysis_types_bit "1 << ${ara_index}")
|
||||||
|
|
||||||
|
if(ara_analysis_types_int STREQUAL "")
|
||||||
|
set(ara_analysis_types_int 0)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
math(EXPR ara_analysis_types_int "${ara_analysis_types_int} | (${ara_analysis_types_bit})")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(NOT ara_analysis_types_int STREQUAL "")
|
||||||
|
set_target_properties(${target} PROPERTIES JUCE_ARA_ANALYSIS_TYPES ${ara_analysis_types_int})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
_juce_set_property_if_not_set(${target} ARA_ANALYSIS_TYPES 0)
|
||||||
|
|
||||||
|
# Transformation flags
|
||||||
|
set(ara_transformation_flags_strings
|
||||||
|
kARAPlaybackTransformationNoChanges
|
||||||
|
kARAPlaybackTransformationTimestretch
|
||||||
|
kARAPlaybackTransformationTimestretchReflectingTempo
|
||||||
|
kARAPlaybackTransformationContentBasedFadeAtTail
|
||||||
|
kARAPlaybackTransformationContentBasedFadeAtHead)
|
||||||
|
|
||||||
|
set(default_ara_transformation_flags kARAPlaybackTransformationNoChanges)
|
||||||
|
|
||||||
|
_juce_set_property_if_not_set(${target} ARA_TRANSFORMATION_FLAGS ${default_ara_transformation_flags})
|
||||||
|
|
||||||
|
get_target_property(actual_ara_transformation_flags ${target} JUCE_ARA_TRANSFORMATION_FLAGS)
|
||||||
|
|
||||||
|
set(ara_transformation_flags_int "")
|
||||||
|
|
||||||
|
foreach(transformation_string IN LISTS actual_ara_transformation_flags)
|
||||||
|
list(FIND ara_transformation_flags_strings ${transformation_string} ara_transformation_index)
|
||||||
|
|
||||||
|
if(ara_transformation_index GREATER_EQUAL 0)
|
||||||
|
if(ara_transformation_index EQUAL 0)
|
||||||
|
set(ara_transformation_bit 0)
|
||||||
|
else()
|
||||||
|
set(ara_transformation_bit "1 << (${ara_transformation_index} - 1)")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(ara_transformation_flags_int STREQUAL "")
|
||||||
|
set(ara_transformation_flags_int 0)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
math(EXPR ara_transformation_flags_int "${ara_transformation_flags_int} | (${ara_transformation_bit})")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(NOT ara_transformation_flags_int STREQUAL "")
|
||||||
|
set_target_properties(${target} PROPERTIES JUCE_ARA_TRANSFORMATION_FLAGS ${ara_transformation_flags_int})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
_juce_set_property_if_not_set(${target} IS_ARA_EFFECT FALSE)
|
||||||
|
get_target_property(final_bundle_id ${target} JUCE_BUNDLE_ID)
|
||||||
|
_juce_set_property_if_not_set(${target} ARA_FACTORY_ID "\"${final_bundle_id}.arafactory.${final_version}\"")
|
||||||
|
_juce_set_property_if_not_set(${target} ARA_DOCUMENT_ARCHIVE_ID "\"${final_bundle_id}.aradocumentarchive.1\"")
|
||||||
|
_juce_set_property_if_not_set(${target} ARA_COMPATIBLE_ARCHIVE_IDS "\"\"")
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# ==================================================================================================
|
# ==================================================================================================
|
||||||
|
|
@ -1578,6 +1662,9 @@ function(_juce_initialise_target target)
|
||||||
PLUGINHOST_AU # Set this true if you want to host AU plugins
|
PLUGINHOST_AU # Set this true if you want to host AU plugins
|
||||||
USE_LEGACY_COMPATIBILITY_PLUGIN_CODE
|
USE_LEGACY_COMPATIBILITY_PLUGIN_CODE
|
||||||
LV2URI
|
LV2URI
|
||||||
|
IS_ARA_EFFECT
|
||||||
|
ARA_FACTORY_ID
|
||||||
|
ARA_DOCUMENT_ARCHIVE_ID
|
||||||
|
|
||||||
VST_COPY_DIR
|
VST_COPY_DIR
|
||||||
VST3_COPY_DIR
|
VST3_COPY_DIR
|
||||||
|
|
@ -1599,7 +1686,10 @@ function(_juce_initialise_target target)
|
||||||
AAX_CATEGORY
|
AAX_CATEGORY
|
||||||
IPHONE_SCREEN_ORIENTATIONS # iOS only
|
IPHONE_SCREEN_ORIENTATIONS # iOS only
|
||||||
IPAD_SCREEN_ORIENTATIONS # iOS only
|
IPAD_SCREEN_ORIENTATIONS # iOS only
|
||||||
APP_GROUP_IDS) # iOS only
|
APP_GROUP_IDS # iOS only
|
||||||
|
ARA_COMPATIBLE_ARCHIVE_IDS
|
||||||
|
ARA_ANALYSIS_TYPES
|
||||||
|
ARA_TRANSFORMATION_FLAGS)
|
||||||
|
|
||||||
cmake_parse_arguments(JUCE_ARG "" "${one_value_args}" "${multi_value_args}" ${ARGN})
|
cmake_parse_arguments(JUCE_ARG "" "${one_value_args}" "${multi_value_args}" ${ARGN})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -320,6 +320,13 @@ namespace build_tools
|
||||||
addPlistDictionaryKey (*resourceUsageDict, "temporary-exception.files.all.read-write", true);
|
addPlistDictionaryKey (*resourceUsageDict, "temporary-exception.files.all.read-write", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isPluginARAEffect)
|
||||||
|
{
|
||||||
|
dict->createNewChildElement ("key")->addTextElement ("tags");
|
||||||
|
auto* tagsArray = dict->createNewChildElement ("array");
|
||||||
|
tagsArray->createNewChildElement ("string")->addTextElement ("ARA");
|
||||||
|
}
|
||||||
|
|
||||||
return { plistKey, plistEntry };
|
return { plistKey, plistEntry };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -86,6 +86,7 @@ namespace build_tools
|
||||||
bool isAuSandboxSafe = false;
|
bool isAuSandboxSafe = false;
|
||||||
bool isPluginSynth = false;
|
bool isPluginSynth = false;
|
||||||
bool suppressResourceUsage = false;
|
bool suppressResourceUsage = false;
|
||||||
|
bool isPluginARAEffect = false;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void write (MemoryOutputStream&) const;
|
void write (MemoryOutputStream&) const;
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ namespace build_tools
|
||||||
virtual bool isGUIApplication() const { return false; }
|
virtual bool isGUIApplication() const { return false; }
|
||||||
virtual bool isCommandLineApp() const { return false; }
|
virtual bool isCommandLineApp() const { return false; }
|
||||||
virtual bool isAudioPlugin() const { return false; }
|
virtual bool isAudioPlugin() const { return false; }
|
||||||
|
virtual bool isARAAudioPlugin() const { return false; }
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
struct Target
|
struct Target
|
||||||
|
|
@ -111,8 +112,7 @@ namespace build_tools
|
||||||
case SharedCodeTarget: return "Shared Code";
|
case SharedCodeTarget: return "Shared Code";
|
||||||
case AggregateTarget: return "All";
|
case AggregateTarget: return "All";
|
||||||
case LV2TurtleProgram: return "LV2 Manifest Helper";
|
case LV2TurtleProgram: return "LV2 Manifest Helper";
|
||||||
case unspecified:
|
case unspecified: break;
|
||||||
default: break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return "undefined";
|
return "undefined";
|
||||||
|
|
@ -160,7 +160,7 @@ namespace build_tools
|
||||||
case LV2TurtleProgram: return executable;
|
case LV2TurtleProgram: return executable;
|
||||||
case AggregateTarget:
|
case AggregateTarget:
|
||||||
case unspecified:
|
case unspecified:
|
||||||
default: break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return unknown;
|
return unknown;
|
||||||
|
|
@ -252,7 +252,43 @@ namespace build_tools
|
||||||
case Target::StaticLibrary:
|
case Target::StaticLibrary:
|
||||||
case Target::DynamicLibrary:
|
case Target::DynamicLibrary:
|
||||||
case Target::unspecified:
|
case Target::unspecified:
|
||||||
default:
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ProjectType_ARAAudioPlugin : public ProjectType
|
||||||
|
{
|
||||||
|
ProjectType_ARAAudioPlugin() : ProjectType (getTypeName(), "ARA Audio Plug-in") {}
|
||||||
|
|
||||||
|
static const char* getTypeName() noexcept { return "araaudioplug"; }
|
||||||
|
bool isAudioPlugin() const override { return true; }
|
||||||
|
bool isARAAudioPlugin() const override { return true; }
|
||||||
|
|
||||||
|
bool supportsTargetType (Target::Type targetType) const override
|
||||||
|
{
|
||||||
|
switch (targetType)
|
||||||
|
{
|
||||||
|
case Target::VSTPlugIn:
|
||||||
|
case Target::VST3PlugIn:
|
||||||
|
case Target::AAXPlugIn:
|
||||||
|
case Target::AudioUnitPlugIn:
|
||||||
|
case Target::AudioUnitv3PlugIn:
|
||||||
|
case Target::StandalonePlugIn:
|
||||||
|
case Target::UnityPlugIn:
|
||||||
|
case Target::SharedCodeTarget:
|
||||||
|
case Target::AggregateTarget:
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case Target::GUIApp:
|
||||||
|
case Target::ConsoleApp:
|
||||||
|
case Target::StaticLibrary:
|
||||||
|
case Target::DynamicLibrary:
|
||||||
|
case Target::unspecified:
|
||||||
|
case Target::LV2PlugIn:
|
||||||
|
case Target::LV2TurtleProgram:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -268,8 +304,9 @@ namespace build_tools
|
||||||
static ProjectType_StaticLibrary staticLib;
|
static ProjectType_StaticLibrary staticLib;
|
||||||
static ProjectType_DLL dll;
|
static ProjectType_DLL dll;
|
||||||
static ProjectType_AudioPlugin plugin;
|
static ProjectType_AudioPlugin plugin;
|
||||||
|
static ProjectType_ARAAudioPlugin araplugin;
|
||||||
|
|
||||||
return Array<ProjectType*>(&guiApp, &consoleApp, &staticLib, &dll, &plugin);
|
return Array<ProjectType*>(&guiApp, &consoleApp, &staticLib, &dll, &plugin, &araplugin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue