From a785276e02c3f8620ca4047baed68f733b031906 Mon Sep 17 00:00:00 2001 From: Cody Roberts Date: Sun, 15 Oct 2023 14:06:11 -0400 Subject: [PATCH] Add project settings for AVAudioSessionCategory on iOS Co-authored-by: Georg Wacker (cherry picked from commit 739d27ae40950b2884be02b80e94203b8c1559c7) --- core/project_settings.cpp | 4 ++++ doc/classes/ProjectSettings.xml | 7 +++++++ platform/iphone/app_delegate.mm | 33 +++++++++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/core/project_settings.cpp b/core/project_settings.cpp index 03f0ef840d..d43430edb0 100644 --- a/core/project_settings.cpp +++ b/core/project_settings.cpp @@ -1089,6 +1089,10 @@ ProjectSettings::ProjectSettings() { GLOBAL_DEF("audio/default_bus_layout", "res://default_bus_layout.tres"); custom_prop_info["audio/default_bus_layout"] = PropertyInfo(Variant::STRING, "audio/default_bus_layout", PROPERTY_HINT_FILE, "*.tres"); + GLOBAL_DEF("audio/general/ios/session_category", 0); + ProjectSettings::get_singleton()->set_custom_property_info("audio/general/ios/session_category", PropertyInfo(Variant::INT, "audio/general/ios/session_category", PROPERTY_HINT_ENUM, "Ambient,Multi Route,Play and Record,Playback,Record,Solo Ambient")); + GLOBAL_DEF("audio/general/ios/mix_with_others", false); + PoolStringArray extensions = PoolStringArray(); extensions.push_back("gd"); if (Engine::get_singleton()->has_singleton("GodotSharp")) { diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 425836fda1..d5499c0b21 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -275,6 +275,13 @@ If [code]true[/code], microphone input will be allowed. This requires appropriate permissions to be set when exporting to Android or iOS. [b]Note:[/b] If the operating system blocks access to audio input devices (due to the user's privacy settings), audio capture will only return silence. On Windows 10 and later, make sure that apps are allowed to access the microphone in the OS' privacy settings. + + Sets the [url=https://developer.apple.com/documentation/avfaudio/avaudiosession/categoryoptions/1616611-mixwithothers]mixWithOthers[/url] option for the AVAudioSession on iOS. This will override the mix behavior, if the category is set to [code]Play and Record[/code], [code]Playback[/code], or [code]Multi Route[/code]. + [code]Ambient[/code] always has this set per default. + + + Sets the [url=https://developer.apple.com/documentation/avfaudio/avaudiosessioncategory]AVAudioSessionCategory[/url] on iOS. Use the [code]Playback[/code] category to get sound output, even if the phone is in silent mode. + The mixing rate used for audio (in Hz). In general, it's better to not touch this and leave it to the host operating system. diff --git a/platform/iphone/app_delegate.mm b/platform/iphone/app_delegate.mm index b0540f6a7f..beed54dd5f 100644 --- a/platform/iphone/app_delegate.mm +++ b/platform/iphone/app_delegate.mm @@ -49,6 +49,15 @@ extern void iphone_finish(); @implementation AppDelegate +enum { + SESSION_CATEGORY_AMBIENT, + SESSION_CATEGORY_MULTI_ROUTE, + SESSION_CATEGORY_PLAY_AND_RECORD, + SESSION_CATEGORY_PLAYBACK, + SESSION_CATEGORY_RECORD, + SESSION_CATEGORY_SOLO_AMBIENT, +}; + static ViewController *mainViewController = nil; + (ViewController *)viewController { @@ -95,8 +104,28 @@ static ViewController *mainViewController = nil; mainViewController = viewController; - // prevent to stop music in another background app - [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; + int sessionCategorySetting = GLOBAL_GET("audio/general/ios/session_category"); + + // Initialize with default Ambient category. + AVAudioSessionCategory category = AVAudioSessionCategoryAmbient; + + if (sessionCategorySetting == SESSION_CATEGORY_MULTI_ROUTE) { + category = AVAudioSessionCategoryMultiRoute; + } else if (sessionCategorySetting == SESSION_CATEGORY_PLAY_AND_RECORD) { + category = AVAudioSessionCategoryPlayAndRecord; + } else if (sessionCategorySetting == SESSION_CATEGORY_PLAYBACK) { + category = AVAudioSessionCategoryPlayback; + } else if (sessionCategorySetting == SESSION_CATEGORY_RECORD) { + category = AVAudioSessionCategoryRecord; + } else if (sessionCategorySetting == SESSION_CATEGORY_SOLO_AMBIENT) { + category = AVAudioSessionCategorySoloAmbient; + } + + if (GLOBAL_GET("audio/general/ios/mix_with_others")) { + [[AVAudioSession sharedInstance] setCategory:category withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; + } else { + [[AVAudioSession sharedInstance] setCategory:category error:nil]; + } bool keep_screen_on = bool(GLOBAL_DEF("display/window/energy_saving/keep_screen_on", true)); OSIPhone::get_singleton()->set_keep_screen_on(keep_screen_on);