瀏覽代碼

VLCPlaybackController:send notifications about playback state change when libvlc actually changed it

The notifications were sent too early which caused a wrong determination of isPlaying state in the VLCPlayerDisplayController who observed these
This led to a bug where media was actually playing but there were no controls to actually pause or stop the playback
Carola Nitz 7 年之前
父節點
當前提交
f9867ab3ca
共有 1 個文件被更改,包括 47 次插入35 次删除
  1. 47 35
      Sources/VLCPlaybackController.m

+ 47 - 35
Sources/VLCPlaybackController.m

@@ -251,7 +251,6 @@ typedef NS_ENUM(NSUInteger, VLCAspectRatio) {
 
     _playerIsSetup = YES;
 
-    [[NSNotificationCenter defaultCenter] postNotificationName:VLCPlaybackControllerPlaybackDidStart object:self];
     [_playbackSessionManagementLock unlock];
 }
 
@@ -302,9 +301,7 @@ typedef NS_ENUM(NSUInteger, VLCAspectRatio) {
     [[self remoteControlService] unsubscribeFromRemoteCommands];
 
     [_playbackSessionManagementLock unlock];
-    if (!_sessionWillRestart) {
-        [[NSNotificationCenter defaultCenter] postNotificationName:VLCPlaybackControllerPlaybackDidStop object:self];
-    } else {
+    if (_sessionWillRestart) {
         _sessionWillRestart = NO;
         [self startPlayback];
     }
@@ -704,42 +701,57 @@ typedef NS_ENUM(NSUInteger, VLCAspectRatio) {
 
 - (void)mediaPlayerStateChanged:(NSNotification *)aNotification
 {
-    VLCMediaPlayerState currentState = _mediaPlayer.state;
-
-    if (currentState == VLCMediaPlayerStateBuffering) {
-        /* attach delegate */
-        _mediaPlayer.media.delegate = self;
+    switch (_mediaPlayer.state) {
+        case VLCMediaPlayerStateBuffering: {
+            _mediaPlayer.media.delegate = self;
 
-        /* on-the-fly values through hidden API */
-        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-        [_mediaPlayer performSelector:@selector(setTextRendererFont:) withObject:[defaults objectForKey:kVLCSettingSubtitlesFont]];
-        [_mediaPlayer performSelector:@selector(setTextRendererFontSize:) withObject:[defaults objectForKey:kVLCSettingSubtitlesFontSize]];
-        [_mediaPlayer performSelector:@selector(setTextRendererFontColor:) withObject:[defaults objectForKey:kVLCSettingSubtitlesFontColor]];
-        [_mediaPlayer performSelector:@selector(setTextRendererFontForceBold:) withObject:[defaults objectForKey:kVLCSettingSubtitlesBoldFont]];
-    } else if (currentState == VLCMediaPlayerStateError) {
-        APLog(@"Playback failed");
-        dispatch_async(dispatch_get_main_queue(),^{
-            [[NSNotificationCenter defaultCenter] postNotificationName:VLCPlaybackControllerPlaybackDidFail object:self];
-        });
-        _sessionWillRestart = NO;
-        [self stopPlayback];
-    } else if (currentState == VLCMediaPlayerStateEnded || currentState == VLCMediaPlayerStateStopped) {
-        [_listPlayer.mediaList lock];
-        NSUInteger listCount = _listPlayer.mediaList.count;
-        if ([_listPlayer.mediaList indexOfMedia:_mediaPlayer.media] == listCount - 1 && self.repeatMode == VLCDoNotRepeat) {
-            [_listPlayer.mediaList unlock];
+            /* on-the-fly values through hidden API */
+            NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+            [_mediaPlayer performSelector:@selector(setTextRendererFont:) withObject:[defaults objectForKey:kVLCSettingSubtitlesFont]];
+            [_mediaPlayer performSelector:@selector(setTextRendererFontSize:) withObject:[defaults objectForKey:kVLCSettingSubtitlesFontSize]];
+            [_mediaPlayer performSelector:@selector(setTextRendererFontColor:) withObject:[defaults objectForKey:kVLCSettingSubtitlesFontColor]];
+            [_mediaPlayer performSelector:@selector(setTextRendererFontForceBold:) withObject:[defaults objectForKey:kVLCSettingSubtitlesBoldFont]];
+            break;
+        }
+        case VLCMediaPlayerStateError: {
+            APLog(@"Playback failed");
+            dispatch_async(dispatch_get_main_queue(),^{
+                [[NSNotificationCenter defaultCenter] postNotificationName:VLCPlaybackControllerPlaybackDidFail object:self];
+            });
             _sessionWillRestart = NO;
             [self stopPlayback];
-            return;
-        } else if (listCount > 1) {
-            [_listPlayer.mediaList unlock];
-            [_listPlayer next];
-        } else
-            [_listPlayer.mediaList unlock];
-    }
+        }
+        case VLCMediaPlayerStateEnded:
+        case VLCMediaPlayerStateStopped: {
+            [_listPlayer.mediaList lock];
+            NSUInteger listCount = _listPlayer.mediaList.count;
+            if ([_listPlayer.mediaList indexOfMedia:_mediaPlayer.media] == listCount - 1 && self.repeatMode == VLCDoNotRepeat) {
+                [_listPlayer.mediaList unlock];
+                _sessionWillRestart = NO;
+                [self stopPlayback];
+                return;
+            } else if (listCount > 1) {
+                [_listPlayer.mediaList unlock];
+                [_listPlayer next];
+            } else
+                [_listPlayer.mediaList unlock];
+            dispatch_async(dispatch_get_main_queue(),^{
+                [[NSNotificationCenter defaultCenter] postNotificationName:VLCPlaybackControllerPlaybackDidStop object:self];
+            });
+        } break;
+        case VLCMediaPlayerStatePlaying: {
+            dispatch_async(dispatch_get_main_queue(),^{
+                [[NSNotificationCenter defaultCenter] postNotificationName:VLCPlaybackControllerPlaybackDidStart object:self];
+            });
+            break;
+        }
+        case VLCMediaPlayerStateOpening:
+        case VLCMediaPlayerStatePaused:
+            break;
 
+    }
     if ([self.delegate respondsToSelector:@selector(mediaPlayerStateChanged:isPlaying:currentMediaHasTrackToChooseFrom:currentMediaHasChapters:forPlaybackController:)])
-        [self.delegate mediaPlayerStateChanged:currentState
+        [self.delegate mediaPlayerStateChanged:_mediaPlayer.state
                                      isPlaying:_mediaPlayer.isPlaying
               currentMediaHasTrackToChooseFrom:self.currentMediaHasTrackToChooseFrom
                        currentMediaHasChapters:self.currentMediaHasChapters