Pre-release fixes

This commit is contained in:
Ali
2021-05-27 00:53:13 +04:00
parent e0c9559a5c
commit ce23616a4c
18 changed files with 307 additions and 198 deletions

View File

@@ -24,7 +24,7 @@ final class PresentationCallToneRenderer {
private var toneRendererAudioSessionActivated = false
private let audioLevelPipe = ValuePipe<Float>()
init(tone: PresentationCallTone) {
init(tone: PresentationCallTone, completed: (() -> Void)? = nil) {
let queue = Queue.mainQueue()
self.queue = queue
@@ -52,6 +52,7 @@ final class PresentationCallToneRenderer {
let toneDataOffset = Atomic<Int>(value: 0)
let toneData = Atomic<Data?>(value: nil)
let reportedCompletion = Atomic<Bool>(value: false)
self.toneRenderer.beginRequestingFrames(queue: DispatchQueue.global(), takeFrame: {
var data = toneData.with { $0 }
@@ -63,6 +64,9 @@ final class PresentationCallToneRenderer {
}
guard let toneData = data else {
if !reportedCompletion.swap(true) {
completed?()
}
return .finished
}
@@ -83,6 +87,11 @@ final class PresentationCallToneRenderer {
if let takeOffset = takeOffset {
if let toneDataMaxOffset = toneDataMaxOffset, takeOffset >= toneDataMaxOffset {
if !reportedCompletion.swap(true) {
Queue.mainQueue().after(1.0, {
completed?()
})
}
return .finished
}
@@ -117,6 +126,9 @@ final class PresentationCallToneRenderer {
let status = CMBlockBufferCreateWithMemoryBlock(allocator: nil, memoryBlock: bytes, blockLength: frameSize, blockAllocator: nil, customBlockSource: nil, offsetToData: 0, dataLength: frameSize, flags: 0, blockBufferOut: &blockBuffer)
if status != noErr {
if !reportedCompletion.swap(true) {
completed?()
}
return .finished
}
@@ -127,15 +139,24 @@ final class PresentationCallToneRenderer {
var sampleBuffer: CMSampleBuffer?
var sampleSize = frameSize
guard CMSampleBufferCreate(allocator: nil, dataBuffer: blockBuffer, dataReady: true, makeDataReadyCallback: nil, refcon: nil, formatDescription: nil, sampleCount: 1, sampleTimingEntryCount: 1, sampleTimingArray: &timingInfo, sampleSizeEntryCount: 1, sampleSizeArray: &sampleSize, sampleBufferOut: &sampleBuffer) == noErr else {
if !reportedCompletion.swap(true) {
completed?()
}
return .finished
}
if let sampleBuffer = sampleBuffer {
return .frame(MediaTrackFrame(type: .audio, sampleBuffer: sampleBuffer, resetDecoder: false, decoded: true))
} else {
if !reportedCompletion.swap(true) {
completed?()
}
return .finished
}
} else {
if !reportedCompletion.swap(true) {
completed?()
}
return .finished
}
})