Я периодически планирую буфер, используя функцию 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 пропускает перед воспроизведением звука?