From 33720c5079d0f62ba9a20fe986ac442d4e1b215e Mon Sep 17 00:00:00 2001 From: CrissZollo Date: Sat, 4 Oct 2025 17:23:48 +0200 Subject: [PATCH 1/2] Added functionality to set playbackspeed in exoPlayer --- src/components/player/AndroidVideoPlayer.tsx | 16 +++++++++++++++- .../player/controls/PlayerControls.tsx | 10 ++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/components/player/AndroidVideoPlayer.tsx b/src/components/player/AndroidVideoPlayer.tsx index 7b4287f..52c7f15 100644 --- a/src/components/player/AndroidVideoPlayer.tsx +++ b/src/components/player/AndroidVideoPlayer.tsx @@ -188,6 +188,8 @@ const AndroidVideoPlayer: React.FC = () => { const [textTracks, setTextTracks] = useState([]); const [selectedTextTrack, setSelectedTextTrack] = useState(-1); const [resizeMode, setResizeMode] = useState('contain'); + const speedOptions = [0.5, 1.0, 1.25, 1.5, 2.0, 2.5, 3.0]; + const [playbackSpeed, setPlaybackSpeed] = useState(1.0); const [buffered, setBuffered] = useState(0); const [seekTime, setSeekTime] = useState(null); const videoRef = useRef(null); @@ -1643,6 +1645,17 @@ const AndroidVideoPlayer: React.FC = () => { }, 300); }, [resizeMode]); + + + // Function to cycle playback speed + const cyclePlaybackSpeed = useCallback(() => { + const idx = speedOptions.indexOf(playbackSpeed); + const newIdx = (idx + 1) % speedOptions.length; + const newSpeed = speedOptions[newIdx]; + setPlaybackSpeed(newSpeed); + // Playback speed is now set via the rate prop on the Video component + }, [playbackSpeed, speedOptions]); + const enableImmersiveMode = () => { StatusBar.setHidden(true, 'none'); if (Platform.OS === 'android') { @@ -3334,7 +3347,7 @@ const AndroidVideoPlayer: React.FC = () => { resizeMode={getVideoResizeMode(resizeMode)} selectedAudioTrack={selectedAudioTrack || undefined} selectedTextTrack={useCustomSubtitles ? { type: SelectedTrackType.DISABLED } : (selectedTextTrack >= 0 ? { type: SelectedTrackType.INDEX, value: selectedTextTrack } : undefined)} - rate={1.0} + rate={playbackSpeed} volume={volume} muted={false} repeat={false} @@ -3389,6 +3402,7 @@ const AndroidVideoPlayer: React.FC = () => { skip={skip} handleClose={handleClose} cycleAspectRatio={cycleAspectRatio} + cyclePlaybackSpeed={cyclePlaybackSpeed} setShowAudioModal={setShowAudioModal} setShowSubtitleModal={setShowSubtitleModal} isSubtitleModalOpen={showSubtitleModal} diff --git a/src/components/player/controls/PlayerControls.tsx b/src/components/player/controls/PlayerControls.tsx index c963cc2..3bea9db 100644 --- a/src/components/player/controls/PlayerControls.tsx +++ b/src/components/player/controls/PlayerControls.tsx @@ -30,6 +30,7 @@ interface PlayerControlsProps { skip: (seconds: number) => void; handleClose: () => void; cycleAspectRatio: () => void; + cyclePlaybackSpeed: () => void; setShowAudioModal: (show: boolean) => void; setShowSubtitleModal: (show: boolean) => void; isSubtitleModalOpen?: boolean; @@ -66,6 +67,7 @@ export const PlayerControls: React.FC = ({ skip, handleClose, cycleAspectRatio, + cyclePlaybackSpeed, setShowAudioModal, setShowSubtitleModal, isSubtitleModalOpen, @@ -177,6 +179,14 @@ export const PlayerControls: React.FC = ({ + {/* Playback Speed Button */} + + + + Speed + + + {/* Audio Button - Updated to use ksAudioTracks */} Date: Sat, 4 Oct 2025 17:38:06 +0200 Subject: [PATCH 2/2] Added current speed indicator --- src/components/player/AndroidVideoPlayer.tsx | 4 ++-- src/components/player/controls/PlayerControls.tsx | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/player/AndroidVideoPlayer.tsx b/src/components/player/AndroidVideoPlayer.tsx index 52c7f15..9e5d468 100644 --- a/src/components/player/AndroidVideoPlayer.tsx +++ b/src/components/player/AndroidVideoPlayer.tsx @@ -1647,13 +1647,12 @@ const AndroidVideoPlayer: React.FC = () => { - // Function to cycle playback speed + // Cycle playback speed const cyclePlaybackSpeed = useCallback(() => { const idx = speedOptions.indexOf(playbackSpeed); const newIdx = (idx + 1) % speedOptions.length; const newSpeed = speedOptions[newIdx]; setPlaybackSpeed(newSpeed); - // Playback speed is now set via the rate prop on the Video component }, [playbackSpeed, speedOptions]); const enableImmersiveMode = () => { @@ -3403,6 +3402,7 @@ const AndroidVideoPlayer: React.FC = () => { handleClose={handleClose} cycleAspectRatio={cycleAspectRatio} cyclePlaybackSpeed={cyclePlaybackSpeed} + currentPlaybackSpeed={playbackSpeed} setShowAudioModal={setShowAudioModal} setShowSubtitleModal={setShowSubtitleModal} isSubtitleModalOpen={showSubtitleModal} diff --git a/src/components/player/controls/PlayerControls.tsx b/src/components/player/controls/PlayerControls.tsx index 3bea9db..0b7c2ac 100644 --- a/src/components/player/controls/PlayerControls.tsx +++ b/src/components/player/controls/PlayerControls.tsx @@ -31,6 +31,7 @@ interface PlayerControlsProps { handleClose: () => void; cycleAspectRatio: () => void; cyclePlaybackSpeed: () => void; + currentPlaybackSpeed: number; setShowAudioModal: (show: boolean) => void; setShowSubtitleModal: (show: boolean) => void; isSubtitleModalOpen?: boolean; @@ -68,6 +69,7 @@ export const PlayerControls: React.FC = ({ handleClose, cycleAspectRatio, cyclePlaybackSpeed, + currentPlaybackSpeed, setShowAudioModal, setShowSubtitleModal, isSubtitleModalOpen, @@ -183,7 +185,7 @@ export const PlayerControls: React.FC = ({ - Speed + Speed {currentPlaybackSpeed}x