У меня есть приложение для тренировок iOS, которое должно оставаться запущенным (и воспроизводить звук), пока я работаю в фоновом режиме. К сожалению, единственный способ добиться этого, о котором я знаю, - это воспроизводить неслышимый звук через Core Audio.
Один пользователь испытывает повторяющийся сбой, который я не могу воспроизвести в своих симуляторах. (У них есть iPhone 5, iOS 10.) Отчет о сбое в XCode указывает на строку, которую я никогда раньше не видел. Может ли timestamp
быть нулевым в обратном вызове рендеринга?
private func render(ctx: UnsafeMutableRawPointer,
ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>,
timeStamp: UnsafePointer<AudioTimeStamp>,
bus: UInt32,
nFrames: UInt32,
ioData: UnsafeMutablePointer<AudioBufferList>?) -> OSStatus
{
guard let ioData = ioData else { return noErr }
let abl = UnsafeMutableAudioBufferListPointer(ioData)
guard let bufferData = abl[0].mData else { return noErr }
let impl = Unmanaged<MyClass>.fromOpaque(ctx).takeUnretainedValue()
let buf: UnsafeMutablePointer<Float32> = bufferData.assumingMemoryBound(to: Float32.self)
// **** Crash appears to pointing to this next line.
var t: Int = Int(timeStamp.pointee.mSampleTime) % impl.samples.count
for i in 0..<Int(nFrames) {
buf[i] = impl.samples[t]
t += 1
if t >= impl.samples.count { t = 0 }
}
...