vlc | branch: master | Felix Paul Kühne <[email protected]> | Mon Feb 11 13:42:18 2019 +0100| [f195a7269eb8def0c67cafe52d71a117d2fe5fd5] | committer: Felix Paul Kühne
macosx: implement seeking and playback position display within the main window > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f195a7269eb8def0c67cafe52d71a117d2fe5fd5 --- .../gui/macosx/coreinteraction/VLCInputManager.m | 2 - modules/gui/macosx/extensions/NSString+Helpers.h | 14 +++++ modules/gui/macosx/extensions/NSString+Helpers.m | 17 ++++++ modules/gui/macosx/main/VLCMain.m | 1 - .../windows/mainwindow/VLCControlsBarCommon.h | 1 - .../windows/mainwindow/VLCControlsBarCommon.m | 68 ++++++++++------------ .../gui/macosx/windows/mainwindow/VLCMainWindow.m | 6 -- 7 files changed, 63 insertions(+), 46 deletions(-) diff --git a/modules/gui/macosx/coreinteraction/VLCInputManager.m b/modules/gui/macosx/coreinteraction/VLCInputManager.m index d75c4d16e6..9b4a20c9fa 100644 --- a/modules/gui/macosx/coreinteraction/VLCInputManager.m +++ b/modules/gui/macosx/coreinteraction/VLCInputManager.m @@ -124,7 +124,6 @@ static int InputEvent(vlc_object_t *p_this, const char *psz_var, case INPUT_EVENT_DEAD: [inputManager performSelectorOnMainThread:@selector(updateName) withObject: nil waitUntilDone:NO]; - [[[VLCMain sharedInstance] mainWindow] performSelectorOnMainThread:@selector(updateTimeSlider) withObject:nil waitUntilDone:NO]; break; default: @@ -282,7 +281,6 @@ static int InputEvent(vlc_object_t *p_this, const char *psz_var, - (void)playbackPositionUpdated { - [[[VLCMain sharedInstance] mainWindow] updateTimeSlider]; [[[VLCMain sharedInstance] statusBarIcon] updateProgress]; } diff --git a/modules/gui/macosx/extensions/NSString+Helpers.h b/modules/gui/macosx/extensions/NSString+Helpers.h index 7e61b6509b..2489ab59f0 100644 --- a/modules/gui/macosx/extensions/NSString+Helpers.h +++ b/modules/gui/macosx/extensions/NSString+Helpers.h @@ -75,6 +75,20 @@ NSImage *imageFromRes(NSString *name); negative:(BOOL)negative; /** + Creates an NSString with the current time of the \c input_item_t + + This method allocates and initializes an NSString with the current + elapsed or remaining time of the given input. + + \param the duration + \param the current time + \param negative If YES, calculate remaining instead of elapsed time + */ ++ (instancetype)stringWithDuration:(vlc_tick_t)duration + currentTime:(vlc_tick_t)time + negative:(BOOL)negative; + +/** Creates an NSString with the given time in seconds This method allocates and initializes an NSString with the given diff --git a/modules/gui/macosx/extensions/NSString+Helpers.m b/modules/gui/macosx/extensions/NSString+Helpers.m index dcddce1036..8dcce48b52 100644 --- a/modules/gui/macosx/extensions/NSString+Helpers.m +++ b/modules/gui/macosx/extensions/NSString+Helpers.m @@ -69,6 +69,23 @@ NSString *const kVLCMediaUnknown = @"Unknown"; } } ++ (instancetype)stringWithDuration:(vlc_tick_t)duration + currentTime:(vlc_tick_t)time + negative:(BOOL)negative +{ + char psz_time[MSTRTIME_MAX_SIZE]; + + if (negative && duration > 0) { + vlc_tick_t remaining = (duration > time) ? (duration - time) : 0; + + return [NSString stringWithFormat:@"-%s", + secstotimestr(psz_time, (int)SEC_FROM_VLC_TICK(remaining))]; + } else { + return [NSString stringWithUTF8String: + secstotimestr(psz_time, (int)SEC_FROM_VLC_TICK(time))]; + } +} + + (instancetype)stringWithTimeFromTicks:(vlc_tick_t)time { char psz_time[MSTRTIME_MAX_SIZE]; diff --git a/modules/gui/macosx/main/VLCMain.m b/modules/gui/macosx/main/VLCMain.m index c5447681a5..93bf2c355a 100644 --- a/modules/gui/macosx/main/VLCMain.m +++ b/modules/gui/macosx/main/VLCMain.m @@ -307,7 +307,6 @@ static VLCMain *sharedInstance = nil; /* update the main window */ [[self mainWindow] updateWindow]; - [[self mainWindow] updateTimeSlider]; [[self mainWindow] updateVolumeSlider]; // respect playlist-autostart diff --git a/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.h b/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.h index 24410b783d..a82dcafd08 100644 --- a/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.h +++ b/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.h @@ -63,7 +63,6 @@ - (IBAction)timeSliderAction:(id)sender; - (IBAction)fullscreen:(id)sender; -- (void)updateTimeSlider; - (void)updateControls; - (void)setPause; - (void)setPlay; diff --git a/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.m b/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.m index eab9a989c1..747b6cc9a5 100644 --- a/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.m +++ b/modules/gui/macosx/windows/mainwindow/VLCControlsBarCommon.m @@ -28,6 +28,8 @@ #import "main/VLCMain.h" #import "main/CompatibilityFixes.h" #import "menus/VLCMainMenu.h" +#import "playlist/VLCPlaylistController.h" +#import "playlist/VLCPlayerController.h" /***************************************************************************** * VLCControlsBarCommon @@ -55,7 +57,9 @@ - (void)awakeFromNib { [super awakeFromNib]; - + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTimeSlider:) name:VLCPlayerTimeAndPositionChanged object:nil]; + _nativeFullscreenMode = var_InheritBool(getIntf(), "macosx-nativefullscreenmode"); [self.dropView setDrawBorder: NO]; @@ -110,6 +114,11 @@ [self toggleForwardBackwardMode: YES]; } +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + - (CGFloat)height { return [self.bottomBarView frame].size.height; @@ -232,8 +241,7 @@ - (IBAction)timeSliderAction:(id)sender { - float f_updated; - input_thread_t * p_input; + float f_updatedDelta; switch([[NSApp currentEvent] type]) { case NSLeftMouseUp: @@ -247,29 +255,19 @@ return; case NSLeftMouseDown: case NSLeftMouseDragged: - f_updated = [sender floatValue]; + f_updatedDelta = [sender floatValue]; break; case NSScrollWheel: - f_updated = [sender floatValue]; + f_updatedDelta = [sender floatValue]; break; default: return; } - p_input = pl_CurrentInput(getIntf()); - if (p_input != NULL) { - vlc_value_t pos; - NSString * o_time; - - pos.f_float = f_updated / 10000.; - var_Set(p_input, "position", pos); - [self.timeSlider setFloatValue: f_updated]; - - o_time = [NSString stringWithTimeFromInput:p_input - negative:self.timeField.timeRemaining]; - [self.timeField setStringValue: o_time]; - vlc_object_release(p_input); - } + + VLCPlayerController *playerController = [[[VLCMain sharedInstance] playlistController] playerController]; + [playerController setPositionFast:f_updatedDelta / 10000.]; + [self.timeSlider setFloatValue:f_updatedDelta]; } - (IBAction)fullscreen:(id)sender @@ -280,14 +278,14 @@ #pragma mark - #pragma mark Updaters -- (void)updateTimeSlider +- (void)updateTimeSlider:(NSNotification *)aNotification; { - input_thread_t * p_input; - p_input = pl_CurrentInput(getIntf()); + VLCPlayerController *playerController = aNotification.object; + input_item_t *p_item = playerController.currentMedia; [self.timeSlider setHidden:NO]; - if (!p_input) { + if (!p_item) { // Nothing playing [self.timeSlider setKnobHidden:YES]; [self.timeSlider setFloatValue: 0.0]; @@ -298,27 +296,25 @@ } [self.timeSlider setKnobHidden:NO]; + [self.timeSlider setFloatValue:(10000. * playerController.position)]; - vlc_value_t pos; - var_Get(p_input, "position", &pos); - [self.timeSlider setFloatValue:(10000. * pos.f_float)]; - - vlc_tick_t dur = input_item_GetDuration(input_GetItem(p_input)); - if (dur == -1) { + vlc_tick_t duration = input_item_GetDuration(p_item); + bool buffering = playerController.playerState == VLC_PLAYER_STATE_STARTED; + if (duration == -1) { // No duration, disable slider [self.timeSlider setEnabled:NO]; - } else { - input_state_e inputState = var_GetInteger(p_input, "state"); - bool buffering = (inputState == INIT_S || inputState == OPENING_S); + } else if (buffering) { + [self.timeSlider setEnabled:NO]; [self.timeSlider setIndefinite:buffering]; + } else { + [self.timeSlider setEnabled:playerController.seekable]; } - NSString *time = [NSString stringWithTimeFromInput:p_input - negative:self.timeField.timeRemaining]; + NSString *time = [NSString stringWithDuration:duration + currentTime:playerController.time + negative:self.timeField.timeRemaining]; [self.timeField setStringValue:time]; [self.timeField setNeedsDisplay:YES]; - - vlc_object_release(p_input); } - (void)updateControls diff --git a/modules/gui/macosx/windows/mainwindow/VLCMainWindow.m b/modules/gui/macosx/windows/mainwindow/VLCMainWindow.m index 0dacbbe852..2581ace9c5 100644 --- a/modules/gui/macosx/windows/mainwindow/VLCMainWindow.m +++ b/modules/gui/macosx/windows/mainwindow/VLCMainWindow.m @@ -570,13 +570,8 @@ static const float f_min_window_height = 307.; - (void)updateTimeSlider { - [self.controlsBar updateTimeSlider]; [self.fspanel updatePositionAndTime]; - [[[VLCMain sharedInstance] voutProvider] updateControlsBarsUsingBlock:^(VLCControlsBarCommon *controlsBar) { - [controlsBar updateTimeSlider]; - }]; - [[VLCCoreInteraction sharedInstance] updateAtoB]; } @@ -658,7 +653,6 @@ static const float f_min_window_height = 307.; vlc_object_release(p_input); } - [self updateTimeSlider]; if ([self.fspanel respondsToSelector:@selector(setSeekable:)]) [self.fspanel setSeekable: b_seekable]; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
