From 06020a8582cf2403ef1475b889b46cff8558e81e Mon Sep 17 00:00:00 2001 From: Adrian Carolli Date: Tue, 27 Feb 2024 19:26:34 -0500 Subject: [PATCH 1/3] feat: adds iosCategory update functionality --- ios/RNTrackPlayer/RNTrackPlayer.swift | 53 +++++++++++++++------------ 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/ios/RNTrackPlayer/RNTrackPlayer.swift b/ios/RNTrackPlayer/RNTrackPlayer.swift index 3be134273..74237a784 100644 --- a/ios/RNTrackPlayer/RNTrackPlayer.swift +++ b/ios/RNTrackPlayer/RNTrackPlayer.swift @@ -140,7 +140,7 @@ public class RNTrackPlayer: RCTEventEmitter, AudioSessionControllerDelegate { private func rejectWhenNotInitialized(reject: RCTPromiseRejectBlock) -> Bool { let rejected = !hasInitialized; if (rejected) { - reject("player_not_initialized", "The player is not initialized. Call setupPlayer first.", nil) + reject("player_already_initialized", "The player is not initialized. Call setupPlayer first.", nil) } return rejected; } @@ -183,28 +183,7 @@ public class RNTrackPlayer: RCTEventEmitter, AudioSessionControllerDelegate { // configure wether control center metdata should auto update player.automaticallyUpdateNowPlayingInfo = config["autoUpdateMetadata"] as? Bool ?? true - // configure audio session - category, options & mode - if - let sessionCategoryStr = config["iosCategory"] as? String, - let mappedCategory = SessionCategory(rawValue: sessionCategoryStr) { - sessionCategory = mappedCategory.mapConfigToAVAudioSessionCategory() - } - - if - let sessionCategoryModeStr = config["iosCategoryMode"] as? String, - let mappedCategoryMode = SessionCategoryMode(rawValue: sessionCategoryModeStr) { - sessionCategoryMode = mappedCategoryMode.mapConfigToAVAudioSessionCategoryMode() - } - - if - let sessionCategoryPolicyStr = config["iosCategoryPolicy"] as? String, - let mappedCategoryPolicy = SessionCategoryPolicy(rawValue: sessionCategoryPolicyStr) { - sessionCategoryPolicy = mappedCategoryPolicy.mapConfigToAVAudioSessionCategoryPolicy() - } - - let sessionCategoryOptsStr = config["iosCategoryOptions"] as? [String] - let mappedCategoryOpts = sessionCategoryOptsStr?.compactMap { SessionCategoryOptions(rawValue: $0)?.mapConfigToAVAudioSessionCategoryOptions() } ?? [] - sessionCategoryOptions = AVAudioSession.CategoryOptions(mappedCategoryOpts) + updateCategory(config: config) configureAudioSession() @@ -291,6 +270,30 @@ public class RNTrackPlayer: RCTEventEmitter, AudioSessionControllerDelegate { resolve(NSNull()) } + private func updateCategory(config: [String: Any]) { + // configure audio session - category, options & mode + if + let sessionCategoryStr = config["iosCategory"] as? String, + let mappedCategory = SessionCategory(rawValue: sessionCategoryStr) { + sessionCategory = mappedCategory.mapConfigToAVAudioSessionCategory() + } + + if + let sessionCategoryModeStr = config["iosCategoryMode"] as? String, + let mappedCategoryMode = SessionCategoryMode(rawValue: sessionCategoryModeStr) { + sessionCategoryMode = mappedCategoryMode.mapConfigToAVAudioSessionCategoryMode() + } + + if + let sessionCategoryPolicyStr = config["iosCategoryPolicy"] as? String, + let mappedCategoryPolicy = SessionCategoryPolicy(rawValue: sessionCategoryPolicyStr) { + sessionCategoryPolicy = mappedCategoryPolicy.mapConfigToAVAudioSessionCategoryPolicy() + } + + let sessionCategoryOptsStr = config["iosCategoryOptions"] as? [String] + let mappedCategoryOpts = sessionCategoryOptsStr?.compactMap { SessionCategoryOptions(rawValue: $0)?.mapConfigToAVAudioSessionCategoryOptions() } ?? [] + sessionCategoryOptions = AVAudioSession.CategoryOptions(mappedCategoryOpts) + } private func configureAudioSession() { @@ -346,6 +349,10 @@ public class RNTrackPlayer: RCTEventEmitter, AudioSessionControllerDelegate { interval: ((options["progressUpdateEventInterval"] as? NSNumber) ?? 0).doubleValue ) + updateCategory(config: options) + + configureAudioSession() + resolve(NSNull()) } From 5161a45fd1de5c35429ae1dfb851d82c956ead39 Mon Sep 17 00:00:00 2001 From: Adrian Carolli Date: Tue, 27 Feb 2024 19:30:01 -0500 Subject: [PATCH 2/3] docs: add docs about updating category --- docs/docs/api/objects/update-options.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/docs/api/objects/update-options.md b/docs/docs/api/objects/update-options.md index 436417d2a..550098e21 100644 --- a/docs/docs/api/objects/update-options.md +++ b/docs/docs/api/objects/update-options.md @@ -25,5 +25,8 @@ All parameters are optional. You also only need to specify the ones you want to | `forwardIcon` | [Resource Object](../objects/resource.md) | The jump forward icon¹ | ✅ | ❌ | ❌ | | `color` | `number` | The notification color in an ARGB hex | ✅ | ❌ | ❌ | | `progressUpdateEventInterval` | `number` | The interval (in seconds) that the [`Event.PlaybackProgressUpdated`](../events.md#playbackprogressupdated) will be fired. `undefined` by default. | ✅ | ✅ | ❌ | +| options.iosCategory | `IOSCategory` | [AVAudioSession.Category](https://developer.apple.com/documentation/avfoundation/avaudiosession/1616615-category) for iOS. Sets on `play()` | `IOSCategory.Playback` | ❌ | ✅ | ❌ | +| options.iosCategoryOptions | `IOSCategoryOptions[]` | [AVAudioSession.CategoryOptions](https://developer.apple.com/documentation/avfoundation/avaudiosession/1616503-categoryoptions) for iOS. Sets on `play()` | `[]` | ❌ | ✅ | ❌ | +| options.iosCategoryMode | `IOSCategoryMode` | [AVAudioSession.Mode](https://developer.apple.com/documentation/avfoundation/avaudiosession/1616508-mode) for iOS. Sets on `play()` | `default` | ❌ | ✅ | ❌ | *¹ - The custom icons will only work in release builds* From 5b035e611025a909900f9a617c93df7af35dc5fe Mon Sep 17 00:00:00 2001 From: Adrian Carolli Date: Tue, 27 Feb 2024 19:34:12 -0500 Subject: [PATCH 3/3] Update ios/RNTrackPlayer/RNTrackPlayer.swift --- ios/RNTrackPlayer/RNTrackPlayer.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/RNTrackPlayer/RNTrackPlayer.swift b/ios/RNTrackPlayer/RNTrackPlayer.swift index 74237a784..23cf2bd42 100644 --- a/ios/RNTrackPlayer/RNTrackPlayer.swift +++ b/ios/RNTrackPlayer/RNTrackPlayer.swift @@ -140,7 +140,7 @@ public class RNTrackPlayer: RCTEventEmitter, AudioSessionControllerDelegate { private func rejectWhenNotInitialized(reject: RCTPromiseRejectBlock) -> Bool { let rejected = !hasInitialized; if (rejected) { - reject("player_already_initialized", "The player is not initialized. Call setupPlayer first.", nil) + reject("player_not_initialized", "The player is not initialized. Call setupPlayer first.", nil) } return rejected; }