fix: avoid screen recorder data races

This commit is contained in:
Peter Steinberger
2025-12-29 20:22:26 +01:00
parent 65478a6ff3
commit c14d738d37

View File

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