@@ -19,7 +19,7 @@ final class AudioSynchronizer {
19
19
private let onPaused : PausedCallback
20
20
private let timeUpdateInterval : CMTime
21
21
22
- private var receiveComplete = false
22
+ private var receiveComplete = false
23
23
private var audioBuffersQueue : AudioBuffersQueue ?
24
24
private var audioFileStream : AudioFileStream ?
25
25
private var audioRenderer : AVSampleBufferAudioRenderer ?
@@ -99,8 +99,10 @@ final class AudioSynchronizer {
99
99
closeFileStream ( )
100
100
cancelObservation ( )
101
101
receiveComplete = false
102
- audioSynchronizer = nil
102
+ audioRenderer. flatMap { audioSynchronizer? . removeRenderer ( $0, at: . zero) }
103
+ audioRenderer? . stopRequestingMediaData ( )
103
104
audioRenderer = nil
105
+ audioSynchronizer = nil
104
106
}
105
107
106
108
// MARK: - Private
@@ -140,28 +142,22 @@ final class AudioSynchronizer {
140
142
) {
141
143
observeRenderer ( audioRenderer, synchronizer: audioSynchronizer)
142
144
audioRenderer. requestMediaDataWhenReady ( on: queue) { [ weak self] in
143
- self ? . provideMediaDataIfNeeded (
145
+ self ? . provideMediaDataIfNeeded ( )
146
+ }
147
+ }
148
+
149
+ private func provideMediaDataIfNeeded( ) {
150
+ guard let audioRenderer, let audioSynchronizer, let audioBuffersQueue else { return }
151
+ while let buffer = audioBuffersQueue. peek ( ) , audioRenderer. isReadyForMoreMediaData {
152
+ audioRenderer. enqueue ( buffer)
153
+ audioBuffersQueue. removeFirst ( )
154
+ startPlaybackIfCan (
144
155
audioRenderer: audioRenderer,
145
156
audioSynchronizer: audioSynchronizer
146
157
)
147
158
}
148
- }
149
-
150
- private func provideMediaDataIfNeeded(
151
- audioRenderer: AVSampleBufferAudioRenderer ,
152
- audioSynchronizer: AVSampleBufferRenderSynchronizer
153
- ) {
154
- while audioRenderer. isReadyForMoreMediaData {
155
- if let buffer = audioBuffersQueue? . dequeue ( ) {
156
- audioRenderer. enqueue ( buffer)
157
- startPlaybackIfCan (
158
- audioRenderer: audioRenderer,
159
- audioSynchronizer: audioSynchronizer
160
- )
161
- } else if receiveComplete {
162
- audioRenderer. stopRequestingMediaData ( )
163
- break
164
- }
159
+ if audioBuffersQueue. isEmpty && receiveComplete {
160
+ audioRenderer. stopRequestingMediaData ( )
165
161
}
166
162
}
167
163
@@ -203,10 +199,11 @@ final class AudioSynchronizer {
203
199
private func observeRate( _ audioSynchronizer: AVSampleBufferRenderSynchronizer ) {
204
200
cancelRateObservation ( )
205
201
let name = AVSampleBufferRenderSynchronizer . rateDidChangeNotification
206
- audioRendererRateCancellable = NotificationCenter . default. publisher ( for: name) . sink { [ weak self] _ in
207
- guard let self else { return }
208
- onRateChanged ( audioSynchronizer. rate)
209
- }
202
+ audioRendererRateCancellable = NotificationCenter . default
203
+ . publisher ( for: name) . sink { [ weak self, weak audioSynchronizer] _ in
204
+ guard let self, let audioSynchronizer else { return }
205
+ onRateChanged ( audioSynchronizer. rate)
206
+ }
210
207
}
211
208
212
209
private func cancelRateObservation( ) {
@@ -226,6 +223,7 @@ final class AudioSynchronizer {
226
223
audioSynchronizer. setRate ( 0.0 , time: audioSynchronizer. currentTime ( ) )
227
224
onRateChanged ( 0.0 )
228
225
onComplete ( )
226
+ invalidate ( )
229
227
} else {
230
228
onTimeChanged ( time)
231
229
}
0 commit comments