react-native-audio-api 0.8.3 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) 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/java/com/swmansion/audioapi/AudioAPIModule.kt +11 -1
  12. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +24 -0
  13. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +15 -2
  14. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +53 -18
  15. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +57 -0
  16. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +6 -46
  17. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +70 -6
  18. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.h +10 -66
  19. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +105 -0
  20. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +17 -91
  21. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +362 -6
  22. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +29 -241
  23. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +70 -0
  24. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +6 -50
  25. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +18 -0
  26. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +18 -0
  27. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +148 -0
  28. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.h +37 -0
  29. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +92 -0
  30. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +29 -0
  31. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +20 -0
  32. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h +19 -0
  33. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +21 -0
  34. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +21 -0
  35. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +41 -0
  36. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +28 -0
  37. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +69 -0
  38. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +33 -0
  39. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +73 -0
  40. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +29 -0
  41. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +94 -0
  42. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +46 -0
  43. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +60 -0
  44. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +25 -0
  45. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +152 -0
  46. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +37 -0
  47. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +52 -0
  48. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h +25 -0
  49. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +19 -0
  50. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +21 -0
  51. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +55 -0
  52. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +27 -0
  53. package/common/cpp/audioapi/HostObjects/{RecorderAdapterNodeHostObject.h → sources/RecorderAdapterNodeHostObject.h} +1 -2
  54. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +22 -0
  55. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +28 -0
  56. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +18 -0
  57. package/common/cpp/audioapi/core/AudioContext.cpp +3 -2
  58. package/common/cpp/audioapi/core/AudioContext.h +2 -1
  59. package/common/cpp/audioapi/core/AudioNode.cpp +3 -3
  60. package/common/cpp/audioapi/core/AudioNode.h +2 -2
  61. package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
  62. package/common/cpp/audioapi/core/AudioParam.h +1 -1
  63. package/common/cpp/audioapi/core/BaseAudioContext.cpp +47 -3
  64. package/common/cpp/audioapi/core/BaseAudioContext.h +13 -4
  65. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +4 -3
  66. package/common/cpp/audioapi/core/OfflineAudioContext.h +2 -1
  67. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +3 -1
  68. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +1 -1
  69. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +1 -1
  70. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +3 -1
  71. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +1 -1
  72. package/common/cpp/audioapi/core/effects/GainNode.cpp +3 -1
  73. package/common/cpp/audioapi/core/effects/GainNode.h +1 -1
  74. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +1 -1
  75. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +18 -13
  76. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +1 -1
  77. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +89 -0
  78. package/common/cpp/audioapi/core/effects/WorkletNode.h +65 -0
  79. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +91 -0
  80. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +52 -0
  81. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +1 -1
  82. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +2 -2
  83. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +47 -10
  84. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +18 -3
  85. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +98 -14
  86. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +9 -3
  87. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +37 -44
  88. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +7 -9
  89. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +1 -6
  90. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +1 -1
  91. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +53 -0
  92. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +26 -0
  93. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +7 -2
  94. package/common/cpp/audioapi/core/sources/OscillatorNode.h +1 -1
  95. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +3 -1
  96. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +1 -1
  97. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +9 -1
  98. package/common/cpp/audioapi/core/sources/StreamerNode.h +1 -9
  99. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +84 -0
  100. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +47 -0
  101. package/common/cpp/audioapi/core/{AudioParamEventQueue.cpp → utils/AudioParamEventQueue.cpp} +13 -7
  102. package/common/cpp/audioapi/core/{Constants.h → utils/Constants.h} +5 -0
  103. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +52 -0
  104. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +9 -0
  105. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +73 -0
  106. package/common/cpp/audioapi/dsp/Windows.cpp +1 -1
  107. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +1 -1
  108. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +2 -1
  109. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +14 -1
  110. package/common/cpp/audioapi/jsi/JsiHostObject.h +6 -12
  111. package/common/cpp/audioapi/jsi/JsiPromise.cpp +49 -0
  112. package/common/cpp/audioapi/jsi/JsiPromise.h +29 -1
  113. package/common/cpp/audioapi/utils/AudioBus.cpp +1 -1
  114. package/common/cpp/audioapi/utils/ThreadPool.hpp +104 -0
  115. package/common/cpp/test/AudioParamTest.cpp +204 -0
  116. package/common/cpp/test/CMakeLists.txt +12 -3
  117. package/common/cpp/test/GainTest.cpp +11 -10
  118. package/common/cpp/test/OscillatorTest.cpp +2 -1
  119. package/common/cpp/test/StereoPannerTest.cpp +129 -0
  120. package/ios/audioapi/ios/AudioAPIModule.mm +32 -5
  121. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +1 -1
  122. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
  123. package/lib/commonjs/api.js +36 -2
  124. package/lib/commonjs/api.js.map +1 -1
  125. package/lib/commonjs/api.web.js +8 -0
  126. package/lib/commonjs/api.web.js.map +1 -1
  127. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +7 -7
  128. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  129. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +1 -6
  130. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  131. package/lib/commonjs/core/AudioBufferSourceNode.js +15 -0
  132. package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -1
  133. package/lib/commonjs/core/AudioContext.js +10 -1
  134. package/lib/commonjs/core/AudioContext.js.map +1 -1
  135. package/lib/commonjs/core/AudioScheduledSourceNode.js +4 -4
  136. package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
  137. package/lib/commonjs/core/BaseAudioContext.js +66 -11
  138. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  139. package/lib/commonjs/core/ConstantSourceNode.js +17 -0
  140. package/lib/commonjs/core/ConstantSourceNode.js.map +1 -0
  141. package/lib/commonjs/core/OfflineAudioContext.js +11 -2
  142. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  143. package/lib/commonjs/core/OscillatorNode.js +6 -0
  144. package/lib/commonjs/core/OscillatorNode.js.map +1 -1
  145. package/lib/commonjs/core/WorkletNode.js +11 -0
  146. package/lib/commonjs/core/WorkletNode.js.map +1 -0
  147. package/lib/commonjs/core/WorkletProcessingNode.js +11 -0
  148. package/lib/commonjs/core/WorkletProcessingNode.js.map +1 -0
  149. package/lib/commonjs/core/WorkletSourceNode.js +11 -0
  150. package/lib/commonjs/core/WorkletSourceNode.js.map +1 -0
  151. package/lib/commonjs/hooks/{useSytemVolume.js → useSystemVolume.js} +1 -1
  152. package/lib/commonjs/hooks/useSystemVolume.js.map +1 -0
  153. package/lib/commonjs/utils/index.js +9 -0
  154. package/lib/commonjs/utils/index.js.map +1 -1
  155. package/lib/commonjs/web-core/AudioContext.js +4 -0
  156. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  157. package/lib/commonjs/web-core/AudioScheduledSourceNode.js +1 -1
  158. package/lib/commonjs/web-core/AudioScheduledSourceNode.js.map +1 -1
  159. package/lib/commonjs/web-core/ConstantSourceNode.js +17 -0
  160. package/lib/commonjs/web-core/ConstantSourceNode.js.map +1 -0
  161. package/lib/commonjs/web-core/OfflineAudioContext.js +4 -0
  162. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  163. package/lib/module/api.js +6 -2
  164. package/lib/module/api.js.map +1 -1
  165. package/lib/module/api.web.js +1 -0
  166. package/lib/module/api.web.js.map +1 -1
  167. package/lib/module/core/AudioBufferBaseSourceNode.js +7 -7
  168. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  169. package/lib/module/core/AudioBufferQueueSourceNode.js +1 -6
  170. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  171. package/lib/module/core/AudioBufferSourceNode.js +15 -0
  172. package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
  173. package/lib/module/core/AudioContext.js +10 -1
  174. package/lib/module/core/AudioContext.js.map +1 -1
  175. package/lib/module/core/AudioScheduledSourceNode.js +4 -4
  176. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
  177. package/lib/module/core/BaseAudioContext.js +66 -11
  178. package/lib/module/core/BaseAudioContext.js.map +1 -1
  179. package/lib/module/core/ConstantSourceNode.js +11 -0
  180. package/lib/module/core/ConstantSourceNode.js.map +1 -0
  181. package/lib/module/core/OfflineAudioContext.js +11 -2
  182. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  183. package/lib/module/core/OscillatorNode.js +6 -0
  184. package/lib/module/core/OscillatorNode.js.map +1 -1
  185. package/lib/module/core/WorkletNode.js +5 -0
  186. package/lib/module/core/WorkletNode.js.map +1 -0
  187. package/lib/module/core/WorkletProcessingNode.js +5 -0
  188. package/lib/module/core/WorkletProcessingNode.js.map +1 -0
  189. package/lib/module/core/WorkletSourceNode.js +5 -0
  190. package/lib/module/core/WorkletSourceNode.js.map +1 -0
  191. package/lib/module/hooks/{useSytemVolume.js → useSystemVolume.js} +1 -1
  192. package/lib/module/hooks/useSystemVolume.js.map +1 -0
  193. package/lib/module/utils/index.js +8 -0
  194. package/lib/module/utils/index.js.map +1 -1
  195. package/lib/module/web-core/AudioContext.js +4 -0
  196. package/lib/module/web-core/AudioContext.js.map +1 -1
  197. package/lib/module/web-core/AudioScheduledSourceNode.js +1 -1
  198. package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
  199. package/lib/module/web-core/ConstantSourceNode.js +11 -0
  200. package/lib/module/web-core/ConstantSourceNode.js.map +1 -0
  201. package/lib/module/web-core/OfflineAudioContext.js +4 -0
  202. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  203. package/lib/typescript/api.d.ts +8 -4
  204. package/lib/typescript/api.d.ts.map +1 -1
  205. package/lib/typescript/api.web.d.ts +1 -0
  206. package/lib/typescript/api.web.d.ts.map +1 -1
  207. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +2 -2
  208. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  209. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  210. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  211. package/lib/typescript/core/AudioBufferSourceNode.d.ts +4 -0
  212. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
  213. package/lib/typescript/core/AudioContext.d.ts +1 -0
  214. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  215. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +1 -1
  216. package/lib/typescript/core/BaseAudioContext.d.ts +19 -11
  217. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  218. package/lib/typescript/core/ConstantSourceNode.d.ts +9 -0
  219. package/lib/typescript/core/ConstantSourceNode.d.ts.map +1 -0
  220. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -0
  221. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  222. package/lib/typescript/core/OscillatorNode.d.ts +3 -0
  223. package/lib/typescript/core/OscillatorNode.d.ts.map +1 -1
  224. package/lib/typescript/core/WorkletNode.d.ts +4 -0
  225. package/lib/typescript/core/WorkletNode.d.ts.map +1 -0
  226. package/lib/typescript/core/WorkletProcessingNode.d.ts +4 -0
  227. package/lib/typescript/core/WorkletProcessingNode.d.ts.map +1 -0
  228. package/lib/typescript/core/WorkletSourceNode.d.ts +4 -0
  229. package/lib/typescript/core/WorkletSourceNode.d.ts.map +1 -0
  230. package/lib/typescript/events/types.d.ts +2 -0
  231. package/lib/typescript/events/types.d.ts.map +1 -1
  232. package/lib/typescript/hooks/{useSytemVolume.d.ts → useSystemVolume.d.ts} +1 -1
  233. package/lib/typescript/hooks/useSystemVolume.d.ts.map +1 -0
  234. package/lib/typescript/interfaces.d.ts +21 -3
  235. package/lib/typescript/interfaces.d.ts.map +1 -1
  236. package/lib/typescript/types.d.ts +2 -1
  237. package/lib/typescript/types.d.ts.map +1 -1
  238. package/lib/typescript/utils/index.d.ts +8 -0
  239. package/lib/typescript/utils/index.d.ts.map +1 -1
  240. package/lib/typescript/web-core/AudioBufferSourceNode.d.ts +1 -1
  241. package/lib/typescript/web-core/AudioContext.d.ts +4 -2
  242. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  243. package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +1 -1
  244. package/lib/typescript/web-core/BaseAudioContext.d.ts +2 -0
  245. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  246. package/lib/typescript/web-core/ConstantSourceNode.d.ts +8 -0
  247. package/lib/typescript/web-core/ConstantSourceNode.d.ts.map +1 -0
  248. package/lib/typescript/web-core/OfflineAudioContext.d.ts +4 -2
  249. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  250. package/package.json +3 -2
  251. package/src/api.ts +12 -3
  252. package/src/api.web.ts +1 -0
  253. package/src/core/AudioBufferBaseSourceNode.ts +9 -9
  254. package/src/core/AudioBufferQueueSourceNode.ts +1 -9
  255. package/src/core/AudioBufferSourceNode.ts +28 -0
  256. package/src/core/AudioContext.ts +12 -1
  257. package/src/core/AudioScheduledSourceNode.ts +5 -5
  258. package/src/core/BaseAudioContext.ts +149 -13
  259. package/src/core/ConstantSourceNode.ts +13 -0
  260. package/src/core/OfflineAudioContext.ts +18 -2
  261. package/src/core/OscillatorNode.ts +11 -0
  262. package/src/core/WorkletNode.ts +3 -0
  263. package/src/core/WorkletProcessingNode.ts +3 -0
  264. package/src/core/WorkletSourceNode.ts +3 -0
  265. package/src/events/types.ts +2 -0
  266. package/src/interfaces.ts +59 -5
  267. package/src/types.ts +3 -1
  268. package/src/utils/index.ts +21 -0
  269. package/src/web-core/AudioBufferSourceNode.tsx +1 -1
  270. package/src/web-core/AudioContext.tsx +7 -2
  271. package/src/web-core/AudioScheduledSourceNode.tsx +1 -1
  272. package/src/web-core/BaseAudioContext.tsx +2 -0
  273. package/src/web-core/ConstantSourceNode.tsx +12 -0
  274. package/src/web-core/OfflineAudioContext.tsx +7 -2
  275. package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +0 -149
  276. package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +0 -76
  277. package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +0 -120
  278. package/common/cpp/audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h +0 -67
  279. package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +0 -142
  280. package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +0 -86
  281. package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +0 -56
  282. package/common/cpp/audioapi/HostObjects/BiquadFilterNodeHostObject.h +0 -89
  283. package/common/cpp/audioapi/HostObjects/GainNodeHostObject.h +0 -27
  284. package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +0 -65
  285. package/common/cpp/audioapi/HostObjects/StereoPannerNodeHostObject.h +0 -29
  286. package/common/cpp/audioapi/HostObjects/StreamerNodeHostObject.h +0 -30
  287. package/common/cpp/audioapi/events/AudioEventHandlerRegistryHostObject.h +0 -48
  288. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.h +0 -7
  289. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.mm +0 -12
  290. package/lib/commonjs/hooks/useSytemVolume.js.map +0 -1
  291. package/lib/module/hooks/useSytemVolume.js.map +0 -1
  292. package/lib/typescript/hooks/useSytemVolume.d.ts.map +0 -1
  293. /package/common/cpp/audioapi/HostObjects/{AudioDestinationNodeHostObject.h → destinations/AudioDestinationNodeHostObject.h} +0 -0
  294. /package/common/cpp/audioapi/HostObjects/{PeriodicWaveHostObject.h → effects/PeriodicWaveHostObject.h} +0 -0
  295. /package/common/cpp/audioapi/core/{AudioParamEventQueue.h → utils/AudioParamEventQueue.h} +0 -0
  296. /package/src/hooks/{useSytemVolume.ts → useSystemVolume.ts} +0 -0
@@ -1,6 +1,6 @@
1
1
  #include <audioapi/core/BaseAudioContext.h>
2
- #include <audioapi/core/Constants.h>
3
2
  #include <audioapi/core/effects/StereoPannerNode.h>
3
+ #include <audioapi/core/utils/Constants.h>
4
4
  #include <audioapi/utils/AudioArray.h>
5
5
  #include <audioapi/utils/AudioBus.h>
6
6
 
@@ -19,18 +19,20 @@ std::shared_ptr<AudioParam> StereoPannerNode::getPanParam() const {
19
19
  return panParam_;
20
20
  }
21
21
 
22
- void StereoPannerNode::processNode(
22
+ std::shared_ptr<AudioBus> StereoPannerNode::processNode(
23
23
  const std::shared_ptr<AudioBus> &processingBus,
24
24
  int framesToProcess) {
25
25
  double time = context_->getCurrentTime();
26
26
  double deltaTime = 1.0 / context_->getSampleRate();
27
27
 
28
- AudioArray *left = processingBus->getChannelByType(AudioBus::ChannelLeft);
29
- AudioArray *right = processingBus->getChannelByType(AudioBus::ChannelRight);
28
+ auto *inputLeft = processingBus->getChannelByType(AudioBus::ChannelLeft);
30
29
  auto panParamValues = panParam_->processARateParam(framesToProcess, time)
31
30
  ->getChannel(0)
32
31
  ->getData();
33
32
 
33
+ auto *outputLeft = audioBus_->getChannelByType(AudioBus::ChannelLeft);
34
+ auto *outputRight = audioBus_->getChannelByType(AudioBus::ChannelRight);
35
+
34
36
  // Input is mono
35
37
  if (processingBus->getNumberOfChannels() == 1) {
36
38
  for (int i = 0; i < framesToProcess; i++) {
@@ -40,13 +42,14 @@ void StereoPannerNode::processNode(
40
42
  auto gainL = static_cast<float>(cos(x * PI / 2));
41
43
  auto gainR = static_cast<float>(sin(x * PI / 2));
42
44
 
43
- float input = (*left)[i];
45
+ float input = (*inputLeft)[i];
44
46
 
45
- (*left)[i] = input * gainL;
46
- (*right)[i] = input * gainR;
47
+ (*outputLeft)[i] = input * gainL;
48
+ (*outputRight)[i] = input * gainR;
47
49
  time += deltaTime;
48
50
  }
49
51
  } else { // Input is stereo
52
+ auto *inputRight = processingBus->getChannelByType(AudioBus::ChannelRight);
50
53
  for (int i = 0; i < framesToProcess; i++) {
51
54
  auto pan = std::clamp(panParamValues[i], -1.0f, 1.0f);
52
55
  auto x = (pan <= 0 ? pan + 1 : pan);
@@ -54,20 +57,22 @@ void StereoPannerNode::processNode(
54
57
  auto gainL = static_cast<float>(cos(x * PI / 2));
55
58
  auto gainR = static_cast<float>(sin(x * PI / 2));
56
59
 
57
- float inputL = (*left)[i];
58
- float inputR = (*right)[i];
60
+ float inputL = (*inputLeft)[i];
61
+ float inputR = (*inputRight)[i];
59
62
 
60
63
  if (pan <= 0) {
61
- (*left)[i] = inputL + inputR * gainL;
62
- (*right)[i] = inputR * gainR;
64
+ (*outputLeft)[i] = inputL + inputR * gainL;
65
+ (*outputRight)[i] = inputR * gainR;
63
66
  } else {
64
- (*left)[i] = inputL * gainL;
65
- (*right)[i] = inputR + inputL * gainR;
67
+ (*outputLeft)[i] = inputL * gainL;
68
+ (*outputRight)[i] = inputR + inputL * gainR;
66
69
  }
67
70
 
68
71
  time += deltaTime;
69
72
  }
70
73
  }
74
+
75
+ return audioBus_;
71
76
  }
72
77
 
73
78
  } // namespace audioapi
@@ -18,7 +18,7 @@ class StereoPannerNode : public AudioNode {
18
18
  [[nodiscard]] std::shared_ptr<AudioParam> getPanParam() const;
19
19
 
20
20
  protected:
21
- void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
21
+ std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
22
22
 
23
23
  private:
24
24
  std::shared_ptr<AudioParam> panParam_;
@@ -0,0 +1,89 @@
1
+ #include <audioapi/core/effects/WorkletNode.h>
2
+
3
+ namespace audioapi {
4
+
5
+ WorkletNode::WorkletNode(
6
+ BaseAudioContext *context,
7
+ std::shared_ptr<worklets::SerializableWorklet> &worklet,
8
+ std::weak_ptr<worklets::WorkletRuntime> runtime,
9
+ size_t bufferLength,
10
+ size_t inputChannelCount)
11
+ : AudioNode(context),
12
+ buffRealLength_(bufferLength * sizeof(float)),
13
+ bufferLength_(bufferLength),
14
+ workletRunner_(runtime),
15
+ shareableWorklet_(worklet),
16
+ inputChannelCount_(inputChannelCount),
17
+ curBuffIndex_(0) {
18
+ buffs_.reserve(inputChannelCount_);
19
+ for (size_t i = 0; i < inputChannelCount_; ++i) {
20
+ buffs_.emplace_back(new uint8_t[buffRealLength_]);
21
+ }
22
+ isInitialized_ = true;
23
+ }
24
+
25
+ WorkletNode::~WorkletNode() {
26
+ for (auto &buff : buffs_) {
27
+ delete[] buff;
28
+ }
29
+ }
30
+
31
+ std::shared_ptr<AudioBus> WorkletNode::processNode(
32
+ const std::shared_ptr<AudioBus> &processingBus,
33
+ int framesToProcess) {
34
+ size_t processed = 0;
35
+ size_t channelCount_ = std::min(
36
+ inputChannelCount_,
37
+ static_cast<size_t>(processingBus->getNumberOfChannels()));
38
+ while (processed < framesToProcess) {
39
+ size_t framesToWorkletInvoke = bufferLength_ - curBuffIndex_;
40
+ size_t needsToProcess = framesToProcess - processed;
41
+ size_t shouldProcess = std::min(framesToWorkletInvoke, needsToProcess);
42
+
43
+ for (size_t ch = 0; ch < channelCount_; ch++) {
44
+ /// here we copy
45
+ /// to uint8_t* [curBuffIndex_, curBuffIndex_ + shouldProcess]
46
+ /// from float* [processed, processed + shouldProcess]
47
+ /// so as the we need to copy shouldProcess * sizeof(float) bytes
48
+ auto channelData = processingBus->getChannel(ch)->getData();
49
+ std::memcpy(
50
+ /* dest */ buffs_[ch] + curBuffIndex_ * sizeof(float),
51
+ /* src */ reinterpret_cast<const uint8_t *>(channelData + processed),
52
+ /* size */ shouldProcess * sizeof(float));
53
+ }
54
+ processed += shouldProcess;
55
+ curBuffIndex_ += shouldProcess;
56
+
57
+ /// If we filled the entire buffer, we need to execute the worklet
58
+ if (curBuffIndex_ == bufferLength_) {
59
+ // Reset buffer index, channel buffers and execute worklet
60
+ curBuffIndex_ = 0;
61
+ workletRunner_.executeOnRuntimeGuardedSync(
62
+ [this, channelCount_](jsi::Runtime &uiRuntimeRaw) {
63
+ /// Arguments preparation
64
+ auto jsArray = jsi::Array(uiRuntimeRaw, channelCount_);
65
+ for (size_t ch = 0; ch < channelCount_; ch++) {
66
+ uint8_t *buffPtr = buffs_[ch];
67
+ buffs_[ch] = new uint8_t[buffRealLength_];
68
+ auto sharedAudioArray =
69
+ std::make_shared<AudioArrayBuffer>(buffPtr, buffRealLength_);
70
+ auto arrayBuffer =
71
+ jsi::ArrayBuffer(uiRuntimeRaw, std::move(sharedAudioArray));
72
+ jsArray.setValueAtIndex(uiRuntimeRaw, ch, std::move(arrayBuffer));
73
+ }
74
+ jsArray.setExternalMemoryPressure(
75
+ uiRuntimeRaw, channelCount_ * buffRealLength_);
76
+
77
+ workletRunner_.executeWorklet(
78
+ shareableWorklet_,
79
+ std::move(jsArray),
80
+ jsi::Value(uiRuntimeRaw, static_cast<int>(channelCount_)));
81
+ return jsi::Value::undefined();
82
+ });
83
+ }
84
+ }
85
+
86
+ return processingBus;
87
+ }
88
+
89
+ } // namespace audioapi
@@ -0,0 +1,65 @@
1
+ #pragma once
2
+
3
+
4
+ #include <jsi/jsi.h>
5
+ #include <audioapi/core/utils/worklets/WorkletsRunner.h>
6
+ #include <audioapi/core/AudioNode.h>
7
+ #include <audioapi/core/BaseAudioContext.h>
8
+ #include <audioapi/utils/AudioBus.h>
9
+ #include <audioapi/utils/AudioArray.h>
10
+ #include <audioapi/jsi/AudioArrayBuffer.h>
11
+
12
+ #include <memory>
13
+ #include <vector>
14
+
15
+ namespace audioapi {
16
+
17
+ #if RN_AUDIO_API_TEST
18
+ class WorkletNode : public AudioNode {
19
+ public:
20
+ explicit WorkletNode(
21
+ BaseAudioContext *context,
22
+ std::shared_ptr<worklets::SerializableWorklet> &worklet,
23
+ std::weak_ptr<worklets::WorkletRuntime> runtime,
24
+ size_t bufferLength,
25
+ size_t inputChannelCount
26
+ ) : AudioNode(context) {}
27
+
28
+ protected:
29
+ std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override { return processingBus; }
30
+ };
31
+ #else
32
+
33
+ using namespace facebook;
34
+
35
+ class WorkletNode : public AudioNode {
36
+ public:
37
+ explicit WorkletNode(
38
+ BaseAudioContext *context,
39
+ std::shared_ptr<worklets::SerializableWorklet> &worklet,
40
+ std::weak_ptr<worklets::WorkletRuntime> runtime,
41
+ size_t bufferLength,
42
+ size_t inputChannelCount
43
+ );
44
+
45
+ ~WorkletNode() override;
46
+
47
+ protected:
48
+ std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
49
+
50
+
51
+ private:
52
+ WorkletsRunner workletRunner_;
53
+ std::shared_ptr<worklets::SerializableWorklet> shareableWorklet_;
54
+ std::vector<uint8_t*> buffs_;
55
+
56
+ /// @brief Length of the byte buffer that will be passed to the AudioArrayBuffer
57
+ size_t buffRealLength_;
58
+ size_t bufferLength_;
59
+ size_t inputChannelCount_;
60
+ size_t curBuffIndex_;
61
+ };
62
+
63
+ #endif // RN_AUDIO_API_TEST
64
+
65
+ } // namespace audioapi
@@ -0,0 +1,91 @@
1
+ #include <audioapi/core/effects/WorkletProcessingNode.h>
2
+ #include <audioapi/core/utils/Constants.h>
3
+
4
+ namespace audioapi {
5
+
6
+ WorkletProcessingNode::WorkletProcessingNode(
7
+ BaseAudioContext *context,
8
+ std::shared_ptr<worklets::SerializableWorklet> &worklet,
9
+ std::weak_ptr<worklets::WorkletRuntime> runtime)
10
+ : AudioNode(context), workletRunner_(runtime), shareableWorklet_(worklet) {
11
+ isInitialized_ = true;
12
+
13
+ // Pre-allocate buffers for max 128 frames and 2 channels (stereo)
14
+ size_t maxChannelCount = 2;
15
+ inputBuffsHandles_.resize(maxChannelCount);
16
+ outputBuffsHandles_.resize(maxChannelCount);
17
+
18
+ for (size_t i = 0; i < maxChannelCount; ++i) {
19
+ auto inputBuff = new uint8_t[RENDER_QUANTUM_SIZE * sizeof(float)];
20
+ inputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(
21
+ inputBuff, RENDER_QUANTUM_SIZE * sizeof(float));
22
+
23
+ auto outputBuff = new uint8_t[RENDER_QUANTUM_SIZE * sizeof(float)];
24
+ outputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(
25
+ outputBuff, RENDER_QUANTUM_SIZE * sizeof(float));
26
+ }
27
+ }
28
+
29
+ std::shared_ptr<AudioBus> WorkletProcessingNode::processNode(
30
+ const std::shared_ptr<AudioBus> &processingBus,
31
+ int framesToProcess) {
32
+ size_t channelCount = std::min(
33
+ static_cast<size_t>(2), // Fixed to stereo for now
34
+ static_cast<size_t>(processingBus->getNumberOfChannels()));
35
+
36
+ // Copy input data to pre-allocated input buffers
37
+ for (size_t ch = 0; ch < channelCount; ch++) {
38
+ auto channelData = processingBus->getChannel(ch)->getData();
39
+ std::memcpy(
40
+ /* dest */ inputBuffsHandles_[ch]->data(),
41
+ /* src */ reinterpret_cast<const uint8_t *>(channelData),
42
+ /* size */ framesToProcess * sizeof(float));
43
+ }
44
+
45
+ // Execute the worklet
46
+ auto result = workletRunner_.executeOnRuntimeGuardedSync(
47
+ [this, channelCount, framesToProcess](jsi::Runtime &rt) {
48
+ auto inputJsArray = jsi::Array(rt, channelCount);
49
+ auto outputJsArray = jsi::Array(rt, channelCount);
50
+
51
+ for (size_t ch = 0; ch < channelCount; ch++) {
52
+ // Create input array buffer
53
+ auto inputArrayBuffer = jsi::ArrayBuffer(rt, inputBuffsHandles_[ch]);
54
+ inputJsArray.setValueAtIndex(rt, ch, inputArrayBuffer);
55
+
56
+ // Create output array buffer
57
+ auto outputArrayBuffer =
58
+ jsi::ArrayBuffer(rt, outputBuffsHandles_[ch]);
59
+ outputJsArray.setValueAtIndex(rt, ch, outputArrayBuffer);
60
+ }
61
+
62
+ return workletRunner_
63
+ .executeWorklet(
64
+ shareableWorklet_,
65
+ inputJsArray,
66
+ outputJsArray,
67
+ jsi::Value(rt, static_cast<int>(framesToProcess)),
68
+ jsi::Value(rt, this->context_->getCurrentTime()))
69
+ .value_or(jsi::Value::undefined());
70
+ });
71
+
72
+ // Copy processed output data back to the processing bus or zero on failure
73
+ for (size_t ch = 0; ch < channelCount; ch++) {
74
+ auto channelData = processingBus->getChannel(ch)->getData();
75
+
76
+ if (result.has_value()) {
77
+ // Copy processed output data
78
+ std::memcpy(
79
+ /* dest */ reinterpret_cast<uint8_t *>(channelData),
80
+ /* src */ outputBuffsHandles_[ch]->data(),
81
+ /* size */ framesToProcess * sizeof(float));
82
+ } else {
83
+ // Zero the output on worklet execution failure
84
+ std::memset(channelData, 0, framesToProcess * sizeof(float));
85
+ }
86
+ }
87
+
88
+ return processingBus;
89
+ }
90
+
91
+ } // namespace audioapi
@@ -0,0 +1,52 @@
1
+ #pragma once
2
+
3
+ #include <jsi/jsi.h>
4
+ #include <audioapi/core/utils/worklets/WorkletsRunner.h>
5
+ #include <audioapi/core/AudioNode.h>
6
+ #include <audioapi/core/BaseAudioContext.h>
7
+ #include <audioapi/utils/AudioBus.h>
8
+ #include <audioapi/utils/AudioArray.h>
9
+ #include <audioapi/jsi/AudioArrayBuffer.h>
10
+
11
+ #include <memory>
12
+ #include <vector>
13
+
14
+ namespace audioapi {
15
+
16
+ #if RN_AUDIO_API_TEST
17
+ class WorkletProcessingNode : public AudioNode {
18
+ public:
19
+ explicit WorkletProcessingNode(
20
+ BaseAudioContext *context,
21
+ std::shared_ptr<worklets::SerializableWorklet> &worklet,
22
+ std::weak_ptr<worklets::WorkletRuntime> runtime
23
+ ) : AudioNode(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
+ using namespace facebook;
31
+
32
+ class WorkletProcessingNode : public AudioNode {
33
+ public:
34
+ explicit WorkletProcessingNode(
35
+ BaseAudioContext *context,
36
+ std::shared_ptr<worklets::SerializableWorklet> &worklet,
37
+ std::weak_ptr<worklets::WorkletRuntime> runtime
38
+ );
39
+
40
+ protected:
41
+ std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
42
+
43
+ private:
44
+ WorkletsRunner workletRunner_;
45
+ std::shared_ptr<worklets::SerializableWorklet> shareableWorklet_;
46
+ std::vector<std::shared_ptr<AudioArrayBuffer>> inputBuffsHandles_;
47
+ std::vector<std::shared_ptr<AudioArrayBuffer>> outputBuffsHandles_;
48
+ };
49
+
50
+ #endif // RN_AUDIO_API_TEST
51
+
52
+ } // namespace audioapi
@@ -1,4 +1,4 @@
1
- #include <audioapi/HostObjects/AudioBufferHostObject.h>
1
+ #include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
2
2
  #include <audioapi/core/inputs/AudioRecorder.h>
3
3
  #include <audioapi/core/sources/AudioBuffer.h>
4
4
  #include <audioapi/core/sources/RecorderAdapterNode.h>
@@ -1,11 +1,11 @@
1
1
  #pragma once
2
2
 
3
-
4
3
  #include <memory>
5
- #include <mutex>
6
4
  #include <atomic>
5
+ #include <mutex>
7
6
 
8
7
  namespace audioapi {
8
+
9
9
  class RecorderAdapterNode;
10
10
  class AudioBus;
11
11
  class CircularAudioArray;
@@ -1,14 +1,18 @@
1
1
  #include <audioapi/core/AudioParam.h>
2
2
  #include <audioapi/core/BaseAudioContext.h>
3
- #include <audioapi/core/Constants.h>
4
3
  #include <audioapi/core/sources/AudioBufferBaseSourceNode.h>
4
+ #include <audioapi/core/utils/Constants.h>
5
5
  #include <audioapi/events/AudioEventHandlerRegistry.h>
6
6
  #include <audioapi/utils/AudioArray.h>
7
7
  #include <audioapi/utils/AudioBus.h>
8
8
 
9
9
  namespace audioapi {
10
- AudioBufferBaseSourceNode::AudioBufferBaseSourceNode(BaseAudioContext *context)
11
- : AudioScheduledSourceNode(context), vReadIndex_(0.0) {
10
+ AudioBufferBaseSourceNode::AudioBufferBaseSourceNode(
11
+ BaseAudioContext *context,
12
+ bool pitchCorrection)
13
+ : AudioScheduledSourceNode(context),
14
+ pitchCorrection_(pitchCorrection),
15
+ vReadIndex_(0.0) {
12
16
  onPositionChangedInterval_ = static_cast<int>(context->getSampleRate() * 0.1);
13
17
 
14
18
  detuneParam_ = std::make_shared<AudioParam>(
@@ -24,12 +28,7 @@ AudioBufferBaseSourceNode::AudioBufferBaseSourceNode(BaseAudioContext *context)
24
28
  }
25
29
 
26
30
  AudioBufferBaseSourceNode::~AudioBufferBaseSourceNode() {
27
- if (onPositionChangedCallbackId_ != 0 &&
28
- context_->audioEventHandlerRegistry_ != nullptr) {
29
- context_->audioEventHandlerRegistry_->unregisterHandler(
30
- "positionChanged", onPositionChangedCallbackId_);
31
- onPositionChangedCallbackId_ = 0;
32
- }
31
+ clearOnPositionChangedCallback();
33
32
  }
34
33
 
35
34
  std::shared_ptr<AudioParam> AudioBufferBaseSourceNode::getDetuneParam() const {
@@ -62,7 +61,7 @@ void AudioBufferBaseSourceNode::setOnPositionChangedInterval(int interval) {
62
61
  context_->getSampleRate() * static_cast<float>(interval) / 1000);
63
62
  }
64
63
 
65
- int AudioBufferBaseSourceNode::getOnPositionChangedInterval() {
64
+ int AudioBufferBaseSourceNode::getOnPositionChangedInterval() const {
66
65
  return onPositionChangedInterval_;
67
66
  }
68
67
 
@@ -125,7 +124,45 @@ void AudioBufferBaseSourceNode::processWithPitchCorrection(
125
124
  if (detune != 0.0f) {
126
125
  stretch_->setTransposeSemitones(detune);
127
126
  }
127
+
128
128
  sendOnPositionChangedEvent();
129
129
  }
130
130
 
131
+ void AudioBufferBaseSourceNode::processWithoutPitchCorrection(
132
+ const std::shared_ptr<AudioBus> &processingBus,
133
+ int framesToProcess) {
134
+ size_t startOffset = 0;
135
+ size_t offsetLength = 0;
136
+
137
+ auto computedPlaybackRate = getComputedPlaybackRateValue(framesToProcess);
138
+ updatePlaybackInfo(processingBus, framesToProcess, startOffset, offsetLength);
139
+
140
+ if (computedPlaybackRate == 0.0f || (!isPlaying() && !isStopScheduled())) {
141
+ processingBus->zero();
142
+ return;
143
+ }
144
+
145
+ if (std::fabs(computedPlaybackRate) == 1.0) {
146
+ processWithoutInterpolation(
147
+ processingBus, startOffset, offsetLength, computedPlaybackRate);
148
+ } else {
149
+ processWithInterpolation(
150
+ processingBus, startOffset, offsetLength, computedPlaybackRate);
151
+ }
152
+
153
+ sendOnPositionChangedEvent();
154
+ }
155
+
156
+ float AudioBufferBaseSourceNode::getComputedPlaybackRateValue(
157
+ int framesToProcess) {
158
+ auto time = context_->getCurrentTime();
159
+
160
+ auto playbackRate =
161
+ playbackRateParam_->processKRateParam(framesToProcess, time);
162
+ auto detune = std::pow(
163
+ 2.0f, detuneParam_->processKRateParam(framesToProcess, time) / 1200.0f);
164
+
165
+ return playbackRate * detune;
166
+ }
167
+
131
168
  } // namespace audioapi
@@ -14,8 +14,8 @@ class AudioParam;
14
14
 
15
15
  class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
16
16
  public:
17
- explicit AudioBufferBaseSourceNode(BaseAudioContext *context);
18
- virtual ~AudioBufferBaseSourceNode();
17
+ explicit AudioBufferBaseSourceNode(BaseAudioContext *context, bool pitchCorrection);
18
+ ~AudioBufferBaseSourceNode() override;
19
19
 
20
20
  [[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
21
21
  [[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;
@@ -23,9 +23,12 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
23
23
  void clearOnPositionChangedCallback();
24
24
  void setOnPositionChangedCallbackId(uint64_t callbackId);
25
25
  void setOnPositionChangedInterval(int interval);
26
- [[nodiscard]] int getOnPositionChangedInterval();
26
+ [[nodiscard]] int getOnPositionChangedInterval() const;
27
27
 
28
28
  protected:
29
+ // pitch correction
30
+ bool pitchCorrection_;
31
+
29
32
  std::mutex bufferLock_;
30
33
 
31
34
  // pitch correction
@@ -47,13 +50,25 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
47
50
  virtual double getCurrentPosition() const = 0;
48
51
 
49
52
  void sendOnPositionChangedEvent();
53
+
50
54
  void processWithPitchCorrection(const std::shared_ptr<AudioBus> &processingBus,
51
55
  int framesToProcess);
56
+ void processWithoutPitchCorrection(const std::shared_ptr<AudioBus> &processingBus,
57
+ int framesToProcess);
58
+
59
+ float getComputedPlaybackRateValue(int framesToProcess);
60
+
52
61
  virtual void processWithoutInterpolation(
53
62
  const std::shared_ptr<AudioBus>& processingBus,
54
63
  size_t startOffset,
55
64
  size_t offsetLength,
56
65
  float playbackRate) = 0;
66
+
67
+ virtual void processWithInterpolation(
68
+ const std::shared_ptr<AudioBus>& processingBus,
69
+ size_t startOffset,
70
+ size_t offsetLength,
71
+ float playbackRate) = 0;
57
72
  };
58
73
 
59
74
  } // namespace audioapi