react-native-audio-api 0.8.3 → 0.9.0-nightly-96a5bcd-20251007

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 (312) hide show
  1. package/README.md +40 -39
  2. package/RNAudioAPI.podspec +17 -12
  3. package/android/build.gradle +44 -4
  4. package/android/src/main/cpp/audioapi/CMakeLists.txt +65 -0
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +29 -1
  6. package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +14 -0
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +7 -1
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +6 -1
  9. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +1 -1
  10. package/android/src/main/cpp/audioapi/android/core/NativeAudioRecorder.hpp +36 -0
  11. package/android/src/main/cpp/audioapi/android/core/{AudioDecoder.cpp → utils/AudioDecoder.cpp} +79 -75
  12. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +11 -1
  13. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +24 -0
  14. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +15 -2
  15. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +129 -38
  16. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +57 -0
  17. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +6 -46
  18. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +70 -6
  19. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.h +10 -66
  20. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +105 -0
  21. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +17 -91
  22. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +262 -6
  23. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +26 -241
  24. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +70 -0
  25. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +6 -50
  26. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +18 -0
  27. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +18 -0
  28. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +148 -0
  29. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.h +37 -0
  30. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +92 -0
  31. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +29 -0
  32. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +20 -0
  33. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h +19 -0
  34. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +21 -0
  35. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +21 -0
  36. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +41 -0
  37. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +28 -0
  38. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +69 -0
  39. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +33 -0
  40. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +73 -0
  41. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +29 -0
  42. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +94 -0
  43. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +46 -0
  44. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +60 -0
  45. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +25 -0
  46. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +152 -0
  47. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +37 -0
  48. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +52 -0
  49. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h +25 -0
  50. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +19 -0
  51. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +21 -0
  52. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +55 -0
  53. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +27 -0
  54. package/common/cpp/audioapi/HostObjects/{RecorderAdapterNodeHostObject.h → sources/RecorderAdapterNodeHostObject.h} +1 -2
  55. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +22 -0
  56. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +28 -0
  57. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +18 -0
  58. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +107 -0
  59. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.h +28 -0
  60. package/common/cpp/audioapi/core/AudioContext.cpp +3 -4
  61. package/common/cpp/audioapi/core/AudioContext.h +2 -1
  62. package/common/cpp/audioapi/core/AudioNode.cpp +3 -3
  63. package/common/cpp/audioapi/core/AudioNode.h +2 -2
  64. package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
  65. package/common/cpp/audioapi/core/AudioParam.h +1 -1
  66. package/common/cpp/audioapi/core/BaseAudioContext.cpp +47 -38
  67. package/common/cpp/audioapi/core/BaseAudioContext.h +17 -16
  68. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +4 -5
  69. package/common/cpp/audioapi/core/OfflineAudioContext.h +2 -1
  70. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +3 -1
  71. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +1 -1
  72. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +1 -1
  73. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +3 -1
  74. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +1 -1
  75. package/common/cpp/audioapi/core/effects/GainNode.cpp +3 -1
  76. package/common/cpp/audioapi/core/effects/GainNode.h +1 -1
  77. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +1 -1
  78. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +18 -13
  79. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +1 -1
  80. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +89 -0
  81. package/common/cpp/audioapi/core/effects/WorkletNode.h +65 -0
  82. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +91 -0
  83. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +52 -0
  84. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +1 -1
  85. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +2 -2
  86. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +47 -10
  87. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +18 -3
  88. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +98 -14
  89. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +9 -3
  90. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +37 -44
  91. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +7 -9
  92. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +1 -6
  93. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +1 -1
  94. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +53 -0
  95. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +26 -0
  96. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +7 -2
  97. package/common/cpp/audioapi/core/sources/OscillatorNode.h +1 -1
  98. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +3 -1
  99. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +1 -1
  100. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +9 -1
  101. package/common/cpp/audioapi/core/sources/StreamerNode.h +1 -9
  102. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +84 -0
  103. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +47 -0
  104. package/common/cpp/audioapi/core/types/AudioFormat.h +16 -0
  105. package/common/cpp/audioapi/core/utils/AudioDecoder.h +36 -90
  106. package/common/cpp/audioapi/core/{AudioParamEventQueue.cpp → utils/AudioParamEventQueue.cpp} +13 -7
  107. package/common/cpp/audioapi/core/{Constants.h → utils/Constants.h} +5 -0
  108. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +52 -0
  109. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +9 -0
  110. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +73 -0
  111. package/common/cpp/audioapi/dsp/Windows.cpp +1 -1
  112. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +1 -1
  113. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +2 -1
  114. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +14 -1
  115. package/common/cpp/audioapi/jsi/JsiHostObject.h +6 -12
  116. package/common/cpp/audioapi/jsi/JsiPromise.cpp +49 -0
  117. package/common/cpp/audioapi/jsi/JsiPromise.h +29 -1
  118. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +241 -282
  119. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h +57 -19
  120. package/common/cpp/audioapi/utils/AudioBus.cpp +1 -1
  121. package/common/cpp/audioapi/utils/ThreadPool.hpp +104 -0
  122. package/common/cpp/test/AudioParamTest.cpp +204 -0
  123. package/common/cpp/test/CMakeLists.txt +13 -4
  124. package/common/cpp/test/GainTest.cpp +11 -10
  125. package/common/cpp/test/OscillatorTest.cpp +2 -1
  126. package/common/cpp/test/StereoPannerTest.cpp +129 -0
  127. package/ios/audioapi/ios/AudioAPIModule.mm +32 -5
  128. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +1 -1
  129. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
  130. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +160 -0
  131. package/lib/commonjs/api.js +50 -3
  132. package/lib/commonjs/api.js.map +1 -1
  133. package/lib/commonjs/api.web.js +8 -0
  134. package/lib/commonjs/api.web.js.map +1 -1
  135. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +7 -7
  136. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  137. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +1 -6
  138. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  139. package/lib/commonjs/core/AudioBufferSourceNode.js +15 -0
  140. package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -1
  141. package/lib/commonjs/core/AudioContext.js +10 -1
  142. package/lib/commonjs/core/AudioContext.js.map +1 -1
  143. package/lib/commonjs/core/AudioDecoder.js +48 -0
  144. package/lib/commonjs/core/AudioDecoder.js.map +1 -0
  145. package/lib/commonjs/core/AudioScheduledSourceNode.js +4 -4
  146. package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
  147. package/lib/commonjs/core/BaseAudioContext.js +76 -28
  148. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  149. package/lib/commonjs/core/ConstantSourceNode.js +17 -0
  150. package/lib/commonjs/core/ConstantSourceNode.js.map +1 -0
  151. package/lib/commonjs/core/OfflineAudioContext.js +11 -2
  152. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  153. package/lib/commonjs/core/OscillatorNode.js +6 -0
  154. package/lib/commonjs/core/OscillatorNode.js.map +1 -1
  155. package/lib/commonjs/core/WorkletNode.js +11 -0
  156. package/lib/commonjs/core/WorkletNode.js.map +1 -0
  157. package/lib/commonjs/core/WorkletProcessingNode.js +11 -0
  158. package/lib/commonjs/core/WorkletProcessingNode.js.map +1 -0
  159. package/lib/commonjs/core/WorkletSourceNode.js +11 -0
  160. package/lib/commonjs/core/WorkletSourceNode.js.map +1 -0
  161. package/lib/commonjs/hooks/{useSytemVolume.js → useSystemVolume.js} +1 -1
  162. package/lib/commonjs/hooks/useSystemVolume.js.map +1 -0
  163. package/lib/commonjs/utils/index.js +9 -0
  164. package/lib/commonjs/utils/index.js.map +1 -1
  165. package/lib/commonjs/web-core/AudioContext.js +4 -0
  166. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  167. package/lib/commonjs/web-core/AudioScheduledSourceNode.js +1 -1
  168. package/lib/commonjs/web-core/AudioScheduledSourceNode.js.map +1 -1
  169. package/lib/commonjs/web-core/ConstantSourceNode.js +17 -0
  170. package/lib/commonjs/web-core/ConstantSourceNode.js.map +1 -0
  171. package/lib/commonjs/web-core/OfflineAudioContext.js +4 -0
  172. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  173. package/lib/module/api.js +8 -3
  174. package/lib/module/api.js.map +1 -1
  175. package/lib/module/api.web.js +1 -0
  176. package/lib/module/api.web.js.map +1 -1
  177. package/lib/module/core/AudioBufferBaseSourceNode.js +7 -7
  178. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  179. package/lib/module/core/AudioBufferQueueSourceNode.js +1 -6
  180. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  181. package/lib/module/core/AudioBufferSourceNode.js +15 -0
  182. package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
  183. package/lib/module/core/AudioContext.js +10 -1
  184. package/lib/module/core/AudioContext.js.map +1 -1
  185. package/lib/module/core/AudioDecoder.js +42 -0
  186. package/lib/module/core/AudioDecoder.js.map +1 -0
  187. package/lib/module/core/AudioScheduledSourceNode.js +4 -4
  188. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
  189. package/lib/module/core/BaseAudioContext.js +76 -28
  190. package/lib/module/core/BaseAudioContext.js.map +1 -1
  191. package/lib/module/core/ConstantSourceNode.js +11 -0
  192. package/lib/module/core/ConstantSourceNode.js.map +1 -0
  193. package/lib/module/core/OfflineAudioContext.js +11 -2
  194. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  195. package/lib/module/core/OscillatorNode.js +6 -0
  196. package/lib/module/core/OscillatorNode.js.map +1 -1
  197. package/lib/module/core/WorkletNode.js +5 -0
  198. package/lib/module/core/WorkletNode.js.map +1 -0
  199. package/lib/module/core/WorkletProcessingNode.js +5 -0
  200. package/lib/module/core/WorkletProcessingNode.js.map +1 -0
  201. package/lib/module/core/WorkletSourceNode.js +5 -0
  202. package/lib/module/core/WorkletSourceNode.js.map +1 -0
  203. package/lib/module/hooks/{useSytemVolume.js → useSystemVolume.js} +1 -1
  204. package/lib/module/hooks/useSystemVolume.js.map +1 -0
  205. package/lib/module/utils/index.js +8 -0
  206. package/lib/module/utils/index.js.map +1 -1
  207. package/lib/module/web-core/AudioContext.js +4 -0
  208. package/lib/module/web-core/AudioContext.js.map +1 -1
  209. package/lib/module/web-core/AudioScheduledSourceNode.js +1 -1
  210. package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
  211. package/lib/module/web-core/ConstantSourceNode.js +11 -0
  212. package/lib/module/web-core/ConstantSourceNode.js.map +1 -0
  213. package/lib/module/web-core/OfflineAudioContext.js +4 -0
  214. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  215. package/lib/typescript/api.d.ts +11 -5
  216. package/lib/typescript/api.d.ts.map +1 -1
  217. package/lib/typescript/api.web.d.ts +1 -0
  218. package/lib/typescript/api.web.d.ts.map +1 -1
  219. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +2 -2
  220. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  221. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  222. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  223. package/lib/typescript/core/AudioBufferSourceNode.d.ts +4 -0
  224. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
  225. package/lib/typescript/core/AudioContext.d.ts +1 -0
  226. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  227. package/lib/typescript/core/AudioDecoder.d.ts +4 -0
  228. package/lib/typescript/core/AudioDecoder.d.ts.map +1 -0
  229. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +1 -1
  230. package/lib/typescript/core/BaseAudioContext.d.ts +21 -16
  231. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  232. package/lib/typescript/core/ConstantSourceNode.d.ts +9 -0
  233. package/lib/typescript/core/ConstantSourceNode.d.ts.map +1 -0
  234. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -0
  235. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  236. package/lib/typescript/core/OscillatorNode.d.ts +3 -0
  237. package/lib/typescript/core/OscillatorNode.d.ts.map +1 -1
  238. package/lib/typescript/core/WorkletNode.d.ts +4 -0
  239. package/lib/typescript/core/WorkletNode.d.ts.map +1 -0
  240. package/lib/typescript/core/WorkletProcessingNode.d.ts +4 -0
  241. package/lib/typescript/core/WorkletProcessingNode.d.ts.map +1 -0
  242. package/lib/typescript/core/WorkletSourceNode.d.ts +4 -0
  243. package/lib/typescript/core/WorkletSourceNode.d.ts.map +1 -0
  244. package/lib/typescript/events/types.d.ts +2 -0
  245. package/lib/typescript/events/types.d.ts.map +1 -1
  246. package/lib/typescript/hooks/{useSytemVolume.d.ts → useSystemVolume.d.ts} +1 -1
  247. package/lib/typescript/hooks/useSystemVolume.d.ts.map +1 -0
  248. package/lib/typescript/interfaces.d.ts +27 -6
  249. package/lib/typescript/interfaces.d.ts.map +1 -1
  250. package/lib/typescript/types.d.ts +2 -1
  251. package/lib/typescript/types.d.ts.map +1 -1
  252. package/lib/typescript/utils/index.d.ts +8 -0
  253. package/lib/typescript/utils/index.d.ts.map +1 -1
  254. package/lib/typescript/web-core/AudioBufferSourceNode.d.ts +1 -1
  255. package/lib/typescript/web-core/AudioContext.d.ts +4 -2
  256. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  257. package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +1 -1
  258. package/lib/typescript/web-core/BaseAudioContext.d.ts +2 -0
  259. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  260. package/lib/typescript/web-core/ConstantSourceNode.d.ts +8 -0
  261. package/lib/typescript/web-core/ConstantSourceNode.d.ts.map +1 -0
  262. package/lib/typescript/web-core/OfflineAudioContext.d.ts +4 -2
  263. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  264. package/package.json +3 -2
  265. package/src/api.ts +17 -3
  266. package/src/api.web.ts +1 -0
  267. package/src/core/AudioBufferBaseSourceNode.ts +9 -9
  268. package/src/core/AudioBufferQueueSourceNode.ts +1 -9
  269. package/src/core/AudioBufferSourceNode.ts +28 -0
  270. package/src/core/AudioContext.ts +12 -1
  271. package/src/core/AudioDecoder.ts +78 -0
  272. package/src/core/AudioScheduledSourceNode.ts +5 -5
  273. package/src/core/BaseAudioContext.ts +174 -41
  274. package/src/core/ConstantSourceNode.ts +13 -0
  275. package/src/core/OfflineAudioContext.ts +18 -2
  276. package/src/core/OscillatorNode.ts +11 -0
  277. package/src/core/WorkletNode.ts +3 -0
  278. package/src/core/WorkletProcessingNode.ts +3 -0
  279. package/src/core/WorkletSourceNode.ts +3 -0
  280. package/src/events/types.ts +2 -0
  281. package/src/interfaces.ts +77 -11
  282. package/src/types.ts +3 -1
  283. package/src/utils/index.ts +21 -0
  284. package/src/web-core/AudioBufferSourceNode.tsx +1 -1
  285. package/src/web-core/AudioContext.tsx +7 -2
  286. package/src/web-core/AudioScheduledSourceNode.tsx +1 -1
  287. package/src/web-core/BaseAudioContext.tsx +2 -0
  288. package/src/web-core/ConstantSourceNode.tsx +12 -0
  289. package/src/web-core/OfflineAudioContext.tsx +7 -2
  290. package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +0 -149
  291. package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +0 -76
  292. package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +0 -120
  293. package/common/cpp/audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h +0 -67
  294. package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +0 -142
  295. package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +0 -86
  296. package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +0 -56
  297. package/common/cpp/audioapi/HostObjects/BiquadFilterNodeHostObject.h +0 -89
  298. package/common/cpp/audioapi/HostObjects/GainNodeHostObject.h +0 -27
  299. package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +0 -65
  300. package/common/cpp/audioapi/HostObjects/StereoPannerNodeHostObject.h +0 -29
  301. package/common/cpp/audioapi/HostObjects/StreamerNodeHostObject.h +0 -30
  302. package/common/cpp/audioapi/events/AudioEventHandlerRegistryHostObject.h +0 -48
  303. package/ios/audioapi/ios/core/AudioDecoder.mm +0 -156
  304. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.h +0 -7
  305. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.mm +0 -12
  306. package/lib/commonjs/hooks/useSytemVolume.js.map +0 -1
  307. package/lib/module/hooks/useSytemVolume.js.map +0 -1
  308. package/lib/typescript/hooks/useSytemVolume.d.ts.map +0 -1
  309. /package/common/cpp/audioapi/HostObjects/{AudioDestinationNodeHostObject.h → destinations/AudioDestinationNodeHostObject.h} +0 -0
  310. /package/common/cpp/audioapi/HostObjects/{PeriodicWaveHostObject.h → effects/PeriodicWaveHostObject.h} +0 -0
  311. /package/common/cpp/audioapi/core/{AudioParamEventQueue.h → utils/AudioParamEventQueue.h} +0 -0
  312. /package/src/hooks/{useSytemVolume.ts → useSystemVolume.ts} +0 -0
@@ -1,22 +1,29 @@
1
+ import { InvalidAccessError, NotSupportedError } from '../errors';
1
2
  import { IBaseAudioContext } from '../interfaces';
2
3
  import {
4
+ AudioBufferBaseSourceNodeOptions,
3
5
  ContextState,
4
6
  PeriodicWaveConstraints,
5
- AudioBufferSourceNodeOptions,
7
+ AudioWorkletRuntime,
6
8
  } from '../types';
9
+ import { isWorkletsAvailable, workletsModule } from '../utils';
10
+ import WorkletSourceNode from './WorkletSourceNode';
11
+ import WorkletProcessingNode from './WorkletProcessingNode';
12
+ import AnalyserNode from './AnalyserNode';
13
+ import AudioBuffer from './AudioBuffer';
14
+ import AudioBufferQueueSourceNode from './AudioBufferQueueSourceNode';
15
+ import AudioBufferSourceNode from './AudioBufferSourceNode';
7
16
  import AudioDestinationNode from './AudioDestinationNode';
8
- import OscillatorNode from './OscillatorNode';
9
- import GainNode from './GainNode';
10
- import StereoPannerNode from './StereoPannerNode';
11
17
  import BiquadFilterNode from './BiquadFilterNode';
12
- import AudioBufferSourceNode from './AudioBufferSourceNode';
13
- import AudioBuffer from './AudioBuffer';
18
+ import ConstantSourceNode from './ConstantSourceNode';
19
+ import GainNode from './GainNode';
20
+ import OscillatorNode from './OscillatorNode';
14
21
  import PeriodicWave from './PeriodicWave';
15
- import AnalyserNode from './AnalyserNode';
16
- import AudioBufferQueueSourceNode from './AudioBufferQueueSourceNode';
17
- import StreamerNode from './StreamerNode';
18
- import { InvalidAccessError, NotSupportedError } from '../errors';
19
22
  import RecorderAdapterNode from './RecorderAdapterNode';
23
+ import StereoPannerNode from './StereoPannerNode';
24
+ import StreamerNode from './StreamerNode';
25
+ import WorkletNode from './WorkletNode';
26
+ import { decodeAudioData, decodePCMInBase64 } from './AudioDecoder';
20
27
 
21
28
  export default class BaseAudioContext {
22
29
  readonly destination: AudioDestinationNode;
@@ -37,6 +44,152 @@ export default class BaseAudioContext {
37
44
  return this.context.state;
38
45
  }
39
46
 
47
+ public async decodeAudioData(
48
+ input: string | ArrayBuffer,
49
+ sampleRate?: number
50
+ ): Promise<AudioBuffer> {
51
+ if (!(typeof input === 'string' || input instanceof ArrayBuffer)) {
52
+ throw new TypeError('Input must be a string or ArrayBuffer');
53
+ }
54
+ return await decodeAudioData(input, sampleRate ?? this.sampleRate);
55
+ }
56
+
57
+ public async decodePCMInBase64(
58
+ base64String: string,
59
+ inputSampleRate: number,
60
+ inputChannelCount: number,
61
+ isInterleaved: boolean = true
62
+ ): Promise<AudioBuffer> {
63
+ return await decodePCMInBase64(
64
+ base64String,
65
+ inputSampleRate,
66
+ inputChannelCount,
67
+ isInterleaved
68
+ );
69
+ }
70
+
71
+ createWorkletNode(
72
+ callback: (audioData: Array<Float32Array>, channelCount: number) => void,
73
+ bufferLength: number,
74
+ inputChannelCount: number,
75
+ workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
76
+ ): WorkletNode {
77
+ if (inputChannelCount < 1 || inputChannelCount > 32) {
78
+ throw new NotSupportedError(
79
+ `The number of input channels provided (${inputChannelCount}) can not be less than 1 or greater than 32`
80
+ );
81
+ }
82
+ if (bufferLength < 1) {
83
+ throw new NotSupportedError(
84
+ `The buffer length provided (${bufferLength}) can not be less than 1`
85
+ );
86
+ }
87
+
88
+ if (isWorkletsAvailable) {
89
+ const shareableWorklet = workletsModule.makeShareableCloneRecursive(
90
+ (audioBuffers: Array<ArrayBuffer>, channelCount: number) => {
91
+ 'worklet';
92
+ const floatAudioData: Array<Float32Array> = audioBuffers.map(
93
+ (buffer) => new Float32Array(buffer)
94
+ );
95
+ callback(floatAudioData, channelCount);
96
+ }
97
+ );
98
+ return new WorkletNode(
99
+ this,
100
+ this.context.createWorkletNode(
101
+ shareableWorklet,
102
+ workletRuntime === 'UIRuntime',
103
+ bufferLength,
104
+ inputChannelCount
105
+ )
106
+ );
107
+ }
108
+ /// User does not have worklets as a dependency so he cannot use the worklet API.
109
+ throw new Error(
110
+ '[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
111
+ );
112
+ }
113
+
114
+ createWorkletProcessingNode(
115
+ callback: (
116
+ inputData: Array<Float32Array>,
117
+ outputData: Array<Float32Array>,
118
+ framesToProcess: number,
119
+ currentTime: number
120
+ ) => void,
121
+ workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
122
+ ): WorkletProcessingNode {
123
+ if (isWorkletsAvailable) {
124
+ const shareableWorklet = workletsModule.makeShareableCloneRecursive(
125
+ (
126
+ inputBuffers: Array<ArrayBuffer>,
127
+ outputBuffers: Array<ArrayBuffer>,
128
+ framesToProcess: number,
129
+ currentTime: number
130
+ ) => {
131
+ 'worklet';
132
+ const inputData: Array<Float32Array> = inputBuffers.map(
133
+ (buffer) => new Float32Array(buffer, 0, framesToProcess)
134
+ );
135
+ const outputData: Array<Float32Array> = outputBuffers.map(
136
+ (buffer) => new Float32Array(buffer, 0, framesToProcess)
137
+ );
138
+ callback(inputData, outputData, framesToProcess, currentTime);
139
+ }
140
+ );
141
+ return new WorkletProcessingNode(
142
+ this,
143
+ this.context.createWorkletProcessingNode(
144
+ shareableWorklet,
145
+ workletRuntime === 'UIRuntime'
146
+ )
147
+ );
148
+ }
149
+ /// User does not have worklets as a dependency so he cannot use the worklet API.
150
+ throw new Error(
151
+ '[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
152
+ );
153
+ }
154
+
155
+ createWorkletSourceNode(
156
+ callback: (
157
+ audioData: Array<Float32Array>,
158
+ framesToProcess: number,
159
+ currentTime: number,
160
+ startOffset: number
161
+ ) => void,
162
+ workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
163
+ ): WorkletSourceNode {
164
+ if (!isWorkletsAvailable) {
165
+ /// User does not have worklets as a dependency so he cannot use the worklet API.
166
+ throw new Error(
167
+ '[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
168
+ );
169
+ }
170
+ const shareableWorklet = workletsModule.makeShareableCloneRecursive(
171
+ (
172
+ audioBuffers: Array<ArrayBuffer>,
173
+ framesToProcess: number,
174
+ currentTime: number,
175
+ startOffset: number
176
+ ) => {
177
+ 'worklet';
178
+ const floatAudioData: Array<Float32Array> = audioBuffers.map(
179
+ (buffer) => new Float32Array(buffer)
180
+ );
181
+ callback(floatAudioData, framesToProcess, currentTime, startOffset);
182
+ }
183
+ );
184
+ return new WorkletSourceNode(
185
+ this,
186
+ this.context.createWorkletSourceNode(
187
+ shareableWorklet,
188
+ workletRuntime === 'UIRuntime'
189
+ )
190
+ );
191
+ }
192
+
40
193
  createRecorderAdapter(): RecorderAdapterNode {
41
194
  return new RecorderAdapterNode(this, this.context.createRecorderAdapter());
42
195
  }
@@ -49,6 +202,10 @@ export default class BaseAudioContext {
49
202
  return new StreamerNode(this, this.context.createStreamer());
50
203
  }
51
204
 
205
+ createConstantSource(): ConstantSourceNode {
206
+ return new ConstantSourceNode(this, this.context.createConstantSource());
207
+ }
208
+
52
209
  createGain(): GainNode {
53
210
  return new GainNode(this, this.context.createGain());
54
211
  }
@@ -62,7 +219,7 @@ export default class BaseAudioContext {
62
219
  }
63
220
 
64
221
  createBufferSource(
65
- options?: AudioBufferSourceNodeOptions
222
+ options?: AudioBufferBaseSourceNodeOptions
66
223
  ): AudioBufferSourceNode {
67
224
  const pitchCorrection = options?.pitchCorrection ?? false;
68
225
 
@@ -72,10 +229,14 @@ export default class BaseAudioContext {
72
229
  );
73
230
  }
74
231
 
75
- createBufferQueueSource(): AudioBufferQueueSourceNode {
232
+ createBufferQueueSource(
233
+ options?: AudioBufferBaseSourceNodeOptions
234
+ ): AudioBufferQueueSourceNode {
235
+ const pitchCorrection = options?.pitchCorrection ?? false;
236
+
76
237
  return new AudioBufferQueueSourceNode(
77
238
  this,
78
- this.context.createBufferQueueSource()
239
+ this.context.createBufferQueueSource(pitchCorrection)
79
240
  );
80
241
  }
81
242
 
@@ -128,32 +289,4 @@ export default class BaseAudioContext {
128
289
  createAnalyser(): AnalyserNode {
129
290
  return new AnalyserNode(this, this.context.createAnalyser());
130
291
  }
131
-
132
- /** Decodes audio data from a local file path. */
133
- async decodeAudioDataSource(sourcePath: string): Promise<AudioBuffer> {
134
- // Remove the file:// prefix if it exists
135
- if (sourcePath.startsWith('file://')) {
136
- sourcePath = sourcePath.replace('file://', '');
137
- }
138
-
139
- return new AudioBuffer(
140
- await this.context.decodeAudioDataSource(sourcePath)
141
- );
142
- }
143
-
144
- /** Decodes audio data from an ArrayBuffer. */
145
- async decodeAudioData(data: ArrayBuffer): Promise<AudioBuffer> {
146
- return new AudioBuffer(
147
- await this.context.decodeAudioData(new Uint8Array(data))
148
- );
149
- }
150
-
151
- async decodePCMInBase64Data(
152
- base64: string,
153
- playbackRate: number = 1.0
154
- ): Promise<AudioBuffer> {
155
- return new AudioBuffer(
156
- await this.context.decodePCMAudioDataInBase64(base64, playbackRate)
157
- );
158
- }
159
292
  }
@@ -0,0 +1,13 @@
1
+ import { IConstantSourceNode } from '../interfaces';
2
+ import AudioParam from './AudioParam';
3
+ import AudioScheduledSourceNode from './AudioScheduledSourceNode';
4
+ import BaseAudioContext from './BaseAudioContext';
5
+
6
+ export default class ConstantSourceNode extends AudioScheduledSourceNode {
7
+ readonly offset: AudioParam;
8
+
9
+ constructor(context: BaseAudioContext, node: IConstantSourceNode) {
10
+ super(context, node);
11
+ this.offset = new AudioParam(node.offset, context);
12
+ }
13
+ }
@@ -3,12 +3,17 @@ import BaseAudioContext from './BaseAudioContext';
3
3
  import { OfflineAudioContextOptions } from '../types';
4
4
  import { InvalidStateError, NotSupportedError } from '../errors';
5
5
  import AudioBuffer from './AudioBuffer';
6
+ import { isWorkletsAvailable, workletsModule } from '../utils';
6
7
 
7
8
  export default class OfflineAudioContext extends BaseAudioContext {
8
9
  private isSuspended: boolean;
9
10
  private isRendering: boolean;
10
11
  private duration: number;
11
12
 
13
+ // We need to keep here a reference to this runtime to better manage its lifecycle
14
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
15
+ private _audioRuntime: any;
16
+
12
17
  constructor(options: OfflineAudioContextOptions);
13
18
  constructor(numberOfChannels: number, length: number, sampleRate: number);
14
19
  constructor(
@@ -16,10 +21,20 @@ export default class OfflineAudioContext extends BaseAudioContext {
16
21
  arg1?: number,
17
22
  arg2?: number
18
23
  ) {
24
+ let audioRuntime = null;
25
+ if (isWorkletsAvailable) {
26
+ audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
27
+ }
28
+
19
29
  if (typeof arg0 === 'object') {
20
30
  const { numberOfChannels, length, sampleRate } = arg0;
21
31
  super(
22
- global.createOfflineAudioContext(numberOfChannels, length, sampleRate)
32
+ global.createOfflineAudioContext(
33
+ numberOfChannels,
34
+ length,
35
+ sampleRate,
36
+ audioRuntime
37
+ )
23
38
  );
24
39
 
25
40
  this.duration = length / sampleRate;
@@ -28,7 +43,7 @@ export default class OfflineAudioContext extends BaseAudioContext {
28
43
  typeof arg1 === 'number' &&
29
44
  typeof arg2 === 'number'
30
45
  ) {
31
- super(global.createOfflineAudioContext(arg0, arg1, arg2));
46
+ super(global.createOfflineAudioContext(arg0, arg1, arg2, audioRuntime));
32
47
  this.duration = arg1 / arg2;
33
48
  } else {
34
49
  throw new NotSupportedError('Invalid constructor arguments');
@@ -36,6 +51,7 @@ export default class OfflineAudioContext extends BaseAudioContext {
36
51
 
37
52
  this.isSuspended = false;
38
53
  this.isRendering = false;
54
+ this._audioRuntime = audioRuntime;
39
55
  }
40
56
 
41
57
  async resume(): Promise<undefined> {
@@ -5,6 +5,7 @@ import AudioParam from './AudioParam';
5
5
  import BaseAudioContext from './BaseAudioContext';
6
6
  import PeriodicWave from './PeriodicWave';
7
7
  import { InvalidStateError } from '../errors';
8
+ import { EventEmptyType } from '../events/types';
8
9
 
9
10
  export default class OscillatorNode extends AudioScheduledSourceNode {
10
11
  readonly frequency: AudioParam;
@@ -34,4 +35,14 @@ export default class OscillatorNode extends AudioScheduledSourceNode {
34
35
  public setPeriodicWave(wave: PeriodicWave): void {
35
36
  (this.node as IOscillatorNode).setPeriodicWave(wave.periodicWave);
36
37
  }
38
+
39
+ public override get onEnded(): ((event: EventEmptyType) => void) | undefined {
40
+ return super.onEnded as ((event: EventEmptyType) => void) | undefined;
41
+ }
42
+
43
+ public override set onEnded(
44
+ callback: ((event: EventEmptyType) => void) | null
45
+ ) {
46
+ super.onEnded = callback;
47
+ }
37
48
  }
@@ -0,0 +1,3 @@
1
+ import AudioNode from './AudioNode';
2
+
3
+ export default class WorkletNode extends AudioNode {}
@@ -0,0 +1,3 @@
1
+ import AudioNode from './AudioNode';
2
+
3
+ export default class WorkletProcessingNode extends AudioNode {}
@@ -0,0 +1,3 @@
1
+ import AudioScheduledSourceNode from './AudioScheduledSourceNode';
2
+
3
+ export default class WorkletSourceNode extends AudioScheduledSourceNode {}
@@ -46,6 +46,7 @@ type SystemEvents = RemoteCommandEvents & {
46
46
 
47
47
  export interface OnEndedEventType extends EventEmptyType {
48
48
  bufferId: string | undefined;
49
+ isLast: boolean | undefined;
49
50
  }
50
51
 
51
52
  export interface OnAudioReadyEventType {
@@ -56,6 +57,7 @@ export interface OnAudioReadyEventType {
56
57
 
57
58
  interface AudioAPIEvents {
58
59
  ended: OnEndedEventType;
60
+ loopEnded: EventEmptyType;
59
61
  audioReady: OnAudioReadyEventType;
60
62
  positionChanged: EventTypeWithValue;
61
63
  audioError: EventEmptyType; // to change
package/src/interfaces.ts CHANGED
@@ -1,26 +1,68 @@
1
+ import { AudioEventCallback, AudioEventName } from './events/types';
1
2
  import {
2
- WindowType,
3
- ContextState,
4
- OscillatorType,
5
3
  BiquadFilterType,
6
4
  ChannelCountMode,
7
5
  ChannelInterpretation,
6
+ ContextState,
7
+ OscillatorType,
8
+ WindowType,
8
9
  } from './types';
9
- import { AudioEventName, AudioEventCallback } from './events/types';
10
+
11
+ export type WorkletNodeCallback = (
12
+ audioData: Array<ArrayBuffer>,
13
+ channelCount: number
14
+ ) => void;
15
+
16
+ export type WorkletSourceNodeCallback = (
17
+ audioData: Array<ArrayBuffer>,
18
+ framesToProcess: number,
19
+ currentTime: number,
20
+ startOffset: number
21
+ ) => void;
22
+
23
+ export type WorkletProcessingNodeCallback = (
24
+ inputData: Array<ArrayBuffer>,
25
+ outputData: Array<ArrayBuffer>,
26
+ framesToProcess: number,
27
+ currentTime: number
28
+ ) => void;
29
+
30
+ export type ShareableWorkletCallback =
31
+ | WorkletNodeCallback
32
+ | WorkletSourceNodeCallback
33
+ | WorkletProcessingNodeCallback;
10
34
 
11
35
  export interface IBaseAudioContext {
12
36
  readonly destination: IAudioDestinationNode;
13
37
  readonly state: ContextState;
14
38
  readonly sampleRate: number;
15
39
  readonly currentTime: number;
40
+ readonly decoder: IAudioDecoder;
16
41
 
17
42
  createRecorderAdapter(): IRecorderAdapterNode;
43
+ createWorkletSourceNode(
44
+ shareableWorklet: ShareableWorkletCallback,
45
+ shouldUseUiRuntime: boolean
46
+ ): IWorkletSourceNode;
47
+ createWorkletNode(
48
+ shareableWorklet: ShareableWorkletCallback,
49
+ shouldUseUiRuntime: boolean,
50
+ bufferLength: number,
51
+ inputChannelCount: number
52
+ ): IWorkletNode;
53
+ createWorkletProcessingNode(
54
+ shareableWorklet: ShareableWorkletCallback,
55
+ shouldUseUiRuntime: boolean
56
+ ): IWorkletProcessingNode;
18
57
  createOscillator(): IOscillatorNode;
58
+ createConstantSource(): IConstantSourceNode;
19
59
  createGain(): IGainNode;
20
60
  createStereoPanner(): IStereoPannerNode;
21
61
  createBiquadFilter: () => IBiquadFilterNode;
22
62
  createBufferSource: (pitchCorrection: boolean) => IAudioBufferSourceNode;
23
- createBufferQueueSource: () => IAudioBufferQueueSourceNode;
63
+ createBufferQueueSource: (
64
+ pitchCorrection: boolean
65
+ ) => IAudioBufferQueueSourceNode;
24
66
  createBuffer: (
25
67
  channels: number,
26
68
  length: number,
@@ -32,12 +74,6 @@ export interface IBaseAudioContext {
32
74
  disableNormalization: boolean
33
75
  ) => IPeriodicWave;
34
76
  createAnalyser: () => IAnalyserNode;
35
- decodeAudioDataSource: (sourcePath: string) => Promise<IAudioBuffer>;
36
- decodeAudioData: (arrayBuffer: ArrayBuffer) => Promise<IAudioBuffer>;
37
- decodePCMAudioDataInBase64: (
38
- b64: string,
39
- playbackRate: number
40
- ) => Promise<IAudioBuffer>;
41
77
  createStreamer: () => IStreamerNode;
42
78
  }
43
79
 
@@ -119,6 +155,10 @@ export interface IStreamerNode extends IAudioNode {
119
155
  initialize(streamPath: string): boolean;
120
156
  }
121
157
 
158
+ export interface IConstantSourceNode extends IAudioScheduledSourceNode {
159
+ readonly offset: IAudioParam;
160
+ }
161
+
122
162
  export interface IAudioBufferSourceNode extends IAudioBufferBaseSourceNode {
123
163
  buffer: IAudioBuffer | null;
124
164
  loop: boolean;
@@ -128,6 +168,9 @@ export interface IAudioBufferSourceNode extends IAudioBufferBaseSourceNode {
128
168
 
129
169
  start: (when?: number, offset?: number, duration?: number) => void;
130
170
  setBuffer: (audioBuffer: IAudioBuffer | null) => void;
171
+
172
+ // passing subscriptionId(uint_64 in cpp, string in js) to the cpp
173
+ onLoopEnded: string;
131
174
  }
132
175
 
133
176
  export interface IAudioBufferQueueSourceNode
@@ -200,6 +243,12 @@ export interface IAnalyserNode extends IAudioNode {
200
243
 
201
244
  export interface IRecorderAdapterNode extends IAudioNode {}
202
245
 
246
+ export interface IWorkletNode extends IAudioNode {}
247
+
248
+ export interface IWorkletSourceNode extends IAudioScheduledSourceNode {}
249
+
250
+ export interface IWorkletProcessingNode extends IAudioNode {}
251
+
203
252
  export interface IAudioRecorder {
204
253
  start: () => void;
205
254
  stop: () => void;
@@ -210,6 +259,23 @@ export interface IAudioRecorder {
210
259
  onAudioReady: string;
211
260
  }
212
261
 
262
+ export interface IAudioDecoder {
263
+ decodeWithMemoryBlock: (
264
+ arrayBuffer: ArrayBuffer,
265
+ sampleRate?: number
266
+ ) => Promise<IAudioBuffer>;
267
+ decodeWithFilePath: (
268
+ sourcePath: string,
269
+ sampleRate?: number
270
+ ) => Promise<IAudioBuffer>;
271
+ decodeWithPCMInBase64: (
272
+ b64: string,
273
+ inputSampleRate: number,
274
+ inputChannelCount: number,
275
+ interleaved?: boolean
276
+ ) => Promise<IAudioBuffer>;
277
+ }
278
+
213
279
  export interface IAudioEventEmitter {
214
280
  addAudioEventListener<Name extends AudioEventName>(
215
281
  name: Name,
package/src/types.ts CHANGED
@@ -14,6 +14,8 @@ export type BiquadFilterType =
14
14
 
15
15
  export type ContextState = 'running' | 'closed' | `suspended`;
16
16
 
17
+ export type AudioWorkletRuntime = 'AudioRuntime' | 'UIRuntime';
18
+
17
19
  export type OscillatorType =
18
20
  | 'sine'
19
21
  | 'square'
@@ -43,7 +45,7 @@ export interface AudioRecorderOptions {
43
45
 
44
46
  export type WindowType = 'blackman' | 'hann';
45
47
 
46
- export interface AudioBufferSourceNodeOptions {
48
+ export interface AudioBufferBaseSourceNodeOptions {
47
49
  pitchCorrection: boolean;
48
50
  }
49
51
 
@@ -1,3 +1,24 @@
1
+ import type { ShareableWorkletCallback } from '../interfaces';
2
+
3
+ interface SimplifiedWorkletModule {
4
+ makeShareableCloneRecursive: (
5
+ workletCallback: ShareableWorkletCallback
6
+ ) => ShareableWorkletCallback;
7
+
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ createWorkletRuntime: (options?: any) => any;
10
+ }
11
+
1
12
  export function clamp(value: number, min: number, max: number): number {
2
13
  return Math.min(Math.max(value, min), max);
3
14
  }
15
+
16
+ export let isWorkletsAvailable = false;
17
+ export let workletsModule: SimplifiedWorkletModule;
18
+
19
+ try {
20
+ workletsModule = require('react-native-worklets');
21
+ isWorkletsAvailable = true;
22
+ } catch (error) {
23
+ isWorkletsAvailable = false;
24
+ }
@@ -26,7 +26,7 @@ interface IStretcherNode extends globalThis.AudioNode {
26
26
  numberOfInputs: number;
27
27
  numberOfOutputs: number;
28
28
 
29
- onended:
29
+ onEnded:
30
30
  | ((this: globalThis.AudioScheduledSourceNode, ev: Event) => unknown)
31
31
  | null;
32
32
  addEventListener: (
@@ -2,7 +2,7 @@ import {
2
2
  ContextState,
3
3
  PeriodicWaveConstraints,
4
4
  AudioContextOptions,
5
- AudioBufferSourceNodeOptions,
5
+ AudioBufferBaseSourceNodeOptions,
6
6
  } from '../types';
7
7
  import { InvalidAccessError, NotSupportedError } from '../errors';
8
8
  import BaseAudioContext from './BaseAudioContext';
@@ -17,6 +17,7 @@ import PeriodicWave from './PeriodicWave';
17
17
  import StereoPannerNode from './StereoPannerNode';
18
18
 
19
19
  import { globalWasmPromise, globalTag } from './custom/LoadCustomWasm';
20
+ import ConstantSourceNode from './ConstantSourceNode';
20
21
 
21
22
  export default class AudioContext implements BaseAudioContext {
22
23
  readonly context: globalThis.AudioContext;
@@ -53,6 +54,10 @@ export default class AudioContext implements BaseAudioContext {
53
54
  return new OscillatorNode(this, this.context.createOscillator());
54
55
  }
55
56
 
57
+ createConstantSource(): ConstantSourceNode {
58
+ return new ConstantSourceNode(this, this.context.createConstantSource());
59
+ }
60
+
56
61
  createGain(): GainNode {
57
62
  return new GainNode(this, this.context.createGain());
58
63
  }
@@ -66,7 +71,7 @@ export default class AudioContext implements BaseAudioContext {
66
71
  }
67
72
 
68
73
  async createBufferSource(
69
- options?: AudioBufferSourceNodeOptions
74
+ options?: AudioBufferBaseSourceNodeOptions
70
75
  ): Promise<AudioBufferSourceNode> {
71
76
  if (!options || !options.pitchCorrection) {
72
77
  return new AudioBufferSourceNode(
@@ -37,7 +37,7 @@ export default class AudioScheduledSourceNode extends AudioNode {
37
37
  }
38
38
 
39
39
  // eslint-disable-next-line accessor-pairs
40
- public set onended(callback: (event: EventEmptyType) => void) {
40
+ public set onEnded(callback: (event: EventEmptyType) => void) {
41
41
  (this.node as globalThis.AudioScheduledSourceNode).onended = callback;
42
42
  }
43
43
  }
@@ -8,6 +8,7 @@ import GainNode from './GainNode';
8
8
  import OscillatorNode from './OscillatorNode';
9
9
  import PeriodicWave from './PeriodicWave';
10
10
  import StereoPannerNode from './StereoPannerNode';
11
+ import ConstantSourceNode from './ConstantSourceNode';
11
12
 
12
13
  export default interface BaseAudioContext {
13
14
  readonly context: globalThis.BaseAudioContext;
@@ -18,6 +19,7 @@ export default interface BaseAudioContext {
18
19
  get currentTime(): number;
19
20
  get state(): ContextState;
20
21
  createOscillator(): OscillatorNode;
22
+ createConstantSource(): ConstantSourceNode;
21
23
  createGain(): GainNode;
22
24
  createStereoPanner(): StereoPannerNode;
23
25
  createBiquadFilter(): BiquadFilterNode;
@@ -0,0 +1,12 @@
1
+ import AudioParam from './AudioParam';
2
+ import AudioScheduledSourceNode from './AudioScheduledSourceNode';
3
+ import BaseAudioContext from './BaseAudioContext';
4
+
5
+ export default class ConstantSourceNode extends AudioScheduledSourceNode {
6
+ readonly offset: AudioParam;
7
+
8
+ constructor(context: BaseAudioContext, node: globalThis.ConstantSourceNode) {
9
+ super(context, node);
10
+ this.offset = new AudioParam(node.offset, context);
11
+ }
12
+ }