diff --git a/src/components/player/AndroidVideoPlayer.tsx b/src/components/player/AndroidVideoPlayer.tsx index 7b4287f..9e5d468 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,16 @@ const AndroidVideoPlayer: React.FC = () => { }, 300); }, [resizeMode]); + + + // Cycle playback speed + const cyclePlaybackSpeed = useCallback(() => { + const idx = speedOptions.indexOf(playbackSpeed); + const newIdx = (idx + 1) % speedOptions.length; + const newSpeed = speedOptions[newIdx]; + setPlaybackSpeed(newSpeed); + }, [playbackSpeed, speedOptions]); + const enableImmersiveMode = () => { StatusBar.setHidden(true, 'none'); if (Platform.OS === 'android') { @@ -3334,7 +3346,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 +3401,8 @@ const AndroidVideoPlayer: React.FC = () => { skip={skip} 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 c963cc2..0b7c2ac 100644 --- a/src/components/player/controls/PlayerControls.tsx +++ b/src/components/player/controls/PlayerControls.tsx @@ -30,6 +30,8 @@ interface PlayerControlsProps { skip: (seconds: number) => void; handleClose: () => void; cycleAspectRatio: () => void; + cyclePlaybackSpeed: () => void; + currentPlaybackSpeed: number; setShowAudioModal: (show: boolean) => void; setShowSubtitleModal: (show: boolean) => void; isSubtitleModalOpen?: boolean; @@ -66,6 +68,8 @@ export const PlayerControls: React.FC = ({ skip, handleClose, cycleAspectRatio, + cyclePlaybackSpeed, + currentPlaybackSpeed, setShowAudioModal, setShowSubtitleModal, isSubtitleModalOpen, @@ -177,6 +181,14 @@ export const PlayerControls: React.FC = ({ + {/* Playback Speed Button */} + + + + Speed {currentPlaybackSpeed}x + + + {/* Audio Button - Updated to use ksAudioTracks */}