1
- import { Howl } from " howler" ;
2
- import { TimelineEngine } from " @xzdarcy/react-timeline-editor" ;
1
+ import { Howl } from ' howler' ;
2
+ import { TimelineEngine } from ' @xzdarcy/react-timeline-editor' ;
3
3
4
4
class AudioControl {
5
5
cacheMap : Record < string , Howl > = { } ;
6
- listenerMap : Record < string , {
7
- time ?: ( data : { time : number } ) => void
8
- rate ?: ( data : { rate : number } ) => void
9
- } > = { } ;
6
+ listenerMap : Record <
7
+ string ,
8
+ {
9
+ time ?: ( data : { time : number } ) => void ;
10
+ rate ?: ( data : { rate : number } ) => void ;
11
+ }
12
+ > = { } ;
10
13
11
- start ( data : { id : string ; engine : TimelineEngine , src : string ; startTime : number ; time : number } ) {
14
+ start ( data : { id : string ; engine : TimelineEngine ; src : string ; startTime : number ; time : number } ) {
12
15
const { id, src, startTime, time, engine } = data ;
13
16
let item : Howl ;
14
17
if ( this . cacheMap [ id ] ) {
@@ -19,8 +22,10 @@ class AudioControl {
19
22
} else {
20
23
item = new Howl ( { src, loop : true , autoplay : true } ) ;
21
24
this . cacheMap [ id ] = item ;
22
- item . rate ( engine . getPlayRate ( ) ) ;
23
- item . seek ( ( time - startTime ) % item . duration ( ) ) ;
25
+ item . on ( 'load' , ( ) => {
26
+ item . rate ( engine . getPlayRate ( ) ) ;
27
+ item . seek ( ( time - startTime ) % item . duration ( ) ) ;
28
+ } ) ;
24
29
}
25
30
26
31
const timeListener = ( data : { time : number } ) => {
@@ -31,9 +36,9 @@ class AudioControl {
31
36
const { rate } = data ;
32
37
item . rate ( rate ) ;
33
38
} ;
34
- if ( ! this . listenerMap [ id ] ) this . listenerMap [ id ] = { } ;
35
- engine . on ( " afterSetTime" , timeListener ) ;
36
- engine . on ( " afterSetPlayRate" , rateListener ) ;
39
+ if ( ! this . listenerMap [ id ] ) this . listenerMap [ id ] = { } ;
40
+ engine . on ( ' afterSetTime' , timeListener ) ;
41
+ engine . on ( ' afterSetPlayRate' , rateListener ) ;
37
42
this . listenerMap [ id ] . time = timeListener ;
38
43
this . listenerMap [ id ] . rate = rateListener ;
39
44
}
@@ -43,13 +48,12 @@ class AudioControl {
43
48
if ( this . cacheMap [ id ] ) {
44
49
const item = this . cacheMap [ id ] ;
45
50
item . stop ( ) ;
46
- if ( this . listenerMap [ id ] ) {
47
- this . listenerMap [ id ] . time && engine . off ( " afterSetTime" , this . listenerMap [ id ] . time ) ;
48
- this . listenerMap [ id ] . rate && engine . off ( " afterSetPlayRate" , this . listenerMap [ id ] . rate ) ;
49
- delete this . listenerMap [ id ]
51
+ if ( this . listenerMap [ id ] ) {
52
+ this . listenerMap [ id ] . time && engine . off ( ' afterSetTime' , this . listenerMap [ id ] . time ) ;
53
+ this . listenerMap [ id ] . rate && engine . off ( ' afterSetPlayRate' , this . listenerMap [ id ] . rate ) ;
54
+ delete this . listenerMap [ id ] ;
50
55
}
51
56
}
52
-
53
57
}
54
58
}
55
59
0 commit comments