Может ли временная метка быть нулевой в ядре звукового обратного вызова рендеринга? - PullRequest
0 голосов
/ 01 июля 2018

У меня есть приложение для тренировок 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 }
    }
    ...
...