[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