|
@@ -25,7 +25,7 @@ class TSBusinessAudioPlayer {
|
|
|
private var audioPlayer: TSAudioPlayer?
|
|
|
|
|
|
var stateChangeBlock:(PlayerState) -> Void
|
|
|
-
|
|
|
+ var currentPlayerState:PlayerState = .stop
|
|
|
var duration:Double{
|
|
|
if let audioPlayer = audioPlayer {
|
|
|
return audioPlayer.duration
|
|
@@ -49,88 +49,214 @@ class TSBusinessAudioPlayer {
|
|
|
return false
|
|
|
}
|
|
|
var currentURLString:String = ""
|
|
|
+ var currentIndexPath:IndexPath? = nil
|
|
|
//加载音乐可能 2-3 秒有结果,停止加载后播放.
|
|
|
private var isStopPlayingAfterLoading:Bool = false
|
|
|
- private var loadingLogic:(show: () -> Void, hide: () -> Void)?
|
|
|
+// private var loadingLogic:(show: () -> Void, hide: () -> Void)?
|
|
|
init(stateChangeBlock:@escaping (PlayerState) -> Void) {
|
|
|
self.stateChangeBlock = stateChangeBlock
|
|
|
}
|
|
|
|
|
|
- func playUrlString(_ urlString:String?) {
|
|
|
+ func isPlayURLString(string:String,indexPath:IndexPath? = nil) -> Bool {
|
|
|
+
|
|
|
+ if currentURLString == string {
|
|
|
+ if let currentIndexPath = currentIndexPath,
|
|
|
+ let indexPath = indexPath,
|
|
|
+ indexPath != currentIndexPath
|
|
|
+ {
|
|
|
+ return false
|
|
|
+ }else{
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ func playUrlString(_ urlString:String?,loop:Bool = false,indexPath:IndexPath? = nil) {
|
|
|
+ self.stop()
|
|
|
if let urlString = urlString {
|
|
|
+
|
|
|
+// if self.currentURLString == urlStrin {
|
|
|
+// self.play()
|
|
|
+// return
|
|
|
+// }
|
|
|
self.currentURLString = urlString
|
|
|
- loadingLogic = kCreateLoadingLogic { [weak self] in
|
|
|
- guard let self = self else { return }
|
|
|
- self.stateChangeBlock(.loading(0.0))
|
|
|
- } hideBlock: {[weak self] in
|
|
|
- guard let self = self else { return }
|
|
|
- self.stateChangeBlock(.loading(1.0))
|
|
|
- }
|
|
|
+ self.currentIndexPath = indexPath
|
|
|
|
|
|
- loadingLogic?.show()
|
|
|
- isStopPlayingAfterLoading = false
|
|
|
- TSCommonTool.downloadAndCacheFile(from: urlString) { [weak self] path, error in
|
|
|
+ let palyFile:(URL)->Void = { [weak self] url in
|
|
|
guard let self = self else { return }
|
|
|
- loadingLogic?.hide()
|
|
|
+ debugPrint("正在播放url:\(currentURLString)")
|
|
|
+ debugPrint("正在播放path:\(url)")
|
|
|
+ self.audioPlayer = TSAudioPlayer(url: url)
|
|
|
+ self.audioPlayer?.setLoop(loop)
|
|
|
|
|
|
- if isStopPlayingAfterLoading == true || currentURLString != urlString{
|
|
|
- self.stop()
|
|
|
- isStopPlayingAfterLoading = false
|
|
|
- return
|
|
|
+ if self.audioPlayer?.volume == 0 {
|
|
|
+ setVolume(volume: 1.0)
|
|
|
+ }
|
|
|
+
|
|
|
+ self.play()
|
|
|
+ dePrint(self.audioPlayer?.duration)
|
|
|
+
|
|
|
+ self.audioPlayer?.audioPlayerDidFinishHandle = { [weak self] flag in
|
|
|
+ guard let self = self else { return }
|
|
|
+
|
|
|
+ if flag == true, self.audioPlayer?.isLooping == false{
|
|
|
+ stop()
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
+ isStopPlayingAfterLoading = false
|
|
|
+ if let path = TSCommonTool.getCachedURLString(from: urlString) {
|
|
|
+ palyFile(path) //播放
|
|
|
+ }else{
|
|
|
+ self.changePlayerState(.loading(0.0))
|
|
|
+ TSCommonTool.downloadAndCacheFile(from: urlString) { [weak self] path, error in
|
|
|
+ guard let self = self else { return }
|
|
|
+ self.changePlayerState(.loading(1.0))
|
|
|
|
|
|
- if let path = path {
|
|
|
- //播放
|
|
|
- if let url = URL(string: path) {
|
|
|
- self.audioPlayer = TSAudioPlayer(url: url)
|
|
|
- self.audioPlayer?.setLoop(true)
|
|
|
- setVolume(volume: 1.0)
|
|
|
- self.play()
|
|
|
- dePrint(self.audioPlayer?.duration)
|
|
|
+ if isStopPlayingAfterLoading == true || currentURLString != urlString{
|
|
|
+ self.stop()
|
|
|
+ isStopPlayingAfterLoading = false
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
- }else{
|
|
|
- //暂停
|
|
|
- self.stop()
|
|
|
+ if let path = path, let url = URL(string: path) {
|
|
|
+ palyFile(url) //播放
|
|
|
+ }else{
|
|
|
+ //暂停
|
|
|
+ self.stop()
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }else{
|
|
|
- self.stop()
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
|
|
|
+//
|
|
|
+// func playUrlString(_ urlString:String?,loop:Bool = false,indexPath:IndexPath? = nil) {
|
|
|
+// self.stop()
|
|
|
+// if let urlString = urlString {
|
|
|
+//
|
|
|
+//// if self.currentURLString == urlStrin {
|
|
|
+//// self.play()
|
|
|
+//// return
|
|
|
+//// }
|
|
|
+// self.currentURLString = urlString
|
|
|
+// self.currentIndexPath = indexPath
|
|
|
+// loadingLogic = kCreateLoadingLogic { [weak self] in
|
|
|
+// guard let self = self else { return }
|
|
|
+// self.changePlayerState(.loading(0.0))
|
|
|
+// } hideBlock: {[weak self] in
|
|
|
+// guard let self = self else { return }
|
|
|
+// self.changePlayerState(.loading(1.0))
|
|
|
+// }
|
|
|
+//
|
|
|
+// loadingLogic?.show()
|
|
|
+//
|
|
|
+//
|
|
|
+//// if let path = getCachedURLString(from: urlString) {
|
|
|
+////
|
|
|
+//// }else{
|
|
|
+////
|
|
|
+////
|
|
|
+//// }
|
|
|
+//
|
|
|
+//
|
|
|
+// let palyFile:(String)->Void = { [weak self] path in
|
|
|
+// guard let self = self else { return }
|
|
|
+// }
|
|
|
+// palyFile("111")
|
|
|
+//
|
|
|
+// isStopPlayingAfterLoading = false
|
|
|
+// TSCommonTool.downloadAndCacheFile(from: urlString) { [weak self] path, error in
|
|
|
+// guard let self = self else { return }
|
|
|
+// loadingLogic?.hide()
|
|
|
+//
|
|
|
+// if isStopPlayingAfterLoading == true || currentURLString != urlString{
|
|
|
+// self.stop()
|
|
|
+// isStopPlayingAfterLoading = false
|
|
|
+// return
|
|
|
+// }
|
|
|
+//
|
|
|
+// if let path = path {
|
|
|
+// //播放
|
|
|
+// if let url = URL(string: path) {
|
|
|
+// debugPrint("正在播放url:\(currentURLString)")
|
|
|
+// debugPrint("正在播放path:\(url)")
|
|
|
+// self.audioPlayer = TSAudioPlayer(url: url)
|
|
|
+// self.audioPlayer?.setLoop(loop)
|
|
|
+// setVolume(volume: 1.0)
|
|
|
+// self.play()
|
|
|
+// dePrint(self.audioPlayer?.duration)
|
|
|
+//
|
|
|
+// self.audioPlayer?.audioPlayerDidFinishHandle = { [weak self] flag in
|
|
|
+// guard let self = self else { return }
|
|
|
+//
|
|
|
+// if flag == true, self.audioPlayer?.isLooping == false{
|
|
|
+// stop()
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// }else{
|
|
|
+// //暂停
|
|
|
+// self.stop()
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+// }
|
|
|
+//
|
|
|
+
|
|
|
+
|
|
|
func play() {
|
|
|
self.audioPlayer?.play()
|
|
|
- stateChangeBlock(.play)
|
|
|
+ changePlayerState(.play)
|
|
|
}
|
|
|
|
|
|
- func stop() {
|
|
|
+ func stop(/*_ urlString:String? = nil*/) {
|
|
|
+
|
|
|
+// if let urlStr = urlString , currentURLString != urlStr {
|
|
|
+// return
|
|
|
+// }
|
|
|
+
|
|
|
isStopPlayingAfterLoading = true
|
|
|
- loadingLogic?.hide()
|
|
|
+// loadingLogic?.hide()
|
|
|
+// changePlayerState(.loading(1.0))
|
|
|
+ currentURLString = ""
|
|
|
self.audioPlayer?.stop()
|
|
|
- stateChangeBlock(.stop)
|
|
|
+ changePlayerState(.stop)
|
|
|
}
|
|
|
|
|
|
func pause() {
|
|
|
isStopPlayingAfterLoading = true
|
|
|
- loadingLogic?.hide()
|
|
|
+// loadingLogic?.hide()
|
|
|
+// changePlayerState(.loading(1.0))
|
|
|
self.audioPlayer?.pause()
|
|
|
- stateChangeBlock(.pause)
|
|
|
+ changePlayerState(.pause)
|
|
|
}
|
|
|
|
|
|
func setVolume(volume:Float){
|
|
|
self.audioPlayer?.setVolume(volume)
|
|
|
- stateChangeBlock(.volume(volume))
|
|
|
+ changePlayerState(.volume(volume))
|
|
|
}
|
|
|
|
|
|
+
|
|
|
func changeAudioSwitch()->Float {
|
|
|
let volume:Float = self.audioPlayer?.volume == 0.0 ? 1.0 : 0.0
|
|
|
setVolume(volume: volume)
|
|
|
return volume
|
|
|
}
|
|
|
+
|
|
|
+ func changePlayerState(_ state:PlayerState){
|
|
|
+ debugPrint("changePlayerState\(state)")
|
|
|
+ currentPlayerState = state
|
|
|
+ stateChangeBlock(state)
|
|
|
+ }
|
|
|
|
|
|
deinit {
|
|
|
dePrint("TSBusinessAudioPlayer deinit")
|