Skip to content

Commit 10487c1

Browse files
committed
Fix crash when parsing audio packets
1 parent 5689c66 commit 10487c1

File tree

1 file changed

+34
-24
lines changed

1 file changed

+34
-24
lines changed

Sources/AudioFileStream.swift

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ final class AudioFileStream {
1515
private let receiveASBD: ASBDCallback
1616
private let receivePackets: PacketsCallback
1717

18+
private let syncQueue = DispatchQueue(label: "com.audio-player.file-stream.queue", qos: .userInitiated)
19+
1820
private(set) var audioStreamID: AudioFileStreamID?
1921
private(set) var fileTypeID: AudioFileTypeID?
2022

@@ -32,41 +34,49 @@ final class AudioFileStream {
3234

3335
@discardableResult
3436
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) }
5053

51-
return self
54+
return self
55+
}
5256
}
5357

5458
func close() {
55-
audioStreamID.flatMap { _ = AudioFileStreamClose($0) }
56-
audioStreamID = nil
59+
syncQueue.sync {
60+
audioStreamID.flatMap { _ = AudioFileStreamClose($0) }
61+
audioStreamID = nil
62+
}
5763
}
5864

5965
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+
}
6472
}
6573
}
6674

6775
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+
}
7080
}
7181

7282
// MARK: - Private

0 commit comments

Comments
 (0)