Skip to content

Commit 7657a51

Browse files
Merge pull request #117 from dprevost-LMI/fix-getDuration-promise-leak-and-NSError-in-reject
fix: Leaking promise on getDuration + `NSError()` crash in rejected promises
2 parents e71c116 + 90c3f7b commit 7657a51

3 files changed

Lines changed: 21 additions & 21 deletions

File tree

ios/AudioPlayer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate {
8787
EventEmitter.sharedInstance.dispatch(name: withName, body: body)
8888
}
8989

90-
func startPlyer(_ finishMode: Int?, speed: Float, result: RCTPromiseResolveBlock) {
90+
func startPlayer(_ finishMode: Int?, speed: Float, result: RCTPromiseResolveBlock) {
9191
if(finishMode != nil && finishMode == 0) {
9292
self.finishMode = FinishMode.loop
9393
} else if(finishMode != nil && finishMode == 1) {

ios/AudioRecorder.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class AudioRecorder: NSObject, AVAudioRecorderDelegate{
4949

5050
if (path == nil) {
5151
guard let newPath = self.createAudioRecordPath(fileNameFormat: fileNameFormat) else {
52-
reject(Constants.audioWaveforms, "Failed to initialise file URL", NSError())
52+
reject(Constants.audioWaveforms, "Failed to initialise file URL", nil)
5353
return
5454
}
5555
audioUrl = newPath
@@ -62,7 +62,7 @@ public class AudioRecorder: NSObject, AVAudioRecorderDelegate{
6262
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playAndRecord, options: options)
6363
try AVAudioSession.sharedInstance().setActive(true)
6464
guard let newPath = audioUrl else {
65-
reject(Constants.audioWaveforms, "Failed to initialise file URL", NSError())
65+
reject(Constants.audioWaveforms, "Failed to initialise file URL", nil)
6666
return
6767
}
6868
audioRecorder = try AVAudioRecorder(url: newPath, settings: settings as [String : Any])
@@ -116,7 +116,7 @@ public class AudioRecorder: NSObject, AVAudioRecorderDelegate{
116116
resolve([asset.url.absoluteString,Int(recordedDuration.seconds * 1000).description])
117117
}
118118
} else {
119-
reject(Constants.audioWaveforms, "Failed to stop recording", NSError())
119+
reject(Constants.audioWaveforms, "Failed to stop recording", nil)
120120
}
121121
audioRecorder = nil
122122
}

ios/AudioWaveform.swift

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ class AudioWaveform: RCTEventEmitter {
105105
if(key != nil) {
106106
createOrUpdateExtractor(playerKey: key!, path: path, noOfSamples: noOfSamples, resolve: resolve, rejecter: reject)
107107
} else {
108-
reject(Constants.audioWaveforms,"Can not get waveform data",NSError())
108+
reject(Constants.audioWaveforms,"Can not get waveform data",nil)
109109
}
110110
}
111111

@@ -114,7 +114,7 @@ class AudioWaveform: RCTEventEmitter {
114114
do {
115115
let audioUrl = URL.init(string: path!)
116116
if(audioUrl == nil){
117-
reject(Constants.audioWaveforms, "Failed to initialise Url from provided audio file If path contains `file://` try removing it", NSError())
117+
reject(Constants.audioWaveforms, "Failed to initialise Url from provided audio file If path contains `file://` try removing it", nil)
118118
}
119119
let newExtractor = try WaveformExtractor(url: audioUrl!, channel: self, resolve: resolve, rejecter: reject)
120120
extractors[playerKey] = newExtractor
@@ -130,7 +130,7 @@ class AudioWaveform: RCTEventEmitter {
130130
reject(Constants.audioWaveforms, "Failed to decode audio file", e)
131131
}
132132
} else {
133-
reject(Constants.audioWaveforms, "Audio file path can't be empty or null", NSError())
133+
reject(Constants.audioWaveforms, "Audio file path can't be empty or null", nil)
134134

135135
}
136136
}
@@ -156,7 +156,7 @@ class AudioWaveform: RCTEventEmitter {
156156
resolver: resolve,
157157
rejecter: reject)
158158
} else {
159-
reject(Constants.audioWaveforms, "Can not prepare player", NSError())
159+
reject(Constants.audioWaveforms, "Can not prepare player", nil)
160160
}
161161
}
162162

@@ -165,19 +165,19 @@ class AudioWaveform: RCTEventEmitter {
165165
let finishMode = args?[Constants.finishMode] as? Int
166166
let speed = (args?[Constants.speed] as? NSNumber)?.floatValue ?? 1.0
167167

168-
if(key != nil){
169-
audioPlayers[key!]?.startPlyer(finishMode, speed: speed, result:resolve)
168+
if(key != nil && audioPlayers[key!] != nil){
169+
audioPlayers[key!]?.startPlayer(finishMode, speed: speed, result:resolve)
170170
} else {
171-
reject(Constants.audioWaveforms, "Can not start player", NSError())
171+
reject(Constants.audioWaveforms, "Can not start player", nil)
172172
}
173173
}
174174

175175
@objc func pausePlayer(_ args: NSDictionary?, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
176176
let key = args?[Constants.playerKey] as? String
177-
if(key != nil){
177+
if(key != nil && audioPlayers[key!] != nil){
178178
audioPlayers[key!]?.pausePlayer(result: resolve)
179179
} else {
180-
reject(Constants.audioWaveforms, "Can not pause player, Player key is null", NSError())
180+
reject(Constants.audioWaveforms, "Can not pause player, Player key is null", nil)
181181
}
182182
}
183183

@@ -188,32 +188,32 @@ class AudioWaveform: RCTEventEmitter {
188188
audioPlayers[key!] = nil // Release the player after stopping it
189189
resolve(true)
190190
} else {
191-
reject(Constants.audioWaveforms, "Can not stop player, Player key is null", NSError())
191+
reject(Constants.audioWaveforms, "Can not stop player, Player key is null", nil)
192192
}
193193
}
194194

195195
@objc func seekToPlayer(_ args: NSDictionary?, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
196196
let key = args?[Constants.playerKey] as? String
197-
if(key != nil){
197+
if(key != nil && audioPlayers[key!] != nil){
198198
audioPlayers[key!]?.seekTo(args?[Constants.progress] as? Double,resolve)
199199
} else {
200-
reject(Constants.audioWaveforms, "Can not seek to postion, Player key is null", NSError())
200+
reject(Constants.audioWaveforms, "Can not seek to postion, Player key is null", nil)
201201
}
202202
}
203203

204204
@objc func setVolume(_ args: NSDictionary?, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
205205
let key = args?[Constants.playerKey] as? String
206-
if(key != nil){
206+
if(key != nil && audioPlayers[key!] != nil){
207207
audioPlayers[key!]?.setVolume(args?[Constants.volume] as? Double,resolve)
208208
} else {
209-
reject(Constants.audioWaveforms, "Can not set volume, Player key is null", NSError())
209+
reject(Constants.audioWaveforms, "Can not set volume, Player key is null", nil)
210210
}
211211
}
212212

213213
@objc func getDuration(_ args: NSDictionary?, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
214214
let type = args?[Constants.durationType] as? Int
215215
let key = args?[Constants.playerKey] as? String
216-
if(key != nil){
216+
if(key != nil && audioPlayers[key!] != nil){
217217
do{
218218
if(type == 0) {
219219
try audioPlayers[key!]?.getDuration(DurationType.Current,resolve)
@@ -224,7 +224,7 @@ class AudioWaveform: RCTEventEmitter {
224224
reject(Constants.audioWaveforms, "Failed to get duration", e)
225225
}
226226
} else {
227-
reject(Constants.audioWaveforms, "Can not get duration", NSError())
227+
reject(Constants.audioWaveforms, "Can not get duration", nil)
228228
}
229229
}
230230

@@ -263,7 +263,7 @@ class AudioWaveform: RCTEventEmitter {
263263
let status = audioPlayers[key!]?.setPlaybackSpeed(speed)
264264
resolve(status)
265265
} else {
266-
reject(Constants.audioWaveforms, "Can not pause player, Player key is null", NSError())
266+
reject(Constants.audioWaveforms, "Can not pause player, Player key is null", nil)
267267
}
268268
}
269269
}

0 commit comments

Comments
 (0)