Skip to content

Commit cb9bf8e

Browse files
authored
feat: add disable audio session management (#4829)
* chore(nitro): update generated files * feat: implement disableAudioSessionManagement for IOS
1 parent a01d203 commit cb9bf8e

28 files changed

Lines changed: 201 additions & 22 deletions

bun.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/ios/Podfile.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ PODS:
88
- hermes-engine (0.77.3):
99
- hermes-engine/Pre-built (= 0.77.3)
1010
- hermes-engine/Pre-built (0.77.3)
11-
- NitroModules (0.31.10):
11+
- NitroModules (0.35.0):
1212
- DoubleConversion
1313
- glog
1414
- hermes-engine
@@ -1565,7 +1565,7 @@ PODS:
15651565
- React-logger (= 0.77.3)
15661566
- React-perflogger (= 0.77.3)
15671567
- React-utils (= 0.77.3)
1568-
- ReactNativeVideo (7.0.0-beta.6):
1568+
- ReactNativeVideo (7.0.0-beta.8):
15691569
- DoubleConversion
15701570
- glog
15711571
- hermes-engine
@@ -1587,7 +1587,7 @@ PODS:
15871587
- ReactCommon/turbomodule/bridging
15881588
- ReactCommon/turbomodule/core
15891589
- Yoga
1590-
- ReactNativeVideoDrm (7.0.0-beta.6):
1590+
- ReactNativeVideoDrm (7.0.0-beta.8):
15911591
- DoubleConversion
15921592
- glog
15931593
- hermes-engine
@@ -1844,7 +1844,7 @@ SPEC CHECKSUMS:
18441844
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
18451845
glog: eb93e2f488219332457c3c4eafd2738ddc7e80b8
18461846
hermes-engine: b2187dbe13edb0db8fcb2a93a69c1987a30d98a4
1847-
NitroModules: 72332b5857c49f2ee0b5390d4aa00fb91db17df7
1847+
NitroModules: bb34ba5ce1c2ba59eafca7ec912dd9a6a5957ce7
18481848
RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82
18491849
RCTDeprecation: 6ee92578d332db1d4e03267d3ae98bcf8b780863
18501850
RCTRequired: 5b3da0e0f91fddda935574b81748c3e3d3649ee7
@@ -1904,8 +1904,8 @@ SPEC CHECKSUMS:
19041904
ReactAppDependencyProvider: 31015410a4a53b9fd0a908ad4d6e3e2b9a25086a
19051905
ReactCodegen: 53316394e985ded1babc7f143c90c77d2bb1b43c
19061906
ReactCommon: bf4612cba0fa356b529385029f470d5529dddde4
1907-
ReactNativeVideo: de7056e831a46412e81fbf730ef739ec4c7378fe
1908-
ReactNativeVideoDrm: a83670242cec729b4fb67e7c804ab3300e848b86
1907+
ReactNativeVideo: c9c7b36a616e95e5905d2b3fb7583c3117f77629
1908+
ReactNativeVideoDrm: de11a8ece7a6c385d4b55a95c1c930ae636cca94
19091909
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
19101910
Yoga: 92f3bb322c40a86b7233b815854730442e01b8c4
19111911

packages/react-native-video/android/src/main/java/com/twg/video/hybrids/videoplayer/HybridVideoPlayer.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable {
191191
// iOS only property
192192
override var ignoreSilentSwitchMode: IgnoreSilentSwitchMode = IgnoreSilentSwitchMode.AUTO
193193

194+
// iOS only property - no-op on Android
195+
override var disableAudioSessionManagement: Boolean = false
196+
194197
override var playInBackground: Boolean = false
195198
set(value) {
196199
val shouldRun = (value || showNotificationControls)

packages/react-native-video/android/src/main/java/com/twg/video/hybrids/videoplayer/HybridVideoPlayerFactory.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ class HybridVideoPlayerFactory(): HybridVideoPlayerFactorySpec() {
1111
return HybridVideoPlayer(source as HybridVideoPlayerSource)
1212
}
1313

14+
override fun setAudioSessionManagementDisabled(disabled: Boolean) {
15+
// No-op on Android - audio session management is iOS-specific
16+
}
17+
1418
override val memorySize: Long
1519
get() = 0
1620
}

packages/react-native-video/ios/core/VideoManager.swift

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,34 @@ class VideoManager {
1717

1818
private var isAudioSessionActive = false
1919
private var remoteControlEventsActive = false
20-
21-
// TODO: Create Global Config, and expose it there
22-
private var isAudioSessionManagementDisabled: Bool = false
20+
21+
/// Global flag to force disable audio session management
22+
private var isAudioSessionManagementForcedDisabled: Bool = false
23+
24+
/// Returns true if audio session management is disabled either globally or by any player
25+
private var isAudioSessionManagementDisabled: Bool {
26+
if isAudioSessionManagementForcedDisabled {
27+
return true
28+
}
29+
30+
// Check if any player has audio session management disabled
31+
return players.allObjects.contains { player in
32+
player.disableAudioSessionManagement
33+
}
34+
}
35+
36+
func setAudioSessionManagementDisabled(_ disabled: Bool) {
37+
isAudioSessionManagementForcedDisabled = disabled
38+
39+
if disabled {
40+
// Deactivate audio session when disabling management
41+
// so other libraries can take control
42+
deactivateAudioSession()
43+
} else {
44+
// Re-enable audio session management
45+
updateAudioSessionConfiguration()
46+
}
47+
}
2348

2449
private init() {
2550
// Subscribe to audio interruption notifications
@@ -110,20 +135,20 @@ class VideoManager {
110135
if isAudioSessionActive {
111136
return
112137
}
113-
138+
114139
do {
115140
try AVAudioSession.sharedInstance().setActive(true)
116141
isAudioSessionActive = true
117142
} catch {
118143
print("Failed to activate audio session: \(error.localizedDescription)")
119144
}
120145
}
121-
146+
122147
private func deactivateAudioSession() {
123148
if !isAudioSessionActive {
124149
return
125150
}
126-
151+
127152
do {
128153
try AVAudioSession.sharedInstance().setActive(
129154
false, options: .notifyOthersOnDeactivation
@@ -133,8 +158,12 @@ class VideoManager {
133158
print("Failed to deactivate audio session: \(error.localizedDescription)")
134159
}
135160
}
136-
161+
137162
private func updateAudioSessionConfiguration() {
163+
if isAudioSessionManagementDisabled {
164+
return
165+
}
166+
138167
let isAnyPlayerPlaying = players.allObjects.contains { hybridPlayer in
139168
hybridPlayer.player.isMuted == false && hybridPlayer.player.rate != 0
140169
}
@@ -180,10 +209,6 @@ class VideoManager {
180209
player.showNotificationControls
181210
}
182211

183-
if isAudioSessionManagementDisabled {
184-
return
185-
}
186-
187212
let category: AVAudioSession.Category = determineAudioCategory(
188213
silentSwitchObey: anyPlayerNeedsSilentSwitchObey,
189214
silentSwitchIgnore: anyPlayerNeedsSilentSwitchIgnore,

packages/react-native-video/ios/hybrids/VideoPlayer/HybridVideoPlayer.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ class HybridVideoPlayer: HybridVideoPlayerSpec, NativeVideoPlayerSpec {
158158

159159
var playWhenInactive: Bool = false
160160

161+
var disableAudioSessionManagement: Bool = false {
162+
didSet {
163+
VideoManager.shared.requestAudioSessionUpdate()
164+
}
165+
}
166+
161167
var wasAutoPaused: Bool = false
162168

163169
// Text track selection state

packages/react-native-video/ios/hybrids/VideoPlayer/HybridVideoPlayerFactory.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@ class HybridVideoPlayerFactory: HybridVideoPlayerFactorySpec {
1212
func createPlayer(source: HybridVideoPlayerSourceSpec) throws -> HybridVideoPlayerSpec {
1313
return try HybridVideoPlayer(source: source)
1414
}
15+
16+
func setAudioSessionManagementDisabled(disabled: Bool) throws {
17+
VideoManager.shared.setAudioSessionManagementDisabled(disabled)
18+
}
1519
}

packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.cpp

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.hpp

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/react-native-video/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.cpp

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)