Skip to content

Commit

Permalink
Projucer: Add inter-app-audio entitlement to iOS AU hosts
Browse files Browse the repository at this point in the history
  • Loading branch information
reuk committed Feb 9, 2023
1 parent d54f7ab commit ca47dc6
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 18 deletions.
2 changes: 1 addition & 1 deletion extras/Build/juce_build_tools/utils/juce_Entitlements.cpp
Expand Up @@ -49,7 +49,7 @@ namespace build_tools

if (isiOS)
{
if (isAudioPluginProject && shouldEnableIAA)
if ((isAudioPluginProject && shouldEnableIAA) || isAUPluginHost)
entitlements.set ("inter-app-audio", "<true/>");

if (isiCloudPermissionsEnabled)
Expand Down
1 change: 1 addition & 0 deletions extras/Build/juce_build_tools/utils/juce_Entitlements.h
Expand Up @@ -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;
Expand Down
29 changes: 20 additions & 9 deletions extras/Projucer/Source/Project/jucer_Project.cpp
Expand Up @@ -103,6 +103,7 @@ Project::Project (const File& f)

setFile (f);

createEnabledModulesList();
initialiseProjectValues();
initialiseMainGroup();
initialiseAudioPluginValues();
Expand Down Expand Up @@ -677,6 +678,7 @@ Result Project::loadDocument (const File& file)
projectRoot = newTree;
projectRoot.addListener (this);

createEnabledModulesList();
initialiseProjectValues();
initialiseMainGroup();
initialiseAudioPluginValues();
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -2505,12 +2507,21 @@ Array<var> Project::getDefaultARATransformationFlags() const noexcept
}

//==============================================================================
EnabledModulesList& Project::getEnabledModules()
template <typename This>
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<EnabledModulesList> (*this, projectRoot.getOrCreateChildWithName (Ids::MODULES, nullptr));
}

static StringArray getModulePathsFromExporters (Project& project, bool onlyThisOS)
Expand Down
19 changes: 13 additions & 6 deletions extras/Projucer/Source/Project/jucer_Project.h
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -547,6 +550,10 @@ class Project : public FileBasedDocument,
void valueTreeChildRemoved (ValueTree&, ValueTree&, int) override;
void valueTreeChildOrderChanged (ValueTree&, int, int) override;

//==============================================================================
template <typename This>
static auto& getEnabledModulesImpl (This&);

//==============================================================================
struct ProjectFileModificationPoller : private Timer
{
Expand Down
Expand Up @@ -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();
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit ca47dc6

Please sign in to comment.