PlaybackSpeedView.swift 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*****************************************************************************
  2. * PlaybaclSpeedView.swift
  3. *
  4. * Copyright © 2018 VLC authors and VideoLAN
  5. * Copyright © 2018 Videolabs
  6. *
  7. * Authors: Carola Nitz <caro@videolan.org>
  8. *
  9. * Refer to the COPYING file of the official project for license.
  10. *****************************************************************************/
  11. @objc protocol PlaybackSpeedViewDelegate: NSObjectProtocol {
  12. func playbackSpeedViewShouldResetIdleTimer(_ playbackSpeedView: PlaybackSpeedView)
  13. func playbackSpeedViewSleepTimerHit(_ playbackSpeedView: PlaybackSpeedView)
  14. }
  15. class PlaybackSpeedView: VLCFrostedGlasView {
  16. @IBInspectable var nibName: String?
  17. @IBOutlet weak var playbackSpeedSlider: UISlider!
  18. @IBOutlet weak var playbackSpeedLabel: UILabel!
  19. @IBOutlet weak var playbackSpeedIndicator: UILabel!
  20. @IBOutlet weak var audioDelaySlider: UISlider!
  21. @IBOutlet weak var audioDelayLabel: UILabel!
  22. @IBOutlet weak var audioDelayIndicator: UILabel!
  23. @IBOutlet weak var spuDelaySlider: UISlider!
  24. @IBOutlet weak var spuDelayLabel: UILabel!
  25. @IBOutlet weak var spuDelayIndicator: UILabel!
  26. @IBOutlet weak var sleepTimerButton: UIButton!
  27. @objc weak var delegate: PlaybackSpeedViewDelegate?
  28. private var sleepCountDownTimer: Timer?
  29. let vpc = VLCPlaybackController.sharedInstance()
  30. override func awakeFromNib() {
  31. super.awakeFromNib()
  32. xibSetup()
  33. playbackSpeedLabel.text = NSLocalizedString("PLAYBACK_SPEED", comment:"")
  34. playbackSpeedSlider.accessibilityLabel = playbackSpeedLabel.text
  35. audioDelayLabel.text = NSLocalizedString("AUDIO_DELAY", comment:"")
  36. audioDelaySlider.accessibilityLabel = audioDelayLabel.text
  37. spuDelayLabel.text = NSLocalizedString("SPU_DELAY", comment:"")
  38. spuDelaySlider.accessibilityLabel = spuDelayLabel.text
  39. sleepTimerButton.setTitle(NSLocalizedString("BUTTON_SLEEP_TIMER", comment:""), for: .normal)
  40. sleepTimerButton.accessibilityLabel = sleepTimerButton.title(for: .normal)
  41. }
  42. func xibSetup() {
  43. guard let view = loadViewFromNib() else { return }
  44. view.frame = bounds
  45. view.autoresizingMask =
  46. [.flexibleWidth, .flexibleHeight]
  47. addSubview(view)
  48. }
  49. func loadViewFromNib() -> PlaybackSpeedView? {
  50. guard let nibName = nibName else { return nil }
  51. let bundle = Bundle(for: type(of: self))
  52. let nib = UINib(nibName: nibName, bundle: bundle)
  53. return nib.instantiate(
  54. withOwner: self,
  55. options: nil).first as? PlaybackSpeedView
  56. }
  57. @objc func prepareForMediaPlayback(controller: VLCPlaybackController) {
  58. let playbackRate = controller.playbackRate
  59. playbackSpeedSlider.value = log2(playbackRate)
  60. playbackSpeedIndicator.text = String(format: "%.2fx", playbackRate)
  61. let audioDelay = controller.audioDelay
  62. audioDelaySlider.value = audioDelay
  63. audioDelayIndicator.text = String(format: "%d ms", audioDelay)
  64. let subtitleDelay = controller.subtitleDelay
  65. spuDelaySlider.value = subtitleDelay
  66. spuDelayIndicator.text = String(format: "%d ms", subtitleDelay)
  67. }
  68. @objc func updateSleepTimerButton() {
  69. var title = NSLocalizedString("BUTTON_SLEEP_TIMER", comment:"")
  70. if vpc.sleepTimer.isValid {
  71. let remainSeconds = vpc.sleepTimer.fireDate.timeIntervalSinceNow
  72. let hour = remainSeconds / 3600
  73. let minute = (remainSeconds - hour * 3600) / 60
  74. let second = remainSeconds.truncatingRemainder(dividingBy: 60)
  75. title = title.appendingFormat(" %02d:%02d:%02d", hour, minute, second)
  76. } else {
  77. sleepCountDownTimer?.invalidate()
  78. }
  79. sleepTimerButton.setTitle(title, for: .normal)
  80. }
  81. @objc func setupSleepTimerIfNecessary() {
  82. if sleepCountDownTimer == nil || !sleepCountDownTimer!.isValid {
  83. sleepCountDownTimer = Timer(timeInterval: 1, target: self, selector: #selector(updateSleepTimerButton), userInfo: nil, repeats: true)
  84. }
  85. }
  86. @IBAction func sleepTimer(sender: UIButton) {
  87. delegate?.playbackSpeedViewSleepTimerHit(self)
  88. }
  89. @IBAction func playbackSliderAction(sender: UISlider) {
  90. if sender == playbackSpeedSlider {
  91. let speed = exp2(sender.value)
  92. vpc.playbackRate = speed
  93. playbackSpeedIndicator.text = String(format: "%.2fx", speed)
  94. } else if sender == audioDelaySlider {
  95. let delay = round(sender.value / 50) * 50
  96. vpc.audioDelay = delay
  97. sender.setValue(delay, animated: false)
  98. audioDelayIndicator.text = String(format: "%.0f ms", delay)
  99. } else if sender == spuDelaySlider {
  100. let delay = round(sender.value / 50) * 50
  101. vpc.subtitleDelay = delay
  102. sender.setValue(delay, animated: false)
  103. spuDelayIndicator.text = String(format: "%.0f ms", delay)
  104. }
  105. delegate?.playbackSpeedViewShouldResetIdleTimer(self)
  106. }
  107. }