fix: avoid screen recorder data races

main
Peter Steinberger 2025-12-29 20:22:26 +01:00
parent 65478a6ff3
commit c14d738d37
1 changed files with 93 additions and 91 deletions

View File

@ -50,11 +50,6 @@ final class ScreenRecordService {
}()
try? FileManager.default.removeItem(at: outURL)
let recorder = RPScreenRecorder.shared()
await MainActor.run {
recorder.isMicrophoneEnabled = includeAudio
}
var writer: AVAssetWriter?
var videoInput: AVAssetWriterInput?
var audioInput: AVAssetWriterInput?
@ -77,8 +72,7 @@ final class ScreenRecordService {
}
try await withCheckedThrowingContinuation { (cont: CheckedContinuation<Void, Error>) in
Task { @MainActor in
recorder.startCapture(handler: { sample, type, error in
let handler: @Sendable (CMSampleBuffer, RPSampleBufferType, Error?) -> Void = { sample, type, error in
if let error {
setHandlerError(error)
return
@ -172,9 +166,16 @@ final class ScreenRecordService {
@unknown default:
break
}
}, completionHandler: { error in
}
let completion: @Sendable (Error?) -> Void = { error in
if let error { cont.resume(throwing: error) } else { cont.resume() }
})
}
Task { @MainActor in
let recorder = RPScreenRecorder.shared()
recorder.isMicrophoneEnabled = includeAudio
recorder.startCapture(handler: handler, completionHandler: completion)
}
}
@ -182,6 +183,7 @@ final class ScreenRecordService {
let stopError = await withCheckedContinuation { cont in
Task { @MainActor in
let recorder = RPScreenRecorder.shared()
recorder.stopCapture { error in cont.resume(returning: error) }
}
}