AVAudioPlayerNode пропускает много звуков при остановке и повторном запуске - PullRequest
4 голосов
/ 20 июня 2020

Я периодически планирую буфер, используя функцию scheduleBuffer. Обработчик завершения планирует следующий звук по завершении текущего, например:

func scheduleSounds() {
    if !isPlaying { return }
   
    while beatsScheduled < beatsToScheduleAhead {
        // Returns AVAudioTime of the next sound, based on sample time
        // first sound is always sample time 0, then increments.
        let nextTime = getNextTime()

        player.scheduleBuffer(
            soundBuffer,
            at: nextTime,
            options: AVAudioPlayerNodeBufferOptions(rawValue: 0),
            completionHandler: {
                self.queue!.sync {
                    print("Finished playing a sound!")
                    scheduleSounds()
                }
            }
        )

        beatsScheduled += 1

        if !playerStarted {
            player.play(at: nil)
            playerStarted = true
        }
    }
}

Когда я останавливаюсь, а затем запускаю проигрыватель / движок, есть задержка до начала воспроизведения звука и после записи в журнал, какие звуки воспроизводятся когда я заметил, что есть пара звуков, которые движок не воспроизводит. Я подозреваю, что узлы проигрывателя думают, что время выборки уже прошло относительно времени узла проигрывателя. Я думаю, что, возможно, я не сбрасываю или останавливаю что-то должным образом, вот как я запускаю и останавливаю звуки:

func start() {
    do {
        try engine.start()

        isPlaying = true

        queue!.sync() {
            self.scheduleSounds()
        }
    } catch {
        print("\(error)")
    }
}

func stop() {
    isPlaying = false
        
    player.stop()
    engine.stop()
        
    playerStarted = false
}

Итак, проблема в том, как мне убедиться, что нет звуков, которые AVAudioPlayerNode пропускает перед воспроизведением звука?

...