@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,234 +0,0 @@
1
- package net.siteed.audiostream
2
-
3
- import android.Manifest
4
- import android.content.Context
5
- import android.util.Log
6
- import androidx.test.ext.junit.runners.AndroidJUnit4
7
- import androidx.test.platform.app.InstrumentationRegistry
8
- import androidx.test.rule.GrantPermissionRule
9
- import expo.modules.kotlin.Promise
10
- import org.junit.After
11
- import org.junit.Assert.*
12
- import org.junit.Before
13
- import org.junit.Rule
14
- import org.junit.Test
15
- import org.junit.runner.RunWith
16
- import java.io.File
17
- import java.util.concurrent.CountDownLatch
18
- import java.util.concurrent.TimeUnit
19
- import kotlin.system.measureTimeMillis
20
-
21
- /**
22
- * Performance tests for measuring stop recording times.
23
- */
24
- @RunWith(AndroidJUnit4::class)
25
- class AudioRecorderPerformanceInstrumentedTest {
26
-
27
- @get:Rule
28
- val grantPermissionRule: GrantPermissionRule = GrantPermissionRule.grant(
29
- Manifest.permission.RECORD_AUDIO
30
- )
31
-
32
- private lateinit var context: Context
33
- private lateinit var filesDir: File
34
- private lateinit var audioRecorderManager: AudioRecorderManager
35
- private lateinit var testEventSender: TestEventSender
36
- private lateinit var permissionUtils: PermissionUtils
37
- private lateinit var audioDataEncoder: AudioDataEncoder
38
-
39
- companion object {
40
- private const val TAG = "PerformanceTest"
41
- }
42
-
43
- // Test event sender to capture events
44
- private class TestEventSender : EventSender {
45
- override fun sendExpoEvent(eventName: String, params: android.os.Bundle) {
46
- // No-op for performance tests
47
- }
48
- }
49
-
50
- @Before
51
- fun setUp() {
52
- context = InstrumentationRegistry.getInstrumentation().targetContext
53
- filesDir = context.filesDir
54
- testEventSender = TestEventSender()
55
- permissionUtils = PermissionUtils(context)
56
- audioDataEncoder = AudioDataEncoder()
57
-
58
- // Initialize AudioRecorderManager
59
- audioRecorderManager = AudioRecorderManager.initialize(
60
- context = context,
61
- filesDir = filesDir,
62
- permissionUtils = permissionUtils,
63
- audioDataEncoder = audioDataEncoder,
64
- eventSender = testEventSender,
65
- enablePhoneStateHandling = false,
66
- enableBackgroundAudio = false
67
- )
68
-
69
- // Clean up any existing audio files
70
- cleanupAudioFiles()
71
- }
72
-
73
- @After
74
- fun tearDown() {
75
- // Stop any ongoing recording
76
- if (audioRecorderManager.isRecording) {
77
- val promise = object : Promise {
78
- override fun resolve(value: Any?) {}
79
- override fun reject(code: String, message: String?, cause: Throwable?) {}
80
- }
81
- audioRecorderManager.stopRecording(promise)
82
- }
83
-
84
- // Clean up
85
- AudioRecorderManager.destroy()
86
- cleanupAudioFiles()
87
- }
88
-
89
- private fun cleanupAudioFiles() {
90
- filesDir.listFiles()?.forEach { file ->
91
- if (file.name.endsWith(".wav") || file.name.endsWith(".aac") || file.name.endsWith(".opus")) {
92
- file.delete()
93
- }
94
- }
95
- }
96
-
97
- @Test
98
- fun measureStopTime_5seconds() {
99
- runPerformanceTest(5_000L, "5 second recording")
100
- }
101
-
102
- @Test
103
- fun measureStopTime_30seconds() {
104
- runPerformanceTest(30_000L, "30 second recording")
105
- }
106
-
107
- @Test
108
- fun measureStopTime_1minute() {
109
- runPerformanceTest(60_000L, "1 minute recording")
110
- }
111
-
112
- @Test
113
- fun measureStopTime_2minutes() {
114
- runPerformanceTest(120_000L, "2 minute recording")
115
- }
116
-
117
- @Test
118
- fun measureStopTime_5minutes() {
119
- runPerformanceTest(300_000L, "5 minute recording")
120
- }
121
-
122
- @Test
123
- fun measureStopTime_10minutes() {
124
- runPerformanceTest(600_000L, "10 minute recording")
125
- }
126
-
127
- @Test
128
- fun measureStopTime_15minutes() {
129
- runPerformanceTest(900_000L, "15 minute recording")
130
- }
131
-
132
- private fun runPerformanceTest(recordingDurationMs: Long, testName: String) {
133
- val recordingOptions = mapOf(
134
- "sampleRate" to 44100,
135
- "channels" to 1,
136
- "encoding" to "pcm_16bit",
137
- "interval" to 1000,
138
- "enableProcessing" to false,
139
- "showNotification" to false,
140
- "output" to mapOf(
141
- "primary" to mapOf("enabled" to true),
142
- "compressed" to mapOf("enabled" to false)
143
- )
144
- )
145
-
146
- // Start recording
147
- val startLatch = CountDownLatch(1)
148
- audioRecorderManager.startRecording(recordingOptions, object : Promise {
149
- override fun resolve(value: Any?) {
150
- startLatch.countDown()
151
- }
152
- override fun reject(code: String, message: String?, cause: Throwable?) {
153
- fail("Start recording failed: $message")
154
- }
155
- })
156
-
157
- assertTrue("Recording should start", startLatch.await(5, TimeUnit.SECONDS))
158
- assertTrue("Recording should be active", audioRecorderManager.isRecording)
159
-
160
- // Record for specified duration
161
- Thread.sleep(recordingDurationMs)
162
-
163
- // Measure stop time
164
- val stopLatch = CountDownLatch(1)
165
- var fileSize = 0L
166
- var stopResult: Map<String, Any>? = null
167
-
168
- val stopDuration = measureTimeMillis {
169
- audioRecorderManager.stopRecording(object : Promise {
170
- override fun resolve(value: Any?) {
171
- when (value) {
172
- is android.os.Bundle -> {
173
- fileSize = value.getLong("size", 0)
174
- stopResult = bundleToMap(value)
175
- }
176
- is Map<*, *> -> {
177
- @Suppress("UNCHECKED_CAST")
178
- stopResult = value as? Map<String, Any>
179
- fileSize = (stopResult?.get("size") as? Long) ?: 0
180
- }
181
- }
182
- stopLatch.countDown()
183
- }
184
- override fun reject(code: String, message: String?, cause: Throwable?) {
185
- fail("Stop recording failed: $message")
186
- }
187
- })
188
-
189
- assertTrue("Stop should complete", stopLatch.await(10, TimeUnit.SECONDS))
190
- }
191
-
192
- // Log results
193
- val fileSizeMB = fileSize / (1024.0 * 1024.0)
194
- Log.i(TAG, """
195
- Performance Test: $testName
196
- - Recording Duration: ${recordingDurationMs}ms
197
- - Stop Duration: ${stopDuration}ms
198
- - File Size: ${"%.2f".format(fileSizeMB)}MB
199
- - Performance: ${if (stopDuration < getTargetTime(recordingDurationMs)) "PASS" else "FAIL"}
200
- """.trimIndent())
201
-
202
- println("""
203
- Performance Test: $testName
204
- - Recording Duration: ${recordingDurationMs}ms
205
- - Stop Duration: ${stopDuration}ms
206
- - File Size: ${"%.2f".format(fileSizeMB)}MB
207
- - Performance: ${if (stopDuration < getTargetTime(recordingDurationMs)) "PASS" else "FAIL"}
208
- """.trimIndent())
209
-
210
- assertFalse("Recording should not be active", audioRecorderManager.isRecording)
211
- }
212
-
213
- private fun getTargetTime(recordingDurationMs: Long): Long {
214
- return when {
215
- recordingDurationMs <= 5_000 -> 100
216
- recordingDurationMs <= 30_000 -> 150
217
- recordingDurationMs <= 60_000 -> 200
218
- recordingDurationMs <= 300_000 -> 500
219
- else -> 750
220
- }
221
- }
222
-
223
- private fun bundleToMap(bundle: android.os.Bundle): Map<String, Any> {
224
- val map = mutableMapOf<String, Any>()
225
- for (key in bundle.keySet()) {
226
- val value = bundle.get(key)
227
- when (value) {
228
- is android.os.Bundle -> map[key] = bundleToMap(value)
229
- else -> value?.let { map[key] = it }
230
- }
231
- }
232
- return map
233
- }
234
- }
@@ -1,332 +0,0 @@
1
- package net.siteed.audiostream.integration
2
-
3
- import android.media.AudioManager
4
- import android.content.Context
5
- import androidx.test.ext.junit.runners.AndroidJUnit4
6
- import androidx.test.platform.app.InstrumentationRegistry
7
- import org.junit.Test
8
- import org.junit.Assert.*
9
- import org.junit.Before
10
- import org.junit.After
11
- import org.junit.runner.RunWith
12
- import net.siteed.audiostream.RecordingConfig
13
- import java.io.File
14
-
15
- /**
16
- * Integration tests for audio focus strategy functionality.
17
- * These tests run on actual Android devices/emulators to validate that
18
- * audio focus strategies work correctly in real scenarios.
19
- */
20
- @RunWith(AndroidJUnit4::class)
21
- class AudioFocusStrategyIntegrationTest {
22
-
23
- private lateinit var context: Context
24
- private lateinit var audioManager: AudioManager
25
- private lateinit var filesDir: File
26
-
27
- @Before
28
- fun setUp() {
29
- context = InstrumentationRegistry.getInstrumentation().targetContext
30
- audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
31
- filesDir = context.filesDir
32
- }
33
-
34
- @After
35
- fun tearDown() {
36
- // Clean up any test files
37
- val testFiles = filesDir.listFiles { _, name ->
38
- name.startsWith("test_audio_focus_")
39
- }
40
- testFiles?.forEach { it.delete() }
41
- }
42
-
43
- @Test
44
- fun testRecordingConfigWithBackgroundStrategy() {
45
- val options = mapOf(
46
- "sampleRate" to 44100,
47
- "channels" to 1,
48
- "encoding" to "pcm_16bit",
49
- "keepAwake" to true,
50
- "autoResumeAfterInterruption" to true,
51
- "android" to mapOf(
52
- "audioFocusStrategy" to "background"
53
- )
54
- )
55
-
56
- val result = RecordingConfig.fromMap(options)
57
- assertTrue("Config creation should succeed", result.isSuccess)
58
-
59
- val (config, audioFormat) = result.getOrThrow()
60
-
61
- // Verify audio focus strategy configuration
62
- assertEquals("Audio focus strategy should be background", "background", config.audioFocusStrategy)
63
- assertTrue("keepAwake should be true for background recording", config.keepAwake)
64
- assertTrue("autoResumeAfterInterruption should be true", config.autoResumeAfterInterruption)
65
-
66
- // Verify audio format is properly configured
67
- assertNotNull("Audio format should be created", audioFormat)
68
- assertEquals("MIME type should be audio/wav", "audio/wav", audioFormat.mimeType)
69
- }
70
-
71
- @Test
72
- fun testRecordingConfigWithInteractiveStrategy() {
73
- val options = mapOf(
74
- "sampleRate" to 44100,
75
- "channels" to 1,
76
- "encoding" to "pcm_16bit",
77
- "keepAwake" to false,
78
- "autoResumeAfterInterruption" to true,
79
- "android" to mapOf(
80
- "audioFocusStrategy" to "interactive"
81
- )
82
- )
83
-
84
- val result = RecordingConfig.fromMap(options)
85
- assertTrue("Config creation should succeed", result.isSuccess)
86
-
87
- val (config, audioFormat) = result.getOrThrow()
88
-
89
- // Verify audio focus strategy configuration
90
- assertEquals("Audio focus strategy should be interactive", "interactive", config.audioFocusStrategy)
91
- assertFalse("keepAwake should be false for interactive recording", config.keepAwake)
92
- assertTrue("autoResumeAfterInterruption should be true", config.autoResumeAfterInterruption)
93
-
94
- // Verify audio format is properly configured
95
- assertNotNull("Audio format should be created", audioFormat)
96
- assertEquals("MIME type should be audio/wav", "audio/wav", audioFormat.mimeType)
97
- }
98
-
99
- @Test
100
- fun testRecordingConfigWithCommunicationStrategy() {
101
- val options = mapOf(
102
- "sampleRate" to 16000, // Common speech sample rate
103
- "channels" to 1,
104
- "encoding" to "pcm_16bit",
105
- "keepAwake" to false,
106
- "autoResumeAfterInterruption" to true,
107
- "android" to mapOf(
108
- "audioFocusStrategy" to "communication"
109
- )
110
- )
111
-
112
- val result = RecordingConfig.fromMap(options)
113
- assertTrue("Config creation should succeed", result.isSuccess)
114
-
115
- val (config, audioFormat) = result.getOrThrow()
116
-
117
- // Verify audio focus strategy configuration
118
- assertEquals("Audio focus strategy should be communication", "communication", config.audioFocusStrategy)
119
- assertEquals("Sample rate should be 16000 for speech", 16000, config.sampleRate)
120
- assertFalse("keepAwake should be false", config.keepAwake)
121
- assertTrue("autoResumeAfterInterruption should be true", config.autoResumeAfterInterruption)
122
-
123
- // Verify audio format is properly configured
124
- assertNotNull("Audio format should be created", audioFormat)
125
- assertEquals("MIME type should be audio/wav", "audio/wav", audioFormat.mimeType)
126
- }
127
-
128
- @Test
129
- fun testRecordingConfigWithNoneStrategy() {
130
- val options = mapOf(
131
- "sampleRate" to 44100,
132
- "channels" to 1,
133
- "encoding" to "pcm_16bit",
134
- "keepAwake" to false,
135
- "android" to mapOf(
136
- "audioFocusStrategy" to "none"
137
- )
138
- )
139
-
140
- val result = RecordingConfig.fromMap(options)
141
- assertTrue("Config creation should succeed", result.isSuccess)
142
-
143
- val (config, audioFormat) = result.getOrThrow()
144
-
145
- // Verify audio focus strategy configuration
146
- assertEquals("Audio focus strategy should be none", "none", config.audioFocusStrategy)
147
-
148
- // Verify audio format is properly configured
149
- assertNotNull("Audio format should be created", audioFormat)
150
- assertEquals("MIME type should be audio/wav", "audio/wav", audioFormat.mimeType)
151
- }
152
-
153
- @Test
154
- fun testStrategyOverrideBehavior() {
155
- val options = mapOf(
156
- "sampleRate" to 44100,
157
- "channels" to 1,
158
- "encoding" to "pcm_16bit",
159
- "keepAwake" to true, // This would normally default to background
160
- "android" to mapOf(
161
- "audioFocusStrategy" to "communication" // But we override to communication
162
- )
163
- )
164
-
165
- val result = RecordingConfig.fromMap(options)
166
- assertTrue("Config creation should succeed", result.isSuccess)
167
-
168
- val (config, audioFormat) = result.getOrThrow()
169
-
170
- // Verify that explicit strategy overrides keepAwake defaults
171
- assertEquals("Audio focus strategy should be communication (overriding keepAwake default)", "communication", config.audioFocusStrategy)
172
- assertTrue("keepAwake should still be true", config.keepAwake)
173
-
174
- // Verify audio format is properly configured
175
- assertNotNull("Audio format should be created", audioFormat)
176
- }
177
-
178
- @Test
179
- fun testAudioFocusStrategyWithCompression() {
180
- val options = mapOf(
181
- "sampleRate" to 44100,
182
- "channels" to 1,
183
- "encoding" to "pcm_16bit",
184
- "android" to mapOf(
185
- "audioFocusStrategy" to "background"
186
- ),
187
- "output" to mapOf(
188
- "compressed" to mapOf(
189
- "enabled" to true,
190
- "format" to "aac",
191
- "bitrate" to 128000
192
- )
193
- )
194
- )
195
-
196
- val result = RecordingConfig.fromMap(options)
197
- assertTrue("Config creation should succeed", result.isSuccess)
198
-
199
- val (config, audioFormat) = result.getOrThrow()
200
-
201
- // Verify audio focus strategy works with compression
202
- assertEquals("Audio focus strategy should be background", "background", config.audioFocusStrategy)
203
- assertTrue("Compressed output should be enabled", config.output.compressed.enabled)
204
- assertEquals("Compression format should be aac", "aac", config.output.compressed.format)
205
- assertEquals("Bitrate should be 128000", 128000, config.output.compressed.bitrate)
206
-
207
- // Verify audio format is properly configured
208
- assertNotNull("Audio format should be created", audioFormat)
209
- assertEquals("MIME type should be audio/wav", "audio/wav", audioFormat.mimeType)
210
- }
211
-
212
- @Test
213
- fun testAudioFocusStrategyWithNotifications() {
214
- val options = mapOf(
215
- "sampleRate" to 44100,
216
- "channels" to 1,
217
- "encoding" to "pcm_16bit",
218
- "showNotification" to true,
219
- "showWaveformInNotification" to true,
220
- "android" to mapOf(
221
- "audioFocusStrategy" to "background"
222
- ),
223
- "notification" to mapOf(
224
- "title" to "Recording Audio",
225
- "text" to "Background recording in progress",
226
- "icon" to "ic_mic"
227
- )
228
- )
229
-
230
- val result = RecordingConfig.fromMap(options)
231
- assertTrue("Config creation should succeed", result.isSuccess)
232
-
233
- val (config, audioFormat) = result.getOrThrow()
234
-
235
- // Verify audio focus strategy works with notifications
236
- assertEquals("Audio focus strategy should be background", "background", config.audioFocusStrategy)
237
- assertTrue("Notifications should be enabled", config.showNotification)
238
- assertTrue("Waveform in notification should be enabled", config.showWaveformInNotification)
239
- assertEquals("Notification title should match", "Recording Audio", config.notification.title)
240
- assertEquals("Notification text should match", "Background recording in progress", config.notification.text)
241
- assertEquals("Notification icon should match", "ic_mic", config.notification.icon)
242
-
243
- // Verify audio format is properly configured
244
- assertNotNull("Audio format should be created", audioFormat)
245
- assertEquals("MIME type should be audio/wav", "audio/wav", audioFormat.mimeType)
246
- }
247
-
248
- @Test
249
- fun testAudioFocusStrategyValidation() {
250
- // Test all valid strategies
251
- val strategies = listOf("background", "interactive", "communication", "none")
252
-
253
- for (strategy in strategies) {
254
- val options = mapOf(
255
- "sampleRate" to 44100,
256
- "channels" to 1,
257
- "encoding" to "pcm_16bit",
258
- "android" to mapOf(
259
- "audioFocusStrategy" to strategy
260
- )
261
- )
262
-
263
- val result = RecordingConfig.fromMap(options)
264
- assertTrue("Config creation should succeed for strategy: $strategy", result.isSuccess)
265
-
266
- val (config, _) = result.getOrThrow()
267
- assertEquals("Audio focus strategy should be $strategy", strategy, config.audioFocusStrategy)
268
- }
269
- }
270
-
271
- @Test
272
- fun testInvalidAudioFocusStrategyHandling() {
273
- val options = mapOf(
274
- "sampleRate" to 44100,
275
- "channels" to 1,
276
- "encoding" to "pcm_16bit",
277
- "android" to mapOf(
278
- "audioFocusStrategy" to "invalid_strategy"
279
- )
280
- )
281
-
282
- val result = RecordingConfig.fromMap(options)
283
- assertTrue("Config creation should succeed even with invalid strategy", result.isSuccess)
284
-
285
- val (config, _) = result.getOrThrow()
286
- assertEquals("Invalid strategy should be preserved", "invalid_strategy", config.audioFocusStrategy)
287
- }
288
-
289
- @Test
290
- fun testCompleteAudioFocusConfiguration() {
291
- val options = mapOf(
292
- "sampleRate" to 44100,
293
- "channels" to 1,
294
- "encoding" to "pcm_16bit",
295
- "keepAwake" to true,
296
- "autoResumeAfterInterruption" to true,
297
- "showNotification" to true,
298
- "showWaveformInNotification" to false,
299
- "enableProcessing" to false,
300
- "android" to mapOf(
301
- "audioFocusStrategy" to "communication"
302
- ),
303
- "notification" to mapOf(
304
- "title" to "Voice Call Recording",
305
- "text" to "Call in progress",
306
- "icon" to "ic_call"
307
- )
308
- )
309
-
310
- val result = RecordingConfig.fromMap(options)
311
- assertTrue("Config creation should succeed", result.isSuccess)
312
-
313
- val (config, audioFormat) = result.getOrThrow()
314
-
315
- // Verify complete configuration
316
- assertEquals("Audio focus strategy should be communication", "communication", config.audioFocusStrategy)
317
- assertEquals("Sample rate should be 44100", 44100, config.sampleRate)
318
- assertEquals("Channels should be 1", 1, config.channels)
319
- assertEquals("Encoding should be pcm_16bit", "pcm_16bit", config.encoding)
320
- assertTrue("keepAwake should be true", config.keepAwake)
321
- assertFalse("showWaveformInNotification should be false", config.showWaveformInNotification)
322
- assertTrue("showNotification should be true", config.showNotification)
323
- assertTrue("autoResumeAfterInterruption should be true", config.autoResumeAfterInterruption)
324
- assertFalse("enableProcessing should be false", config.enableProcessing)
325
- assertEquals("Notification title should match", "Voice Call Recording", config.notification.title)
326
- assertEquals("Notification text should match", "Call in progress", config.notification.text)
327
-
328
- // Verify audio format is properly configured
329
- assertNotNull("Audio format should be created", audioFormat)
330
- assertEquals("MIME type should be audio/wav", "audio/wav", audioFormat.mimeType)
331
- }
332
- }