diff --git a/just_audio/darwin/Classes/AudioPlayer.m b/just_audio/darwin/Classes/AudioPlayer.m index f21282d..8bc0082 100644 --- a/just_audio/darwin/Classes/AudioPlayer.m +++ b/just_audio/darwin/Classes/AudioPlayer.m @@ -616,9 +616,10 @@ - (void)onComplete:(NSNotification *)notification { NSLog(@"onComplete"); if (_loopMode == loopOne) { + __weak __typeof__(self) weakSelf = self; [self seek:kCMTimeZero index:@(_index) completionHandler:^(BOOL finished) { // XXX: Not necessary? - [self play]; + [weakSelf play]; }]; } else { IndexedPlayerItem *endedPlayerItem = (IndexedPlayerItem *)notification.object; @@ -645,16 +646,18 @@ // sources. // For now we just do a seek back to the start. if ([_order count] == 1) { + __weak __typeof__(self) weakSelf = self; [self seek:kCMTimeZero index:_order[0] completionHandler:^(BOOL finished) { // XXX: Necessary? - [self play]; + [weakSelf play]; }]; } else { // When an item ends, seek back to its beginning. [endedSource seek:kCMTimeZero]; + __weak __typeof__(self) weakSelf = self; [self seek:kCMTimeZero index:_order[0] completionHandler:^(BOOL finished) { // XXX: Necessary? - [self play]; + [weakSelf play]; }]; } } else { @@ -719,9 +722,10 @@ _loadResult = nil; } if (CMTIME_IS_VALID(_initialPos) && CMTIME_COMPARE_INLINE(_initialPos, >, kCMTimeZero)) { + __weak __typeof__(self) weakSelf = self; [playerItem.audioSource seek:_initialPos completionHandler:^(BOOL finished) { - [self updatePosition]; - [self broadcastPlaybackEvent]; + [weakSelf updatePosition]; + [weakSelf broadcastPlaybackEvent]; }]; _initialPos = kCMTimeZero; } @@ -841,10 +845,11 @@ [self enterBuffering:@"currentItem changed, seeking"]; [self updatePosition]; [self broadcastPlaybackEvent]; + __weak __typeof__(self) weakSelf = self; [source seek:kCMTimeZero completionHandler:^(BOOL finished) { - [self leaveBuffering:@"currentItem changed, finished seek"]; - [self updatePosition]; - [self broadcastPlaybackEvent]; + [weakSelf leaveBuffering:@"currentItem changed, finished seek"]; + [weakSelf updatePosition]; + [weakSelf broadcastPlaybackEvent]; if (shouldResumePlayback) { _player.actionAtItemEnd = originalEndAction; // TODO: This logic is almost duplicated in seek. See if we can reuse this code. @@ -1135,8 +1140,9 @@ [self enterBuffering:@"seek"]; [self updatePosition]; [self broadcastPlaybackEvent]; + __weak __typeof__(self) weakSelf = self; [_indexedAudioSources[_index] seek:position completionHandler:^(BOOL finished) { - [self updatePosition]; + [weakSelf updatePosition]; if (_playing) { // If playing, buffering will be detected either by: // 1. checkForDiscontinuity @@ -1156,17 +1162,17 @@ // !playbackBufferEmpty. Although this always seems to // be full even right after a seek. if (_player.currentItem.playbackBufferEmpty) { - [self enterBuffering:@"seek finished, playbackBufferEmpty"]; + [weakSelf enterBuffering:@"seek finished, playbackBufferEmpty"]; } else { - [self leaveBuffering:@"seek finished, !playbackBufferEmpty"]; + [weakSelf leaveBuffering:@"seek finished, !playbackBufferEmpty"]; } - [self updatePosition]; + [weakSelf updatePosition]; if (_processingState != buffering) { - [self broadcastPlaybackEvent]; + [weakSelf broadcastPlaybackEvent]; } } _seekPos = kCMTimeInvalid; - [self broadcastPlaybackEvent]; + [weakSelf broadcastPlaybackEvent]; if (completionHandler) { completionHandler(finished); } @@ -1191,6 +1197,7 @@ for (int i = 0; i < [_indexedAudioSources count]; i++) { [self removeItemObservers:_indexedAudioSources[i].playerItem]; } + _indexedAudioSources = nil; } _audioSource = nil; if (_player) { @@ -1201,8 +1208,8 @@ _player = nil; } // Untested: - // [_eventChannel setStreamHandler:nil]; - // [_methodChannel setMethodHandler:nil]; + [_eventChannel setStreamHandler:nil]; + [_methodChannel setMethodCallHandler:nil]; } @end diff --git a/just_audio/darwin/Classes/IndexedPlayerItem.m b/just_audio/darwin/Classes/IndexedPlayerItem.m index 87fafe0..7a02186 100644 --- a/just_audio/darwin/Classes/IndexedPlayerItem.m +++ b/just_audio/darwin/Classes/IndexedPlayerItem.m @@ -1,16 +1,6 @@ #import "IndexedPlayerItem.h" #import "IndexedAudioSource.h" -@implementation IndexedPlayerItem { - IndexedAudioSource *_audioSource; -} - --(void)setAudioSource:(IndexedAudioSource *)audioSource { - _audioSource = audioSource; -} - --(IndexedAudioSource *)audioSource { - return _audioSource; -} - +@implementation IndexedPlayerItem +@synthesize audioSource; @end diff --git a/just_audio/ios/Classes/IndexedPlayerItem.h b/just_audio/ios/Classes/IndexedPlayerItem.h index 5d4a11c..8a86a94 100644 --- a/just_audio/ios/Classes/IndexedPlayerItem.h +++ b/just_audio/ios/Classes/IndexedPlayerItem.h @@ -4,6 +4,6 @@ @interface IndexedPlayerItem : AVPlayerItem -@property (readwrite, nonatomic) IndexedAudioSource *audioSource; +@property (readwrite, nonatomic, weak) IndexedAudioSource *audioSource; @end diff --git a/just_audio/macos/Classes/IndexedPlayerItem.h b/just_audio/macos/Classes/IndexedPlayerItem.h index 5d4a11c..8a86a94 100644 --- a/just_audio/macos/Classes/IndexedPlayerItem.h +++ b/just_audio/macos/Classes/IndexedPlayerItem.h @@ -4,6 +4,6 @@ @interface IndexedPlayerItem : AVPlayerItem -@property (readwrite, nonatomic) IndexedAudioSource *audioSource; +@property (readwrite, nonatomic, weak) IndexedAudioSource *audioSource; @end