@@ -15,6 +15,8 @@ final class AudioFileStream {
15
15
private let receiveASBD : ASBDCallback
16
16
private let receivePackets : PacketsCallback
17
17
18
+ private let syncQueue = DispatchQueue ( label: " com.audio-player.file-stream.queue " , qos: . userInitiated)
19
+
18
20
private( set) var audioStreamID : AudioFileStreamID ?
19
21
private( set) var fileTypeID : AudioFileTypeID ?
20
22
@@ -32,41 +34,49 @@ final class AudioFileStream {
32
34
33
35
@discardableResult
34
36
func open( ) -> Self {
35
- let instance = UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) )
36
- let status = AudioFileStreamOpen ( instance, { instance, _, propertyID, _ in
37
- let stream = Unmanaged < AudioFileStream > . fromOpaque ( instance) . takeUnretainedValue ( )
38
- stream. onFileStreamPropertyReceived ( propertyID: propertyID)
39
- } , { instance, numberBytes, numberPackets, bytes, packets in
40
- let stream = Unmanaged < AudioFileStream > . fromOpaque ( instance) . takeUnretainedValue ( )
41
- stream. onFileStreamPacketsReceived (
42
- numberOfBytes: numberBytes,
43
- bytes: bytes,
44
- numberOfPackets: numberPackets,
45
- packets: packets
46
- )
47
- } , fileTypeID ?? 0 , & audioStreamID )
48
- if status != noErr { receiveError ( . status( status) ) }
49
- if audioStreamID == nil { receiveError ( . streamNotOpened) }
37
+ syncQueue. sync {
38
+ let instance = UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) )
39
+ let status = AudioFileStreamOpen ( instance, { instance, _, propertyID, _ in
40
+ let stream = Unmanaged < AudioFileStream > . fromOpaque ( instance) . takeUnretainedValue ( )
41
+ stream. onFileStreamPropertyReceived ( propertyID: propertyID)
42
+ } , { instance, numberBytes, numberPackets, bytes, packets in
43
+ let stream = Unmanaged < AudioFileStream > . fromOpaque ( instance) . takeUnretainedValue ( )
44
+ stream. onFileStreamPacketsReceived (
45
+ numberOfBytes: numberBytes,
46
+ bytes: bytes,
47
+ numberOfPackets: numberPackets,
48
+ packets: packets
49
+ )
50
+ } , fileTypeID ?? 0 , & audioStreamID )
51
+ if status != noErr { receiveError ( . status( status) ) }
52
+ if audioStreamID == nil { receiveError ( . streamNotOpened) }
50
53
51
- return self
54
+ return self
55
+ }
52
56
}
53
57
54
58
func close( ) {
55
- audioStreamID. flatMap { _ = AudioFileStreamClose ( $0) }
56
- audioStreamID = nil
59
+ syncQueue. sync {
60
+ audioStreamID. flatMap { _ = AudioFileStreamClose ( $0) }
61
+ audioStreamID = nil
62
+ }
57
63
}
58
64
59
65
func parseData( _ data: Data ) {
60
- guard let audioStreamID else { return }
61
- data. withUnsafeBytes { pointer in
62
- guard let baseAddress = pointer. baseAddress else { return }
63
- AudioFileStreamParseBytes ( audioStreamID, UInt32 ( data. count) , baseAddress, [ ] )
66
+ syncQueue. sync {
67
+ guard let audioStreamID else { return }
68
+ data. withUnsafeBytes { pointer in
69
+ guard let baseAddress = pointer. baseAddress else { return }
70
+ AudioFileStreamParseBytes ( audioStreamID, UInt32 ( data. count) , baseAddress, [ ] )
71
+ }
64
72
}
65
73
}
66
74
67
75
func finishDataParsing( ) {
68
- guard let audioStreamID else { return }
69
- AudioFileStreamParseBytes ( audioStreamID, 0 , nil , [ ] )
76
+ syncQueue. sync {
77
+ guard let audioStreamID else { return }
78
+ AudioFileStreamParseBytes ( audioStreamID, 0 , nil , [ ] )
79
+ }
70
80
}
71
81
72
82
// MARK: - Private
0 commit comments