[vlc-commits] macosx/StatusBarIcon: update implementation for new playlist / new player

Felix Paul Kühne git at videolan.org
Mon Feb 11 14:30:57 CET 2019


vlc | branch: master | Felix Paul Kühne <felix at feepk.net> | Mon Feb 11 14:30:35 2019 +0100| [2597b9ea8fcf47c2d177359c37d221040ece0939] | committer: Felix Paul Kühne

macosx/StatusBarIcon: update implementation for new playlist / new player

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2597b9ea8fcf47c2d177359c37d221040ece0939
---

 modules/gui/macosx/UI/VLCStatusBarIconMainMenu.xib |  13 +-
 .../gui/macosx/coreinteraction/VLCInputManager.m   |  13 --
 modules/gui/macosx/menus/VLCStatusBarIcon.h        |   1 -
 modules/gui/macosx/menus/VLCStatusBarIcon.m        | 192 +++++++++++----------
 4 files changed, 105 insertions(+), 114 deletions(-)

diff --git a/modules/gui/macosx/UI/VLCStatusBarIconMainMenu.xib b/modules/gui/macosx/UI/VLCStatusBarIconMainMenu.xib
index 68c89b11ff..8788a3df77 100755
--- a/modules/gui/macosx/UI/VLCStatusBarIconMainMenu.xib
+++ b/modules/gui/macosx/UI/VLCStatusBarIconMainMenu.xib
@@ -1,9 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14113" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14113"/>
-        <capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -20,7 +19,7 @@
                 <outlet property="playbackInfoView" destination="fDN-Tb-DeD" id="qjG-v2-VzI"/>
                 <outlet property="progressField" destination="z3X-aG-Veg" id="wV9-n7-N7O"/>
                 <outlet property="quitItem" destination="539" id="xuy-Vl-Ami"/>
-                <outlet property="randButton" destination="PaW-Fe-vxo" id="L3x-xm-50A"/>
+                <outlet property="randomButton" destination="PaW-Fe-vxo" id="GT0-tR-eox"/>
                 <outlet property="separatorField" destination="za4-8d-tZy" id="Qcx-VE-sZY"/>
                 <outlet property="showMainWindowItem" destination="08C-TA-yqu" id="qQR-Ah-T0b"/>
                 <outlet property="titleField" destination="Byt-pH-60l" id="JKP-xq-fIb"/>
@@ -138,7 +137,7 @@
                     </connections>
                 </button>
                 <button translatesAutoresizingMaskIntoConstraints="NO" id="p8X-zU-PwN" customClass="VLCImageButton">
-                    <rect key="frame" x="84" y="20" width="24" height="24"/>
+                    <rect key="frame" x="85" y="20" width="24" height="24"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="24" id="5IV-1l-2UV"/>
                         <constraint firstAttribute="width" secondItem="p8X-zU-PwN" secondAttribute="height" multiplier="1:1" id="lkX-DA-UeD"/>
@@ -152,7 +151,7 @@
                     </connections>
                 </button>
                 <button translatesAutoresizingMaskIntoConstraints="NO" id="lvI-lN-t4O" customClass="VLCImageButton">
-                    <rect key="frame" x="113" y="20" width="24" height="24"/>
+                    <rect key="frame" x="114" y="20" width="24" height="24"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="24" id="VH7-ja-clp"/>
                         <constraint firstAttribute="width" secondItem="lvI-lN-t4O" secondAttribute="height" multiplier="1:1" id="kzq-fw-PfK"/>
@@ -169,7 +168,7 @@
                     </connections>
                 </button>
                 <button translatesAutoresizingMaskIntoConstraints="NO" id="NHj-Vf-SPF" customClass="VLCImageButton">
-                    <rect key="frame" x="141" y="20" width="24" height="24"/>
+                    <rect key="frame" x="142" y="20" width="24" height="24"/>
                     <constraints>
                         <constraint firstAttribute="width" secondItem="NHj-Vf-SPF" secondAttribute="height" multiplier="1:1" id="WY1-gG-mtJ"/>
                         <constraint firstAttribute="height" constant="24" id="YJ5-t2-qjF"/>
diff --git a/modules/gui/macosx/coreinteraction/VLCInputManager.m b/modules/gui/macosx/coreinteraction/VLCInputManager.m
index 9b4a20c9fa..0ab77509f1 100644
--- a/modules/gui/macosx/coreinteraction/VLCInputManager.m
+++ b/modules/gui/macosx/coreinteraction/VLCInputManager.m
@@ -74,14 +74,6 @@ static int InputEvent(vlc_object_t *p_this, const char *psz_var,
             case INPUT_EVENT_RATE:
                 break;
             case INPUT_EVENT_POSITION:
-
-                // Rate limit to 100 ms
-                if (lastPositionUpdate && fabs([lastPositionUpdate timeIntervalSinceNow]) < 0.1)
-                    break;
-
-                lastPositionUpdate = [NSDate date];
-
-                [inputManager performSelectorOnMainThread:@selector(playbackPositionUpdated) withObject:nil waitUntilDone:NO];
                 break;
             case INPUT_EVENT_TITLE:
             case INPUT_EVENT_CHAPTER:
@@ -279,11 +271,6 @@ static int InputEvent(vlc_object_t *p_this, const char *psz_var,
     });
 }
 
-- (void)playbackPositionUpdated
-{
-    [[[VLCMain sharedInstance] statusBarIcon] updateProgress];
-}
-
 - (void)playbackStatusUpdated
 {
     // On shutdown, input might not be dead yet. Cleanup actions like inhibit, itunes playback
diff --git a/modules/gui/macosx/menus/VLCStatusBarIcon.h b/modules/gui/macosx/menus/VLCStatusBarIcon.h
index ea5c24dd9f..f189698949 100644
--- a/modules/gui/macosx/menus/VLCStatusBarIcon.h
+++ b/modules/gui/macosx/menus/VLCStatusBarIcon.h
@@ -32,7 +32,6 @@
 
 // Get data from VLC and update the little status menu
 - (void)updateMenuItemRandom;
-- (void)updateProgress;
 
 - (IBAction)restoreMainWindow:(id)sender;
 - (IBAction)statusBarIconTogglePlayPause:(id)sender;
diff --git a/modules/gui/macosx/menus/VLCStatusBarIcon.m b/modules/gui/macosx/menus/VLCStatusBarIcon.m
index 580251146d..4db8ceb692 100644
--- a/modules/gui/macosx/menus/VLCStatusBarIcon.m
+++ b/modules/gui/macosx/menus/VLCStatusBarIcon.m
@@ -4,6 +4,7 @@
  * Copyright (C) 2016-2019 VLC authors and VideoLAN
  *
  * Authors: Goran Dokic <vlc at 8hz dot com>
+ *          Felix Paul Kühne <fkuehne # videolan.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,11 +26,13 @@
 #import <vlc_common.h>
 #import <vlc_playlist_legacy.h>
 #import <vlc_input.h>
+#import <vlc_url.h>
 
 #import "coreinteraction/VLCCoreInteraction.h"
 #import "extensions/NSString+Helpers.h"
 #import "main/VLCMain.h"
-
+#import "playlist/VLCPlaylistController.h"
+#import "playlist/VLCPlayerController.h"
 
 @interface VLCStatusBarIcon ()
 {
@@ -48,7 +51,7 @@
     IBOutlet NSButton *backwardsButton;
     IBOutlet NSButton *playPauseButton;
     IBOutlet NSButton *forwardButton;
-    IBOutlet NSButton *randButton;
+    IBOutlet NSButton *randomButton;
 
     /* Outlets for menu items */
     IBOutlet NSMenuItem *pathActionItem;
@@ -56,7 +59,7 @@
     IBOutlet NSMenuItem *quitItem;
 
     BOOL isStopped;
-    BOOL showTimeElapsed;
+    BOOL _showTimeElapsed;
     NSString *_currentPlaybackUrl;
 }
 @end
@@ -91,14 +94,14 @@
     backwardsButton.accessibilityLabel = _NS("Go to previous item");
     playPauseButton.accessibilityLabel = _NS("Toggle Play/Pause");
     forwardButton.accessibilityLabel = _NS("Go to next item");
-    randButton.accessibilityLabel = _NS("Toggle random order playback");
+    randomButton.accessibilityLabel = _NS("Toggle random order playback");
 
     // Populate menu items with localized strings
     [showMainWindowItem setTitle:_NS("Show Main Window")];
     [pathActionItem setTitle:_NS("Path/URL Action")];
     [quitItem setTitle:_NS("Quit")];
 
-    showTimeElapsed = YES;
+    _showTimeElapsed = YES;
 
     // Set our selves up as delegate, to receive menuNeedsUpdate messages, so
     // we can update our menu as needed/before it's drawn
@@ -107,8 +110,20 @@
     // Register notifications
     NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
     [notificationCenter addObserver:self
-                           selector:@selector(updateNowPlayingInfo)
-                               name:VLCInputChangedNotification
+                           selector:@selector(updateTimeAndPosition:)
+                               name:VLCPlayerTimeAndPositionChanged
+                             object:nil];
+    [notificationCenter addObserver:self
+                           selector:@selector(inputItemChanged:)
+                               name:VLCPlayerCurrentMediaItemChanged
+                             object:nil];
+    [notificationCenter addObserver:self
+                           selector:@selector(hasPreviousChanged:)
+                               name:VLCPlaybackHasPreviousChanged
+                             object:nil];
+    [notificationCenter addObserver:self
+                           selector:@selector(hasNextChanged:)
+                               name:VLCPlaybackHasNextChanged
                              object:nil];
 
     [notificationCenter addObserver:self
@@ -206,56 +221,43 @@
  */
 - (void)menuNeedsUpdate:(NSMenu *)menu
 {
-    [self updateMetadata];
     [self updateMenuItemRandom];
     [self updateDynamicMenuItemText];
 }
 
-/* This is called whenever the playback status for VLC changes and here
- * we can update our information in the menu/view
- */
-- (void) updateNowPlayingInfo
-{
-    [self updateMetadata];
-    [self updateProgress];
-    [self updateDynamicMenuItemText];
-}
-
 /* Callback to update current playback time
  * Called by InputManager
  */
-- (void)updateProgress
+- (void)updateTimeAndPosition:(NSNotification *)aNotification
 {
-    input_thread_t *input = pl_CurrentInput(getIntf());
+    VLCPlayerController *playerController = aNotification.object;
 
-    if (input) {
-        NSString *elapsedTime;
-        NSString *remainingTime;
-        NSString *totalTime;
+    input_item_t *p_item = playerController.currentMedia;
 
-        /* Get elapsed and remaining time */
-        elapsedTime = [NSString stringWithTimeFromInput:input negative:NO];
-        remainingTime = [NSString stringWithTimeFromInput:input negative:YES];
+    if (p_item) {
+        vlc_tick_t duration = input_item_GetDuration(p_item);
+        vlc_tick_t time = playerController.time;
 
-        /* Check item duration */
-        vlc_tick_t dur = input_item_GetDuration(input_GetItem(input));
-
-        if (dur == -1) {
+        if (duration == -1) {
             /* Unknown duration, possibly due to buffering */
             [progressField setStringValue:@"--:--"];
             [totalField setStringValue:@"--:--"];
-        } else if (dur == 0) {
+        } else if (duration == 0) {
             /* Infinite duration */
-            [progressField setStringValue:elapsedTime];
+            [progressField setStringValue:[NSString stringWithDuration:duration currentTime:time negative:NO]];
             [totalField setStringValue:@"∞"];
         } else {
             /* Not unknown, update displayed duration */
-            totalTime = [NSString stringWithTime:SEC_FROM_VLC_TICK(dur)];
-            [progressField setStringValue:(showTimeElapsed) ? elapsedTime : remainingTime];
-            [totalField setStringValue:totalTime];
+            if (_showTimeElapsed) {
+                [progressField setStringValue:[NSString stringWithDuration:duration currentTime:time negative:NO]];
+            } else {
+                [progressField setStringValue:[NSString stringWithDuration:duration currentTime:time negative:YES]];
+            }
+
+            [totalField setStringValue:[NSString stringWithTimeFromTicks:duration]];
         }
         [self setStoppedStatus:NO];
-        vlc_object_release(input);
+
     } else {
         /* Nothing playing */
         [progressField setStringValue:@"--:--"];
@@ -264,59 +266,79 @@
     }
 }
 
-
 #pragma mark -
 #pragma mark Update functions
 
+- (void)updateCachedURLOfCurrentMedia:(input_item_t *)media
+{
+    if (!media) {
+        _currentPlaybackUrl = nil;
+        return;
+    }
+    char *psz_url = vlc_uri_decode(input_item_GetURI(media));
+    if (!psz_url) {
+        _currentPlaybackUrl = nil;
+        return;
+    }
+    _currentPlaybackUrl = toNSStr(psz_url);
+    free(psz_url);
+}
+
+- (void)hasPreviousChanged:(NSNotification *)aNotification
+{
+    backwardsButton.enabled = [[VLCMain sharedInstance] playlistController].hasPreviousPlaylistItem;
+}
+
+- (void)hasNextChanged:(NSNotification *)aNotification
+{
+    forwardButton.enabled = [[VLCMain sharedInstance] playlistController].hasNextPlaylistItem;
+}
+
 /* Updates the Metadata for the currently
  * playing item or resets it if nothing is playing
  */
-- (void)updateMetadata
+- (void)inputItemChanged:(NSNotification *)aNotification
 {
     NSImage         *coverArtImage;
     NSString        *title;
     NSString        *nowPlaying;
     NSString        *artist;
     NSString        *album;
-    input_thread_t  *input = pl_CurrentInput(getIntf());
-    input_item_t    *item  = NULL;
+    input_item_t    *mediaItem  = NULL;
+
+    VLCPlayerController *playerController = aNotification.object;
+    enum vlc_player_state playerState = playerController.playerState;
+    mediaItem = playerController.currentMedia;
 
-    // Update play/pause status
-    switch ([self getPlaylistPlayStatus]) {
-        case PLAYLIST_RUNNING:
+    switch (playerState) {
+        case VLC_PLAYER_STATE_PLAYING:
             [self setStoppedStatus:NO];
             [self setProgressTimeEnabled:YES];
             [pathActionItem setEnabled:YES];
-            _currentPlaybackUrl = [[[VLCCoreInteraction sharedInstance]
-                                    URLOfCurrentPlaylistItem] absoluteString];
+            [self updateCachedURLOfCurrentMedia:mediaItem];
             break;
-        case PLAYLIST_STOPPED:
+        case VLC_PLAYER_STATE_STOPPED:
             [self setStoppedStatus:YES];
             [self setProgressTimeEnabled:NO];
             [pathActionItem setEnabled:NO];
             _currentPlaybackUrl = nil;
             break;
-        case PLAYLIST_PAUSED:
+        case VLC_PLAYER_STATE_PAUSED:
             [self setStoppedStatus:NO];
             [self setProgressTimeEnabled:YES];
             [pathActionItem setEnabled:YES];
-            _currentPlaybackUrl = [[[VLCCoreInteraction sharedInstance]
-                                    URLOfCurrentPlaylistItem] absoluteString];
+            [self updateCachedURLOfCurrentMedia:mediaItem];
             [playPauseButton setState:NSOffState];
         default:
             break;
     }
 
-    if (input) {
-        item = input_GetItem(input);
-    }
-
-    if (item) {
+    if (mediaItem) {
         /* Something is playing */
         static char *tmp_cstr = NULL;
 
         // Get Coverart
-        tmp_cstr = input_item_GetArtworkURL(item);
+        tmp_cstr = input_item_GetArtworkURL(mediaItem);
         if (tmp_cstr) {
             NSString *tempStr = toNSStr(tmp_cstr);
             if (![tempStr hasPrefix:@"attachment://"]) {
@@ -327,28 +349,28 @@
         }
 
         // Get Titel
-        tmp_cstr = input_item_GetTitleFbName(item);
+        tmp_cstr = input_item_GetTitleFbName(mediaItem);
         if (tmp_cstr) {
             title = toNSStr(tmp_cstr);
             FREENULL(tmp_cstr);
         }
 
         // Get Now Playing
-        tmp_cstr = input_item_GetNowPlaying(item);
+        tmp_cstr = input_item_GetNowPlaying(mediaItem);
         if (tmp_cstr) {
             nowPlaying = toNSStr(tmp_cstr);
             FREENULL(tmp_cstr);
         }
 
         // Get author
-        tmp_cstr = input_item_GetArtist(item);
+        tmp_cstr = input_item_GetArtist(mediaItem);
         if (tmp_cstr) {
             artist = toNSStr(tmp_cstr);
             FREENULL(tmp_cstr);
         }
 
         // Get album
-        tmp_cstr = input_item_GetAlbum(item);
+        tmp_cstr = input_item_GetAlbum(mediaItem);
         if (tmp_cstr) {
             album = toNSStr(tmp_cstr);
             FREENULL(tmp_cstr);
@@ -371,14 +393,8 @@
 
     // Set the metadata in the UI
     [self setMetadataTitle:title artist:artist album:album andCover:coverArtImage];
-
-    // Cleanup
-    if (input)
-        vlc_object_release(input);
 }
 
-
-
 // Update dynamic copy/open menu item status
 - (void)updateDynamicMenuItemText
 {
@@ -401,11 +417,7 @@
 - (void)updateMenuItemRandom
 {
     // Get current random status
-    bool random;
-    playlist_t *playlist = pl_Get(getIntf());
-    random = var_GetBool(playlist, "random");
-
-    [randButton setState:(random) ? NSOnState : NSOffState];
+    [randomButton setState:[[VLCMain sharedInstance] playlistController].playbackOrder == VLC_PLAYLIST_PLAYBACK_ORDER_RANDOM ? NSOnState : NSOffState];
 }
 
 #pragma mark -
@@ -444,22 +456,6 @@
     [totalField setEnabled:enabled];
 }
 
-/* Returns VLC playlist status
- * Check for constants:
- *   PLAYLIST_RUNNING, PLAYLIST_STOPPED, PLAYLIST_PAUSED
- */
-- (int)getPlaylistPlayStatus
-{
-    int res;
-    playlist_t *p_playlist = pl_Get(getIntf());
-
-    PL_LOCK;
-    res = playlist_Status( p_playlist );
-    PL_UNLOCK;
-
-    return res;
-}
-
 #pragma mark -
 #pragma mark Menu item Actions
 
@@ -498,37 +494,47 @@
 // Action: Toggle Play / Pause
 - (IBAction)statusBarIconTogglePlayPause:(id)sender
 {
-    [[VLCCoreInteraction sharedInstance] playOrPause];
+    VLCPlaylistController *playlistController = [[VLCMain sharedInstance] playlistController];
+    VLCPlayerController *playerController = playlistController.playerController;
+    enum vlc_player_state playerState = playerController.playerState;
+    if (playerState != VLC_PLAYER_STATE_PAUSED) {
+        [playerController pause];
+    } else if (playerState == VLC_PLAYER_STATE_PAUSED) {
+        [playerController resume];
+    } else {
+        [playlistController startPlaylist];
+    }
 }
 
 // Action: Stop playback
 - (IBAction)statusBarIconStop:(id)sender
 {
-    [[VLCCoreInteraction sharedInstance] stop];
+    [[[VLCMain sharedInstance] playlistController] stopPlayback];
 }
 
 // Action: Go to next track
 - (IBAction)statusBarIconNext:(id)sender
 {
-    [[VLCCoreInteraction sharedInstance] next];
+    [[[VLCMain sharedInstance] playlistController] playNextItem];
 }
 
 // Action: Go to previous track
 - (IBAction)statusBarIconPrevious:(id)sender
 {
-    [[VLCCoreInteraction sharedInstance] previous];
+    [[[VLCMain sharedInstance] playlistController] playPreviousItem];
 }
 
 // Action: Toggle random playback (shuffle)
 - (IBAction)statusBarIconToggleRandom:(id)sender
 {
-    [[VLCCoreInteraction sharedInstance] shuffle];
+    VLCPlaylistController *playlistController = [[VLCMain sharedInstance] playlistController];
+    playlistController.playbackOrder = (playlistController.playbackOrder == VLC_PLAYLIST_PLAYBACK_ORDER_RANDOM) ? VLC_PLAYLIST_PLAYBACK_ORDER_NORMAL : VLC_PLAYLIST_PLAYBACK_ORDER_RANDOM;
 }
 
 // Action: Toggle between elapsed and remaining time
 - (IBAction)toggelProgressTime:(id)sender
 {
-    showTimeElapsed = (!showTimeElapsed);
+    _showTimeElapsed = (!_showTimeElapsed);
 }
 
 // Action: Quit VLC



More information about the vlc-commits mailing list