7
7
AVPlaybackStatus ,
8
8
VideoFullscreenUpdate ,
9
9
AVPlaybackSource ,
10
+ Audio ,
10
11
} from "expo-av" ;
11
12
import { extractSizeStyles } from "../../../utilities" ;
12
13
import MediaPlaybackWrapper from "../MediaPlaybackWrapper" ;
@@ -27,6 +28,7 @@ type ExpoVideoPropsOmitted = Omit<
27
28
interface VideoPlayerProps extends ExpoVideoPropsOmitted , MediaPlayerProps {
28
29
resizeMode ?: ResizeMode ;
29
30
posterResizeMode ?: ImageResizeMode ;
31
+ playsInSilentModeIOS ?: boolean ;
30
32
}
31
33
32
34
export interface VideoPlayerRef extends MediaPlayerRef {
@@ -42,6 +44,7 @@ const VideoPlayer = React.forwardRef<VideoPlayerRef, VideoPlayerProps>(
42
44
onPlaybackStatusUpdate : onPlaybackStatusUpdateProp ,
43
45
onPlaybackFinish,
44
46
source,
47
+ playsInSilentModeIOS = false ,
45
48
...rest
46
49
} ,
47
50
ref
@@ -102,6 +105,20 @@ const VideoPlayer = React.forwardRef<VideoPlayerRef, VideoPlayerProps>(
102
105
}
103
106
} , [ isFullscreen , videoMediaObject ] ) ;
104
107
108
+ const updateAudioMode = React . useCallback ( async ( ) => {
109
+ try {
110
+ await Audio . setAudioModeAsync ( {
111
+ playsInSilentModeIOS,
112
+ } ) ;
113
+ } catch ( e ) {
114
+ console . error ( "Failed to set audio mode. Error details:" , e ) ;
115
+ }
116
+ } , [ playsInSilentModeIOS ] ) ;
117
+
118
+ React . useEffect ( ( ) => {
119
+ updateAudioMode ( ) ;
120
+ } , [ updateAudioMode ] ) ;
121
+
105
122
React . useImperativeHandle (
106
123
ref ,
107
124
( ) => ( {
@@ -131,6 +148,7 @@ const VideoPlayer = React.forwardRef<VideoPlayerRef, VideoPlayerProps>(
131
148
media = { videoMediaObject as Playback | undefined }
132
149
isPlaying = { isPlaying }
133
150
ref = { mediaPlaybackWrapperRef }
151
+ onTogglePlayback = { updateAudioMode }
134
152
>
135
153
< VideoPlayerComponent
136
154
// https://docs.expo.dev/versions/latest/sdk/av/#example-video to see why ref is handled this way
0 commit comments