MPMusicPlayerController пропускает следующую песню после продолжения воспроизведения - PullRequest
0 голосов
/ 22 сентября 2019

Я использую MPMusicPlayerController для воспроизведения песен из Apple Music.Я периодически (каждые несколько секунд) меняю очередь песен с помощью

setQueue(with: MPMusicPlayerStoreQueueDescriptor(storeIDs: ids))

У меня нет проблем во время воспроизведения музыки, очередь песен обновляется по запросу, я могу пропуститьк следующей песне, и все в порядке.Однако всякий раз, когда я приостанавливаю проигрыватель в середине песни, подождите немного, пока не будет установлена ​​новая очередь, и начните воспроизведение снова - текущая песня теряется и начинает воспроизводиться следующая песня!

Итак, представьте следующую ситуацию:

  1. У меня есть песни A, B, C, D
  2. Я установил это как очередь песен и позвонил play()
  3. player.nowPlayingItemвозвращает A
  4. Я установил очередь песни на E, F, G, H во время воспроизведения
  5. Я звоню player.skipToNext() - песня E начинает играть, как и ожидалось
  6. Я звонюplayer.pause() - песня E пауза
  7. Я звоню player.play() - песня E продолжает играть. До сих пор все в порядке
  8. Я снова звоню player.pause() - песня E пауза
  9. Я установил очередь песни на I, J, K, L.
  10. Я звоню player.play() - Я ожидаю, что приостановленная песня E продолжит играть.Вместо этого начинает воспроизводиться песня I

Я также сделал некоторые записи журнала для вышеописанного сценария:

func togglePlayPause() {
    if player.playbackState == .playing {
        player.pause()
    } else {
        NSLog("NP before \(player.nowPlayingItem)") // prints E at step 10
        player.play()
        NSLog("NP after \(player.nowPlayingItem)") // prints nil at step 10
    }
}

Странно, пауза / воспроизведение с экрана блокировки работает нормально, даже если я меняю очередь между ними.

Кто-нибудь сталкивался с подобной проблемой, какие-либо советы / обходные пути, как это исправить?

1 Ответ

0 голосов
/ 23 сентября 2019

В качестве обходного пути я использовал

player.currentPlaybackRate = 1

вместо player.play().Похоже, play() делает больше, чем просто играет из паузы.

...