@@ -7,6 +7,8 @@ public final class AudioPlayer: ObservableObject {
7
7
private let timeUpdateInterval : CMTime
8
8
private var task : Task < Void , Never > ?
9
9
private var synchronizer : AudioSynchronizer ?
10
+ private let didStartPlaying : @Sendable ( ) -> Void
11
+ private let didFinishPlaying : @Sendable ( ) -> Void
10
12
11
13
@Published public private( set) var error : AudioPlayerError ?
12
14
@Published public private( set) var state = AudioPlayerState . initial
@@ -24,8 +26,14 @@ public final class AudioPlayer: ObservableObject {
24
26
set { synchronizer? . isMuted = newValue }
25
27
}
26
28
27
- public init ( timeUpdateInterval: CMTime = CMTime ( value: 1 , timescale: 10 ) ) {
29
+ public init (
30
+ timeUpdateInterval: CMTime = CMTime ( value: 1 , timescale: 10 ) ,
31
+ didStartPlaying: @escaping @Sendable ( ) -> Void = { } ,
32
+ didFinishPlaying: @escaping @Sendable ( ) -> Void = { }
33
+ ) {
28
34
self . timeUpdateInterval = timeUpdateInterval
35
+ self . didStartPlaying = didStartPlaying
36
+ self . didFinishPlaying = didFinishPlaying
29
37
}
30
38
31
39
deinit {
@@ -94,10 +102,13 @@ public final class AudioPlayer: ObservableObject {
94
102
self ? . setTime ( time)
95
103
} onError: { [ weak self] error in
96
104
self ? . setError ( error)
105
+ self ? . didFinishPlaying ( )
97
106
} onComplete: { [ weak self] in
98
107
self ? . setState ( . completed)
108
+ self ? . didFinishPlaying ( )
99
109
} onPlaying: { [ weak self] in
100
110
self ? . setState ( . playing)
111
+ self ? . didStartPlaying ( )
101
112
} onPaused: { [ weak self] in
102
113
self ? . setState ( . paused)
103
114
} onSampleBufferChanged: { [ weak self] buffer in
0 commit comments