fix: allow recording while meetings process

This commit is contained in:
2026-08-27 16:05:23 +02:00
parent 204857cdd9
commit 607e1236f7
5 changed files with 92 additions and 63 deletions
+27 -15
View File
@@ -73,7 +73,7 @@ final class AudioManager: NSObject, ObservableObject {
private var recordingStartedAt = Date()
private var systemDiagnostics = SystemCaptureDiagnostics()
private override init() {
override init() {
super.init()
observeAudioEngine()
}
@@ -460,7 +460,8 @@ final class AudioManager: NSObject, ObservableObject {
}
guard let previousBuffer = pendingBuffer,
let previousInputTime = pendingInputTime else {
let previousInputTime = pendingInputTime,
let previousNow = pendingNow else {
pendingBuffer = currentBuffer
pendingInputTime = inInputTime.pointee
pendingNow = inNow.pointee
@@ -471,7 +472,9 @@ final class AudioManager: NSObject, ObservableObject {
advertisedSampleRate: advertisedInputFormat.sampleRate,
previousFrameLength: previousBuffer.frameLength,
previousTimestamp: previousInputTime,
currentTimestamp: inInputTime.pointee
currentTimestamp: inInputTime.pointee,
previousHostTimestamp: previousNow,
currentHostTimestamp: inNow.pointee
)
inputFormat = self.inputFormat(
for: inputData,
@@ -552,27 +555,35 @@ final class AudioManager: NSObject, ObservableObject {
advertisedSampleRate: Double,
previousFrameLength: AVAudioFrameCount,
previousTimestamp: AudioTimeStamp,
currentTimestamp: AudioTimeStamp
currentTimestamp: AudioTimeStamp,
previousHostTimestamp: AudioTimeStamp,
currentHostTimestamp: AudioTimeStamp
) -> Double {
let timestampsAreValid = previousTimestamp.mFlags.contains(.sampleTimeValid)
&& currentTimestamp.mFlags.contains(.sampleTimeValid)
let sampleTimeDelta = currentTimestamp.mSampleTime - previousTimestamp.mSampleTime
guard timestampsAreValid,
advertisedSampleRate > 0,
previousFrameLength > 0,
sampleTimeDelta.isFinite,
sampleTimeDelta > 0 else {
systemDiagnostics.inputRateInference = "advertised (sample timestamps unavailable)"
guard advertisedSampleRate > 0, previousFrameLength > 0 else {
systemDiagnostics.inputRateInference = "advertised (invalid advertised rate or frame count)"
return advertisedSampleRate
}
let inferredSampleRate = advertisedSampleRate * Double(previousFrameLength) / sampleTimeDelta
guard currentHostTimestamp.mHostTime > previousHostTimestamp.mHostTime else {
systemDiagnostics.inputRateInference = "advertised (host timestamps unavailable)"
return advertisedSampleRate
}
let hostTimeDelta = currentHostTimestamp.mHostTime - previousHostTimestamp.mHostTime
let hostNanoseconds = AudioConvertHostTimeToNanos(hostTimeDelta)
guard hostNanoseconds > 0 else {
systemDiagnostics.inputRateInference = "advertised (host-time conversion failed)"
return advertisedSampleRate
}
let inferredSampleRate = Double(previousFrameLength) * 1_000_000_000 / Double(hostNanoseconds)
let plausibleRange = (advertisedSampleRate * 0.25)...(advertisedSampleRate * 1.25)
guard inferredSampleRate.isFinite, plausibleRange.contains(inferredSampleRate) else {
systemDiagnostics.inputRateInference = String(
format: "advertised (invalid inference %.3f from %u frames / %.3f sample-time units)",
format: "advertised (invalid host inference %.3f from %u frames / %llu ns; sampleTimeDelta=%.3f)",
inferredSampleRate,
previousFrameLength,
hostNanoseconds,
sampleTimeDelta
)
return advertisedSampleRate
@@ -584,11 +595,12 @@ final class AudioManager: NSObject, ObservableObject {
.flatMap { abs($0 - inferredSampleRate) / $0 <= 0.01 ? $0 : nil }
?? inferredSampleRate
systemDiagnostics.inputRateInference = String(
format: "advertised=%.3f,inferred=%.3f,selected=%.3f,previousFrames=%u,sampleTimeDelta=%.3f",
format: "source=hostTime,advertised=%.3f,inferred=%.3f,selected=%.3f,previousFrames=%u,hostNanoseconds=%llu,sampleTimeDelta=%.3f",
advertisedSampleRate,
inferredSampleRate,
selectedSampleRate,
previousFrameLength,
hostNanoseconds,
sampleTimeDelta
)
return selectedSampleRate