vlc | branch: master | Felix Paul Kühne <[email protected]> | Tue Mar 26 16:41:22 2019 +0100| [edc891f0038dcd3e3b35aa0015bd0b94a64ed911] | committer: Felix Paul Kühne
macosx/fullscreen controller: update to new playlist > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=edc891f0038dcd3e3b35aa0015bd0b94a64ed911 --- .../gui/macosx/windows/mainwindow/VLCMainWindow.m | 7 - .../macosx/windows/video/VLCFSPanelController.h | 10 +- .../macosx/windows/video/VLCFSPanelController.m | 168 ++++++++++++--------- 3 files changed, 103 insertions(+), 82 deletions(-) diff --git a/modules/gui/macosx/windows/mainwindow/VLCMainWindow.m b/modules/gui/macosx/windows/mainwindow/VLCMainWindow.m index 8a79b12d2f..2b0c41d6cd 100644 --- a/modules/gui/macosx/windows/mainwindow/VLCMainWindow.m +++ b/modules/gui/macosx/windows/mainwindow/VLCMainWindow.m @@ -570,7 +570,6 @@ static const float f_min_window_height = 307.; - (void)updateTimeSlider { - [self.fspanel updatePositionAndTime]; } - (void)updateName @@ -651,9 +650,6 @@ static const float f_min_window_height = 307.; input_Release(p_input); } - if ([self.fspanel respondsToSelector:@selector(setSeekable:)]) - [self.fspanel setSeekable: b_seekable]; - [self showDropZone]; [_sidebarView setNeedsDisplay:YES]; @@ -663,7 +659,6 @@ static const float f_min_window_height = 307.; - (void)setPause { [self.controlsBar setPause]; - [self.fspanel setPause]; [[[VLCMain sharedInstance] voutProvider] updateControlsBarsUsingBlock:^(VLCControlsBarCommon *controlsBar) { [controlsBar setPause]; @@ -673,7 +668,6 @@ static const float f_min_window_height = 307.; - (void)setPlay { [self.controlsBar setPlay]; - [self.fspanel setPlay]; [[[VLCMain sharedInstance] voutProvider] updateControlsBarsUsingBlock:^(VLCControlsBarCommon *controlsBar) { [controlsBar setPlay]; @@ -683,7 +677,6 @@ static const float f_min_window_height = 307.; - (void)updateVolumeSlider { [(VLCMainWindowControlsBar *)[self controlsBar] updateVolumeSlider]; - [self.fspanel setVolumeLevel:[[VLCCoreInteraction sharedInstance] volume]]; } #pragma mark - diff --git a/modules/gui/macosx/windows/video/VLCFSPanelController.h b/modules/gui/macosx/windows/video/VLCFSPanelController.h index bc630de6f1..c9fecf6e19 100644 --- a/modules/gui/macosx/windows/video/VLCFSPanelController.h +++ b/modules/gui/macosx/windows/video/VLCFSPanelController.h @@ -1,7 +1,7 @@ /***************************************************************************** * VLCFSPanelController.h: macOS fullscreen controls window controller ***************************************************************************** - * Copyright (C) 2006-2016 VLC authors and VideoLAN + * Copyright (C) 2006-2019 VLC authors and VideoLAN * * Authors: Jérôme Decoodt <djc at videolan dot org> * Felix Paul Kühne <fkuehne at videolan dot org> @@ -28,6 +28,7 @@ #import "windows/video/VLCWindow.h" #import "views/VLCDefaultValueSlider.h" #import "views/VLCTimeField.h" +#import "views/VLCSlider.h" @interface VLCFSPanelController : NSWindowController @@ -43,7 +44,7 @@ @property IBOutlet NSTextField *mediaTitle; @property IBOutlet VLCTimeField *elapsedTime; @property IBOutlet VLCTimeField *remainingOrTotalTime; -@property IBOutlet NSSlider *timeSlider; +@property IBOutlet VLCSlider *timeSlider; @property IBOutlet VLCDefaultValueSlider *volumeSlider; @property (assign) IBOutlet NSLayoutConstraint *heightMaxConstraint; @@ -63,12 +64,7 @@ - (void)setNonActive; - (void)setVoutWasUpdated:(VLCWindow *)voutWindow; -- (void)setSeekable:(BOOL)seekable; -- (void)setVolumeLevel:(int)value; -- (void)updatePositionAndTime; - (void)setStreamTitle:(NSString *)title; -- (void)setPlay; -- (void)setPause; // Constrain frame to window. Used by VLCFSPanelDraggableView. - (NSRect)contrainFrameToAssociatedVoutWindow:(NSRect)frame; diff --git a/modules/gui/macosx/windows/video/VLCFSPanelController.m b/modules/gui/macosx/windows/video/VLCFSPanelController.m index 316c909ddd..7084e03776 100644 --- a/modules/gui/macosx/windows/video/VLCFSPanelController.m +++ b/modules/gui/macosx/windows/video/VLCFSPanelController.m @@ -1,7 +1,7 @@ /***************************************************************************** * VLCFSPanelController.m: macOS fullscreen controls window controller ***************************************************************************** - * Copyright (C) 2006-2016 VLC authors and VideoLAN + * Copyright (C) 2006-2019 VLC authors and VideoLAN * * Authors: Jérôme Decoodt <djc at videolan dot org> * Felix Paul Kühne <fkuehne at videolan dot org> @@ -26,11 +26,10 @@ #import "VLCFSPanelController.h" #import <vlc_aout.h> -#import <vlc_playlist_legacy.h> -#import "coreinteraction/VLCCoreInteraction.h" -#import "main/CompatibilityFixes.h" #import "main/VLCMain.h" +#import "playlist/VLCPlaylistController.h" +#import "playlist/VLCPlayerController.h" @interface VLCFSPanelController () { BOOL _isCounting; @@ -39,6 +38,9 @@ NSRect _associatedVoutFrame; // Used to ask for current constraining rect on movement NSWindow *_associatedVoutWindow; + + VLCPlaylistController *_playlistController; + VLCPlayerController *_playerController; } @end @@ -68,8 +70,17 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect return self; } +- (void)dealloc +{ + [self stopAutohideTimer]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + - (void)windowDidLoad { + _playlistController = [[VLCMain sharedInstance] playlistController]; + _playerController = [_playlistController playerController]; + [super windowDidLoad]; /* Do some window setup that is not possible in IB */ @@ -87,6 +98,14 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect [self injectVisualEffectView]; [self setupControls]; + + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter addObserver:self selector:@selector(playbackStateChanged:) name:VLCPlayerStateChanged object:nil]; + [notificationCenter addObserver:self selector:@selector(updatePositionAndTime:) name:VLCPlayerTimeAndPositionChanged object:nil]; + [notificationCenter addObserver:self selector:@selector(capabilitiesChanged:) name:VLCPlayerCapabilitiesChanged 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 selector:@selector(volumeChanged:) name:VLCPlayerVolumeChanged object:nil]; } #define setupButton(target, title, desc) \ @@ -123,9 +142,9 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect _NS("Adjust the current playback position")); /* Setup other controls */ - [_volumeSlider setMaxValue:[[VLCCoreInteraction sharedInstance] maxVolume]]; - [_volumeSlider setIntValue:AOUT_VOLUME_DEFAULT]; - [_volumeSlider setDefaultValue:AOUT_VOLUME_DEFAULT]; + [_volumeSlider setMaxValue:2.0]; + [_volumeSlider setFloatValue:_playerController.volume]; + [_volumeSlider setDefaultValue:1.0]; /* Identifier to store the state of the remaining or total time label, * this is the same identifier as used for the window playback cotrols @@ -141,7 +160,7 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect - (IBAction)togglePlayPause:(id)sender { - [[VLCCoreInteraction sharedInstance] playOrPause]; + [_playerController togglePlayPause]; } - (IBAction)jumpForward:(id)sender @@ -149,7 +168,7 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect static NSTimeInterval last_event = 0; if (([NSDate timeIntervalSinceReferenceDate] - last_event) > 0.16) { /* We just skipped 4 "continuous" events, otherwise we are too fast */ - [[VLCCoreInteraction sharedInstance] forwardExtraShort]; + [_playerController jumpForwardExtraShort]; last_event = [NSDate timeIntervalSinceReferenceDate]; } } @@ -159,31 +178,33 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect static NSTimeInterval last_event = 0; if (([NSDate timeIntervalSinceReferenceDate] - last_event) > 0.16) { /* We just skipped 4 "continuous" events, otherwise we are too fast */ - [[VLCCoreInteraction sharedInstance] backwardExtraShort]; + [_playerController jumpBackwardExtraShort]; last_event = [NSDate timeIntervalSinceReferenceDate]; } } - (IBAction)gotoPrevious:(id)sender { - [[VLCCoreInteraction sharedInstance] previous]; + [_playlistController playPreviousItem]; } - (IBAction)gotoNext:(id)sender { - [[VLCCoreInteraction sharedInstance] next]; + [_playlistController playNextItem]; } - (IBAction)toggleFullscreen:(id)sender { - [[VLCCoreInteraction sharedInstance] toggleFullscreen]; + [_playerController toggleFullscreen]; } - (IBAction)timeSliderUpdate:(id)sender { + float f_updatedDelta; + switch([[NSApp currentEvent] type]) { case NSLeftMouseUp: - /* Ignore mouse up, as this is a continuous slider and + /* Ignore mouse up, as this is a continous slider and * when the user does a single click to a position on the slider, * the action is called twice, once for the mouse down and once * for the mouse up event. This results in two short seeks one @@ -193,31 +214,36 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect return; case NSLeftMouseDown: case NSLeftMouseDragged: + f_updatedDelta = [_timeSlider floatValue]; + break; + case NSScrollWheel: + f_updatedDelta = [_timeSlider floatValue]; break; default: return; } - input_thread_t *p_input; - p_input = pl_CurrentInput(getIntf()); - - if (p_input) { - vlc_value_t pos; - pos.f_float = [_timeSlider floatValue] / 10000.; - var_Set(p_input, "position", pos); - input_Release(p_input); - } - [[[VLCMain sharedInstance] mainWindow] updateTimeSlider]; + + [_playerController setPositionFast:f_updatedDelta / 10000.]; } - (IBAction)volumeSliderUpdate:(id)sender { - [[VLCCoreInteraction sharedInstance] setVolume:[sender intValue]]; + _playerController.volume = [sender floatValue]; } #pragma mark - #pragma mark Metadata and state updates +- (void)playbackStateChanged:(NSNotification *)aNotification +{ + if (_playerController.playerState == VLC_PLAYER_STATE_PLAYING) { + [self setPause]; + } else { + [self setPlay]; + } +} + - (void)setPlay { [_playPauseButton setState:NSOffState]; @@ -235,53 +261,54 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect [_mediaTitle setStringValue:title]; } -- (void)updatePositionAndTime +- (void)updatePositionAndTime:(NSNotification *)aNotification { - input_thread_t *p_input = pl_CurrentInput(getIntf()); + VLCPlayerController *playerController = aNotification.object; + input_item_t *p_item = playerController.currentMedia; /* If nothing is playing, reset times and slider */ - if (!p_input) { + if (!p_item) { [_timeSlider setFloatValue:0.0]; [_elapsedTime setStringValue:@""]; [_remainingOrTotalTime setHidden:YES]; return; } - vlc_value_t pos; - char psz_time[MSTRTIME_MAX_SIZE]; - - var_Get(p_input, "position", &pos); - float f_updated = 10000. * pos.f_float; - [_timeSlider setFloatValue:f_updated]; - + [_timeSlider setFloatValue:(10000. * playerController.position)]; - vlc_tick_t t = var_GetInteger(p_input, "time"); - vlc_tick_t dur = input_item_GetDuration(input_GetItem(p_input)); + vlc_tick_t time =_playerController.time; + vlc_tick_t duration = input_item_GetDuration(p_item); - /* Update total duration (right field) */ - if (dur <= 0) { - [_remainingOrTotalTime setHidden:YES]; + bool buffering = playerController.playerState == VLC_PLAYER_STATE_STARTED; + if (duration == -1) { + // No duration, disable slider + [_timeSlider setEnabled:NO]; + } else if (buffering) { + [_timeSlider setEnabled:NO]; + [_timeSlider setIndefinite:buffering]; } else { - [_remainingOrTotalTime setHidden:NO]; - - NSString *totalTime; - - if ([_remainingOrTotalTime timeRemaining]) { - vlc_tick_t remaining = 0; - if (dur > t) - remaining = dur - t; - totalTime = [NSString stringWithFormat:@"-%s", secstotimestr(psz_time, (int)SEC_FROM_VLC_TICK(remaining))]; - } else { - totalTime = toNSStr(secstotimestr(psz_time, (int)SEC_FROM_VLC_TICK(dur))); - } - [_remainingOrTotalTime setStringValue:totalTime]; + [_timeSlider setEnabled:playerController.seekable]; } + /* Update total duration (right field) */ + NSString *timeString = [NSString stringWithDuration:duration + currentTime:time + negative:_remainingOrTotalTime.timeRemaining]; + [_remainingOrTotalTime setStringValue:timeString]; + [_remainingOrTotalTime setNeedsDisplay:YES]; + [_remainingOrTotalTime setHidden:duration <= 0]; + /* Update current position (left field) */ - NSString *playbackPosition = toNSStr(secstotimestr(psz_time, (int)SEC_FROM_VLC_TICK(t))); + char psz_time[MSTRTIME_MAX_SIZE]; + NSString *playbackPosition = toNSStr(secstotimestr(psz_time, (int)SEC_FROM_VLC_TICK(time))); [_elapsedTime setStringValue:playbackPosition]; - input_Release(p_input); + input_item_Release(p_item); +} + +- (void)capabilitiesChanged:(NSNotification *)aNotification +{ + [self setSeekable:_playerController.seekable]; } - (void)setSeekable:(BOOL)seekable @@ -290,10 +317,6 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect // TODO: This needs a proper fix [_forwardButton setEnabled:NO]; [_backwardButton setEnabled:NO]; - [_nextButton setEnabled:NO]; - [_nextButton setEnabled:YES]; - [_previousButton setEnabled:NO]; - [_previousButton setEnabled:YES]; [_fullscreenButton setEnabled:NO]; [_fullscreenButton setEnabled:YES]; @@ -302,10 +325,25 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect [_backwardButton setEnabled:seekable]; } -- (void)setVolumeLevel:(int)value +- (void)hasPreviousChanged:(NSNotification *)aNotification +{ + [_previousButton setEnabled:NO]; + [_previousButton setEnabled:YES]; + [_previousButton setEnabled:_playlistController.hasPreviousPlaylistItem]; +} + +- (void)hasNextChanged:(NSNotification *)aNotification +{ + [_nextButton setEnabled:NO]; + [_nextButton setEnabled:YES]; + [_nextButton setEnabled:_playlistController.hasNextPlaylistItem]; +} + +- (void)volumeChanged:(NSNotification *)aNotification { - [_volumeSlider setIntValue:value]; - [_volumeSlider setToolTip: [NSString stringWithFormat:_NS("Volume: %i %%"), (value*200)/AOUT_VOLUME_MAX]]; + float volume = _playerController.volume; + [_volumeSlider setFloatValue:volume]; + [_volumeSlider setToolTip: [NSString stringWithFormat:_NS("Volume: %i %%"), volume * 100.]]; } #pragma mark - @@ -490,10 +528,4 @@ static NSString *kAssociatedFullscreenRect = @"VLCFullscreenAssociatedWindowRect [self.window.contentView addSubview:_controlsView]; } -- (void)dealloc -{ - [self stopAutohideTimer]; -} - - @end _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
