@siteed/expo-audio-stream 1.1.17 → 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/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/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/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$10.dex → 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/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$12.dex → 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/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$17.dex → 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/{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$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$14$$inlined$AsyncFunction$11.dex → 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/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$4.dex → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$4.dex} +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$5.dex → 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/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$7.dex → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$7.dex} +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$2.dex → 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/{tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$10.class → intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/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$11.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$14.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/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$17.class → 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/{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$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/{tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$4.class → intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/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/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$7.class → ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$7.class} +0 -0
- package/android/build/{tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$2.class → intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/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/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$4.class → 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 → intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/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 → 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/counters.tab +1 -1
- 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.values.at +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.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +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/id-to-file.tab_i +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/{intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$10.class → tmp/kotlin-classes/debug/net/siteed/audiostream/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/{intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$2.class → tmp/kotlin-classes/debug/net/siteed/audiostream/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/{intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$4.class → tmp/kotlin-classes/debug/net/siteed/audiostream/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/tmp/kotlin-classes/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$7.class → 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/tmp/kotlin-classes/debug/net/siteed/audiostream/{ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$4.class → 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 → tmp/kotlin-classes/debug/net/siteed/audiostream/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 → 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 -261
- package/android/src/main/java/net/siteed/audiostream/AudioRecordingService.kt +71 -0
- package/android/src/main/java/net/siteed/audiostream/ExpoAudioStreamModule.kt +78 -8
- 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/results.bin +0 -1
- package/android/build/.transforms/871e87a512fbb418f6a6523c40225bac/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/results.bin +0 -1
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioAnalysisData$AmplitudeRange.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioAnalysisData$SpeakerChange.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioAnalysisData.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioDataEncoder.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioFileHandler.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$AudioData.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$extractMFCC$powerSpectrum$2.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/BuildConfig.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/Constants.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/DataPoint.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/EventSender.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$10.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$12.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$AsyncFunction$2.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$4.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$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 +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/FFT.dex +0 -0
- package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/Features.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/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/desugar_graph.bin +0 -0
- package/android/build/.transforms/a758925c83c348fb1544431cf45e6a05/results.bin +0 -1
- package/android/build/.transforms/a758925c83c348fb1544431cf45e6a05/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$1.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$13.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$14.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$15.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$16.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$18.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$3.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$6.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$8.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$9.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$1.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$2.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$3.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$4.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$FunctionWithoutArgs$1.dex +0 -0
- package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$FunctionWithoutArgs$2.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/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
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
class AudioNotificationManager {
|
|
2
|
+
private let notificationCenter = UNUserNotificationCenter.current()
|
|
3
|
+
private let notificationId = "audio_recording_notification"
|
|
4
|
+
private var updateTimer: Timer?
|
|
5
|
+
private var config: NotificationConfig?
|
|
6
|
+
private var currentDuration: TimeInterval = 0
|
|
7
|
+
private var lastUpdateTime: Date = Date()
|
|
8
|
+
private var minUpdateInterval: TimeInterval = 1.0 // Minimum time between updates
|
|
9
|
+
|
|
10
|
+
func initialize(with config: NotificationConfig?) {
|
|
11
|
+
self.config = config
|
|
12
|
+
setupNotificationCategories()
|
|
13
|
+
showInitialNotification()
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
private func setupNotificationCategories() {
|
|
17
|
+
let pauseAction = UNNotificationAction(
|
|
18
|
+
identifier: "PAUSE_RECORDING",
|
|
19
|
+
title: "Pause",
|
|
20
|
+
options: [.foreground]
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
let resumeAction = UNNotificationAction(
|
|
24
|
+
identifier: "RESUME_RECORDING",
|
|
25
|
+
title: "Resume",
|
|
26
|
+
options: [.foreground]
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
let category = UNNotificationCategory(
|
|
30
|
+
identifier: config?.ios?.categoryIdentifier ?? "recording_category",
|
|
31
|
+
actions: [pauseAction, resumeAction],
|
|
32
|
+
intentIdentifiers: [],
|
|
33
|
+
options: [.customDismissAction]
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
notificationCenter.setNotificationCategories([category])
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
func showInitialNotification() {
|
|
40
|
+
updateNotification()
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
func startUpdates(startTime: Date) {
|
|
44
|
+
DispatchQueue.main.async {
|
|
45
|
+
self.updateTimer?.invalidate()
|
|
46
|
+
|
|
47
|
+
self.updateTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
|
|
48
|
+
guard let self = self else { return }
|
|
49
|
+
|
|
50
|
+
let now = Date()
|
|
51
|
+
if now.timeIntervalSince(self.lastUpdateTime) >= self.minUpdateInterval {
|
|
52
|
+
self.updateNotification()
|
|
53
|
+
self.lastUpdateTime = now
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
RunLoop.main.add(self.updateTimer!, forMode: .common)
|
|
57
|
+
|
|
58
|
+
self.showInitialNotification()
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
func stopUpdates() {
|
|
63
|
+
DispatchQueue.main.async {
|
|
64
|
+
self.updateTimer?.invalidate()
|
|
65
|
+
self.updateTimer = nil
|
|
66
|
+
|
|
67
|
+
self.notificationCenter.removeDeliveredNotifications(withIdentifiers: [self.notificationId])
|
|
68
|
+
self.notificationCenter.removePendingNotificationRequests(withIdentifiers: [self.notificationId])
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
func updateState(isPaused: Bool) {
|
|
73
|
+
let now = Date()
|
|
74
|
+
if now.timeIntervalSince(lastUpdateTime) >= minUpdateInterval {
|
|
75
|
+
updateNotification(forcePauseState: isPaused)
|
|
76
|
+
lastUpdateTime = now
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
func updateDuration(_ duration: TimeInterval) {
|
|
81
|
+
currentDuration = max(0, duration)
|
|
82
|
+
let now = Date()
|
|
83
|
+
if now.timeIntervalSince(lastUpdateTime) >= minUpdateInterval {
|
|
84
|
+
updateNotification()
|
|
85
|
+
lastUpdateTime = now
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private func updateNotification(forcePauseState: Bool? = nil) {
|
|
90
|
+
// First, check if we already have a notification
|
|
91
|
+
notificationCenter.getDeliveredNotifications { [weak self] notifications in
|
|
92
|
+
guard let self = self else { return }
|
|
93
|
+
|
|
94
|
+
// If we have a notification and it was recently updated, skip
|
|
95
|
+
if let existing = notifications.first(where: { $0.request.identifier == self.notificationId }),
|
|
96
|
+
Date().timeIntervalSince(self.lastUpdateTime) < self.minUpdateInterval {
|
|
97
|
+
return
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Create notification content
|
|
101
|
+
let content = UNMutableNotificationContent()
|
|
102
|
+
content.title = forcePauseState == true ?
|
|
103
|
+
"Recording Paused" :
|
|
104
|
+
(self.config?.title ?? "Recording in Progress")
|
|
105
|
+
|
|
106
|
+
let durationText = self.formatDuration(self.currentDuration)
|
|
107
|
+
let configText = self.config?.text ?? ""
|
|
108
|
+
content.body = configText.isEmpty ? durationText : "\(configText) - \(durationText)"
|
|
109
|
+
|
|
110
|
+
content.categoryIdentifier = self.config?.ios?.categoryIdentifier ?? "recording_category"
|
|
111
|
+
content.sound = nil
|
|
112
|
+
|
|
113
|
+
// Create request
|
|
114
|
+
let request = UNNotificationRequest(
|
|
115
|
+
identifier: self.notificationId,
|
|
116
|
+
content: content,
|
|
117
|
+
trigger: nil
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
// Replace the existing notification
|
|
121
|
+
self.notificationCenter.removeDeliveredNotifications(withIdentifiers: [self.notificationId])
|
|
122
|
+
self.notificationCenter.add(request) { error in
|
|
123
|
+
if let error = error {
|
|
124
|
+
print("Failed to update notification: \(error)")
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
private func formatDuration(_ duration: TimeInterval) -> String {
|
|
131
|
+
let minutes = Int(duration) / 60
|
|
132
|
+
let seconds = Int(duration) % 60
|
|
133
|
+
return String(format: "%02d:%02d", minutes, seconds)
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
import Foundation
|
|
9
9
|
import AVFoundation
|
|
10
10
|
import Accelerate
|
|
11
|
+
import UIKit
|
|
12
|
+
import MediaPlayer
|
|
13
|
+
import UserNotifications
|
|
11
14
|
|
|
12
15
|
// Helper to convert to little-endian byte array
|
|
13
16
|
extension UInt32 {
|
|
@@ -33,6 +36,10 @@ class AudioStreamManager: NSObject {
|
|
|
33
36
|
private var audioProcessor: AudioProcessor?
|
|
34
37
|
private var startTime: Date?
|
|
35
38
|
private var pauseStartTime: Date?
|
|
39
|
+
|
|
40
|
+
// Wake lock related properties
|
|
41
|
+
private var wasIdleTimerDisabled: Bool = false // Track previous idle timer state
|
|
42
|
+
private var isWakeLockEnabled: Bool = false // Track current wake lock state
|
|
36
43
|
|
|
37
44
|
internal var lastEmissionTime: Date?
|
|
38
45
|
internal var lastEmittedSize: Int64 = 0
|
|
@@ -48,12 +55,48 @@ class AudioStreamManager: NSObject {
|
|
|
48
55
|
private var lastBufferTime: AVAudioTime?
|
|
49
56
|
private var accumulatedData = Data()
|
|
50
57
|
private var recentData = [Float]() // This property stores the recent audio data
|
|
58
|
+
private var notificationUpdateTimer: Timer?
|
|
51
59
|
|
|
60
|
+
private var notificationManager: AudioNotificationManager?
|
|
61
|
+
private var notificationView: MPNowPlayingInfoCenter?
|
|
62
|
+
private var audioSession: AVAudioSession?
|
|
63
|
+
private var notificationObserver: Any?
|
|
64
|
+
private var mediaInfoUpdateTimer: Timer?
|
|
65
|
+
private var remoteCommandCenter: MPRemoteCommandCenter?
|
|
66
|
+
|
|
52
67
|
weak var delegate: AudioStreamManagerDelegate? // Define the delegate here
|
|
53
68
|
|
|
54
69
|
/// Initializes the AudioStreamManager
|
|
55
70
|
override init() {
|
|
56
71
|
super.init()
|
|
72
|
+
// Only keep audio session interruption observer here
|
|
73
|
+
NotificationCenter.default.addObserver(
|
|
74
|
+
self,
|
|
75
|
+
selector: #selector(handleAudioSessionInterruption),
|
|
76
|
+
name: AVAudioSession.interruptionNotification,
|
|
77
|
+
object: nil
|
|
78
|
+
)
|
|
79
|
+
NotificationCenter.default.addObserver(
|
|
80
|
+
self,
|
|
81
|
+
selector: #selector(handleAppDidEnterBackground),
|
|
82
|
+
name: UIApplication.didEnterBackgroundNotification,
|
|
83
|
+
object: nil
|
|
84
|
+
)
|
|
85
|
+
NotificationCenter.default.addObserver(
|
|
86
|
+
self,
|
|
87
|
+
selector: #selector(handleAppWillEnterForeground),
|
|
88
|
+
name: UIApplication.willEnterForegroundNotification,
|
|
89
|
+
object: nil
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
deinit {
|
|
95
|
+
// Ensure wake lock is disabled when the manager is deallocated
|
|
96
|
+
disableWakeLock()
|
|
97
|
+
if let observer = notificationObserver {
|
|
98
|
+
NotificationCenter.default.removeObserver(observer)
|
|
99
|
+
}
|
|
57
100
|
}
|
|
58
101
|
|
|
59
102
|
/// Handles audio session interruptions.
|
|
@@ -67,7 +110,7 @@ class AudioStreamManager: NSObject {
|
|
|
67
110
|
|
|
68
111
|
Logger.debug("audio session interruption \(type)")
|
|
69
112
|
if type == .began {
|
|
70
|
-
//
|
|
113
|
+
disableWakeLock() // Disable wake lock when audio is interrupted
|
|
71
114
|
} else if type == .ended {
|
|
72
115
|
if let optionsValue = info[AVAudioSessionInterruptionOptionKey] as? UInt {
|
|
73
116
|
let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)
|
|
@@ -75,11 +118,207 @@ class AudioStreamManager: NSObject {
|
|
|
75
118
|
// Resume your audio recording
|
|
76
119
|
Logger.debug("Resume audio recording \(recordingUUID!)")
|
|
77
120
|
try? AVAudioSession.sharedInstance().setActive(true)
|
|
121
|
+
enableWakeLock() // Re-enable wake lock when audio resumes
|
|
78
122
|
}
|
|
79
123
|
}
|
|
80
124
|
}
|
|
81
125
|
}
|
|
82
126
|
|
|
127
|
+
private func setupNowPlayingInfo() {
|
|
128
|
+
// Configure audio session for background audio
|
|
129
|
+
audioSession = AVAudioSession.sharedInstance()
|
|
130
|
+
do {
|
|
131
|
+
try audioSession?.setCategory(.playAndRecord, mode: .default, options: [.allowBluetooth, .mixWithOthers])
|
|
132
|
+
try audioSession?.setActive(true)
|
|
133
|
+
} catch {
|
|
134
|
+
Logger.debug("Failed to configure audio session: \(error)")
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Setup Now Playing info
|
|
138
|
+
notificationView = MPNowPlayingInfoCenter.default()
|
|
139
|
+
updateNowPlayingInfo(isPaused: false)
|
|
140
|
+
|
|
141
|
+
// Configure Remote Command Center
|
|
142
|
+
setupRemoteCommandCenter()
|
|
143
|
+
|
|
144
|
+
// Enable remote control events on main thread
|
|
145
|
+
DispatchQueue.main.async {
|
|
146
|
+
UIApplication.shared.beginReceivingRemoteControlEvents()
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
private func setupRemoteCommandCenter() {
|
|
151
|
+
remoteCommandCenter = MPRemoteCommandCenter.shared()
|
|
152
|
+
|
|
153
|
+
// Remove any existing handlers
|
|
154
|
+
remoteCommandCenter?.pauseCommand.removeTarget(nil)
|
|
155
|
+
remoteCommandCenter?.playCommand.removeTarget(nil)
|
|
156
|
+
|
|
157
|
+
// Add pause command handler
|
|
158
|
+
remoteCommandCenter?.pauseCommand.addTarget { [weak self] _ in
|
|
159
|
+
guard let self = self, self.isRecording && !self.isPaused else {
|
|
160
|
+
return .commandFailed
|
|
161
|
+
}
|
|
162
|
+
self.pauseRecording()
|
|
163
|
+
return .success
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Add play/resume command handler
|
|
167
|
+
remoteCommandCenter?.playCommand.addTarget { [weak self] _ in
|
|
168
|
+
guard let self = self, self.isRecording && self.isPaused else {
|
|
169
|
+
return .commandFailed
|
|
170
|
+
}
|
|
171
|
+
self.resumeRecording()
|
|
172
|
+
return .success
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Enable the commands
|
|
176
|
+
remoteCommandCenter?.pauseCommand.isEnabled = true
|
|
177
|
+
remoteCommandCenter?.playCommand.isEnabled = true
|
|
178
|
+
|
|
179
|
+
// Disable unused commands
|
|
180
|
+
remoteCommandCenter?.nextTrackCommand.isEnabled = false
|
|
181
|
+
remoteCommandCenter?.previousTrackCommand.isEnabled = false
|
|
182
|
+
remoteCommandCenter?.changePlaybackRateCommand.isEnabled = false
|
|
183
|
+
remoteCommandCenter?.seekBackwardCommand.isEnabled = false
|
|
184
|
+
remoteCommandCenter?.seekForwardCommand.isEnabled = false
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
private func updateNowPlayingInfo(isPaused: Bool) {
|
|
188
|
+
var nowPlayingInfo = [String: Any]()
|
|
189
|
+
|
|
190
|
+
// Set media title and artist
|
|
191
|
+
nowPlayingInfo[MPMediaItemPropertyTitle] = recordingSettings?.notification?.title ?? "Recording in Progress"
|
|
192
|
+
nowPlayingInfo[MPMediaItemPropertyArtist] = "Audio Stream"
|
|
193
|
+
|
|
194
|
+
// Set playback state
|
|
195
|
+
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = isPaused ? 0.0 : 1.0
|
|
196
|
+
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentRecordingDuration()
|
|
197
|
+
|
|
198
|
+
// Add placeholder image if available
|
|
199
|
+
if let image = UIImage(named: "recording_icon") {
|
|
200
|
+
nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size) { size in
|
|
201
|
+
return image
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Update the info on main thread
|
|
206
|
+
DispatchQueue.main.async {
|
|
207
|
+
self.notificationView?.nowPlayingInfo = nowPlayingInfo
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
private func currentRecordingDuration() -> TimeInterval {
|
|
212
|
+
guard let startTime = startTime else { return 0 }
|
|
213
|
+
return Date().timeIntervalSince(startTime) - TimeInterval(pausedDuration)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
private func cleanupNotificationObservers() {
|
|
217
|
+
NotificationCenter.default.removeObserver(self)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
@objc private func handlePauseNotification(_ notification: Notification) {
|
|
221
|
+
// Only handle if recording and notifications are enabled
|
|
222
|
+
guard isRecording, recordingSettings?.showNotification == true else { return }
|
|
223
|
+
pauseRecording()
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
@objc private func handleResumeNotification(_ notification: Notification) {
|
|
227
|
+
// Only handle if recording and notifications are enabled
|
|
228
|
+
guard isRecording, recordingSettings?.showNotification == true else { return }
|
|
229
|
+
resumeRecording()
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
@objc private func handlePauseAction() {
|
|
233
|
+
pauseRecording()
|
|
234
|
+
updateNotificationState(isPaused: true)
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
@objc private func handleResumeAction() {
|
|
238
|
+
resumeRecording()
|
|
239
|
+
updateNotificationState(isPaused: false)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
@objc private func handleAppDidEnterBackground(_ notification: Notification) {
|
|
243
|
+
if isRecording {
|
|
244
|
+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
|
|
245
|
+
self?.notificationManager?.showInitialNotification()
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
@objc private func handleAppWillEnterForeground(_ notification: Notification) {
|
|
251
|
+
if isRecording {
|
|
252
|
+
notificationManager?.stopUpdates()
|
|
253
|
+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
|
|
254
|
+
guard let self = self else { return }
|
|
255
|
+
self.notificationManager?.startUpdates(startTime: self.startTime ?? Date())
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
private func updateNotificationState(isPaused: Bool) {
|
|
261
|
+
// Calculate current duration
|
|
262
|
+
let currentDuration: TimeInterval
|
|
263
|
+
if let startTime = startTime {
|
|
264
|
+
currentDuration = Date().timeIntervalSince(startTime) - TimeInterval(pausedDuration)
|
|
265
|
+
} else {
|
|
266
|
+
currentDuration = 0
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Update Now Playing info
|
|
270
|
+
var nowPlayingInfo = notificationView?.nowPlayingInfo ?? [:]
|
|
271
|
+
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = isPaused ? 0.0 : 1.0
|
|
272
|
+
nowPlayingInfo[MPMediaItemPropertyTitle] = isPaused ?
|
|
273
|
+
"Recording Paused" :
|
|
274
|
+
(recordingSettings?.notification?.title ?? "Recording in Progress")
|
|
275
|
+
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentDuration
|
|
276
|
+
notificationView?.nowPlayingInfo = nowPlayingInfo
|
|
277
|
+
|
|
278
|
+
// Delegate notification update to AudioNotificationManager
|
|
279
|
+
notificationManager?.updateState(isPaused: isPaused)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
private func updateMediaInfo() {
|
|
283
|
+
guard let startTime = startTime else { return }
|
|
284
|
+
|
|
285
|
+
let currentDuration = Date().timeIntervalSince(startTime) - TimeInterval(pausedDuration)
|
|
286
|
+
|
|
287
|
+
var nowPlayingInfo = notificationView?.nowPlayingInfo ?? [:]
|
|
288
|
+
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentDuration
|
|
289
|
+
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = isPaused ? 0.0 : 1.0
|
|
290
|
+
notificationView?.nowPlayingInfo = nowPlayingInfo
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/// Enables the wake lock to prevent screen dimming
|
|
294
|
+
private func enableWakeLock() {
|
|
295
|
+
guard let settings = recordingSettings,
|
|
296
|
+
settings.keepAwake, // Only proceed if keepAwake is true
|
|
297
|
+
!isWakeLockEnabled // Only proceed if wake lock isn't already enabled
|
|
298
|
+
else { return }
|
|
299
|
+
|
|
300
|
+
DispatchQueue.main.async {
|
|
301
|
+
self.wasIdleTimerDisabled = UIApplication.shared.isIdleTimerDisabled
|
|
302
|
+
UIApplication.shared.isIdleTimerDisabled = true
|
|
303
|
+
self.isWakeLockEnabled = true
|
|
304
|
+
Logger.debug("Wake lock enabled")
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/// Disables the wake lock and restores previous screen dimming state
|
|
309
|
+
private func disableWakeLock() {
|
|
310
|
+
guard let settings = recordingSettings,
|
|
311
|
+
settings.keepAwake, // Only proceed if keepAwake is true
|
|
312
|
+
isWakeLockEnabled // Only proceed if wake lock is currently enabled
|
|
313
|
+
else { return }
|
|
314
|
+
|
|
315
|
+
DispatchQueue.main.async {
|
|
316
|
+
UIApplication.shared.isIdleTimerDisabled = self.wasIdleTimerDisabled
|
|
317
|
+
self.isWakeLockEnabled = false
|
|
318
|
+
Logger.debug("Wake lock disabled")
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
83
322
|
/// Creates a new recording file.
|
|
84
323
|
/// - Returns: The URL of the newly created recording file, or nil if creation failed.
|
|
85
324
|
private func createRecordingFile() -> URL? {
|
|
@@ -201,9 +440,6 @@ class AudioStreamManager: NSObject {
|
|
|
201
440
|
do {
|
|
202
441
|
Logger.debug("Debug: Configuring audio session with sample rate: \(settings.sampleRate) Hz")
|
|
203
442
|
|
|
204
|
-
// Create an audio format with the desired sample rate
|
|
205
|
-
let desiredFormat = AVAudioFormat(commonFormat: commonFormat, sampleRate: newSettings.sampleRate, channels: UInt32(newSettings.numberOfChannels), interleaved: true)
|
|
206
|
-
|
|
207
443
|
// Check if the input node supports the desired format
|
|
208
444
|
let inputNode = audioEngine.inputNode
|
|
209
445
|
let hardwareFormat = inputNode.inputFormat(forBus: 0)
|
|
@@ -212,7 +448,11 @@ class AudioStreamManager: NSObject {
|
|
|
212
448
|
newSettings.sampleRate = session.sampleRate
|
|
213
449
|
}
|
|
214
450
|
|
|
215
|
-
try session.setCategory(.playAndRecord,
|
|
451
|
+
try session.setCategory(.playAndRecord,
|
|
452
|
+
mode: .default,
|
|
453
|
+
options: [.allowBluetooth, .defaultToSpeaker, .mixWithOthers]
|
|
454
|
+
)
|
|
455
|
+
|
|
216
456
|
try session.setPreferredSampleRate(settings.sampleRate)
|
|
217
457
|
try session.setPreferredIOBufferDuration(1024 / settings.sampleRate)
|
|
218
458
|
try session.setActive(true)
|
|
@@ -225,6 +465,7 @@ class AudioStreamManager: NSObject {
|
|
|
225
465
|
}
|
|
226
466
|
|
|
227
467
|
recordingSettings = newSettings // Update the class property with the new settings
|
|
468
|
+
enableWakeLock() // Will only enable if keepAwake is true
|
|
228
469
|
} catch {
|
|
229
470
|
Logger.debug("Error: Failed to set up audio session with preferred settings: \(error.localizedDescription)")
|
|
230
471
|
return nil
|
|
@@ -267,6 +508,10 @@ class AudioStreamManager: NSObject {
|
|
|
267
508
|
return nil
|
|
268
509
|
}
|
|
269
510
|
|
|
511
|
+
if settings.showNotification {
|
|
512
|
+
initializeNotifications()
|
|
513
|
+
}
|
|
514
|
+
|
|
270
515
|
do {
|
|
271
516
|
startTime = Date()
|
|
272
517
|
try audioEngine.start()
|
|
@@ -288,25 +533,74 @@ class AudioStreamManager: NSObject {
|
|
|
288
533
|
|
|
289
534
|
/// Pauses the current audio recording.
|
|
290
535
|
func pauseRecording() {
|
|
291
|
-
guard isRecording && !isPaused else {
|
|
292
|
-
Logger.debug("Recording is not in progress or already paused.")
|
|
293
|
-
return
|
|
294
|
-
}
|
|
536
|
+
guard isRecording && !isPaused else { return }
|
|
295
537
|
|
|
538
|
+
disableWakeLock()
|
|
296
539
|
audioEngine.pause()
|
|
297
540
|
isPaused = true
|
|
298
541
|
pauseStartTime = Date()
|
|
299
542
|
|
|
543
|
+
updateNowPlayingInfo(isPaused: true)
|
|
544
|
+
notificationManager?.updateState(isPaused: true)
|
|
545
|
+
delegate?.audioStreamManager(self, didPauseRecording: Date())
|
|
546
|
+
delegate?.audioStreamManager(self, didUpdateNotificationState: true)
|
|
547
|
+
|
|
300
548
|
Logger.debug("Recording paused.")
|
|
301
549
|
}
|
|
302
550
|
|
|
551
|
+
private func initializeNotifications() {
|
|
552
|
+
guard recordingSettings?.showNotification == true else { return }
|
|
553
|
+
|
|
554
|
+
// Setup notification manager if not already initialized
|
|
555
|
+
if notificationManager == nil {
|
|
556
|
+
UNUserNotificationCenter.current().delegate = self
|
|
557
|
+
|
|
558
|
+
notificationManager = AudioNotificationManager()
|
|
559
|
+
|
|
560
|
+
// Request permissions first
|
|
561
|
+
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
|
|
562
|
+
if granted {
|
|
563
|
+
DispatchQueue.main.async {
|
|
564
|
+
self.notificationManager?.initialize(with: self.recordingSettings?.notification)
|
|
565
|
+
self.setupNowPlayingInfo()
|
|
566
|
+
|
|
567
|
+
// Start media info update timer
|
|
568
|
+
self.mediaInfoUpdateTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
|
|
569
|
+
self?.updateMediaInfo()
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// Setup notification observers
|
|
573
|
+
NotificationCenter.default.addObserver(
|
|
574
|
+
self,
|
|
575
|
+
selector: #selector(self.handlePauseNotification),
|
|
576
|
+
name: .pauseRecording,
|
|
577
|
+
object: nil
|
|
578
|
+
)
|
|
579
|
+
|
|
580
|
+
NotificationCenter.default.addObserver(
|
|
581
|
+
self,
|
|
582
|
+
selector: #selector(self.handleResumeNotification),
|
|
583
|
+
name: .resumeRecording,
|
|
584
|
+
object: nil
|
|
585
|
+
)
|
|
586
|
+
|
|
587
|
+
// Start updates if recording is already in progress
|
|
588
|
+
if let startTime = self.startTime {
|
|
589
|
+
self.notificationManager?.startUpdates(startTime: startTime)
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
} else if let error = error {
|
|
593
|
+
Logger.debug("Failed to get notification permission: \(error.localizedDescription)")
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
303
599
|
/// Resumes the current audio recording.
|
|
304
600
|
func resumeRecording() {
|
|
305
|
-
guard isRecording && isPaused else {
|
|
306
|
-
Logger.debug("Recording is not in progress or not paused.")
|
|
307
|
-
return
|
|
308
|
-
}
|
|
601
|
+
guard isRecording && isPaused else { return }
|
|
309
602
|
|
|
603
|
+
enableWakeLock()
|
|
310
604
|
audioEngine.prepare()
|
|
311
605
|
do {
|
|
312
606
|
try audioEngine.start()
|
|
@@ -314,6 +608,12 @@ class AudioStreamManager: NSObject {
|
|
|
314
608
|
if let pauseStartTime = pauseStartTime {
|
|
315
609
|
pausedDuration += Int(Date().timeIntervalSince(pauseStartTime))
|
|
316
610
|
}
|
|
611
|
+
|
|
612
|
+
updateNowPlayingInfo(isPaused: false)
|
|
613
|
+
notificationManager?.updateState(isPaused: false)
|
|
614
|
+
delegate?.audioStreamManager(self, didResumeRecording: Date())
|
|
615
|
+
delegate?.audioStreamManager(self, didUpdateNotificationState: false)
|
|
616
|
+
|
|
317
617
|
Logger.debug("Recording resumed.")
|
|
318
618
|
} catch {
|
|
319
619
|
Logger.debug("Error: Failed to resume recording: \(error.localizedDescription)")
|
|
@@ -347,10 +647,32 @@ class AudioStreamManager: NSObject {
|
|
|
347
647
|
/// Stops the current audio recording.
|
|
348
648
|
/// - Returns: A RecordingResult object if the recording stopped successfully, or nil otherwise.
|
|
349
649
|
func stopRecording() -> RecordingResult? {
|
|
650
|
+
disableWakeLock() // Will only disable if keepAwake is true
|
|
350
651
|
audioEngine.stop()
|
|
351
652
|
audioEngine.inputNode.removeTap(onBus: 0)
|
|
352
653
|
isRecording = false
|
|
353
654
|
|
|
655
|
+
if recordingSettings?.showNotification == true {
|
|
656
|
+
// Stop and clean up timer
|
|
657
|
+
mediaInfoUpdateTimer?.invalidate()
|
|
658
|
+
mediaInfoUpdateTimer = nil
|
|
659
|
+
|
|
660
|
+
// Clean up notification manager
|
|
661
|
+
notificationManager?.stopUpdates()
|
|
662
|
+
notificationManager = nil
|
|
663
|
+
|
|
664
|
+
// Clean up media controls
|
|
665
|
+
DispatchQueue.main.async {
|
|
666
|
+
UIApplication.shared.endReceivingRemoteControlEvents()
|
|
667
|
+
self.remoteCommandCenter?.pauseCommand.isEnabled = false
|
|
668
|
+
self.remoteCommandCenter?.playCommand.isEnabled = false
|
|
669
|
+
self.notificationView?.nowPlayingInfo = nil
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
// Clean up audio session
|
|
673
|
+
try? audioSession?.setActive(false)
|
|
674
|
+
}
|
|
675
|
+
|
|
354
676
|
guard let fileURL = recordingFileURL, let startTime = startTime, let settings = recordingSettings else {
|
|
355
677
|
Logger.debug("Recording or file URL is nil.")
|
|
356
678
|
return nil
|
|
@@ -502,6 +824,22 @@ class AudioStreamManager: NSObject {
|
|
|
502
824
|
}
|
|
503
825
|
}
|
|
504
826
|
|
|
827
|
+
private func updateNotificationDuration() {
|
|
828
|
+
guard let startTime = startTime,
|
|
829
|
+
recordingSettings?.showNotification == true else { return }
|
|
830
|
+
|
|
831
|
+
let currentDuration = Date().timeIntervalSince(startTime) - TimeInterval(pausedDuration)
|
|
832
|
+
|
|
833
|
+
// Update both notification manager and media player
|
|
834
|
+
notificationManager?.updateDuration(currentDuration)
|
|
835
|
+
|
|
836
|
+
if let notificationView = notificationView {
|
|
837
|
+
var nowPlayingInfo = notificationView.nowPlayingInfo ?? [:]
|
|
838
|
+
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentDuration
|
|
839
|
+
notificationView.nowPlayingInfo = nowPlayingInfo
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
|
|
505
843
|
/// Processes the audio buffer and writes data to the file. Also handles audio processing if enabled.
|
|
506
844
|
/// - Parameters:
|
|
507
845
|
/// - buffer: The audio buffer to process.
|
|
@@ -553,6 +891,10 @@ class AudioStreamManager: NSObject {
|
|
|
553
891
|
totalDataSize += Int64(data.count)
|
|
554
892
|
// print("Total data size written: \(totalDataSize) bytes") // Debug: Check total data written
|
|
555
893
|
|
|
894
|
+
if recordingSettings?.showNotification == true {
|
|
895
|
+
updateNotificationDuration()
|
|
896
|
+
}
|
|
897
|
+
|
|
556
898
|
let currentTime = Date()
|
|
557
899
|
if let lastEmissionTime = lastEmissionTime, currentTime.timeIntervalSince(lastEmissionTime) >= emissionInterval {
|
|
558
900
|
if let startTime = startTime {
|
|
@@ -598,3 +940,35 @@ class AudioStreamManager: NSObject {
|
|
|
598
940
|
}
|
|
599
941
|
}
|
|
600
942
|
}
|
|
943
|
+
|
|
944
|
+
extension AudioStreamManager: UNUserNotificationCenterDelegate {
|
|
945
|
+
func userNotificationCenter(
|
|
946
|
+
_ center: UNUserNotificationCenter,
|
|
947
|
+
didReceive response: UNNotificationResponse,
|
|
948
|
+
withCompletionHandler completionHandler: @escaping () -> Void
|
|
949
|
+
) {
|
|
950
|
+
switch response.actionIdentifier {
|
|
951
|
+
case "PAUSE_RECORDING":
|
|
952
|
+
pauseRecording()
|
|
953
|
+
case "RESUME_RECORDING":
|
|
954
|
+
resumeRecording()
|
|
955
|
+
default:
|
|
956
|
+
break
|
|
957
|
+
}
|
|
958
|
+
completionHandler()
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
// This is needed to show notifications when app is in foreground
|
|
962
|
+
func userNotificationCenter(
|
|
963
|
+
_ center: UNUserNotificationCenter,
|
|
964
|
+
willPresent notification: UNNotification,
|
|
965
|
+
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
|
|
966
|
+
) {
|
|
967
|
+
if #available(iOS 14.0, *) {
|
|
968
|
+
completionHandler([.banner, .sound])
|
|
969
|
+
} else {
|
|
970
|
+
// For iOS 13 and earlier
|
|
971
|
+
completionHandler([.alert, .sound])
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
protocol AudioStreamManagerDelegate: AnyObject {
|
|
2
2
|
func audioStreamManager(_ manager: AudioStreamManager, didReceiveAudioData data: Data, recordingTime: TimeInterval, totalDataSize: Int64)
|
|
3
3
|
func audioStreamManager(_ manager: AudioStreamManager, didReceiveProcessingResult result: AudioAnalysisData?)
|
|
4
|
+
|
|
5
|
+
func audioStreamManager(_ manager: AudioStreamManager, didPauseRecording pauseTime: Date)
|
|
6
|
+
func audioStreamManager(_ manager: AudioStreamManager, didResumeRecording resumeTime: Date)
|
|
7
|
+
func audioStreamManager(_ manager: AudioStreamManager, didUpdateNotificationState isPaused: Bool)
|
|
4
8
|
}
|