@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,257 +0,0 @@
1
- package net.siteed.audiostream
2
-
3
- import android.media.AudioFormat
4
- import android.os.Build
5
- import java.io.File
6
-
7
- // New output configuration structure
8
- data class OutputConfig(
9
- val primary: PrimaryOutput = PrimaryOutput(),
10
- val compressed: CompressedOutput = CompressedOutput()
11
- ) {
12
- data class PrimaryOutput(
13
- val enabled: Boolean = true,
14
- val format: String = "wav"
15
- )
16
-
17
- data class CompressedOutput(
18
- val enabled: Boolean = false,
19
- val format: String = "aac",
20
- val bitrate: Int = 128000,
21
- val preferRawStream: Boolean = false
22
- )
23
-
24
- companion object {
25
- fun fromMap(map: Map<String, Any?>?): OutputConfig {
26
- if (map == null) return OutputConfig()
27
-
28
- val primaryMap = map.getTypedMap<Any?>("primary") { true }
29
- val compressedMap = map.getTypedMap<Any?>("compressed") { true }
30
-
31
- val primary = PrimaryOutput(
32
- enabled = primaryMap.getBooleanOrDefault("enabled", true),
33
- format = primaryMap.getStringOrDefault("format", "wav")
34
- )
35
-
36
- val compressed = CompressedOutput(
37
- enabled = compressedMap.getBooleanOrDefault("enabled", false),
38
- format = compressedMap.getStringOrDefault("format", "aac").lowercase(),
39
- bitrate = compressedMap.getNumberOrDefault("bitrate", 128000),
40
- preferRawStream = compressedMap.getBooleanOrDefault("preferRawStream", false)
41
- )
42
-
43
- return OutputConfig(primary = primary, compressed = compressed)
44
- }
45
- }
46
- }
47
-
48
- data class RecordingConfig(
49
- val sampleRate: Int = Constants.DEFAULT_SAMPLE_RATE,
50
- val channels: Int = 1,
51
- val encoding: String = "pcm_16bit",
52
- val keepAwake: Boolean = true,
53
- val interval: Long = Constants.DEFAULT_INTERVAL,
54
- val intervalAnalysis: Long = Constants.DEFAULT_INTERVAL_ANALYSIS,
55
- val enableProcessing: Boolean = false,
56
- val segmentDurationMs: Int = 100,
57
- val showNotification: Boolean = false,
58
- val showWaveformInNotification: Boolean = false,
59
- val notification: NotificationConfig = NotificationConfig(),
60
- val features: Map<String, Boolean> = emptyMap(),
61
- val output: OutputConfig = OutputConfig(),
62
- val autoResumeAfterInterruption: Boolean = false,
63
- val outputDirectory: String? = null,
64
- val filename: String? = null,
65
- val deviceId: String? = null,
66
- val deviceDisconnectionBehavior: String? = null,
67
- val audioFocusStrategy: String? = null,
68
- val bufferDurationSeconds: Double? = null,
69
- ) {
70
- companion object {
71
- fun fromMap(options: Map<String, Any?>?): Result<Pair<RecordingConfig, AudioFormatInfo>> {
72
- if (options == null) {
73
- val defaultConfig = RecordingConfig()
74
- val defaultFormat = AudioFormatInfo(
75
- format = AudioFormat.ENCODING_PCM_16BIT,
76
- mimeType = "audio/wav",
77
- fileExtension = "wav"
78
- )
79
- return Result.success(Pair(defaultConfig, defaultFormat))
80
- }
81
-
82
- // Extract features using type-safe helper
83
- val features = options.getTypedMap<Boolean>("features") { it is Boolean }
84
-
85
- // Parse notification config using type-safe helper
86
- val notificationMap = options.getTypedMap<Any?>("notification") { true }
87
- val notificationConfig = NotificationConfig.fromMap(notificationMap)
88
-
89
- // Parse output config
90
- val outputMap = options.getTypedMap<Any?>("output") { true }
91
- val outputConfig = OutputConfig.fromMap(outputMap)
92
-
93
- // Validate bitrate if compression is enabled
94
- if (outputConfig.compressed.enabled) {
95
- when {
96
- outputConfig.compressed.bitrate < 8000 -> return Result.failure(
97
- IllegalArgumentException("Bitrate must be at least 8000 bps")
98
- )
99
- outputConfig.compressed.bitrate > 960000 -> return Result.failure(
100
- IllegalArgumentException("Bitrate cannot exceed 960000 bps")
101
- )
102
- }
103
- }
104
-
105
- // Only validate directory if it's provided
106
- val outputDirectory = options["outputDirectory"] as? String
107
- if (outputDirectory != null) {
108
- // Clean up the directory path by removing file:// protocol and normalizing
109
- val cleanDirectory = outputDirectory
110
- .replace(Regex("^file://"), "")
111
- .trim('/')
112
- .replace("//", "/")
113
-
114
- val directory = File(cleanDirectory)
115
- if (!directory.exists()) {
116
- return Result.failure(IllegalArgumentException("Directory does not exist: $cleanDirectory"))
117
- }
118
- if (!directory.isDirectory) {
119
- return Result.failure(IllegalArgumentException("Path is not a directory: $cleanDirectory"))
120
- }
121
- if (!directory.canWrite()) {
122
- return Result.failure(IllegalArgumentException("Directory is not writable: $cleanDirectory"))
123
- }
124
- }
125
-
126
- // Get device-related settings
127
- val deviceId = options["deviceId"] as? String
128
- val deviceDisconnectionBehavior = options["deviceDisconnectionBehavior"] as? String
129
-
130
- // Get Android-specific settings
131
- val androidConfig = options["android"] as? Map<String, Any>
132
- val audioFocusStrategy = androidConfig?.get("audioFocusStrategy") as? String
133
-
134
- // Initialize the recording configuration with cleaned directory path
135
- val tempRecordingConfig = RecordingConfig(
136
- sampleRate = options.getNumberOrDefault("sampleRate", Constants.DEFAULT_SAMPLE_RATE),
137
- channels = options.getNumberOrDefault("channels", 1),
138
- encoding = options.getStringOrDefault("encoding", "pcm_16bit"),
139
- keepAwake = options.getBooleanOrDefault("keepAwake", true),
140
- // Enforce minimum intervals to prevent excessive CPU usage
141
- interval = maxOf(Constants.MIN_INTERVAL, options.getNumberOrDefault("interval", Constants.DEFAULT_INTERVAL)),
142
- intervalAnalysis = maxOf(Constants.MIN_INTERVAL, options.getNumberOrDefault("intervalAnalysis", Constants.DEFAULT_INTERVAL_ANALYSIS)),
143
- enableProcessing = options.getBooleanOrDefault("enableProcessing", false),
144
- segmentDurationMs = options.getNumberOrDefault("segmentDurationMs", 100),
145
- showNotification = options.getBooleanOrDefault("showNotification", false),
146
- showWaveformInNotification = options.getBooleanOrDefault("showWaveformInNotification", false),
147
- notification = notificationConfig,
148
- features = features,
149
- output = outputConfig,
150
- autoResumeAfterInterruption = options.getBooleanOrDefault("autoResumeAfterInterruption", false),
151
- outputDirectory = outputDirectory?.let {
152
- it.replace(Regex("^file://"), "")
153
- .trim('/')
154
- .replace("//", "/")
155
- },
156
- filename = options["filename"] as? String,
157
- deviceId = deviceId,
158
- deviceDisconnectionBehavior = deviceDisconnectionBehavior,
159
- audioFocusStrategy = audioFocusStrategy,
160
- bufferDurationSeconds = (options["bufferDurationSeconds"] as? Number)?.toDouble(),
161
- )
162
-
163
- // Validate sample rate and channels
164
- if (tempRecordingConfig.sampleRate !in listOf(16000, 44100, 48000)) {
165
- return Result.failure(
166
- IllegalArgumentException("Sample rate must be one of 16000, 44100, or 48000 Hz")
167
- )
168
- }
169
- if (tempRecordingConfig.channels !in 1..2) {
170
- return Result.failure(
171
- IllegalArgumentException("Channels must be either 1 (Mono) or 2 (Stereo)")
172
- )
173
- }
174
-
175
- // Set encoding and file extension
176
- val audioFormatInfo = when (tempRecordingConfig.encoding) {
177
- "pcm_8bit" -> AudioFormatInfo(
178
- format = AudioFormat.ENCODING_PCM_8BIT,
179
- mimeType = "audio/wav",
180
- fileExtension = "wav"
181
- )
182
- "pcm_16bit" -> AudioFormatInfo(
183
- format = AudioFormat.ENCODING_PCM_16BIT,
184
- mimeType = "audio/wav",
185
- fileExtension = "wav"
186
- )
187
- "pcm_32bit" -> AudioFormatInfo(
188
- format = AudioFormat.ENCODING_PCM_FLOAT,
189
- mimeType = "audio/wav",
190
- fileExtension = "wav"
191
- )
192
- "opus" -> {
193
- if (Build.VERSION.SDK_INT < 29) {
194
- return Result.failure(
195
- IllegalArgumentException("Opus encoding not supported on this Android version.")
196
- )
197
- }
198
- AudioFormatInfo(
199
- format = if (Build.VERSION.SDK_INT >= 29) 20 else AudioFormat.ENCODING_DEFAULT, // 20 is ENCODING_OPUS
200
- mimeType = "audio/opus",
201
- fileExtension = "opus"
202
- )
203
- }
204
- "aac_lc" -> AudioFormatInfo(
205
- format = AudioFormat.ENCODING_AAC_LC,
206
- mimeType = "audio/aac",
207
- fileExtension = "aac"
208
- )
209
- else -> AudioFormatInfo(
210
- format = AudioFormat.ENCODING_DEFAULT,
211
- mimeType = "audio/wav",
212
- fileExtension = "wav"
213
- )
214
- }
215
-
216
- return Result.success(Pair(tempRecordingConfig, audioFormatInfo))
217
- }
218
- }
219
- }
220
-
221
- // Extension functions for type-safe map access
222
- private inline fun <reified T> Map<String, Any?>.getTypedMap(
223
- key: String,
224
- predicate: (Any?) -> Boolean
225
- ): Map<String, T> {
226
- return (this[key] as? Map<*, *>)?.mapNotNull { (k, v) ->
227
- if (k is String && predicate(v)) {
228
- k to (v as T)
229
- } else null
230
- }?.toMap() ?: emptyMap()
231
- }
232
-
233
- private fun Map<String, Any?>.getStringOrDefault(key: String, default: String): String {
234
- return this[key] as? String ?: default
235
- }
236
-
237
- private fun Map<String, Any?>.getBooleanOrDefault(key: String, default: Boolean): Boolean {
238
- return this[key] as? Boolean ?: default
239
- }
240
-
241
- private fun Map<String, Any?>.getNumberOrDefault(key: String, default: Int): Int {
242
- return (this[key] as? Number)?.toInt() ?: default
243
- }
244
-
245
- private fun Map<String, Any?>.getNumberOrDefault(key: String, default: Long): Long {
246
- return (this[key] as? Number)?.toLong() ?: default
247
- }
248
-
249
- private fun Map<String, Any?>.getNumberOrDefault(key: String, default: Double): Double {
250
- return (this[key] as? Number)?.toDouble() ?: default
251
- }
252
-
253
- data class AudioFormatInfo(
254
- val format: Int,
255
- val mimeType: String,
256
- val fileExtension: String
257
- )
@@ -1,19 +0,0 @@
1
- package net.siteed.audiostream
2
-
3
- /**
4
- * Configuration for the notification waveform visualization
5
- * @property color The color of the waveform (e.g., "#FFFFFF" for white)
6
- * @property opacity Opacity of the waveform (0.0-1.0)
7
- * @property strokeWidth Width of the waveform line (default: 1.5f)
8
- * @property style Drawing style: "stroke" for outline, "fill" for solid
9
- * @property mirror Whether to mirror the waveform (symmetrical display)
10
- * @property height Height of the waveform view in dp (default: 64)
11
- */
12
- data class WaveformConfig(
13
- val color: String = "#FFFFFF",
14
- val opacity: Float = 1.0f,
15
- val strokeWidth: Float = 1.5f,
16
- val style: String = "stroke", // "stroke" or "fill"
17
- val mirror: Boolean = true,
18
- val height: Int = 64
19
- )
@@ -1,159 +0,0 @@
1
- // WaveformRenderer.kt
2
- package net.siteed.audiostream
3
-
4
- import android.graphics.Bitmap
5
- import android.graphics.Canvas
6
- import android.graphics.Color
7
- import android.graphics.Paint
8
- import android.graphics.Path
9
- import kotlin.math.abs
10
-
11
- class WaveformRenderer {
12
- private enum class Style {
13
- STROKE,
14
- FILL
15
- }
16
-
17
- private data class RenderConfig(
18
- val color: Int = Color.WHITE,
19
- val opacity: Float = 1.0f,
20
- val strokeWidth: Float = 1.5f,
21
- val style: Style = Style.STROKE,
22
- val mirror: Boolean = true,
23
- val height: Int = 64
24
- ) {
25
- companion object {
26
- fun fromConfig(config: WaveformConfig?): RenderConfig {
27
- if (config == null) return RenderConfig()
28
-
29
- return RenderConfig(
30
- color = try {
31
- Color.parseColor(config.color)
32
- } catch (e: Exception) {
33
- Color.WHITE
34
- },
35
- opacity = config.opacity.coerceIn(0f, 1f),
36
- strokeWidth = config.strokeWidth.coerceAtLeast(0.5f),
37
- style = when (config.style.lowercase()) {
38
- "fill" -> Style.FILL
39
- else -> Style.STROKE
40
- },
41
- mirror = config.mirror,
42
- height = config.height.coerceIn(32, 128)
43
- )
44
- }
45
- }
46
- }
47
-
48
- fun generateWaveform(audioData: FloatArray, config: WaveformConfig?): Bitmap {
49
- return generateWaveform(audioData, RenderConfig.fromConfig(config))
50
- }
51
-
52
- fun e(audioData: FloatArray): Bitmap {
53
- return generateWaveform(audioData, RenderConfig())
54
- }
55
-
56
- private fun generateWaveform(audioData: FloatArray, config: RenderConfig): Bitmap {
57
- val width = 400 // Fixed width for notification
58
- val height = config.height
59
- val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
60
- val canvas = Canvas(bitmap)
61
-
62
- val paint = Paint().apply {
63
- color = config.color
64
- alpha = (config.opacity * 255).toInt()
65
- strokeWidth = config.strokeWidth
66
- isAntiAlias = true
67
- style = when (config.style) {
68
- Style.FILL -> Paint.Style.FILL
69
- Style.STROKE -> Paint.Style.STROKE
70
- }
71
- strokeCap = Paint.Cap.ROUND
72
- }
73
-
74
- canvas.drawColor(Color.TRANSPARENT)
75
-
76
- val centerY = height / 2f
77
- val pointsPerSegment = (audioData.size / width.toFloat()).coerceAtLeast(1f)
78
- val path = Path()
79
-
80
- // Calculate max amplitude for scaling
81
- val maxAmplitude = audioData.maxOf { abs(it) }.coerceAtLeast(0.01f)
82
- val scaleFactor = (height * 0.4f) / maxAmplitude
83
-
84
- drawWaveform(path, audioData, width, centerY, pointsPerSegment, scaleFactor)
85
-
86
- if (config.mirror) {
87
- drawMirroredWaveform(path, audioData, width, centerY, pointsPerSegment, scaleFactor)
88
- }
89
-
90
- // Add shadow for filled style
91
- if (config.style == Style.FILL) {
92
- paint.setShadowLayer(4f, 0f, 2f, Color.argb(50, 0, 0, 0))
93
- }
94
-
95
- canvas.drawPath(path, paint)
96
- return bitmap
97
- }
98
-
99
- private fun drawWaveform(
100
- path: Path,
101
- audioData: FloatArray,
102
- width: Int,
103
- centerY: Float,
104
- pointsPerSegment: Float,
105
- scaleFactor: Float
106
- ) {
107
- var firstPoint = true
108
- for (i in 0 until width) {
109
- val startIdx = (i * pointsPerSegment).toInt()
110
- val endIdx = ((i + 1) * pointsPerSegment).toInt().coerceAtMost(audioData.size)
111
-
112
- val avgAmplitude = calculateAverageAmplitude(audioData, startIdx, endIdx, scaleFactor)
113
-
114
- val x = i.toFloat()
115
- val y = centerY - avgAmplitude
116
-
117
- if (firstPoint) {
118
- path.moveTo(x, y)
119
- firstPoint = false
120
- } else {
121
- path.lineTo(x, y)
122
- }
123
- }
124
- }
125
-
126
- private fun drawMirroredWaveform(
127
- path: Path,
128
- audioData: FloatArray,
129
- width: Int,
130
- centerY: Float,
131
- pointsPerSegment: Float,
132
- scaleFactor: Float
133
- ) {
134
- for (i in width - 1 downTo 0) {
135
- val startIdx = (i * pointsPerSegment).toInt()
136
- val endIdx = ((i + 1) * pointsPerSegment).toInt().coerceAtMost(audioData.size)
137
-
138
- val avgAmplitude = calculateAverageAmplitude(audioData, startIdx, endIdx, scaleFactor)
139
- path.lineTo(i.toFloat(), centerY + avgAmplitude)
140
- }
141
- path.close()
142
- }
143
-
144
- private fun calculateAverageAmplitude(
145
- audioData: FloatArray,
146
- startIdx: Int,
147
- endIdx: Int,
148
- scaleFactor: Float
149
- ): Float {
150
- return if (endIdx > startIdx) {
151
- audioData.slice(startIdx until endIdx)
152
- .map { abs(it) }
153
- .average()
154
- .toFloat() * scaleFactor
155
- } else {
156
- 0f
157
- }
158
- }
159
- }
@@ -1,16 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <vector xmlns:android="http://schemas.android.com/apk/res/android"
3
- android:width="24dp"
4
- android:height="24dp"
5
- android:viewportWidth="24"
6
- android:viewportHeight="24">
7
- <path
8
- android:fillColor="#FFFFFF"
9
- android:pathData="M12,2C6.48,2 2,6.48 2,12C2,17.52 6.48,22 12,22C17.52,22 22,17.52 22,12C22,6.48 17.52,2 12,2ZM12,20C7.58,20 4,16.42 4,12C4,7.58 7.58,4 12,4C16.42,4 20,7.58 20,12C20,16.42 16.42,20 12,20Z"/>
10
- <path
11
- android:fillColor="#FFFFFF"
12
- android:pathData="M12,17L12,7"/>
13
- <path
14
- android:fillColor="#FFFFFF"
15
- android:pathData="M7,12L17,12"/>
16
- </vector>
@@ -1,13 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <vector xmlns:android="http://schemas.android.com/apk/res/android"
3
- android:width="24dp"
4
- android:height="24dp"
5
- android:viewportWidth="24"
6
- android:viewportHeight="24">
7
- <path
8
- android:fillColor="#FFFFFF"
9
- android:pathData="M12,14c1.66,0 3,-1.34 3,-3V5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6C9,12.66 10.34,14 12,14z"/>
10
- <path
11
- android:fillColor="#FFFFFF"
12
- android:pathData="M17,11c0,2.76 -2.24,5 -5,5s-5,-2.24 -5,-5H5c0,3.53 2.61,6.43 6,6.92V21h2v-3.08c3.39,-0.49 6,-3.39 6,-6.92H17z"/>
13
- </vector>
@@ -1,10 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <vector xmlns:android="http://schemas.android.com/apk/res/android"
3
- android:width="24dp"
4
- android:height="24dp"
5
- android:viewportWidth="24"
6
- android:viewportHeight="24">
7
- <path
8
- android:fillColor="#FFFFFF"
9
- android:pathData="M6,4h4v16H6zM14,4h4v16h-4z"/>
10
- </vector>
@@ -1,10 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <vector xmlns:android="http://schemas.android.com/apk/res/android"
3
- android:width="24dp"
4
- android:height="24dp"
5
- android:viewportWidth="24"
6
- android:viewportHeight="24">
7
- <path
8
- android:fillColor="#FFFFFF"
9
- android:pathData="M8,5v14l11,-7z"/>
10
- </vector>
@@ -1,10 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <vector xmlns:android="http://schemas.android.com/apk/res/android"
3
- android:width="24dp"
4
- android:height="24dp"
5
- android:viewportWidth="24"
6
- android:viewportHeight="24">
7
- <path
8
- android:fillColor="#FFFFFF"
9
- android:pathData="M6,6h12v12H6z"/>
10
- </vector>
@@ -1,37 +0,0 @@
1
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2
- android:id="@+id/notification_layout"
3
- android:layout_width="match_parent"
4
- android:layout_height="wrap_content"
5
- android:gravity="center"
6
- android:orientation="vertical"
7
- android:padding="8dp">
8
-
9
- <TextView
10
- android:id="@+id/notification_title"
11
- android:layout_width="wrap_content"
12
- android:layout_height="wrap_content"
13
- android:layout_marginBottom="4dp"
14
- android:textSize="16sp"
15
- android:textStyle="bold" />
16
-
17
- <TextView
18
- android:id="@+id/notification_text"
19
- android:layout_width="wrap_content"
20
- android:layout_height="wrap_content"
21
- android:layout_marginBottom="4dp"
22
- android:textSize="14sp" />
23
-
24
- <ImageView
25
- android:id="@+id/notification_waveform"
26
- android:layout_width="match_parent"
27
- android:layout_height="64dp"
28
- android:scaleType="fitCenter" />
29
-
30
- <TextView
31
- android:id="@+id/notification_duration"
32
- android:layout_width="wrap_content"
33
- android:layout_height="wrap_content"
34
- android:layout_marginTop="4dp"
35
- android:textSize="14sp" />
36
-
37
- </LinearLayout>