杨锴
2025-03-11 90dc3329d1973fda691e357cf4523d5c7c67fa1d
XQMuse/Root/PayMusicView/PayMusicVC.swift
@@ -189,8 +189,7 @@
            @objc func showDetailAction(){
                        if let id = meditationModel?.id{
            
            Services.getMeditationDetail(id: id).subscribe(onNext: {[weak self]data in
                guard let weakSelf = self else { return }
            Services.getMeditationDetail(id: id).subscribe(onNext: { data in
                if let m = data.data{
                    let isVip = m.isVip == .yes
                    if m.chargeType == .free || (isVip && m.chargeType == .vipFree) || (m.chargeType == .payment && m.isBuy == .yes){
@@ -240,7 +239,6 @@
                        if btn.isSelected{
                                    self.audioPlayer.bgmPlayer?.pause()
//                                    self.audioPlayer.masterPlayer?.pause()
                                    self.stopRunloopAni()
            PayMusicVC.updateStatus(.pause)
                        }else{
@@ -250,8 +248,6 @@
            }
                                    self.audioPlayer.bgmPlayer?.play()
//                                    self.audioPlayer.masterPlayer?.play()
//            self.audioPlayer.masterPlayer?.volume = Float(UserDefaultSettingViewModel.getSetting()?.masterVolume ?? 0.5)
                                    self.startRunloopAni()
            PayMusicVC.updateStatus(.playing)
                        }
@@ -264,9 +260,6 @@
                        CommonAlertView.show(title: "提示", content: "是否关闭当前播放音频?") {[weak self] state in
            guard let weakSelf = self else { return }
                                    if state{
                self?.audioPlayer.cleanMuse()
                                                self?.view.removeFromSuperview()
                                                self?.removeFromParent()
                if let id = self?.audioPlayer.meditationModel?.id{
                    Services.watchMuse(id: id, timeLook: self?.audioPlayer.lisenMuseTime ?? 0).subscribe(onNext: { _ in
@@ -274,22 +267,32 @@
                    }).disposed(by: weakSelf.disposeBag)
                }
                if UserDefaultSettingViewModel.getSetting()?.sceneMusicModel != nil{
                    AudioPlayer.getSharedInstance().playSceneAt(UserDefaultSettingViewModel.getSetting()!.sceneMusicModel!.audioFile)
                }
                DispatchQueue.main.asyncAfter(delay: 0.4) {
                    NotificationCenter.default.post(name: ReloadData_Noti, object: nil, userInfo: nil)
                }
                DispatchQueue.main.async {
                    self?.audioPlayer.bgmPlayer = nil
                    MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
                }
                DispatchQueue.main.asyncAfter(delay: 3.0) {
                    if UserDefaultSettingViewModel.getSetting()?.sceneMusicModel != nil{
                        AudioPlayer.getSharedInstance().playSceneAt(UserDefaultSettingViewModel.getSetting()!.sceneMusicModel!.audioFile)
                    }
                }
                self?.audioPlayer.cleanMuse()
                self?.view.removeFromSuperview()
                self?.removeFromParent()
                                    }
                        }
            }
}
class AudioPlayer {
            private(set) var bgmPlayer:AVPlayer? // 背景音
            private(set) var scenePlayer:AVPlayer? //场景音
//            private(set) var masterPlayer:AVPlayer? //大师音
    var bgmPlayer:AVPlayer? // 背景音
    var scenePlayer:AVPlayer? //场景音
            private(set) var playIndex:Int = 0 //播放的角标
            private var cacheDirectory:URL!
            private let session = URLSession.shared
@@ -395,9 +398,7 @@
        //清除之前的
        self.urls.removeAll()
//        self.masterPlayer?.pause()
        self.bgmPlayer?.pause()
//        self.masterPlayer = nil
        self.bgmPlayer = nil
                        self.delegate = delegate
@@ -412,8 +413,6 @@
            alertError(msg: "数据获取失败");return
        }
        let masterUrl = URL(string: model.tutorAudioUrl.jq_urlEncoded())
                        autoreleasepool{[unowned self] () in
                                    for url in urls {
                self.checkCacheAudio(from: url) {[unowned self] _, url in
@@ -421,11 +420,6 @@
                                                }
                                    }
                                    self.bgmPlayer = AVPlayer(url: self.urls[firstPlayIndex])
//                                    if masterUrl != nil{
//                                                self.masterPlayer = AVPlayer(url: masterUrl!)
//                self.masterPlayer?.volume = Float(UserDefaultSettingViewModel.getSetting()?.masterVolume ?? 0.5)
//            }
                        }
                        self.bgmPlayer?.addPeriodicTimeObserver(forInterval: CMTimeMake(value: 1, timescale: 1), queue: DispatchQueue.main) { [weak self](time) in
@@ -433,6 +427,17 @@
                                    weakSelf.delegate?.playState(.playing)
            guard weakSelf.bgmPlayer != nil else {return}
            weakSelf.lisenMuseTime += 1
            if weakSelf.lisenMuseTime == 60{
                if let id = self?.meditationModel?.id{
                    Services.watchMuse(id: id, timeLook: 60).subscribe(onNext: { _ in
                        weakSelf.lisenMuseTime = 0
                        NotificationCenter.default.post(name: TreeTaskUpdate_Noti, object: nil)
                        NotificationCenter.default.post(name: UpdateUserProfile_Noti, object: nil)
                    }).disposed(by:weakSelf.disposeBag)
                }
            }
                                    //当前正在播放的时间
                                    let loadTime = CMTimeGetSeconds(time)
                                    //视频总时间
@@ -474,33 +479,19 @@
            }
        }).disposed(by: disposeBag)
        self.bgmPlayer?.currentItem?.rx.observe(AVPlayerItem.Status.self,"status").subscribe(onNext: { _ in
//            print("---MasterStatus1: \(self.masterPlayer?.status.rawValue ?? 0)")
            print("---bgmStatus1: \(self.bgmPlayer?.status.rawValue ?? 0)")
            if self.bgmPlayer?.status == .readyToPlay{
                self.bgmPlayer?.play()
//                self.masterPlayer?.play()
            }
        }).disposed(by: disposeBag)
//        self.masterPlayer?.currentItem?.rx.observe(AVPlayerItem.Status.self,"status").subscribe(onNext: { _ in
//            print("---MasterStatus: \(self.masterPlayer?.status.rawValue ?? 0)")
//            print("---bgmStatus: \(self.bgmPlayer?.status.rawValue ?? 0)")
//            if self.bgmPlayer?.status == .readyToPlay && self.masterPlayer?.status == .readyToPlay{
//                self.bgmPlayer?.play()
//                self.masterPlayer?.play()
//            }
//        }).disposed(by: disposeBag)
                        setLockScreen()
                        do {
                                    try AVAudioSession.sharedInstance().setActive(true)
                                    print("Playback OK")
                                    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.allowBluetooth, .allowAirPlay])
            try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.allowBluetooth, .allowAirPlay])
                                    print("Session is Active")
                        } catch {
                                    print(error)
@@ -524,9 +515,18 @@
                        }else{
                                    scenePlayer?.replaceCurrentItem(with: AVPlayerItem(url: URL))
                        }
        do {
            try AVAudioSession.sharedInstance().setActive(false)
            try AVAudioSession.sharedInstance().setCategory(.ambient, mode: .default, options: [])
        } catch {
            print(error)
        }
        DispatchQueue.main.asyncAfter(delay: 0.5) {
                                    self.scenePlayer?.play()
                                    self.scenePlayer?.volume = Float(UserDefaultSettingViewModel.getSetting()?.volume ?? 0.5)
//            self.scenePlayer?.allowsExternalPlayback = false
//            self.scenePlayer?.usesExternalPlaybackWhileExternalScreenIsActive = false
                        }
            }
@@ -536,8 +536,16 @@
            }
            func pauseScene(){
                        scenePlayer?.pause()
        if scenePlayer?.timeControlStatus == .playing{
            scenePlayer?.pause()
        }
            }
    func pauseBGM(){
        if bgmPlayer?.timeControlStatus == .playing{
            bgmPlayer?.pause()
        }
    }
            func playScene(){
        if UserDefaultSettingViewModel.getSetting()?.sceneMusicModel != nil{
@@ -569,6 +577,7 @@
                        // 修改进度
                        center.changePlaybackPositionCommand.addTarget {[unowned self] event in
            print("1:--->\(event)")
                                    guard let event = event as? MPChangePlaybackPositionCommandEvent else {
                                                return .commandFailed
                                    }
@@ -583,6 +592,7 @@
                        // 播放
                        center.playCommand.addTarget {[weak self] event in
            print("2:--->\(event)")
                                    self?.bgmPlayer?.play()
//            self?.masterPlayer?.play()
            PayMusicVC.updateStatus(.playing)
@@ -591,24 +601,14 @@
                        // 暂停
                        center.pauseCommand.addTarget {[weak self] event in
            print("3:--->\(event)")
                                    self?.bgmPlayer?.pause()
//            self?.masterPlayer?.pause()
            PayMusicVC.updateStatus(.pause)
                                    return .success
                        }
                        // 下一首
                        center.nextTrackCommand.addTarget { event in
                                    return .success
                        }
                        center.nextTrackCommand.isEnabled = false
                        center.previousTrackCommand.isEnabled = false
                        // 上一首
                        center.previousTrackCommand.addTarget { event in
                                    return .success
                        }
            }
            func setTimer(times:Int){
@@ -622,7 +622,6 @@
                                                weakSelf.times.accept(nil)
                                                weakSelf.stopTimer()
                weakSelf.bgmPlayer?.pause()
//                weakSelf.masterPlayer?.pause()
                weakSelf.scenePlayer?.pause()
                MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
                AudioPlayer.destroy()
@@ -662,7 +661,7 @@
                        let downloadTask = session.downloadTask(with: url) { tempLocalUrl, response, error in
                                    if let tempLocalUrl = tempLocalUrl, error == nil {
                                                do {
                                                            let temp = videoCacheUrl.appendingPathExtension(url.pathExtension)
                                                            let temp = videoCacheUrl
                                                            try FileManager.default.moveItem(at: tempLocalUrl, to: temp)
                                                } catch {
                                                            print("视频缓存失败:catch")