Как сделать seek AVAudioEngine с AVAudioPCMBuffer?

У меня есть raw audio byte stream который я получаю из нативной либы, теперь мне нужно как его проиграть на iOS используя AVAudioEngine. Единственный способ который я нашел это сделать из этого бафера AVAudioPCMBuffer и уже его использовать в AVAudioEngine вот так

...
        player.scheduleBuffer(pcmBuf, completionHandler: nil)
        if !player.isPlaying { player.play() }
...

с этим вроде разобрались, но теперь вопрос как сделать seek? Я нашел пример вот тут

https://www.raywenderlich.com/21672160-avaudioengine-tutorial-for-ios-getting-started

  private func seek(to time: Double) {
    guard let audioFile = audioFile else {
      return
    }

    // 1
    let offset = AVAudioFramePosition(time * audioSampleRate)
    seekFrame = currentPosition + offset
    seekFrame = max(seekFrame, 0)
    seekFrame = min(seekFrame, audioLengthSamples)
    currentPosition = seekFrame

    // 2
    let wasPlaying = player.isPlaying
    player.stop()

    if currentPosition < audioLengthSamples {
      updateDisplay()
      needsFileScheduled = false

      let frameCount = AVAudioFrameCount(audioLengthSamples - seekFrame)
      // 3
      player.scheduleSegment(
        audioFile,
        startingFrame: seekFrame,
        frameCount: frameCount,
        at: nil
      ) {
        self.needsFileScheduled = true
      }

      // 4
      if wasPlaying {
        player.play()
      }
    }
  }

где эта логика реализована, но проблема в том, что нет такого метода scheduleSegment который принимает как параметр startingFrame для AVAudioPCMBuffer.

Вопрос остается открытым - как сделать seek если я использую бафер AVAudioPCMBuffer?


Ответы (0 шт):