react-native-audio-api 0.8.3 → 0.9.0-nightly-7ecb495-20251008

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 (323) 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 +154 -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 +133 -0
  59. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.h +28 -0
  60. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +58 -0
  61. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.h +26 -0
  62. package/common/cpp/audioapi/core/AudioContext.cpp +3 -4
  63. package/common/cpp/audioapi/core/AudioContext.h +2 -1
  64. package/common/cpp/audioapi/core/AudioNode.cpp +3 -3
  65. package/common/cpp/audioapi/core/AudioNode.h +2 -2
  66. package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
  67. package/common/cpp/audioapi/core/AudioParam.h +1 -1
  68. package/common/cpp/audioapi/core/BaseAudioContext.cpp +47 -38
  69. package/common/cpp/audioapi/core/BaseAudioContext.h +17 -16
  70. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +4 -5
  71. package/common/cpp/audioapi/core/OfflineAudioContext.h +2 -1
  72. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +3 -1
  73. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +1 -1
  74. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +1 -1
  75. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +3 -1
  76. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +1 -1
  77. package/common/cpp/audioapi/core/effects/GainNode.cpp +3 -1
  78. package/common/cpp/audioapi/core/effects/GainNode.h +1 -1
  79. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +1 -1
  80. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +18 -13
  81. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +1 -1
  82. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +89 -0
  83. package/common/cpp/audioapi/core/effects/WorkletNode.h +65 -0
  84. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +91 -0
  85. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +52 -0
  86. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +1 -1
  87. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +2 -2
  88. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +47 -10
  89. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +18 -3
  90. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +98 -14
  91. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +9 -3
  92. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +37 -44
  93. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +7 -9
  94. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +1 -6
  95. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +1 -1
  96. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +53 -0
  97. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +26 -0
  98. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +7 -2
  99. package/common/cpp/audioapi/core/sources/OscillatorNode.h +1 -1
  100. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +3 -1
  101. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +1 -1
  102. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +9 -1
  103. package/common/cpp/audioapi/core/sources/StreamerNode.h +1 -9
  104. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +84 -0
  105. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +47 -0
  106. package/common/cpp/audioapi/core/types/AudioFormat.h +16 -0
  107. package/common/cpp/audioapi/core/utils/AudioDecoder.h +36 -91
  108. package/common/cpp/audioapi/core/{AudioParamEventQueue.cpp → utils/AudioParamEventQueue.cpp} +13 -7
  109. package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +75 -0
  110. package/common/cpp/audioapi/core/utils/AudioStretcher.h +30 -0
  111. package/common/cpp/audioapi/core/{Constants.h → utils/Constants.h} +9 -0
  112. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +52 -0
  113. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +9 -0
  114. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +73 -0
  115. package/common/cpp/audioapi/dsp/Windows.cpp +1 -1
  116. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +1 -1
  117. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +2 -1
  118. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +14 -1
  119. package/common/cpp/audioapi/jsi/JsiHostObject.h +6 -12
  120. package/common/cpp/audioapi/jsi/JsiPromise.cpp +49 -0
  121. package/common/cpp/audioapi/jsi/JsiPromise.h +29 -1
  122. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +241 -282
  123. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h +57 -19
  124. package/common/cpp/audioapi/utils/AudioBus.cpp +1 -1
  125. package/common/cpp/audioapi/utils/ThreadPool.hpp +104 -0
  126. package/common/cpp/test/AudioParamTest.cpp +204 -0
  127. package/common/cpp/test/CMakeLists.txt +13 -4
  128. package/common/cpp/test/GainTest.cpp +11 -10
  129. package/common/cpp/test/OscillatorTest.cpp +2 -1
  130. package/common/cpp/test/StereoPannerTest.cpp +129 -0
  131. package/ios/audioapi/ios/AudioAPIModule.mm +32 -5
  132. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +1 -1
  133. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
  134. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +160 -0
  135. package/lib/commonjs/api.js +57 -3
  136. package/lib/commonjs/api.js.map +1 -1
  137. package/lib/commonjs/api.web.js +8 -0
  138. package/lib/commonjs/api.web.js.map +1 -1
  139. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +7 -7
  140. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  141. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +1 -6
  142. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  143. package/lib/commonjs/core/AudioBufferSourceNode.js +15 -0
  144. package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -1
  145. package/lib/commonjs/core/AudioContext.js +10 -1
  146. package/lib/commonjs/core/AudioContext.js.map +1 -1
  147. package/lib/commonjs/core/AudioDecoder.js +48 -0
  148. package/lib/commonjs/core/AudioDecoder.js.map +1 -0
  149. package/lib/commonjs/core/AudioScheduledSourceNode.js +4 -4
  150. package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
  151. package/lib/commonjs/core/AudioStretcher.js +31 -0
  152. package/lib/commonjs/core/AudioStretcher.js.map +1 -0
  153. package/lib/commonjs/core/BaseAudioContext.js +76 -28
  154. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  155. package/lib/commonjs/core/ConstantSourceNode.js +17 -0
  156. package/lib/commonjs/core/ConstantSourceNode.js.map +1 -0
  157. package/lib/commonjs/core/OfflineAudioContext.js +11 -2
  158. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  159. package/lib/commonjs/core/OscillatorNode.js +6 -0
  160. package/lib/commonjs/core/OscillatorNode.js.map +1 -1
  161. package/lib/commonjs/core/WorkletNode.js +11 -0
  162. package/lib/commonjs/core/WorkletNode.js.map +1 -0
  163. package/lib/commonjs/core/WorkletProcessingNode.js +11 -0
  164. package/lib/commonjs/core/WorkletProcessingNode.js.map +1 -0
  165. package/lib/commonjs/core/WorkletSourceNode.js +11 -0
  166. package/lib/commonjs/core/WorkletSourceNode.js.map +1 -0
  167. package/lib/commonjs/hooks/{useSytemVolume.js → useSystemVolume.js} +1 -1
  168. package/lib/commonjs/hooks/useSystemVolume.js.map +1 -0
  169. package/lib/commonjs/utils/index.js +9 -0
  170. package/lib/commonjs/utils/index.js.map +1 -1
  171. package/lib/commonjs/web-core/AudioContext.js +4 -0
  172. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  173. package/lib/commonjs/web-core/AudioScheduledSourceNode.js +1 -1
  174. package/lib/commonjs/web-core/AudioScheduledSourceNode.js.map +1 -1
  175. package/lib/commonjs/web-core/ConstantSourceNode.js +17 -0
  176. package/lib/commonjs/web-core/ConstantSourceNode.js.map +1 -0
  177. package/lib/commonjs/web-core/OfflineAudioContext.js +4 -0
  178. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  179. package/lib/module/api.js +9 -3
  180. package/lib/module/api.js.map +1 -1
  181. package/lib/module/api.web.js +1 -0
  182. package/lib/module/api.web.js.map +1 -1
  183. package/lib/module/core/AudioBufferBaseSourceNode.js +7 -7
  184. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  185. package/lib/module/core/AudioBufferQueueSourceNode.js +1 -6
  186. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  187. package/lib/module/core/AudioBufferSourceNode.js +15 -0
  188. package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
  189. package/lib/module/core/AudioContext.js +10 -1
  190. package/lib/module/core/AudioContext.js.map +1 -1
  191. package/lib/module/core/AudioDecoder.js +42 -0
  192. package/lib/module/core/AudioDecoder.js.map +1 -0
  193. package/lib/module/core/AudioScheduledSourceNode.js +4 -4
  194. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
  195. package/lib/module/core/AudioStretcher.js +26 -0
  196. package/lib/module/core/AudioStretcher.js.map +1 -0
  197. package/lib/module/core/BaseAudioContext.js +76 -28
  198. package/lib/module/core/BaseAudioContext.js.map +1 -1
  199. package/lib/module/core/ConstantSourceNode.js +11 -0
  200. package/lib/module/core/ConstantSourceNode.js.map +1 -0
  201. package/lib/module/core/OfflineAudioContext.js +11 -2
  202. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  203. package/lib/module/core/OscillatorNode.js +6 -0
  204. package/lib/module/core/OscillatorNode.js.map +1 -1
  205. package/lib/module/core/WorkletNode.js +5 -0
  206. package/lib/module/core/WorkletNode.js.map +1 -0
  207. package/lib/module/core/WorkletProcessingNode.js +5 -0
  208. package/lib/module/core/WorkletProcessingNode.js.map +1 -0
  209. package/lib/module/core/WorkletSourceNode.js +5 -0
  210. package/lib/module/core/WorkletSourceNode.js.map +1 -0
  211. package/lib/module/hooks/{useSytemVolume.js → useSystemVolume.js} +1 -1
  212. package/lib/module/hooks/useSystemVolume.js.map +1 -0
  213. package/lib/module/utils/index.js +8 -0
  214. package/lib/module/utils/index.js.map +1 -1
  215. package/lib/module/web-core/AudioContext.js +4 -0
  216. package/lib/module/web-core/AudioContext.js.map +1 -1
  217. package/lib/module/web-core/AudioScheduledSourceNode.js +1 -1
  218. package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
  219. package/lib/module/web-core/ConstantSourceNode.js +11 -0
  220. package/lib/module/web-core/ConstantSourceNode.js.map +1 -0
  221. package/lib/module/web-core/OfflineAudioContext.js +4 -0
  222. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  223. package/lib/typescript/api.d.ts +13 -5
  224. package/lib/typescript/api.d.ts.map +1 -1
  225. package/lib/typescript/api.web.d.ts +1 -0
  226. package/lib/typescript/api.web.d.ts.map +1 -1
  227. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +2 -2
  228. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  229. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  230. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  231. package/lib/typescript/core/AudioBufferSourceNode.d.ts +4 -0
  232. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
  233. package/lib/typescript/core/AudioContext.d.ts +1 -0
  234. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  235. package/lib/typescript/core/AudioDecoder.d.ts +4 -0
  236. package/lib/typescript/core/AudioDecoder.d.ts.map +1 -0
  237. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +1 -1
  238. package/lib/typescript/core/AudioStretcher.d.ts +3 -0
  239. package/lib/typescript/core/AudioStretcher.d.ts.map +1 -0
  240. package/lib/typescript/core/BaseAudioContext.d.ts +21 -16
  241. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  242. package/lib/typescript/core/ConstantSourceNode.d.ts +9 -0
  243. package/lib/typescript/core/ConstantSourceNode.d.ts.map +1 -0
  244. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -0
  245. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  246. package/lib/typescript/core/OscillatorNode.d.ts +3 -0
  247. package/lib/typescript/core/OscillatorNode.d.ts.map +1 -1
  248. package/lib/typescript/core/WorkletNode.d.ts +4 -0
  249. package/lib/typescript/core/WorkletNode.d.ts.map +1 -0
  250. package/lib/typescript/core/WorkletProcessingNode.d.ts +4 -0
  251. package/lib/typescript/core/WorkletProcessingNode.d.ts.map +1 -0
  252. package/lib/typescript/core/WorkletSourceNode.d.ts +4 -0
  253. package/lib/typescript/core/WorkletSourceNode.d.ts.map +1 -0
  254. package/lib/typescript/events/types.d.ts +2 -0
  255. package/lib/typescript/events/types.d.ts.map +1 -1
  256. package/lib/typescript/hooks/{useSytemVolume.d.ts → useSystemVolume.d.ts} +1 -1
  257. package/lib/typescript/hooks/useSystemVolume.d.ts.map +1 -0
  258. package/lib/typescript/interfaces.d.ts +31 -6
  259. package/lib/typescript/interfaces.d.ts.map +1 -1
  260. package/lib/typescript/types.d.ts +2 -1
  261. package/lib/typescript/types.d.ts.map +1 -1
  262. package/lib/typescript/utils/index.d.ts +8 -0
  263. package/lib/typescript/utils/index.d.ts.map +1 -1
  264. package/lib/typescript/web-core/AudioBufferSourceNode.d.ts +1 -1
  265. package/lib/typescript/web-core/AudioContext.d.ts +4 -2
  266. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  267. package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +1 -1
  268. package/lib/typescript/web-core/BaseAudioContext.d.ts +2 -0
  269. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  270. package/lib/typescript/web-core/ConstantSourceNode.d.ts +8 -0
  271. package/lib/typescript/web-core/ConstantSourceNode.d.ts.map +1 -0
  272. package/lib/typescript/web-core/OfflineAudioContext.d.ts +4 -2
  273. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  274. package/package.json +3 -2
  275. package/src/api.ts +22 -3
  276. package/src/api.web.ts +1 -0
  277. package/src/core/AudioBufferBaseSourceNode.ts +9 -9
  278. package/src/core/AudioBufferQueueSourceNode.ts +1 -9
  279. package/src/core/AudioBufferSourceNode.ts +28 -0
  280. package/src/core/AudioContext.ts +12 -1
  281. package/src/core/AudioDecoder.ts +78 -0
  282. package/src/core/AudioScheduledSourceNode.ts +5 -5
  283. package/src/core/AudioStretcher.ts +43 -0
  284. package/src/core/BaseAudioContext.ts +174 -41
  285. package/src/core/ConstantSourceNode.ts +13 -0
  286. package/src/core/OfflineAudioContext.ts +18 -2
  287. package/src/core/OscillatorNode.ts +11 -0
  288. package/src/core/WorkletNode.ts +3 -0
  289. package/src/core/WorkletProcessingNode.ts +3 -0
  290. package/src/core/WorkletSourceNode.ts +3 -0
  291. package/src/events/types.ts +2 -0
  292. package/src/interfaces.ts +85 -11
  293. package/src/types.ts +3 -1
  294. package/src/utils/index.ts +21 -0
  295. package/src/web-core/AudioBufferSourceNode.tsx +1 -1
  296. package/src/web-core/AudioContext.tsx +7 -2
  297. package/src/web-core/AudioScheduledSourceNode.tsx +1 -1
  298. package/src/web-core/BaseAudioContext.tsx +2 -0
  299. package/src/web-core/ConstantSourceNode.tsx +12 -0
  300. package/src/web-core/OfflineAudioContext.tsx +7 -2
  301. package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +0 -149
  302. package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +0 -76
  303. package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +0 -120
  304. package/common/cpp/audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h +0 -67
  305. package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +0 -142
  306. package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +0 -86
  307. package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +0 -56
  308. package/common/cpp/audioapi/HostObjects/BiquadFilterNodeHostObject.h +0 -89
  309. package/common/cpp/audioapi/HostObjects/GainNodeHostObject.h +0 -27
  310. package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +0 -65
  311. package/common/cpp/audioapi/HostObjects/StereoPannerNodeHostObject.h +0 -29
  312. package/common/cpp/audioapi/HostObjects/StreamerNodeHostObject.h +0 -30
  313. package/common/cpp/audioapi/events/AudioEventHandlerRegistryHostObject.h +0 -48
  314. package/ios/audioapi/ios/core/AudioDecoder.mm +0 -156
  315. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.h +0 -7
  316. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.mm +0 -12
  317. package/lib/commonjs/hooks/useSytemVolume.js.map +0 -1
  318. package/lib/module/hooks/useSytemVolume.js.map +0 -1
  319. package/lib/typescript/hooks/useSytemVolume.d.ts.map +0 -1
  320. /package/common/cpp/audioapi/HostObjects/{AudioDestinationNodeHostObject.h → destinations/AudioDestinationNodeHostObject.h} +0 -0
  321. /package/common/cpp/audioapi/HostObjects/{PeriodicWaveHostObject.h → effects/PeriodicWaveHostObject.h} +0 -0
  322. /package/common/cpp/audioapi/core/{AudioParamEventQueue.h → utils/AudioParamEventQueue.h} +0 -0
  323. /package/src/hooks/{useSytemVolume.ts → useSystemVolume.ts} +0 -0
package/README.md CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  [![NPM latest](https://img.shields.io/npm/v/react-native-audio-api/latest)](https://www.npmjs.com/package/react-native-audio-api)
6
6
  [![NPM nightly](https://img.shields.io/npm/v/react-native-audio-api/audio-api-nightly)](https://www.npmjs.com/package/react-native-audio-api?activeTab=versions)
7
+ <br />
7
8
  [![github ci](https://github.com/software-mansion/react-native-audio-api/actions/workflows/ci.yml/badge.svg)](https://github.com/software-mansion/react-native-audio-api/actions/workflows/ci.yml)
8
- [![NPM Audio Api publish nightly](https://github.com/software-mansion/react-native-audio-api/actions/workflows/npm-publish-nightly.yml/badge.svg)](https://github.com/software-mansion/react-native-audio-api/actions/workflows/npm-publish-nightly.yml)
9
9
  [![Audio Api tests](https://github.com/software-mansion/react-native-audio-api/actions/workflows/tests.yml/badge.svg)](https://github.com/software-mansion/react-native-audio-api/actions/workflows/tests.yml)
10
10
 
11
11
  `react-native-audio-api` provides system for controlling audio in React Native environment compatible with Web Audio API specification,
@@ -17,55 +17,56 @@ check out the [Getting Started](https://docs.swmansion.com/react-native-audio-ap
17
17
 
18
18
  ## Roadmap
19
19
 
20
- - <sub>[![Released in 0.1.0](https://img.shields.io/badge/Released_in-0.1.0-green)](https://github.com/software-mansion/react-native-audio-api/releases/tag/0.1.0)</sub> <br />
21
- **Sound synthesis and system audio** 🐣 <br />
22
- Access to devices audio engines and threads, basic nodes for sound synthesis, simple effects and audio graph implementation
23
- <br />
20
+ ### Planned
24
21
 
25
- - <sub>[![Released in 0.2.0](https://img.shields.io/badge/Released_in-0.2.0-green)](https://github.com/software-mansion/react-native-audio-api/releases/tag/0.2.0)</sub> <br />
26
- **Graph Processing** 🛎️ <br />
27
- Support for multi-channel audio processing, audio-graph route optimizations, improved react-native layer for managing audio nodes
28
- <br />
22
+ ### <img src="https://img.shields.io/badge/Coming_in-0.9.0-orange" />
29
23
 
30
- - <sub>[![Released in 0.3.2](https://img.shields.io/badge/Released_in-0.3.2-green)](https://github.com/software-mansion/react-native-audio-api/releases/tag/0.3.2)</sub> <br />
31
- **Audio Files** 🎸 <br />
32
- Support for local and remote audio file resources: MP3, WAV, FLAC.
33
- <br />
24
+ - **JS Audio Worklets V1 🐎**<br />
25
+ Receive events and data callbacks from audio thread to synchronize with UI on UI thread.
34
26
 
35
- - <sub>[![Released in 0.4.0](https://img.shields.io/badge/Released_in-0.4.0-green)](https://github.com/software-mansion/react-native-audio-api/releases/tag/0.4.0)</sub> <br />
36
- **Analyser Node** 🌊 <br />
37
- Ability to draw, animate or simply debug audio data in time or frequency domain.
38
- <br />
27
+ ### <img src="https://img.shields.io/badge/Coming_in-x.x.x-orange" />
39
28
 
40
- - <sub>[![Released in 0.5.0](https://img.shields.io/badge/Released_in-0.5.0-green)](https://github.com/software-mansion/react-native-audio-api/releases/tag/0.5.0)</sub> <br />
41
- **Pitch correction, extending the web** 💥 <br />
42
- Ability to modify playback speed without affecting pitch of the sound
43
- <br />
29
+ - **Convolver Node 🐐**<br />
30
+ Realistic reverb and spatial effects in the browser by applying impulse responses. It makes audio sound like it’s being played in real spaces, from small rooms to cathedrals, or through hardware like amps and speakers
44
31
 
45
- - <sub>[![Released in 0.6.0](https://img.shields.io/badge/Released_in-0.6.0-green)](https://github.com/software-mansion/react-native-audio-api/releases/tag/0.6.0)</sub> <br />
46
- **System configuration** 🛠️ <br />
47
- Full control of system audio settings, remote controls, lock screen integration and most importantly configurable background modes
32
+ - **Decoding and utility modules 🔧**<br />
33
+ Decode and modify audio data without the need to create AudioContext first through a set of utility classes
48
34
 
49
- **Connect audio param** 🤞 <br />
50
- Ability to connect Audio nodes to audio params, which will allow for powerful and efficient modulation of audio parameters, creating effects like tremolo, vibrato or complex envelope followers. <br />
35
+ - **DynamicCompressorNode 〽️**<br />
36
+ Reduce the volume of loud sounds and boost quieter nodes to balance the audio signal, avoid clipping or distorted sounds
51
37
 
52
- - <sub>[![Released in 0.7.0](https://img.shields.io/badge/Released_in-0.7.0-green)](https://github.com/software-mansion/react-native-audio-api/releases/tag/0.7.0)</sub> <br />
53
- **Microphone support** 🎙️ <br />
54
- Grab audio data from device microphone or connected device, connect it to the audio graph or stream through the internet <br />
38
+ - **Audio tag 🏷️**<br />
39
+ Simple ability to play and buffer audio, with all of the most commonly used functions, same as on the web, without the need to create and manipulate an audio graph.
55
40
 
56
- **Custom Audio Processor** ⚙️ <br />
57
- Write your own processing AudioNode <br />
41
+ - **MIDI support 🎸**<br />
42
+ Complementary lib for react-native-audio-api, that will allow to communicate with MIDI devices or read/write MIDI files.
58
43
 
59
- - <sub>[![Released in 0.8.0](https://img.shields.io/badge/Released_in-0.8.0-green)](https://github.com/software-mansion/react-native-audio-api/releases/tag/0.8.0)</sub> <br />
60
- **Decoding support for m4a/mp4/aac/ogg/opus** 📁 <br />
61
- Ability to decode m4a/mp4/aac/ogg/opus audio files, allowing for playback of these formats in the audio graph. <br />
44
+ - **Spatial Audio 🛢️**<br />
45
+ manipulate audio in 3D space
62
46
 
63
- **HLS streaming support** 🌊 <br />
64
- Ability to stream audio from HLS sources, allowing for playback of live audio streams or pre-recorded audio files. <br />
47
+ - **Noise Cancellation 🦇**<br />
48
+ System-based active noise and echo cancellation support
65
49
 
66
- - **JS Audio Worklets** 🐎 <br />
67
- Ability to run JS functions connected to the audio graph running on audio thread allowing for full customization of what happens to the audio signal.
68
- <br />
50
+ - **JS Audio Worklets V2 🐎**<br />
51
+ Customize the process pipeline with JS functions running on audio thread.
52
+
53
+ ### <a href="https://github.com/software-mansion/react-native-audio-api/releases/tag/0.8.0"><img src="https://img.shields.io/badge/Released_in-0.8.0-green" /></a>
54
+
55
+ - **Decoding support for m4a/mp4/aac/ogg/opus 📁** <br />
56
+ Decode m4a/mp4/aac/ogg/opus audio files, allowing for playback of these formats in the audio graph.
57
+
58
+ - **HLS streaming support** 🌊 <br />
59
+ Stream audio from HLS sources, allowing for playback of live audio streams or pre-recorded audio files.
60
+
61
+ ### <a href="https://github.com/software-mansion/react-native-audio-api/releases/tag/0.7.0"><img src="https://img.shields.io/badge/Released_in-0.7.0-green" /></a>
62
+
63
+ - **Microphone support 🎙️** <br />
64
+ Grab audio data from device microphone or connected device, connect it to the audio graph or stream through the internet.
65
+
66
+ - **Custom Audio Processor ⚙️** <br />
67
+ Write your own processing AudioNode.
68
+
69
+ See more in [Changelog](./ghdocs/changelog.md)
69
70
 
70
71
  ## Web Audio API Specification Coverage
71
72
 
@@ -4,7 +4,7 @@ package_json = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
4
 
5
5
  $new_arch_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
6
6
 
7
- folly_flags = "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32"
7
+ folly_flags = "-DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32"
8
8
  fabric_flags = $new_arch_enabled ? '-DRCT_NEW_ARCH_ENABLED' : ''
9
9
  version_flag = "-DAUDIOAPI_VERSION=#{package_json['version']}"
10
10
 
@@ -20,12 +20,12 @@ Pod::Spec.new do |s|
20
20
  s.source = { :git => "https://github.com/software-mansion/react-native-audio-api.git", :tag => "#{s.version}" }
21
21
 
22
22
  s.subspec "audioapi" do |ss|
23
- ss.source_files = "common/cpp/audioapi/**/*.{cpp,c,h}"
23
+ ss.source_files = "common/cpp/audioapi/**/*.{cpp,c,h,hpp}"
24
24
  ss.header_dir = "audioapi"
25
25
  ss.header_mappings_dir = "common/cpp/audioapi"
26
26
 
27
27
  ss.subspec "ios" do |sss|
28
- sss.source_files = "ios/audioapi/**/*.{mm,h,m}"
28
+ sss.source_files = "ios/audioapi/**/*.{mm,h,m,hpp}"
29
29
  sss.header_dir = "audioapi"
30
30
  sss.header_mappings_dir = "ios/audioapi"
31
31
  end
@@ -42,16 +42,18 @@ Pod::Spec.new do |s|
42
42
  # Assumes Pods dir is nested under ios project dir
43
43
  ios_dir = File.join(Pod::Config.instance.project_pods_root, '..')
44
44
  rn_audio_dir_relative = Pathname.new(__dir__).relative_path_from(ios_dir).to_s
45
- external_dir = "common/cpp/audioapi/external"
46
- lib_dir = "$(PROJECT_DIR)/#{rn_audio_dir_relative}/#{external_dir}/$(PLATFORM_NAME)"
47
-
45
+
46
+ external_dir_relative = "common/cpp/audioapi/external"
47
+ lib_dir = "$(PROJECT_DIR)/#{rn_audio_dir_relative}/#{external_dir_relative}/$(PLATFORM_NAME)"
48
+
49
+ external_dir = File.join(__dir__, "common/cpp/audioapi/external")
50
+
48
51
  s.ios.vendored_frameworks = [
49
52
  'common/cpp/audioapi/external/libavcodec.xcframework',
50
53
  'common/cpp/audioapi/external/libavformat.xcframework',
51
54
  'common/cpp/audioapi/external/libavutil.xcframework',
52
55
  'common/cpp/audioapi/external/libswresample.xcframework'
53
56
  ]
54
-
55
57
  s.pod_target_xcconfig = {
56
58
  "USE_HEADERMAP" => "YES",
57
59
  "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
@@ -59,12 +61,15 @@ s.pod_target_xcconfig = {
59
61
  "HEADER_SEARCH_PATHS" => %W[
60
62
  $(PODS_TARGET_SRCROOT)/common/cpp
61
63
  $(PODS_TARGET_SRCROOT)/ios
62
- $(PODS_TARGET_SRCROOT)/#{external_dir}/include
63
- $(PODS_TARGET_SRCROOT)/#{external_dir}/include/opus
64
- $(PODS_TARGET_SRCROOT)/#{external_dir}/include/vorbis
65
- $(PODS_TARGET_SRCROOT)/common/cpp/audioapi/external/ffmpeg_include
64
+ $(PODS_ROOT)/Headers/Public/RNWorklets
65
+ $(PODS_ROOT)/Headers/Private/React-Core
66
+ $(PODS_TARGET_SRCROOT)/#{external_dir_relative}/include
67
+ $(PODS_TARGET_SRCROOT)/#{external_dir_relative}/include/opus
68
+ $(PODS_TARGET_SRCROOT)/#{external_dir_relative}/include/vorbis
69
+ $(PODS_TARGET_SRCROOT)/#{external_dir_relative}/ffmpeg_include
66
70
  ].join(" "),
67
- 'OTHER_CFLAGS' => "$(inherited) #{folly_flags} #{fabric_flags} #{version_flag}"
71
+ 'OTHER_CFLAGS' => "$(inherited) #{folly_flags} #{fabric_flags} #{version_flag}",
72
+ 'OTHER_CPLUSPLUSFLAGS' => "$(inherited) #{folly_flags} #{fabric_flags} #{version_flag}"
68
73
  }
69
74
 
70
75
  s.user_target_xcconfig = {
@@ -65,6 +65,15 @@ def resolveReactNativeDirectory() {
65
65
  )
66
66
  }
67
67
 
68
+ def resolveReactNativeWorkletsDirectory() {
69
+ def rnWorklets = rootProject.subprojects.find { it.name == 'react-native-worklets' }
70
+ if (rnWorklets != null) {
71
+ return rnWorklets.projectDir
72
+ }
73
+
74
+ return null;
75
+ }
76
+
68
77
  def toPlatformFileString(String path) {
69
78
  if (Os.isFamily(Os.FAMILY_WINDOWS)) {
70
79
  path = path.replace(File.separatorChar, '/' as char)
@@ -82,6 +91,8 @@ static def supportsNamespace() {
82
91
  }
83
92
 
84
93
  def reactNativeRootDir = resolveReactNativeDirectory()
94
+ def reactNativeWorkletsRootDir = resolveReactNativeWorkletsDirectory()
95
+ def isWorkletsAvailable = reactNativeWorkletsRootDir != null
85
96
 
86
97
  def reactProperties = new Properties()
87
98
  file("$reactNativeRootDir/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) }
@@ -112,17 +123,30 @@ android {
112
123
  defaultConfig {
113
124
  minSdkVersion getExtOrIntegerDefault("minSdkVersion")
114
125
  targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
126
+
115
127
  buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
128
+ buildConfigField "boolean", "RN_AUDIO_API_ENABLE_WORKLETS", "${isWorkletsAvailable}"
129
+
130
+
116
131
 
117
132
  externalNativeBuild {
118
133
  cmake {
119
134
  abiFilters (*reactNativeArchitectures())
120
- arguments "-DANDROID_STL=c++_shared",
121
- "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}",
122
- "-DANDROID_TOOLCHAIN=clang",
123
- "-DREACT_NATIVE_DIR=${toPlatformFileString(reactNativeRootDir.path)}",
135
+
136
+ def cmakeArgs = [
137
+ "-DANDROID_STL=c++_shared",
138
+ "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}",
139
+ "-DANDROID_TOOLCHAIN=clang",
140
+ "-DREACT_NATIVE_DIR=${toPlatformFileString(reactNativeRootDir.path)}",
141
+ "-DRN_AUDIO_API_WORKLETS_ENABLED=${isWorkletsAvailable}",
124
142
  "-DIS_NEW_ARCHITECTURE_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}",
125
143
  "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
144
+ ]
145
+
146
+ if (isWorkletsAvailable) {
147
+ cmakeArgs << "-DREACT_NATIVE_WORKLETS_DIR=${toPlatformFileString(reactNativeWorkletsRootDir.path)}"
148
+ }
149
+ arguments = cmakeArgs
126
150
  }
127
151
  }
128
152
  }
@@ -225,8 +249,24 @@ dependencies {
225
249
  implementation 'com.facebook.fbjni:fbjni:0.6.0'
226
250
  implementation 'com.google.oboe:oboe:1.9.3'
227
251
  implementation 'androidx.media:media:1.7.0'
252
+
253
+ if (isWorkletsAvailable) {
254
+ implementation(rootProject.subprojects.find { it.name == 'react-native-worklets' })
255
+ }
228
256
  }
229
257
 
258
+ if (isWorkletsAvailable) {
259
+ // Ensure worklets is built before react-native-audio-api
260
+ def rnWorkletsProject = rootProject.subprojects.find { it.name == 'react-native-worklets' }
261
+ evaluationDependsOn(rnWorkletsProject.path)
262
+
263
+ afterEvaluate {
264
+ tasks.getByName("buildCMakeDebug").dependsOn(rnWorkletsProject.tasks.getByName("mergeDebugNativeLibs"))
265
+ tasks.getByName("buildCMakeRelWithDebInfo").dependsOn(rnWorkletsProject.tasks.getByName("mergeReleaseNativeLibs"))
266
+ }
267
+ }
268
+
269
+
230
270
  def assertMinimalReactNativeVersion = task assertMinimalReactNativeVersionTask {
231
271
  // If you change the minimal React Native version remember to update Compatibility Table in docs
232
272
  def minimalReactNativeVersion = 76
@@ -27,6 +27,12 @@ find_package(ReactAndroid REQUIRED CONFIG)
27
27
  find_package(fbjni REQUIRED CONFIG)
28
28
  find_package(oboe REQUIRED CONFIG)
29
29
 
30
+ if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
31
+ set(BUILD_TYPE "debug")
32
+ else()
33
+ set(BUILD_TYPE "release")
34
+ endif()
35
+
30
36
  target_include_directories(
31
37
  react-native-audio-api
32
38
  PRIVATE
@@ -48,10 +54,69 @@ set(LINK_LIBRARIES
48
54
  oboe::oboe
49
55
  )
50
56
 
57
+ set(INCLUDE_LIBRARIES
58
+ "${COMMON_CPP_DIR}"
59
+ "${ANDROID_CPP_DIR}"
60
+ "${INCLUDE_DIR}"
61
+ "${INCLUDE_DIR}/opus"
62
+ "${INCLUDE_DIR}/vorbis"
63
+ "${REACT_NATIVE_DIR}/ReactCommon"
64
+ "${REACT_NATIVE_DIR}/ReactCommon/jsiexecutor"
65
+ "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule"
66
+ "${REACT_NATIVE_DIR}/ReactCommon/callinvoker"
67
+ )
68
+
69
+ if(RN_AUDIO_API_WORKLETS_ENABLED)
70
+ # Import the worklets library (similar to how Reanimated does it)
71
+ add_library(worklets SHARED IMPORTED)
72
+ set_target_properties(
73
+ worklets
74
+ PROPERTIES
75
+ IMPORTED_LOCATION
76
+ "${REACT_NATIVE_WORKLETS_DIR}/build/intermediates/cmake/${BUILD_TYPE}/obj/${ANDROID_ABI}/libworklets.so"
77
+ )
78
+ list(APPEND INCLUDE_LIBRARIES
79
+ "${REACT_NATIVE_WORKLETS_DIR}/../Common/cpp"
80
+ "${REACT_NATIVE_WORKLETS_DIR}/src/main/cpp"
81
+ )
82
+ list(APPEND LINK_LIBRARIES worklets)
83
+ endif()
84
+
85
+ target_include_directories(
86
+ react-native-audio-api
87
+ PRIVATE
88
+ ${INCLUDE_LIBRARIES}
89
+ )
90
+
91
+ if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
92
+ set(RN_VERSION_LINK_LIBRARIES
93
+ ReactAndroid::reactnative
94
+ )
95
+ else()
96
+ set(RN_VERSION_LINK_LIBRARIES
97
+ ReactAndroid::folly_runtime
98
+ ReactAndroid::react_nativemodule_core
99
+ ReactAndroid::glog
100
+ ReactAndroid::reactnativejni
101
+ )
102
+ endif()
103
+
51
104
  set(RN_VERSION_LINK_LIBRARIES
52
105
  ReactAndroid::reactnative
53
106
  )
54
107
 
108
+ if(RN_AUDIO_API_WORKLETS_ENABLED)
109
+ target_compile_definitions(
110
+ react-native-audio-api
111
+ PRIVATE RN_AUDIO_API_ENABLE_WORKLETS=1
112
+ )
113
+ else()
114
+ target_compile_definitions(
115
+ react-native-audio-api
116
+ PRIVATE RN_AUDIO_API_ENABLE_WORKLETS=0
117
+ )
118
+ endif()
119
+
55
120
  target_link_libraries(react-native-audio-api
56
121
  ${LINK_LIBRARIES}
57
122
  ${RN_VERSION_LINK_LIBRARIES}
@@ -6,10 +6,16 @@ using namespace facebook::jni;
6
6
 
7
7
  AudioAPIModule::AudioAPIModule(
8
8
  jni::alias_ref<AudioAPIModule::jhybridobject> &jThis,
9
+ #if RN_AUDIO_API_ENABLE_WORKLETS
10
+ std::weak_ptr<WorkletsModuleProxy> weakWorkletsModuleProxy,
11
+ #endif
9
12
  jsi::Runtime *jsiRuntime,
10
13
  const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker)
11
14
  : javaPart_(make_global(jThis)),
12
15
  jsiRuntime_(jsiRuntime),
16
+ #if RN_AUDIO_API_ENABLE_WORKLETS
17
+ weakWorkletsModuleProxy_(weakWorkletsModuleProxy),
18
+ #endif
13
19
  jsCallInvoker_(jsCallInvoker) {
14
20
  audioEventHandlerRegistry_ =
15
21
  std::make_shared<AudioEventHandlerRegistry>(jsiRuntime, jsCallInvoker);
@@ -17,12 +23,25 @@ AudioAPIModule::AudioAPIModule(
17
23
 
18
24
  jni::local_ref<AudioAPIModule::jhybriddata> AudioAPIModule::initHybrid(
19
25
  jni::alias_ref<jhybridobject> jThis,
26
+ jni::alias_ref<jni::JObject> jWorkletsModule,
20
27
  jlong jsContext,
21
28
  jni::alias_ref<facebook::react::CallInvokerHolder::javaobject>
22
29
  jsCallInvokerHolder) {
23
30
  auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
24
31
  auto rnRuntime = reinterpret_cast<jsi::Runtime *>(jsContext);
32
+ #if RN_AUDIO_API_ENABLE_WORKLETS
33
+ if (jWorkletsModule) {
34
+ auto castedModule =
35
+ jni::static_ref_cast<WorkletsModule::javaobject>(jWorkletsModule);
36
+ auto workletsModuleProxy = castedModule->cthis()->getWorkletsModuleProxy();
37
+ return makeCxxInstance(
38
+ jThis, workletsModuleProxy, rnRuntime, jsCallInvoker);
39
+ }
40
+ throw std::runtime_error(
41
+ "Worklets module is required but not provided from Java/Kotlin side");
42
+ #else
25
43
  return makeCxxInstance(jThis, rnRuntime, jsCallInvoker);
44
+ #endif
26
45
  }
27
46
 
28
47
  void AudioAPIModule::registerNatives() {
@@ -36,8 +55,17 @@ void AudioAPIModule::registerNatives() {
36
55
  }
37
56
 
38
57
  void AudioAPIModule::injectJSIBindings() {
58
+ #if RN_AUDIO_API_ENABLE_WORKLETS
59
+ auto uiWorkletRuntime =
60
+ weakWorkletsModuleProxy_.lock()->getUIWorkletRuntime();
61
+ #else
62
+ auto uiWorkletRuntime = nullptr;
63
+ #endif
39
64
  AudioAPIModuleInstaller::injectJSIBindings(
40
- jsiRuntime_, jsCallInvoker_, audioEventHandlerRegistry_);
65
+ jsiRuntime_,
66
+ jsCallInvoker_,
67
+ audioEventHandlerRegistry_,
68
+ uiWorkletRuntime);
41
69
  }
42
70
 
43
71
  void AudioAPIModule::invokeHandlerWithEventNameAndEventBody(
@@ -7,6 +7,7 @@
7
7
  #include <fbjni/fbjni.h>
8
8
  #include <react/jni/CxxModuleWrapper.h>
9
9
  #include <react/jni/JMessageQueueThread.h>
10
+ #include <audioapi/core/utils/worklets/SafeIncludes.h>
10
11
  #include <memory>
11
12
  #include <utility>
12
13
  #include <unordered_map>
@@ -15,6 +16,7 @@ namespace audioapi {
15
16
 
16
17
  using namespace facebook;
17
18
  using namespace react;
19
+ using namespace worklets;
18
20
 
19
21
  class AudioAPIModule : public jni::HybridClass<AudioAPIModule> {
20
22
  public:
@@ -23,6 +25,7 @@ class AudioAPIModule : public jni::HybridClass<AudioAPIModule> {
23
25
 
24
26
  static jni::local_ref<AudioAPIModule::jhybriddata> initHybrid(
25
27
  jni::alias_ref<jhybridobject> jThis,
28
+ jni::alias_ref<jni::JObject> jWorkletsModule, // it will be null if RN_AUDIO_API_ENABLE_WORKLETS is false
26
29
  jlong jsContext,
27
30
  jni::alias_ref<facebook::react::CallInvokerHolder::javaobject>
28
31
  jsCallInvokerHolder);
@@ -37,13 +40,24 @@ class AudioAPIModule : public jni::HybridClass<AudioAPIModule> {
37
40
 
38
41
  jni::global_ref<AudioAPIModule::javaobject> javaPart_;
39
42
  jsi::Runtime *jsiRuntime_;
43
+ #if RN_AUDIO_API_ENABLE_WORKLETS
44
+ std::weak_ptr<worklets::WorkletsModuleProxy> weakWorkletsModuleProxy_;
45
+ #endif
40
46
  std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker_;
41
47
  std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;
42
48
 
49
+ #if RN_AUDIO_API_ENABLE_WORKLETS
43
50
  explicit AudioAPIModule(
44
51
  jni::alias_ref<AudioAPIModule::jhybridobject> &jThis,
52
+ std::weak_ptr<worklets::WorkletsModuleProxy> weakWorkletsModuleProxy,
45
53
  jsi::Runtime *jsiRuntime,
46
54
  const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker);
55
+ #else
56
+ explicit AudioAPIModule(
57
+ jni::alias_ref<AudioAPIModule::jhybridobject> &jThis,
58
+ jsi::Runtime *jsiRuntime,
59
+ const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker);
60
+ #endif
47
61
  };
48
62
 
49
63
  } // namespace audioapi
@@ -1,6 +1,6 @@
1
1
  #include <audioapi/android/core/AndroidAudioRecorder.h>
2
- #include <audioapi/core/Constants.h>
3
2
  #include <audioapi/core/sources/RecorderAdapterNode.h>
3
+ #include <audioapi/core/utils/Constants.h>
4
4
  #include <audioapi/events/AudioEventHandlerRegistry.h>
5
5
  #include <audioapi/utils/AudioArray.h>
6
6
  #include <audioapi/utils/AudioBus.h>
@@ -25,9 +25,13 @@ AndroidAudioRecorder::AndroidAudioRecorder(
25
25
  ->setDataCallback(this)
26
26
  ->setSampleRate(static_cast<int>(sampleRate))
27
27
  ->openStream(mStream_);
28
+
29
+ nativeAudioRecorder_ = jni::make_global(NativeAudioRecorder::create());
28
30
  }
29
31
 
30
32
  AndroidAudioRecorder::~AndroidAudioRecorder() {
33
+ nativeAudioRecorder_.release();
34
+
31
35
  if (mStream_) {
32
36
  mStream_->requestStop();
33
37
  mStream_->close();
@@ -41,6 +45,7 @@ void AndroidAudioRecorder::start() {
41
45
  }
42
46
 
43
47
  if (mStream_) {
48
+ nativeAudioRecorder_->start();
44
49
  mStream_->requestStart();
45
50
  }
46
51
 
@@ -55,6 +60,7 @@ void AndroidAudioRecorder::stop() {
55
60
  isRunning_.store(false);
56
61
 
57
62
  if (mStream_) {
63
+ nativeAudioRecorder_->stop();
58
64
  mStream_->requestStop();
59
65
  }
60
66
 
@@ -6,6 +6,8 @@
6
6
  #include <functional>
7
7
  #include <memory>
8
8
 
9
+ #include <audioapi/android/core/NativeAudioRecorder.hpp>
10
+
9
11
  namespace audioapi {
10
12
 
11
13
  using namespace oboe;
@@ -16,7 +18,8 @@ class AndroidAudioRecorder : public AudioStreamDataCallback, public AudioRecorde
16
18
  public:
17
19
  AndroidAudioRecorder(float sampleRate,
18
20
  int bufferLength,
19
- const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
21
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry
22
+ );
20
23
 
21
24
  ~AndroidAudioRecorder() override;
22
25
 
@@ -30,6 +33,8 @@ class AndroidAudioRecorder : public AudioStreamDataCallback, public AudioRecorde
30
33
 
31
34
  private:
32
35
  std::shared_ptr<AudioStream> mStream_;
36
+
37
+ facebook::jni::global_ref<NativeAudioRecorder> nativeAudioRecorder_;
33
38
  };
34
39
 
35
40
  } // namespace audioapi
@@ -1,7 +1,7 @@
1
1
  #include <android/log.h>
2
2
  #include <audioapi/android/core/AudioPlayer.h>
3
3
  #include <audioapi/core/AudioContext.h>
4
- #include <audioapi/core/Constants.h>
4
+ #include <audioapi/core/utils/Constants.h>
5
5
  #include <audioapi/utils/AudioArray.h>
6
6
  #include <audioapi/utils/AudioBus.h>
7
7
 
@@ -0,0 +1,36 @@
1
+ #pragma once
2
+
3
+
4
+ #include <fbjni/fbjni.h>
5
+ #include <react/jni/CxxModuleWrapper.h>
6
+ #include <react/jni/JMessageQueueThread.h>
7
+ #include <memory>
8
+ #include <utility>
9
+ #include <unordered_map>
10
+
11
+ namespace audioapi {
12
+
13
+ using namespace facebook;
14
+ using namespace react;
15
+
16
+ class NativeAudioRecorder : public jni::JavaClass<NativeAudioRecorder> {
17
+ public:
18
+ static auto constexpr kJavaDescriptor =
19
+ "Lcom/swmansion/audioapi/core/NativeAudioRecorder;";
20
+
21
+ static jni::local_ref<NativeAudioRecorder> create() {
22
+ return newInstance();
23
+ }
24
+
25
+ void start() {
26
+ static const auto method = javaClassStatic()->getMethod<void()>("start");
27
+ method(self());
28
+ }
29
+
30
+ void stop() {
31
+ static const auto method = javaClassStatic()->getMethod<void()>("stop");
32
+ method(self());
33
+ }
34
+ };
35
+
36
+ } // namespace audioapi