46022ef0d6
The AudioSession category will need to be set again when this event is emitted.
125 lines
4.0 KiB
Swift
125 lines
4.0 KiB
Swift
//
|
|
// ViewController.swift
|
|
// SwiftAudio
|
|
//
|
|
// Created by Jørgen Henrichsen on 03/11/2018.
|
|
// Copyright (c) 2018 Jørgen Henrichsen. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import SwiftAudio
|
|
import AVFoundation
|
|
import MediaPlayer
|
|
|
|
|
|
class ViewController: UIViewController {
|
|
|
|
@IBOutlet weak var playButton: UIButton!
|
|
@IBOutlet weak var slider: UISlider!
|
|
@IBOutlet weak var imageView: UIImageView!
|
|
@IBOutlet weak var remainingTimeLabel: UILabel!
|
|
@IBOutlet weak var elapsedTimeLabel: UILabel!
|
|
@IBOutlet weak var titleLabel: UILabel!
|
|
@IBOutlet weak var artistLabel: UILabel!
|
|
|
|
var isScrubbing: Bool = false
|
|
let controller = AudioController.shared
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
controller.player.event.stateChange.addListener(self, handleAudioPlayerStateChange)
|
|
controller.player.event.secondElapse.addListener(self, handleAudioPlayerSecondElapsed)
|
|
controller.player.event.seek.addListener(self, handleAudioPlayerDidSeek)
|
|
controller.player.event.updateDuration.addListener(self, handleAudioPlayerUpdateDuration)
|
|
controller.player.event.didRecreateAVPlayer.addListener(self, handleAVPlayerRecreated)
|
|
}
|
|
|
|
@IBAction func togglePlay(_ sender: Any) {
|
|
if (!controller.audioSessionController.audioSessionIsActive) {
|
|
try? controller.audioSessionController.activateSession()
|
|
}
|
|
controller.player.togglePlaying()
|
|
}
|
|
|
|
@IBAction func previous(_ sender: Any) {
|
|
try? controller.player.previous()
|
|
}
|
|
|
|
@IBAction func next(_ sender: Any) {
|
|
try? controller.player.next()
|
|
}
|
|
|
|
@IBAction func startScrubbing(_ sender: UISlider) {
|
|
isScrubbing = true
|
|
}
|
|
|
|
@IBAction func scrubbing(_ sender: UISlider) {
|
|
controller.player.seek(to: Double(slider.value))
|
|
}
|
|
|
|
@IBAction func scrubbingValueChanged(_ sender: UISlider) {
|
|
let value = Double(slider.value)
|
|
elapsedTimeLabel.text = value.secondsToString()
|
|
remainingTimeLabel.text = (controller.player.duration - value).secondsToString()
|
|
}
|
|
|
|
func updateTimeValues() {
|
|
self.slider.maximumValue = Float(self.controller.player.duration)
|
|
self.slider.setValue(Float(self.controller.player.currentTime), animated: true)
|
|
self.elapsedTimeLabel.text = self.controller.player.currentTime.secondsToString()
|
|
self.remainingTimeLabel.text = (self.controller.player.duration - self.controller.player.currentTime).secondsToString()
|
|
}
|
|
|
|
func updateMetaData() {
|
|
if let item = controller.player.currentItem {
|
|
titleLabel.text = item.getTitle()
|
|
artistLabel.text = item.getArtist()
|
|
item.getArtwork({ (image) in
|
|
self.imageView.image = image
|
|
})
|
|
}
|
|
}
|
|
|
|
func setPlayButtonState(forAudioPlayerState state: AudioPlayerState) {
|
|
playButton.setTitle(state == .playing ? "Pause" : "Play", for: .normal)
|
|
}
|
|
|
|
// MARK: - AudioPlayer Event Handlers
|
|
|
|
func handleAudioPlayerStateChange(data: AudioPlayer.StateChangeEventData) {
|
|
DispatchQueue.main.async {
|
|
self.setPlayButtonState(forAudioPlayerState: data)
|
|
switch data {
|
|
case .ready:
|
|
self.updateMetaData()
|
|
self.updateTimeValues()
|
|
case .loading, .playing, .paused, .idle:
|
|
self.updateTimeValues()
|
|
}
|
|
}
|
|
}
|
|
|
|
func handleAudioPlayerSecondElapsed(data: AudioPlayer.SecondElapseEventData) {
|
|
if !isScrubbing {
|
|
DispatchQueue.main.async {
|
|
self.updateTimeValues()
|
|
}
|
|
}
|
|
}
|
|
|
|
func handleAudioPlayerDidSeek(data: AudioPlayer.SeekEventData) {
|
|
isScrubbing = false
|
|
}
|
|
|
|
func handleAudioPlayerUpdateDuration(data: AudioPlayer.UpdateDurationEventData) {
|
|
DispatchQueue.main.async {
|
|
self.updateTimeValues()
|
|
}
|
|
}
|
|
|
|
func handleAVPlayerRecreated() {
|
|
try? controller.audioSessionController.set(category: .playback)
|
|
}
|
|
|
|
}
|