From ca47dc66a3e20126c651f57ab0df395644eeab1f Mon Sep 17 00:00:00 2001 From: reuk Date: Tue, 7 Feb 2023 19:05:57 +0000 Subject: [PATCH] Projucer: Add inter-app-audio entitlement to iOS AU hosts --- .../utils/juce_Entitlements.cpp | 2 +- .../utils/juce_Entitlements.h | 1 + .../Projucer/Source/Project/jucer_Project.cpp | 29 +++++++++++++------ .../Projucer/Source/Project/jucer_Project.h | 19 ++++++++---- .../ProjectSaving/jucer_ProjectExport_Xcode.h | 8 +++-- 5 files changed, 41 insertions(+), 18 deletions(-) diff --git a/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp b/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp index 45f94461a84a..c41b4db0b28b 100644 --- a/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp +++ b/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp @@ -49,7 +49,7 @@ namespace build_tools if (isiOS) { - if (isAudioPluginProject && shouldEnableIAA) + if ((isAudioPluginProject && shouldEnableIAA) || isAUPluginHost) entitlements.set ("inter-app-audio", ""); if (isiCloudPermissionsEnabled) diff --git a/extras/Build/juce_build_tools/utils/juce_Entitlements.h b/extras/Build/juce_build_tools/utils/juce_Entitlements.h index b91a52a6906e..144999830157 100644 --- a/extras/Build/juce_build_tools/utils/juce_Entitlements.h +++ b/extras/Build/juce_build_tools/utils/juce_Entitlements.h @@ -36,6 +36,7 @@ namespace build_tools bool isiOS = false; bool isAudioPluginProject = false; bool shouldEnableIAA = false; + bool isAUPluginHost = false; bool isiCloudPermissionsEnabled = false; bool isPushNotificationsEnabled = false; bool isAppGroupsEnabled = false; diff --git a/extras/Projucer/Source/Project/jucer_Project.cpp b/extras/Projucer/Source/Project/jucer_Project.cpp index 6f350c4be49a..3e4c025831b8 100644 --- a/extras/Projucer/Source/Project/jucer_Project.cpp +++ b/extras/Projucer/Source/Project/jucer_Project.cpp @@ -103,6 +103,7 @@ Project::Project (const File& f) setFile (f); + createEnabledModulesList(); initialiseProjectValues(); initialiseMainGroup(); initialiseAudioPluginValues(); @@ -677,6 +678,7 @@ Result Project::loadDocument (const File& file) projectRoot = newTree; projectRoot.addListener (this); + createEnabledModulesList(); initialiseProjectValues(); initialiseMainGroup(); initialiseAudioPluginValues(); @@ -2324,27 +2326,27 @@ int Project::getARATransformationFlags() const noexcept } //============================================================================== -bool Project::isAUPluginHost() +bool Project::isAUPluginHost() const { return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_AU", false); } -bool Project::isVSTPluginHost() +bool Project::isVSTPluginHost() const { return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST", false); } -bool Project::isVST3PluginHost() +bool Project::isVST3PluginHost() const { return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3", false); } -bool Project::isLV2PluginHost() +bool Project::isLV2PluginHost() const { return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_LV2", false); } -bool Project::isARAPluginHost() +bool Project::isARAPluginHost() const { return (isVST3PluginHost() || isAUPluginHost()) && isConfigFlagEnabled ("JUCE_PLUGINHOST_ARA", false); } @@ -2505,12 +2507,21 @@ Array Project::getDefaultARATransformationFlags() const noexcept } //============================================================================== -EnabledModulesList& Project::getEnabledModules() +template +auto& Project::getEnabledModulesImpl (This& t) { - if (enabledModulesList == nullptr) - enabledModulesList.reset (new EnabledModulesList (*this, projectRoot.getOrCreateChildWithName (Ids::MODULES, nullptr))); + // This won't work until you've loaded a project! + jassert (t.enabledModulesList != nullptr); - return *enabledModulesList; + return *t.enabledModulesList; +} + + EnabledModulesList& Project::getEnabledModules() { return getEnabledModulesImpl (*this); } +const EnabledModulesList& Project::getEnabledModules() const { return getEnabledModulesImpl (*this); } + +void Project::createEnabledModulesList() +{ + enabledModulesList = std::make_unique (*this, projectRoot.getOrCreateChildWithName (Ids::MODULES, nullptr)); } static StringArray getModulePathsFromExporters (Project& project, bool onlyThisOS) diff --git a/extras/Projucer/Source/Project/jucer_Project.h b/extras/Projucer/Source/Project/jucer_Project.h index ae976c1e81d4..e23f50269dc4 100644 --- a/extras/Projucer/Source/Project/jucer_Project.h +++ b/extras/Projucer/Source/Project/jucer_Project.h @@ -339,11 +339,11 @@ class Project : public FileBasedDocument, String getLV2URI() const { return pluginLV2URIValue.get(); } //============================================================================== - bool isAUPluginHost(); - bool isVSTPluginHost(); - bool isVST3PluginHost(); - bool isLV2PluginHost(); - bool isARAPluginHost(); + bool isAUPluginHost() const; + bool isVSTPluginHost() const; + bool isVST3PluginHost() const; + bool isLV2PluginHost() const; + bool isARAPluginHost() const; //============================================================================== bool shouldBuildTargetType (build_tools::ProjectType::Target::Type targetType) const noexcept; @@ -494,7 +494,10 @@ class Project : public FileBasedDocument, bool isConfigFlagEnabled (const String& name, bool defaultIsEnabled = false) const; //============================================================================== - EnabledModulesList& getEnabledModules(); + void createEnabledModulesList(); + + EnabledModulesList& getEnabledModules(); + const EnabledModulesList& getEnabledModules() const; AvailableModulesList& getExporterPathsModulesList() { return exporterPathsModulesList; } void rescanExporterPathModules (bool async = false); @@ -547,6 +550,10 @@ class Project : public FileBasedDocument, void valueTreeChildRemoved (ValueTree&, ValueTree&, int) override; void valueTreeChildOrderChanged (ValueTree&, int, int) override; + //============================================================================== + template + static auto& getEnabledModulesImpl (This&); + //============================================================================== struct ProjectFileModificationPoller : private Timer { diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index 3d29ce30eee4..95aaa9fcbc1c 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -1316,7 +1316,9 @@ class XcodeProjectExporter : public ProjectExporter capabilities["ApplicationGroups.iOS"] = owner.iOS && owner.isAppGroupsEnabled(); capabilities["InAppPurchase"] = owner.isInAppPurchasesEnabled(); - capabilities["InterAppAudio"] = owner.iOS && type == Target::StandalonePlugIn && owner.getProject().shouldEnableIAA(); + capabilities["InterAppAudio"] = owner.iOS && ((type == Target::StandalonePlugIn + && owner.getProject().shouldEnableIAA()) + || owner.getProject().isAUPluginHost()); capabilities["Push"] = owner.isPushNotificationsEnabled(); capabilities["Sandbox"] = type == Target::AudioUnitv3PlugIn || owner.isAppSandboxEnabled(); capabilities["HardenedRuntime"] = owner.isHardenedRuntimeEnabled(); @@ -1377,7 +1379,8 @@ class XcodeProjectExporter : public ProjectExporter || owner.isAppSandboxEnabled() || owner.isHardenedRuntimeEnabled() || owner.isNetworkingMulticastEnabled() - || (owner.isiOS() && owner.isiCloudPermissionsEnabled())) + || (owner.isiOS() && owner.isiCloudPermissionsEnabled()) + || (owner.isiOS() && owner.getProject().isAUPluginHost())) return true; if (owner.project.isAudioPluginProject() @@ -3155,6 +3158,7 @@ class XcodeProjectExporter : public ProjectExporter options.isiOS = isiOS(); options.isAudioPluginProject = project.isAudioPluginProject(); options.shouldEnableIAA = project.shouldEnableIAA(); + options.isAUPluginHost = project.isAUPluginHost(); options.isiCloudPermissionsEnabled = isiCloudPermissionsEnabled(); options.isPushNotificationsEnabled = isPushNotificationsEnabled(); options.isAppGroupsEnabled = isAppGroupsEnabled();