diff --git a/just_audio/darwin/Classes/AudioPlayer.m b/just_audio/darwin/Classes/AudioPlayer.m index ba660d5..e3072c4 100644 --- a/just_audio/darwin/Classes/AudioPlayer.m +++ b/just_audio/darwin/Classes/AudioPlayer.m @@ -672,6 +672,7 @@ if ([statusNumber isKindOfClass:[NSNumber class]]) { status = statusNumber.intValue; } + [playerItem.audioSource onStatusChanged:status]; switch (status) { case AVPlayerItemStatusReadyToPlay: { if (playerItem != _player.currentItem) return; diff --git a/just_audio/darwin/Classes/ClippingAudioSource.m b/just_audio/darwin/Classes/ClippingAudioSource.m index 8f0cac8..0adf872 100644 --- a/just_audio/darwin/Classes/ClippingAudioSource.m +++ b/just_audio/darwin/Classes/ClippingAudioSource.m @@ -56,6 +56,8 @@ if (!completionHandler || (self.playerItem.status == AVPlayerItemStatusReadyToPlay)) { CMTime absPosition = CMTimeAdd(_start, position); [_audioSource.playerItem seekToTime:absPosition toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:completionHandler]; + } else { + [super seek:position completionHandler:completionHandler]; } } diff --git a/just_audio/darwin/Classes/IndexedAudioSource.m b/just_audio/darwin/Classes/IndexedAudioSource.m index 316f900..5c94f8d 100644 --- a/just_audio/darwin/Classes/IndexedAudioSource.m +++ b/just_audio/darwin/Classes/IndexedAudioSource.m @@ -4,15 +4,31 @@ @implementation IndexedAudioSource { BOOL _isAttached; + CMTime _queuedSeekPos; + void (^_queuedSeekCompletionHandler)(BOOL); } - (instancetype)initWithId:(NSString *)sid { self = [super init]; NSAssert(self, @"super init cannot be nil"); _isAttached = NO; + _queuedSeekPos = kCMTimeInvalid; + _queuedSeekCompletionHandler = nil; return self; } +- (void)onStatusChanged:(AVPlayerItemStatus)status { + if (status == AVPlayerItemStatusReadyToPlay) { + // This handles a pending seek during a load. + // TODO: Test seeking during a seek. + if (_queuedSeekCompletionHandler) { + [self seek:_queuedSeekPos completionHandler:_queuedSeekCompletionHandler]; + _queuedSeekPos = kCMTimeInvalid; + _queuedSeekCompletionHandler = nil; + } + } +} + - (IndexedPlayerItem *)playerItem { return nil; } @@ -48,6 +64,10 @@ } - (void)seek:(CMTime)position completionHandler:(void (^)(BOOL))completionHandler { + if (completionHandler && (self.playerItem.status != AVPlayerItemStatusReadyToPlay)) { + _queuedSeekPos = position; + _queuedSeekCompletionHandler = completionHandler; + } } - (CMTime)duration { diff --git a/just_audio/darwin/Classes/UriAudioSource.m b/just_audio/darwin/Classes/UriAudioSource.m index 4003bd1..cd6edf7 100644 --- a/just_audio/darwin/Classes/UriAudioSource.m +++ b/just_audio/darwin/Classes/UriAudioSource.m @@ -56,6 +56,8 @@ position = CMTimeAdd(position, range.start); } [_playerItem seekToTime:position toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:completionHandler]; + } else { + [super seek:position completionHandler:completionHandler]; } } diff --git a/just_audio/ios/Classes/IndexedAudioSource.h b/just_audio/ios/Classes/IndexedAudioSource.h index a308a4f..f2dd9af 100644 --- a/just_audio/ios/Classes/IndexedAudioSource.h +++ b/just_audio/ios/Classes/IndexedAudioSource.h @@ -11,6 +11,7 @@ @property (readonly, nonatomic) CMTime bufferedPosition; @property (readonly, nonatomic) BOOL isAttached; +- (void)onStatusChanged:(AVPlayerItemStatus)status; - (void)attach:(AVQueuePlayer *)player; - (void)play:(AVQueuePlayer *)player; - (void)pause:(AVQueuePlayer *)player; diff --git a/just_audio/macos/Classes/IndexedAudioSource.h b/just_audio/macos/Classes/IndexedAudioSource.h index 7d343d8..8c39ad0 100644 --- a/just_audio/macos/Classes/IndexedAudioSource.h +++ b/just_audio/macos/Classes/IndexedAudioSource.h @@ -11,6 +11,7 @@ @property (readonly, nonatomic) CMTime bufferedPosition; @property (readonly, nonatomic) BOOL isAttached; +- (void)onStatusChanged:(AVPlayerItemStatus)status; - (void)attach:(AVQueuePlayer *)player; - (void)play:(AVQueuePlayer *)player; - (void)pause:(AVQueuePlayer *)player;