fix: allow recording while meetings process
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user