@@ -518,10 +518,8 @@ internal fun VideoPlayerEffects(
518518 useCors : Boolean ,
519519 onLastPositionChange : (Double ) -> Unit ,
520520 onWasPlayingChange : (Boolean ) -> Unit ,
521- onLastPlaybackSpeedChange : (Float ) -> Unit ,
522521 lastPosition : Double ,
523522 wasPlaying : Boolean ,
524- lastPlaybackSpeed : Float ,
525523) {
526524 // Handle fullscreen
527525 LaunchedEffect (playerState.isFullscreen) {
@@ -593,7 +591,6 @@ internal fun VideoPlayerEffects(
593591 videoElement?.let {
594592 onLastPositionChange(it.currentTime)
595593 onWasPlayingChange(playerState.isPlaying)
596- onLastPlaybackSpeedChange(playerState.playbackSpeed)
597594 }
598595 }
599596
@@ -605,11 +602,6 @@ internal fun VideoPlayerEffects(
605602 onLastPositionChange(0.0 )
606603 }
607604
608- if (lastPlaybackSpeed != 1.0f ) {
609- video.safeSetPlaybackRate(lastPlaybackSpeed)
610- onLastPlaybackSpeedChange(1.0f )
611- }
612-
613605 if (wasPlaying) {
614606 video.safePlay()
615607 onWasPlayingChange(false )
@@ -666,61 +658,46 @@ internal fun VideoVolumeAndSpeedEffects(
666658 playerState : VideoPlayerState ,
667659 videoElement : HTMLVideoElement ? ,
668660) {
669- var pendingVolumeChange by remember { mutableStateOf<Double ?>(null ) }
670- var pendingPlaybackSpeedChange by remember { mutableStateOf<Float ?>(null ) }
671-
672- if (playerState is DefaultVideoPlayerState ) {
673- DisposableEffect (videoElement) {
674- val video = videoElement ? : return @DisposableEffect onDispose {}
661+ if (playerState !is DefaultVideoPlayerState ) {
662+ webVideoLogger.e {
663+ """
664+ Expected ${DefaultVideoPlayerState ::class } but found ${playerState::class } .
665+ Volume and speed settings won't work.
666+ """ .trimIndent()
667+ }
668+ return
669+ }
675670
676- playerState.applyVolumeCallback = { value ->
677- if (playerState._isLoading ) {
678- pendingVolumeChange = value.toDouble()
679- } else {
680- video.volume = value.toDouble()
681- pendingVolumeChange = null
682- }
683- }
671+ DisposableEffect (videoElement) {
672+ val video = videoElement ? : return @DisposableEffect onDispose {}
684673
685- if (! playerState._isLoading ) {
686- video.volume = playerState.volume.toDouble()
687- } else {
688- pendingVolumeChange = playerState.volume.toDouble()
689- }
674+ // Init video element state when video is loaded
675+ // Volume could be changed any time but playbackRate require video to be loaded
676+ val videoLoadedListener: (Event ) -> Unit = {
677+ video.volume = playerState.volume.toDouble()
678+ video.safeSetPlaybackRate(playerState.playbackSpeed)
679+ }
690680
691- playerState.applyPlaybackSpeedCallback = { value ->
692- if (playerState._isLoading ) {
693- pendingPlaybackSpeedChange = value
694- } else {
695- video.safeSetPlaybackRate(value)
696- pendingPlaybackSpeedChange = null
697- }
698- }
681+ video.addEventListener(" canplay" , videoLoadedListener)
699682
700- if (! playerState._isLoading ) {
701- video.safeSetPlaybackRate(playerState.playbackSpeed)
702- } else {
703- pendingPlaybackSpeedChange = playerState.playbackSpeed
683+ // They should change only `playerState` while the video is loading
684+ // The video element will be updated in `videoLoadedListener`
685+ playerState.applyVolumeCallback = { value ->
686+ if (! playerState.isLoading) {
687+ video.volume = value.toDouble()
704688 }
689+ }
705690
706- val seekedListener: (Event ) -> Unit = {
707- pendingVolumeChange?.let { volume ->
708- video.volume = volume
709- pendingVolumeChange = null
710- }
711- pendingPlaybackSpeedChange?.let { speed ->
712- video.safeSetPlaybackRate(speed)
713- pendingPlaybackSpeedChange = null
714- }
691+ playerState.applyPlaybackSpeedCallback = { value ->
692+ if (! playerState.isLoading) {
693+ video.safeSetPlaybackRate(value)
715694 }
695+ }
716696
717- video.addEventListener(" seeked" , seekedListener)
718-
719- onDispose {
720- video.removeEventListener(" seeked" , seekedListener)
721- playerState.applyVolumeCallback = null
722- playerState.applyPlaybackSpeedCallback = null
723- }
697+ onDispose {
698+ video.removeEventListener(" canplay" , videoLoadedListener)
699+ playerState.applyVolumeCallback = null
700+ playerState.applyPlaybackSpeedCallback = null
724701 }
725702 }
726703}
0 commit comments