@siteed/expo-audio-stream 1.1.16 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursorrules +112 -0
- package/CHANGELOG.md +13 -17
- package/README.md +5 -0
- package/android/build/.transforms/78826170c90a6133e31ab67915bce724/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/7c8f45a7979f7f92ba944aa5701c97dc/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioFormatInfo.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioFormatUtils.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioNotificationManager$Companion.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioNotificationManager.dex +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor$AudioData.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor$Companion.dex +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor$extractMFCC$powerSpectrum$2.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecorderManager$Companion.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecorderManager.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecordingService$Companion.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecordingService$notificationManager$2.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecordingService.dex +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$1.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$1.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$10.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$10.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$11.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$11.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$12.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$12.dex} +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$13.dex +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$17.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$14.dex} +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$15.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$16.dex +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$14.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$17.dex} +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$18.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$19.dex +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$5.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$2.dex} +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$20.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$21.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$22.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$23.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$24.dex +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$3.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$3.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$4.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$4.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$2.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$5.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$6.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$6.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$7.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$7.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$8.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$8.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$9.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$9.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$1.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$1.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$2.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$2.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$3.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$3.dex} +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$4.dex +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$FunctionWithoutArgs$1.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$FunctionWithoutArgs$1.dex} +0 -0
- package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$FunctionWithoutArgs$2.dex → dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$FunctionWithoutArgs$2.dex} +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/NotificationAction.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/NotificationConfig$Companion.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/NotificationConfig.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/PermissionUtils.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingActionReceiver$Companion.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingActionReceiver$handleRecordingAction$notificationPromise$1.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingActionReceiver.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingConfig$Companion.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingConfig.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingConfigKt.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformConfig.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformRenderer$RenderConfig$Companion.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformRenderer$RenderConfig.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformRenderer$Style.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformRenderer$WhenMappings.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformRenderer.dex +0 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +23 -2
- package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
- package/android/build/intermediates/compile_symbol_list/debug/R.txt +11 -0
- package/android/build/intermediates/compiled_local_resources/debug/out/drawable_ic_default_action_icon.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/out/drawable_ic_microphone.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/out/drawable_ic_pause.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/out/drawable_ic_play.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/out/drawable_ic_stop.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/out/layout_notification_recording.xml.flat +0 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +8 -1
- package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +1 -1
- package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
- package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
- package/android/build/intermediates/java_res/debug/out/META-INF/siteed-expo-audio-stream_debug.kotlin_module +0 -0
- package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +11 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +51 -8
- package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +23 -2
- package/android/build/intermediates/packaged_res/debug/drawable/ic_default_action_icon.xml +16 -0
- package/android/build/intermediates/packaged_res/debug/drawable/ic_microphone.xml +13 -0
- package/android/build/intermediates/packaged_res/debug/drawable/ic_pause.xml +10 -0
- package/android/build/intermediates/packaged_res/debug/drawable/ic_play.xml +10 -0
- package/android/build/intermediates/packaged_res/debug/drawable/ic_stop.xml +10 -0
- package/android/build/intermediates/packaged_res/debug/layout/notification_recording.xml +37 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/META-INF/siteed-expo-audio-stream_debug.kotlin_module +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioFormatInfo.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioFormatUtils.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioNotificationManager$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioNotificationManager.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioProcessor$AudioData.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioProcessor$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioProcessor$extractMFCC$powerSpectrum$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioProcessor.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioRecorderManager$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioRecorderManager.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioRecordingService$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioRecordingService$notificationManager$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioRecordingService.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$1.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$1.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$10.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$10.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$14.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$11.class} +0 -0
- package/android/build/{tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$12.class → intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$12.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$13.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$17.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$14.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$15.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$16.class +0 -0
- package/android/build/{tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$11.class → intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$17.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$18.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$19.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$5.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$2.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$11.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$20.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$21.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$22.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$23.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$24.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$3.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$3.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$4.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$4.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$8.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$5.class} +0 -0
- package/android/build/{tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$6.class → intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$6.class} +0 -0
- package/android/build/{tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$7.class → intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$7.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$2.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$8.class} +0 -0
- package/android/build/{tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$9.class → intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$9.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$1.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$1.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$2.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$2.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$3.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$3.class} +0 -0
- package/android/build/{tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$4.class → intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$4.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$FunctionWithoutArgs$1.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$FunctionWithoutArgs$1.class} +0 -0
- package/android/build/{tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$FunctionWithoutArgs$2.class → intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$FunctionWithoutArgs$2.class} +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/NotificationAction.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/NotificationConfig$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/NotificationConfig.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/PermissionUtils.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingActionReceiver$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingActionReceiver$handleRecordingAction$notificationPromise$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingActionReceiver.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingConfig$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingConfig.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingConfigKt.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformConfig.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformRenderer$RenderConfig$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformRenderer$RenderConfig.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformRenderer$Style.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformRenderer$WhenMappings.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformRenderer.class +0 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +11 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
- package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
- package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +51 -7
- package/android/build/tmp/kotlin-classes/debug/META-INF/siteed-expo-audio-stream_debug.kotlin_module +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioFormatInfo.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioFormatUtils.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioNotificationManager$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioNotificationManager.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioProcessor$AudioData.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioProcessor$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioProcessor$extractMFCC$powerSpectrum$2.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioProcessor.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioRecorderManager$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioRecorderManager.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioRecordingService$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioRecordingService$notificationManager$2.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioRecordingService.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$1.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$1.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$10.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$10.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$11.class +0 -0
- package/android/build/{intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$12.class → tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$12.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$13.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$14.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$15.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$16.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$17.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$18.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$19.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$2.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$2.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$20.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$21.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$22.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$23.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$24.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$3.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$3.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$4.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$4.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$5.class +0 -0
- package/android/build/{intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$6.class → tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$6.class} +0 -0
- package/android/build/{intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$7.class → tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$7.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$8.class +0 -0
- package/android/build/{intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$9.class → tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$9.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$1.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$1.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$2.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$2.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$3.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$3.class} +0 -0
- package/android/build/{intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$4.class → tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$4.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$FunctionWithoutArgs$1.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$FunctionWithoutArgs$1.class} +0 -0
- package/android/build/{intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$FunctionWithoutArgs$2.class → tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$FunctionWithoutArgs$2.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/NotificationAction.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/NotificationConfig$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/NotificationConfig.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/PermissionUtils.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingActionReceiver$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingActionReceiver$handleRecordingAction$notificationPromise$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingActionReceiver.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingConfig$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingConfig.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingConfigKt.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformConfig.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformRenderer$RenderConfig$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformRenderer$RenderConfig.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformRenderer$Style.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformRenderer$WhenMappings.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformRenderer.class +0 -0
- package/android/src/main/AndroidManifest.xml +24 -2
- package/android/src/main/java/net/siteed/audiostream/AudioFormatUtils.kt +76 -1
- package/android/src/main/java/net/siteed/audiostream/AudioNotificationsManager.kt +362 -0
- package/android/src/main/java/net/siteed/audiostream/AudioProcessor.kt +8 -4
- package/android/src/main/java/net/siteed/audiostream/AudioRecorderManager.kt +477 -277
- package/android/src/main/java/net/siteed/audiostream/AudioRecordingService.kt +71 -0
- package/android/src/main/java/net/siteed/audiostream/ExpoAudioStreamModule.kt +78 -7
- package/android/src/main/java/net/siteed/audiostream/NotificationConfig.kt +70 -0
- package/android/src/main/java/net/siteed/audiostream/PermissionUtils.kt +41 -6
- package/android/src/main/java/net/siteed/audiostream/RecordingActionReceiver.kt +59 -0
- package/android/src/main/java/net/siteed/audiostream/RecordingConfig.kt +138 -1
- package/android/src/main/java/net/siteed/audiostream/WaveformConfig.kt +19 -0
- package/android/src/main/java/net/siteed/audiostream/WaveformRenderer.kt +159 -0
- package/android/src/main/res/drawable/ic_default_action_icon.xml +16 -0
- package/android/src/main/res/drawable/ic_microphone.xml +13 -0
- package/android/src/main/res/drawable/ic_pause.xml +10 -0
- package/android/src/main/res/drawable/ic_play.xml +10 -0
- package/android/src/main/res/drawable/ic_stop.xml +10 -0
- package/android/src/main/res/layout/notification_recording.xml +37 -0
- package/build/ExpoAudioStream.types.d.ts +36 -0
- package/build/ExpoAudioStream.types.d.ts.map +1 -1
- package/build/ExpoAudioStream.types.js.map +1 -1
- package/build/useAudioRecorder.d.ts.map +1 -1
- package/build/useAudioRecorder.js +32 -11
- package/build/useAudioRecorder.js.map +1 -1
- package/ios/AudioNotificationManager.swift +135 -0
- package/ios/AudioStreamManager.swift +387 -13
- package/ios/AudioStreamManagerDelegate.swift +4 -0
- package/ios/ExpoAudioStreamModule.swift +66 -38
- package/ios/NotificationExtension.swift +15 -0
- package/ios/RecordingSettings.swift +83 -5
- package/package.json +1 -1
- package/plugin/build/index.d.ts +1 -3
- package/plugin/build/index.js +103 -10
- package/plugin/src/index.ts +124 -21
- package/publish.sh +36 -3
- package/src/ExpoAudioStream.types.ts +108 -13
- package/src/useAudioRecorder.tsx +46 -12
- package/android/build/.transforms/871e87a512fbb418f6a6523c40225bac/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioFormatUtils.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor$Companion.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecorderManager.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$13.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$15.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$16.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$18.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$4.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/PermissionUtils.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/RecordingConfig.dex +0 -0
- package/android/build/.transforms/a758925c83c348fb1544431cf45e6a05/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$13.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$15.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$16.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$18.class +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.s +0 -1
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$13.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$14.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$15.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$16.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$17.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$18.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$5.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$8.class +0 -0
- /package/android/build/.transforms/{871e87a512fbb418f6a6523c40225bac → 78826170c90a6133e31ab67915bce724}/results.bin +0 -0
- /package/android/build/.transforms/{a758925c83c348fb1544431cf45e6a05 → 7c8f45a7979f7f92ba944aa5701c97dc}/results.bin +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/results.bin +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioAnalysisData$AmplitudeRange.dex +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioAnalysisData$SpeakerChange.dex +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioAnalysisData.dex +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioDataEncoder.dex +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioFileHandler.dex +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/BuildConfig.dex +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/Constants.dex +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/DataPoint.dex +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/EventSender.dex +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/FFT.dex +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/Features.dex +0 -0
- /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/desugar_graph.bin +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// net/siteed/audiostream/AudioRecorderManager.kt
|
|
2
2
|
package net.siteed.audiostream
|
|
3
3
|
|
|
4
|
+
import android.annotation.SuppressLint
|
|
4
5
|
import android.media.AudioFormat
|
|
5
6
|
import android.media.AudioRecord
|
|
6
7
|
import android.media.MediaRecorder
|
|
@@ -17,11 +18,14 @@ import java.io.ByteArrayOutputStream
|
|
|
17
18
|
import java.io.File
|
|
18
19
|
import java.io.FileOutputStream
|
|
19
20
|
import java.io.IOException
|
|
20
|
-
import java.io.Serializable
|
|
21
21
|
import java.util.concurrent.atomic.AtomicBoolean
|
|
22
|
-
|
|
22
|
+
import android.os.PowerManager
|
|
23
|
+
import android.content.Context
|
|
24
|
+
import java.nio.ByteBuffer
|
|
25
|
+
import java.nio.ByteOrder
|
|
23
26
|
|
|
24
27
|
class AudioRecorderManager(
|
|
28
|
+
private val context: Context,
|
|
25
29
|
private val filesDir: File,
|
|
26
30
|
private val permissionUtils: PermissionUtils,
|
|
27
31
|
private val audioDataEncoder: AudioDataEncoder,
|
|
@@ -37,7 +41,6 @@ class AudioRecorderManager(
|
|
|
37
41
|
private var recordingStartTime: Long = 0
|
|
38
42
|
private var totalRecordedTime: Long = 0
|
|
39
43
|
private var totalDataSize = 0
|
|
40
|
-
private var interval = 1000L // Emit data every 1000 milliseconds (1 second)
|
|
41
44
|
private var lastEmitTime = SystemClock.elapsedRealtime()
|
|
42
45
|
private var lastPauseTime = 0L
|
|
43
46
|
private var pausedDuration = 0L
|
|
@@ -52,209 +55,86 @@ class AudioRecorderManager(
|
|
|
52
55
|
private var audioProcessor: AudioProcessor = AudioProcessor(filesDir)
|
|
53
56
|
private var isFirstChunk = true
|
|
54
57
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
?:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
sampleRate = (options["sampleRate"] as? Number)?.toInt() ?: Constants.DEFAULT_SAMPLE_RATE,
|
|
78
|
-
channels = (options["channels"] as? Number)?.toInt() ?: 1,
|
|
79
|
-
encoding = options["encoding"] as? String ?: "pcm_16bit",
|
|
80
|
-
interval = (options["interval"] as? Number)?.toLong() ?: Constants.DEFAULT_INTERVAL,
|
|
81
|
-
enableProcessing = options["enableProcessing"] as? Boolean ?: false,
|
|
82
|
-
pointsPerSecond = (options["pointsPerSecond"] as? Number)?.toDouble() ?: 20.0,
|
|
83
|
-
algorithm = options["algorithm"] as? String ?: "rms",
|
|
84
|
-
features = features
|
|
85
|
-
)
|
|
86
|
-
Log.d(Constants.TAG, "Initial recording configuration: $tempRecordingConfig")
|
|
87
|
-
|
|
88
|
-
// Validate sample rate and channels
|
|
89
|
-
if (tempRecordingConfig.sampleRate !in listOf(16000, 44100, 48000)) {
|
|
90
|
-
promise.reject(
|
|
91
|
-
"INVALID_SAMPLE_RATE",
|
|
92
|
-
"Sample rate must be one of 16000, 44100, or 48000 Hz",
|
|
93
|
-
null
|
|
94
|
-
)
|
|
95
|
-
return
|
|
96
|
-
}
|
|
97
|
-
if (tempRecordingConfig.channels !in 1..2) {
|
|
98
|
-
promise.reject(
|
|
99
|
-
"INVALID_CHANNELS",
|
|
100
|
-
"Channels must be either 1 (Mono) or 2 (Stereo)",
|
|
101
|
-
null
|
|
102
|
-
)
|
|
103
|
-
return
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Set encoding and file extension
|
|
107
|
-
var fileExtension = ".wav"
|
|
108
|
-
audioFormat = when (tempRecordingConfig.encoding) {
|
|
109
|
-
"pcm_8bit" -> {
|
|
110
|
-
fileExtension = "wav"
|
|
111
|
-
mimeType = "audio/wav"
|
|
112
|
-
AudioFormat.ENCODING_PCM_8BIT
|
|
113
|
-
}
|
|
114
|
-
"pcm_16bit" -> {
|
|
115
|
-
fileExtension = "wav"
|
|
116
|
-
mimeType = "audio/wav"
|
|
117
|
-
AudioFormat.ENCODING_PCM_16BIT
|
|
118
|
-
}
|
|
119
|
-
"pcm_32bit" -> {
|
|
120
|
-
fileExtension = "wav"
|
|
121
|
-
mimeType = "audio/wav"
|
|
122
|
-
AudioFormat.ENCODING_PCM_FLOAT
|
|
123
|
-
}
|
|
124
|
-
"opus" -> {
|
|
125
|
-
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
|
|
126
|
-
promise.reject(
|
|
127
|
-
"UNSUPPORTED_FORMAT",
|
|
128
|
-
"Opus encoding not supported on this Android version.",
|
|
129
|
-
null
|
|
130
|
-
)
|
|
131
|
-
return
|
|
132
|
-
}
|
|
133
|
-
fileExtension = "opus"
|
|
134
|
-
mimeType = "audio/opus"
|
|
135
|
-
AudioFormat.ENCODING_OPUS
|
|
136
|
-
}
|
|
137
|
-
"aac_lc" -> {
|
|
138
|
-
fileExtension = "aac"
|
|
139
|
-
mimeType = "audio/aac"
|
|
140
|
-
AudioFormat.ENCODING_AAC_LC
|
|
141
|
-
}
|
|
142
|
-
else -> {
|
|
143
|
-
fileExtension = "wav"
|
|
144
|
-
mimeType = "audio/wav"
|
|
145
|
-
AudioFormat.ENCODING_DEFAULT
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Check if selected audio format is supported
|
|
150
|
-
if (!isAudioFormatSupported(tempRecordingConfig.sampleRate, tempRecordingConfig.channels, audioFormat)) {
|
|
151
|
-
Log.e(Constants.TAG, "Selected audio format not supported, falling back to 16-bit PCM")
|
|
152
|
-
audioFormat = AudioFormat.ENCODING_PCM_16BIT
|
|
153
|
-
if (!isAudioFormatSupported(tempRecordingConfig.sampleRate, tempRecordingConfig.channels, audioFormat)) {
|
|
154
|
-
promise.reject("INITIALIZATION_FAILED", "Failed to initialize audio recorder with any supported format", null)
|
|
155
|
-
return
|
|
58
|
+
private var wakeLock: PowerManager.WakeLock? = null
|
|
59
|
+
private var wasWakeLockEnabled = false
|
|
60
|
+
private val notificationManager = AudioNotificationManager.getInstance(context)
|
|
61
|
+
|
|
62
|
+
companion object {
|
|
63
|
+
@SuppressLint("StaticFieldLeak")
|
|
64
|
+
@Volatile
|
|
65
|
+
private var instance: AudioRecorderManager? = null
|
|
66
|
+
|
|
67
|
+
fun getInstance(): AudioRecorderManager? = instance
|
|
68
|
+
|
|
69
|
+
fun initialize(
|
|
70
|
+
context: Context,
|
|
71
|
+
filesDir: File,
|
|
72
|
+
permissionUtils: PermissionUtils,
|
|
73
|
+
audioDataEncoder: AudioDataEncoder,
|
|
74
|
+
eventSender: EventSender
|
|
75
|
+
): AudioRecorderManager {
|
|
76
|
+
return instance ?: synchronized(this) {
|
|
77
|
+
instance ?: AudioRecorderManager(
|
|
78
|
+
context, filesDir, permissionUtils, audioDataEncoder, eventSender
|
|
79
|
+
).also { instance = it }
|
|
156
80
|
}
|
|
157
|
-
tempRecordingConfig = tempRecordingConfig.copy(encoding = "pcm_16bit")
|
|
158
81
|
}
|
|
82
|
+
}
|
|
159
83
|
|
|
160
|
-
|
|
161
|
-
|
|
84
|
+
@RequiresApi(Build.VERSION_CODES.R)
|
|
85
|
+
fun startRecording(options: Map<String, Any?>, promise: Promise) {
|
|
86
|
+
try {
|
|
87
|
+
Log.d(Constants.TAG, "Starting recording with options: $options")
|
|
162
88
|
|
|
89
|
+
// Check permissions
|
|
90
|
+
if (!checkPermissions(options, promise)) return
|
|
163
91
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
audioFormat = AudioFormat.ENCODING_PCM_16BIT
|
|
168
|
-
if (!isAudioFormatSupported(tempRecordingConfig.sampleRate, tempRecordingConfig.channels, audioFormat)) {
|
|
169
|
-
promise.reject("INITIALIZATION_FAILED", "Failed to initialize audio recorder with any supported format", null)
|
|
92
|
+
// Check if already recording
|
|
93
|
+
if (isRecording.get() && !isPaused.get()) {
|
|
94
|
+
promise.reject("ALREADY_RECORDING", "Recording is already in progress", null)
|
|
170
95
|
return
|
|
171
96
|
}
|
|
172
|
-
tempRecordingConfig = tempRecordingConfig.copy(encoding = "pcm_16bit")
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// Update recordingConfig with potentially new encoding
|
|
176
|
-
recordingConfig = tempRecordingConfig
|
|
177
|
-
|
|
178
|
-
// Recalculate bufferSizeInBytes if the format has changed
|
|
179
|
-
bufferSizeInBytes = AudioRecord.getMinBufferSize(
|
|
180
|
-
recordingConfig.sampleRate,
|
|
181
|
-
if (recordingConfig.channels == 1) AudioFormat.CHANNEL_IN_MONO else AudioFormat.CHANNEL_IN_STEREO,
|
|
182
|
-
audioFormat
|
|
183
|
-
)
|
|
184
|
-
|
|
185
|
-
if (bufferSizeInBytes == AudioRecord.ERROR || bufferSizeInBytes == AudioRecord.ERROR_BAD_VALUE || bufferSizeInBytes < 0) {
|
|
186
|
-
Log.e(Constants.TAG, "Failed to get minimum buffer size, falling back to default buffer size.")
|
|
187
|
-
bufferSizeInBytes = 4096 // Default buffer size in bytes
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
Log.d(Constants.TAG, "AudioFormat: $audioFormat, BufferSize: $bufferSizeInBytes")
|
|
191
97
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
audioRecord = AudioRecord(
|
|
197
|
-
MediaRecorder.AudioSource.MIC,
|
|
198
|
-
recordingConfig.sampleRate,
|
|
199
|
-
if (recordingConfig.channels == 1) AudioFormat.CHANNEL_IN_MONO else AudioFormat.CHANNEL_IN_STEREO,
|
|
200
|
-
audioFormat,
|
|
201
|
-
bufferSizeInBytes
|
|
202
|
-
)
|
|
203
|
-
if (audioRecord?.state != AudioRecord.STATE_INITIALIZED) {
|
|
98
|
+
// Parse recording configuration
|
|
99
|
+
val configResult = RecordingConfig.fromMap(options)
|
|
100
|
+
if (configResult.isFailure) {
|
|
204
101
|
promise.reject(
|
|
205
|
-
"
|
|
206
|
-
|
|
207
|
-
|
|
102
|
+
"INVALID_CONFIG",
|
|
103
|
+
configResult.exceptionOrNull()?.message ?: "Invalid configuration",
|
|
104
|
+
configResult.exceptionOrNull()
|
|
208
105
|
)
|
|
209
106
|
return
|
|
210
107
|
}
|
|
211
|
-
}
|
|
212
108
|
|
|
213
|
-
|
|
214
|
-
|
|
109
|
+
val (tempRecordingConfig, audioFormatInfo) = configResult.getOrNull()!!
|
|
110
|
+
recordingConfig = tempRecordingConfig
|
|
111
|
+
audioFormat = audioFormatInfo.format
|
|
112
|
+
mimeType = audioFormatInfo.mimeType
|
|
215
113
|
|
|
216
|
-
|
|
217
|
-
FileOutputStream(audioFile, true).use { fos ->
|
|
218
|
-
audioFileHandler.writeWavHeader(fos, recordingConfig.sampleRate, recordingConfig.channels, when (recordingConfig.encoding) {
|
|
219
|
-
"pcm_8bit" -> 8
|
|
220
|
-
"pcm_16bit" -> 16
|
|
221
|
-
"pcm_32bit" -> 32
|
|
222
|
-
else -> 16 // Default to 16 if the encoding is not recognized
|
|
223
|
-
})
|
|
224
|
-
}
|
|
225
|
-
} catch (e: IOException) {
|
|
226
|
-
promise.reject("FILE_CREATION_FAILED", "Failed to create the audio file", e)
|
|
227
|
-
return
|
|
228
|
-
}
|
|
114
|
+
if (!initializeAudioFormat(promise)) return
|
|
229
115
|
|
|
230
|
-
|
|
116
|
+
if (!initializeBufferSize(promise)) return
|
|
231
117
|
|
|
232
|
-
|
|
233
|
-
isPaused.set(false)
|
|
234
|
-
isRecording.set(true)
|
|
235
|
-
isFirstChunk = true // Reset the flag when starting a new recording
|
|
118
|
+
if (!initializeAudioRecord(promise)) return
|
|
236
119
|
|
|
120
|
+
if (!initializeRecordingResources(audioFormatInfo.fileExtension, promise)) return
|
|
237
121
|
|
|
238
|
-
|
|
239
|
-
recordingStartTime =
|
|
240
|
-
System.currentTimeMillis() // Only reset start time if it's not a resume
|
|
241
|
-
}
|
|
122
|
+
if (!startRecordingProcess(promise)) return
|
|
242
123
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
"
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
"
|
|
255
|
-
"
|
|
256
|
-
|
|
257
|
-
promise.resolve(result)
|
|
124
|
+
// Return success result
|
|
125
|
+
val result = bundleOf(
|
|
126
|
+
"fileUri" to audioFile?.toURI().toString(),
|
|
127
|
+
"channels" to recordingConfig.channels,
|
|
128
|
+
"bitDepth" to AudioFormatUtils.getBitDepth(recordingConfig.encoding),
|
|
129
|
+
"sampleRate" to recordingConfig.sampleRate,
|
|
130
|
+
"mimeType" to mimeType
|
|
131
|
+
)
|
|
132
|
+
promise.resolve(result)
|
|
133
|
+
|
|
134
|
+
} catch (e: Exception) {
|
|
135
|
+
Log.e(Constants.TAG, "Unexpected error in startRecording", e)
|
|
136
|
+
promise.reject("UNEXPECTED_ERROR", "Unexpected error: ${e.message}", e)
|
|
137
|
+
}
|
|
258
138
|
}
|
|
259
139
|
|
|
260
140
|
private fun isAudioFormatSupported(sampleRate: Int, channels: Int, format: Int): Boolean {
|
|
@@ -262,7 +142,8 @@ class AudioRecorderManager(
|
|
|
262
142
|
throw SecurityException("Recording permission has not been granted")
|
|
263
143
|
}
|
|
264
144
|
|
|
265
|
-
val channelConfig =
|
|
145
|
+
val channelConfig =
|
|
146
|
+
if (channels == 1) AudioFormat.CHANNEL_IN_MONO else AudioFormat.CHANNEL_IN_STEREO
|
|
266
147
|
val bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, format)
|
|
267
148
|
|
|
268
149
|
if (bufferSize <= 0) {
|
|
@@ -292,6 +173,227 @@ class AudioRecorderManager(
|
|
|
292
173
|
return isSupported
|
|
293
174
|
}
|
|
294
175
|
|
|
176
|
+
private fun checkPermissions(options: Map<String, Any?>, promise: Promise): Boolean {
|
|
177
|
+
if (!permissionUtils.checkRecordingPermission()) {
|
|
178
|
+
promise.reject(
|
|
179
|
+
"PERMISSION_DENIED",
|
|
180
|
+
"Recording permission has not been granted",
|
|
181
|
+
null
|
|
182
|
+
)
|
|
183
|
+
return false
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (options["showNotification"] as? Boolean == true && !permissionUtils.checkNotificationPermission()) {
|
|
187
|
+
promise.reject(
|
|
188
|
+
"NOTIFICATION_PERMISSION_DENIED",
|
|
189
|
+
"Notification permission has not been granted",
|
|
190
|
+
null
|
|
191
|
+
)
|
|
192
|
+
return false
|
|
193
|
+
}
|
|
194
|
+
return true
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
private fun initializeAudioFormat(promise: Promise): Boolean {
|
|
199
|
+
if (!isAudioFormatSupported(
|
|
200
|
+
recordingConfig.sampleRate,
|
|
201
|
+
recordingConfig.channels,
|
|
202
|
+
audioFormat
|
|
203
|
+
)
|
|
204
|
+
) {
|
|
205
|
+
Log.e(Constants.TAG, "Selected audio format not supported, falling back to 16-bit PCM")
|
|
206
|
+
audioFormat = AudioFormat.ENCODING_PCM_16BIT
|
|
207
|
+
|
|
208
|
+
if (!isAudioFormatSupported(
|
|
209
|
+
recordingConfig.sampleRate,
|
|
210
|
+
recordingConfig.channels,
|
|
211
|
+
audioFormat
|
|
212
|
+
)
|
|
213
|
+
) {
|
|
214
|
+
promise.reject(
|
|
215
|
+
"INITIALIZATION_FAILED",
|
|
216
|
+
"Failed to initialize audio recorder with any supported format",
|
|
217
|
+
null
|
|
218
|
+
)
|
|
219
|
+
return false
|
|
220
|
+
}
|
|
221
|
+
recordingConfig = recordingConfig.copy(encoding = "pcm_16bit")
|
|
222
|
+
mimeType = "audio/wav"
|
|
223
|
+
}
|
|
224
|
+
return true
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
private fun initializeBufferSize(promise: Promise): Boolean {
|
|
228
|
+
try {
|
|
229
|
+
val channelConfig = if (recordingConfig.channels == 1) {
|
|
230
|
+
AudioFormat.CHANNEL_IN_MONO
|
|
231
|
+
} else {
|
|
232
|
+
AudioFormat.CHANNEL_IN_STEREO
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
bufferSizeInBytes = AudioRecord.getMinBufferSize(
|
|
236
|
+
recordingConfig.sampleRate,
|
|
237
|
+
channelConfig,
|
|
238
|
+
audioFormat
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
when {
|
|
242
|
+
bufferSizeInBytes == AudioRecord.ERROR -> {
|
|
243
|
+
Log.e(Constants.TAG, "Error getting minimum buffer size: ERROR")
|
|
244
|
+
promise.reject(
|
|
245
|
+
"BUFFER_SIZE_ERROR",
|
|
246
|
+
"Failed to get minimum buffer size: generic error",
|
|
247
|
+
null
|
|
248
|
+
)
|
|
249
|
+
return false
|
|
250
|
+
}
|
|
251
|
+
bufferSizeInBytes == AudioRecord.ERROR_BAD_VALUE -> {
|
|
252
|
+
Log.e(Constants.TAG, "Error getting minimum buffer size: BAD_VALUE")
|
|
253
|
+
promise.reject(
|
|
254
|
+
"BUFFER_SIZE_ERROR",
|
|
255
|
+
"Failed to get minimum buffer size: invalid parameters",
|
|
256
|
+
null
|
|
257
|
+
)
|
|
258
|
+
return false
|
|
259
|
+
}
|
|
260
|
+
bufferSizeInBytes <= 0 -> {
|
|
261
|
+
Log.e(Constants.TAG, "Invalid buffer size: $bufferSizeInBytes")
|
|
262
|
+
promise.reject(
|
|
263
|
+
"BUFFER_SIZE_ERROR",
|
|
264
|
+
"Failed to get valid buffer size",
|
|
265
|
+
null
|
|
266
|
+
)
|
|
267
|
+
return false
|
|
268
|
+
}
|
|
269
|
+
else -> {
|
|
270
|
+
Log.d(Constants.TAG, "AudioFormat: $audioFormat, BufferSize: $bufferSizeInBytes")
|
|
271
|
+
return true
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
} catch (e: Exception) {
|
|
275
|
+
Log.e(Constants.TAG, "Failed to initialize buffer size", e)
|
|
276
|
+
promise.reject(
|
|
277
|
+
"BUFFER_SIZE_ERROR",
|
|
278
|
+
"Failed to initialize buffer size: ${e.message}",
|
|
279
|
+
e
|
|
280
|
+
)
|
|
281
|
+
return false
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
private fun initializeAudioRecord(promise: Promise): Boolean {
|
|
287
|
+
if (!permissionUtils.checkRecordingPermission()) {
|
|
288
|
+
promise.reject(
|
|
289
|
+
"PERMISSION_DENIED",
|
|
290
|
+
"Recording permission has not been granted",
|
|
291
|
+
null
|
|
292
|
+
)
|
|
293
|
+
return false
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
try {
|
|
297
|
+
if (audioRecord == null || !isPaused.get()) {
|
|
298
|
+
Log.d(Constants.TAG, "Initializing AudioRecord with format: $audioFormat, BufferSize: $bufferSizeInBytes")
|
|
299
|
+
|
|
300
|
+
audioRecord = AudioRecord(
|
|
301
|
+
MediaRecorder.AudioSource.MIC,
|
|
302
|
+
recordingConfig.sampleRate,
|
|
303
|
+
if (recordingConfig.channels == 1) AudioFormat.CHANNEL_IN_MONO else AudioFormat.CHANNEL_IN_STEREO,
|
|
304
|
+
audioFormat,
|
|
305
|
+
bufferSizeInBytes
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
if (audioRecord?.state != AudioRecord.STATE_INITIALIZED) {
|
|
309
|
+
promise.reject(
|
|
310
|
+
"INITIALIZATION_FAILED",
|
|
311
|
+
"Failed to initialize the audio recorder",
|
|
312
|
+
null
|
|
313
|
+
)
|
|
314
|
+
return false
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return true
|
|
318
|
+
|
|
319
|
+
} catch (e: SecurityException) {
|
|
320
|
+
Log.e(Constants.TAG, "Security exception while initializing AudioRecord", e)
|
|
321
|
+
promise.reject(
|
|
322
|
+
"PERMISSION_DENIED",
|
|
323
|
+
"Recording permission denied: ${e.message}",
|
|
324
|
+
e
|
|
325
|
+
)
|
|
326
|
+
return false
|
|
327
|
+
} catch (e: Exception) {
|
|
328
|
+
Log.e(Constants.TAG, "Failed to initialize AudioRecord", e)
|
|
329
|
+
promise.reject(
|
|
330
|
+
"INITIALIZATION_FAILED",
|
|
331
|
+
"Failed to initialize the audio recorder: ${e.message}",
|
|
332
|
+
e
|
|
333
|
+
)
|
|
334
|
+
return false
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
private fun initializeRecordingResources(fileExtension: String, promise: Promise): Boolean {
|
|
339
|
+
try {
|
|
340
|
+
streamUuid = java.util.UUID.randomUUID().toString()
|
|
341
|
+
audioFile = File(filesDir, "audio_${streamUuid}.$fileExtension")
|
|
342
|
+
|
|
343
|
+
FileOutputStream(audioFile, true).use { fos ->
|
|
344
|
+
audioFileHandler.writeWavHeader(
|
|
345
|
+
fos,
|
|
346
|
+
recordingConfig.sampleRate,
|
|
347
|
+
recordingConfig.channels,
|
|
348
|
+
AudioFormatUtils.getBitDepth(recordingConfig.encoding)
|
|
349
|
+
)
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
if (recordingConfig.showNotification) {
|
|
353
|
+
notificationManager.initialize(recordingConfig)
|
|
354
|
+
notificationManager.startUpdates(System.currentTimeMillis())
|
|
355
|
+
AudioRecordingService.startService(context)
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
acquireWakeLock()
|
|
359
|
+
audioProcessor.resetCumulativeAmplitudeRange()
|
|
360
|
+
return true
|
|
361
|
+
|
|
362
|
+
} catch (e: IOException) {
|
|
363
|
+
releaseWakeLock()
|
|
364
|
+
promise.reject("FILE_CREATION_FAILED", "Failed to create the audio file", e)
|
|
365
|
+
return false
|
|
366
|
+
} catch (e: Exception) {
|
|
367
|
+
releaseWakeLock()
|
|
368
|
+
Log.e(Constants.TAG, "Unexpected error in startRecording", e)
|
|
369
|
+
promise.reject("UNEXPECTED_ERROR", "Unexpected error: ${e.message}", e)
|
|
370
|
+
return false
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
private fun startRecordingProcess(promise: Promise): Boolean {
|
|
375
|
+
try {
|
|
376
|
+
Log.d(Constants.TAG, "Starting audio recording")
|
|
377
|
+
audioRecord?.startRecording()
|
|
378
|
+
isPaused.set(false)
|
|
379
|
+
isRecording.set(true)
|
|
380
|
+
isFirstChunk = true
|
|
381
|
+
|
|
382
|
+
if (!isPaused.get()) {
|
|
383
|
+
recordingStartTime = System.currentTimeMillis()
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
recordingThread = Thread { recordingProcess() }.apply { start() }
|
|
387
|
+
return true
|
|
388
|
+
|
|
389
|
+
} catch (e: Exception) {
|
|
390
|
+
Log.e(Constants.TAG, "Failed to start recording", e)
|
|
391
|
+
cleanup()
|
|
392
|
+
promise.reject("START_FAILED", "Failed to start recording: ${e.message}", e)
|
|
393
|
+
return false
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
295
397
|
fun stopRecording(promise: Promise) {
|
|
296
398
|
synchronized(audioRecordLock) {
|
|
297
399
|
|
|
@@ -302,6 +404,11 @@ class AudioRecorderManager(
|
|
|
302
404
|
}
|
|
303
405
|
|
|
304
406
|
try {
|
|
407
|
+
if (recordingConfig.showNotification) {
|
|
408
|
+
notificationManager.stopUpdates()
|
|
409
|
+
AudioRecordingService.stopService(context)
|
|
410
|
+
}
|
|
411
|
+
|
|
305
412
|
val audioData = ByteArray(bufferSizeInBytes)
|
|
306
413
|
val bytesRead = audioRecord?.read(audioData, 0, bufferSizeInBytes) ?: -1
|
|
307
414
|
Log.d(Constants.TAG, "Last Read $bytesRead bytes")
|
|
@@ -311,27 +418,32 @@ class AudioRecorderManager(
|
|
|
311
418
|
|
|
312
419
|
Log.d(Constants.TAG, "Stopping recording state = ${audioRecord?.state}")
|
|
313
420
|
if (audioRecord != null && audioRecord!!.state == AudioRecord.STATE_INITIALIZED) {
|
|
314
|
-
Log.d(Constants.TAG, "Stopping AudioRecord")
|
|
421
|
+
Log.d(Constants.TAG, "Stopping AudioRecord")
|
|
315
422
|
audioRecord!!.stop()
|
|
316
423
|
}
|
|
317
424
|
|
|
425
|
+
cleanup()
|
|
318
426
|
} catch (e: IllegalStateException) {
|
|
319
|
-
Log.e(Constants.TAG, "Error reading from AudioRecord", e)
|
|
427
|
+
Log.e(Constants.TAG, "Error reading from AudioRecord", e)
|
|
320
428
|
} finally {
|
|
429
|
+
// Release wake lock at the end
|
|
430
|
+
releaseWakeLock()
|
|
321
431
|
audioRecord?.release()
|
|
322
432
|
}
|
|
323
433
|
|
|
324
434
|
try {
|
|
435
|
+
AudioProcessor.resetUniqueIdCounter() // Reset the unique ID counter when stopping the recording
|
|
325
436
|
audioProcessor.resetCumulativeAmplitudeRange()
|
|
326
437
|
|
|
327
438
|
val fileSize = audioFile?.length() ?: 0
|
|
328
439
|
val dataFileSize = fileSize - 44 // Subtract header size
|
|
329
|
-
val byteRate =
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
440
|
+
val byteRate =
|
|
441
|
+
recordingConfig.sampleRate * recordingConfig.channels * when (recordingConfig.encoding) {
|
|
442
|
+
"pcm_8bit" -> 1
|
|
443
|
+
"pcm_16bit" -> 2
|
|
444
|
+
"pcm_32bit" -> 4
|
|
445
|
+
else -> 2 // Default to 2 bytes per sample if the encoding is not recognized
|
|
446
|
+
}
|
|
335
447
|
// Calculate duration based on the data size and byte rate
|
|
336
448
|
val duration = if (byteRate > 0) (dataFileSize * 1000 / byteRate) else 0
|
|
337
449
|
|
|
@@ -367,12 +479,39 @@ class AudioRecorderManager(
|
|
|
367
479
|
}
|
|
368
480
|
}
|
|
369
481
|
|
|
482
|
+
fun resumeRecording(promise: Promise) {
|
|
483
|
+
if (!isPaused.get()) {
|
|
484
|
+
promise.reject("NOT_PAUSED", "Recording is not paused", null)
|
|
485
|
+
return
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
try {
|
|
489
|
+
if (recordingConfig.showNotification) {
|
|
490
|
+
notificationManager.resumeUpdates()
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
acquireWakeLock()
|
|
494
|
+
pausedDuration += System.currentTimeMillis() - lastPauseTime
|
|
495
|
+
isPaused.set(false)
|
|
496
|
+
audioRecord?.startRecording()
|
|
497
|
+
promise.resolve("Recording resumed")
|
|
498
|
+
} catch (e: Exception) {
|
|
499
|
+
releaseWakeLock()
|
|
500
|
+
promise.reject("RESUME_FAILED", "Failed to resume recording", e)
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
370
504
|
fun pauseRecording(promise: Promise) {
|
|
371
505
|
if (isRecording.get() && !isPaused.get()) {
|
|
372
506
|
audioRecord?.stop()
|
|
373
|
-
lastPauseTime =
|
|
374
|
-
System.currentTimeMillis() // Record the time when the recording was paused
|
|
507
|
+
lastPauseTime = System.currentTimeMillis()
|
|
375
508
|
isPaused.set(true)
|
|
509
|
+
|
|
510
|
+
if (recordingConfig.showNotification) {
|
|
511
|
+
notificationManager.pauseUpdates()
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
releaseWakeLock()
|
|
376
515
|
promise.resolve("Recording paused")
|
|
377
516
|
} else {
|
|
378
517
|
promise.reject(
|
|
@@ -383,21 +522,6 @@ class AudioRecorderManager(
|
|
|
383
522
|
}
|
|
384
523
|
}
|
|
385
524
|
|
|
386
|
-
fun resumeRecording(promise: Promise) {
|
|
387
|
-
if (isRecording.get() && !isPaused.get()) {
|
|
388
|
-
promise.reject("NOT_PAUSED", "Recording is not paused", null)
|
|
389
|
-
return
|
|
390
|
-
} else if (audioRecord == null) {
|
|
391
|
-
promise.reject("NOT_RECORDING", "Recording is not active", null)
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// Calculate the duration the recording was paused
|
|
395
|
-
pausedDuration += System.currentTimeMillis() - lastPauseTime
|
|
396
|
-
isPaused.set(false)
|
|
397
|
-
audioRecord?.startRecording()
|
|
398
|
-
promise.resolve("Recording resumed")
|
|
399
|
-
}
|
|
400
|
-
|
|
401
525
|
fun getStatus(): Bundle {
|
|
402
526
|
synchronized(audioRecordLock) {
|
|
403
527
|
if (!isRecording.get()) {
|
|
@@ -408,7 +532,7 @@ class AudioRecorderManager(
|
|
|
408
532
|
"isPaused" to false,
|
|
409
533
|
"mime" to mimeType,
|
|
410
534
|
"size" to 0,
|
|
411
|
-
"interval" to interval,
|
|
535
|
+
"interval" to recordingConfig.interval,
|
|
412
536
|
)
|
|
413
537
|
}
|
|
414
538
|
|
|
@@ -417,11 +541,14 @@ class AudioRecorderManager(
|
|
|
417
541
|
|
|
418
542
|
val duration = when (mimeType) {
|
|
419
543
|
"audio/wav" -> {
|
|
420
|
-
val dataFileSize =
|
|
421
|
-
|
|
544
|
+
val dataFileSize =
|
|
545
|
+
fileSize - Constants.WAV_HEADER_SIZE // Assuming header is always 44 bytes
|
|
546
|
+
val byteRate =
|
|
547
|
+
recordingConfig.sampleRate * recordingConfig.channels * (if (recordingConfig.encoding == "pcm_8bit") 8 else 16) / 8
|
|
422
548
|
if (byteRate > 0) dataFileSize * 1000 / byteRate else 0
|
|
423
549
|
}
|
|
424
|
-
|
|
550
|
+
|
|
551
|
+
// "audio/opus", "audio/aac" -> getCompressedAudioDuration(audioFile)
|
|
425
552
|
else -> 0
|
|
426
553
|
}
|
|
427
554
|
return bundleOf(
|
|
@@ -435,6 +562,43 @@ class AudioRecorderManager(
|
|
|
435
562
|
}
|
|
436
563
|
}
|
|
437
564
|
|
|
565
|
+
private val wakeLockTimeout = 60 * 60 * 1000L // 1 hour timeout
|
|
566
|
+
|
|
567
|
+
private fun acquireWakeLock() {
|
|
568
|
+
if (recordingConfig.keepAwake && wakeLock == null) {
|
|
569
|
+
try {
|
|
570
|
+
val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
|
|
571
|
+
wakeLock = powerManager.newWakeLock(
|
|
572
|
+
PowerManager.PARTIAL_WAKE_LOCK, // Use PARTIAL_WAKE_LOCK instead of deprecated SCREEN_DIM_WAKE_LOCK
|
|
573
|
+
"AudioRecorderManager::RecordingWakeLock"
|
|
574
|
+
).apply {
|
|
575
|
+
setReferenceCounted(false)
|
|
576
|
+
acquire(wakeLockTimeout) // Add timeout
|
|
577
|
+
}
|
|
578
|
+
wasWakeLockEnabled = true
|
|
579
|
+
Log.d(Constants.TAG, "Wake lock acquired")
|
|
580
|
+
} catch (e: Exception) {
|
|
581
|
+
Log.e(Constants.TAG, "Failed to acquire wake lock", e)
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
private fun releaseWakeLock() {
|
|
588
|
+
try {
|
|
589
|
+
wakeLock?.let {
|
|
590
|
+
if (it.isHeld) {
|
|
591
|
+
it.release()
|
|
592
|
+
Log.d(Constants.TAG, "Wake lock released")
|
|
593
|
+
}
|
|
594
|
+
wakeLock = null
|
|
595
|
+
wasWakeLockEnabled = false
|
|
596
|
+
}
|
|
597
|
+
} catch (e: Exception) {
|
|
598
|
+
Log.e(Constants.TAG, "Failed to release wake lock", e)
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
438
602
|
fun listAudioFiles(promise: Promise) {
|
|
439
603
|
val fileList =
|
|
440
604
|
filesDir.list()?.filter { it.endsWith(".wav") }?.map { File(filesDir, it).absolutePath }
|
|
@@ -447,66 +611,74 @@ class AudioRecorderManager(
|
|
|
447
611
|
}
|
|
448
612
|
|
|
449
613
|
private fun recordingProcess() {
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
614
|
+
try {
|
|
615
|
+
Log.i(Constants.TAG, "Starting recording process...")
|
|
616
|
+
FileOutputStream(audioFile, true).use { fos ->
|
|
617
|
+
// Buffer to accumulate data
|
|
618
|
+
val accumulatedAudioData = ByteArrayOutputStream()
|
|
619
|
+
audioFileHandler.writeWavHeader(
|
|
620
|
+
accumulatedAudioData,
|
|
621
|
+
recordingConfig.sampleRate,
|
|
622
|
+
recordingConfig.channels,
|
|
623
|
+
when (recordingConfig.encoding) {
|
|
624
|
+
"pcm_8bit" -> 8
|
|
625
|
+
"pcm_16bit" -> 16
|
|
626
|
+
"pcm_32bit" -> 32
|
|
627
|
+
else -> 16 // Default to 16 if the encoding is not recognized
|
|
628
|
+
}
|
|
629
|
+
)
|
|
630
|
+
// Write audio data directly to the file
|
|
631
|
+
val audioData = ByteArray(bufferSizeInBytes)
|
|
632
|
+
Log.d(Constants.TAG, "Entering recording loop")
|
|
633
|
+
while (isRecording.get() && !Thread.currentThread().isInterrupted) {
|
|
634
|
+
if (isPaused.get()) {
|
|
635
|
+
// If recording is paused, skip reading from the microphone
|
|
636
|
+
continue
|
|
637
|
+
}
|
|
473
638
|
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
}
|
|
481
|
-
it.read(audioData, 0, bufferSizeInBytes).also { bytes ->
|
|
482
|
-
if (bytes < 0) {
|
|
483
|
-
Log.e(Constants.TAG, "AudioRecord read error: $bytes")
|
|
639
|
+
val bytesRead = synchronized(audioRecordLock) {
|
|
640
|
+
// Only synchronize the read operation and the check
|
|
641
|
+
audioRecord?.let {
|
|
642
|
+
if (it.state != AudioRecord.STATE_INITIALIZED) {
|
|
643
|
+
Log.e(Constants.TAG, "AudioRecord not initialized")
|
|
644
|
+
return@let -1
|
|
484
645
|
}
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
accumulatedAudioData.write(audioData, 0, bytesRead)
|
|
492
|
-
|
|
493
|
-
// Emit audio data at defined intervals
|
|
494
|
-
if (SystemClock.elapsedRealtime() - lastEmitTime >= interval) {
|
|
495
|
-
emitAudioData(
|
|
496
|
-
accumulatedAudioData.toByteArray(),
|
|
497
|
-
accumulatedAudioData.size()
|
|
498
|
-
)
|
|
499
|
-
lastEmitTime = SystemClock.elapsedRealtime() // Reset the timer
|
|
500
|
-
accumulatedAudioData.reset() // Clear the accumulator
|
|
646
|
+
it.read(audioData, 0, bufferSizeInBytes).also { bytes ->
|
|
647
|
+
if (bytes < 0) {
|
|
648
|
+
Log.e(Constants.TAG, "AudioRecord read error: $bytes")
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
} ?: -1 // Handle null case
|
|
501
652
|
}
|
|
653
|
+
if (bytesRead > 0) {
|
|
654
|
+
fos.write(audioData, 0, bytesRead)
|
|
655
|
+
totalDataSize += bytesRead
|
|
656
|
+
accumulatedAudioData.write(audioData, 0, bytesRead)
|
|
657
|
+
|
|
658
|
+
// Emit audio data at defined intervals
|
|
659
|
+
if (SystemClock.elapsedRealtime() - lastEmitTime >= recordingConfig.interval) {
|
|
660
|
+
emitAudioData(
|
|
661
|
+
accumulatedAudioData.toByteArray(),
|
|
662
|
+
accumulatedAudioData.size()
|
|
663
|
+
)
|
|
664
|
+
lastEmitTime = SystemClock.elapsedRealtime() // Reset the timer
|
|
665
|
+
accumulatedAudioData.reset() // Clear the accumulator
|
|
666
|
+
}
|
|
502
667
|
|
|
503
|
-
|
|
668
|
+
Log.d(Constants.TAG, "Bytes written to file: $bytesRead")
|
|
669
|
+
}
|
|
504
670
|
}
|
|
505
671
|
}
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
672
|
+
// Update the WAV header to reflect the actual data size
|
|
673
|
+
audioFile?.let { file ->
|
|
674
|
+
audioFileHandler.updateWavHeader(file)
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
} catch (e: Exception) {
|
|
678
|
+
// Ensure wake lock is released if the thread is interrupted
|
|
679
|
+
if (!isPaused.get()) {
|
|
680
|
+
releaseWakeLock()
|
|
681
|
+
}
|
|
510
682
|
}
|
|
511
683
|
}
|
|
512
684
|
|
|
@@ -515,11 +687,11 @@ class AudioRecorderManager(
|
|
|
515
687
|
|
|
516
688
|
val fileSize = audioFile?.length() ?: 0
|
|
517
689
|
val from = lastEmittedSize
|
|
518
|
-
val deltaSize = fileSize - lastEmittedSize
|
|
519
690
|
lastEmittedSize = fileSize
|
|
520
691
|
|
|
521
692
|
// Calculate position in milliseconds
|
|
522
|
-
val positionInMs =
|
|
693
|
+
val positionInMs =
|
|
694
|
+
(from * 1000) / (recordingConfig.sampleRate * recordingConfig.channels * (if (recordingConfig.encoding == "pcm_8bit") 8 else 16) / 8)
|
|
523
695
|
|
|
524
696
|
mainHandler.post {
|
|
525
697
|
try {
|
|
@@ -545,6 +717,15 @@ class AudioRecorderManager(
|
|
|
545
717
|
}
|
|
546
718
|
}
|
|
547
719
|
|
|
720
|
+
private fun convertByteArrayToFloatArray(audioData: ByteArray): FloatArray {
|
|
721
|
+
val floatArray = FloatArray(audioData.size / 2) // Assuming 16-bit PCM
|
|
722
|
+
val buffer = ByteBuffer.wrap(audioData).order(ByteOrder.LITTLE_ENDIAN)
|
|
723
|
+
for (i in floatArray.indices) {
|
|
724
|
+
floatArray[i] = buffer.short.toFloat()
|
|
725
|
+
}
|
|
726
|
+
return floatArray
|
|
727
|
+
}
|
|
728
|
+
|
|
548
729
|
private fun processAudioData(audioData: ByteArray) {
|
|
549
730
|
// Skip the WAV header only for the first chunk
|
|
550
731
|
val dataToProcess = if (isFirstChunk && audioData.size > Constants.WAV_HEADER_SIZE) {
|
|
@@ -556,6 +737,11 @@ class AudioRecorderManager(
|
|
|
556
737
|
val audioAnalysisData = audioProcessor.processAudioData(dataToProcess, recordingConfig)
|
|
557
738
|
val analysisBundle = audioAnalysisData.toBundle()
|
|
558
739
|
|
|
740
|
+
if (recordingConfig.showNotification && recordingConfig.showWaveformInNotification) {
|
|
741
|
+
val floatArray = convertByteArrayToFloatArray(audioData)
|
|
742
|
+
notificationManager.updateNotification(floatArray)
|
|
743
|
+
}
|
|
744
|
+
|
|
559
745
|
mainHandler.post {
|
|
560
746
|
try {
|
|
561
747
|
eventSender.sendExpoEvent(
|
|
@@ -570,10 +756,24 @@ class AudioRecorderManager(
|
|
|
570
756
|
isFirstChunk = false
|
|
571
757
|
}
|
|
572
758
|
|
|
759
|
+
private fun cleanup() {
|
|
760
|
+
try {
|
|
761
|
+
if (recordingConfig.showNotification) {
|
|
762
|
+
notificationManager.stopUpdates()
|
|
763
|
+
AudioRecordingService.stopService(context)
|
|
764
|
+
}
|
|
573
765
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
766
|
+
// Reset all states
|
|
767
|
+
isRecording.set(false)
|
|
768
|
+
isPaused.set(false)
|
|
769
|
+
totalRecordedTime = 0
|
|
770
|
+
pausedDuration = 0
|
|
771
|
+
lastEmittedSize = 0
|
|
772
|
+
recordingStartTime = 0
|
|
773
|
+
} catch (e: Exception) {
|
|
774
|
+
Log.e(Constants.TAG, "Error in cleanup", e)
|
|
775
|
+
} finally {
|
|
776
|
+
releaseWakeLock()
|
|
777
|
+
}
|
|
578
778
|
}
|
|
579
779
|
}
|