Advertisement
greagdeay

swift view controller

May 24th, 2015
729
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.82 KB | None | 0 0
  1. //
  2. //  ViewController.swift
  3. //  radioButton
  4. //
  5. //  Created by Евгений on 17.04.15.
  6. //  Copyright (c) 2015 LimanskyDev. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import MediaPlayer
  11. import AVFoundation
  12. import Social
  13.  
  14. class ViewController: UIViewController {
  15.    
  16.     var savedTitle: String = ""
  17.    
  18.     let screenWidth = UIScreen.mainScreen().bounds.width
  19.     let screenHeight = UIScreen.mainScreen().bounds.height
  20.    
  21.     let playImage = UIImage(named: "play.png") as UIImage!
  22.     let pauseImage = UIImage(named: "stop.png") as UIImage!
  23.     let maxVolume = UIImage(named: "maxVolumeSlider.png") as UIImage!
  24.     let minVolume = UIImage(named: "minVolumeSlider.png") as UIImage!
  25.     let volumePin = UIImage(named: "volumePin.png") as UIImage!
  26.    
  27.     let selectedRing = UIImage(named: "active.png") as UIImage!
  28.    
  29.     var player: AVPlayer!
  30.     var playerItem: AVPlayerItem!
  31.    
  32.     var wrapperView = UIView(frame: CGRectMake(0, 0, 800, 30))
  33.    
  34.     @IBOutlet weak var lowQualityButton: UIButton!
  35.     @IBOutlet weak var highVol: UIImageView!
  36.     @IBOutlet weak var highQualityButton: UIButton!
  37.    
  38.     @IBOutlet weak var lowVol: UIImageView!
  39.     @IBOutlet weak var playerInfo: UILabel!
  40.    
  41.     var connected: Bool = false
  42.    
  43.     private var reachability:Reachability!
  44.    
  45.     private var server:String = "server-ip"
  46.     //http://streaming.radionomy.com/Elium-ClubDance
  47.     private var lowMount:String = "/s64kbps"
  48.     private var highMount:String = "/s128kbps"
  49.     private var currentMount:String = "/s128kbps"
  50.    
  51.     override func viewDidLoad() {
  52.         super.viewDidLoad()
  53.         lowVol.frame = CGRectMake(10, 27, 15, 15)
  54.         highVol.frame = CGRectMake(screenWidth - 30, 25, 20, 20)
  55.         IJProgressView.shared.showProgressView(view)
  56.         setSessionPlayer()
  57.         wrapperView = UIView(frame: CGRectMake(0, 25, screenWidth, 30))
  58.        
  59.         playerItem = AVPlayerItem(URL: NSURL(string: (self.server + self.currentMount) ))
  60.         playerItem.addObserver(self, forKeyPath: "timedMetadata", options: nil, context: nil)
  61.         playerItem.addObserver(self, forKeyPath:"loadedTimeRanges", options: nil, context: nil)
  62.        
  63.         UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
  64.        
  65.         player = AVPlayer(playerItem: playerItem)
  66.         player.addObserver(self, forKeyPath: "status", options: nil, context: nil)
  67.         player.volume = AVAudioSession.sharedInstance().outputVolume
  68.         player.allowsExternalPlayback = true
  69.        
  70.         self.view.backgroundColor = UIColor.whiteColor()
  71.         var volumeView = MPVolumeView(frame: wrapperView.bounds)
  72.         volumeView.setMaximumVolumeSliderImage(maxVolume, forState: .Normal)
  73.         volumeView.setMinimumVolumeSliderImage(minVolume, forState: .Normal)
  74.         volumeView.setVolumeThumbImage(volumePin, forState: .Normal)
  75.         volumeView.showsRouteButton = false
  76.        
  77.        
  78.         wrapperView.addSubview(volumeView)
  79.        
  80.         highBitPressed(highQualityButton)
  81.        
  82.         highQualityButton.setTitleColor(UIColor.whiteColor(), forState: .Selected)
  83.         lowQualityButton.setTitleColor(UIColor.whiteColor(), forState: .Selected)
  84.         self.view.insertSubview(wrapperView, atIndex:2)
  85.        
  86.         NSNotificationCenter.defaultCenter().addObserver(self, selector: "audioSessionInterrupted:", name: AVAudioSessionInterruptionNotification, object: AVAudioSession.sharedInstance())
  87.        
  88.        
  89.        
  90.         reachability = Reachability.reachabilityForInternetConnection()
  91.        
  92.         NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged:", name: ReachabilityChangedNotification, object: reachability)
  93.        
  94.         reachability.startNotifier()
  95.     }
  96.    
  97.     override func viewDidAppear(animated: Bool) {
  98.         UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
  99.        
  100.         if ((savedTitle as NSString).containsString("-"))
  101.         {
  102.             var tittleArr = split(savedTitle) {$0 == "-"}
  103.             MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = [MPMediaItemPropertyArtist : tittleArr[0],  MPMediaItemPropertyTitle : tittleArr[1]]
  104.         }
  105.         IJProgressView.shared.showProgressView(view)
  106.         if (playerItem.loadedTimeRanges != nil)
  107.         {
  108.         var timeRangeArray: NSArray = playerItem.loadedTimeRanges
  109.             if (timeRangeArray.count > 0)
  110.             {
  111.         var timerange: CMTimeRange = timeRangeArray.objectAtIndex(0).CMTimeRangeValue
  112.         var smartValue: Float64 = CMTimeGetSeconds(timerange.start);
  113.         var duration: Float64  = CMTimeGetSeconds(timerange.duration);
  114.         if( duration - smartValue > 5 || smartValue == duration) {
  115.             IJProgressView.shared.hideProgressView()
  116.         } else
  117.         {
  118.             IJProgressView.shared.showProgressView(view)
  119.         }
  120.             }
  121.         }
  122.     }
  123.     func reachabilityChanged(note: NSNotification) {
  124.         IJProgressView.shared.showProgressView(view)
  125.         let reachability = note.object as! Reachability
  126.        
  127.         if (reachability.isReachable())
  128.         {
  129.             if (reachability.isReachableViaWiFi())
  130.             {
  131.                 if(connected)
  132.                 {
  133.                     updatePlayer()
  134.                 }
  135.             } else   {
  136.                 if(connected)
  137.                 {
  138.                     updatePlayer()
  139.                 }
  140.             }
  141.         }
  142.             else  {
  143.                 IJProgressView.shared.showProgressView(view)
  144.             }
  145.        
  146.     }
  147.    
  148.     func updatePlayer()
  149.     {
  150.         playerItem.removeObserver(self, forKeyPath: "timedMetadata")
  151.         player.removeObserver(self, forKeyPath: "status")
  152.         playerItem.removeObserver(self, forKeyPath: "loadedTimeRanges")
  153.         playerItem = AVPlayerItem(URL: NSURL(string: (self.server + self.currentMount)))
  154.         playerItem.addObserver(self, forKeyPath:"loadedTimeRanges", options: nil, context: nil)
  155.         playerItem.addObserver(self, forKeyPath: "timedMetadata", options: nil, context: nil)
  156.         player = AVPlayer(playerItem: playerItem)
  157.         setSessionPlayer()
  158.         if (connected)
  159.         {
  160.             player.play()
  161.         }
  162.         player.addObserver(self, forKeyPath: "status", options: nil, context: nil)
  163.         player.allowsExternalPlayback = true;
  164.        
  165.         UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
  166.        
  167.         if ((savedTitle as NSString).containsString("-"))
  168.         {
  169.             var tittleArr = split(savedTitle) {$0 == "-"}
  170.             MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = [MPMediaItemPropertyArtist : tittleArr[0],  MPMediaItemPropertyTitle : tittleArr[1]]
  171.         }
  172.     }
  173.    
  174.     func setSessionPlayer()
  175.     {
  176.         var audioSessionError: NSError?
  177.         let audioSession = AVAudioSession.sharedInstance()
  178.         audioSession.setActive(true, error: nil)
  179.         audioSession.setCategory(AVAudioSessionCategoryPlayback, error: &audioSessionError)
  180.         audioSession.setActive(true, error: nil)
  181.     }
  182.    
  183.    
  184.     func audioSessionInterrupted(notification:NSNotification)
  185.     {
  186.         if notification.name == AVAudioSessionInterruptionNotification
  187.             && notification.userInfo != nil {
  188.                
  189.                 var info = notification.userInfo!
  190.                 var intValue: UInt = 0
  191.                 (info[AVAudioSessionInterruptionTypeKey] as! NSValue).getValue(&intValue)
  192.                
  193.                 if let type = AVAudioSessionInterruptionType(rawValue: intValue) {
  194.                    
  195.                     switch type {
  196.                     case .Began:
  197.                         playButton.selected = false
  198.                         playerInfo.text = "press play"
  199.                     case .Ended:
  200.                         // interruption ended
  201.                        
  202.                         if let option: AnyObject = notification.userInfo?[AVAudioSessionInterruptionOptionKey] {
  203.                            
  204.                             if let option = option as? UInt {
  205.                                 let options = AVAudioSessionInterruptionOptions(option)
  206.                                
  207.                                 if options == AVAudioSessionInterruptionOptions.OptionShouldResume {
  208.                                     play()
  209.                                 }
  210.                             }
  211.                         }
  212.                     }
  213.                 }
  214.         }
  215.     }
  216.    
  217.    
  218.    
  219.     func play()
  220.     {
  221.         player.play()
  222.         playerInfo.text = savedTitle
  223.         playButton.selected = true
  224.         if ((savedTitle as NSString).containsString("-"))
  225.         {
  226.         var tittleArr = split(savedTitle) {$0 == "-"}
  227.         MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = [MPMediaItemPropertyArtist : tittleArr[0],  MPMediaItemPropertyTitle : tittleArr[1]]
  228.         }
  229.     }
  230.    
  231.     @IBAction func onConnectPressed(sender: UIButton) {
  232.         if ( !connected )
  233.         {
  234.             sender.selected = true
  235.             play()
  236.         }
  237.         else
  238.         {
  239.             sender.selected = false
  240.             playerInfo.text = "press play"
  241.             player.pause()
  242.             IJProgressView.shared.hideProgressView()
  243.         }
  244.         connected = !connected
  245.     }
  246.    
  247.    
  248.     override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) -> Void
  249.     {
  250.         if (AVAudioSession.sharedInstance().otherAudioPlaying)
  251.         {
  252.                 playButton.selected = false
  253.                 playerInfo.text = "press play"
  254.                 player.pause()
  255.                 IJProgressView.shared.hideProgressView()
  256.                 return
  257.         }
  258.        
  259.         if ("loadedTimeRanges" == keyPath)
  260.         {
  261.            
  262.             var timeRangeArray: NSArray = playerItem.loadedTimeRanges
  263.             var timerange: CMTimeRange = timeRangeArray.objectAtIndex(0).CMTimeRangeValue
  264.             var smartValue: Float64 = CMTimeGetSeconds(player.currentTime());
  265.             var duration: Float64  = CMTimeGetSeconds(CMTimeAdd(timerange.start, timerange.duration));
  266.             if( duration - smartValue > 5 || smartValue == duration) {
  267.                 IJProgressView.shared.hideProgressView()
  268.             } else
  269.             {
  270.                 IJProgressView.shared.showProgressView(view)
  271.             }
  272.             return
  273.         }
  274.         if (object as! NSObject == player && keyPath == "status") {
  275.             if (player.status == AVPlayerStatus.ReadyToPlay) {
  276.             } else if (player.status == AVPlayerStatus.Failed) {
  277.                 IJProgressView.shared.showProgressView(view)
  278.                 updatePlayer()
  279.             }
  280.             return
  281.         }
  282.         if (keyPath == "timedMetadata")
  283.         {
  284.             if var data: AVPlayerItem = object as? AVPlayerItem
  285.             {
  286.                 if var meta: [AVMetadataItem] = data.timedMetadata as? [AVMetadataItem]
  287.                 {
  288.                     for item in meta{
  289.                         playerInfo.text = "\(item.value)"
  290.                         savedTitle = "\(item.value)"
  291.                     }
  292.                     if ((savedTitle as NSString).containsString("-"))
  293.                     {                    var tittleArr = split(savedTitle) {$0 == "-"}
  294.                     MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = [MPMediaItemPropertyArtist : tittleArr[0],  MPMediaItemPropertyTitle : tittleArr[1]]
  295.                     }
  296.                     IJProgressView.shared.hideProgressView()
  297.                 }
  298.                 else
  299.                 {
  300.                     playerInfo.text = savedTitle
  301.                 }
  302.             }
  303.             return
  304.         }
  305.        
  306.         if (player.status == AVPlayerStatus.ReadyToPlay)
  307.         {
  308.             var timeRangeArray: NSArray = player.currentItem.loadedTimeRanges
  309.             var timerange: CMTimeRange = timeRangeArray.objectAtIndex(0).CMTimeRangeValue
  310.             var smartValue: Float64 = CMTimeGetSeconds(timerange.start);
  311.             var duration: Float64  = CMTimeGetSeconds(timerange.duration);
  312.             if( duration - smartValue > 5 ) {
  313.                 IJProgressView.shared.hideProgressView()
  314.             } else
  315.             {
  316.                 IJProgressView.shared.showProgressView(view)
  317.             }
  318.         }
  319.     }
  320.    
  321.    
  322.     @IBAction func lowBitPressed(sender: AnyObject) {
  323.         lowQualityButton.selected = true;
  324.         highQualityButton.selected = false;
  325.         lowQualityButton.bounds = CGRectMake(lowQualityButton.bounds.minX, lowQualityButton.bounds.minY, 40, 40)
  326.         highQualityButton.bounds = CGRectMake(highQualityButton.bounds.minX, highQualityButton.bounds.minY, 100, 40)
  327.        
  328.        
  329.         playerItem.preferredPeakBitRate = 64
  330.         currentMount = lowMount
  331.         updatePlayer()
  332.     }
  333.    
  334.     @IBAction func highBitPressed(sender: AnyObject) {
  335.         lowQualityButton.selected = false;
  336.         highQualityButton.selected = true;
  337.         playerItem.preferredPeakBitRate = 128
  338.         lowQualityButton.bounds = CGRectMake(lowQualityButton.bounds.minX, lowQualityButton.bounds.minY, 100, 40)
  339.         highQualityButton.bounds = CGRectMake(highQualityButton.bounds.minX, highQualityButton.bounds.minY, 40, 40)
  340.        
  341.         currentMount = highMount
  342.         updatePlayer()
  343.     }
  344.    
  345.     @IBOutlet weak var playButton: UIButton!
  346.    
  347.     @IBAction func sharePressed(sender: UIButton) {
  348.        
  349.         let textToShare = "I love this radio and I think you'll love it, too!"
  350.        
  351.         if let myWebsite = NSURL(string: "http://www.fastcast4u.com")
  352.         {
  353.             let objectsToShare = [textToShare, myWebsite]
  354.             var activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
  355.            
  356.             //New Excluded Activities Code
  357.             activityVC.excludedActivityTypes = [UIActivityTypeAirDrop, UIActivityTypeAddToReadingList]
  358.             //
  359.             if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
  360.                 activityVC.popoverPresentationController!.sourceView = self.view;
  361.             }
  362.            
  363.             self.presentViewController(activityVC, animated: true, completion: nil)
  364.              
  365.         }
  366.     }
  367.     func DoNothin()
  368.     {
  369.    
  370.     }
  371.     override func remoteControlReceivedWithEvent(receivedEvent:UIEvent)  {
  372.         if (receivedEvent.type == .RemoteControl) {
  373.             switch receivedEvent.subtype {
  374.             case .RemoteControlTogglePlayPause:
  375.                 onConnectPressed(playButton)
  376.             case .RemoteControlPlay:
  377.                 onConnectPressed(playButton)
  378.             case .RemoteControlPause:
  379.                 onConnectPressed(playButton)
  380.             default:
  381.                 DoNothin()
  382.             }
  383.         }
  384.     }}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement