[vlc-devel] [vlc-commits] macosx: implement seeking and playback position display within the main window

David Fuhrmann david.fuhrmann at gmail.com
Mon Feb 11 19:08:22 CET 2019


Hi Felix,


> Am 11.02.2019 um 14:30 schrieb Felix Paul Kühne <git at videolan.org>:
> 
> vlc | branch: master | Felix Paul Kühne <felix at feepk.net> | 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;

This looks problematic for me:
vlc_player_GetCurrentMedia does not seem to increase any refcount of the input_item_t instance, so this getter seems to return an instance which is not safe to use afterwards. Also, the (objc) getter directly locks and then again unlocks the player, which is always a pattern being likely wrong.   

Do I assume right if we would use the input_item_t within the lock it would be ok, but not outside anymore?

>     [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
> vlc-commits at videolan.org
> https://mailman.videolan.org/listinfo/vlc-commits



More information about the vlc-devel mailing list