diff --git a/Project/Player/ViewController.swift b/Project/Player/ViewController.swift index f90e99d..382f80d 100644 --- a/Project/Player/ViewController.swift +++ b/Project/Player/ViewController.swift @@ -34,8 +34,8 @@ class ViewController: UIViewController, PlayerDelegate { // MARK: object lifecycle - override init() { - super.init() + convenience init() { + self.init(nibName: nil, bundle:nil) } required init(coder aDecoder: NSCoder) { diff --git a/Source/Player.swift b/Source/Player.swift index c487d9f..5c89345 100644 --- a/Source/Player.swift +++ b/Source/Player.swift @@ -34,7 +34,7 @@ public enum PlaybackState: Int, Printable { case Playing case Paused case Failed - + public var description: String { get { switch self { @@ -55,7 +55,7 @@ public enum BufferingState: Int, Printable { case Unknown = 0 case Ready case Delayed - + public var description: String { get { switch self { @@ -107,9 +107,9 @@ private let PlayerReadyForDisplay = "readyForDisplay" public class Player: UIViewController { public var delegate: PlayerDelegate! - + private var filepath: String! - public var path: NSString! { + public var path: String! { get { return filepath } @@ -118,12 +118,12 @@ public class Player: UIViewController { if(self.playbackState == .Playing){ self.pause() } - + self.setupPlayerItem(nil) - + filepath = newValue var remoteUrl: NSURL? = NSURL(string: newValue) - if remoteUrl? != nil && remoteUrl?.scheme? != nil { + if remoteUrl != nil && remoteUrl?.scheme != nil { if let asset = AVURLAsset(URL: remoteUrl, options: .None) { self.setupAsset(asset) } @@ -145,7 +145,7 @@ public class Player: UIViewController { } } - public var fillMode: NSString! { + public var fillMode: String! { get { return self.playerView.fillMode } @@ -153,7 +153,7 @@ public class Player: UIViewController { self.playerView.fillMode = newValue } } - + public var playbackLoops: Bool! { get { return (self.player.actionAtItemEnd == .None) as Bool @@ -182,14 +182,14 @@ public class Player: UIViewController { private var asset: AVAsset! private var playerItem: AVPlayerItem? - + private var player: AVPlayer! private var playerView: PlayerView! // MARK: object lifecycle - public override init() { - super.init() + public convenience init() { + self.init(nibName: nil, bundle: nil) self.player = AVPlayer() self.player.actionAtItemEnd = .Pause self.player.addObserver(self, forKeyPath: PlayerRateKey, options: (NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old) , context: &PlayerObserverContext) @@ -199,52 +199,51 @@ public class Player: UIViewController { self.playbackState = .Stopped self.bufferingState = .Unknown } - + public required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } - + public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) } - + deinit { self.playerView.player = nil self.delegate = nil - + NSNotificationCenter.defaultCenter().removeObserver(self) - + self.playerView.layer.removeObserver(self, forKeyPath: PlayerReadyForDisplay, context: &PlayerLayerObserverContext) - + self.player.removeObserver(self, forKeyPath: PlayerRateKey, context: &PlayerObserverContext) - + self.player.pause() - + self.setupPlayerItem(nil) } - + // MARK: view lifecycle - + public override func loadView() { self.playerView = PlayerView(frame: CGRectZero) self.playerView.fillMode = AVLayerVideoGravityResizeAspect self.playerView.playerLayer.hidden = true self.view = self.playerView - self.playerView.layer.addObserver(self, forKeyPath: PlayerReadyForDisplay, options: (NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old), context: &PlayerLayerObserverContext) - + NSNotificationCenter.defaultCenter().addObserver(self, selector: "applicationWillResignActive:", name: UIApplicationWillResignActiveNotification, object: UIApplication.sharedApplication()) NSNotificationCenter.defaultCenter().addObserver(self, selector: "applicationDidEnterBackground:", name: UIApplicationDidEnterBackgroundNotification, object: UIApplication.sharedApplication()) } - + public override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) - + if self.playbackState == .Playing { self.pause() } } - + // MARK: methods public func playFromBeginning() { @@ -252,51 +251,51 @@ public class Player: UIViewController { self.player.seekToTime(kCMTimeZero) self.playFromCurrentTime() } - + public func playFromCurrentTime() { self.playbackState = .Playing self.delegate?.playerPlaybackStateDidChange(self) self.player.play() } - + public func pause() { if self.playbackState != .Playing { return } - + self.player.pause() self.playbackState = .Paused self.delegate?.playerPlaybackStateDidChange(self) } - + public func stop() { if self.playbackState == .Stopped { return } - + self.player.pause() self.playbackState = .Stopped self.delegate?.playerPlaybackStateDidChange(self) self.delegate?.playerPlaybackDidEnd(self) } - + // MARK: private setup private func setupAsset(asset: AVAsset) { if self.playbackState == .Playing { self.pause() } - + self.bufferingState = .Unknown self.delegate?.playerBufferingStateDidChange(self) - + self.asset = asset if let updatedAsset = self.asset { self.setupPlayerItem(nil) } - + let keys: [String] = [PlayerTracksKey, PlayerPlayableKey, PlayerDurationKey] - + self.asset.loadValuesAsynchronouslyForKeys(keys, completionHandler: { () -> Void in dispatch_sync(dispatch_get_main_queue(), { () -> Void in @@ -318,11 +317,11 @@ public class Player: UIViewController { let playerItem: AVPlayerItem = AVPlayerItem(asset:self.asset) self.setupPlayerItem(playerItem) - + }) }) } - + private func setupPlayerItem(playerItem: AVPlayerItem?) { let item = playerItem @@ -334,50 +333,50 @@ public class Player: UIViewController { NSNotificationCenter.defaultCenter().removeObserver(self, name: AVPlayerItemDidPlayToEndTimeNotification, object: self.playerItem) NSNotificationCenter.defaultCenter().removeObserver(self, name: AVPlayerItemFailedToPlayToEndTimeNotification, object: self.playerItem) } - + self.playerItem = item - + if item != nil { self.playerItem?.addObserver(self, forKeyPath: PlayerEmptyBufferKey, options: (NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old), context: &PlayerItemObserverContext) self.playerItem?.addObserver(self, forKeyPath: PlayerKeepUp, options: (NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old), context: &PlayerItemObserverContext) self.playerItem?.addObserver(self, forKeyPath: PlayerStatusKey, options: (NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old), context: &PlayerItemObserverContext) - + NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidPlayToEndTime:", name: AVPlayerItemDidPlayToEndTimeNotification, object: self.playerItem) NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemFailedToPlayToEndTime:", name: AVPlayerItemFailedToPlayToEndTimeNotification, object: self.playerItem) } - + self.player.replaceCurrentItemWithPlayerItem(self.playerItem) - + if self.playbackLoops.boolValue == true { self.player.actionAtItemEnd = .None } else { self.player.actionAtItemEnd = .Pause } } - + // MARK: NSNotifications - + public func playerItemDidPlayToEndTime(aNotification: NSNotification) { if self.playbackLoops.boolValue == true || self.playbackFreezesAtEnd.boolValue == true { self.player.seekToTime(kCMTimeZero) } - + if self.playbackLoops.boolValue == false { self.stop() } } - + public func playerItemFailedToPlayToEndTime(aNotification: NSNotification) { self.playbackState = .Failed self.delegate?.playerPlaybackStateDidChange(self) } - + public func applicationWillResignActive(aNotification: NSNotification) { if self.playbackState == .Playing { self.pause() } } - + public func applicationDidEnterBackground(aNotification: NSNotification) { if self.playbackState == .Playing { self.pause() @@ -387,7 +386,7 @@ public class Player: UIViewController { // MARK: KVO public override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer) { - + switch (keyPath, context) { case (PlayerRateKey, &PlayerObserverContext): true @@ -397,12 +396,14 @@ public class Player: UIViewController { if let item = self.playerItem { self.bufferingState = .Ready self.delegate?.playerBufferingStateDidChange(self) - + if item.playbackLikelyToKeepUp && self.playbackState == .Playing { self.playFromCurrentTime() } } - let status = (change[NSKeyValueChangeNewKey] as NSNumber).integerValue as AVPlayerStatus.RawValue + + let status = (change[NSKeyValueChangeNewKey] as! NSNumber).integerValue as AVPlayerStatus.RawValue + switch (status) { case AVPlayerStatus.ReadyToPlay.rawValue: self.playerView.playerLayer.player = self.player @@ -420,7 +421,9 @@ public class Player: UIViewController { self.delegate?.playerBufferingStateDidChange(self) } } - let status = (change[NSKeyValueChangeNewKey] as NSNumber).integerValue as AVPlayerStatus.RawValue + + let status = (change[NSKeyValueChangeNewKey] as! NSNumber).integerValue as AVPlayerStatus.RawValue + switch (status) { case AVPlayerStatus.ReadyToPlay.rawValue: self.playerView.playerLayer.player = self.player @@ -437,9 +440,9 @@ public class Player: UIViewController { } default: super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) - + } - + } } @@ -454,42 +457,42 @@ extension Player { // MARK: - PlayerView internal class PlayerView: UIView { - + var player: AVPlayer! { get { - return (self.layer as AVPlayerLayer).player + return (self.layer as! AVPlayerLayer).player } set { - (self.layer as AVPlayerLayer).player = newValue + (self.layer as! AVPlayerLayer).player = newValue } } - + var playerLayer: AVPlayerLayer! { get { - return self.layer as AVPlayerLayer + return self.layer as! AVPlayerLayer } } - var fillMode: NSString! { + var fillMode: String! { get { - return (self.layer as AVPlayerLayer).videoGravity + return (self.layer as! AVPlayerLayer).videoGravity } set { - (self.layer as AVPlayerLayer).videoGravity = newValue + (self.layer as! AVPlayerLayer).videoGravity = newValue } } - + override class func layerClass() -> AnyClass { return AVPlayerLayer.self } // MARK: object lifecycle - override init() { - super.init() + convenience init() { + self.init(frame: CGRectZero) self.playerLayer.backgroundColor = UIColor.blackColor().CGColor! } - + override init(frame: CGRect) { super.init(frame: frame) self.playerLayer.backgroundColor = UIColor.blackColor().CGColor! @@ -498,5 +501,5 @@ internal class PlayerView: UIView { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } - + }