@@ -22,7 +22,8 @@ function time_ranges_to_array(ranges) {
22
22
export function bind_current_time ( media , get_value , update ) {
23
23
/** @type {number } */
24
24
var raf_id ;
25
- var updating = false ;
25
+ /** @type {number } */
26
+ var value ;
26
27
27
28
// Ideally, listening to timeupdate would be enough, but it fires too infrequently for the currentTime
28
29
// binding, which is why we use a raf loop, too. We additionally still listen to timeupdate because
@@ -34,22 +35,21 @@ export function bind_current_time(media, get_value, update) {
34
35
raf_id = requestAnimationFrame ( callback ) ;
35
36
}
36
37
37
- updating = true ;
38
- update ( media . currentTime ) ;
38
+ var next_value = media . currentTime ;
39
+ if ( value !== next_value ) {
40
+ update ( ( value = next_value ) ) ;
41
+ }
39
42
} ;
40
43
41
44
raf_id = requestAnimationFrame ( callback ) ;
42
45
media . addEventListener ( 'timeupdate' , callback ) ;
43
46
44
47
render_effect ( ( ) => {
45
- var value = get_value ( ) ;
48
+ var next_value = Number ( get_value ( ) ) ;
46
49
47
- // through isNaN we also allow number strings, which is more robust
48
- if ( ! updating && ! isNaN ( /** @type {any } */ ( value ) ) ) {
49
- media . currentTime = /** @type {number } */ ( value ) ;
50
+ if ( value !== next_value && ! isNaN ( /** @type {any } */ ( next_value ) ) ) {
51
+ media . currentTime = value = next_value ;
50
52
}
51
-
52
- updating = false ;
53
53
} ) ;
54
54
55
55
teardown ( ( ) => cancelAnimationFrame ( raf_id ) ) ;
@@ -113,22 +113,21 @@ export function bind_ready_state(media, update) {
113
113
* @param {(playback_rate: number) => void } update
114
114
*/
115
115
export function bind_playback_rate ( media , get_value , update ) {
116
- var updating = false ;
117
-
118
- // Needs to happen after the element is inserted into the dom, else playback will be set back to 1 by the browser.
119
- // For hydration we could do it immediately but the additional code is not worth the lost microtask.
116
+ // Needs to happen after element is inserted into the dom (which is guaranteed by using effect),
117
+ // else playback will be set back to 1 by the browser
120
118
effect ( ( ) => {
121
- var value = get_value ( ) ;
119
+ var value = Number ( get_value ( ) ) ;
122
120
123
- // through isNaN we also allow number strings, which is more robust
124
- if ( ! isNaN ( /** @type {any } */ ( value ) ) && value !== media . playbackRate ) {
125
- updating = true ;
126
- media . playbackRate = /** @type {number } */ ( value ) ;
121
+ if ( value !== media . playbackRate && ! isNaN ( value ) ) {
122
+ media . playbackRate = value ;
127
123
}
124
+ } ) ;
128
125
126
+ // Start listening to ratechange events after the element is inserted into the dom,
127
+ // else playback will be set to 1 by the browser
128
+ effect ( ( ) => {
129
129
listen ( media , [ 'ratechange' ] , ( ) => {
130
- if ( ! updating ) update ( media . playbackRate ) ;
131
- updating = false ;
130
+ update ( media . playbackRate ) ;
132
131
} ) ;
133
132
} ) ;
134
133
}
@@ -200,9 +199,7 @@ export function bind_paused(media, get_value, update) {
200
199
* @param {(volume: number) => void } update
201
200
*/
202
201
export function bind_volume ( media , get_value , update ) {
203
- var updating = false ;
204
202
var callback = ( ) => {
205
- updating = true ;
206
203
update ( media . volume ) ;
207
204
} ;
208
205
@@ -213,14 +210,11 @@ export function bind_volume(media, get_value, update) {
213
210
listen ( media , [ 'volumechange' ] , callback , false ) ;
214
211
215
212
render_effect ( ( ) => {
216
- var value = get_value ( ) ;
213
+ var value = Number ( get_value ( ) ) ;
217
214
218
- // through isNaN we also allow number strings, which is more robust
219
- if ( ! updating && ! isNaN ( /** @type {any } */ ( value ) ) ) {
220
- media . volume = /** @type {number } */ ( value ) ;
215
+ if ( value !== media . volume && ! isNaN ( value ) ) {
216
+ media . volume = value ;
221
217
}
222
-
223
- updating = false ;
224
218
} ) ;
225
219
}
226
220
@@ -230,10 +224,7 @@ export function bind_volume(media, get_value, update) {
230
224
* @param {(muted: boolean) => void } update
231
225
*/
232
226
export function bind_muted ( media , get_value , update ) {
233
- var updating = false ;
234
-
235
227
var callback = ( ) => {
236
- updating = true ;
237
228
update ( media . muted ) ;
238
229
} ;
239
230
@@ -244,9 +235,8 @@ export function bind_muted(media, get_value, update) {
244
235
listen ( media , [ 'volumechange' ] , callback , false ) ;
245
236
246
237
render_effect ( ( ) => {
247
- var value = get_value ( ) ;
238
+ var value = ! ! get_value ( ) ;
248
239
249
- if ( ! updating ) media . muted = ! ! value ;
250
- updating = false ;
240
+ if ( media . muted !== value ) media . muted = value ;
251
241
} ) ;
252
242
}
0 commit comments