@siteed/expo-audio-studio 2.18.5 → 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 -493
  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 -666
  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 -2352
  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 -1013
  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,99 +0,0 @@
1
- // packages/expo-audio-stream/android/src/main/java/net/siteed/audiostream/FFT.kt
2
- package net.siteed.audiostream
3
-
4
- import kotlin.math.PI
5
- import kotlin.math.cos
6
- import kotlin.math.sin
7
- import kotlin.math.sqrt
8
-
9
- class FFT(private val n: Int) {
10
- private val cosTable = FloatArray(n / 2)
11
- private val sinTable = FloatArray(n / 2)
12
- private val hannWindow = FloatArray(n)
13
-
14
- init {
15
- // Precompute trig tables
16
- for (i in 0 until n / 2) {
17
- cosTable[i] = cos(2.0 * PI * i / n).toFloat()
18
- sinTable[i] = sin(2.0 * PI * i / n).toFloat()
19
- }
20
-
21
- // Precompute normalized Hann window to match vDSP
22
- val normalizationFactor = sqrt(2.0f / n) // Match vDSP normalization
23
- for (i in hannWindow.indices) {
24
- hannWindow[i] = normalizationFactor * 0.5f * (1 - cos(2.0 * PI * i / (n - 1))).toFloat()
25
- }
26
- }
27
-
28
- fun processSegment(segment: FloatArray): FloatArray {
29
- // Pad or truncate input to match FFT length
30
- val paddedSegment = if (segment.size < n) {
31
- segment + FloatArray(n - segment.size)
32
- } else {
33
- segment.copyOf(n)
34
- }
35
-
36
- // Apply normalized Hann window
37
- for (i in paddedSegment.indices) {
38
- paddedSegment[i] *= hannWindow[i]
39
- }
40
-
41
- // Perform FFT
42
- realForward(paddedSegment)
43
-
44
- return paddedSegment
45
- }
46
-
47
- fun realForward(data: FloatArray) {
48
- realForwardRecursive(data)
49
- }
50
-
51
- private fun realForwardRecursive(data: FloatArray) {
52
- val n = data.size
53
- if (n <= 1) return
54
-
55
- val even = FloatArray(n / 2)
56
- val odd = FloatArray(n / 2)
57
-
58
- for (i in 0 until n / 2) {
59
- even[i] = data[2 * i]
60
- odd[i] = data[2 * i + 1]
61
- }
62
-
63
- realForwardRecursive(even)
64
- realForwardRecursive(odd)
65
-
66
- for (i in 0 until n / 2) {
67
- val t = cosTable[i] * odd[i] - sinTable[i] * even[i]
68
- val u = sinTable[i] * odd[i] + cosTable[i] * even[i]
69
- data[i] = even[i] + t
70
- data[i + n / 2] = even[i] - t
71
- }
72
- }
73
-
74
- fun realInverse(powerSpectrum: FloatArray, output: FloatArray) {
75
- // Copy power spectrum to complex format for inverse FFT
76
- val complexData = FloatArray(n * 2)
77
- for (i in 0 until n/2 + 1) {
78
- complexData[2 * i] = powerSpectrum[i]
79
- if (2 * i + 1 < complexData.size) {
80
- complexData[2 * i + 1] = 0f
81
- }
82
- }
83
-
84
- // Conjugate for inverse FFT
85
- for (i in 0 until n) {
86
- if (2 * i + 1 < complexData.size) {
87
- complexData[2 * i + 1] = -complexData[2 * i + 1]
88
- }
89
- }
90
-
91
- // Perform forward FFT (which is inverse when input is conjugated)
92
- realForward(complexData)
93
-
94
- // Copy real part to output and conjugate again
95
- for (i in 0 until n) {
96
- output[i] = complexData[2 * i] / n
97
- }
98
- }
99
- }
@@ -1,98 +0,0 @@
1
- package net.siteed.audiostream
2
-
3
- import android.os.Bundle
4
- import androidx.core.os.bundleOf
5
-
6
- data class Features(
7
- val energy: Float = 0f,
8
- val mfcc: List<Float> = emptyList(),
9
- val rms: Float = 0f,
10
- val minAmplitude: Float = 0f,
11
- val maxAmplitude: Float = 0f,
12
- val zcr: Float = 0f,
13
- val spectralCentroid: Float = 0f,
14
- val spectralFlatness: Float = 0f,
15
- val spectralRollOff: Float = 0f,
16
- val spectralBandwidth: Float = 0f,
17
- val tempo: Float = 0f,
18
- val hnr: Float = 0f,
19
- val melSpectrogram: List<Float> = emptyList(),
20
- val chromagram: List<Float> = emptyList(),
21
- val spectralContrast: List<Float> = emptyList(),
22
- val tonnetz: List<Float> = emptyList(),
23
- val pitch: Float = 0f,
24
- val crc32: Long? = null
25
- ) {
26
- fun toDictionary(): Map<String, Any> {
27
- val baseMap = mapOf(
28
- "energy" to energy,
29
- "mfcc" to mfcc,
30
- "rms" to rms,
31
- "minAmplitude" to minAmplitude,
32
- "maxAmplitude" to maxAmplitude,
33
- "zcr" to zcr,
34
- "spectralCentroid" to spectralCentroid,
35
- "spectralFlatness" to spectralFlatness,
36
- "spectralRollOff" to spectralRollOff,
37
- "spectralBandwidth" to spectralBandwidth,
38
- "tempo" to tempo,
39
- "hnr" to hnr,
40
- "melSpectrogram" to melSpectrogram,
41
- "chromagram" to chromagram,
42
- "spectralContrast" to spectralContrast,
43
- "tonnetz" to tonnetz,
44
- "pitch" to pitch,
45
- "crc32" to (crc32 ?: 0)
46
- )
47
- return baseMap.filterValues { it != null }
48
- }
49
-
50
- fun toBundle(): Bundle {
51
- return bundleOf(
52
- "energy" to energy,
53
- "mfcc" to mfcc,
54
- "rms" to rms,
55
- "minAmplitude" to minAmplitude,
56
- "maxAmplitude" to maxAmplitude,
57
- "zcr" to zcr,
58
- "spectralCentroid" to spectralCentroid,
59
- "spectralFlatness" to spectralFlatness,
60
- "spectralRollOff" to spectralRollOff,
61
- "spectralBandwidth" to spectralBandwidth,
62
- "tempo" to tempo,
63
- "hnr" to hnr,
64
- "melSpectrogram" to melSpectrogram,
65
- "chromagram" to chromagram,
66
- "spectralContrast" to spectralContrast,
67
- "tonnetz" to tonnetz,
68
- "pitch" to pitch,
69
- "crc32" to (crc32 ?: 0)
70
- )
71
- }
72
-
73
- companion object {
74
- fun parseFeatureOptions(options: Map<*, *>?): Map<String, Boolean> {
75
- return options?.let { map ->
76
- mapOf(
77
- "energy" to (map["energy"] as? Boolean ?: false),
78
- "mfcc" to (map["mfcc"] as? Boolean ?: false),
79
- "rms" to (map["rms"] as? Boolean ?: false),
80
- "zcr" to (map["zcr"] as? Boolean ?: false),
81
- "dB" to (map["dB"] as? Boolean ?: false),
82
- "spectralCentroid" to (map["spectralCentroid"] as? Boolean ?: false),
83
- "spectralFlatness" to (map["spectralFlatness"] as? Boolean ?: false),
84
- "spectralRollOff" to (map["spectralRollOff"] as? Boolean ?: false),
85
- "spectralBandwidth" to (map["spectralBandwidth"] as? Boolean ?: false),
86
- "chromagram" to (map["chromagram"] as? Boolean ?: false),
87
- "tempo" to (map["tempo"] as? Boolean ?: false),
88
- "hnr" to (map["hnr"] as? Boolean ?: false),
89
- "melSpectrogram" to (map["melSpectrogram"] as? Boolean ?: false),
90
- "spectralContrast" to (map["spectralContrast"] as? Boolean ?: false),
91
- "tonnetz" to (map["tonnetz"] as? Boolean ?: false),
92
- "pitch" to (map["pitch"] as? Boolean ?: false),
93
- "crc32" to (map["crc32"] as? Boolean ?: false)
94
- )
95
- } ?: emptyMap()
96
- }
97
- }
98
- }
@@ -1,93 +0,0 @@
1
- package net.siteed.audiostream
2
-
3
- import android.util.Log
4
-
5
- /**
6
- * Utility class for standardized logging across the ExpoAudioStudio library.
7
- * Provides consistent logging format and tags for easier filtering in logcat.
8
- */
9
- object LogUtils {
10
- // Format: [ExpoAudioStudio:ClassName]
11
- private const val TAG_PREFIX = "ExpoAudioStudio"
12
-
13
- // Check if we're running in a test environment
14
- private val isInTest: Boolean by lazy {
15
- try {
16
- Class.forName("org.junit.Test")
17
- true
18
- } catch (e: ClassNotFoundException) {
19
- false
20
- }
21
- }
22
-
23
- /**
24
- * Logs a debug message with a consistent format.
25
- *
26
- * @param className The name of the class generating the log
27
- * @param message The message to log
28
- */
29
- fun d(className: String, message: String) {
30
- if (isInTest) {
31
- println("D/$TAG_PREFIX:$className: $message")
32
- } else {
33
- Log.d("$TAG_PREFIX:$className", message)
34
- }
35
- }
36
-
37
- /**
38
- * Logs an error message with a consistent format.
39
- *
40
- * @param className The name of the class generating the log
41
- * @param message The message to log
42
- * @param throwable Optional throwable to include in the log
43
- */
44
- fun e(className: String, message: String, throwable: Throwable? = null) {
45
- if (isInTest) {
46
- println("E/$TAG_PREFIX:$className: $message")
47
- throwable?.printStackTrace()
48
- } else {
49
- Log.e("$TAG_PREFIX:$className", message, throwable)
50
- }
51
- }
52
-
53
- /**
54
- * Logs a warning message with a consistent format.
55
- *
56
- * @param className The name of the class generating the log
57
- * @param message The message to log
58
- * @param throwable Optional throwable to include in the log
59
- */
60
- fun w(className: String, message: String, throwable: Throwable? = null) {
61
- if (isInTest) {
62
- println("W/$TAG_PREFIX:$className: $message")
63
- throwable?.printStackTrace()
64
- } else {
65
- Log.w("$TAG_PREFIX:$className", message, throwable)
66
- }
67
- }
68
-
69
- /**
70
- * Logs an info message with a consistent format.
71
- *
72
- * @param className The name of the class generating the log
73
- * @param message The message to log
74
- */
75
- fun i(className: String, message: String) {
76
- if (isInTest) {
77
- println("I/$TAG_PREFIX:$className: $message")
78
- } else {
79
- Log.i("$TAG_PREFIX:$className", message)
80
- }
81
- }
82
-
83
- /**
84
- * Creates a formatted tag for direct use with Android Log methods.
85
- * Use this if you need to use the Android Log methods directly.
86
- *
87
- * @param className The name of the class generating the log
88
- * @return A formatted tag string
89
- */
90
- fun tag(className: String): String {
91
- return "$TAG_PREFIX:$className"
92
- }
93
- }
@@ -1,72 +0,0 @@
1
- package net.siteed.audiostream
2
-
3
- data class NotificationConfig(
4
- val title: String = "Recording...",
5
- val text: String = "",
6
- val icon: String? = null,
7
- val channelId: String = "audio_recording_channel",
8
- val notificationId: Int = 1,
9
- val actions: List<NotificationAction> = emptyList(),
10
- val channelName: String = "Audio Recording",
11
- val channelDescription: String = "Shows audio recording status",
12
- val waveform: WaveformConfig? = null,
13
- val lightColor: String = "#FF0000",
14
- val priority: String = "high",
15
- val accentColor: String? = null,
16
- val showPauseResumeActions: Boolean = true
17
- ) {
18
- companion object {
19
- fun fromMap(map: Map<String, Any?>?): NotificationConfig {
20
- if (map == null) return NotificationConfig()
21
-
22
- val androidMap = map["android"] as? Map<String, Any?> ?: emptyMap()
23
-
24
- return NotificationConfig(
25
- title = map["title"] as? String ?: "Recording...",
26
- text = map["text"] as? String ?: "",
27
- icon = map["icon"] as? String,
28
- channelId = androidMap["channelId"] as? String ?: "audio_recording_channel",
29
- notificationId = (androidMap["notificationId"] as? Number)?.toInt() ?: 1,
30
- actions = parseNotificationActions(androidMap["actions"] as? List<Map<String, Any?>>),
31
- channelName = androidMap["channelName"] as? String ?: "Audio Recording",
32
- channelDescription = androidMap["channelDescription"] as? String ?: "Shows audio recording status",
33
- waveform = parseWaveformConfig(androidMap["waveform"] as? Map<String, Any?>),
34
- lightColor = androidMap["lightColor"] as? String ?: "#FF0000",
35
- priority = androidMap["priority"] as? String ?: "high",
36
- accentColor = androidMap["accentColor"] as? String,
37
- showPauseResumeActions = androidMap["showPauseResumeActions"] as? Boolean ?: true
38
- )
39
- }
40
-
41
- private fun parseNotificationActions(actionsList: List<Map<String, Any?>>?): List<NotificationAction> {
42
- return actionsList?.mapNotNull { actionMap ->
43
- if (actionMap["title"] != null && actionMap["identifier"] != null) {
44
- NotificationAction(
45
- title = actionMap["title"] as String,
46
- icon = actionMap["icon"] as? String,
47
- intentAction = actionMap["identifier"] as String
48
- )
49
- } else null
50
- } ?: emptyList()
51
- }
52
-
53
- private fun parseWaveformConfig(waveformMap: Map<String, Any?>?): WaveformConfig? {
54
- if (waveformMap == null) return null
55
-
56
- return WaveformConfig(
57
- color = waveformMap["color"] as? String ?: "#FFFFFF",
58
- opacity = (waveformMap["opacity"] as? Number)?.toFloat() ?: 1.0f,
59
- strokeWidth = (waveformMap["strokeWidth"] as? Number)?.toFloat() ?: 1.5f,
60
- style = waveformMap["style"] as? String ?: "stroke",
61
- mirror = waveformMap["mirror"] as? Boolean ?: true,
62
- height = (waveformMap["height"] as? Number)?.toInt() ?: 64
63
- )
64
- }
65
- }
66
- }
67
-
68
- data class NotificationAction(
69
- val title: String,
70
- val icon: String? = null,
71
- val intentAction: String
72
- )
@@ -1,68 +0,0 @@
1
- package net.siteed.audiostream
2
-
3
- import android.content.Context
4
- import android.content.pm.PackageManager
5
- import android.os.Build
6
- import androidx.core.content.ContextCompat
7
- import android.Manifest
8
- import android.util.Log
9
-
10
- class PermissionUtils(private val context: Context) {
11
- fun checkRecordingPermission(enableBackgroundAudio: Boolean = true): Boolean {
12
- val hasRecordPermission = ContextCompat.checkSelfPermission(
13
- context,
14
- Manifest.permission.RECORD_AUDIO
15
- ) == PackageManager.PERMISSION_GRANTED
16
-
17
- Log.d(Constants.TAG, "RECORD_AUDIO permission: $hasRecordPermission")
18
-
19
- // Check for foreground service permission on Android 14+ only if background audio is enabled
20
- val hasForegroundService = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && enableBackgroundAudio) {
21
- val result = ContextCompat.checkSelfPermission(
22
- context,
23
- Manifest.permission.FOREGROUND_SERVICE_MICROPHONE
24
- ) == PackageManager.PERMISSION_GRANTED
25
- Log.d(Constants.TAG, "FOREGROUND_SERVICE_MICROPHONE permission: $result (Android 14+, background audio enabled)")
26
- result
27
- } else {
28
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
29
- Log.d(Constants.TAG, "FOREGROUND_SERVICE_MICROPHONE not required (background audio disabled)")
30
- } else {
31
- Log.d(Constants.TAG, "FOREGROUND_SERVICE_MICROPHONE not required (Android < 14)")
32
- }
33
- true
34
- }
35
-
36
- val result = hasRecordPermission && hasForegroundService
37
- Log.d(Constants.TAG, "Final recording permission result: $result")
38
- return result
39
- }
40
-
41
- // Overload the original method for backward compatibility
42
- fun checkRecordingPermission(): Boolean {
43
- return checkRecordingPermission(true)
44
- }
45
-
46
- fun checkNotificationPermission(): Boolean {
47
- val result = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
48
- val hasPermission = ContextCompat.checkSelfPermission(
49
- context,
50
- Manifest.permission.POST_NOTIFICATIONS
51
- ) == PackageManager.PERMISSION_GRANTED
52
- Log.d(Constants.TAG, "POST_NOTIFICATIONS permission: $hasPermission (Android 13+)")
53
- hasPermission
54
- } else {
55
- Log.d(Constants.TAG, "POST_NOTIFICATIONS not required (Android < 13)")
56
- true
57
- }
58
- return result
59
- }
60
-
61
- fun checkPhoneStatePermission(): Boolean {
62
- return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
63
- context.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED
64
- } else {
65
- true
66
- }
67
- }
68
- }
@@ -1,59 +0,0 @@
1
- package net.siteed.audiostream
2
-
3
- import android.content.BroadcastReceiver
4
- import android.content.Context
5
- import android.content.Intent
6
- import android.util.Log
7
- import expo.modules.kotlin.Promise
8
- import java.util.concurrent.atomic.AtomicBoolean
9
-
10
- class RecordingActionReceiver : BroadcastReceiver() {
11
- companion object {
12
- const val ACTION_PAUSE_RECORDING = "net.siteed.audiostream.PAUSE_RECORDING"
13
- const val ACTION_RESUME_RECORDING = "net.siteed.audiostream.RESUME_RECORDING"
14
- private val isProcessingAction = AtomicBoolean(false)
15
- }
16
-
17
- override fun onReceive(context: Context, intent: Intent) {
18
- when (intent.action) {
19
- ACTION_PAUSE_RECORDING, ACTION_RESUME_RECORDING -> handleRecordingAction(intent.action)
20
- else -> Log.w("RecordingActionReceiver", "Unknown action: ${intent.action}")
21
- }
22
- }
23
-
24
- private fun handleRecordingAction(action: String?) {
25
- if (!isProcessingAction.compareAndSet(false, true)) {
26
- Log.d("RecordingActionReceiver", "Action already in progress, skipping")
27
- return
28
- }
29
-
30
- try {
31
- val audioRecorderManager = AudioRecorderManager.getInstance()
32
- if (audioRecorderManager == null) {
33
- Log.e("RecordingActionReceiver", "AudioRecorderManager instance is null")
34
- isProcessingAction.set(false)
35
- return
36
- }
37
-
38
- val notificationPromise = object : Promise {
39
- override fun resolve(value: Any?) {
40
- Log.d("RecordingActionReceiver", "$action completed successfully")
41
- isProcessingAction.set(false)
42
- }
43
-
44
- override fun reject(code: String, message: String?, cause: Throwable?) {
45
- Log.e("RecordingActionReceiver", "$action failed: $message", cause)
46
- isProcessingAction.set(false)
47
- }
48
- }
49
-
50
- when (action) {
51
- ACTION_PAUSE_RECORDING -> audioRecorderManager.pauseRecording(notificationPromise)
52
- ACTION_RESUME_RECORDING -> audioRecorderManager.resumeRecording(notificationPromise)
53
- }
54
- } catch (e: Exception) {
55
- Log.e("RecordingActionReceiver", "Error processing $action", e)
56
- isProcessingAction.set(false)
57
- }
58
- }
59
- }