Skip to content

Commit c836c68

Browse files
Merge pull request #110 from SimformSolutionsPvtLtd/fix/UNT-T29402_promise_leaking_and_bug_fixes
fix(UNT-T29402): promise leaking and bug fixes
2 parents 6464e2d + 91f9865 commit c836c68

File tree

5 files changed

+49
-46
lines changed

5 files changed

+49
-46
lines changed

android/src/main/java/com/audiowaveform/AudioPlayer.kt

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,14 @@ class AudioPlayer(
145145
}
146146
}
147147

148-
fun stop(promise: Promise) {
148+
fun stop() {
149149
stopListening()
150150
if (playerListener != null) {
151151
player.removeListener(playerListener!!)
152152
}
153153
isPlayerPrepared = false
154154
player.stop()
155155
player.release()
156-
promise.resolve(true)
157156
}
158157

159158
fun pause(promise: Promise) {
@@ -180,16 +179,8 @@ class AudioPlayer(
180179
}
181180
}
182181

183-
fun setPlaybackSpeed(speed: Float?, promise: Promise) {
184-
try {
185-
// Call the custom function to validate and set the playback speed
186-
val success = validateAndSetPlaybackSpeed(player, speed)
187-
promise.resolve(success) // Resolve the promise with success
188-
189-
} catch (e: Exception) {
190-
// Handle any exceptions and reject the promise
191-
promise.reject("setPlaybackSpeed Error", e.toString())
192-
}
182+
fun setPlaybackSpeed(speed: Float?): Boolean {
183+
return validateAndSetPlaybackSpeed(player, speed)
193184
}
194185

195186
private fun startListening(promise: Promise) {

android/src/main/java/com/audiowaveform/AudioWaveformModule.kt

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,9 @@ class AudioWaveformModule(context: ReactApplicationContext): ReactContextBaseJav
172172
fun stopPlayer(obj: ReadableMap, promise: Promise) {
173173
val key = obj.getString(Constants.playerKey)
174174
if (key != null) {
175-
audioPlayers[key]?.stop(promise)
175+
audioPlayers[key]?.stop()
176176
audioPlayers[key] = null // Release the player after stopping it
177+
promise.resolve(true)
177178
} else {
178179
promise.reject("stopPlayer Error", "Player key can't be null")
179180
}
@@ -191,19 +192,24 @@ class AudioWaveformModule(context: ReactApplicationContext): ReactContextBaseJav
191192

192193
@ReactMethod
193194
fun seekToPlayer(obj: ReadableMap, promise: Promise) {
194-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
195-
val progress = obj.getInt(Constants.progress)
196-
val key = obj.getString(Constants.playerKey)
197-
if (key != null) {
198-
audioPlayers[key]?.seekToPosition(progress.toLong(), promise)
195+
try {
196+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
197+
val progress = obj.getInt(Constants.progress)
198+
val key = obj.getString(Constants.playerKey)
199+
if (key != null) {
200+
audioPlayers[key]?.seekToPosition(progress.toLong(), promise)
201+
} else {
202+
promise.reject("seekTo Error", "Player key can't be null")
203+
}
199204
} else {
200-
promise.reject("seekTo Error", "Player key can't be null")
205+
Log.e(
206+
Constants.LOG_TAG,
207+
"Minimum android O is required for seekTo function to works"
208+
)
209+
promise.resolve(false)
201210
}
202-
} else {
203-
Log.e(
204-
Constants.LOG_TAG,
205-
"Minimum android O is required for seekTo function to works"
206-
)
211+
} catch(e: Exception) {
212+
promise.reject("seekTo Error", e.toString())
207213
}
208214
}
209215

@@ -245,25 +251,31 @@ class AudioWaveformModule(context: ReactApplicationContext): ReactContextBaseJav
245251
@ReactMethod
246252
fun stopAllPlayers(promise: Promise) {
247253
for ((key, _) in audioPlayers) {
248-
audioPlayers[key]?.stop(promise)
254+
audioPlayers[key]?.stop()
249255
audioPlayers[key] = null
250256
}
257+
promise.resolve(true)
251258
}
252259

253260
@ReactMethod
254261
fun setPlaybackSpeed(obj: ReadableMap, promise: Promise) {
255-
// If the key doesn't exist or if the value is null or undefined, set default speed to 1.0
256-
val speed = if (!obj.hasKey(Constants.speed) || obj.isNull(Constants.speed)) {
257-
1.0f // Set default speed to 1.0 if null, undefined, or missing
258-
} else {
259-
obj.getDouble(Constants.speed).toFloat()
260-
}
262+
try {
263+
// If the key doesn't exist or if the value is null or undefined, set default speed to 1.0
264+
val speed = if (!obj.hasKey(Constants.speed) || obj.isNull(Constants.speed)) {
265+
1.0f // Set default speed to 1.0 if null, undefined, or missing
266+
} else {
267+
obj.getDouble(Constants.speed).toFloat()
268+
}
261269

262-
val key = obj.getString(Constants.playerKey)
263-
if (key != null) {
264-
audioPlayers[key]?.setPlaybackSpeed(speed, promise)
265-
} else {
266-
promise.reject("setPlaybackSpeed Error", "Player key can't be null")
270+
val key = obj.getString(Constants.playerKey)
271+
if (key != null) {
272+
val status = audioPlayers[key]?.setPlaybackSpeed(speed)
273+
promise.resolve(status ?: false)
274+
} else {
275+
promise.reject("setPlaybackSpeed Error", "Player key can't be null")
276+
}
277+
} catch(e: Exception) {
278+
promise.reject("setPlaybackSpeed Error", e.toString())
267279
}
268280
}
269281

ios/AudioPlayer.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,11 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate {
108108
result(true)
109109
}
110110

111-
func stopPlayer(result: @escaping RCTPromiseResolveBlock) {
111+
func stopPlayer() {
112112
stopListening()
113113
player?.stop()
114114
player = nil
115115
timer = nil
116-
result(true)
117116
}
118117

119118
func getDuration(_ type: DurationType, _ result: @escaping RCTPromiseResolveBlock) {
@@ -153,13 +152,13 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate {
153152
}
154153
}
155154

156-
func setPlaybackSpeed(_ speed: Float, _ result: @escaping RCTPromiseResolveBlock) {
155+
func setPlaybackSpeed(_ speed: Float) -> Bool {
157156
if let player = player {
158157
player.enableRate = true
159158
player.rate = Float(speed)
160-
result(true)
159+
return true
161160
} else {
162-
result(false)
161+
return false
163162
}
164163
}
165164

ios/AudioWaveform.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,9 @@ class AudioWaveform: RCTEventEmitter {
184184
@objc func stopPlayer(_ args: NSDictionary?, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
185185
let key = args?[Constants.playerKey] as? String
186186
if(key != nil){
187-
audioPlayers[key!]?.stopPlayer(result: resolve)
187+
audioPlayers[key!]?.stopPlayer()
188188
audioPlayers[key!] = nil // Release the player after stopping it
189+
resolve(true)
189190
} else {
190191
reject(Constants.audioWaveforms, "Can not stop player, Player key is null", NSError())
191192
}
@@ -229,7 +230,7 @@ class AudioWaveform: RCTEventEmitter {
229230

230231
@objc func stopAllPlayers(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
231232
for (playerKey,_) in audioPlayers{
232-
audioPlayers[playerKey]?.stopPlayer(result: resolve)
233+
audioPlayers[playerKey]?.stopPlayer()
233234
audioPlayers[playerKey] = nil
234235
}
235236
resolve(true)
@@ -259,7 +260,8 @@ class AudioWaveform: RCTEventEmitter {
259260
let speed = (args?[Constants.speed] as? NSNumber)?.floatValue ?? 1.0
260261

261262
if(key != nil){
262-
audioPlayers[key!]?.setPlaybackSpeed(speed, resolve)
263+
let status = audioPlayers[key!]?.setPlaybackSpeed(speed)
264+
resolve(status)
263265
} else {
264266
reject(Constants.audioWaveforms, "Can not pause player, Player key is null", NSError())
265267
}

src/components/Waveform/Waveform.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export const Waveform = forwardRef<IWaveformRef, IWaveform>((props, ref) => {
5555
onPlayerStateChange,
5656
onRecorderStateChange,
5757
onPanStateChange = () => {},
58-
onError,
58+
onError = () => {},
5959
onCurrentProgressChange = () => {},
6060
candleHeightScale = 3,
6161
onChangeWaveformLoadState,
@@ -448,7 +448,6 @@ export const Waveform = forwardRef<IWaveformRef, IWaveform>((props, ref) => {
448448
if (data.finishType === FinishMode.stop) {
449449
setPlayerState(PlayerState.stopped);
450450
setCurrentProgress(0);
451-
await preparePlayerForPath();
452451
}
453452
}
454453
});

0 commit comments

Comments
 (0)