@siteed/expo-audio-studio 2.18.6 → 3.0.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 (329) hide show
  1. package/README.md +13 -297
  2. package/index.d.ts +1 -0
  3. package/index.js +1 -0
  4. package/package.json +6 -135
  5. package/CHANGELOG.md +0 -501
  6. package/LICENSE +0 -21
  7. package/android/build.gradle +0 -129
  8. package/android/src/androidTest/assets/chorus.wav +0 -0
  9. package/android/src/androidTest/assets/jfk.wav +0 -0
  10. package/android/src/androidTest/assets/osr_us_000_0010_8k.wav +0 -0
  11. package/android/src/androidTest/assets/recorder_hello_world.wav +0 -0
  12. package/android/src/androidTest/java/net/siteed/audiostream/AudioProcessorInstrumentedTest.kt +0 -197
  13. package/android/src/androidTest/java/net/siteed/audiostream/AudioRecorderInstrumentedTest.kt +0 -541
  14. package/android/src/androidTest/java/net/siteed/audiostream/AudioRecorderPerformanceInstrumentedTest.kt +0 -234
  15. package/android/src/androidTest/java/net/siteed/audiostream/integration/AudioFocusStrategyIntegrationTest.kt +0 -332
  16. package/android/src/androidTest/java/net/siteed/audiostream/integration/BufferDurationIntegrationTest.kt +0 -324
  17. package/android/src/androidTest/java/net/siteed/audiostream/integration/CompressedOnlyOutputTest.kt +0 -253
  18. package/android/src/androidTest/java/net/siteed/audiostream/integration/DeviceDisconnectionFallbackTest.kt +0 -218
  19. package/android/src/androidTest/java/net/siteed/audiostream/integration/EventEmissionIntervalTest.kt +0 -120
  20. package/android/src/androidTest/java/net/siteed/audiostream/integration/M4aFormatTest.kt +0 -345
  21. package/android/src/androidTest/java/net/siteed/audiostream/integration/OutputControlIntegrationTest.kt +0 -340
  22. package/android/src/androidTest/java/net/siteed/audiostream/integration/PcmStreamingDurationTest.kt +0 -252
  23. package/android/src/androidTest/java/net/siteed/audiostream/integration/README.md +0 -95
  24. package/android/src/androidTest/java/net/siteed/audiostream/integration/run_integration_tests.sh +0 -43
  25. package/android/src/main/AndroidManifest.xml +0 -30
  26. package/android/src/main/java/net/siteed/audiostream/AudioAnalysisData.kt +0 -188
  27. package/android/src/main/java/net/siteed/audiostream/AudioDataEncoder.kt +0 -9
  28. package/android/src/main/java/net/siteed/audiostream/AudioDeviceManager.kt +0 -1741
  29. package/android/src/main/java/net/siteed/audiostream/AudioFileHandler.kt +0 -136
  30. package/android/src/main/java/net/siteed/audiostream/AudioFormatUtils.kt +0 -354
  31. package/android/src/main/java/net/siteed/audiostream/AudioNotificationsManager.kt +0 -439
  32. package/android/src/main/java/net/siteed/audiostream/AudioProcessor.kt +0 -2237
  33. package/android/src/main/java/net/siteed/audiostream/AudioRecorderManager.kt +0 -2141
  34. package/android/src/main/java/net/siteed/audiostream/AudioRecordingService.kt +0 -167
  35. package/android/src/main/java/net/siteed/audiostream/AudioTrimmer.kt +0 -1099
  36. package/android/src/main/java/net/siteed/audiostream/Constants.kt +0 -37
  37. package/android/src/main/java/net/siteed/audiostream/EventSender.kt +0 -7
  38. package/android/src/main/java/net/siteed/audiostream/ExpoAudioStreamModule.kt +0 -1113
  39. package/android/src/main/java/net/siteed/audiostream/FFT.kt +0 -99
  40. package/android/src/main/java/net/siteed/audiostream/Features.kt +0 -98
  41. package/android/src/main/java/net/siteed/audiostream/LogUtils.kt +0 -93
  42. package/android/src/main/java/net/siteed/audiostream/NotificationConfig.kt +0 -72
  43. package/android/src/main/java/net/siteed/audiostream/PermissionUtils.kt +0 -68
  44. package/android/src/main/java/net/siteed/audiostream/RecordingActionReceiver.kt +0 -59
  45. package/android/src/main/java/net/siteed/audiostream/RecordingConfig.kt +0 -257
  46. package/android/src/main/java/net/siteed/audiostream/WaveformConfig.kt +0 -19
  47. package/android/src/main/java/net/siteed/audiostream/WaveformRenderer.kt +0 -159
  48. package/android/src/main/res/drawable/ic_default_action_icon.xml +0 -16
  49. package/android/src/main/res/drawable/ic_microphone.xml +0 -13
  50. package/android/src/main/res/drawable/ic_pause.xml +0 -10
  51. package/android/src/main/res/drawable/ic_play.xml +0 -10
  52. package/android/src/main/res/drawable/ic_stop.xml +0 -10
  53. package/android/src/main/res/layout/notification_recording.xml +0 -37
  54. package/android/src/test/java/net/siteed/audiostream/AudioFileHandlerTest.kt +0 -279
  55. package/android/src/test/java/net/siteed/audiostream/AudioFocusStrategyTest.kt +0 -249
  56. package/android/src/test/java/net/siteed/audiostream/AudioFormatTest.kt +0 -151
  57. package/android/src/test/java/net/siteed/audiostream/AudioFormatUtilsTest.kt +0 -273
  58. package/android/src/test/java/net/siteed/audiostream/DeviceDisconnectionFallbackUnitTest.kt +0 -140
  59. package/android/src/test/resources/chorus.wav +0 -0
  60. package/android/src/test/resources/generate_test_audio.py +0 -94
  61. package/android/src/test/resources/jfk.wav +0 -0
  62. package/android/src/test/resources/osr_us_000_0010_8k.wav +0 -0
  63. package/android/src/test/resources/recorder_hello_world.wav +0 -0
  64. package/app.plugin.js +0 -3
  65. package/build/cjs/AudioAnalysis/AudioAnalysis.types.js +0 -4
  66. package/build/cjs/AudioAnalysis/AudioAnalysis.types.js.map +0 -1
  67. package/build/cjs/AudioAnalysis/extractAudioAnalysis.js +0 -210
  68. package/build/cjs/AudioAnalysis/extractAudioAnalysis.js.map +0 -1
  69. package/build/cjs/AudioAnalysis/extractAudioData.js +0 -21
  70. package/build/cjs/AudioAnalysis/extractAudioData.js.map +0 -1
  71. package/build/cjs/AudioAnalysis/extractMelSpectrogram.js +0 -92
  72. package/build/cjs/AudioAnalysis/extractMelSpectrogram.js.map +0 -1
  73. package/build/cjs/AudioAnalysis/extractPreview.js +0 -28
  74. package/build/cjs/AudioAnalysis/extractPreview.js.map +0 -1
  75. package/build/cjs/AudioAnalysis/extractWaveform.js +0 -18
  76. package/build/cjs/AudioAnalysis/extractWaveform.js.map +0 -1
  77. package/build/cjs/AudioDeviceManager.js +0 -689
  78. package/build/cjs/AudioDeviceManager.js.map +0 -1
  79. package/build/cjs/AudioRecorder.provider.js +0 -78
  80. package/build/cjs/AudioRecorder.provider.js.map +0 -1
  81. package/build/cjs/ExpoAudioStream.native.js +0 -8
  82. package/build/cjs/ExpoAudioStream.native.js.map +0 -1
  83. package/build/cjs/ExpoAudioStream.types.js +0 -11
  84. package/build/cjs/ExpoAudioStream.types.js.map +0 -1
  85. package/build/cjs/ExpoAudioStream.web.js +0 -708
  86. package/build/cjs/ExpoAudioStream.web.js.map +0 -1
  87. package/build/cjs/ExpoAudioStreamModule.js +0 -718
  88. package/build/cjs/ExpoAudioStreamModule.js.map +0 -1
  89. package/build/cjs/WebRecorder.web.js +0 -777
  90. package/build/cjs/WebRecorder.web.js.map +0 -1
  91. package/build/cjs/constants/platformLimitations.js +0 -99
  92. package/build/cjs/constants/platformLimitations.js.map +0 -1
  93. package/build/cjs/constants.js +0 -17
  94. package/build/cjs/constants.js.map +0 -1
  95. package/build/cjs/events.js +0 -29
  96. package/build/cjs/events.js.map +0 -1
  97. package/build/cjs/hooks/useAudioDevices.js +0 -179
  98. package/build/cjs/hooks/useAudioDevices.js.map +0 -1
  99. package/build/cjs/index.js +0 -58
  100. package/build/cjs/index.js.map +0 -1
  101. package/build/cjs/trimAudio.js +0 -76
  102. package/build/cjs/trimAudio.js.map +0 -1
  103. package/build/cjs/useAudioRecorder.js +0 -518
  104. package/build/cjs/useAudioRecorder.js.map +0 -1
  105. package/build/cjs/utils/BlobFix.js +0 -502
  106. package/build/cjs/utils/BlobFix.js.map +0 -1
  107. package/build/cjs/utils/audioProcessing.js +0 -136
  108. package/build/cjs/utils/audioProcessing.js.map +0 -1
  109. package/build/cjs/utils/cleanNativeOptions.js +0 -22
  110. package/build/cjs/utils/cleanNativeOptions.js.map +0 -1
  111. package/build/cjs/utils/concatenateBuffers.js +0 -25
  112. package/build/cjs/utils/concatenateBuffers.js.map +0 -1
  113. package/build/cjs/utils/convertPCMToFloat32.js +0 -124
  114. package/build/cjs/utils/convertPCMToFloat32.js.map +0 -1
  115. package/build/cjs/utils/crc32.js +0 -52
  116. package/build/cjs/utils/crc32.js.map +0 -1
  117. package/build/cjs/utils/encodingToBitDepth.js +0 -17
  118. package/build/cjs/utils/encodingToBitDepth.js.map +0 -1
  119. package/build/cjs/utils/getWavFileInfo.js +0 -96
  120. package/build/cjs/utils/getWavFileInfo.js.map +0 -1
  121. package/build/cjs/utils/writeWavHeader.js +0 -88
  122. package/build/cjs/utils/writeWavHeader.js.map +0 -1
  123. package/build/cjs/workers/InlineFeaturesExtractor.web.js +0 -859
  124. package/build/cjs/workers/InlineFeaturesExtractor.web.js.map +0 -1
  125. package/build/cjs/workers/inlineAudioWebWorker.web.js +0 -184
  126. package/build/cjs/workers/inlineAudioWebWorker.web.js.map +0 -1
  127. package/build/esm/AudioAnalysis/AudioAnalysis.types.js +0 -3
  128. package/build/esm/AudioAnalysis/AudioAnalysis.types.js.map +0 -1
  129. package/build/esm/AudioAnalysis/extractAudioAnalysis.js +0 -202
  130. package/build/esm/AudioAnalysis/extractAudioAnalysis.js.map +0 -1
  131. package/build/esm/AudioAnalysis/extractAudioData.js +0 -14
  132. package/build/esm/AudioAnalysis/extractAudioData.js.map +0 -1
  133. package/build/esm/AudioAnalysis/extractMelSpectrogram.js +0 -89
  134. package/build/esm/AudioAnalysis/extractMelSpectrogram.js.map +0 -1
  135. package/build/esm/AudioAnalysis/extractPreview.js +0 -25
  136. package/build/esm/AudioAnalysis/extractPreview.js.map +0 -1
  137. package/build/esm/AudioAnalysis/extractWaveform.js +0 -11
  138. package/build/esm/AudioAnalysis/extractWaveform.js.map +0 -1
  139. package/build/esm/AudioDeviceManager.js +0 -682
  140. package/build/esm/AudioDeviceManager.js.map +0 -1
  141. package/build/esm/AudioRecorder.provider.js +0 -40
  142. package/build/esm/AudioRecorder.provider.js.map +0 -1
  143. package/build/esm/ExpoAudioStream.native.js +0 -6
  144. package/build/esm/ExpoAudioStream.native.js.map +0 -1
  145. package/build/esm/ExpoAudioStream.types.js +0 -8
  146. package/build/esm/ExpoAudioStream.types.js.map +0 -1
  147. package/build/esm/ExpoAudioStream.web.js +0 -704
  148. package/build/esm/ExpoAudioStream.web.js.map +0 -1
  149. package/build/esm/ExpoAudioStreamModule.js +0 -713
  150. package/build/esm/ExpoAudioStreamModule.js.map +0 -1
  151. package/build/esm/WebRecorder.web.js +0 -773
  152. package/build/esm/WebRecorder.web.js.map +0 -1
  153. package/build/esm/constants/platformLimitations.js +0 -90
  154. package/build/esm/constants/platformLimitations.js.map +0 -1
  155. package/build/esm/constants.js +0 -14
  156. package/build/esm/constants.js.map +0 -1
  157. package/build/esm/events.js +0 -21
  158. package/build/esm/events.js.map +0 -1
  159. package/build/esm/hooks/useAudioDevices.js +0 -176
  160. package/build/esm/hooks/useAudioDevices.js.map +0 -1
  161. package/build/esm/index.js +0 -20
  162. package/build/esm/index.js.map +0 -1
  163. package/build/esm/trimAudio.js +0 -69
  164. package/build/esm/trimAudio.js.map +0 -1
  165. package/build/esm/useAudioRecorder.js +0 -512
  166. package/build/esm/useAudioRecorder.js.map +0 -1
  167. package/build/esm/utils/BlobFix.js +0 -498
  168. package/build/esm/utils/BlobFix.js.map +0 -1
  169. package/build/esm/utils/audioProcessing.js +0 -133
  170. package/build/esm/utils/audioProcessing.js.map +0 -1
  171. package/build/esm/utils/cleanNativeOptions.js +0 -19
  172. package/build/esm/utils/cleanNativeOptions.js.map +0 -1
  173. package/build/esm/utils/concatenateBuffers.js +0 -21
  174. package/build/esm/utils/concatenateBuffers.js.map +0 -1
  175. package/build/esm/utils/convertPCMToFloat32.js +0 -120
  176. package/build/esm/utils/convertPCMToFloat32.js.map +0 -1
  177. package/build/esm/utils/crc32.js +0 -50
  178. package/build/esm/utils/crc32.js.map +0 -1
  179. package/build/esm/utils/encodingToBitDepth.js +0 -13
  180. package/build/esm/utils/encodingToBitDepth.js.map +0 -1
  181. package/build/esm/utils/getWavFileInfo.js +0 -92
  182. package/build/esm/utils/getWavFileInfo.js.map +0 -1
  183. package/build/esm/utils/writeWavHeader.js +0 -84
  184. package/build/esm/utils/writeWavHeader.js.map +0 -1
  185. package/build/esm/workers/InlineFeaturesExtractor.web.js +0 -856
  186. package/build/esm/workers/InlineFeaturesExtractor.web.js.map +0 -1
  187. package/build/esm/workers/inlineAudioWebWorker.web.js +0 -181
  188. package/build/esm/workers/inlineAudioWebWorker.web.js.map +0 -1
  189. package/build/types/AudioAnalysis/AudioAnalysis.types.d.ts +0 -196
  190. package/build/types/AudioAnalysis/AudioAnalysis.types.d.ts.map +0 -1
  191. package/build/types/AudioAnalysis/extractAudioAnalysis.d.ts +0 -74
  192. package/build/types/AudioAnalysis/extractAudioAnalysis.d.ts.map +0 -1
  193. package/build/types/AudioAnalysis/extractAudioData.d.ts +0 -3
  194. package/build/types/AudioAnalysis/extractAudioData.d.ts.map +0 -1
  195. package/build/types/AudioAnalysis/extractMelSpectrogram.d.ts +0 -14
  196. package/build/types/AudioAnalysis/extractMelSpectrogram.d.ts.map +0 -1
  197. package/build/types/AudioAnalysis/extractPreview.d.ts +0 -11
  198. package/build/types/AudioAnalysis/extractPreview.d.ts.map +0 -1
  199. package/build/types/AudioAnalysis/extractWaveform.d.ts +0 -8
  200. package/build/types/AudioAnalysis/extractWaveform.d.ts.map +0 -1
  201. package/build/types/AudioDeviceManager.d.ts +0 -187
  202. package/build/types/AudioDeviceManager.d.ts.map +0 -1
  203. package/build/types/AudioRecorder.provider.d.ts +0 -11
  204. package/build/types/AudioRecorder.provider.d.ts.map +0 -1
  205. package/build/types/ExpoAudioStream.native.d.ts +0 -3
  206. package/build/types/ExpoAudioStream.native.d.ts.map +0 -1
  207. package/build/types/ExpoAudioStream.types.d.ts +0 -738
  208. package/build/types/ExpoAudioStream.types.d.ts.map +0 -1
  209. package/build/types/ExpoAudioStream.web.d.ts +0 -96
  210. package/build/types/ExpoAudioStream.web.d.ts.map +0 -1
  211. package/build/types/ExpoAudioStreamModule.d.ts +0 -3
  212. package/build/types/ExpoAudioStreamModule.d.ts.map +0 -1
  213. package/build/types/WebRecorder.web.d.ts +0 -198
  214. package/build/types/WebRecorder.web.d.ts.map +0 -1
  215. package/build/types/constants/platformLimitations.d.ts +0 -40
  216. package/build/types/constants/platformLimitations.d.ts.map +0 -1
  217. package/build/types/constants.d.ts +0 -11
  218. package/build/types/constants.d.ts.map +0 -1
  219. package/build/types/events.d.ts +0 -26
  220. package/build/types/events.d.ts.map +0 -1
  221. package/build/types/hooks/useAudioDevices.d.ts +0 -15
  222. package/build/types/hooks/useAudioDevices.d.ts.map +0 -1
  223. package/build/types/index.d.ts +0 -18
  224. package/build/types/index.d.ts.map +0 -1
  225. package/build/types/trimAudio.d.ts +0 -25
  226. package/build/types/trimAudio.d.ts.map +0 -1
  227. package/build/types/useAudioRecorder.d.ts +0 -22
  228. package/build/types/useAudioRecorder.d.ts.map +0 -1
  229. package/build/types/utils/BlobFix.d.ts +0 -9
  230. package/build/types/utils/BlobFix.d.ts.map +0 -1
  231. package/build/types/utils/audioProcessing.d.ts +0 -24
  232. package/build/types/utils/audioProcessing.d.ts.map +0 -1
  233. package/build/types/utils/cleanNativeOptions.d.ts +0 -15
  234. package/build/types/utils/cleanNativeOptions.d.ts.map +0 -1
  235. package/build/types/utils/concatenateBuffers.d.ts +0 -8
  236. package/build/types/utils/concatenateBuffers.d.ts.map +0 -1
  237. package/build/types/utils/convertPCMToFloat32.d.ts +0 -13
  238. package/build/types/utils/convertPCMToFloat32.d.ts.map +0 -1
  239. package/build/types/utils/crc32.d.ts +0 -7
  240. package/build/types/utils/crc32.d.ts.map +0 -1
  241. package/build/types/utils/encodingToBitDepth.d.ts +0 -5
  242. package/build/types/utils/encodingToBitDepth.d.ts.map +0 -1
  243. package/build/types/utils/getWavFileInfo.d.ts +0 -26
  244. package/build/types/utils/getWavFileInfo.d.ts.map +0 -1
  245. package/build/types/utils/writeWavHeader.d.ts +0 -34
  246. package/build/types/utils/writeWavHeader.d.ts.map +0 -1
  247. package/build/types/workers/InlineFeaturesExtractor.web.d.ts +0 -2
  248. package/build/types/workers/InlineFeaturesExtractor.web.d.ts.map +0 -1
  249. package/build/types/workers/inlineAudioWebWorker.web.d.ts +0 -2
  250. package/build/types/workers/inlineAudioWebWorker.web.d.ts.map +0 -1
  251. package/expo-module.config.json +0 -10
  252. package/ios/AudioAnalysisData.swift +0 -74
  253. package/ios/AudioDeviceManager.swift +0 -670
  254. package/ios/AudioNotificationManager.swift +0 -154
  255. package/ios/AudioProcessingHelpers.swift +0 -743
  256. package/ios/AudioProcessor.swift +0 -1151
  257. package/ios/AudioStreamError.swift +0 -7
  258. package/ios/AudioStreamManager.swift +0 -2369
  259. package/ios/AudioStreamManagerDelegate.swift +0 -16
  260. package/ios/DataPoint.swift +0 -54
  261. package/ios/DecodingConfig.swift +0 -59
  262. package/ios/ExpoAudioStream.podspec +0 -33
  263. package/ios/ExpoAudioStreamModule.swift +0 -1019
  264. package/ios/ExpoAudioStudioTests/AudioFileHandlerTests.swift +0 -338
  265. package/ios/ExpoAudioStudioTests/AudioFormatUtilsTests.swift +0 -331
  266. package/ios/ExpoAudioStudioTests/AudioTestHelpers.swift +0 -130
  267. package/ios/ExpoAudioStudioTests/CompressedOnlyOutputTests.swift +0 -294
  268. package/ios/ExpoAudioStudioTests/EventEmissionIntervalTests.swift +0 -105
  269. package/ios/ExpoAudioStudioTests/Info.plist +0 -22
  270. package/ios/ExpoAudioStudioTests/README.md +0 -39
  271. package/ios/ExpoAudioStudioTests/SimpleAudioTest.swift +0 -98
  272. package/ios/ExpoAudioStudioTests/TestAudioGenerator.swift +0 -75
  273. package/ios/FFT.swift +0 -62
  274. package/ios/Features.swift +0 -95
  275. package/ios/ISSUE_IOS.md +0 -68
  276. package/ios/Logger.swift +0 -39
  277. package/ios/NotificationExtension.swift +0 -15
  278. package/ios/RecordingResult.swift +0 -22
  279. package/ios/RecordingSettings.swift +0 -308
  280. package/ios/WaveformExtractor.swift +0 -105
  281. package/ios/tests/README.md +0 -41
  282. package/ios/tests/integration/buffer_and_fallback_test.swift +0 -178
  283. package/ios/tests/integration/buffer_duration_test.swift +0 -185
  284. package/ios/tests/integration/compressed_only_output_test.swift +0 -271
  285. package/ios/tests/integration/output_control_test.swift +0 -322
  286. package/ios/tests/integration/run_integration_tests.sh +0 -37
  287. package/ios/tests/opus_support_test_macos.swift +0 -154
  288. package/ios/tests/standalone/audio_processing_test.swift +0 -144
  289. package/ios/tests/standalone/audio_recording_test.swift +0 -277
  290. package/ios/tests/standalone/audio_streaming_test.swift +0 -249
  291. package/ios/tests/standalone/standalone_test.swift +0 -144
  292. package/plugin/build/index.cjs +0 -194
  293. package/plugin/build/index.d.cts +0 -22
  294. package/plugin/build/index.js +0 -194
  295. package/plugin/src/index.ts +0 -285
  296. package/plugin/tsconfig.json +0 -10
  297. package/plugin/tsconfig.tsbuildinfo +0 -1
  298. package/src/AudioAnalysis/AudioAnalysis.types.ts +0 -224
  299. package/src/AudioAnalysis/extractAudioAnalysis.ts +0 -344
  300. package/src/AudioAnalysis/extractAudioData.ts +0 -17
  301. package/src/AudioAnalysis/extractMelSpectrogram.ts +0 -154
  302. package/src/AudioAnalysis/extractPreview.ts +0 -34
  303. package/src/AudioAnalysis/extractWaveform.ts +0 -22
  304. package/src/AudioDeviceManager.ts +0 -803
  305. package/src/AudioRecorder.provider.tsx +0 -57
  306. package/src/ExpoAudioStream.native.ts +0 -6
  307. package/src/ExpoAudioStream.types.ts +0 -874
  308. package/src/ExpoAudioStream.web.ts +0 -905
  309. package/src/ExpoAudioStreamModule.ts +0 -990
  310. package/src/WebRecorder.web.ts +0 -1005
  311. package/src/constants/platformLimitations.ts +0 -118
  312. package/src/constants.ts +0 -18
  313. package/src/events.ts +0 -60
  314. package/src/hooks/useAudioDevices.ts +0 -213
  315. package/src/index.ts +0 -54
  316. package/src/trimAudio.ts +0 -94
  317. package/src/types/crc-32.d.ts +0 -9
  318. package/src/useAudioRecorder.tsx +0 -766
  319. package/src/utils/BlobFix.ts +0 -561
  320. package/src/utils/audioProcessing.ts +0 -205
  321. package/src/utils/cleanNativeOptions.ts +0 -18
  322. package/src/utils/concatenateBuffers.ts +0 -24
  323. package/src/utils/convertPCMToFloat32.ts +0 -170
  324. package/src/utils/crc32.ts +0 -59
  325. package/src/utils/encodingToBitDepth.ts +0 -18
  326. package/src/utils/getWavFileInfo.ts +0 -132
  327. package/src/utils/writeWavHeader.ts +0 -115
  328. package/src/workers/InlineFeaturesExtractor.web.tsx +0 -855
  329. package/src/workers/inlineAudioWebWorker.web.tsx +0 -180
@@ -1,439 +0,0 @@
1
- package net.siteed.audiostream
2
-
3
- import android.app.Notification
4
- import android.app.NotificationChannel
5
- import android.app.NotificationManager
6
- import android.app.PendingIntent
7
- import android.content.Context
8
- import android.content.Intent
9
- import android.graphics.Color
10
- import android.os.Build
11
- import android.os.Handler
12
- import android.os.Looper
13
- import android.os.SystemClock
14
- import android.util.Log
15
- import android.view.View
16
- import android.widget.RemoteViews
17
- import androidx.core.app.NotificationCompat
18
- import java.lang.ref.WeakReference
19
- import java.util.Locale
20
- import java.util.concurrent.atomic.AtomicBoolean
21
- import java.util.Objects
22
- import net.siteed.audiostream.LogUtils
23
-
24
- class AudioNotificationManager private constructor(context: Context) {
25
- companion object {
26
- private const val CLASS_NAME = "AudioNotificationManager"
27
- private const val WAVEFORM_UPDATE_INTERVAL = 100L
28
- private const val UPDATE_INTERVAL = 1000L
29
-
30
- @Volatile
31
- private var instance: AudioNotificationManager? = null
32
-
33
- fun getInstance(context: Context): AudioNotificationManager {
34
- return instance ?: synchronized(this) {
35
- instance ?: AudioNotificationManager(context).also { instance = it }
36
- }
37
- }
38
- }
39
-
40
- private val contextRef = WeakReference(context.applicationContext)
41
- private val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
42
- private val mainHandler = Handler(Looper.getMainLooper())
43
- private val isUpdating = AtomicBoolean(false)
44
- private val isPaused = AtomicBoolean(false)
45
-
46
- private var lastRemoteViewsUpdate = 0L
47
- private var consecutiveUpdateFailures = 0
48
- private var lastSuccessfulUpdate: Long = 0
49
- private val maxUpdateFailures = 3
50
- private val remoteViewsRefreshInterval = 10000L // Refresh RemoteViews every 10 seconds
51
-
52
- private lateinit var notificationBuilder: NotificationCompat.Builder
53
- private lateinit var remoteViews: RemoteViews
54
- private lateinit var recordingConfig: RecordingConfig
55
- private var recordingStartTime: Long = 0
56
- private var pausedDuration: Long = 0
57
- private var lastPauseTime: Long = 0
58
- private var lastWaveformUpdate: Long = 0
59
- private val waveformRenderer = WaveformRenderer()
60
- private var lastNotificationHash: Int? = null
61
-
62
- fun initialize(config: RecordingConfig) {
63
- recordingConfig = config
64
- createNotificationChannel()
65
- initializeNotification()
66
- }
67
-
68
- private fun createNotificationChannel() {
69
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
70
- val channel = NotificationChannel(
71
- recordingConfig.notification.channelId,
72
- recordingConfig.notification.channelName,
73
- NotificationManager.IMPORTANCE_LOW
74
- ).apply {
75
- description = recordingConfig.notification.channelDescription
76
- enableLights(false)
77
- enableVibration(false)
78
- setSound(null, null)
79
- setShowBadge(false)
80
- vibrationPattern = null
81
- }
82
-
83
- notificationManager.createNotificationChannel(channel)
84
- }
85
- }
86
-
87
- private fun initializeNotification() {
88
- val context = contextRef.get() ?: return
89
- try {
90
- remoteViews = RemoteViews(context.packageName, R.layout.notification_recording)
91
- remoteViews.apply {
92
- setTextViewText(R.id.notification_title, recordingConfig.notification?.title)
93
- setTextViewText(R.id.notification_text, recordingConfig.notification?.text)
94
- setTextViewText(R.id.notification_duration, formatDuration(0))
95
- setViewVisibility(
96
- R.id.notification_waveform,
97
- if (recordingConfig.showWaveformInNotification &&
98
- recordingConfig.notification?.waveform != null) View.VISIBLE else View.GONE
99
- )
100
- }
101
-
102
- buildNotification(context)
103
- } catch (e: Exception) {
104
- LogUtils.e(CLASS_NAME, "Failed to initialize notification", e)
105
- }
106
- }
107
-
108
- private fun buildNotification(context: Context) {
109
- val iconResId = recordingConfig.notification?.icon?.let {
110
- getResourceIdByName(it)
111
- } ?: R.drawable.ic_microphone
112
-
113
- val pendingIntent = PendingIntent.getActivity(
114
- context,
115
- 0,
116
- context.packageManager.getLaunchIntentForPackage(context.packageName),
117
- PendingIntent.FLAG_IMMUTABLE
118
- )
119
-
120
- // Configure notification builder with settings optimized for recording service
121
- // and wearable device compatibility
122
- notificationBuilder = NotificationCompat.Builder(context, recordingConfig.notification.channelId)
123
- .setSmallIcon(iconResId)
124
- .setContentIntent(pendingIntent)
125
- .setOngoing(true) // Notification cannot be dismissed by user
126
- .setPriority(NotificationCompat.PRIORITY_HIGH)
127
- .setCategory(NotificationCompat.CATEGORY_SERVICE)
128
- .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
129
- .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE)
130
- .setCustomContentView(remoteViews)
131
- .setCustomBigContentView(remoteViews)
132
- .setStyle(NotificationCompat.DecoratedCustomViewStyle())
133
- // Prevent repeated alerts and vibrations
134
- .setOnlyAlertOnce(true) // Only alert on first notification
135
- .setVibrate(null) // Disable vibration
136
- .setDefaults(0) // Clear all default notification behaviors
137
- .setLocalOnly(true) // Prevent notification from appearing on wearable devices
138
-
139
- addNotificationActions(context)
140
- }
141
-
142
- private fun addNotificationActions(context: Context) {
143
- // Clear existing actions first
144
- notificationBuilder.clearActions()
145
-
146
- // Create pause action
147
- val pauseIntent = Intent(context, RecordingActionReceiver::class.java).apply {
148
- action = RecordingActionReceiver.ACTION_PAUSE_RECORDING
149
- }
150
- val pausePendingIntent = PendingIntent.getBroadcast(
151
- context,
152
- 0,
153
- pauseIntent,
154
- PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
155
- )
156
-
157
- // Create resume action
158
- val resumeIntent = Intent(context, RecordingActionReceiver::class.java).apply {
159
- action = RecordingActionReceiver.ACTION_RESUME_RECORDING
160
- }
161
- val resumePendingIntent = PendingIntent.getBroadcast(
162
- context,
163
- 1,
164
- resumeIntent,
165
- PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
166
- )
167
-
168
- // Add only one pause/resume action based on current state (if enabled)
169
- if (recordingConfig.notification.showPauseResumeActions) {
170
- if (isPaused.get()) {
171
- notificationBuilder.addAction(
172
- R.drawable.ic_play,
173
- "Resume",
174
- resumePendingIntent
175
- )
176
- } else {
177
- notificationBuilder.addAction(
178
- R.drawable.ic_pause,
179
- "Pause",
180
- pausePendingIntent
181
- )
182
- }
183
- }
184
-
185
- // Add configured custom actions (only if they don't already exist)
186
- val existingActions = mutableSetOf<String>()
187
- recordingConfig.notification.actions.forEach { action ->
188
- if (existingActions.add(action.intentAction)) { // Only add if action is unique
189
- val intent = Intent(context, RecordingActionReceiver::class.java).apply {
190
- this.action = action.intentAction
191
- }
192
- val pendingIntent = PendingIntent.getBroadcast(
193
- context,
194
- action.intentAction.hashCode(),
195
- intent,
196
- PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
197
- )
198
- val actionIconResId = action.icon?.let { getResourceIdByName(it) }
199
- ?: R.drawable.ic_default_action_icon
200
- notificationBuilder.addAction(actionIconResId, action.title, pendingIntent)
201
- }
202
- }
203
- }
204
-
205
- private fun updateNotificationActions() {
206
- val context = contextRef.get() ?: return
207
- try {
208
- // Clear existing actions
209
- notificationBuilder.clearActions()
210
- // Add updated actions
211
- addNotificationActions(context)
212
-
213
- // Update the notification
214
- val updatedNotification = notificationBuilder
215
- .setCustomContentView(remoteViews)
216
- .setCustomBigContentView(remoteViews)
217
- .build()
218
-
219
- notificationManager.notify(recordingConfig.notification.notificationId, updatedNotification)
220
- } catch (e: Exception) {
221
- LogUtils.e(CLASS_NAME, "Failed to update notification actions", e)
222
- }
223
- }
224
-
225
- fun startUpdates(startTime: Long) {
226
- recordingStartTime = startTime
227
- pausedDuration = 0
228
- isPaused.set(false)
229
- updateNotificationActions() // Update actions when starting
230
- if (!isUpdating.getAndSet(true)) {
231
- scheduleUpdate()
232
- }
233
- }
234
-
235
- private fun scheduleUpdate() {
236
- mainHandler.postDelayed({
237
- if (isUpdating.get() && !isPaused.get()) {
238
- updateNotification()
239
- scheduleUpdate()
240
- }
241
- }, UPDATE_INTERVAL)
242
- }
243
-
244
- fun updateNotification(audioData: FloatArray? = null) {
245
- val context = contextRef.get() ?: return
246
-
247
- try {
248
- val currentTime = SystemClock.elapsedRealtime()
249
-
250
- // Calculate current notification state
251
- val recordingDuration = if (isPaused.get()) {
252
- lastPauseTime - recordingStartTime - pausedDuration
253
- } else {
254
- System.currentTimeMillis() - recordingStartTime - pausedDuration
255
- }
256
-
257
- // Create a hash of the current notification state
258
- val currentHash = Objects.hash(
259
- recordingConfig.notification.title,
260
- recordingConfig.notification.text,
261
- formatDuration(recordingDuration),
262
- isPaused.get()
263
- )
264
-
265
- val needsRemoteViewsRefresh = currentTime - lastRemoteViewsUpdate >= remoteViewsRefreshInterval ||
266
- consecutiveUpdateFailures >= maxUpdateFailures
267
-
268
- // Only update if content changed or refresh needed
269
- if (currentHash == lastNotificationHash && !needsRemoteViewsRefresh) {
270
- // Update waveform only if needed
271
- if (shouldUpdateWaveform(audioData, currentTime)) {
272
- updateWaveformOnly(audioData)
273
- }
274
- return
275
- }
276
-
277
- lastNotificationHash = currentHash
278
-
279
- // Only recreate RemoteViews periodically or after failures
280
- if (needsRemoteViewsRefresh) {
281
- remoteViews = RemoteViews(context.packageName, R.layout.notification_recording)
282
- lastRemoteViewsUpdate = currentTime
283
- consecutiveUpdateFailures = 0
284
- }
285
-
286
- // Update RemoteViews content
287
- remoteViews.apply {
288
- setTextViewText(R.id.notification_title, recordingConfig.notification.title)
289
- setTextViewText(R.id.notification_text, recordingConfig.notification.text)
290
- setTextViewText(R.id.notification_duration, formatDuration(recordingDuration))
291
-
292
- // Update waveform if needed
293
- if (recordingConfig.showWaveformInNotification &&
294
- audioData != null &&
295
- audioData.isNotEmpty() &&
296
- currentTime - lastWaveformUpdate >= WAVEFORM_UPDATE_INTERVAL
297
- ) {
298
- try {
299
- val waveformBitmap = waveformRenderer.generateWaveform(audioData, recordingConfig.notification.waveform)
300
- setImageViewBitmap(R.id.notification_waveform, waveformBitmap)
301
- lastWaveformUpdate = currentTime
302
- } catch (e: Exception) {
303
- LogUtils.e(CLASS_NAME, "Error generating waveform", e)
304
- }
305
- }
306
- }
307
-
308
- // Only rebuild notification if RemoteViews was refreshed
309
- if (needsRemoteViewsRefresh) {
310
- notificationBuilder
311
- .setCustomContentView(remoteViews)
312
- .setCustomBigContentView(remoteViews)
313
- .setOnlyAlertOnce(true)
314
- .setOngoing(true)
315
- addNotificationActions(context)
316
- }
317
-
318
- // Update the notification with disabled alerts
319
- notificationManager.notify(
320
- recordingConfig.notification.notificationId,
321
- notificationBuilder
322
- .setOnlyAlertOnce(true)
323
- .setVibrate(null)
324
- .setDefaults(0)
325
- .build()
326
- )
327
-
328
- lastSuccessfulUpdate = currentTime
329
- consecutiveUpdateFailures = 0
330
-
331
- } catch (e: Exception) {
332
- LogUtils.e(CLASS_NAME, "Error updating notification", e)
333
- consecutiveUpdateFailures++
334
-
335
- if (consecutiveUpdateFailures >= maxUpdateFailures) {
336
- reinitializeNotification()
337
- }
338
- }
339
- }
340
-
341
- private fun shouldUpdateWaveform(audioData: FloatArray?, currentTime: Long): Boolean {
342
- return recordingConfig.showWaveformInNotification &&
343
- audioData != null &&
344
- audioData.isNotEmpty() &&
345
- currentTime - lastWaveformUpdate >= WAVEFORM_UPDATE_INTERVAL
346
- }
347
-
348
- private fun updateWaveformOnly(audioData: FloatArray?) {
349
- if (audioData == null) return
350
-
351
- try {
352
- val waveformBitmap = waveformRenderer.generateWaveform(audioData, recordingConfig.notification.waveform)
353
- remoteViews.setImageViewBitmap(R.id.notification_waveform, waveformBitmap)
354
- lastWaveformUpdate = SystemClock.elapsedRealtime()
355
-
356
- notificationManager.notify(
357
- recordingConfig.notification.notificationId,
358
- notificationBuilder
359
- .setCustomContentView(remoteViews)
360
- .setCustomBigContentView(remoteViews)
361
- .setOnlyAlertOnce(true)
362
- .setVibrate(null)
363
- .setDefaults(0)
364
- .build()
365
- )
366
- } catch (e: Exception) {
367
- LogUtils.e(CLASS_NAME, "Error updating waveform", e)
368
- }
369
- }
370
-
371
- private fun reinitializeNotification() {
372
- try {
373
- val context = contextRef.get() ?: return
374
-
375
- // Force a RemoteViews refresh
376
- remoteViews = RemoteViews(context.packageName, R.layout.notification_recording)
377
- lastRemoteViewsUpdate = SystemClock.elapsedRealtime()
378
-
379
- buildNotification(context)
380
-
381
- notificationManager.notify(
382
- recordingConfig.notification.notificationId,
383
- notificationBuilder.build()
384
- )
385
-
386
- consecutiveUpdateFailures = 0
387
- LogUtils.d(CLASS_NAME, "Successfully reinitialized notification")
388
- } catch (e: Exception) {
389
- LogUtils.e(CLASS_NAME, "Failed to reinitialize notification", e)
390
- }
391
- }
392
-
393
- fun getNotification(): Notification = notificationBuilder.build()
394
-
395
- fun pauseUpdates() {
396
- isPaused.set(true)
397
- lastPauseTime = System.currentTimeMillis()
398
- updateNotificationActions() // Update actions when pausing
399
- }
400
-
401
- fun resumeUpdates() {
402
- pausedDuration += System.currentTimeMillis() - lastPauseTime
403
- isPaused.set(false)
404
- updateNotificationActions() // Update actions when resuming
405
- scheduleUpdate()
406
- }
407
-
408
- fun stopUpdates() {
409
- isUpdating.set(false)
410
- mainHandler.removeCallbacksAndMessages(null)
411
- notificationManager.cancel(recordingConfig.notification.notificationId)
412
- cleanup()
413
- }
414
-
415
- private fun cleanup() {
416
- recordingStartTime = 0
417
- pausedDuration = 0
418
- lastPauseTime = 0
419
- lastWaveformUpdate = 0
420
- lastSuccessfulUpdate = 0
421
- lastRemoteViewsUpdate = 0
422
- consecutiveUpdateFailures = 0
423
- isPaused.set(false)
424
- isUpdating.set(false)
425
- }
426
-
427
- private fun getResourceIdByName(resourceName: String): Int {
428
- val context = contextRef.get() ?: return R.drawable.ic_default_action_icon
429
- return context.resources.getIdentifier(resourceName, "drawable", context.packageName)
430
- .takeIf { it != 0 } ?: R.drawable.ic_default_action_icon
431
- }
432
-
433
- private fun formatDuration(durationMs: Long): String {
434
- val totalSeconds = durationMs / 1000
435
- val minutes = totalSeconds / 60
436
- val seconds = totalSeconds % 60
437
- return String.format(Locale.US, "%02d:%02d", minutes, seconds)
438
- }
439
- }