expo-libvlc-player 5.0.3 → 5.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/expo/modules/libvlcplayer/LibVlcPlayerModule.kt +1 -1
- package/android/src/main/java/expo/modules/libvlcplayer/LibVlcPlayerView.kt +3 -3
- package/android/src/main/java/expo/modules/libvlcplayer/managers/AudioFocusManager.kt +10 -6
- package/android/src/main/java/expo/modules/libvlcplayer/managers/KeepAwakeManager.kt +14 -0
- package/ios/LibVlcPlayerModule.swift +1 -1
- package/ios/LibVlcPlayerView.swift +15 -15
- package/ios/Managers/AudioSessionManager.swift +6 -4
- package/ios/Managers/KeepAwakeManager.swift +12 -0
- package/package.json +1 -1
|
@@ -638,7 +638,7 @@ fun LibVlcPlayerView.setPlayerListener(player: MediaPlayer) {
|
|
|
638
638
|
|
|
639
639
|
attachPlayer()
|
|
640
640
|
|
|
641
|
-
MediaPlayerManager.keepAwakeManager.
|
|
641
|
+
MediaPlayerManager.keepAwakeManager.toggleKeepAwake()
|
|
642
642
|
|
|
643
643
|
retryUntil {
|
|
644
644
|
val volume = player.getVolume()
|
|
@@ -651,7 +651,7 @@ fun LibVlcPlayerView.setPlayerListener(player: MediaPlayer) {
|
|
|
651
651
|
Event.Paused -> {
|
|
652
652
|
onPaused(Unit)
|
|
653
653
|
|
|
654
|
-
MediaPlayerManager.keepAwakeManager.
|
|
654
|
+
MediaPlayerManager.keepAwakeManager.toggleKeepAwake()
|
|
655
655
|
MediaPlayerManager.audioFocusManager.updateAudioFocus()
|
|
656
656
|
}
|
|
657
657
|
|
|
@@ -660,7 +660,7 @@ fun LibVlcPlayerView.setPlayerListener(player: MediaPlayer) {
|
|
|
660
660
|
|
|
661
661
|
detachPlayer()
|
|
662
662
|
|
|
663
|
-
MediaPlayerManager.keepAwakeManager.
|
|
663
|
+
MediaPlayerManager.keepAwakeManager.toggleKeepAwake()
|
|
664
664
|
MediaPlayerManager.audioFocusManager.updateAudioFocus()
|
|
665
665
|
}
|
|
666
666
|
|
|
@@ -8,6 +8,7 @@ import android.os.Build
|
|
|
8
8
|
import expo.modules.kotlin.AppContext
|
|
9
9
|
import expo.modules.kotlin.exception.CodedException
|
|
10
10
|
import expo.modules.kotlin.exception.Exceptions
|
|
11
|
+
import expo.modules.libvlcplayer.LibVlcPlayerView
|
|
11
12
|
import expo.modules.libvlcplayer.constants.MediaPlayerConstants
|
|
12
13
|
import expo.modules.libvlcplayer.enums.AudioMixingMode
|
|
13
14
|
import kotlinx.coroutines.launch
|
|
@@ -25,11 +26,14 @@ class AudioFocusManager(
|
|
|
25
26
|
}
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
private val playerViews: MutableSet<LibVlcPlayerView>
|
|
30
|
+
get() = MediaPlayerManager.playerViews
|
|
31
|
+
|
|
28
32
|
private var currentFocusRequest: AudioFocusRequest? = null
|
|
29
33
|
|
|
30
34
|
private val anyPlayerRequiresFocus: Boolean
|
|
31
35
|
get() =
|
|
32
|
-
|
|
36
|
+
playerViews.any { view ->
|
|
33
37
|
playerRequiresFocus(view.mediaPlayer)
|
|
34
38
|
}
|
|
35
39
|
|
|
@@ -41,7 +45,7 @@ class AudioFocusManager(
|
|
|
41
45
|
appContext.mainQueue.launch {
|
|
42
46
|
when (focusChange) {
|
|
43
47
|
AudioManager.AUDIOFOCUS_LOSS -> {
|
|
44
|
-
|
|
48
|
+
playerViews.forEach { view ->
|
|
45
49
|
pausePlayerIfUnmuted(view.mediaPlayer)
|
|
46
50
|
}
|
|
47
51
|
|
|
@@ -55,7 +59,7 @@ class AudioFocusManager(
|
|
|
55
59
|
return@launch
|
|
56
60
|
}
|
|
57
61
|
|
|
58
|
-
|
|
62
|
+
playerViews.forEach { view ->
|
|
59
63
|
pausePlayerIfUnmuted(view.mediaPlayer)
|
|
60
64
|
}
|
|
61
65
|
|
|
@@ -65,7 +69,7 @@ class AudioFocusManager(
|
|
|
65
69
|
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
|
|
66
70
|
val audioMixingMode = findAudioMixingMode()
|
|
67
71
|
|
|
68
|
-
|
|
72
|
+
playerViews.forEach { view ->
|
|
69
73
|
if (audioMixingMode == AudioMixingMode.DO_NOT_MIX) {
|
|
70
74
|
pausePlayerIfUnmuted(view.mediaPlayer)
|
|
71
75
|
} else {
|
|
@@ -75,7 +79,7 @@ class AudioFocusManager(
|
|
|
75
79
|
}
|
|
76
80
|
|
|
77
81
|
AudioManager.AUDIOFOCUS_GAIN -> {
|
|
78
|
-
|
|
82
|
+
playerViews.forEach { view ->
|
|
79
83
|
unduckPlayer(view.mediaPlayer)
|
|
80
84
|
}
|
|
81
85
|
}
|
|
@@ -102,7 +106,7 @@ class AudioFocusManager(
|
|
|
102
106
|
|
|
103
107
|
private fun findAudioMixingMode(): AudioMixingMode {
|
|
104
108
|
val mixingModes =
|
|
105
|
-
|
|
109
|
+
playerViews
|
|
106
110
|
.filter { view -> view.mediaPlayer?.isPlaying() == true }
|
|
107
111
|
.map { view -> view.audioMixingMode }
|
|
108
112
|
|
|
@@ -11,6 +11,12 @@ class KeepAwakeManager(
|
|
|
11
11
|
private val activity: Activity
|
|
12
12
|
get() = appContext.currentActivity ?: throw Exceptions.MissingActivity()
|
|
13
13
|
|
|
14
|
+
private val anyPlayingView: Boolean
|
|
15
|
+
get() =
|
|
16
|
+
MediaPlayerManager.playerViews.any { view ->
|
|
17
|
+
view.mediaPlayer?.isPlaying() == true
|
|
18
|
+
}
|
|
19
|
+
|
|
14
20
|
fun activateKeepAwake() {
|
|
15
21
|
activity.let { activity ->
|
|
16
22
|
activity.runOnUiThread {
|
|
@@ -26,4 +32,12 @@ class KeepAwakeManager(
|
|
|
26
32
|
}
|
|
27
33
|
}
|
|
28
34
|
}
|
|
35
|
+
|
|
36
|
+
fun toggleKeepAwake() {
|
|
37
|
+
if (anyPlayingView) {
|
|
38
|
+
activateKeepAwake()
|
|
39
|
+
} else {
|
|
40
|
+
deactivateKeepAwake()
|
|
41
|
+
}
|
|
42
|
+
}
|
|
29
43
|
}
|
|
@@ -31,7 +31,7 @@ public class LibVlcPlayerModule: Module {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
OnAppEntersForeground {
|
|
34
|
-
MediaPlayerManager.shared.keepAwakeManager.
|
|
34
|
+
MediaPlayerManager.shared.keepAwakeManager.toggleKeepAwake()
|
|
35
35
|
MediaPlayerManager.shared.onModuleForeground()
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -136,18 +136,18 @@ class LibVlcPlayerView: ExpoView {
|
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
func setContentFit() {
|
|
139
|
-
DispatchQueue.main.async {
|
|
140
|
-
let view =
|
|
139
|
+
DispatchQueue.main.async { [self] in
|
|
140
|
+
let view = playerView
|
|
141
141
|
var transform: CGAffineTransform = .identity
|
|
142
142
|
|
|
143
|
-
if let player =
|
|
143
|
+
if let player = mediaPlayer {
|
|
144
144
|
let video = player.videoSize
|
|
145
145
|
|
|
146
|
-
if
|
|
146
|
+
if hasVideoSize() {
|
|
147
147
|
let viewAspect = view.frame.size.width / view.frame.size.height
|
|
148
148
|
let videoAspect = video.width / video.height
|
|
149
149
|
|
|
150
|
-
switch
|
|
150
|
+
switch contentFit {
|
|
151
151
|
case .contain:
|
|
152
152
|
// No transform required
|
|
153
153
|
break
|
|
@@ -504,14 +504,14 @@ extension LibVlcPlayerView: VLCMediaPlayerDelegate {
|
|
|
504
504
|
onPlaying()
|
|
505
505
|
|
|
506
506
|
if firstPlay {
|
|
507
|
-
retryUntil {
|
|
508
|
-
|
|
509
|
-
return
|
|
507
|
+
retryUntil { [self] in
|
|
508
|
+
onFirstPlay(getMediaInfo())
|
|
509
|
+
return hasAudioVideo()
|
|
510
510
|
}
|
|
511
511
|
|
|
512
|
-
retryUntil {
|
|
513
|
-
|
|
514
|
-
return
|
|
512
|
+
retryUntil { [self] in
|
|
513
|
+
setContentFit()
|
|
514
|
+
return hasVideoSize()
|
|
515
515
|
}
|
|
516
516
|
|
|
517
517
|
setupPlayer()
|
|
@@ -519,10 +519,10 @@ extension LibVlcPlayerView: VLCMediaPlayerDelegate {
|
|
|
519
519
|
firstPlay = false
|
|
520
520
|
}
|
|
521
521
|
|
|
522
|
-
MediaPlayerManager.shared.keepAwakeManager.
|
|
522
|
+
MediaPlayerManager.shared.keepAwakeManager.toggleKeepAwake()
|
|
523
523
|
|
|
524
524
|
retryUntil {
|
|
525
|
-
let volume =
|
|
525
|
+
let volume = player.audio?.volume ?? Int32(MediaPlayerConstants.minPlayerVolume)
|
|
526
526
|
let hasVolume = volume > MediaPlayerConstants.minPlayerVolume
|
|
527
527
|
MediaPlayerManager.shared.audioSessionManager.setAppropriateAudioSession()
|
|
528
528
|
return hasVolume
|
|
@@ -530,12 +530,12 @@ extension LibVlcPlayerView: VLCMediaPlayerDelegate {
|
|
|
530
530
|
case .paused:
|
|
531
531
|
onPaused()
|
|
532
532
|
|
|
533
|
-
MediaPlayerManager.shared.keepAwakeManager.
|
|
533
|
+
MediaPlayerManager.shared.keepAwakeManager.toggleKeepAwake()
|
|
534
534
|
MediaPlayerManager.shared.audioSessionManager.setAppropriateAudioSession()
|
|
535
535
|
case .stopped:
|
|
536
536
|
onStopped()
|
|
537
537
|
|
|
538
|
-
MediaPlayerManager.shared.keepAwakeManager.
|
|
538
|
+
MediaPlayerManager.shared.keepAwakeManager.toggleKeepAwake()
|
|
539
539
|
MediaPlayerManager.shared.audioSessionManager.setAppropriateAudioSession()
|
|
540
540
|
case .ended:
|
|
541
541
|
onEndReached()
|
|
@@ -7,6 +7,8 @@ class AudioSessionManager {
|
|
|
7
7
|
|
|
8
8
|
private static let managerQueue = DispatchQueue(label: "audioManagerQueue")
|
|
9
9
|
|
|
10
|
+
private lazy var playerViews = MediaPlayerManager.shared.playerViews
|
|
11
|
+
|
|
10
12
|
func setAppropriateAudioSession() {
|
|
11
13
|
Self.managerQueue.async { [weak self] in
|
|
12
14
|
self?.setAudioSession()
|
|
@@ -18,7 +20,7 @@ class AudioSessionManager {
|
|
|
18
20
|
let audioMixingMode = findAudioMixingMode()
|
|
19
21
|
var audioSessionCategoryOptions: AVAudioSession.CategoryOptions = audioSession.categoryOptions
|
|
20
22
|
|
|
21
|
-
let isOutputtingAudio =
|
|
23
|
+
let isOutputtingAudio = playerViews.allObjects.contains { view in
|
|
22
24
|
if let player = view.mediaPlayer, let audio = player.audio {
|
|
23
25
|
player.isPlaying && audio.volume > MediaPlayerConstants.minPlayerVolume
|
|
24
26
|
} else {
|
|
@@ -62,7 +64,7 @@ class AudioSessionManager {
|
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
private func findAudioMixingMode() -> AudioMixingMode? {
|
|
65
|
-
let playingViews =
|
|
67
|
+
let playingViews = playerViews.allObjects.filter { view in
|
|
66
68
|
view.mediaPlayer?.isPlaying == true
|
|
67
69
|
}
|
|
68
70
|
|
|
@@ -72,8 +74,8 @@ class AudioSessionManager {
|
|
|
72
74
|
return nil
|
|
73
75
|
}
|
|
74
76
|
|
|
75
|
-
for
|
|
76
|
-
audioMixingMode =
|
|
77
|
+
for view in playingViews where (audioMixingMode.priority()) < view.audioMixingMode.priority() {
|
|
78
|
+
audioMixingMode = view.audioMixingMode
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
return audioMixingMode
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
class KeepAwakeManager {
|
|
2
2
|
static let shared = KeepAwakeManager()
|
|
3
3
|
|
|
4
|
+
private lazy var anyPlayingView = MediaPlayerManager.shared.playerViews.allObjects.contains { view in
|
|
5
|
+
view.mediaPlayer?.isPlaying == true
|
|
6
|
+
}
|
|
7
|
+
|
|
4
8
|
func activateKeepAwake() {
|
|
5
9
|
DispatchQueue.main.async {
|
|
6
10
|
UIApplication.shared.isIdleTimerDisabled = true
|
|
@@ -12,4 +16,12 @@ class KeepAwakeManager {
|
|
|
12
16
|
UIApplication.shared.isIdleTimerDisabled = false
|
|
13
17
|
}
|
|
14
18
|
}
|
|
19
|
+
|
|
20
|
+
func toggleKeepAwake() {
|
|
21
|
+
if anyPlayingView {
|
|
22
|
+
activateKeepAwake()
|
|
23
|
+
} else {
|
|
24
|
+
deactivateKeepAwake()
|
|
25
|
+
}
|
|
26
|
+
}
|
|
15
27
|
}
|