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
@@ -0,0 +1,84 @@
1
+ #include <audioapi/core/sources/WorkletSourceNode.h>
2
+ #include <audioapi/core/utils/Constants.h>
3
+
4
+ namespace audioapi {
5
+
6
+ WorkletSourceNode::WorkletSourceNode(
7
+ BaseAudioContext *context,
8
+ std::shared_ptr<worklets::SerializableWorklet> &worklet,
9
+ std::weak_ptr<worklets::WorkletRuntime> runtime)
10
+ : AudioScheduledSourceNode(context),
11
+ workletRunner_(runtime),
12
+ shareableWorklet_(worklet) {
13
+ isInitialized_ = true;
14
+
15
+ // Prepare buffers for audio processing
16
+ size_t outputChannelCount = this->getChannelCount();
17
+ outputBuffsHandles_.resize(outputChannelCount);
18
+ for (size_t i = 0; i < outputChannelCount; ++i) {
19
+ auto buff = new uint8_t[RENDER_QUANTUM_SIZE * sizeof(float)];
20
+ outputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(
21
+ buff, RENDER_QUANTUM_SIZE * sizeof(float));
22
+ }
23
+ }
24
+
25
+ std::shared_ptr<AudioBus> WorkletSourceNode::processNode(
26
+ const std::shared_ptr<AudioBus> &processingBus,
27
+ int framesToProcess) {
28
+ if (isUnscheduled() || isFinished() || !isEnabled()) {
29
+ processingBus->zero();
30
+ return processingBus;
31
+ }
32
+
33
+ size_t startOffset = 0;
34
+ size_t nonSilentFramesToProcess = framesToProcess;
35
+
36
+ updatePlaybackInfo(
37
+ processingBus, framesToProcess, startOffset, nonSilentFramesToProcess);
38
+
39
+ if (nonSilentFramesToProcess == 0) {
40
+ processingBus->zero();
41
+ return processingBus;
42
+ }
43
+
44
+ size_t outputChannelCount = processingBus->getNumberOfChannels();
45
+
46
+ auto result = workletRunner_.executeOnRuntimeGuardedSync(
47
+ [this, nonSilentFramesToProcess, startOffset](jsi::Runtime &rt) {
48
+ auto jsiArray = jsi::Array(rt, this->outputBuffsHandles_.size());
49
+ for (size_t i = 0; i < this->outputBuffsHandles_.size(); ++i) {
50
+ auto arrayBuffer = jsi::ArrayBuffer(rt, this->outputBuffsHandles_[i]);
51
+ jsiArray.setValueAtIndex(rt, i, arrayBuffer);
52
+ }
53
+ return workletRunner_
54
+ .executeWorklet(
55
+ shareableWorklet_,
56
+ jsiArray,
57
+ jsi::Value(rt, static_cast<int>(nonSilentFramesToProcess)),
58
+ jsi::Value(rt, this->context_->getCurrentTime()),
59
+ jsi::Value(rt, static_cast<int>(startOffset)))
60
+ .value_or(jsi::Value::undefined());
61
+ });
62
+
63
+ // If the worklet execution failed, zero the output
64
+ // It might happen if the runtime is not available
65
+ if (!result.has_value()) {
66
+ processingBus->zero();
67
+ return processingBus;
68
+ }
69
+
70
+ // Copy the processed data back to the AudioBus
71
+ for (size_t i = 0; i < outputChannelCount; ++i) {
72
+ float *channelData = processingBus->getChannel(i)->getData();
73
+ memcpy(
74
+ channelData + startOffset,
75
+ outputBuffsHandles_[i]->data(),
76
+ nonSilentFramesToProcess * sizeof(float));
77
+ }
78
+
79
+ handleStopScheduled();
80
+
81
+ return processingBus;
82
+ }
83
+
84
+ } // namespace audioapi
@@ -0,0 +1,47 @@
1
+ #pragma once
2
+ #include <jsi/jsi.h>
3
+ #include <audioapi/core/BaseAudioContext.h>
4
+ #include <audioapi/utils/AudioBus.h>
5
+ #include <audioapi/core/sources/AudioScheduledSourceNode.h>
6
+ #include <audioapi/core/utils/worklets/SafeIncludes.h>
7
+ #include <audioapi/core/utils/worklets/WorkletsRunner.h>
8
+ #include <audioapi/jsi/AudioArrayBuffer.h>
9
+ #include <audioapi/utils/AudioArray.h>
10
+
11
+ #include <vector>
12
+ #include <memory>
13
+
14
+ namespace audioapi {
15
+
16
+ #if RN_AUDIO_API_TEST
17
+ class WorkletSourceNode : public AudioScheduledSourceNode {
18
+ public:
19
+ explicit WorkletSourceNode(
20
+ BaseAudioContext *context,
21
+ std::shared_ptr<worklets::SerializableWorklet> &worklet,
22
+ std::weak_ptr<worklets::WorkletRuntime> runtime
23
+ ) : AudioScheduledSourceNode(context) {}
24
+
25
+ protected:
26
+ std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override { return processingBus; }
27
+ };
28
+ #else
29
+
30
+ class WorkletSourceNode : public AudioScheduledSourceNode {
31
+ public:
32
+ explicit WorkletSourceNode(
33
+ BaseAudioContext *context,
34
+ std::shared_ptr<worklets::SerializableWorklet> &worklet,
35
+ std::weak_ptr<worklets::WorkletRuntime> runtime
36
+ );
37
+
38
+ protected:
39
+ std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
40
+ private:
41
+ WorkletsRunner workletRunner_;
42
+ std::shared_ptr<worklets::SerializableWorklet> shareableWorklet_;
43
+ std::vector<std::shared_ptr<AudioArrayBuffer>> outputBuffsHandles_;
44
+ };
45
+ #endif // RN_AUDIO_API_TEST
46
+
47
+ } // namespace audioapi
@@ -0,0 +1,16 @@
1
+ #pragma once
2
+
3
+ namespace audioapi {
4
+
5
+ enum class AudioFormat {
6
+ UNKNOWN,
7
+ WAV,
8
+ OGG,
9
+ FLAC,
10
+ AAC,
11
+ MP3,
12
+ M4A,
13
+ MP4,
14
+ MOV
15
+ };
16
+ } // namespace audioapi
@@ -1,124 +1,68 @@
1
1
  #pragma once
2
2
 
3
+ #include <audioapi/core/types/AudioFormat.h>
3
4
  #include <audioapi/libs/audio-stretch/stretch.h>
4
5
  #include <audioapi/libs/miniaudio/miniaudio.h>
6
+ #include <algorithm>
7
+ #include <cstring>
5
8
  #include <memory>
6
9
  #include <string>
7
10
  #include <vector>
8
- #include <cstring>
9
- #include <algorithm>
10
11
 
11
12
  namespace audioapi {
12
13
 
13
- enum class AudioFormat {
14
- UNKNOWN,
15
- WAV,
16
- OGG,
17
- FLAC,
18
- AAC,
19
- MP3,
20
- M4A,
21
- MP4,
22
- MOV
23
- };
24
-
25
- class AudioBus;
14
+ class AudioBuffer;
26
15
 
27
16
  static constexpr int CHUNK_SIZE = 4096;
28
17
 
29
18
  class AudioDecoder {
30
19
  public:
31
- explicit AudioDecoder(float sampleRate) : sampleRate_(sampleRate) {}
20
+ AudioDecoder() = delete;
32
21
 
33
- [[nodiscard]] std::shared_ptr<AudioBus> decodeWithFilePath(
34
- const std::string &path) const;
35
- [[nodiscard]] std::shared_ptr<AudioBus> decodeWithMemoryBlock(
36
- const void *data,
37
- size_t size) const;
38
- [[nodiscard]] std::shared_ptr<AudioBus> decodeWithPCMInBase64(
39
- const std::string &data,
40
- float playbackSpeed) const;
22
+ [[nodiscard]] static std::shared_ptr<AudioBuffer> decodeWithFilePath(const std::string &path, float sampleRate);
23
+ [[nodiscard]] static std::shared_ptr<AudioBuffer>
24
+ decodeWithMemoryBlock(const void *data, size_t size, float sampleRate);
25
+ [[nodiscard]] static std::shared_ptr<AudioBuffer>
26
+ decodeWithPCMInBase64(const std::string &data, float inputSampleRate, int inputChannelCount, bool interleaved);
41
27
 
42
28
  private:
43
- float sampleRate_;
44
- int numChannels_ = 2;
45
-
46
- static std::vector<int16_t> readAllPcmFrames(
47
- ma_decoder &decoder,
48
- int numChannels,
49
- ma_uint64 &outFramesRead);
50
- static std::shared_ptr<AudioBus> makeAudioBusFromInt16Buffer(
51
- const std::vector<int16_t> &buffer,
52
- int numChannels,
53
- float sampleRate);
54
-
55
- void changePlaybackSpeedIfNeeded(
56
- std::vector<int16_t> &buffer,
57
- size_t framesDecoded,
58
- int numChannels,
59
- float playbackSpeed) const {
60
- if (playbackSpeed == 1.0f) {
61
- return;
62
- }
63
-
64
- auto stretcher = stretch_init(
65
- static_cast<int>(sampleRate_ / 333.0f),
66
- static_cast<int>(sampleRate_ / 55.0f),
67
- numChannels,
68
- 0x1);
29
+ static std::vector<float> readAllPcmFrames(ma_decoder &decoder, int outputChannels);
30
+ static std::shared_ptr<AudioBuffer>
31
+ makeAudioBufferFromFloatBuffer(const std::vector<float> &buffer, float outputSampleRate, int outputChannels);
69
32
 
70
- int maxOutputFrames = stretch_output_capacity(
71
- stretcher, static_cast<int>(framesDecoded), 1 / playbackSpeed);
72
- std::vector<int16_t> stretchedBuffer(maxOutputFrames);
73
-
74
- int outputFrames = stretch_samples(
75
- stretcher,
76
- buffer.data(),
77
- static_cast<int>(framesDecoded),
78
- stretchedBuffer.data(),
79
- 1 / playbackSpeed);
80
-
81
- outputFrames +=
82
- stretch_flush(stretcher, stretchedBuffer.data() + (outputFrames));
83
- stretchedBuffer.resize(outputFrames);
84
-
85
- buffer = stretchedBuffer;
86
-
87
- stretch_deinit(stretcher);
88
- }
89
-
90
- static AudioFormat detectAudioFormat(const void* data, size_t size) {
91
- if (size < 12) return AudioFormat::UNKNOWN;
92
- const auto* bytes = static_cast<const unsigned char*>(data);
33
+ static AudioFormat detectAudioFormat(const void *data, size_t size) {
34
+ if (size < 12)
35
+ return AudioFormat::UNKNOWN;
36
+ const auto *bytes = static_cast<const unsigned char *>(data);
93
37
 
94
38
  // WAV/RIFF
95
39
  if (std::memcmp(bytes, "RIFF", 4) == 0 && std::memcmp(bytes + 8, "WAVE", 4) == 0)
96
- return AudioFormat::WAV;
40
+ return AudioFormat::WAV;
97
41
 
98
42
  // OGG
99
43
  if (std::memcmp(bytes, "OggS", 4) == 0)
100
- return AudioFormat::OGG;
44
+ return AudioFormat::OGG;
101
45
 
102
46
  // FLAC
103
47
  if (std::memcmp(bytes, "fLaC", 4) == 0)
104
- return AudioFormat::FLAC;
48
+ return AudioFormat::FLAC;
105
49
 
106
50
  // AAC starts with 0xFF 0xF1 or 0xFF 0xF9
107
51
  if (bytes[0] == 0xFF && (bytes[1] & 0xF6) == 0xF0)
108
- return AudioFormat::AAC;
52
+ return AudioFormat::AAC;
109
53
 
110
54
  // MP3: "ID3" or 11-bit frame sync (0xFF 0xE0)
111
55
  if (std::memcmp(bytes, "ID3", 3) == 0)
112
- return AudioFormat::MP3;
56
+ return AudioFormat::MP3;
113
57
  if (bytes[0] == 0xFF && (bytes[1] & 0xE0) == 0xE0)
114
- return AudioFormat::MP3;
58
+ return AudioFormat::MP3;
115
59
 
116
60
  if (std::memcmp(bytes + 4, "ftyp", 4) == 0) {
117
- if (std::memcmp(bytes + 8, "M4A ", 4) == 0)
118
- return AudioFormat::M4A;
119
- else if (std::memcmp(bytes + 8, "qt ", 4) == 0)
120
- return AudioFormat::MOV;
121
- return AudioFormat::MP4;
61
+ if (std::memcmp(bytes + 8, "M4A ", 4) == 0)
62
+ return AudioFormat::M4A;
63
+ else if (std::memcmp(bytes + 8, "qt ", 4) == 0)
64
+ return AudioFormat::MOV;
65
+ return AudioFormat::MP4;
122
66
  }
123
67
  return AudioFormat::UNKNOWN;
124
68
  }
@@ -126,19 +70,21 @@ class AudioDecoder {
126
70
  static inline bool pathHasExtension(const std::string &path, const std::vector<std::string> &extensions) {
127
71
  std::string pathLower = path;
128
72
  std::transform(pathLower.begin(), pathLower.end(), pathLower.begin(), ::tolower);
129
- for (const auto& ext : extensions) {
130
- if (pathLower.ends_with(ext))
131
- return true;
73
+ for (const auto &ext : extensions) {
74
+ if (pathLower.ends_with(ext))
75
+ return true;
132
76
  }
133
77
  return false;
134
78
  }
135
79
 
136
-
137
80
  [[nodiscard]] static inline int16_t floatToInt16(float sample) {
138
- return static_cast<int16_t>(sample * 32768.0f);
81
+ return static_cast<int16_t>(sample * INT16_MAX);
139
82
  }
140
83
  [[nodiscard]] static inline float int16ToFloat(int16_t sample) {
141
- return static_cast<float>(sample) / 32768.0f;
84
+ return static_cast<float>(sample) / INT16_MAX;
85
+ }
86
+ [[nodiscard]] static inline float uint8ToFloat(uint8_t byte1, uint8_t byte2) {
87
+ return static_cast<float>(static_cast<int16_t>((byte2 << 8) | byte1)) / INT16_MAX;
142
88
  }
143
89
  };
144
90
 
@@ -1,4 +1,4 @@
1
- #include <audioapi/core/AudioParamEventQueue.h>
1
+ #include <audioapi/core/utils/AudioParamEventQueue.h>
2
2
 
3
3
  namespace audioapi {
4
4
 
@@ -31,12 +31,12 @@ bool AudioParamEventQueue::popFront(ParamChangeEvent &event) {
31
31
 
32
32
  void AudioParamEventQueue::cancelScheduledValues(double cancelTime) {
33
33
  while (!eventQueue_.isEmpty()) {
34
- auto &front = eventQueue_.peekBack();
35
- if (front.getEndTime() < cancelTime) {
34
+ auto &back = eventQueue_.peekBack();
35
+ if (back.getEndTime() < cancelTime) {
36
36
  break;
37
37
  }
38
- if (front.getStartTime() >= cancelTime ||
39
- front.getType() == ParamChangeEventType::SET_VALUE_CURVE) {
38
+ if (back.getStartTime() >= cancelTime ||
39
+ back.getType() == ParamChangeEventType::SET_VALUE_CURVE) {
40
40
  eventQueue_.popBack();
41
41
  }
42
42
  }
@@ -46,8 +46,8 @@ void AudioParamEventQueue::cancelAndHoldAtTime(
46
46
  double cancelTime,
47
47
  double &endTimeCache) {
48
48
  while (!eventQueue_.isEmpty()) {
49
- auto &front = eventQueue_.peekBack();
50
- if (front.getEndTime() < cancelTime || front.getStartTime() <= cancelTime) {
49
+ auto &back = eventQueue_.peekBack();
50
+ if (back.getEndTime() < cancelTime || back.getStartTime() <= cancelTime) {
51
51
  break;
52
52
  }
53
53
  eventQueue_.popBack();
@@ -59,6 +59,12 @@ void AudioParamEventQueue::cancelAndHoldAtTime(
59
59
  }
60
60
 
61
61
  auto &back = eventQueue_.peekBackMut();
62
+ back.setEndValue(back.getCalculateValue()(
63
+ back.getStartTime(),
64
+ back.getEndTime(),
65
+ back.getStartValue(),
66
+ back.getEndValue(),
67
+ cancelTime));
62
68
  back.setEndTime(std::min(cancelTime, back.getEndTime()));
63
69
  }
64
70
 
@@ -16,4 +16,9 @@ static constexpr float MOST_NEGATIVE_SINGLE_FLOAT = static_cast<float>(std::nume
16
16
  static float LOG2_MOST_POSITIVE_SINGLE_FLOAT = std::log2(MOST_POSITIVE_SINGLE_FLOAT);
17
17
  static float LOG10_MOST_POSITIVE_SINGLE_FLOAT = std::log10(MOST_POSITIVE_SINGLE_FLOAT);
18
18
  static constexpr float PI = static_cast<float>(M_PI);
19
+
20
+ // buffer sizes
21
+ static constexpr size_t PROMISE_VENDOR_THREAD_POOL_WORKER_COUNT = 4;
22
+ static constexpr size_t PROMISE_VENDOR_THREAD_POOL_LOAD_BALANCER_QUEUE_SIZE = 32;
23
+ static constexpr size_t PROMISE_VENDOR_THREAD_POOL_WORKER_QUEUE_SIZE = 32;
19
24
  } // namespace audioapi
@@ -0,0 +1,52 @@
1
+ #pragma once
2
+
3
+ #include <jsi/jsi.h>
4
+
5
+ #include <string>
6
+ #include <memory>
7
+
8
+ #ifdef __APPLE__
9
+ /// We cannot make any conditional logic inside podspec but it should automatically compile those files
10
+ /// they should be accessible if someone has react-native-worklets in node_modules
11
+ #if __has_include(<worklets/WorkletRuntime/WorkletRuntime.h>)
12
+ #define RN_AUDIO_API_ENABLE_WORKLETS 1
13
+ #else
14
+ #define RN_AUDIO_API_ENABLE_WORKLETS 0
15
+ #endif
16
+ #endif
17
+
18
+ #ifndef RN_AUDIO_API_TEST
19
+ #define RN_AUDIO_API_TEST 0
20
+ #endif
21
+
22
+ #if RN_AUDIO_API_ENABLE_WORKLETS
23
+ #include <worklets/WorkletRuntime/WorkletRuntime.h>
24
+ #include <worklets/SharedItems/Serializable.h>
25
+ #include <worklets/NativeModules/WorkletsModuleProxy.h>
26
+ #if ANDROID
27
+ #include <worklets/android/WorkletsModule.h>
28
+ #endif
29
+ #else
30
+ /// @brief Dummy implementation of worklets for non-worklet builds they should do nothing and mock necessary methods
31
+ /// @note It helps to reduce compile time branching across codebase
32
+ /// @note If you need to base some c++ implementation on if the worklets are enabled use `#if RN_AUDIO_API_ENABLE_WORKLETS`
33
+ namespace worklets {
34
+
35
+ using namespace facebook;
36
+ class MessageQueueThread {};
37
+ class WorkletsModuleProxy {};
38
+ class WorkletRuntime {
39
+ explicit WorkletRuntime(uint64_t, const std::shared_ptr<MessageQueueThread> &, const std::string &, const bool);
40
+ };
41
+ class SerializableWorklet {
42
+ SerializableWorklet(jsi::Runtime*, const jsi::Object &);
43
+ };
44
+ } // namespace worklets
45
+ #endif
46
+
47
+ /// @brief Struct to hold references to different runtimes used in the AudioAPI
48
+ /// @note it is used to pass them around and avoid creating multiple instances of the same runtime
49
+ struct RuntimeRegistry {
50
+ std::weak_ptr<worklets::WorkletRuntime> uiRuntime;
51
+ std::weak_ptr<worklets::WorkletRuntime> audioRuntime;
52
+ };
@@ -0,0 +1,9 @@
1
+ #include <audioapi/core/utils/worklets/WorkletsRunner.h>
2
+
3
+ namespace audioapi {
4
+
5
+ WorkletsRunner::WorkletsRunner(
6
+ std::weak_ptr<worklets::WorkletRuntime> weakUiRuntime) noexcept
7
+ : weakUiRuntime_(std::move(weakUiRuntime)) {}
8
+
9
+ }; // namespace audioapi
@@ -0,0 +1,73 @@
1
+ #pragma once
2
+
3
+ #include <jsi/jsi.h>
4
+ #include <audioapi/core/utils/worklets/SafeIncludes.h>
5
+
6
+ #include <functional>
7
+ #include <atomic>
8
+ #include <memory>
9
+ #include <utility>
10
+ #include <optional>
11
+
12
+ namespace audioapi {
13
+ using namespace facebook;
14
+
15
+ /*
16
+ * # How to extract worklet from JavaScript argument
17
+ *
18
+ * To extract a shareable worklet from a JavaScript argument, use the following code:
19
+ *
20
+ * ```cpp
21
+ * auto worklet = worklets::extractSerializableWorkletFromArg(runtime, args[0]);
22
+ * ```
23
+ *
24
+ * This will return a shared pointer to the extracted worklet, or throw an error if the argument is invalid.
25
+ */
26
+
27
+ class WorkletsRunner {
28
+ public:
29
+ explicit WorkletsRunner(std::weak_ptr<worklets::WorkletRuntime> weakUiRuntime) noexcept;
30
+
31
+ /// @brief Execute a job on the UI runtime safely.
32
+ /// @param job
33
+ /// @return nullopt if the runtime is not available or the result of the job execution
34
+ /// @note Execution is synchronous
35
+ std::optional<jsi::Value> executeOnRuntimeGuardedSync(const std::function<jsi::Value(jsi::Runtime&)>&& job) const noexcept(noexcept(job)) {
36
+ auto strongRuntime = weakUiRuntime_.lock();
37
+ if (strongRuntime == nullptr) {
38
+ return std::nullopt;
39
+ }
40
+ #if RN_AUDIO_API_ENABLE_WORKLETS
41
+ return strongRuntime->executeSync(std::move(job));
42
+ #else
43
+ return std::nullopt;
44
+ #endif
45
+ }
46
+
47
+ /// @brief Execute a worklet with the given arguments.
48
+ /// @tparam ...Args
49
+ /// @param shareableWorklet
50
+ /// @param ...args
51
+ /// @note Execution is synchronous, this method can be used in `executeOnRuntimeGuardedSync` and `...Async` methods arguments
52
+ /// @return nullopt if the runtime is not available or the result of the worklet execution
53
+ template<typename... Args>
54
+ std::optional<jsi::Value> executeWorklet(const std::shared_ptr<worklets::SerializableWorklet>& shareableWorklet, Args&&... args) {
55
+ auto strongRuntime = weakUiRuntime_.lock();
56
+ if (strongRuntime == nullptr) {
57
+ return std::nullopt;
58
+ }
59
+
60
+ #if RN_AUDIO_API_ENABLE_WORKLETS
61
+
62
+ return strongRuntime->runGuarded(shareableWorklet, std::forward<Args>(args)...);
63
+
64
+ #else
65
+ return std::nullopt;
66
+ #endif
67
+ }
68
+
69
+ private:
70
+ std::weak_ptr<worklets::WorkletRuntime> weakUiRuntime_;
71
+ };
72
+
73
+ } // namespace audioapi
@@ -1,4 +1,4 @@
1
- #include <audioapi/core/Constants.h>
1
+ #include <audioapi/core/utils/Constants.h>
2
2
  #include <audioapi/dsp/Windows.h>
3
3
 
4
4
  namespace audioapi::dsp {
@@ -1,4 +1,4 @@
1
- #include <audioapi/HostObjects/AudioBufferHostObject.h>
1
+ #include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
2
2
  #include <audioapi/events/AudioEventHandlerRegistry.h>
3
3
 
4
4
  namespace audioapi {
@@ -53,8 +53,9 @@ class AudioEventHandlerRegistry : public IAudioEventHandlerRegistry {
53
53
  "volumeChange",
54
54
  };
55
55
 
56
- static constexpr std::array<std::string_view, 5> AUDIO_API_EVENT_NAMES = {
56
+ static constexpr std::array<std::string_view, 6> AUDIO_API_EVENT_NAMES = {
57
57
  "ended",
58
+ "loopEnded",
58
59
  "audioReady",
59
60
  "positionChanged",
60
61
  "audioError",
@@ -9,7 +9,20 @@ using namespace facebook;
9
9
  class AudioArrayBuffer : public jsi::MutableBuffer {
10
10
  public:
11
11
  AudioArrayBuffer(uint8_t *data, size_t size): data_(data), size_(size) {}
12
- ~AudioArrayBuffer() override = default;
12
+ ~AudioArrayBuffer() override {
13
+ if (data_ == nullptr) {
14
+ return;
15
+ }
16
+ delete[] data_;
17
+ }
18
+ AudioArrayBuffer(AudioArrayBuffer &&other) noexcept
19
+ : data_(other.data_), size_(other.size_) {
20
+ other.data_ = nullptr;
21
+ }
22
+
23
+ AudioArrayBuffer(const AudioArrayBuffer &) = delete;
24
+ AudioArrayBuffer &operator=(const AudioArrayBuffer &) = delete;
25
+ AudioArrayBuffer &operator=(AudioArrayBuffer &&other) = delete;
13
26
 
14
27
  [[nodiscard]] size_t size() const override;
15
28
  uint8_t *data() override;
@@ -10,13 +10,8 @@
10
10
  #include <utility>
11
11
  #include <vector>
12
12
 
13
- #define JSI_HOST_FUNCTION(NAME) \
14
- jsi::Value NAME( \
15
- jsi::Runtime &runtime, \
16
- const jsi::Value &thisValue, \
17
- const jsi::Value *args, \
18
- size_t count)
19
-
13
+ #define JSI_HOST_FUNCTION_DECL(name) jsi::Value name(jsi::Runtime &runtime, const jsi::Value &thisValue, const jsi::Value *args, size_t count)
14
+ #define JSI_HOST_FUNCTION_IMPL(CLASS, name) jsi::Value CLASS::name(jsi::Runtime &runtime, const jsi::Value &thisValue, const jsi::Value *args, size_t count)
20
15
  #define JSI_EXPORT_FUNCTION(CLASS, FUNCTION) \
21
16
  std::make_pair( \
22
17
  std::string(#FUNCTION), \
@@ -24,17 +19,16 @@
24
19
  jsi::Runtime &, const jsi::Value &, const jsi::Value *, size_t)>( \
25
20
  &CLASS::FUNCTION))
26
21
 
27
- #define JSI_PROPERTY_GETTER(name) jsi::Value name(jsi::Runtime &runtime)
28
-
22
+ #define JSI_PROPERTY_GETTER_DECL(name) jsi::Value name(jsi::Runtime &runtime)
23
+ #define JSI_PROPERTY_GETTER_IMPL(CLASS, name) jsi::Value CLASS::name(jsi::Runtime &runtime)
29
24
  #define JSI_EXPORT_PROPERTY_GETTER(CLASS, FUNCTION) \
30
25
  std::make_pair( \
31
26
  std::string(#FUNCTION), \
32
27
  static_cast<jsi::Value (JsiHostObject::*)(jsi::Runtime &)>( \
33
28
  &CLASS::FUNCTION))
34
29
 
35
- #define JSI_PROPERTY_SETTER(name) \
36
- void name(jsi::Runtime &runtime, const jsi::Value &value)
37
-
30
+ #define JSI_PROPERTY_SETTER_DECL(name) void name(jsi::Runtime &runtime, const jsi::Value &value)
31
+ #define JSI_PROPERTY_SETTER_IMPL(CLASS, name) void CLASS::name(jsi::Runtime &runtime, const jsi::Value &value)
38
32
  #define JSI_EXPORT_PROPERTY_SETTER(CLASS, FUNCTION) \
39
33
  std::make_pair( \
40
34
  std::string(#FUNCTION), \
@@ -61,4 +61,53 @@ jsi::Value PromiseVendor::createPromise(
61
61
  return promiseCtor.callAsConstructor(runtime, runPromise);
62
62
  }
63
63
 
64
+ jsi::Value PromiseVendor::createAsyncPromise(
65
+ std::function<std::variant<jsi::Value, std::string>(jsi::Runtime &)>
66
+ &&function) {
67
+ auto &runtime = *runtime_;
68
+ auto callInvoker = callInvoker_;
69
+ auto threadPool = threadPool_;
70
+ auto promiseCtor = runtime.global().getPropertyAsFunction(runtime, "Promise");
71
+ auto promiseLambda = [threadPool = std::move(threadPool),
72
+ callInvoker = std::move(callInvoker),
73
+ function = std::move(function)](
74
+ jsi::Runtime &runtime,
75
+ const jsi::Value &thisValue,
76
+ const jsi::Value *arguments,
77
+ size_t count) -> jsi::Value {
78
+ auto resolveLocal = arguments[0].asObject(runtime).asFunction(runtime);
79
+ auto resolve = std::make_shared<jsi::Function>(std::move(resolveLocal));
80
+ auto rejectLocal = arguments[1].asObject(runtime).asFunction(runtime);
81
+ auto reject = std::make_shared<jsi::Function>(std::move(rejectLocal));
82
+
83
+ threadPool->schedule([callInvoker = std::move(callInvoker),
84
+ function = std::move(function),
85
+ resolve = std::move(resolve),
86
+ reject = std::move(reject),
87
+ &runtime]() {
88
+ auto result = function(runtime);
89
+ if (std::holds_alternative<jsi::Value>(result)) {
90
+ auto valueShared = std::make_shared<jsi::Value>(
91
+ std::move(std::get<jsi::Value>(result)));
92
+ callInvoker->invokeAsync([resolve, &runtime, valueShared]() -> void {
93
+ resolve->call(runtime, *valueShared);
94
+ });
95
+ } else {
96
+ auto errorMessage = std::get<std::string>(result);
97
+ callInvoker->invokeAsync([reject, &runtime, errorMessage]() -> void {
98
+ auto error = jsi::JSError(runtime, errorMessage);
99
+ reject->call(runtime, error.value());
100
+ });
101
+ }
102
+ });
103
+ return jsi::Value::undefined();
104
+ };
105
+ auto promiseFunction = jsi::Function::createFromHostFunction(
106
+ runtime,
107
+ jsi::PropNameID::forUtf8(runtime, "asyncPromise"),
108
+ 2,
109
+ std::move(promiseLambda));
110
+ return promiseCtor.callAsConstructor(runtime, std::move(promiseFunction));
111
+ }
112
+
64
113
  } // namespace audioapi