Skip to content

Commit 33fc88e

Browse files
Merge pull request #119 from dprevost-LMI/allow-to-stop-all-extractors
feat: ability to stop all extractors
2 parents 8476e83 + efc65a3 commit 33fc88e

File tree

17 files changed

+199
-104
lines changed

17 files changed

+199
-104
lines changed

README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,33 @@ resumePlayer(): Promise<boolean>
191191

192192
It returns a boolean indicating whether playback is resumed again.
193193

194+
#### stopAllPlayers()
195+
196+
```ts
197+
stopAllPlayers(): Promise<boolean>
198+
```
199+
200+
Stops all the players at once and frees their native resources. Useful on unmount!
201+
It returns a boolean indicating that all players were stopped.
202+
203+
#### stopAllWaveFormExtractors()
204+
205+
```ts
206+
stopAllWaveFormExtractors(): Promise<boolean>
207+
```
208+
209+
Stops all the extractors used to build the audio waveform and frees its native resource. Useful on unmount!
210+
It returns a boolean indicating that all extractors were stopped.
211+
212+
#### stopPlayersAndExtractors()
213+
214+
```ts
215+
stopPlayersAndExtractors(): Promise<[boolean, boolean]>
216+
```
217+
218+
Combined the `stopAllWaveFormExtractors` and `stopAllPlayers` in one call to free up the maximum possible resources. Very useful on unmount!
219+
It returns an array of two booleans indicating if all players and all waveform extractors were stopped.
220+
194221
#### For Live mode
195222

196223
#### startRecord()

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

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.facebook.react.modules.core.DeviceEventManagerModule
1717
import java.io.File
1818
import java.io.IOException
1919
import java.text.SimpleDateFormat
20+
import java.util.Collections
2021
import java.util.Date
2122
import java.util.Locale
2223

@@ -234,11 +235,28 @@ class AudioWaveformModule(context: ReactApplicationContext): ReactContextBaseJav
234235

235236
@ReactMethod
236237
fun stopAllPlayers(promise: Promise) {
237-
for ((key, _) in audioPlayers) {
238-
audioPlayers[key]?.stop()
239-
audioPlayers[key] = null
238+
try {
239+
audioPlayers.values.forEach{
240+
player -> player?.stop()
241+
}
242+
audioPlayers.clear()
243+
promise.resolve(true)
244+
} catch (err: Exception) {
245+
promise.reject("stopAllPlayers Error", "Error while stopping all players")
246+
}
247+
}
248+
249+
@ReactMethod
250+
fun stopAllWaveFormExtractors(promise: Promise) {
251+
try {
252+
extractors.values.forEach{
253+
extractor -> extractor?.forceStop()
254+
}
255+
extractors.clear()
256+
promise.resolve(true)
257+
} catch (err: Exception) {
258+
promise.reject("stopAllExtractors Error", "Error while stopping all extractors")
240259
}
241-
promise.resolve(true)
242260
}
243261

244262
@ReactMethod
@@ -305,6 +323,9 @@ class AudioWaveformModule(context: ReactApplicationContext): ReactContextBaseJav
305323
override fun onResolve(value: MutableList<MutableList<Float>>) {
306324
promise.resolve(Arguments.fromList(value))
307325
}
326+
override fun onForceStop() {
327+
promise.resolve(Arguments.fromList(mutableListOf(emptyList<Float>())))
328+
}
308329
}
309330
)
310331
extractors[playerKey]?.startDecode();

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule
1212
import com.facebook.react.bridge.WritableMap
1313
import com.facebook.react.modules.core.DeviceEventManagerModule
1414
import java.nio.ByteBuffer
15-
import java.util.concurrent.CountDownLatch
1615
import kotlin.math.pow
1716
import kotlin.math.sqrt
1817
import java.io.File
@@ -32,7 +31,6 @@ class WaveformExtractor(
3231

3332
@Volatile
3433
private var inProgress = false
35-
private val finishCount = CountDownLatch(1)
3634
private var inputEof = false
3735
private var sampleRate = 0
3836
private var channels = 1
@@ -122,7 +120,6 @@ class WaveformExtractor(
122120
Constants.LOG_TAG + " " + e.message,
123121
"An error is thrown while decoding the audio file"
124122
)
125-
finishCount.countDown()
126123
}
127124

128125
override fun onOutputBufferAvailable(
@@ -256,13 +253,18 @@ class WaveformExtractor(
256253
}
257254
}
258255

256+
fun forceStop() {
257+
stop()
258+
// When stopped by outside we must notify to resolved the hanging promises
259+
extractorCallBack.onForceStop()
260+
}
261+
259262
private fun stop() {
260263
if (!inProgress) return
261264
inProgress = false
262265
decoder?.stop()
263266
decoder?.release()
264267
extractor?.release()
265-
finishCount.countDown()
266268
}
267269
}
268270

@@ -272,4 +274,5 @@ interface ExtractorCallBack {
272274
fun onProgress(value: Float)
273275
fun onReject(error: String?, message: String?)
274276
fun onResolve(value: MutableList<MutableList<Float>>)
277+
fun onForceStop()
275278
}

example/ios/Podfile.lock

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,6 @@ PODS:
7474
- hermes-engine/Pre-built (= 0.72.7)
7575
- hermes-engine/Pre-built (0.72.7)
7676
- libevent (2.1.12)
77-
- libwebp (1.3.2):
78-
- libwebp/demux (= 1.3.2)
79-
- libwebp/mux (= 1.3.2)
80-
- libwebp/sharpyuv (= 1.3.2)
81-
- libwebp/webp (= 1.3.2)
82-
- libwebp/demux (1.3.2):
83-
- libwebp/webp
84-
- libwebp/mux (1.3.2):
85-
- libwebp/demux
86-
- libwebp/sharpyuv (1.3.2)
87-
- libwebp/webp (1.3.2):
88-
- libwebp/sharpyuv
8977
- OpenSSL-Universal (1.1.1100)
9078
- RCT-Folly (2021.07.22.00):
9179
- boost
@@ -387,7 +375,7 @@ PODS:
387375
- React-jsinspector (0.72.7)
388376
- React-logger (0.72.7):
389377
- glog
390-
- react-native-audio-waveform (1.0.0):
378+
- react-native-audio-waveform (2.1.2):
391379
- RCT-Folly (= 2021.07.22.00)
392380
- React-Core
393381
- react-native-safe-area-context (4.11.0):
@@ -504,21 +492,11 @@ PODS:
504492
- React-perflogger (= 0.72.7)
505493
- rn-fetch-blob (0.12.0):
506494
- React-Core
507-
- RNFastImage (8.6.3):
508-
- React-Core
509-
- SDWebImage (~> 5.11.1)
510-
- SDWebImageWebPCoder (~> 0.8.4)
511495
- RNFS (2.20.0):
512496
- React-Core
513497
- RNGestureHandler (2.19.0):
514498
- RCT-Folly (= 2021.07.22.00)
515499
- React-Core
516-
- SDWebImage (5.11.1):
517-
- SDWebImage/Core (= 5.11.1)
518-
- SDWebImage/Core (5.11.1)
519-
- SDWebImageWebPCoder (0.8.5):
520-
- libwebp (~> 1.0)
521-
- SDWebImage/Core (~> 5.10)
522500
- SocketRocket (0.6.1)
523501
- Yoga (1.14.0)
524502
- YogaKit (1.18.1):
@@ -590,7 +568,6 @@ DEPENDENCIES:
590568
- React-utils (from `../node_modules/react-native/ReactCommon/react/utils`)
591569
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
592570
- rn-fetch-blob (from `../node_modules/rn-fetch-blob`)
593-
- RNFastImage (from `../node_modules/react-native-fast-image`)
594571
- RNFS (from `../node_modules/react-native-fs`)
595572
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
596573
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
@@ -608,10 +585,7 @@ SPEC REPOS:
608585
- FlipperKit
609586
- fmt
610587
- libevent
611-
- libwebp
612588
- OpenSSL-Universal
613-
- SDWebImage
614-
- SDWebImageWebPCoder
615589
- SocketRocket
616590
- YogaKit
617591

@@ -699,8 +673,6 @@ EXTERNAL SOURCES:
699673
:path: "../node_modules/react-native/ReactCommon"
700674
rn-fetch-blob:
701675
:path: "../node_modules/rn-fetch-blob"
702-
RNFastImage:
703-
:path: "../node_modules/react-native-fast-image"
704676
RNFS:
705677
:path: "../node_modules/react-native-fs"
706678
RNGestureHandler:
@@ -726,7 +698,6 @@ SPEC CHECKSUMS:
726698
glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
727699
hermes-engine: 9180d43df05c1ed658a87cc733dc3044cf90c00a
728700
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
729-
libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009
730701
OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c
731702
RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1
732703
RCTRequired: 83bca1c184feb4d2e51c72c8369b83d641443f95
@@ -743,7 +714,7 @@ SPEC CHECKSUMS:
743714
React-jsiexecutor: c49502e5d02112247ee4526bc3ccfc891ae3eb9b
744715
React-jsinspector: 8baadae51f01d867c3921213a25ab78ab4fbcd91
745716
React-logger: 8edc785c47c8686c7962199a307015e2ce9a0e4f
746-
react-native-audio-waveform: 7cdb6e4963eeae907240396975b9c79713591758
717+
react-native-audio-waveform: 99f401dee91ac357ce40cba147a31a18b539d312
747718
react-native-safe-area-context: 851c62c48dce80ccaa5637b6aa5991a1bc36eca9
748719
React-NativeModulesApple: b6868ee904013a7923128892ee4a032498a1024a
749720
React-perflogger: 31ea61077185eb1428baf60c0db6e2886f141a5a
@@ -763,11 +734,8 @@ SPEC CHECKSUMS:
763734
React-utils: 56838edeaaf651220d1e53cd0b8934fb8ce68415
764735
ReactCommon: 5f704096ccf7733b390f59043b6fa9cc180ee4f6
765736
rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba
766-
RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8
767737
RNFS: 4ac0f0ea233904cb798630b3c077808c06931688
768738
RNGestureHandler: 7ad14a6c7b491add489246611d324f10009083ac
769-
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
770-
SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d
771739
SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17
772740
Yoga: 4c3aa327e4a6a23eeacd71f61c81df1bcdf677d5
773741
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a

example/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"private": true,
55
"scripts": {
66
"android": "react-native run-android",
7+
"ios:pods": "bundle exec pod install --project-directory=ios",
78
"ios": "react-native run-ios",
89
"lint": "eslint .",
910
"start": "react-native start",
@@ -12,7 +13,6 @@
1213
"dependencies": {
1314
"react": "18.2.0",
1415
"react-native": "0.72.7",
15-
"react-native-fast-image": "^8.6.3",
1616
"react-native-fs": "^2.20.0",
1717
"react-native-gesture-handler": "^2.13.4",
1818
"react-native-safe-area-context": "^4.9.0",

0 commit comments

Comments
 (0)