@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.
Files changed (374) hide show
  1. package/.cursorrules +112 -0
  2. package/CHANGELOG.md +13 -17
  3. package/README.md +5 -0
  4. package/android/build/.transforms/78826170c90a6133e31ab67915bce724/transformed/classes/classes_dex/classes.dex +0 -0
  5. package/android/build/.transforms/7c8f45a7979f7f92ba944aa5701c97dc/transformed/classes/classes_dex/classes.dex +0 -0
  6. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioFormatInfo.dex +0 -0
  7. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioFormatUtils.dex +0 -0
  8. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioNotificationManager$Companion.dex +0 -0
  9. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioNotificationManager.dex +0 -0
  10. package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor$AudioData.dex +0 -0
  11. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor$Companion.dex +0 -0
  12. package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor$extractMFCC$powerSpectrum$2.dex +0 -0
  13. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor.dex +0 -0
  14. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecorderManager$Companion.dex +0 -0
  15. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecorderManager.dex +0 -0
  16. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecordingService$Companion.dex +0 -0
  17. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecordingService$notificationManager$2.dex +0 -0
  18. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecordingService.dex +0 -0
  19. 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
  20. 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
  21. 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
  22. 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
  23. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$13.dex +0 -0
  24. 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
  25. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$15.dex +0 -0
  26. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$16.dex +0 -0
  27. 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
  28. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$18.dex +0 -0
  29. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$19.dex +0 -0
  30. 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
  31. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$20.dex +0 -0
  32. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$21.dex +0 -0
  33. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$22.dex +0 -0
  34. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$23.dex +0 -0
  35. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$24.dex +0 -0
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$4.dex +0 -0
  47. 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
  48. 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
  49. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule.dex +0 -0
  50. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/NotificationAction.dex +0 -0
  51. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/NotificationConfig$Companion.dex +0 -0
  52. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/NotificationConfig.dex +0 -0
  53. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/PermissionUtils.dex +0 -0
  54. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingActionReceiver$Companion.dex +0 -0
  55. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingActionReceiver$handleRecordingAction$notificationPromise$1.dex +0 -0
  56. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingActionReceiver.dex +0 -0
  57. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingConfig$Companion.dex +0 -0
  58. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingConfig.dex +0 -0
  59. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/RecordingConfigKt.dex +0 -0
  60. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformConfig.dex +0 -0
  61. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformRenderer$RenderConfig$Companion.dex +0 -0
  62. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformRenderer$RenderConfig.dex +0 -0
  63. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformRenderer$Style.dex +0 -0
  64. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformRenderer$WhenMappings.dex +0 -0
  65. package/android/build/.transforms/dfac117b512a43872cc8ea7286b996cc/transformed/debug/debug_dex/net/siteed/audiostream/WaveformRenderer.dex +0 -0
  66. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +23 -2
  67. package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
  68. package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
  69. package/android/build/intermediates/compile_symbol_list/debug/R.txt +11 -0
  70. package/android/build/intermediates/compiled_local_resources/debug/out/drawable_ic_default_action_icon.xml.flat +0 -0
  71. package/android/build/intermediates/compiled_local_resources/debug/out/drawable_ic_microphone.xml.flat +0 -0
  72. package/android/build/intermediates/compiled_local_resources/debug/out/drawable_ic_pause.xml.flat +0 -0
  73. package/android/build/intermediates/compiled_local_resources/debug/out/drawable_ic_play.xml.flat +0 -0
  74. package/android/build/intermediates/compiled_local_resources/debug/out/drawable_ic_stop.xml.flat +0 -0
  75. package/android/build/intermediates/compiled_local_resources/debug/out/layout_notification_recording.xml.flat +0 -0
  76. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +8 -1
  77. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +1 -1
  78. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  79. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  80. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
  81. package/android/build/intermediates/java_res/debug/out/META-INF/siteed-expo-audio-stream_debug.kotlin_module +0 -0
  82. package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +11 -0
  83. package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +51 -8
  84. package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +23 -2
  85. package/android/build/intermediates/packaged_res/debug/drawable/ic_default_action_icon.xml +16 -0
  86. package/android/build/intermediates/packaged_res/debug/drawable/ic_microphone.xml +13 -0
  87. package/android/build/intermediates/packaged_res/debug/drawable/ic_pause.xml +10 -0
  88. package/android/build/intermediates/packaged_res/debug/drawable/ic_play.xml +10 -0
  89. package/android/build/intermediates/packaged_res/debug/drawable/ic_stop.xml +10 -0
  90. package/android/build/intermediates/packaged_res/debug/layout/notification_recording.xml +37 -0
  91. package/android/build/intermediates/runtime_library_classes_dir/debug/META-INF/siteed-expo-audio-stream_debug.kotlin_module +0 -0
  92. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioFormatInfo.class +0 -0
  93. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioFormatUtils.class +0 -0
  94. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioNotificationManager$Companion.class +0 -0
  95. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioNotificationManager.class +0 -0
  96. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioProcessor$AudioData.class +0 -0
  97. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioProcessor$Companion.class +0 -0
  98. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioProcessor$extractMFCC$powerSpectrum$2.class +0 -0
  99. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioProcessor.class +0 -0
  100. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioRecorderManager$Companion.class +0 -0
  101. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioRecorderManager.class +0 -0
  102. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioRecordingService$Companion.class +0 -0
  103. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioRecordingService$notificationManager$2.class +0 -0
  104. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/AudioRecordingService.class +0 -0
  105. 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
  106. 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
  107. 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
  108. 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
  109. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$13.class +0 -0
  110. 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
  111. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$15.class +0 -0
  112. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$16.class +0 -0
  113. 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
  114. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$18.class +0 -0
  115. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$19.class +0 -0
  116. 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
  117. 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
  118. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$21.class +0 -0
  119. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$22.class +0 -0
  120. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$23.class +0 -0
  121. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$24.class +0 -0
  122. 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
  123. 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
  124. 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
  125. 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
  126. 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
  127. 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
  128. 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
  129. 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
  130. 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
  131. 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
  132. 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
  133. 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
  134. 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
  135. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule.class +0 -0
  136. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/NotificationAction.class +0 -0
  137. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/NotificationConfig$Companion.class +0 -0
  138. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/NotificationConfig.class +0 -0
  139. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/PermissionUtils.class +0 -0
  140. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingActionReceiver$Companion.class +0 -0
  141. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingActionReceiver$handleRecordingAction$notificationPromise$1.class +0 -0
  142. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingActionReceiver.class +0 -0
  143. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingConfig$Companion.class +0 -0
  144. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingConfig.class +0 -0
  145. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/RecordingConfigKt.class +0 -0
  146. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformConfig.class +0 -0
  147. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformRenderer$RenderConfig$Companion.class +0 -0
  148. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformRenderer$RenderConfig.class +0 -0
  149. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformRenderer$Style.class +0 -0
  150. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformRenderer$WhenMappings.class +0 -0
  151. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/WaveformRenderer.class +0 -0
  152. package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
  153. package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +11 -0
  154. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  155. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  156. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  157. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  158. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  159. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  160. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  161. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  162. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  163. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  164. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  165. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  166. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  167. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  168. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  169. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  170. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  171. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  172. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
  173. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
  174. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
  175. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
  176. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
  177. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
  178. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  179. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  180. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  181. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  182. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  183. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  184. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab +0 -0
  185. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream +0 -0
  186. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len +0 -0
  187. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len +0 -0
  188. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at +0 -0
  189. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i +0 -0
  190. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len +0 -0
  191. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  192. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  193. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  194. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  195. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  196. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  197. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  198. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  199. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  200. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  201. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  202. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  203. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  204. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  205. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  206. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  207. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  208. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  209. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  210. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  211. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  212. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  213. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  214. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  215. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  216. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  217. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  218. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  219. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  220. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  221. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  222. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  223. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  224. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  225. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  226. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  227. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  228. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
  229. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  230. package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  231. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  232. package/android/build/outputs/logs/manifest-merger-debug-report.txt +51 -7
  233. package/android/build/tmp/kotlin-classes/debug/META-INF/siteed-expo-audio-stream_debug.kotlin_module +0 -0
  234. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioFormatInfo.class +0 -0
  235. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioFormatUtils.class +0 -0
  236. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioNotificationManager$Companion.class +0 -0
  237. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioNotificationManager.class +0 -0
  238. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioProcessor$AudioData.class +0 -0
  239. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioProcessor$Companion.class +0 -0
  240. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioProcessor$extractMFCC$powerSpectrum$2.class +0 -0
  241. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioProcessor.class +0 -0
  242. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioRecorderManager$Companion.class +0 -0
  243. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioRecorderManager.class +0 -0
  244. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioRecordingService$Companion.class +0 -0
  245. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioRecordingService$notificationManager$2.class +0 -0
  246. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/AudioRecordingService.class +0 -0
  247. 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
  248. 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
  249. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$11.class +0 -0
  250. 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
  251. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$13.class +0 -0
  252. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$14.class +0 -0
  253. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$15.class +0 -0
  254. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$16.class +0 -0
  255. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$17.class +0 -0
  256. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$18.class +0 -0
  257. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$19.class +0 -0
  258. 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
  259. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$20.class +0 -0
  260. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$21.class +0 -0
  261. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$22.class +0 -0
  262. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$23.class +0 -0
  263. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$24.class +0 -0
  264. 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
  265. 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
  266. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$5.class +0 -0
  267. 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
  268. 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
  269. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$16$$inlined$AsyncFunction$8.class +0 -0
  270. 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
  271. 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
  272. 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
  273. 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
  274. 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
  275. 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
  276. 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
  277. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule.class +0 -0
  278. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/NotificationAction.class +0 -0
  279. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/NotificationConfig$Companion.class +0 -0
  280. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/NotificationConfig.class +0 -0
  281. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/PermissionUtils.class +0 -0
  282. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingActionReceiver$Companion.class +0 -0
  283. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingActionReceiver$handleRecordingAction$notificationPromise$1.class +0 -0
  284. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingActionReceiver.class +0 -0
  285. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingConfig$Companion.class +0 -0
  286. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingConfig.class +0 -0
  287. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/RecordingConfigKt.class +0 -0
  288. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformConfig.class +0 -0
  289. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformRenderer$RenderConfig$Companion.class +0 -0
  290. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformRenderer$RenderConfig.class +0 -0
  291. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformRenderer$Style.class +0 -0
  292. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformRenderer$WhenMappings.class +0 -0
  293. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/WaveformRenderer.class +0 -0
  294. package/android/src/main/AndroidManifest.xml +24 -2
  295. package/android/src/main/java/net/siteed/audiostream/AudioFormatUtils.kt +76 -1
  296. package/android/src/main/java/net/siteed/audiostream/AudioNotificationsManager.kt +362 -0
  297. package/android/src/main/java/net/siteed/audiostream/AudioProcessor.kt +8 -4
  298. package/android/src/main/java/net/siteed/audiostream/AudioRecorderManager.kt +477 -277
  299. package/android/src/main/java/net/siteed/audiostream/AudioRecordingService.kt +71 -0
  300. package/android/src/main/java/net/siteed/audiostream/ExpoAudioStreamModule.kt +78 -7
  301. package/android/src/main/java/net/siteed/audiostream/NotificationConfig.kt +70 -0
  302. package/android/src/main/java/net/siteed/audiostream/PermissionUtils.kt +41 -6
  303. package/android/src/main/java/net/siteed/audiostream/RecordingActionReceiver.kt +59 -0
  304. package/android/src/main/java/net/siteed/audiostream/RecordingConfig.kt +138 -1
  305. package/android/src/main/java/net/siteed/audiostream/WaveformConfig.kt +19 -0
  306. package/android/src/main/java/net/siteed/audiostream/WaveformRenderer.kt +159 -0
  307. package/android/src/main/res/drawable/ic_default_action_icon.xml +16 -0
  308. package/android/src/main/res/drawable/ic_microphone.xml +13 -0
  309. package/android/src/main/res/drawable/ic_pause.xml +10 -0
  310. package/android/src/main/res/drawable/ic_play.xml +10 -0
  311. package/android/src/main/res/drawable/ic_stop.xml +10 -0
  312. package/android/src/main/res/layout/notification_recording.xml +37 -0
  313. package/build/ExpoAudioStream.types.d.ts +36 -0
  314. package/build/ExpoAudioStream.types.d.ts.map +1 -1
  315. package/build/ExpoAudioStream.types.js.map +1 -1
  316. package/build/useAudioRecorder.d.ts.map +1 -1
  317. package/build/useAudioRecorder.js +32 -11
  318. package/build/useAudioRecorder.js.map +1 -1
  319. package/ios/AudioNotificationManager.swift +135 -0
  320. package/ios/AudioStreamManager.swift +387 -13
  321. package/ios/AudioStreamManagerDelegate.swift +4 -0
  322. package/ios/ExpoAudioStreamModule.swift +66 -38
  323. package/ios/NotificationExtension.swift +15 -0
  324. package/ios/RecordingSettings.swift +83 -5
  325. package/package.json +1 -1
  326. package/plugin/build/index.d.ts +1 -3
  327. package/plugin/build/index.js +103 -10
  328. package/plugin/src/index.ts +124 -21
  329. package/publish.sh +36 -3
  330. package/src/ExpoAudioStream.types.ts +108 -13
  331. package/src/useAudioRecorder.tsx +46 -12
  332. package/android/build/.transforms/871e87a512fbb418f6a6523c40225bac/transformed/classes/classes_dex/classes.dex +0 -0
  333. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioFormatUtils.dex +0 -0
  334. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor$Companion.dex +0 -0
  335. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioProcessor.dex +0 -0
  336. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/AudioRecorderManager.dex +0 -0
  337. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$13.dex +0 -0
  338. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$15.dex +0 -0
  339. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$16.dex +0 -0
  340. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$18.dex +0 -0
  341. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunctionWithPromise$4.dex +0 -0
  342. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/ExpoAudioStreamModule.dex +0 -0
  343. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/PermissionUtils.dex +0 -0
  344. package/android/build/.transforms/99bb16aff51bfafd6c73c1b96e3e0dcf/transformed/debug/debug_dex/net/siteed/audiostream/RecordingConfig.dex +0 -0
  345. package/android/build/.transforms/a758925c83c348fb1544431cf45e6a05/transformed/classes/classes_dex/classes.dex +0 -0
  346. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$13.class +0 -0
  347. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$15.class +0 -0
  348. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$16.class +0 -0
  349. package/android/build/intermediates/runtime_library_classes_dir/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$18.class +0 -0
  350. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values +0 -0
  351. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.s +0 -1
  352. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$13.class +0 -0
  353. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$14.class +0 -0
  354. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$15.class +0 -0
  355. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$16.class +0 -0
  356. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$17.class +0 -0
  357. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$18.class +0 -0
  358. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$5.class +0 -0
  359. package/android/build/tmp/kotlin-classes/debug/net/siteed/audiostream/ExpoAudioStreamModule$definition$lambda$14$$inlined$AsyncFunction$8.class +0 -0
  360. /package/android/build/.transforms/{871e87a512fbb418f6a6523c40225bac → 78826170c90a6133e31ab67915bce724}/results.bin +0 -0
  361. /package/android/build/.transforms/{a758925c83c348fb1544431cf45e6a05 → 7c8f45a7979f7f92ba944aa5701c97dc}/results.bin +0 -0
  362. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/results.bin +0 -0
  363. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioAnalysisData$AmplitudeRange.dex +0 -0
  364. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioAnalysisData$SpeakerChange.dex +0 -0
  365. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioAnalysisData.dex +0 -0
  366. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioDataEncoder.dex +0 -0
  367. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/AudioFileHandler.dex +0 -0
  368. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/BuildConfig.dex +0 -0
  369. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/Constants.dex +0 -0
  370. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/DataPoint.dex +0 -0
  371. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/EventSender.dex +0 -0
  372. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/FFT.dex +0 -0
  373. /package/android/build/.transforms/{99bb16aff51bfafd6c73c1b96e3e0dcf → dfac117b512a43872cc8ea7286b996cc}/transformed/debug/debug_dex/net/siteed/audiostream/Features.dex +0 -0
  374. /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
- @RequiresApi(Build.VERSION_CODES.R)
56
- fun startRecording(options: Map<String, Any?>, promise: Promise) {
57
- if (!permissionUtils.checkRecordingPermission()) {
58
- promise.reject("PERMISSION_DENIED", "Recording permission has not been granted", null)
59
- return
60
- }
61
-
62
- if (isRecording.get() && !isPaused.get()) {
63
- promise.reject("ALREADY_RECORDING", "Recording is already in progress", null)
64
- return
65
- }
66
-
67
- // Extract and filter features
68
- val featuresMap = options["features"] as? Map<*, *>
69
- val features = featuresMap?.filterKeys { it is String }
70
- ?.filterValues { it is Boolean }
71
- ?.mapKeys { it.key as String }
72
- ?.mapValues { it.value as Boolean }
73
- ?: emptyMap()
74
-
75
- // Initialize the recording configuration
76
- var tempRecordingConfig = RecordingConfig(
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
- // Update recordingConfig with potentially new encoding
161
- recordingConfig = tempRecordingConfig
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
- // Check if selected audio format is supported
165
- if (!isAudioFormatSupported(tempRecordingConfig.sampleRate, tempRecordingConfig.channels, audioFormat)) {
166
- Log.e(Constants.TAG, "Selected audio format not supported, falling back to 16-bit PCM")
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
- // Initialize the AudioRecord if it's a new recording or if it's not currently paused
193
- if (audioRecord == null || !isPaused.get()) {
194
- Log.d(Constants.TAG, "AudioFormat: $audioFormat, BufferSize: $bufferSizeInBytes")
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
- "INITIALIZATION_FAILED",
206
- "Failed to initialize the audio recorder",
207
- null
102
+ "INVALID_CONFIG",
103
+ configResult.exceptionOrNull()?.message ?: "Invalid configuration",
104
+ configResult.exceptionOrNull()
208
105
  )
209
106
  return
210
107
  }
211
- }
212
108
 
213
- streamUuid = java.util.UUID.randomUUID().toString()
214
- audioFile = File(filesDir, "audio_${streamUuid}.${fileExtension}")
109
+ val (tempRecordingConfig, audioFormatInfo) = configResult.getOrNull()!!
110
+ recordingConfig = tempRecordingConfig
111
+ audioFormat = audioFormatInfo.format
112
+ mimeType = audioFormatInfo.mimeType
215
113
 
216
- try {
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
- audioProcessor.resetCumulativeAmplitudeRange()
116
+ if (!initializeBufferSize(promise)) return
231
117
 
232
- audioRecord?.startRecording()
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
- if (!isPaused.get()) {
239
- recordingStartTime =
240
- System.currentTimeMillis() // Only reset start time if it's not a resume
241
- }
122
+ if (!startRecordingProcess(promise)) return
242
123
 
243
- recordingThread = Thread { recordingProcess() }.apply { start() }
244
-
245
- val result = bundleOf(
246
- "fileUri" to audioFile?.toURI().toString(),
247
- "channels" to recordingConfig.channels,
248
- "bitDepth" to when (recordingConfig.encoding) {
249
- "pcm_8bit" -> 8
250
- "pcm_16bit" -> 16
251
- "pcm_32bit" -> 32
252
- else -> 16 // Default to 16 if the encoding is not recognized
253
- },
254
- "sampleRate" to recordingConfig.sampleRate,
255
- "mimeType" to mimeType
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 = if (channels == 1) AudioFormat.CHANNEL_IN_MONO else AudioFormat.CHANNEL_IN_STEREO
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 = recordingConfig.sampleRate * recordingConfig.channels * when (recordingConfig.encoding) {
330
- "pcm_8bit" -> 1
331
- "pcm_16bit" -> 2
332
- "pcm_32bit" -> 4
333
- else -> 2 // Default to 2 bytes per sample if the encoding is not recognized
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 = fileSize - Constants.WAV_HEADER_SIZE // Assuming header is always 44 bytes
421
- val byteRate = recordingConfig.sampleRate * recordingConfig.channels * (if (recordingConfig.encoding == "pcm_8bit") 8 else 16) / 8
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
- "audio/opus", "audio/aac" -> getCompressedAudioDuration(audioFile)
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
- Log.i(Constants.TAG, "Starting recording process...")
451
- FileOutputStream(audioFile, true).use { fos ->
452
- // Buffer to accumulate data
453
- val accumulatedAudioData = ByteArrayOutputStream()
454
- audioFileHandler.writeWavHeader(
455
- accumulatedAudioData,
456
- recordingConfig.sampleRate,
457
- recordingConfig.channels,
458
- when (recordingConfig.encoding) {
459
- "pcm_8bit" -> 8
460
- "pcm_16bit" -> 16
461
- "pcm_32bit" -> 32
462
- else -> 16 // Default to 16 if the encoding is not recognized
463
- }
464
- )
465
- // Write audio data directly to the file
466
- val audioData = ByteArray(bufferSizeInBytes)
467
- Log.d(Constants.TAG, "Entering recording loop")
468
- while (isRecording.get() && !Thread.currentThread().isInterrupted) {
469
- if (isPaused.get()) {
470
- // If recording is paused, skip reading from the microphone
471
- continue
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
- val bytesRead = synchronized(audioRecordLock) {
475
- // Only synchronize the read operation and the check
476
- audioRecord?.let {
477
- if (it.state != AudioRecord.STATE_INITIALIZED) {
478
- Log.e(Constants.TAG, "AudioRecord not initialized")
479
- return@let -1
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
- } ?: -1 // Handle null case
487
- }
488
- if (bytesRead > 0) {
489
- fos.write(audioData, 0, bytesRead)
490
- totalDataSize += bytesRead
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
- Log.d(Constants.TAG, "Bytes written to file: $bytesRead")
668
+ Log.d(Constants.TAG, "Bytes written to file: $bytesRead")
669
+ }
504
670
  }
505
671
  }
506
- }
507
- // Update the WAV header to reflect the actual data size
508
- audioFile?.let { file ->
509
- audioFileHandler.updateWavHeader(file)
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 = (from * 1000) / (recordingConfig.sampleRate * recordingConfig.channels * (if (recordingConfig.encoding == "pcm_8bit") 8 else 16) / 8)
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
- private fun getCompressedAudioDuration(file: File?): Long {
575
- // Placeholder function for fetching duration from a compressed audio file
576
- // This would depend on how you store or can retrieve duration info for compressed formats
577
- return 0L // Implement this based on your specific requirements
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
  }