From 4f1629ac4559a080113190a2a61c5d94d3c7590f Mon Sep 17 00:00:00 2001 From: kuldip-simform Date: Fri, 14 Feb 2025 12:22:10 +0530 Subject: [PATCH] feat(UNT-T32558): current duration update on start, pause, stop player method --- .../java/com/audiowaveform/AudioPlayer.kt | 22 +++++++++++++------ ios/AudioPlayer.swift | 7 ++++-- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/com/audiowaveform/AudioPlayer.kt b/android/src/main/java/com/audiowaveform/AudioPlayer.kt index 0972aa9..9754d2c 100644 --- a/android/src/main/java/com/audiowaveform/AudioPlayer.kt +++ b/android/src/main/java/com/audiowaveform/AudioPlayer.kt @@ -223,6 +223,7 @@ class AudioPlayer( if (requestAudioFocus()) { player.playWhenReady = true player.play() + emitCurrentDuration() promise.resolve(true) startListening(promise)} else { @@ -235,6 +236,7 @@ class AudioPlayer( fun stop() { stopListening() + emitCurrentDuration() if (playerListener != null) { player.removeListener(playerListener!!) } @@ -248,6 +250,7 @@ class AudioPlayer( try { stopListening() player.pause() + emitCurrentDuration() abandonAudioFocus() promise?.resolve(true) } catch (e: Exception) { @@ -273,17 +276,22 @@ class AudioPlayer( return validateAndSetPlaybackSpeed(player, speed) } + + fun emitCurrentDuration() { + val currentPosition = player.currentPosition.toString() + val args: WritableMap = Arguments.createMap() + args.putString(Constants.currentDuration, currentPosition) + args.putString(Constants.playerKey, key) + if (isComponentMounted) { + appContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)?.emit("onCurrentDuration", args) + } + } + private fun startListening(promise: Promise) { try { audioPlaybackListener = object : CountDownTimer(player.duration, UpdateFrequency.Low.value) { override fun onTick(millisUntilFinished: Long) { - val currentPosition = player.currentPosition.toString() - val args: WritableMap = Arguments.createMap() - args.putString(Constants.currentDuration, currentPosition) - args.putString(Constants.playerKey, key) - if (isComponentMounted) { - appContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)?.emit("onCurrentDuration", args) - } + emitCurrentDuration() } override fun onFinish() {} }.start() diff --git a/ios/AudioPlayer.swift b/ios/AudioPlayer.swift index 6378225..059f127 100644 --- a/ios/AudioPlayer.swift +++ b/ios/AudioPlayer.swift @@ -98,6 +98,7 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate { player?.play() player?.delegate = self player?.rate = Float(speed) + timerUpdate() startListening() result(player?.isPlaying) } @@ -105,12 +106,14 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate { func pausePlayer(result: @escaping RCTPromiseResolveBlock) { stopListening() player?.pause() + timerUpdate() result(true) } func stopPlayer() { stopListening() player?.stop() + timerUpdate() player = nil timer = nil } @@ -139,7 +142,7 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate { } } - @objc func timerUpdate(_ sender:Timer) { + @objc func timerUpdate() { let ms = (self.player?.currentTime ?? 0) * 1000 self.sendEvent(withName: Constants.onCurrentDuration, body: [ Constants.currentDuration: Int(ms), Constants.playerKey: self.playerKey] as [String : Any]) } @@ -148,7 +151,7 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate { stopListening() DispatchQueue.main.async { [weak self] in guard let strongSelf = self else {return } - strongSelf.timer = Timer.scheduledTimer(timeInterval: TimeInterval((Float(strongSelf.updateFrequency.rawValue) / 1000)), target: strongSelf, selector: #selector(strongSelf.timerUpdate(_:)), userInfo: nil, repeats: true) + strongSelf.timer = Timer.scheduledTimer(timeInterval: TimeInterval((Float(strongSelf.updateFrequency.rawValue) / 1000)), target: strongSelf, selector: #selector(strongSelf.timerUpdate), userInfo: nil, repeats: true) } }