@@ -16,7 +16,7 @@ import {
16
16
currentTimeAtom ,
17
17
} from 'src/atoms/track'
18
18
19
- function useAudioPlayer ( audioRef : React . MutableRefObject < HTMLAudioElement > | null ) {
19
+ function useAudioPlayer ( ) {
20
20
const [ tracks ] = useAtom ( tracksAtom )
21
21
const resetTracks = useResetAtom ( tracksAtom )
22
22
const [ , toPrevTrack ] = useAtom ( prevTrackAtom )
@@ -30,6 +30,7 @@ function useAudioPlayer(audioRef: React.MutableRefObject<HTMLAudioElement>|null)
30
30
const [ skipTime , setSkipTime ] = useAtom ( skipTimeAtom )
31
31
const [ currentTime ] = useAtom ( currentTimeAtom )
32
32
33
+ const audioRef = useRef < HTMLAudioElement > ( null ! )
33
34
const isReady = useRef ( false )
34
35
35
36
const setMediaMetadata = ( audioTracks : Track [ ] ) => {
@@ -109,17 +110,19 @@ function useAudioPlayer(audioRef: React.MutableRefObject<HTMLAudioElement>|null)
109
110
updatePositionState ( )
110
111
}
111
112
} )
112
- navigator . mediaSession . setActionHandler ( 'previoustrack' , ( ) => toPrevTrack ( audioRef ? .current ) )
113
+ navigator . mediaSession . setActionHandler ( 'previoustrack' , ( ) => toPrevTrack ( audioRef . current ) )
113
114
navigator . mediaSession . setActionHandler ( 'nexttrack' , ( ) => toNextTrack ( ) )
114
115
}
115
116
}
116
117
117
- const onScrub = ( value : string ) => {
118
- if ( audioRef ?. current ) {
119
- audioRef . current . currentTime = parseInt ( value , 10 )
120
- setTrackProgress ( audioRef . current . currentTime )
121
- }
122
- }
118
+ useEffect ( ( ) => {
119
+ // initialize audioRef
120
+ audioRef . current = new Audio ( '/001.wav' )
121
+ return ( ( ) => {
122
+ // prevent memory leak
123
+ audioRef . current . pause ( )
124
+ } )
125
+ } , [ ] )
123
126
124
127
// updatePositionState https://developer.mozilla.org/en-US/docs/Web/API/MediaSession/setPositionState
125
128
useEffect ( ( ) => {
@@ -136,74 +139,61 @@ function useAudioPlayer(audioRef: React.MutableRefObject<HTMLAudioElement>|null)
136
139
} , [ duration , playbackRate , trackProgress ] )
137
140
138
141
useEffect ( ( ) => {
139
- if ( audioRef ?. current ) {
140
- audioRef . current . volume = volume
141
- }
142
+ audioRef . current . volume = volume
142
143
} , [ volume ] )
143
144
144
145
useEffect ( ( ) => {
145
- if ( audioRef ?. current ) {
146
- audioRef . current . muted = isMute
147
- }
146
+ audioRef . current . muted = isMute
148
147
} , [ isMute ] )
149
148
150
149
useEffect ( ( ) => {
151
- if ( audioRef ?. current ) {
152
- audioRef . current . currentTime = currentTime
153
- setTrackProgress ( audioRef . current . currentTime )
154
- }
150
+ audioRef . current . currentTime = currentTime
151
+ setTrackProgress ( audioRef . current . currentTime )
155
152
} , [ currentTime ] )
156
153
157
154
useEffect ( ( ) => {
158
- if ( audioRef ?. current ) {
159
- // seekforward
160
- if ( skipTime > 0 ) {
161
- audioRef . current . currentTime = Math . min ( audioRef . current . currentTime + skipTime , audioRef . current . duration )
162
- //seekbackward
163
- } else if ( skipTime < 0 ) {
164
- audioRef . current . currentTime = Math . max ( audioRef . current . currentTime + skipTime , 0 )
165
- } else {
166
- return
167
- }
168
- setTrackProgress ( audioRef . current . currentTime )
169
- updatePositionState ( )
170
- setSkipTime ( 0 )
155
+ // seekforward
156
+ if ( skipTime > 0 ) {
157
+ audioRef . current . currentTime = Math . min ( audioRef . current . currentTime + skipTime , audioRef . current . duration )
158
+ //seekbackward
159
+ } else if ( skipTime < 0 ) {
160
+ audioRef . current . currentTime = Math . max ( audioRef . current . currentTime + skipTime , 0 )
161
+ } else {
162
+ return
171
163
}
164
+ setTrackProgress ( audioRef . current . currentTime )
165
+ updatePositionState ( )
166
+ setSkipTime ( 0 )
172
167
} , [ skipTime ] )
173
168
174
169
useEffect ( ( ) => {
175
170
if ( isPlaying ) {
176
- audioRef ?. current ?. play ( ) . then ( _ => {
177
- if ( audioRef . current ) {
178
- setDuration ( audioRef . current . duration )
179
- setActionHandler ( )
180
- }
171
+ audioRef . current . play ( ) . then ( _ => {
172
+ setDuration ( audioRef . current . duration )
173
+ setActionHandler ( )
181
174
} )
182
175
} else {
183
- audioRef ? .current ? .pause ( )
176
+ audioRef . current . pause ( )
184
177
}
185
178
} , [ isPlaying ] )
186
179
187
180
// Handles cleanup and setup when changing tracks
188
181
useEffect ( ( ) => {
189
- audioRef ? .current ? .pause ( )
182
+ audioRef . current . pause ( )
190
183
191
184
if ( tracks [ 0 ] && isReady . current ) {
192
185
// remove previous audio eventlisners
193
- if ( audioRef ?. current ) {
194
- audioRef . current . removeEventListener ( 'timeupdate' , ( _event ) => {
195
- if ( audioRef . current ?. ended ) {
196
- toNextTrack ( )
197
- } else if ( audioRef . current ) {
198
- setTrackProgress ( audioRef . current . currentTime )
199
- }
200
- } )
201
- }
202
- if ( audioRef ) {
203
- audioRef . current = new Audio ( tracks [ 0 ] . audioSrc )
204
- }
186
+ audioRef . current . removeEventListener ( 'timeupdate' , ( _event ) => {
187
+ if ( audioRef . current . ended ) {
188
+ toNextTrack ( )
189
+ } else {
190
+ setTrackProgress ( audioRef . current . currentTime )
191
+ }
192
+ } )
193
+
194
+ audioRef . current = new Audio ( tracks [ 0 ] . audioSrc )
205
195
// https://developer.mozilla.org/en-US/docs/Web/API/MediaMetadata
206
- audioRef ? .current . play ( ) . then ( _ => {
196
+ audioRef . current . play ( ) . then ( _ => {
207
197
if ( audioRef . current ) {
208
198
setDuration ( audioRef . current . duration )
209
199
setTrackProgress ( audioRef . current . currentTime )
@@ -212,8 +202,8 @@ function useAudioPlayer(audioRef: React.MutableRefObject<HTMLAudioElement>|null)
212
202
setIsPlaying ( true )
213
203
}
214
204
} )
215
- audioRef ? .current . addEventListener ( 'timeupdate' , ( _event ) => {
216
- if ( audioRef . current ? .ended ) {
205
+ audioRef . current . addEventListener ( 'timeupdate' , ( _event ) => {
206
+ if ( audioRef . current . ended ) {
217
207
toNextTrack ( )
218
208
} else if ( audioRef . current ) {
219
209
setTrackProgress ( audioRef . current . currentTime )
@@ -227,7 +217,6 @@ function useAudioPlayer(audioRef: React.MutableRefObject<HTMLAudioElement>|null)
227
217
228
218
return {
229
219
audioRef,
230
- onScrub,
231
220
}
232
221
}
233
222
0 commit comments