@siteed/expo-audio-studio 2.18.6 โ†’ 3.0.1

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 +7 -136
  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,324 +0,0 @@
1
- package net.siteed.audiostream.integration
2
-
3
- import android.media.AudioFormat
4
- import android.media.AudioRecord
5
- import android.media.MediaRecorder
6
- import android.os.Build
7
- import androidx.test.ext.junit.runners.AndroidJUnit4
8
- import androidx.test.platform.app.InstrumentationRegistry
9
- import org.junit.After
10
- import org.junit.Before
11
- import org.junit.Test
12
- import org.junit.runner.RunWith
13
- import java.util.concurrent.CountDownLatch
14
- import java.util.concurrent.TimeUnit
15
- import kotlin.math.abs
16
-
17
- /**
18
- * Integration test for Buffer Duration feature
19
- * This tests the ACTUAL behavior of Android AudioRecord with different buffer sizes
20
- */
21
- @RunWith(AndroidJUnit4::class)
22
- class BufferDurationIntegrationTest {
23
-
24
- private val context = InstrumentationRegistry.getInstrumentation().targetContext
25
- private val results = mutableListOf<TestResult>()
26
- private var audioRecord: AudioRecord? = null
27
-
28
- data class TestResult(
29
- val name: String,
30
- val passed: Boolean,
31
- val message: String
32
- )
33
-
34
- @Before
35
- fun setup() {
36
- println("๐Ÿงช Buffer Duration Integration Test")
37
- println("===================================\n")
38
- }
39
-
40
- @After
41
- fun tearDown() {
42
- audioRecord?.release()
43
- printResults()
44
- }
45
-
46
- @Test
47
- fun testDefaultBufferSize() {
48
- println("Test 1: Default Buffer Size")
49
- println("---------------------------")
50
-
51
- val sampleRate = 48000
52
- val channelConfig = AudioFormat.CHANNEL_IN_MONO
53
- val audioFormat = AudioFormat.ENCODING_PCM_16BIT
54
-
55
- // Get minimum buffer size
56
- val minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat)
57
- println("โœ“ Android minimum buffer size: $minBufferSize bytes")
58
-
59
- // Calculate frames from bytes (16-bit = 2 bytes per sample)
60
- val minFrames = minBufferSize / 2
61
- println("โœ“ Minimum frames: $minFrames")
62
-
63
- // Test with default 1024 frames (2048 bytes)
64
- val requestedBytes = 1024 * 2
65
- val actualBufferSize = if (requestedBytes < minBufferSize) minBufferSize else requestedBytes
66
-
67
- audioRecord = AudioRecord(
68
- MediaRecorder.AudioSource.MIC,
69
- sampleRate,
70
- channelConfig,
71
- audioFormat,
72
- actualBufferSize
73
- )
74
-
75
- val state = audioRecord?.state
76
- val passed = state == AudioRecord.STATE_INITIALIZED
77
-
78
- results.add(TestResult(
79
- name = "Default Buffer Size",
80
- passed = passed,
81
- message = "Requested: 1024 frames, Min required: $minFrames frames, State: ${if (passed) "INITIALIZED" else "UNINITIALIZED"}"
82
- ))
83
-
84
- println("โœ“ Requested: 1024 frames (${requestedBytes} bytes)")
85
- println("โœ“ Actual buffer: ${actualBufferSize / 2} frames ($actualBufferSize bytes)")
86
- println("โœ“ Initialization: ${if (passed) "SUCCESS" else "FAILED"}\n")
87
- }
88
-
89
- @Test
90
- fun testCustomBufferSizes() {
91
- println("Test 2: Custom Buffer Sizes")
92
- println("---------------------------")
93
-
94
- val sampleRate = 48000
95
- val channelConfig = AudioFormat.CHANNEL_IN_MONO
96
- val audioFormat = AudioFormat.ENCODING_PCM_16BIT
97
- val minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat)
98
-
99
- val testCases = listOf(
100
- 0.01 to "10ms",
101
- 0.05 to "50ms",
102
- 0.1 to "100ms",
103
- 0.2 to "200ms",
104
- 0.5 to "500ms"
105
- )
106
-
107
- for ((duration, name) in testCases) {
108
- val requestedFrames = (duration * sampleRate).toInt()
109
- val requestedBytes = requestedFrames * 2 // 16-bit = 2 bytes
110
- val actualBufferSize = if (requestedBytes < minBufferSize) minBufferSize else requestedBytes
111
-
112
- audioRecord?.release()
113
- audioRecord = AudioRecord(
114
- MediaRecorder.AudioSource.MIC,
115
- sampleRate,
116
- channelConfig,
117
- audioFormat,
118
- actualBufferSize
119
- )
120
-
121
- val state = audioRecord?.state
122
- val passed = state == AudioRecord.STATE_INITIALIZED
123
-
124
- // Test actual read behavior
125
- if (passed) {
126
- audioRecord?.startRecording()
127
- val buffer = ByteArray(requestedBytes)
128
- val bytesRead = audioRecord?.read(buffer, 0, buffer.size) ?: -1
129
- audioRecord?.stop()
130
-
131
- val framesRead = if (bytesRead > 0) bytesRead / 2 else 0
132
-
133
- results.add(TestResult(
134
- name = "Buffer $name",
135
- passed = bytesRead > 0,
136
- message = "Requested: $requestedFrames frames, Read: $framesRead frames"
137
- ))
138
-
139
- println(" $name: Requested $requestedFrames โ†’ Read $framesRead frames")
140
- } else {
141
- results.add(TestResult(
142
- name = "Buffer $name",
143
- passed = false,
144
- message = "Failed to initialize AudioRecord"
145
- ))
146
- println(" $name: Failed to initialize")
147
- }
148
- }
149
- println()
150
- }
151
-
152
- @Test
153
- fun testBufferSizeLimits() {
154
- println("Test 3: Buffer Size Limits")
155
- println("--------------------------")
156
-
157
- val sampleRate = 48000
158
- val channelConfig = AudioFormat.CHANNEL_IN_MONO
159
- val audioFormat = AudioFormat.ENCODING_PCM_16BIT
160
-
161
- val extremeCases = listOf(
162
- 100 to "Very small (100 frames)",
163
- 50000 to "Very large (50000 frames)"
164
- )
165
-
166
- for ((frames, name) in extremeCases) {
167
- val requestedBytes = frames * 2
168
- val minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat)
169
- val actualBufferSize = if (requestedBytes < minBufferSize) minBufferSize else requestedBytes
170
-
171
- audioRecord?.release()
172
- audioRecord = AudioRecord(
173
- MediaRecorder.AudioSource.MIC,
174
- sampleRate,
175
- channelConfig,
176
- audioFormat,
177
- actualBufferSize
178
- )
179
-
180
- val state = audioRecord?.state
181
- val passed = state == AudioRecord.STATE_INITIALIZED
182
-
183
- results.add(TestResult(
184
- name = name,
185
- passed = passed,
186
- message = "Requested: $frames frames, Buffer size: ${actualBufferSize / 2} frames"
187
- ))
188
-
189
- println(" $name: $frames โ†’ ${actualBufferSize / 2} frames")
190
- }
191
- println()
192
- }
193
-
194
- @Test
195
- fun testBufferAccumulation() {
196
- println("Test 4: Buffer Accumulation for Small Durations")
197
- println("-----------------------------------------------")
198
-
199
- val sampleRate = 48000
200
- val channelConfig = AudioFormat.CHANNEL_IN_MONO
201
- val audioFormat = AudioFormat.ENCODING_PCM_16BIT
202
- val minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat)
203
-
204
- // Test very small buffer (20ms = 960 frames)
205
- val targetDuration = 0.02 // 20ms
206
- val targetFrames = (targetDuration * sampleRate).toInt()
207
- val targetBytes = targetFrames * 2
208
-
209
- audioRecord?.release()
210
- audioRecord = AudioRecord(
211
- MediaRecorder.AudioSource.MIC,
212
- sampleRate,
213
- channelConfig,
214
- audioFormat,
215
- minBufferSize // Use minimum buffer size
216
- )
217
-
218
- if (audioRecord?.state == AudioRecord.STATE_INITIALIZED) {
219
- audioRecord?.startRecording()
220
-
221
- // Accumulate small chunks
222
- val accumulator = mutableListOf<ByteArray>()
223
- var totalFrames = 0
224
- val smallBuffer = ByteArray(targetBytes)
225
-
226
- // Read multiple times to accumulate
227
- repeat(5) {
228
- val bytesRead = audioRecord?.read(smallBuffer, 0, smallBuffer.size) ?: -1
229
- if (bytesRead > 0) {
230
- accumulator.add(smallBuffer.copyOf(bytesRead))
231
- totalFrames += bytesRead / 2
232
- }
233
- }
234
-
235
- audioRecord?.stop()
236
-
237
- val passed = totalFrames >= targetFrames
238
- results.add(TestResult(
239
- name = "Buffer Accumulation",
240
- passed = passed,
241
- message = "Target: $targetFrames frames, Accumulated: $totalFrames frames over ${accumulator.size} reads"
242
- ))
243
-
244
- println("โœ“ Target frames: $targetFrames")
245
- println("โœ“ Accumulated: $totalFrames frames")
246
- println("โœ“ Number of reads: ${accumulator.size}")
247
- } else {
248
- results.add(TestResult(
249
- name = "Buffer Accumulation",
250
- passed = false,
251
- message = "Failed to initialize AudioRecord"
252
- ))
253
- }
254
- println()
255
- }
256
-
257
- @Test
258
- fun testDifferentSampleRates() {
259
- println("Test 5: Different Sample Rates")
260
- println("------------------------------")
261
-
262
- val channelConfig = AudioFormat.CHANNEL_IN_MONO
263
- val audioFormat = AudioFormat.ENCODING_PCM_16BIT
264
- val bufferDuration = 0.1 // 100ms
265
-
266
- val sampleRates = listOf(16000, 44100, 48000)
267
-
268
- for (sampleRate in sampleRates) {
269
- val minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat)
270
- val targetFrames = (bufferDuration * sampleRate).toInt()
271
- val targetBytes = targetFrames * 2
272
- val actualBufferSize = if (targetBytes < minBufferSize) minBufferSize else targetBytes
273
-
274
- audioRecord?.release()
275
- audioRecord = AudioRecord(
276
- MediaRecorder.AudioSource.MIC,
277
- sampleRate,
278
- channelConfig,
279
- audioFormat,
280
- actualBufferSize
281
- )
282
-
283
- val state = audioRecord?.state
284
- val passed = state == AudioRecord.STATE_INITIALIZED
285
-
286
- results.add(TestResult(
287
- name = "Sample Rate ${sampleRate}Hz",
288
- passed = passed,
289
- message = "Buffer duration: ${bufferDuration}s, Frames: ${actualBufferSize / 2}"
290
- ))
291
-
292
- println(" ${sampleRate}Hz: ${if (passed) "SUCCESS" else "FAILED"} - ${actualBufferSize / 2} frames")
293
- }
294
- println()
295
- }
296
-
297
- private fun printResults() {
298
- println("๐Ÿ“Š Test Results")
299
- println("===============")
300
-
301
- val passed = results.count { it.passed }
302
- val total = results.size
303
-
304
- for (result in results) {
305
- val status = if (result.passed) "โœ…" else "โŒ"
306
- println("$status ${result.name}")
307
- println(" ${result.message}")
308
- }
309
-
310
- println("\nSummary: $passed/$total tests passed")
311
-
312
- if (passed == total) {
313
- println("๐ŸŽ‰ All tests passed!")
314
- } else {
315
- println("โš ๏ธ Some tests failed")
316
- }
317
-
318
- println("\n๐Ÿ“ Key Findings:")
319
- println("- Android enforces minimum buffer size via getMinBufferSize()")
320
- println("- Minimum varies by device and sample rate")
321
- println("- Small buffers require accumulation strategy")
322
- println("- AudioRecord handles buffer sizing more flexibly than iOS")
323
- }
324
- }
@@ -1,253 +0,0 @@
1
- package net.siteed.audiostream.integration
2
-
3
- import android.os.Bundle
4
- import androidx.test.ext.junit.runners.AndroidJUnit4
5
- import androidx.test.platform.app.InstrumentationRegistry
6
- import org.junit.Test
7
- import org.junit.runner.RunWith
8
- import org.junit.Assert.*
9
- import java.io.File
10
-
11
- /**
12
- * Integration test for Compressed-Only Output (Issue #244)
13
- *
14
- * This test validates that when primary output is disabled and compressed output
15
- * is enabled, the compressed file information is properly returned in the result.
16
- */
17
- @RunWith(AndroidJUnit4::class)
18
- class CompressedOnlyOutputTest {
19
-
20
- private val context = InstrumentationRegistry.getInstrumentation().targetContext
21
-
22
- @Test
23
- fun testCompressedOnlyOutput_AAC() {
24
- println("๐Ÿงช Test: Compressed-Only Output with AAC")
25
- println("---------------------------------------")
26
-
27
- // Configuration with primary disabled, compressed enabled
28
- val config = Bundle().apply {
29
- putInt("sampleRate", 44100)
30
- putInt("channels", 1)
31
- putString("encoding", "pcm_16bit")
32
-
33
- val outputBundle = Bundle().apply {
34
- val primaryBundle = Bundle().apply {
35
- putBoolean("enabled", false)
36
- }
37
- val compressedBundle = Bundle().apply {
38
- putBoolean("enabled", true)
39
- putString("format", "aac")
40
- putInt("bitrate", 128000)
41
- }
42
- putBundle("primary", primaryBundle)
43
- putBundle("compressed", compressedBundle)
44
- }
45
- putBundle("output", outputBundle)
46
- }
47
-
48
- // Simulate recording result
49
- val result = simulateRecording(config)
50
-
51
- // Verify compression info is present
52
- val compressionBundle = result.getBundle("compression")
53
- assertNotNull("Compression info should not be null", compressionBundle)
54
-
55
- // Verify compressed file URI is provided
56
- val compressedFileUri = compressionBundle?.getString("compressedFileUri")
57
- assertNotNull("Compressed file URI should not be null", compressedFileUri)
58
- assertNotEquals("Compressed file URI should not be empty", "", compressedFileUri)
59
-
60
- // Verify format and bitrate
61
- assertEquals("aac", compressionBundle?.getString("format"))
62
- assertEquals(128000, compressionBundle?.getInt("bitrate"))
63
-
64
- println("โœ… Compression info properly returned")
65
- println("โœ… Compressed file URI: $compressedFileUri")
66
- println("โœ… Format: ${compressionBundle?.getString("format")}")
67
- println()
68
- }
69
-
70
- @Test
71
- fun testCompressedOnlyOutput_Opus() {
72
- println("๐Ÿงช Test: Compressed-Only Output with Opus")
73
- println("----------------------------------------")
74
-
75
- val config = Bundle().apply {
76
- putInt("sampleRate", 48000)
77
- putInt("channels", 1)
78
- putString("encoding", "pcm_16bit")
79
-
80
- val outputBundle = Bundle().apply {
81
- val primaryBundle = Bundle().apply {
82
- putBoolean("enabled", false)
83
- }
84
- val compressedBundle = Bundle().apply {
85
- putBoolean("enabled", true)
86
- putString("format", "opus")
87
- putInt("bitrate", 64000)
88
- }
89
- putBundle("primary", primaryBundle)
90
- putBundle("compressed", compressedBundle)
91
- }
92
- putBundle("output", outputBundle)
93
- }
94
-
95
- val result = simulateRecording(config)
96
- val compressionBundle = result.getBundle("compression")
97
-
98
- assertNotNull("Compression info should not be null", compressionBundle)
99
- assertEquals("opus", compressionBundle?.getString("format"))
100
- assertEquals(64000, compressionBundle?.getInt("bitrate"))
101
-
102
- println("โœ… Opus compression properly configured")
103
- println()
104
- }
105
-
106
- @Test
107
- fun testFileAccessibility() {
108
- println("๐Ÿงช Test: Verify Compressed File Accessibility")
109
- println("--------------------------------------------")
110
-
111
- val config = Bundle().apply {
112
- putInt("sampleRate", 44100)
113
- putInt("channels", 1)
114
- putString("encoding", "pcm_16bit")
115
-
116
- val outputBundle = Bundle().apply {
117
- val primaryBundle = Bundle().apply {
118
- putBoolean("enabled", false)
119
- }
120
- val compressedBundle = Bundle().apply {
121
- putBoolean("enabled", true)
122
- putString("format", "aac")
123
- }
124
- putBundle("primary", primaryBundle)
125
- putBundle("compressed", compressedBundle)
126
- }
127
- putBundle("output", outputBundle)
128
- }
129
-
130
- val result = simulateRecording(config)
131
-
132
- // Check main result structure
133
- val fileUri = result.getString("fileUri", "")
134
- val filename = result.getString("filename", "")
135
-
136
- // Check compression structure
137
- val compressionBundle = result.getBundle("compression")
138
- val compressedUri = compressionBundle?.getString("compressedFileUri")
139
- val compressedSize = compressionBundle?.getLong("size", 0L) ?: 0L
140
-
141
- // When primary is disabled, we should have access to compressed file
142
- val hasAccessToCompressed = !compressedUri.isNullOrEmpty() || fileUri.isNotEmpty()
143
-
144
- assertTrue("Should have access to compressed file", hasAccessToCompressed)
145
- assertTrue("Compressed file should have size > 0", compressedSize > 0)
146
-
147
- println("โœ… Compressed file is accessible")
148
- println("โœ… File size reported: $compressedSize bytes")
149
- println()
150
- }
151
-
152
- @Test
153
- fun testBugScenario() {
154
- println("๐Ÿงช Test: Current Bug Scenario")
155
- println("-----------------------------")
156
-
157
- // This test demonstrates the current bug
158
- val config = Bundle().apply {
159
- putInt("sampleRate", 44100)
160
- putInt("channels", 1)
161
- putString("encoding", "pcm_16bit")
162
-
163
- val outputBundle = Bundle().apply {
164
- val primaryBundle = Bundle().apply {
165
- putBoolean("enabled", false)
166
- }
167
- val compressedBundle = Bundle().apply {
168
- putBoolean("enabled", true)
169
- putString("format", "aac")
170
- putInt("bitrate", 128000)
171
- }
172
- putBundle("primary", primaryBundle)
173
- putBundle("compressed", compressedBundle)
174
- }
175
- putBundle("output", outputBundle)
176
- }
177
-
178
- // Current buggy behavior
179
- val buggyResult = simulateBuggyRecording(config)
180
-
181
- // This is what currently happens - compression is null
182
- val compressionBundle = buggyResult.getBundle("compression")
183
-
184
- if (compressionBundle == null) {
185
- println("โŒ BUG CONFIRMED: Compression info is null when primary is disabled")
186
- println(" This prevents users from accessing the compressed file")
187
- } else {
188
- println("โœ… Bug appears to be fixed - compression info is present")
189
- }
190
- println()
191
- }
192
-
193
- /**
194
- * Simulates the expected correct behavior after fix
195
- */
196
- private fun simulateRecording(config: Bundle): Bundle {
197
- val outputConfig = config.getBundle("output")
198
- val primaryEnabled = outputConfig?.getBundle("primary")?.getBoolean("enabled", true) ?: true
199
- val compressedConfig = outputConfig?.getBundle("compressed")
200
- val compressedEnabled = compressedConfig?.getBoolean("enabled", false) ?: false
201
-
202
- return Bundle().apply {
203
- if (!primaryEnabled) {
204
- // Expected behavior after fix
205
- putString("fileUri", "")
206
- putString("filename", "stream-only")
207
- putLong("durationMs", 5000)
208
- putLong("size", 0)
209
- putString("mimeType", "audio/wav")
210
-
211
- // FIXED: Include compression info when compressed is enabled
212
- if (compressedEnabled) {
213
- val compressionBundle = Bundle().apply {
214
- putString("compressedFileUri", "file:///storage/emulated/0/Android/data/test/files/recording.aac")
215
- putString("format", compressedConfig?.getString("format") ?: "aac")
216
- putInt("bitrate", compressedConfig?.getInt("bitrate") ?: 128000)
217
- putLong("size", 40000)
218
- putString("mimeType", "audio/aac")
219
- }
220
- putBundle("compression", compressionBundle)
221
- }
222
- } else {
223
- // Normal behavior
224
- putString("fileUri", "file:///storage/emulated/0/Android/data/test/files/recording.wav")
225
- putString("filename", "recording.wav")
226
- putLong("durationMs", 5000)
227
- putLong("size", 240000)
228
- putString("mimeType", "audio/wav")
229
- }
230
- }
231
- }
232
-
233
- /**
234
- * Simulates the current buggy behavior
235
- */
236
- private fun simulateBuggyRecording(config: Bundle): Bundle {
237
- val outputConfig = config.getBundle("output")
238
- val primaryEnabled = outputConfig?.getBundle("primary")?.getBoolean("enabled", true) ?: true
239
-
240
- return Bundle().apply {
241
- if (!primaryEnabled) {
242
- // Current buggy behavior
243
- putString("fileUri", "")
244
- putString("filename", "stream-only")
245
- putLong("durationMs", 5000)
246
- putLong("size", 0)
247
- putString("mimeType", "audio/wav")
248
- // BUG: compression is null even when compressed output is enabled
249
- putBundle("compression", null)
250
- }
251
- }
252
- }
253
- }