VLCMovieViewController.m 9.75 KB
Newer Older
Felix Paul Kühne's avatar
Felix Paul Kühne committed
1
//
2
//  VLCMovieViewController.m
Felix Paul Kühne's avatar
Felix Paul Kühne committed
3
4
5
6
7
8
//  AspenProject
//
//  Created by Felix Paul Kühne on 27.02.13.
//  Copyright (c) 2013 VideoLAN. All rights reserved.
//

9
#import "VLCMovieViewController.h"
10
#import "VLCExternalDisplayController.h"
Felix Paul Kühne's avatar
Felix Paul Kühne committed
11

12
@interface VLCMovieViewController () <UIGestureRecognizerDelegate>
13
14
@property (nonatomic, retain) UIPopoverController *masterPopoverController;
@property (nonatomic, retain) UIWindow *externalWindow;
Felix Paul Kühne's avatar
Felix Paul Kühne committed
15
16
@end

17
@implementation VLCMovieViewController
18
19
@synthesize movieView=_movieView, backButton=_backButton, positionSlider=_positionSlider, timeDisplay=_timeDisplay, playPauseButton = _playPauseButton, bwdButton = _bwdButton, fwdButton = _fwdButton, subtitleSwitcherButton = _subtitleSwitcherButton, audioSwitcherButton = _audioSwitcherButton;
@synthesize toolbar = _toolbar,  controllerPanel = _controllerPanel;
Felix Paul Kühne's avatar
Felix Paul Kühne committed
20
21
22

- (void)dealloc
{
23
    [_mediaItem release];
Felix Paul Kühne's avatar
Felix Paul Kühne committed
24
    [_masterPopoverController release];
25
    [_externalWindow release];
26
    [_toolbar release];
27
    [[NSNotificationCenter defaultCenter] removeObserver:self];
Felix Paul Kühne's avatar
Felix Paul Kühne committed
28
29
30
    [super dealloc];
}

31
#pragma mark - Managing the media item
Felix Paul Kühne's avatar
Felix Paul Kühne committed
32

33
- (void)setMediaItem:(id)newMediaItem
Felix Paul Kühne's avatar
Felix Paul Kühne committed
34
{
35
36
37
    if (_mediaItem != newMediaItem) {
        [_mediaItem release];
        _mediaItem = [newMediaItem retain];
Felix Paul Kühne's avatar
Felix Paul Kühne committed
38
39
    }

40
    if (self.masterPopoverController != nil)
Felix Paul Kühne's avatar
Felix Paul Kühne committed
41
42
43
        [self.masterPopoverController dismissPopoverAnimated:YES];
}

44
- (void)viewDidLoad
Felix Paul Kühne's avatar
Felix Paul Kühne committed
45
{
46
    [super viewDidLoad];
47
48
    self.wantsFullScreenLayout = YES;

49
50
51
    _mediaPlayer = [[VLCMediaPlayer alloc] init];
    [_mediaPlayer setDelegate:self];
    [_mediaPlayer setDrawable:self.movieView];
52
53
54
55
56
57
58
59
60
61

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center addObserver:self selector:@selector(handleExternalScreenDidConnect:)
                   name:UIScreenDidConnectNotification object:nil];
    [center addObserver:self selector:@selector(handleExternalScreenDidDisconnect:)
                   name:UIScreenDidDisconnectNotification object:nil];

    if ([self hasExternalDisplay]) {
        [self showOnExternalDisplay];
    }
62
63
64
65
66
67

    _movieView.userInteractionEnabled = NO;
    UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toogleControlsVisible)];
    recognizer.delegate = self;
    [self.view addGestureRecognizer:recognizer];
    [recognizer release];
68
}
Felix Paul Kühne's avatar
Felix Paul Kühne committed
69

70
71
72
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
73
74
    [self.navigationController setNavigationBarHidden:YES animated:YES];

75
76
    if (self.mediaItem) {
        self.title = [self.mediaItem title];
77
78
79
80
81

        [_mediaPlayer setMedia:[VLCMedia mediaWithURL:[NSURL URLWithString:self.mediaItem.url]]];
        if (self.mediaItem.lastPosition && [self.mediaItem.lastPosition floatValue] < 0.99)
            [_mediaPlayer setPosition:[self.mediaItem.lastPosition floatValue]];
        [_mediaPlayer play];
Felix Paul Kühne's avatar
Felix Paul Kühne committed
82
83
84
    }
}

85
- (void)viewWillDisappear:(BOOL)animated
Felix Paul Kühne's avatar
Felix Paul Kühne committed
86
{
87
88
    [self.navigationController setNavigationBarHidden:NO animated:YES];

89
90
    [_mediaPlayer pause];
    [super viewWillDisappear:animated];
Felix Paul Kühne's avatar
Felix Paul Kühne committed
91
92
93
94
95
96
97
98
99
100
101
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
102
    if (self)
103
        self.title = @"Video Playback";
Felix Paul Kühne's avatar
Felix Paul Kühne committed
104
105
    return self;
}
106

107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#pragma mark - controls visibility

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if (touch.view != self.view) {
        return NO;
    }

    return YES;
}

- (void)toogleControlsVisible
{
    _controlsHidden = !_controlsHidden;
    CGFloat alpha = _controlsHidden? 0.0f: 1.0f;

    if (!_controlsHidden) {
        _controllerPanel.alpha = 0.0f;
125
126
127
        _controllerPanel.hidden = NO;
        _toolbar.alpha = 0.0f;
        _toolbar.hidden = NO;
128
129
130
131
    }

    void (^animationBlock)() = ^() {
        _controllerPanel.alpha = alpha;
132
        _toolbar.alpha = alpha;
133
134
135
136
    };

    void (^completionBlock)(BOOL finished) = ^(BOOL finished) {
        _controllerPanel.hidden = _controlsHidden;
137
        _toolbar.hidden = _controlsHidden;
138
139
140
141
142
    };

    [UIView animateWithDuration:0.3f animations:animationBlock completion:completionBlock];
}

143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#pragma mark - controls

- (IBAction)closePlayback:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];
}

- (IBAction)positionSliderAction:(UISlider *)sender
{
    _mediaPlayer.position = sender.value;
}

- (void)mediaPlayerTimeChanged:(NSNotification *)aNotification {
    self.positionSlider.value = [_mediaPlayer position];
    self.timeDisplay.title = [[_mediaPlayer remainingTime] stringValue];
}

160
161
162
163
164
- (void)mediaPlayerStateChanged:(NSNotification *)aNotification
{
    // TODO
}

165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
- (IBAction)play:(id)sender
{
    if ([_mediaPlayer isPlaying]) {
        [_mediaPlayer pause];
        _playPauseButton.titleLabel.text = @"Pse";
    } else {
        [_mediaPlayer play];
        _playPauseButton.titleLabel.text = @"Play";
    }
}

- (IBAction)forward:(id)sender
{
    [_mediaPlayer mediumJumpForward];
}

- (IBAction)backward:(id)sender
{
    [_mediaPlayer mediumJumpBackward];
}

- (IBAction)switchAudioTrack:(id)sender
{
    _audiotrackActionSheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"Choose Audio Track", @"audio track selector") delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: nil];
189
    NSArray * audioTracks = [_mediaPlayer audioTrackNames];
190
    NSUInteger count = [audioTracks count];
191
    for (NSUInteger i = 0; i < count; i++)
192
193
194
195
196
197
198
199
        [_audiotrackActionSheet addButtonWithTitle:[audioTracks objectAtIndex:i]];
    [_audiotrackActionSheet addButtonWithTitle:NSLocalizedString(@"Cancel", @"audio track selector")];
    [_audiotrackActionSheet setCancelButtonIndex:[_audiotrackActionSheet numberOfButtons] - 1];
    [_audiotrackActionSheet showFromRect:[self.audioSwitcherButton frame] inView:self.audioSwitcherButton animated:YES];
}

- (IBAction)switchSubtitleTrack:(id)sender
{
200
    NSArray * spuTracks = [_mediaPlayer videoSubTitlesNames];
201
    NSUInteger count = [spuTracks count];
202
203
204
    if (count <= 1)
        return;
    _subtitleActionSheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"Choose Subtitle Track", @"subtitle track selector") delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: nil];
205
206
207
208
209
210
211
212
    for (NSUInteger i = 0; i < count; i++)
        [_subtitleActionSheet addButtonWithTitle:[spuTracks objectAtIndex:i]];
    [_subtitleActionSheet addButtonWithTitle:NSLocalizedString(@"Cancel", @"subtitle track selector")];
    [_subtitleActionSheet setCancelButtonIndex:[_subtitleActionSheet numberOfButtons] - 1];
    [_subtitleActionSheet showFromRect:[self.subtitleSwitcherButton frame] inView:self.subtitleSwitcherButton animated:YES];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
213
214
215
    NSUInteger arrayIndex = 0;
    NSArray * indexArray;
    NSArray * namesArray;
216
    if (actionSheet == _subtitleActionSheet) {
217
218
        namesArray = _mediaPlayer.videoSubTitlesNames;
        arrayIndex = [namesArray indexOfObject:[actionSheet buttonTitleAtIndex:buttonIndex]];
219
220
221
222
        if (arrayIndex != NSNotFound) {
            indexArray = _mediaPlayer.videoSubTitlesIndexes;
            _mediaPlayer.currentVideoSubTitleIndex = [[indexArray objectAtIndex:arrayIndex] intValue];
        }
223
224
        [_subtitleActionSheet release];
    } else {
225
226
        namesArray = _mediaPlayer.audioTrackNames;
        arrayIndex = [namesArray indexOfObject:[actionSheet buttonTitleAtIndex:buttonIndex]];
227
228
229
230
        if (arrayIndex != NSNotFound) {
            indexArray = _mediaPlayer.audioTrackIndexes;
            _mediaPlayer.currentAudioTrackIndex = [[indexArray objectAtIndex:arrayIndex] intValue];
        }
231
232
233
234
        [_audiotrackActionSheet release];
    }
}

Felix Paul Kühne's avatar
Felix Paul Kühne committed
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
#pragma mark - Split view

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    barButtonItem.title = NSLocalizedString(@"Master", @"Master");
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
    self.masterPopoverController = popoverController;
}

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    // Called when the view is shown again in the split view, invalidating the button and popover controller.
    [self.navigationItem setLeftBarButtonItem:nil animated:YES];
    self.masterPopoverController = nil;
}

251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
#pragma mark - External Display

- (BOOL)hasExternalDisplay
{
    return ([[UIScreen screens] count] > 1);
}

- (void)showOnExternalDisplay
{
    UIScreen *screen = [[UIScreen screens] objectAtIndex:1];
    screen.overscanCompensation = UIScreenOverscanCompensationInsetApplicationFrame;

    self.externalWindow = [[UIWindow alloc] initWithFrame:screen.bounds];

    UIViewController *controller = [[VLCExternalDisplayController alloc] init];
    self.externalWindow.rootViewController = controller;
    [controller.view addSubview:_movieView];
    controller.view.frame = screen.bounds;
    _movieView.frame = screen.bounds;


    self.externalWindow.screen = screen;
    self.externalWindow.hidden = NO;
}

- (void)hideFromExternalDisplay
{
    [self.view addSubview:_movieView];
    [self.view sendSubviewToBack:_movieView];
    _movieView.frame = self.view.frame;

    self.externalWindow.hidden = YES;
    self.externalWindow = nil;
}

- (void)handleExternalScreenDidConnect:(NSNotification *)notification
{
    [self showOnExternalDisplay];
}

- (void)handleExternalScreenDidDisconnect:(NSNotification *)notification
{
    [self hideFromExternalDisplay];
}

Felix Paul Kühne's avatar
Felix Paul Kühne committed
296
@end