parent
1fac7ff50b
commit
a7bb2cf906
@ -0,0 +1,82 @@ |
||||
// |
||||
// StatePlayer.swift |
||||
// LeCountdown |
||||
// |
||||
// Created by Laurent Morvillier on 17/03/2023. |
||||
// |
||||
|
||||
import Foundation |
||||
import AVFoundation |
||||
|
||||
enum DemoError: Error { |
||||
case didNotFindDemoFile |
||||
} |
||||
|
||||
class StatePlayer: NSObject, ObservableObject, AVAudioPlayerDelegate { |
||||
|
||||
enum State { |
||||
case noResource |
||||
case playing |
||||
case paused |
||||
case none |
||||
|
||||
var systemImage: String { |
||||
switch self { |
||||
case .paused, .none: return "play.circle" |
||||
case .playing: return "pause.circle" |
||||
case .noResource: return "" |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
@Published var audioPlayer: AVAudioPlayer? = nil |
||||
|
||||
@Published var state: State = .noResource |
||||
|
||||
@Published var completion: Double? = nil |
||||
|
||||
var timer: Timer? = nil |
||||
|
||||
override init() { |
||||
super.init() |
||||
self.timer = Timer(timeInterval: 1.0, repeats: true, block: { timer in |
||||
self.calculateCompletion() |
||||
}) |
||||
} |
||||
|
||||
func load(resource: String, ext: String) { |
||||
do { |
||||
guard let demoURL = Bundle.main.url(forResource: resource, withExtension: ext) else { |
||||
throw DemoError.didNotFindDemoFile |
||||
} |
||||
self.audioPlayer = try AVAudioPlayer(contentsOf: demoURL) |
||||
self.audioPlayer?.delegate = self |
||||
self.state = .none |
||||
} catch { |
||||
Logger.error(error) |
||||
} |
||||
} |
||||
|
||||
func calculateCompletion() { |
||||
if let player = self.audioPlayer { |
||||
self.completion = player.currentTime / player.duration |
||||
} |
||||
self.completion = nil |
||||
} |
||||
|
||||
func play() { |
||||
self.audioPlayer?.play() |
||||
self.state = .playing |
||||
} |
||||
|
||||
func pause() { |
||||
self.audioPlayer?.pause() |
||||
self.state = .paused |
||||
} |
||||
|
||||
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { |
||||
self.state = .none |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue