@siteed/audio-studio 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 (375) hide show
  1. package/CHANGELOG.md +535 -0
  2. package/LICENSE +21 -0
  3. package/README.md +167 -0
  4. package/android/build.gradle +143 -0
  5. package/android/src/androidTest/assets/chorus.wav +0 -0
  6. package/android/src/androidTest/assets/jfk.wav +0 -0
  7. package/android/src/androidTest/assets/osr_us_000_0010_8k.wav +0 -0
  8. package/android/src/androidTest/assets/recorder_hello_world.wav +0 -0
  9. package/android/src/androidTest/java/net/siteed/audiostudio/AudioProcessorInstrumentedTest.kt +197 -0
  10. package/android/src/androidTest/java/net/siteed/audiostudio/AudioRecorderInstrumentedTest.kt +541 -0
  11. package/android/src/androidTest/java/net/siteed/audiostudio/AudioRecorderPerformanceInstrumentedTest.kt +234 -0
  12. package/android/src/androidTest/java/net/siteed/audiostudio/integration/AudioFocusStrategyIntegrationTest.kt +332 -0
  13. package/android/src/androidTest/java/net/siteed/audiostudio/integration/BufferDurationIntegrationTest.kt +324 -0
  14. package/android/src/androidTest/java/net/siteed/audiostudio/integration/CompressedOnlyOutputTest.kt +253 -0
  15. package/android/src/androidTest/java/net/siteed/audiostudio/integration/DeviceDisconnectionFallbackTest.kt +218 -0
  16. package/android/src/androidTest/java/net/siteed/audiostudio/integration/EventEmissionIntervalTest.kt +120 -0
  17. package/android/src/androidTest/java/net/siteed/audiostudio/integration/M4aFormatTest.kt +345 -0
  18. package/android/src/androidTest/java/net/siteed/audiostudio/integration/OutputControlIntegrationTest.kt +340 -0
  19. package/android/src/androidTest/java/net/siteed/audiostudio/integration/PcmStreamingDurationTest.kt +252 -0
  20. package/android/src/androidTest/java/net/siteed/audiostudio/integration/README.md +95 -0
  21. package/android/src/androidTest/java/net/siteed/audiostudio/integration/run_integration_tests.sh +43 -0
  22. package/android/src/main/AndroidManifest.xml +30 -0
  23. package/android/src/main/CMakeLists.txt +29 -0
  24. package/android/src/main/java/net/siteed/audiostudio/AudioAnalysisData.kt +188 -0
  25. package/android/src/main/java/net/siteed/audiostudio/AudioDataEncoder.kt +9 -0
  26. package/android/src/main/java/net/siteed/audiostudio/AudioDeviceManager.kt +1741 -0
  27. package/android/src/main/java/net/siteed/audiostudio/AudioFeaturesNative.kt +26 -0
  28. package/android/src/main/java/net/siteed/audiostudio/AudioFileHandler.kt +136 -0
  29. package/android/src/main/java/net/siteed/audiostudio/AudioFormatUtils.kt +354 -0
  30. package/android/src/main/java/net/siteed/audiostudio/AudioNotificationsManager.kt +439 -0
  31. package/android/src/main/java/net/siteed/audiostudio/AudioProcessor.kt +2237 -0
  32. package/android/src/main/java/net/siteed/audiostudio/AudioRecorderManager.kt +2163 -0
  33. package/android/src/main/java/net/siteed/audiostudio/AudioRecordingService.kt +167 -0
  34. package/android/src/main/java/net/siteed/audiostudio/AudioStudioModule.kt +1112 -0
  35. package/android/src/main/java/net/siteed/audiostudio/AudioTrimmer.kt +1099 -0
  36. package/android/src/main/java/net/siteed/audiostudio/Constants.kt +37 -0
  37. package/android/src/main/java/net/siteed/audiostudio/EventSender.kt +7 -0
  38. package/android/src/main/java/net/siteed/audiostudio/FFT.kt +100 -0
  39. package/android/src/main/java/net/siteed/audiostudio/Features.kt +98 -0
  40. package/android/src/main/java/net/siteed/audiostudio/LogUtils.kt +93 -0
  41. package/android/src/main/java/net/siteed/audiostudio/MelSpectrogramNative.kt +36 -0
  42. package/android/src/main/java/net/siteed/audiostudio/NotificationConfig.kt +72 -0
  43. package/android/src/main/java/net/siteed/audiostudio/PermissionUtils.kt +68 -0
  44. package/android/src/main/java/net/siteed/audiostudio/RecordingActionReceiver.kt +59 -0
  45. package/android/src/main/java/net/siteed/audiostudio/RecordingConfig.kt +259 -0
  46. package/android/src/main/java/net/siteed/audiostudio/WaveformConfig.kt +19 -0
  47. package/android/src/main/java/net/siteed/audiostudio/WaveformRenderer.kt +159 -0
  48. package/android/src/main/jni/AudioFeaturesJNI.cpp +152 -0
  49. package/android/src/main/jni/MelSpectrogramJNI.cpp +165 -0
  50. package/android/src/main/res/drawable/ic_default_action_icon.xml +16 -0
  51. package/android/src/main/res/drawable/ic_microphone.xml +13 -0
  52. package/android/src/main/res/drawable/ic_pause.xml +10 -0
  53. package/android/src/main/res/drawable/ic_play.xml +10 -0
  54. package/android/src/main/res/drawable/ic_stop.xml +10 -0
  55. package/android/src/main/res/layout/notification_recording.xml +37 -0
  56. package/android/src/test/java/net/siteed/audiostudio/AudioFileHandlerTest.kt +279 -0
  57. package/android/src/test/java/net/siteed/audiostudio/AudioFocusStrategyTest.kt +249 -0
  58. package/android/src/test/java/net/siteed/audiostudio/AudioFormatTest.kt +151 -0
  59. package/android/src/test/java/net/siteed/audiostudio/AudioFormatUtilsTest.kt +273 -0
  60. package/android/src/test/java/net/siteed/audiostudio/DeviceDisconnectionFallbackUnitTest.kt +140 -0
  61. package/android/src/test/resources/chorus.wav +0 -0
  62. package/android/src/test/resources/generate_test_audio.py +94 -0
  63. package/android/src/test/resources/jfk.wav +0 -0
  64. package/android/src/test/resources/osr_us_000_0010_8k.wav +0 -0
  65. package/android/src/test/resources/recorder_hello_world.wav +0 -0
  66. package/app.plugin.js +3 -0
  67. package/build/cjs/AudioAnalysis/AudioAnalysis.types.js +4 -0
  68. package/build/cjs/AudioAnalysis/AudioAnalysis.types.js.map +1 -0
  69. package/build/cjs/AudioAnalysis/audioFeaturesWasm.js +164 -0
  70. package/build/cjs/AudioAnalysis/audioFeaturesWasm.js.map +1 -0
  71. package/build/cjs/AudioAnalysis/extractAudioAnalysis.js +213 -0
  72. package/build/cjs/AudioAnalysis/extractAudioAnalysis.js.map +1 -0
  73. package/build/cjs/AudioAnalysis/extractAudioData.js +21 -0
  74. package/build/cjs/AudioAnalysis/extractAudioData.js.map +1 -0
  75. package/build/cjs/AudioAnalysis/extractMelSpectrogram.js +90 -0
  76. package/build/cjs/AudioAnalysis/extractMelSpectrogram.js.map +1 -0
  77. package/build/cjs/AudioAnalysis/extractPreview.js +28 -0
  78. package/build/cjs/AudioAnalysis/extractPreview.js.map +1 -0
  79. package/build/cjs/AudioAnalysis/extractWaveform.js +18 -0
  80. package/build/cjs/AudioAnalysis/extractWaveform.js.map +1 -0
  81. package/build/cjs/AudioAnalysis/melSpectrogramWasm.js +149 -0
  82. package/build/cjs/AudioAnalysis/melSpectrogramWasm.js.map +1 -0
  83. package/build/cjs/AudioDeviceManager.js +688 -0
  84. package/build/cjs/AudioDeviceManager.js.map +1 -0
  85. package/build/cjs/AudioRecorder.provider.js +78 -0
  86. package/build/cjs/AudioRecorder.provider.js.map +1 -0
  87. package/build/cjs/AudioStudio.native.js +8 -0
  88. package/build/cjs/AudioStudio.native.js.map +1 -0
  89. package/build/cjs/AudioStudio.types.js +11 -0
  90. package/build/cjs/AudioStudio.types.js.map +1 -0
  91. package/build/cjs/AudioStudio.web.js +708 -0
  92. package/build/cjs/AudioStudio.web.js.map +1 -0
  93. package/build/cjs/AudioStudioModule.js +718 -0
  94. package/build/cjs/AudioStudioModule.js.map +1 -0
  95. package/build/cjs/WebRecorder.web.js +865 -0
  96. package/build/cjs/WebRecorder.web.js.map +1 -0
  97. package/build/cjs/constants/platformLimitations.js +99 -0
  98. package/build/cjs/constants/platformLimitations.js.map +1 -0
  99. package/build/cjs/constants.js +20 -0
  100. package/build/cjs/constants.js.map +1 -0
  101. package/build/cjs/events.js +29 -0
  102. package/build/cjs/events.js.map +1 -0
  103. package/build/cjs/hooks/useAudioDevices.js +179 -0
  104. package/build/cjs/hooks/useAudioDevices.js.map +1 -0
  105. package/build/cjs/index.js +64 -0
  106. package/build/cjs/index.js.map +1 -0
  107. package/build/cjs/trimAudio.js +76 -0
  108. package/build/cjs/trimAudio.js.map +1 -0
  109. package/build/cjs/useAudioRecorder.js +535 -0
  110. package/build/cjs/useAudioRecorder.js.map +1 -0
  111. package/build/cjs/utils/BlobFix.js +502 -0
  112. package/build/cjs/utils/BlobFix.js.map +1 -0
  113. package/build/cjs/utils/audioProcessing.js +136 -0
  114. package/build/cjs/utils/audioProcessing.js.map +1 -0
  115. package/build/cjs/utils/cleanNativeOptions.js +22 -0
  116. package/build/cjs/utils/cleanNativeOptions.js.map +1 -0
  117. package/build/cjs/utils/concatenateBuffers.js +25 -0
  118. package/build/cjs/utils/concatenateBuffers.js.map +1 -0
  119. package/build/cjs/utils/convertPCMToFloat32.js +124 -0
  120. package/build/cjs/utils/convertPCMToFloat32.js.map +1 -0
  121. package/build/cjs/utils/crc32.js +52 -0
  122. package/build/cjs/utils/crc32.js.map +1 -0
  123. package/build/cjs/utils/encodingToBitDepth.js +17 -0
  124. package/build/cjs/utils/encodingToBitDepth.js.map +1 -0
  125. package/build/cjs/utils/getWavFileInfo.js +96 -0
  126. package/build/cjs/utils/getWavFileInfo.js.map +1 -0
  127. package/build/cjs/utils/writeWavHeader.js +88 -0
  128. package/build/cjs/utils/writeWavHeader.js.map +1 -0
  129. package/build/cjs/workers/InlineFeaturesExtractor.web.js +294 -0
  130. package/build/cjs/workers/InlineFeaturesExtractor.web.js.map +1 -0
  131. package/build/cjs/workers/inlineAudioWebWorker.web.js +190 -0
  132. package/build/cjs/workers/inlineAudioWebWorker.web.js.map +1 -0
  133. package/build/cjs/workers/wasmGlueString.web.js +27 -0
  134. package/build/cjs/workers/wasmGlueString.web.js.map +1 -0
  135. package/build/esm/AudioAnalysis/AudioAnalysis.types.js +3 -0
  136. package/build/esm/AudioAnalysis/AudioAnalysis.types.js.map +1 -0
  137. package/build/esm/AudioAnalysis/audioFeaturesWasm.js +126 -0
  138. package/build/esm/AudioAnalysis/audioFeaturesWasm.js.map +1 -0
  139. package/build/esm/AudioAnalysis/extractAudioAnalysis.js +205 -0
  140. package/build/esm/AudioAnalysis/extractAudioAnalysis.js.map +1 -0
  141. package/build/esm/AudioAnalysis/extractAudioData.js +14 -0
  142. package/build/esm/AudioAnalysis/extractAudioData.js.map +1 -0
  143. package/build/esm/AudioAnalysis/extractMelSpectrogram.js +86 -0
  144. package/build/esm/AudioAnalysis/extractMelSpectrogram.js.map +1 -0
  145. package/build/esm/AudioAnalysis/extractPreview.js +25 -0
  146. package/build/esm/AudioAnalysis/extractPreview.js.map +1 -0
  147. package/build/esm/AudioAnalysis/extractWaveform.js +11 -0
  148. package/build/esm/AudioAnalysis/extractWaveform.js.map +1 -0
  149. package/build/esm/AudioAnalysis/melSpectrogramWasm.js +111 -0
  150. package/build/esm/AudioAnalysis/melSpectrogramWasm.js.map +1 -0
  151. package/build/esm/AudioDeviceManager.js +681 -0
  152. package/build/esm/AudioDeviceManager.js.map +1 -0
  153. package/build/esm/AudioRecorder.provider.js +40 -0
  154. package/build/esm/AudioRecorder.provider.js.map +1 -0
  155. package/build/esm/AudioStudio.native.js +6 -0
  156. package/build/esm/AudioStudio.native.js.map +1 -0
  157. package/build/esm/AudioStudio.types.js +8 -0
  158. package/build/esm/AudioStudio.types.js.map +1 -0
  159. package/build/esm/AudioStudio.web.js +704 -0
  160. package/build/esm/AudioStudio.web.js.map +1 -0
  161. package/build/esm/AudioStudioModule.js +713 -0
  162. package/build/esm/AudioStudioModule.js.map +1 -0
  163. package/build/esm/WebRecorder.web.js +861 -0
  164. package/build/esm/WebRecorder.web.js.map +1 -0
  165. package/build/esm/constants/platformLimitations.js +90 -0
  166. package/build/esm/constants/platformLimitations.js.map +1 -0
  167. package/build/esm/constants.js +17 -0
  168. package/build/esm/constants.js.map +1 -0
  169. package/build/esm/events.js +21 -0
  170. package/build/esm/events.js.map +1 -0
  171. package/build/esm/hooks/useAudioDevices.js +176 -0
  172. package/build/esm/hooks/useAudioDevices.js.map +1 -0
  173. package/build/esm/index.js +23 -0
  174. package/build/esm/index.js.map +1 -0
  175. package/build/esm/trimAudio.js +69 -0
  176. package/build/esm/trimAudio.js.map +1 -0
  177. package/build/esm/useAudioRecorder.js +529 -0
  178. package/build/esm/useAudioRecorder.js.map +1 -0
  179. package/build/esm/utils/BlobFix.js +498 -0
  180. package/build/esm/utils/BlobFix.js.map +1 -0
  181. package/build/esm/utils/audioProcessing.js +133 -0
  182. package/build/esm/utils/audioProcessing.js.map +1 -0
  183. package/build/esm/utils/cleanNativeOptions.js +19 -0
  184. package/build/esm/utils/cleanNativeOptions.js.map +1 -0
  185. package/build/esm/utils/concatenateBuffers.js +21 -0
  186. package/build/esm/utils/concatenateBuffers.js.map +1 -0
  187. package/build/esm/utils/convertPCMToFloat32.js +120 -0
  188. package/build/esm/utils/convertPCMToFloat32.js.map +1 -0
  189. package/build/esm/utils/crc32.js +50 -0
  190. package/build/esm/utils/crc32.js.map +1 -0
  191. package/build/esm/utils/encodingToBitDepth.js +13 -0
  192. package/build/esm/utils/encodingToBitDepth.js.map +1 -0
  193. package/build/esm/utils/getWavFileInfo.js +92 -0
  194. package/build/esm/utils/getWavFileInfo.js.map +1 -0
  195. package/build/esm/utils/writeWavHeader.js +84 -0
  196. package/build/esm/utils/writeWavHeader.js.map +1 -0
  197. package/build/esm/workers/InlineFeaturesExtractor.web.js +291 -0
  198. package/build/esm/workers/InlineFeaturesExtractor.web.js.map +1 -0
  199. package/build/esm/workers/inlineAudioWebWorker.web.js +187 -0
  200. package/build/esm/workers/inlineAudioWebWorker.web.js.map +1 -0
  201. package/build/esm/workers/wasmGlueString.web.js +24 -0
  202. package/build/esm/workers/wasmGlueString.web.js.map +1 -0
  203. package/build/types/AudioAnalysis/AudioAnalysis.types.d.ts +198 -0
  204. package/build/types/AudioAnalysis/AudioAnalysis.types.d.ts.map +1 -0
  205. package/build/types/AudioAnalysis/audioFeaturesWasm.d.ts +24 -0
  206. package/build/types/AudioAnalysis/audioFeaturesWasm.d.ts.map +1 -0
  207. package/build/types/AudioAnalysis/extractAudioAnalysis.d.ts +74 -0
  208. package/build/types/AudioAnalysis/extractAudioAnalysis.d.ts.map +1 -0
  209. package/build/types/AudioAnalysis/extractAudioData.d.ts +3 -0
  210. package/build/types/AudioAnalysis/extractAudioData.d.ts.map +1 -0
  211. package/build/types/AudioAnalysis/extractMelSpectrogram.d.ts +20 -0
  212. package/build/types/AudioAnalysis/extractMelSpectrogram.d.ts.map +1 -0
  213. package/build/types/AudioAnalysis/extractPreview.d.ts +11 -0
  214. package/build/types/AudioAnalysis/extractPreview.d.ts.map +1 -0
  215. package/build/types/AudioAnalysis/extractWaveform.d.ts +8 -0
  216. package/build/types/AudioAnalysis/extractWaveform.d.ts.map +1 -0
  217. package/build/types/AudioAnalysis/melSpectrogramWasm.d.ts +16 -0
  218. package/build/types/AudioAnalysis/melSpectrogramWasm.d.ts.map +1 -0
  219. package/build/types/AudioDeviceManager.d.ts +187 -0
  220. package/build/types/AudioDeviceManager.d.ts.map +1 -0
  221. package/build/types/AudioRecorder.provider.d.ts +11 -0
  222. package/build/types/AudioRecorder.provider.d.ts.map +1 -0
  223. package/build/types/AudioStudio.native.d.ts +3 -0
  224. package/build/types/AudioStudio.native.d.ts.map +1 -0
  225. package/build/types/AudioStudio.types.d.ts +760 -0
  226. package/build/types/AudioStudio.types.d.ts.map +1 -0
  227. package/build/types/AudioStudio.web.d.ts +96 -0
  228. package/build/types/AudioStudio.web.d.ts.map +1 -0
  229. package/build/types/AudioStudioModule.d.ts +3 -0
  230. package/build/types/AudioStudioModule.d.ts.map +1 -0
  231. package/build/types/WebRecorder.web.d.ts +208 -0
  232. package/build/types/WebRecorder.web.d.ts.map +1 -0
  233. package/build/types/constants/platformLimitations.d.ts +40 -0
  234. package/build/types/constants/platformLimitations.d.ts.map +1 -0
  235. package/build/types/constants.d.ts +14 -0
  236. package/build/types/constants.d.ts.map +1 -0
  237. package/build/types/events.d.ts +29 -0
  238. package/build/types/events.d.ts.map +1 -0
  239. package/build/types/hooks/useAudioDevices.d.ts +15 -0
  240. package/build/types/hooks/useAudioDevices.d.ts.map +1 -0
  241. package/build/types/index.d.ts +21 -0
  242. package/build/types/index.d.ts.map +1 -0
  243. package/build/types/trimAudio.d.ts +25 -0
  244. package/build/types/trimAudio.d.ts.map +1 -0
  245. package/build/types/useAudioRecorder.d.ts +22 -0
  246. package/build/types/useAudioRecorder.d.ts.map +1 -0
  247. package/build/types/utils/BlobFix.d.ts +9 -0
  248. package/build/types/utils/BlobFix.d.ts.map +1 -0
  249. package/build/types/utils/audioProcessing.d.ts +24 -0
  250. package/build/types/utils/audioProcessing.d.ts.map +1 -0
  251. package/build/types/utils/cleanNativeOptions.d.ts +15 -0
  252. package/build/types/utils/cleanNativeOptions.d.ts.map +1 -0
  253. package/build/types/utils/concatenateBuffers.d.ts +8 -0
  254. package/build/types/utils/concatenateBuffers.d.ts.map +1 -0
  255. package/build/types/utils/convertPCMToFloat32.d.ts +13 -0
  256. package/build/types/utils/convertPCMToFloat32.d.ts.map +1 -0
  257. package/build/types/utils/crc32.d.ts +7 -0
  258. package/build/types/utils/crc32.d.ts.map +1 -0
  259. package/build/types/utils/encodingToBitDepth.d.ts +5 -0
  260. package/build/types/utils/encodingToBitDepth.d.ts.map +1 -0
  261. package/build/types/utils/getWavFileInfo.d.ts +26 -0
  262. package/build/types/utils/getWavFileInfo.d.ts.map +1 -0
  263. package/build/types/utils/writeWavHeader.d.ts +34 -0
  264. package/build/types/utils/writeWavHeader.d.ts.map +1 -0
  265. package/build/types/workers/InlineFeaturesExtractor.web.d.ts +2 -0
  266. package/build/types/workers/InlineFeaturesExtractor.web.d.ts.map +1 -0
  267. package/build/types/workers/inlineAudioWebWorker.web.d.ts +2 -0
  268. package/build/types/workers/inlineAudioWebWorker.web.d.ts.map +1 -0
  269. package/build/types/workers/wasmGlueString.web.d.ts +2 -0
  270. package/build/types/workers/wasmGlueString.web.d.ts.map +1 -0
  271. package/cpp/AudioFeatures.cpp +274 -0
  272. package/cpp/AudioFeatures.h +85 -0
  273. package/cpp/AudioFeaturesBridge.cpp +146 -0
  274. package/cpp/AudioFeaturesBridge.h +47 -0
  275. package/cpp/MelSpectrogram.cpp +227 -0
  276. package/cpp/MelSpectrogram.h +82 -0
  277. package/cpp/MelSpectrogramBridge.cpp +112 -0
  278. package/cpp/MelSpectrogramBridge.h +33 -0
  279. package/cpp/kiss_fft/COPYING +11 -0
  280. package/cpp/kiss_fft/_kiss_fft_guts.h +167 -0
  281. package/cpp/kiss_fft/kiss_fft.c +424 -0
  282. package/cpp/kiss_fft/kiss_fft.h +160 -0
  283. package/cpp/kiss_fft/kiss_fft_log.h +36 -0
  284. package/cpp/kiss_fft/kiss_fftr.c +155 -0
  285. package/cpp/kiss_fft/kiss_fftr.h +54 -0
  286. package/expo-module.config.json +10 -0
  287. package/ios/AudioAnalysisData.swift +74 -0
  288. package/ios/AudioDeviceManager.swift +670 -0
  289. package/ios/AudioFeaturesWrapper.h +21 -0
  290. package/ios/AudioFeaturesWrapper.mm +63 -0
  291. package/ios/AudioNotificationManager.swift +154 -0
  292. package/ios/AudioProcessingHelpers.swift +797 -0
  293. package/ios/AudioProcessor.swift +1191 -0
  294. package/ios/AudioStreamError.swift +7 -0
  295. package/ios/AudioStreamManager.swift +2369 -0
  296. package/ios/AudioStreamManagerDelegate.swift +16 -0
  297. package/ios/AudioStudio.podspec +39 -0
  298. package/ios/AudioStudioModule.swift +1111 -0
  299. package/ios/AudioStudioTests/AudioFileHandlerTests.swift +338 -0
  300. package/ios/AudioStudioTests/AudioFormatUtilsTests.swift +331 -0
  301. package/ios/AudioStudioTests/AudioTestHelpers.swift +130 -0
  302. package/ios/AudioStudioTests/CompressedOnlyOutputTests.swift +294 -0
  303. package/ios/AudioStudioTests/EventEmissionIntervalTests.swift +105 -0
  304. package/ios/AudioStudioTests/Info.plist +22 -0
  305. package/ios/AudioStudioTests/README.md +39 -0
  306. package/ios/AudioStudioTests/SimpleAudioTest.swift +98 -0
  307. package/ios/AudioStudioTests/TestAudioGenerator.swift +75 -0
  308. package/ios/DataPoint.swift +54 -0
  309. package/ios/DecodingConfig.swift +59 -0
  310. package/ios/FFT.swift +62 -0
  311. package/ios/Features.swift +95 -0
  312. package/ios/ISSUE_IOS.md +68 -0
  313. package/ios/Logger.swift +39 -0
  314. package/ios/MelSpectrogramWrapper.h +30 -0
  315. package/ios/MelSpectrogramWrapper.mm +97 -0
  316. package/ios/NotificationExtension.swift +15 -0
  317. package/ios/RecordingResult.swift +22 -0
  318. package/ios/RecordingSettings.swift +311 -0
  319. package/ios/WaveformExtractor.swift +105 -0
  320. package/ios/tests/README.md +41 -0
  321. package/ios/tests/integration/buffer_and_fallback_test.swift +178 -0
  322. package/ios/tests/integration/buffer_duration_test.swift +185 -0
  323. package/ios/tests/integration/compressed_only_output_test.swift +271 -0
  324. package/ios/tests/integration/output_control_test.swift +322 -0
  325. package/ios/tests/integration/run_integration_tests.sh +37 -0
  326. package/ios/tests/opus_support_test_macos.swift +154 -0
  327. package/ios/tests/standalone/audio_processing_test.swift +144 -0
  328. package/ios/tests/standalone/audio_recording_test.swift +277 -0
  329. package/ios/tests/standalone/audio_streaming_test.swift +249 -0
  330. package/ios/tests/standalone/standalone_test.swift +144 -0
  331. package/package.json +146 -0
  332. package/plugin/build/index.cjs +194 -0
  333. package/plugin/build/index.d.cts +22 -0
  334. package/plugin/build/index.js +194 -0
  335. package/plugin/src/index.ts +285 -0
  336. package/plugin/tsconfig.json +10 -0
  337. package/plugin/tsconfig.tsbuildinfo +1 -0
  338. package/prebuilt/wasm/mel-spectrogram.js +18 -0
  339. package/src/AudioAnalysis/AudioAnalysis.types.ts +226 -0
  340. package/src/AudioAnalysis/audio-features-wasm.d.ts +37 -0
  341. package/src/AudioAnalysis/audioFeaturesWasm.ts +200 -0
  342. package/src/AudioAnalysis/extractAudioAnalysis.ts +350 -0
  343. package/src/AudioAnalysis/extractAudioData.ts +17 -0
  344. package/src/AudioAnalysis/extractMelSpectrogram.ts +140 -0
  345. package/src/AudioAnalysis/extractPreview.ts +34 -0
  346. package/src/AudioAnalysis/extractWaveform.ts +22 -0
  347. package/src/AudioAnalysis/mel-spectrogram-wasm.d.ts +48 -0
  348. package/src/AudioAnalysis/melSpectrogramWasm.ts +179 -0
  349. package/src/AudioDeviceManager.ts +800 -0
  350. package/src/AudioRecorder.provider.tsx +57 -0
  351. package/src/AudioStudio.native.ts +6 -0
  352. package/src/AudioStudio.types.ts +899 -0
  353. package/src/AudioStudio.web.ts +911 -0
  354. package/src/AudioStudioModule.ts +984 -0
  355. package/src/WebRecorder.web.ts +1114 -0
  356. package/src/constants/platformLimitations.ts +118 -0
  357. package/src/constants.ts +21 -0
  358. package/src/events.ts +63 -0
  359. package/src/hooks/useAudioDevices.ts +213 -0
  360. package/src/index.ts +67 -0
  361. package/src/trimAudio.ts +94 -0
  362. package/src/types/crc-32.d.ts +9 -0
  363. package/src/useAudioRecorder.tsx +784 -0
  364. package/src/utils/BlobFix.ts +561 -0
  365. package/src/utils/audioProcessing.ts +205 -0
  366. package/src/utils/cleanNativeOptions.ts +18 -0
  367. package/src/utils/concatenateBuffers.ts +24 -0
  368. package/src/utils/convertPCMToFloat32.ts +170 -0
  369. package/src/utils/crc32.ts +59 -0
  370. package/src/utils/encodingToBitDepth.ts +18 -0
  371. package/src/utils/getWavFileInfo.ts +132 -0
  372. package/src/utils/writeWavHeader.ts +115 -0
  373. package/src/workers/InlineFeaturesExtractor.web.tsx +291 -0
  374. package/src/workers/inlineAudioWebWorker.web.tsx +186 -0
  375. package/src/workers/wasmGlueString.web.ts +23 -0
@@ -0,0 +1,285 @@
1
+ import {
2
+ ConfigPlugin,
3
+ withAndroidManifest,
4
+ withInfoPlist,
5
+ AndroidConfig,
6
+ } from '@expo/config-plugins'
7
+ import { ExpoConfig } from '@expo/config-types'
8
+
9
+ const MICROPHONE_USAGE = 'Allow $(PRODUCT_NAME) to access your microphone'
10
+ const NOTIFICATION_USAGE = 'Show recording notifications and controls'
11
+ const LOG_PREFIX = '[@siteed/expo-audio-studio]'
12
+
13
+ function debugLog(message: string, ...args: unknown[]): void {
14
+ if (process.env.EXPO_DEBUG) {
15
+ console.log(`${LOG_PREFIX} ${message}`, ...args)
16
+ }
17
+ }
18
+
19
+ interface AudioStreamPluginOptions {
20
+ enablePhoneStateHandling?: boolean // Controls READ_PHONE_STATE permission
21
+ enableNotifications?: boolean
22
+ enableBackgroundAudio?: boolean
23
+ enableDeviceDetection?: boolean // Controls Bluetooth and USB permissions for device change detection
24
+ iosBackgroundModes?: {
25
+ useVoIP?: boolean
26
+ useAudio?: boolean
27
+ useProcessing?: boolean
28
+ useLocation?: boolean
29
+ useExternalAccessory?: boolean
30
+ }
31
+ iosConfig?: {
32
+ allowBackgroundAudioControls?: boolean
33
+ backgroundProcessingTitle?: string
34
+ microphoneUsageDescription?: string
35
+ notificationUsageDescription?: string
36
+ }
37
+ }
38
+
39
+ const withRecordingPermission: ConfigPlugin<AudioStreamPluginOptions> = (
40
+ config: ExpoConfig,
41
+ props: AudioStreamPluginOptions | void
42
+ ) => {
43
+ const options: AudioStreamPluginOptions = {
44
+ enablePhoneStateHandling: true, // Default to true for backward compatibility
45
+ enableNotifications: true,
46
+ enableBackgroundAudio: true,
47
+ enableDeviceDetection: true, // Default to true for backward compatibility
48
+ iosBackgroundModes: {
49
+ useVoIP: false,
50
+ useAudio: false,
51
+ useProcessing: false,
52
+ useLocation: false,
53
+ useExternalAccessory: false,
54
+ },
55
+ iosConfig: {
56
+ microphoneUsageDescription: MICROPHONE_USAGE,
57
+ notificationUsageDescription: NOTIFICATION_USAGE,
58
+ },
59
+ ...(props || {}),
60
+ }
61
+
62
+ const {
63
+ enablePhoneStateHandling,
64
+ enableNotifications,
65
+ enableBackgroundAudio,
66
+ enableDeviceDetection,
67
+ } = options
68
+
69
+ debugLog('📱 Configuring Recording Permissions Plugin...', options)
70
+
71
+ // iOS Configuration
72
+ config = withInfoPlist(config as any, (config) => {
73
+ // Always set the microphone usage description from options first
74
+ config.modResults['NSMicrophoneUsageDescription'] =
75
+ options.iosConfig?.microphoneUsageDescription ||
76
+ config.modResults['NSMicrophoneUsageDescription'] ||
77
+ MICROPHONE_USAGE
78
+
79
+ if (enableNotifications) {
80
+ config.modResults['NSUserNotificationsUsageDescription'] =
81
+ options.iosConfig?.notificationUsageDescription ||
82
+ config.modResults['NSUserNotificationsUsageDescription'] ||
83
+ NOTIFICATION_USAGE
84
+ config.modResults['NSUserNotificationAlertStyle'] = 'alert'
85
+ }
86
+
87
+ const existingBackgroundModes =
88
+ config.modResults.UIBackgroundModes || []
89
+
90
+ // If background audio is enabled with useAudio, add the audio background mode
91
+ if (
92
+ options.iosBackgroundModes?.useAudio === true &&
93
+ enableBackgroundAudio === true &&
94
+ !existingBackgroundModes.includes('audio')
95
+ ) {
96
+ // Add 'audio' background mode - REQUIRED for background recording
97
+ existingBackgroundModes.push('audio')
98
+ debugLog(
99
+ '✅ Added audio background mode for iOS background recording'
100
+ )
101
+
102
+ // Also ensure processing mode is recommended
103
+ if (options.iosBackgroundModes?.useProcessing !== true) {
104
+ console.warn(
105
+ `${LOG_PREFIX} Warning: Background audio recording works best with both 'audio' and 'processing' background modes. Consider enabling 'useProcessing' in iosBackgroundModes.`
106
+ )
107
+ }
108
+ }
109
+
110
+ if (
111
+ options.iosBackgroundModes?.useVoIP === true &&
112
+ enablePhoneStateHandling === true
113
+ ) {
114
+ if (!existingBackgroundModes.includes('voip')) {
115
+ existingBackgroundModes.push('voip')
116
+ }
117
+ const existingCapabilities = (config.modResults
118
+ .UIRequiredDeviceCapabilities || []) as string[]
119
+ if (!existingCapabilities.includes('telephony')) {
120
+ existingCapabilities.push('telephony')
121
+ }
122
+ config.modResults.UIRequiredDeviceCapabilities =
123
+ existingCapabilities
124
+ }
125
+
126
+ // Add additional background modes only if explicitly set to true
127
+ if (options.iosBackgroundModes?.useProcessing === true) {
128
+ if (!existingBackgroundModes.includes('processing')) {
129
+ existingBackgroundModes.push('processing')
130
+ }
131
+ // Add processing info if enabled
132
+ // Note: We keep the 'audiostream' namespace for native modules to maintain compatibility
133
+ config.modResults.BGTaskSchedulerPermittedIdentifiers = [
134
+ 'com.siteed.audiostream.processing',
135
+ ]
136
+ }
137
+
138
+ if (options.iosBackgroundModes?.useLocation === true) {
139
+ if (!existingBackgroundModes.includes('location')) {
140
+ existingBackgroundModes.push('location')
141
+ }
142
+ }
143
+
144
+ if (options.iosBackgroundModes?.useExternalAccessory === true) {
145
+ if (!existingBackgroundModes.includes('external-accessory')) {
146
+ existingBackgroundModes.push('external-accessory')
147
+ }
148
+ }
149
+
150
+ // Configure background processing info if enabled
151
+ if (options.iosConfig?.backgroundProcessingTitle) {
152
+ config.modResults.BGProcessingTaskTitle =
153
+ options.iosConfig.backgroundProcessingTitle
154
+ }
155
+
156
+ // Configure audio session behavior
157
+ if (options.iosConfig?.allowBackgroundAudioControls) {
158
+ config.modResults.UIBackgroundModes = [
159
+ ...existingBackgroundModes,
160
+ 'remote-notification',
161
+ ]
162
+ config.modResults.MPNowPlayingInfoPropertyPlaybackRate = true
163
+ }
164
+
165
+ config.modResults.UIBackgroundModes = existingBackgroundModes
166
+ return config
167
+ })
168
+
169
+ // Android Configuration
170
+ config = withAndroidManifest(config as any, (config) => {
171
+ const basePermissions = ['android.permission.RECORD_AUDIO']
172
+
173
+ const optionalPermissions = [
174
+ enableNotifications && 'android.permission.POST_NOTIFICATIONS',
175
+ enablePhoneStateHandling && 'android.permission.READ_PHONE_STATE', // Only add if enabled
176
+ enableBackgroundAudio && 'android.permission.FOREGROUND_SERVICE',
177
+ enableBackgroundAudio &&
178
+ 'android.permission.FOREGROUND_SERVICE_MICROPHONE',
179
+ enableBackgroundAudio && 'android.permission.WAKE_LOCK', // Keep device awake during background recording
180
+ // Device detection permissions (only if enabled)
181
+ enableDeviceDetection && 'android.permission.BLUETOOTH',
182
+ enableDeviceDetection && 'android.permission.BLUETOOTH_ADMIN',
183
+ enableDeviceDetection && 'android.permission.BLUETOOTH_CONNECT',
184
+ enableDeviceDetection && 'android.permission.USB_PERMISSION',
185
+ ].filter(Boolean) as string[]
186
+
187
+ const permissionsToAdd = [...basePermissions, ...optionalPermissions]
188
+
189
+ debugLog(
190
+ '📋 Existing Android permissions:',
191
+ config.modResults.manifest['uses-permission']?.map(
192
+ (p) => p.$?.['android:name']
193
+ ) || []
194
+ )
195
+
196
+ debugLog('➕ Adding Android permissions:', permissionsToAdd)
197
+
198
+ // Add each permission only if it doesn't exist
199
+ permissionsToAdd.forEach((permission) => {
200
+ AndroidConfig.Permissions.addPermission(
201
+ config.modResults,
202
+ permission
203
+ )
204
+ })
205
+
206
+ // Get the main application node
207
+ const mainApplication = config.modResults.manifest.application?.[0]
208
+ if (mainApplication) {
209
+ debugLog('📱 Configuring Android application components...')
210
+
211
+ // Add RecordingActionReceiver
212
+ if (!mainApplication.receiver) {
213
+ mainApplication.receiver = []
214
+ }
215
+
216
+ const receiverConfig = {
217
+ $: {
218
+ 'android:name': '.RecordingActionReceiver',
219
+ 'android:exported': 'false' as const,
220
+ },
221
+ 'intent-filter': [
222
+ {
223
+ action: [
224
+ { $: { 'android:name': 'PAUSE_RECORDING' } },
225
+ { $: { 'android:name': 'RESUME_RECORDING' } },
226
+ { $: { 'android:name': 'STOP_RECORDING' } },
227
+ ],
228
+ },
229
+ ],
230
+ }
231
+
232
+ const receiverIndex = mainApplication.receiver.findIndex(
233
+ (receiver: any) =>
234
+ receiver.$?.['android:name'] === '.RecordingActionReceiver'
235
+ )
236
+
237
+ if (receiverIndex >= 0) {
238
+ mainApplication.receiver[receiverIndex] = receiverConfig
239
+ } else {
240
+ mainApplication.receiver.push(receiverConfig)
241
+ }
242
+
243
+ debugLog('✅ RecordingActionReceiver configured')
244
+
245
+ // Add AudioRecordingService
246
+ if (!mainApplication.service) {
247
+ mainApplication.service = []
248
+ }
249
+
250
+ const serviceConfig = {
251
+ $: {
252
+ 'android:name': '.AudioRecordingService',
253
+ 'android:enabled': 'true' as const,
254
+ 'android:exported': 'false' as const,
255
+ 'android:foregroundServiceType': 'microphone',
256
+ },
257
+ }
258
+
259
+ const serviceIndex = mainApplication.service.findIndex(
260
+ (service: any) =>
261
+ service.$?.['android:name'] === '.AudioRecordingService'
262
+ )
263
+
264
+ if (serviceIndex >= 0) {
265
+ mainApplication.service[serviceIndex] = serviceConfig
266
+ } else {
267
+ mainApplication.service.push(serviceConfig)
268
+ }
269
+
270
+ debugLog('✅ AudioRecordingService configured')
271
+ } else {
272
+ console.error(
273
+ `${LOG_PREFIX} ❌ Main application node not found in Android Manifest`
274
+ )
275
+ }
276
+
277
+ return config
278
+ })
279
+
280
+ debugLog('✨ Recording Permissions Plugin configuration completed')
281
+ return config as any
282
+ }
283
+
284
+ // Export as default
285
+ export default withRecordingPermission
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "expo-module-scripts/tsconfig.plugin",
3
+ "compilerOptions": {
4
+ "outDir": "build",
5
+ "lib": ["es2023", "dom"],
6
+ "rootDir": "src"
7
+ },
8
+ "include": ["./src"],
9
+ "exclude": ["**/__mocks__/*", "**/__tests__/*"]
10
+ }
@@ -0,0 +1 @@
1
+ {"root":["./src/index.ts"],"version":"5.8.3"}
@@ -0,0 +1,18 @@
1
+
2
+ var createMelSpectrogramModule = (() => {
3
+ var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
4
+
5
+ return (
6
+ function(moduleArg = {}) {
7
+
8
+ var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(typeof WebAssembly!="object"){abort("no native wasm support detected")}function intArrayFromBase64(s){var decoded=atob(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var wasmBinaryFile;wasmBinaryFile="data:application/octet-stream;base64,AGFzbQEAAAABvAEcYAF/AX9gAX8AYAN/f38Bf2ADf39/AGAGf39/f39/AGAEf39/fwBgAX0BfWAAAGACf38Bf2AFf39/f38AYAV/f39/fwF/YAJ/fwBgAAF/YAF8AXxgAXwBfWABfwF9YAN/fn8BfmAEf39/fwF/YAx/f39/f39/fX1/f38Bf2AIf39/f399fX8AYAh/f39/f39/fwF/YAJ8fAF8YAJ8fwF/YAN8fH8BfGACf30BfWABfQF/YAABfWACfH8BfAK8AQcDZW52C19fY3hhX3Rocm93AAMDZW52FGVtc2NyaXB0ZW5fbWVtY3B5X2pzAAMWd2FzaV9zbmFwc2hvdF9wcmV2aWV3MQhmZF9jbG9zZQAAFndhc2lfc25hcHNob3RfcHJldmlldzEIZmRfd3JpdGUAEQNlbnYWZW1zY3JpcHRlbl9yZXNpemVfaGVhcAAAA2VudgVhYm9ydAAHFndhc2lfc25hcHNob3RfcHJldmlldzEHZmRfc2VlawAKA11cBwMEAAMICwsHAwsABwEBEgETAgwIAAUBFAEBBAIMFQoWFw0ODgYCCBgGDw8ZAAEBAgMGGgYGBhsNAAACEAAAAAEAAAABAgIIAwUFBQMJCQQEAAAAAAABAAwBAAoEBQFwAR8fBQcBAYACgIACBg0CfwFB0LgEC38BQQALB7sDFQZtZW1vcnkCABFfX3dhc21fY2FsbF9jdG9ycwAHBm1hbGxvYwBGBGZyZWUARxlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQAXbWVsX3NwZWN0cm9ncmFtX2NvbXB1dGUAFhRtZWxfc3BlY3Ryb2dyYW1fZnJlZQAXFG1lbF9zcGVjdHJvZ3JhbV9pbml0ABgdbWVsX3NwZWN0cm9ncmFtX2NvbXB1dGVfZnJhbWUAGRptZWxfc3BlY3Ryb2dyYW1fZ2V0X25fbWVscwAaFmF1ZGlvX2ZlYXR1cmVzX2NvbXB1dGUAHxNhdWRpb19mZWF0dXJlc19mcmVlACAaYXVkaW9fZmVhdHVyZXNfZnJlZV9hcnJheXMAIRNhdWRpb19mZWF0dXJlc19pbml0ACIcYXVkaW9fZmVhdHVyZXNfY29tcHV0ZV9mcmFtZQAjGWF1ZGlvX2ZlYXR1cmVzX2dldF9uX21mY2MAJAlzdGFja1NhdmUAXwxzdGFj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ACABIAMgAkQAAGAaYbTQPaIiAKEiBSACRHNwAy6KGaM7oiADIAWhIAChoSIEoSIAOQMAIAkgAL1CNIinQf8PcWtBMkgEQCAFIQMMAQsgASAFIAJEAAAALooZozuiIgChIgMgAkTBSSAlmoN7OaIgBSADoSAAoaEiBKEiADkDAAsgASADIAChIAShOQMIDAELIAhBgIDA/wdPBEAgASAAIAChIgA5AwAgASAAOQMIQQAhBgwBCyALQv////////8Hg0KAgICAgICAsMEAhL8hAEEAIQZBASEJA0AgB0EQaiAGQQN0agJ/IACZRAAAAAAAAOBBYwRAIACqDAELQYCAgIB4C7ciAjkDACAAIAKhRAAAAAAAAHBBoiEAQQEhBiAJQQFxIQpBACEJIAoNAAsgByAAOQMgQQIhBgNAIAYiCUEBayEGIAdBEGogCUEDdGorAwBEAAAAAAAAAABhDQALIAdBEGogByAIQRR2QZYIayAJQQFqQQEQJiEGIAcrAwAhACALQgBTBEAgASAAmjkDACABIAcrAwiaOQMIQQAgBmshBgwBCyABIAA5AwAgASAHKwMIOQMICyAHQTBqJAAgBguZAQEDfCAAIACiIgMgAyADoqIgA0R81c9aOtnlPaJE65wriublWr6goiADIANEff6xV+Mdxz6iRNVhwRmgASq/oKJEpvgQERERgT+goCEFIAMgAKIhBCACRQRAIAQgAyAFokRJVVVVVVXFv6CiIACgDwsgACADIAFEAAAAAAAA4D+iIAUgBKKhoiABoSAERElVVVVVVcU/oqChC70BAgF8An8jAEEQayICJAACfCAAvUIgiKdB/////wdxIgNB+8Ok/wNNBEBEAAAAAAAA8D8gA0GewZryA0kNARogAEQAAAAAAAAAABAlDAELIAAgAKEgA0GAgMD/B08NABogACACECchAyACKwMIIQAgAisDACEBAkACQAJAAkAgA0EDcQ4DAAECAwsgASAAECUMAwsgASAAQQEQKJoMAgsgASAAECWaDAELIAEgAEEBECgLIQEgAkEQaiQAIAELTwEBfCAAIACiIgAgACAAoiIBoiAARGlQ7uBCk/k+okQnHg/oh8BWv6CiIAFEQjoF4VNVpT+iIABEgV4M/f//37+iRAAAAAAAAPA/oKCgtgtLAQJ8IAAgAKIiASAAoiICIAEgAaKiIAFE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NgIMIAAgA2ogBzYCAEH0NEH0NCgCAEEBayIDQX8gAxs2AgALCzUBAX9BASAAIABBAU0bIQECQANAIAEQRiIADQFBxDgoAgAiAARAIAARBwAMAQsLEAUACyAACwwAIABB2C82AgAgAAsOACAAQdAAahBGQdAAagsGACAAEEcLdAEBfyACRQRAIAAoAgQgASgCBEYPCyAAIAFGBEBBAQ8LIAEoAgQiAi0AACEBAkAgACgCBCIDLQAAIgBFDQAgACABRw0AA0AgAi0AASEBIAMtAAEiAEUNASACQQFqIQIgA0EBaiEDIAAgAUYNAAsLIAAgAUYLmgEBAX8jAEFAaiIDJAACf0EBIAAgAUEAEEwNABpBACABRQ0AGkEAIAFBuC0QTiIBRQ0AGiADQQxqQTQQLhogA0EBNgI4IANBfzYCFCADIAA2AhAgAyABNgIIIAEgA0EIaiACKAIAQQEgASgCACgCHBEFACADKAIgIgBBAUYEQCACIAMoAhg2AgALIABBAUYLIQAgA0FAayQAIAALhQMBBH8jAEHwAGsiAiQAIAAoAgAiA0EEaygCACEEIANBCGsoAgAhAyACQgA3AlAgAkIANwJYIAJCADcCYCACQgA3AGcgAkIANwJIIAJBADYCRCACQYgtNgJAIAIgADYCPCACIAE2AjggACADaiEFAkAgBCABQQAQTARAQQAgBSADGyEADAELIAAgBU4EQCACQgA3AC8gAkEYaiIDQgA3AgAgAkIANwIgIAJCADcCKCACQgA3AhAgAkEANgIMIAIgATYCCCACIAA2AgQgAiAENgIAIAJBATYCMCAEIAIgBSAFQQFBACAEKAIAKAIUEQQAIAMoAgANAQtBACEAIAQgAkE4aiAFQQFBACAEKAIAKAIYEQkAAkACQCACKAJcDgIAAQILIAIoAkxBACACKAJYQQFGG0EAIAIoAlRBAUYbQQAgAigCYEEBRhshAAwBCyACKAJQQQFHBEAgAigCYA0BIAIoAlRBAUcNASACKAJYQQFHDQELIAIoAkghAAsgAkHwAGokACAAC10BAX8gACgCECIDRQRAIABBATYCJCAAIAI2AhggACABNgIQDwsCQCABIANGBEAgACgCGEECRw0BIAAgAjYCGA8LIABBAToANiAAQQI2AhggACAAKAIkQQFqNgIkCwsYACAAIAEoAghBABBMBEAgASACIAMQTwsLMQAgACABKAIIQQAQTARAIAEgAiADEE8PCyAAKAIIIgAgASACIAMgACgCACgCHBEFAAuaAQAgAEEBOgA1AkAgACgCBCACRw0AIABBAToANAJAIAAoAhAiAkUEQCAAQQE2AiQgACADNgIYIAAgATYCECADQQFHDQIgACgCMEEBRg0BDAILIAEgAkYEQCAAKAIYIgJBAkYEQCAAIAM2AhggAyECCyAAKAIwQQFHDQIgAkEBRg0BDAILIAAgACgCJEEBajYCJAsgAEEBOgA2CwsgAAJAIAAoAgQgAUcNACAAKAIcQQFGDQAgACACNgIcCwvyAQAgACABKAIIIAQQTARAIAEgAiADEFMPCwJAIAAgASgCACAEEEwEQAJAIAIgASgCEEcEQCABKAIUIAJHDQELIANBAUcNAiABQQE2AiAPCyABIAM2AiACQCABKAIsQQRGDQAgAUEAOwE0IAAoAggiACABIAIgAkEBIAQgACgCACgCFBEEACABLQA1BEAgAUEDNgIsIAEtADRFDQEMAwsgAUEENgIsCyABIAI2AhQgASABKAIoQQFqNgIoIAEoAiRBAUcNASABKAIYQQJHDQEgAUEBOgA2DwsgACgCCCIAIAEgAiADIAQgACgCACgCGBEJAAsLkQEAIAAgASgCCCAEEEwEQCABIAIgAxBTDwsCQCAAIAEoAgAgBBBMRQ0AAkAgAiABKAIQRwRAIAEoAhQgAkcNAQsgA0EBRw0BIAFBATYCIA8LIAEgAjYCFCABIAM2AiAgASABKAIoQQFqNgIoAkAgASgCJEEBRw0AIAEoAhhBAkcNACABQQE6ADYLIAFBBDYCLAsLNwAgACABKAIIIAUQTARAIAEgAiADIAQQUg8LIAAoAggiACABIAIgAyAEIAUgACgCACgCFBEEAAsaACAAIAEoAgggBRBMBEAgASACIAMgBBBSCwsVACAARQRAQQAPCyAAQZguEE5BAEcLBQBBhwgLBQBBvQgLBQBBlggLOQECfyAAQcgwNgIAIABBBGooAgBBDGsiAkEIaiIBIAEoAgBBAWsiATYCACABQQBIBEAgAhBHCyAACwsAIAAQXBogABBHCwoAIABBBGooAgALBAAjAAsGACAAJAALEAAjACAAa0FwcSIAJAAgAAsiAQF+IAEgAq0gA61CIIaEIAQgABEQACIFQiCIpyQBIAWnCwv3KQkAQYAIC4cFdmVjdG9yAHN0ZDo6ZXhjZXB0aW9uAGJhZF9hcnJheV9uZXdfbGVuZ3RoAG11dGV4IGxvY2sgZmFpbGVkAHN0ZDo6YmFkX2FsbG9jAGtpc3MgZmZ0IHVzYWdlIGVycm9yOiBpbXByb3BlciBhbGxvYwBNZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4AUmVhbCBGRlQgb3B0aW1pemF0aW9uIG11c3QgYmUgZXZlbi4ATWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLgBmb3V0IGJ1ZmZlciBOVUxMLgBbRVJST1JdIC9Vc2Vycy9kZWVlZWQvZGV2L2F1ZGlvbGFiL3BhY2thZ2VzL2F1ZGlvLXN0dWRpby9jcHAva2lzc19mZnQva2lzc19mZnQuYzozODcgAFtFUlJPUl0gL1VzZXJzL2RlZWVlZC9kZXYvYXVkaW9sYWIvcGFja2FnZXMvYXVkaW8tc3R1ZGlvL2NwcC9raXNzX2ZmdC9raXNzX2ZmdC5jOjIwNyAAW0VSUk9SXSAvVXNlcnMvZGVlZWVkL2Rldi9hdWRpb2xhYi9wYWNrYWdlcy9hdWRpby1zdHVkaW8vY3BwL2tpc3NfZmZ0L2tpc3NfZmZ0LmM6MzgxIABbRVJST1JdIC9Vc2Vycy9kZWVlZWQvZGV2L2F1ZGlvbGFiL3BhY2thZ2VzL2F1ZGlvLXN0dWRpby9jcHAva2lzc19mZnQva2lzc19mZnRyLmM6NzAgAFtFUlJPUl0gL1VzZXJzL2RlZWVlZC9kZXYvYXVkaW9sYWIvcGFja2FnZXMvYXVkaW8tc3R1ZGlvL2NwcC9raXNzX2ZmdC9raXNzX2ZmdHIuYzozMCAAQZANC9cVAwAAAAQAAAAEAAAABgAAAIP5ogBETm4A/CkVANFXJwDdNPUAYtvAADyZlQBBkEMAY1H+ALveqwC3YcUAOm4kANJNQgBJBuAACeouAByS0QDrHf4AKbEcAOg+pwD1NYIARLsuAJzphAC0JnAAQX5fANaROQBTgzkAnPQ5AItfhAAo+b0A+B87AN7/lwAPmAUAES/vAApaiwBtH20Az342AAnLJwBGT7cAnmY/AC3qXwC6J3UA5evHAD178QD3OQcAklKKAPtr6gAfsV8ACF2NADADVgB7/EYA8KtrACC8zwA29JoA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";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(instance=>instance).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){return instantiateArrayBuffer(binaryFile,imports,callback)}function createWasm(){var info={"env":wasmImports,"wasi_snapshot_preview1":wasmImports};function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["memory"];updateMemoryViews();addOnInit(wasmExports["__wasm_call_ctors"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":abort("to do getValue(i64) use WASM_BIGINT");case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var noExitRuntime=Module["noExitRuntime"]||true;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught}get_caught(){return HEAP8[this.ptr+12>>0]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown}get_rethrown(){return HEAP8[this.ptr+13>>0]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}get_exception_ptr(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast};var _abort=()=>{abort("")};var _emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var _fd_close=fd=>52;var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);return 70}var printCharBuffers=[null,[],[]];var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={varargs:undefined,get(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret},getp(){return SYSCALLS.get()},getStr(ptr){var ret=UTF8ToString(ptr);return ret}};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j<len;j++){printChar(fd,HEAPU8[ptr+j])}num+=len}HEAPU32[pnum>>2]=num;return 0};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);function onDone(ret){if(stack!==0)stackRestore(stack);return convertReturnValue(ret)}ret=onDone(ret);return ret};var cwrap=(ident,returnType,argTypes,opts)=>{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}};var wasmImports={__cxa_throw:___cxa_throw,abort:_abort,emscripten_memcpy_js:_emscripten_memcpy_js,emscripten_resize_heap:_emscripten_resize_heap,fd_close:_fd_close,fd_seek:_fd_seek,fd_write:_fd_write};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["__wasm_call_ctors"])();var _malloc=Module["_malloc"]=a0=>(_malloc=Module["_malloc"]=wasmExports["malloc"])(a0);var _free=Module["_free"]=a0=>(_free=Module["_free"]=wasmExports["free"])(a0);var _mel_spectrogram_compute=Module["_mel_spectrogram_compute"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)=>(_mel_spectrogram_compute=Module["_mel_spectrogram_compute"]=wasmExports["mel_spectrogram_compute"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);var _mel_spectrogram_free=Module["_mel_spectrogram_free"]=a0=>(_mel_spectrogram_free=Module["_mel_spectrogram_free"]=wasmExports["mel_spectrogram_free"])(a0);var _mel_spectrogram_init=Module["_mel_spectrogram_init"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_mel_spectrogram_init=Module["_mel_spectrogram_init"]=wasmExports["mel_spectrogram_init"])(a0,a1,a2,a3,a4,a5,a6,a7);var _mel_spectrogram_compute_frame=Module["_mel_spectrogram_compute_frame"]=(a0,a1,a2)=>(_mel_spectrogram_compute_frame=Module["_mel_spectrogram_compute_frame"]=wasmExports["mel_spectrogram_compute_frame"])(a0,a1,a2);var _mel_spectrogram_get_n_mels=Module["_mel_spectrogram_get_n_mels"]=()=>(_mel_spectrogram_get_n_mels=Module["_mel_spectrogram_get_n_mels"]=wasmExports["mel_spectrogram_get_n_mels"])();var _audio_features_compute=Module["_audio_features_compute"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_audio_features_compute=Module["_audio_features_compute"]=wasmExports["audio_features_compute"])(a0,a1,a2,a3,a4,a5,a6,a7);var _audio_features_free=Module["_audio_features_free"]=a0=>(_audio_features_free=Module["_audio_features_free"]=wasmExports["audio_features_free"])(a0);var _audio_features_free_arrays=Module["_audio_features_free_arrays"]=a0=>(_audio_features_free_arrays=Module["_audio_features_free_arrays"]=wasmExports["audio_features_free_arrays"])(a0);var _audio_features_init=Module["_audio_features_init"]=(a0,a1,a2,a3,a4,a5)=>(_audio_features_init=Module["_audio_features_init"]=wasmExports["audio_features_init"])(a0,a1,a2,a3,a4,a5);var _audio_features_compute_frame=Module["_audio_features_compute_frame"]=(a0,a1,a2)=>(_audio_features_compute_frame=Module["_audio_features_compute_frame"]=wasmExports["audio_features_compute_frame"])(a0,a1,a2);var _audio_features_get_n_mfcc=Module["_audio_features_get_n_mfcc"]=()=>(_audio_features_get_n_mfcc=Module["_audio_features_get_n_mfcc"]=wasmExports["audio_features_get_n_mfcc"])();var stackSave=()=>(stackSave=wasmExports["stackSave"])();var stackRestore=a0=>(stackRestore=wasmExports["stackRestore"])(a0);var stackAlloc=a0=>(stackAlloc=wasmExports["stackAlloc"])(a0);var ___cxa_is_pointer_type=a0=>(___cxa_is_pointer_type=wasmExports["__cxa_is_pointer_type"])(a0);var dynCall_jiji=Module["dynCall_jiji"]=(a0,a1,a2,a3,a4)=>(dynCall_jiji=Module["dynCall_jiji"]=wasmExports["dynCall_jiji"])(a0,a1,a2,a3,a4);Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["getValue"]=getValue;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();
9
+
10
+
11
+ return moduleArg.ready
12
+ }
13
+ );
14
+ })();
15
+ if (typeof exports === 'object' && typeof module === 'object')
16
+ module.exports = createMelSpectrogramModule;
17
+ else if (typeof define === 'function' && define['amd'])
18
+ define([], () => createMelSpectrogramModule);