react-native-audio-api 0.8.3-nightly-ea268f4-20251006 → 0.8.3

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 (282) hide show
  1. package/README.md +39 -40
  2. package/RNAudioAPI.podspec +12 -17
  3. package/android/build.gradle +4 -44
  4. package/android/src/main/cpp/audioapi/CMakeLists.txt +0 -65
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +1 -29
  6. package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +0 -14
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +1 -7
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +1 -6
  9. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +1 -1
  10. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +1 -11
  11. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +2 -15
  12. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +18 -53
  13. package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +149 -0
  14. package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +76 -0
  15. package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +120 -0
  16. package/common/cpp/audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h +67 -0
  17. package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +142 -0
  18. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +46 -6
  19. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +6 -70
  20. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.h +66 -10
  21. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +91 -17
  22. package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +86 -0
  23. package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +56 -0
  24. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +6 -362
  25. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +241 -29
  26. package/common/cpp/audioapi/HostObjects/BiquadFilterNodeHostObject.h +89 -0
  27. package/common/cpp/audioapi/HostObjects/GainNodeHostObject.h +27 -0
  28. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +50 -6
  29. package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +65 -0
  30. package/common/cpp/audioapi/HostObjects/{sources/RecorderAdapterNodeHostObject.h → RecorderAdapterNodeHostObject.h} +2 -1
  31. package/common/cpp/audioapi/HostObjects/StereoPannerNodeHostObject.h +29 -0
  32. package/common/cpp/audioapi/HostObjects/StreamerNodeHostObject.h +30 -0
  33. package/common/cpp/audioapi/core/AudioContext.cpp +2 -3
  34. package/common/cpp/audioapi/core/AudioContext.h +1 -2
  35. package/common/cpp/audioapi/core/AudioNode.h +1 -1
  36. package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
  37. package/common/cpp/audioapi/core/AudioParam.h +1 -1
  38. package/common/cpp/audioapi/core/{utils/AudioParamEventQueue.cpp → AudioParamEventQueue.cpp} +7 -13
  39. package/common/cpp/audioapi/core/BaseAudioContext.cpp +3 -47
  40. package/common/cpp/audioapi/core/BaseAudioContext.h +4 -13
  41. package/common/cpp/audioapi/core/{utils/Constants.h → Constants.h} +0 -5
  42. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +3 -4
  43. package/common/cpp/audioapi/core/OfflineAudioContext.h +1 -2
  44. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +1 -1
  45. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +1 -1
  46. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +1 -1
  47. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +2 -2
  48. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +10 -47
  49. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +3 -18
  50. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +12 -94
  51. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +2 -8
  52. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +42 -33
  53. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
  54. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +6 -1
  55. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +1 -1
  56. package/common/cpp/audioapi/core/sources/StreamerNode.h +8 -0
  57. package/common/cpp/audioapi/dsp/Windows.cpp +1 -1
  58. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +1 -1
  59. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +1 -2
  60. package/common/cpp/audioapi/events/AudioEventHandlerRegistryHostObject.h +48 -0
  61. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +1 -14
  62. package/common/cpp/audioapi/jsi/JsiHostObject.h +12 -6
  63. package/common/cpp/audioapi/jsi/JsiPromise.cpp +0 -49
  64. package/common/cpp/audioapi/jsi/JsiPromise.h +1 -29
  65. package/common/cpp/audioapi/utils/AudioBus.cpp +1 -1
  66. package/common/cpp/test/CMakeLists.txt +3 -11
  67. package/common/cpp/test/GainTest.cpp +1 -2
  68. package/common/cpp/test/OscillatorTest.cpp +1 -2
  69. package/ios/audioapi/ios/AudioAPIModule.mm +5 -32
  70. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +1 -1
  71. package/ios/audioapi/ios/core/IOSAudioRecorder.h +1 -2
  72. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
  73. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.h +7 -0
  74. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.mm +12 -0
  75. package/lib/commonjs/api.js +2 -36
  76. package/lib/commonjs/api.js.map +1 -1
  77. package/lib/commonjs/api.web.js +0 -8
  78. package/lib/commonjs/api.web.js.map +1 -1
  79. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +7 -7
  80. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  81. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +6 -1
  82. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  83. package/lib/commonjs/core/AudioBufferSourceNode.js +0 -15
  84. package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -1
  85. package/lib/commonjs/core/AudioContext.js +1 -10
  86. package/lib/commonjs/core/AudioContext.js.map +1 -1
  87. package/lib/commonjs/core/AudioScheduledSourceNode.js +4 -4
  88. package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
  89. package/lib/commonjs/core/BaseAudioContext.js +11 -66
  90. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  91. package/lib/commonjs/core/OfflineAudioContext.js +2 -11
  92. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  93. package/lib/commonjs/core/OscillatorNode.js +0 -6
  94. package/lib/commonjs/core/OscillatorNode.js.map +1 -1
  95. package/lib/commonjs/hooks/{useSystemVolume.js → useSytemVolume.js} +1 -1
  96. package/lib/commonjs/hooks/useSytemVolume.js.map +1 -0
  97. package/lib/commonjs/utils/index.js +0 -9
  98. package/lib/commonjs/utils/index.js.map +1 -1
  99. package/lib/commonjs/web-core/AudioContext.js +0 -4
  100. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  101. package/lib/commonjs/web-core/AudioScheduledSourceNode.js +1 -1
  102. package/lib/commonjs/web-core/AudioScheduledSourceNode.js.map +1 -1
  103. package/lib/commonjs/web-core/OfflineAudioContext.js +0 -4
  104. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  105. package/lib/module/api.js +2 -6
  106. package/lib/module/api.js.map +1 -1
  107. package/lib/module/api.web.js +0 -1
  108. package/lib/module/api.web.js.map +1 -1
  109. package/lib/module/core/AudioBufferBaseSourceNode.js +7 -7
  110. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  111. package/lib/module/core/AudioBufferQueueSourceNode.js +6 -1
  112. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  113. package/lib/module/core/AudioBufferSourceNode.js +0 -15
  114. package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
  115. package/lib/module/core/AudioContext.js +1 -10
  116. package/lib/module/core/AudioContext.js.map +1 -1
  117. package/lib/module/core/AudioScheduledSourceNode.js +4 -4
  118. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
  119. package/lib/module/core/BaseAudioContext.js +11 -66
  120. package/lib/module/core/BaseAudioContext.js.map +1 -1
  121. package/lib/module/core/OfflineAudioContext.js +2 -11
  122. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  123. package/lib/module/core/OscillatorNode.js +0 -6
  124. package/lib/module/core/OscillatorNode.js.map +1 -1
  125. package/lib/module/hooks/{useSystemVolume.js → useSytemVolume.js} +1 -1
  126. package/lib/module/hooks/useSytemVolume.js.map +1 -0
  127. package/lib/module/utils/index.js +0 -8
  128. package/lib/module/utils/index.js.map +1 -1
  129. package/lib/module/web-core/AudioContext.js +0 -4
  130. package/lib/module/web-core/AudioContext.js.map +1 -1
  131. package/lib/module/web-core/AudioScheduledSourceNode.js +1 -1
  132. package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
  133. package/lib/module/web-core/OfflineAudioContext.js +0 -4
  134. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  135. package/lib/typescript/api.d.ts +4 -8
  136. package/lib/typescript/api.d.ts.map +1 -1
  137. package/lib/typescript/api.web.d.ts +0 -1
  138. package/lib/typescript/api.web.d.ts.map +1 -1
  139. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +2 -2
  140. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  141. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  142. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  143. package/lib/typescript/core/AudioBufferSourceNode.d.ts +0 -4
  144. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
  145. package/lib/typescript/core/AudioContext.d.ts +0 -1
  146. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  147. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +1 -1
  148. package/lib/typescript/core/BaseAudioContext.d.ts +11 -19
  149. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  150. package/lib/typescript/core/OfflineAudioContext.d.ts +0 -1
  151. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  152. package/lib/typescript/core/OscillatorNode.d.ts +0 -3
  153. package/lib/typescript/core/OscillatorNode.d.ts.map +1 -1
  154. package/lib/typescript/events/types.d.ts +0 -2
  155. package/lib/typescript/events/types.d.ts.map +1 -1
  156. package/lib/typescript/hooks/{useSystemVolume.d.ts → useSytemVolume.d.ts} +1 -1
  157. package/lib/typescript/hooks/useSytemVolume.d.ts.map +1 -0
  158. package/lib/typescript/interfaces.d.ts +3 -21
  159. package/lib/typescript/interfaces.d.ts.map +1 -1
  160. package/lib/typescript/types.d.ts +1 -2
  161. package/lib/typescript/types.d.ts.map +1 -1
  162. package/lib/typescript/utils/index.d.ts +0 -8
  163. package/lib/typescript/utils/index.d.ts.map +1 -1
  164. package/lib/typescript/web-core/AudioBufferSourceNode.d.ts +1 -1
  165. package/lib/typescript/web-core/AudioContext.d.ts +2 -4
  166. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  167. package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +1 -1
  168. package/lib/typescript/web-core/BaseAudioContext.d.ts +0 -2
  169. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  170. package/lib/typescript/web-core/OfflineAudioContext.d.ts +2 -4
  171. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  172. package/package.json +2 -3
  173. package/src/api.ts +3 -12
  174. package/src/api.web.ts +0 -1
  175. package/src/core/AudioBufferBaseSourceNode.ts +9 -9
  176. package/src/core/AudioBufferQueueSourceNode.ts +9 -1
  177. package/src/core/AudioBufferSourceNode.ts +0 -28
  178. package/src/core/AudioContext.ts +1 -12
  179. package/src/core/AudioScheduledSourceNode.ts +5 -5
  180. package/src/core/BaseAudioContext.ts +13 -149
  181. package/src/core/OfflineAudioContext.ts +2 -18
  182. package/src/core/OscillatorNode.ts +0 -11
  183. package/src/events/types.ts +0 -2
  184. package/src/interfaces.ts +5 -59
  185. package/src/types.ts +1 -3
  186. package/src/utils/index.ts +0 -21
  187. package/src/web-core/AudioBufferSourceNode.tsx +1 -1
  188. package/src/web-core/AudioContext.tsx +2 -7
  189. package/src/web-core/AudioScheduledSourceNode.tsx +1 -1
  190. package/src/web-core/BaseAudioContext.tsx +0 -2
  191. package/src/web-core/OfflineAudioContext.tsx +2 -7
  192. package/android/src/main/cpp/audioapi/android/core/NativeAudioRecorder.hpp +0 -36
  193. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +0 -24
  194. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +0 -57
  195. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +0 -105
  196. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +0 -70
  197. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +0 -18
  198. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +0 -18
  199. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +0 -148
  200. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.h +0 -37
  201. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +0 -92
  202. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +0 -29
  203. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +0 -20
  204. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h +0 -19
  205. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +0 -21
  206. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +0 -21
  207. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +0 -41
  208. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +0 -28
  209. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +0 -69
  210. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +0 -33
  211. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +0 -73
  212. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +0 -29
  213. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +0 -94
  214. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +0 -46
  215. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +0 -60
  216. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +0 -25
  217. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +0 -152
  218. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +0 -37
  219. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +0 -52
  220. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h +0 -25
  221. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +0 -19
  222. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +0 -21
  223. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +0 -55
  224. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +0 -27
  225. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +0 -22
  226. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +0 -28
  227. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +0 -18
  228. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +0 -87
  229. package/common/cpp/audioapi/core/effects/WorkletNode.h +0 -65
  230. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +0 -89
  231. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +0 -52
  232. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +0 -51
  233. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +0 -26
  234. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +0 -82
  235. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +0 -47
  236. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +0 -52
  237. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +0 -9
  238. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +0 -73
  239. package/common/cpp/audioapi/utils/ThreadPool.hpp +0 -104
  240. package/common/cpp/test/AudioParamTest.cpp +0 -204
  241. package/lib/commonjs/core/ConstantSourceNode.js +0 -17
  242. package/lib/commonjs/core/ConstantSourceNode.js.map +0 -1
  243. package/lib/commonjs/core/WorkletNode.js +0 -11
  244. package/lib/commonjs/core/WorkletNode.js.map +0 -1
  245. package/lib/commonjs/core/WorkletProcessingNode.js +0 -11
  246. package/lib/commonjs/core/WorkletProcessingNode.js.map +0 -1
  247. package/lib/commonjs/core/WorkletSourceNode.js +0 -11
  248. package/lib/commonjs/core/WorkletSourceNode.js.map +0 -1
  249. package/lib/commonjs/hooks/useSystemVolume.js.map +0 -1
  250. package/lib/commonjs/web-core/ConstantSourceNode.js +0 -17
  251. package/lib/commonjs/web-core/ConstantSourceNode.js.map +0 -1
  252. package/lib/module/core/ConstantSourceNode.js +0 -11
  253. package/lib/module/core/ConstantSourceNode.js.map +0 -1
  254. package/lib/module/core/WorkletNode.js +0 -5
  255. package/lib/module/core/WorkletNode.js.map +0 -1
  256. package/lib/module/core/WorkletProcessingNode.js +0 -5
  257. package/lib/module/core/WorkletProcessingNode.js.map +0 -1
  258. package/lib/module/core/WorkletSourceNode.js +0 -5
  259. package/lib/module/core/WorkletSourceNode.js.map +0 -1
  260. package/lib/module/hooks/useSystemVolume.js.map +0 -1
  261. package/lib/module/web-core/ConstantSourceNode.js +0 -11
  262. package/lib/module/web-core/ConstantSourceNode.js.map +0 -1
  263. package/lib/typescript/core/ConstantSourceNode.d.ts +0 -9
  264. package/lib/typescript/core/ConstantSourceNode.d.ts.map +0 -1
  265. package/lib/typescript/core/WorkletNode.d.ts +0 -4
  266. package/lib/typescript/core/WorkletNode.d.ts.map +0 -1
  267. package/lib/typescript/core/WorkletProcessingNode.d.ts +0 -4
  268. package/lib/typescript/core/WorkletProcessingNode.d.ts.map +0 -1
  269. package/lib/typescript/core/WorkletSourceNode.d.ts +0 -4
  270. package/lib/typescript/core/WorkletSourceNode.d.ts.map +0 -1
  271. package/lib/typescript/hooks/useSystemVolume.d.ts.map +0 -1
  272. package/lib/typescript/web-core/ConstantSourceNode.d.ts +0 -8
  273. package/lib/typescript/web-core/ConstantSourceNode.d.ts.map +0 -1
  274. package/src/core/ConstantSourceNode.ts +0 -13
  275. package/src/core/WorkletNode.ts +0 -3
  276. package/src/core/WorkletProcessingNode.ts +0 -3
  277. package/src/core/WorkletSourceNode.ts +0 -3
  278. package/src/web-core/ConstantSourceNode.tsx +0 -12
  279. /package/common/cpp/audioapi/HostObjects/{destinations/AudioDestinationNodeHostObject.h → AudioDestinationNodeHostObject.h} +0 -0
  280. /package/common/cpp/audioapi/HostObjects/{effects/PeriodicWaveHostObject.h → PeriodicWaveHostObject.h} +0 -0
  281. /package/common/cpp/audioapi/core/{utils/AudioParamEventQueue.h → AudioParamEventQueue.h} +0 -0
  282. /package/src/hooks/{useSystemVolume.ts → useSytemVolume.ts} +0 -0
@@ -1,26 +0,0 @@
1
- #pragma once
2
-
3
- #include <audioapi/core/AudioParam.h>
4
- #include <audioapi/core/sources/AudioScheduledSourceNode.h>
5
-
6
- #include <cmath>
7
- #include <memory>
8
- #include <string>
9
-
10
- namespace audioapi {
11
-
12
- class AudioBus;
13
-
14
- class ConstantSourceNode : public AudioScheduledSourceNode {
15
- public:
16
- explicit ConstantSourceNode(BaseAudioContext *context);
17
-
18
- [[nodiscard]] std::shared_ptr<AudioParam> getOffsetParam() const;
19
-
20
- protected:
21
- void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
22
-
23
- private:
24
- std::shared_ptr<AudioParam> offsetParam_;
25
- };
26
- } // namespace audioapi
@@ -1,82 +0,0 @@
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
- void WorkletSourceNode::processNode(
26
- const std::shared_ptr<AudioBus> &processingBus,
27
- int framesToProcess) {
28
- if (isUnscheduled() || isFinished() || !isEnabled()) {
29
- processingBus->zero();
30
- return;
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;
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;
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
-
82
- } // namespace audioapi
@@ -1,47 +0,0 @@
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
- void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override {}
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
- void 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
@@ -1,52 +0,0 @@
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
- };
@@ -1,9 +0,0 @@
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
@@ -1,73 +0,0 @@
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,104 +0,0 @@
1
- #pragma once
2
- #include <thread>
3
- #include <vector>
4
- #include <functional>
5
- #include <variant>
6
- #include <audioapi/utils/SpscChannel.hpp>
7
-
8
- namespace audioapi {
9
-
10
- /// @brief A simple thread pool implementation using lock-free SPSC channels for task scheduling and execution.
11
- /// @note The thread pool consists of a load balancer thread and multiple worker threads.
12
- /// @note The load balancer receives tasks and distributes them to worker threads in a round-robin fashion.
13
- /// @note Each worker thread has its own SPSC channel to receive tasks from the load balancer.
14
- /// @note The thread pool can be shut down gracefully by sending a stop event to the load balancer, which then propagates the stop event to all worker threads.
15
- /// @note IMPORTANT: ThreadPool is not thread-safe and events should be scheduled from a single thread only.
16
- class ThreadPool {
17
- struct StopEvent {};
18
- struct TaskEvent { std::function<void()> task; };
19
- using Event = std::variant<TaskEvent, StopEvent>;
20
-
21
- using Sender = channels::spsc::Sender<Event, channels::spsc::OverflowStrategy::WAIT_ON_FULL, channels::spsc::WaitStrategy::ATOMIC_WAIT>;
22
- using Receiver = channels::spsc::Receiver<Event, channels::spsc::OverflowStrategy::WAIT_ON_FULL, channels::spsc::WaitStrategy::ATOMIC_WAIT>;
23
- public:
24
- /// @brief Construct a new ThreadPool
25
- /// @param numThreads The number of worker threads to create
26
- /// @param loadBalancerQueueSize The size of the load balancer's queue
27
- /// @param workerQueueSize The size of each worker thread's queue
28
- ThreadPool(size_t numThreads, size_t loadBalancerQueueSize = 32, size_t workerQueueSize = 32) {
29
- auto [sender, receiver] = channels::spsc::channel<Event, channels::spsc::OverflowStrategy::WAIT_ON_FULL, channels::spsc::WaitStrategy::ATOMIC_WAIT>(loadBalancerQueueSize);
30
- loadBalancerSender = std::move(sender);
31
- std::vector<Sender> workerSenders;
32
- workerSenders.reserve(numThreads);
33
- for (size_t i = 0; i < numThreads; ++i) {
34
- auto [workerSender, workerReceiver] = channels::spsc::channel<Event, channels::spsc::OverflowStrategy::WAIT_ON_FULL, channels::spsc::WaitStrategy::ATOMIC_WAIT>(workerQueueSize);
35
- workers.emplace_back(&ThreadPool::workerThreadFunc, this, std::move(workerReceiver));
36
- workerSenders.emplace_back(std::move(workerSender));
37
- }
38
- loadBalancerThread = std::thread(&ThreadPool::loadBalancerThreadFunc, this, std::move(receiver), std::move(workerSenders));
39
- }
40
- ~ThreadPool() {
41
- loadBalancerSender.send(StopEvent{});
42
- loadBalancerThread.join();
43
- for (auto& worker : workers) {
44
- worker.join();
45
- }
46
- }
47
-
48
- /// @brief Schedule a task to be executed by the thread pool
49
- /// @param task The task to be executed
50
- /// @note This function is lock-free and most of the time wait-free, but may block if the load balancer queue is full.
51
- /// @note Please remember that the task will be executed in a different thread, so make sure to capture any required variables by value.
52
- /// @note The task should not throw exceptions, as they will not be caught.
53
- /// @note The task should end at some point, otherwise the thread pool will never be able to shut down.
54
- /// @note IMPORTANT: This function is not thread-safe and should be called from a single thread only.
55
- void schedule(std::function<void()> &&task) noexcept {
56
- loadBalancerSender.send(TaskEvent{std::move(task)});
57
- }
58
-
59
- private:
60
- std::thread loadBalancerThread;
61
- std::vector<std::thread> workers;
62
- Sender loadBalancerSender;
63
-
64
- void workerThreadFunc(Receiver &&receiver) {
65
- Receiver localReceiver = std::move(receiver);
66
- while (true) {
67
- auto event = localReceiver.receive();
68
- /// We use [[unlikely]] and [[likely]] attributes to help the compiler optimize the branching.
69
- /// we expect most of the time to receive TaskEvent, and rarely StopEvent.
70
- /// and whenever we receive StopEvent we can burn some cycles as it will not be expected to execute fast.
71
- if (std::holds_alternative<StopEvent>(event)) [[ unlikely ]] {
72
- break;
73
- } else if (std::holds_alternative<TaskEvent>(event)) [[ likely ]] {
74
- std::get<TaskEvent>(event).task();
75
- }
76
- }
77
- }
78
-
79
- void loadBalancerThreadFunc(Receiver &&receiver, std::vector<Sender> &&workerSenders) {
80
- Receiver localReceiver = std::move(receiver);
81
- std::vector<Sender> localWorkerSenders = std::move(workerSenders);
82
- size_t nextWorker = 0;
83
- while (true) {
84
- auto event = localReceiver.receive();
85
- /// We use [[unlikely]] and [[likely]] attributes to help the compiler optimize the branching.
86
- /// we expect most of the time to receive TaskEvent, and rarely StopEvent.
87
- /// and whenever we receive StopEvent we can burn some cycles as it will not be expected to execute fast.
88
- if (std::holds_alternative<StopEvent>(event)) [[ unlikely ]] {
89
- // Propagate stop event to all workers
90
- for (size_t i = 0; i < localWorkerSenders.size(); ++i) {
91
- localWorkerSenders[i].send(StopEvent{});
92
- }
93
- break;
94
- } else if (std::holds_alternative<TaskEvent>(event)) [[ likely ]] {
95
- // Dispatch task to the next worker in round-robin fashion
96
- auto& taskEvent = std::get<TaskEvent>(event);
97
- localWorkerSenders[nextWorker].send(std::move(taskEvent));
98
- nextWorker = (nextWorker + 1) % localWorkerSenders.size();
99
- }
100
- }
101
- }
102
- };
103
-
104
- }; // namespace audioapi
@@ -1,204 +0,0 @@
1
- #include <audioapi/core/AudioParam.h>
2
- #include <audioapi/core/OfflineAudioContext.h>
3
- #include <audioapi/core/utils/worklets/SafeIncludes.h>
4
- #include <gtest/gtest.h>
5
- #include "MockAudioEventHandlerRegistry.h"
6
-
7
- using namespace audioapi;
8
-
9
- class AudioParamTest : public ::testing::Test {
10
- protected:
11
- std::shared_ptr<IAudioEventHandlerRegistry> eventRegistry;
12
- std::unique_ptr<OfflineAudioContext> context;
13
- static constexpr int sampleRate = 44100;
14
-
15
- void SetUp() override {
16
- eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
17
- context = std::make_unique<OfflineAudioContext>(
18
- 2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
19
- }
20
- };
21
-
22
- TEST_F(AudioParamTest, ValueSetters) {
23
- AudioParam param = AudioParam(0.5, 0.0, 1.0, context.get());
24
- param.setValue(0.8);
25
- EXPECT_FLOAT_EQ(param.getValue(), 0.8);
26
- param.setValue(-0.5);
27
- EXPECT_FLOAT_EQ(param.getValue(), 0.0);
28
- param.setValue(1.5);
29
- EXPECT_FLOAT_EQ(param.getValue(), 1.0);
30
- }
31
-
32
- TEST_F(AudioParamTest, SetValueAtTime) {
33
- AudioParam param = AudioParam(0.5, 0.0, 1.0, context.get());
34
- param.setValueAtTime(0.8, 0.1);
35
- param.setValueAtTime(0.3, 0.2);
36
-
37
- float value = param.processKRateParam(1, 0.05);
38
- EXPECT_FLOAT_EQ(value, 0.5);
39
-
40
- value = param.processKRateParam(1, 0.1);
41
- EXPECT_FLOAT_EQ(value, 0.8);
42
-
43
- value = param.processKRateParam(1, 0.15);
44
- EXPECT_FLOAT_EQ(value, 0.8);
45
-
46
- value = param.processKRateParam(1, 0.2);
47
- EXPECT_FLOAT_EQ(value, 0.3);
48
-
49
- value = param.processKRateParam(1, 0.25);
50
- EXPECT_FLOAT_EQ(value, 0.3);
51
- }
52
-
53
- TEST_F(AudioParamTest, LinearRampToValueAtTime) {
54
- AudioParam param = AudioParam(0, 0, 1.0, context.get());
55
- param.linearRampToValueAtTime(1.0, 0.2);
56
-
57
- float value = param.processKRateParam(1, 0.05);
58
- EXPECT_FLOAT_EQ(value, 0.25);
59
-
60
- value = param.processKRateParam(1, 0.1);
61
- EXPECT_FLOAT_EQ(value, 0.5);
62
-
63
- value = param.processKRateParam(1, 0.15);
64
- EXPECT_FLOAT_EQ(value, 0.75);
65
-
66
- value = param.processKRateParam(1, 0.2);
67
- EXPECT_FLOAT_EQ(value, 1.0);
68
-
69
- value = param.processKRateParam(1, 0.25);
70
- EXPECT_FLOAT_EQ(value, 1.0);
71
- }
72
-
73
- TEST_F(AudioParamTest, ExponentialRampToValueAtTime) {
74
- AudioParam param = AudioParam(0.1, 0.0, 1.0, context.get());
75
- param.exponentialRampToValueAtTime(1.0, 0.2);
76
- // value(time) = startValue * (endValue/startValue)^((time -
77
- // startTime)/(endTime - startTime)) value(time) = 0.1 * (1.0/0.1)^((time -
78
- // 0.0)/(0.2 - 0.0))
79
- float value = param.processKRateParam(1, 0.05);
80
- EXPECT_NEAR(value, 0.17783, 1e-5);
81
-
82
- value = param.processKRateParam(1, 0.1);
83
- EXPECT_NEAR(value, 0.316228, 1e-5);
84
-
85
- value = param.processKRateParam(1, 0.15);
86
- EXPECT_NEAR(value, 0.562341, 1e-5);
87
-
88
- value = param.processKRateParam(1, 0.2);
89
- EXPECT_FLOAT_EQ(value, 1.0);
90
-
91
- value = param.processKRateParam(1, 0.25);
92
- EXPECT_FLOAT_EQ(value, 1.0);
93
- }
94
-
95
- TEST_F(AudioParamTest, SetTargetAtTime) {
96
- AudioParam param = AudioParam(0.0, 0.0, 1.0, context.get());
97
- param.setTargetAtTime(1.0, 0.1, 0.1);
98
- // value(time) = target + (startValue - target) * exp(-(time -
99
- // startTime)/timeConstant) value(time) = 1.0 + (0.0 - 1.0) * exp(-time/0.1)
100
- float value = param.processKRateParam(1, 0.05);
101
- EXPECT_FLOAT_EQ(value, 0.0);
102
-
103
- value = param.processKRateParam(1, 0.1);
104
- EXPECT_FLOAT_EQ(value, 0.0);
105
-
106
- value = param.processKRateParam(1, 0.15);
107
- EXPECT_NEAR(value, 0.393469, 1e-5);
108
-
109
- value = param.processKRateParam(1, 0.2);
110
- EXPECT_NEAR(value, 0.632120, 1e-5);
111
-
112
- value = param.processKRateParam(1, 0.25);
113
- EXPECT_NEAR(value, 0.776869, 1e-5);
114
-
115
- value = param.processKRateParam(1, 0.5);
116
- EXPECT_NEAR(value, 0.981684, 1e-5);
117
- }
118
-
119
- TEST_F(AudioParamTest, SetValueCurveAtTime) {
120
- AudioParam param = AudioParam(0.0, 0.0, 1.0, context.get());
121
- param.setValue(0.5);
122
- auto curve = std::make_shared<std::vector<float>>(
123
- std::vector<float>{0.1, 0.4, 0.2, 0.8, 0.5});
124
- param.setValueCurveAtTime(curve, curve->size(), 0.1, 0.2);
125
- // 5 elements over 0.2s => each element is 0.04s apart
126
-
127
- float value = param.processKRateParam(1, 0.05);
128
- EXPECT_FLOAT_EQ(value, 0.0);
129
-
130
- value = param.processKRateParam(1, 0.1);
131
- EXPECT_FLOAT_EQ(value, 0.1);
132
-
133
- // k = 4/0.2 * (0.14 - 0.1) = 0.8 -> floor is 0
134
- // linear interpolation between 0 and 1 -> 0.1 + (0.4 - 0.1) * 0.8 = 0.34
135
- value = param.processKRateParam(1, 0.14);
136
- EXPECT_FLOAT_EQ(value, 0.34);
137
-
138
- // k = 4/0.2 * (0.18 - 0.1) = 1.6 -> floor is 1
139
- // linear interpolation between 1 and 2 -> 0.4 + (0.2 - 0.4) * 0.6 = 0.28
140
- value = param.processKRateParam(1, 0.18);
141
- EXPECT_FLOAT_EQ(value, 0.28);
142
-
143
- // k = 4/0.2 * (0.22 - 0.1) = 2.4 -> floor is 2
144
- // linear interpolation between 2 and 3 -> 0.2 + (0.8 - 0.2) * 0.4 = 0.44
145
- value = param.processKRateParam(1, 0.22);
146
- EXPECT_FLOAT_EQ(value, 0.44);
147
-
148
- // k = 4/0.2 * (0.26 - 0.1) = 3.2 -> floor is 3
149
- // linear interpolation between 3 and 4 -> 0.8 + (0.5 - 0.8) * 0.2 = 0.74
150
- value = param.processKRateParam(1, 0.26);
151
- EXPECT_FLOAT_EQ(value, 0.74);
152
-
153
- // k = 4/0.2 * (0.3 - 0.1) = 4.0 -> floor is 4
154
- // at or after end of curve -> last value
155
- value = param.processKRateParam(1, 0.35);
156
- EXPECT_FLOAT_EQ(value, 0.5);
157
- }
158
-
159
- TEST_F(AudioParamTest, CancelScheduledValues) {
160
- AudioParam param = AudioParam(0.0, 0.0, 1.0, context.get());
161
- param.setValueAtTime(0.8, 0.1);
162
- param.setValueAtTime(0.3, 0.2);
163
- param.linearRampToValueAtTime(1.0, 0.4);
164
- param.cancelScheduledValues(0.15);
165
-
166
- float value = param.processKRateParam(1, 0.05);
167
- EXPECT_FLOAT_EQ(value, 0.0);
168
-
169
- value = param.processKRateParam(1, 0.1);
170
- EXPECT_FLOAT_EQ(value, 0.8);
171
-
172
- value = param.processKRateParam(1, 0.15);
173
- EXPECT_FLOAT_EQ(value, 0.8);
174
-
175
- // Events after cancel time are removed -> stays at last value
176
- value = param.processKRateParam(1, 0.2);
177
- EXPECT_FLOAT_EQ(value, 0.8);
178
-
179
- value = param.processKRateParam(1, 0.25);
180
- EXPECT_FLOAT_EQ(value, 0.8);
181
- }
182
-
183
- TEST_F(AudioParamTest, CancelAndHoldAtTime) {
184
- AudioParam param = AudioParam(0.0, 0.0, 1.0, context.get());
185
- param.setValueAtTime(0.8, 0.1);
186
- param.linearRampToValueAtTime(1.0, 0.2);
187
- param.cancelAndHoldAtTime(0.15);
188
-
189
- float value = param.processKRateParam(1, 0.05);
190
- EXPECT_FLOAT_EQ(value, 0.0);
191
-
192
- value = param.processKRateParam(1, 0.1);
193
- EXPECT_FLOAT_EQ(value, 0.8);
194
-
195
- value = param.processKRateParam(1, 0.15);
196
- EXPECT_FLOAT_EQ(value, 0.9);
197
-
198
- // Events after cancel time are removed -> stays at last value
199
- value = param.processKRateParam(1, 0.2);
200
- EXPECT_FLOAT_EQ(value, 0.9);
201
-
202
- value = param.processKRateParam(1, 0.25);
203
- EXPECT_FLOAT_EQ(value, 0.9);
204
- }
@@ -1,17 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _AudioParam = _interopRequireDefault(require("./AudioParam"));
8
- var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
- class ConstantSourceNode extends _AudioScheduledSourceNode.default {
11
- constructor(context, node) {
12
- super(context, node);
13
- this.offset = new _AudioParam.default(node.offset, context);
14
- }
15
- }
16
- exports.default = ConstantSourceNode;
17
- //# sourceMappingURL=ConstantSourceNode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_AudioParam","_interopRequireDefault","require","_AudioScheduledSourceNode","e","__esModule","default","ConstantSourceNode","AudioScheduledSourceNode","constructor","context","node","offset","AudioParam","exports"],"sourceRoot":"../../../src","sources":["core/ConstantSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,yBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAkE,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGnD,MAAMG,kBAAkB,SAASC,iCAAwB,CAAC;EAGvEC,WAAWA,CAACC,OAAyB,EAAEC,IAAyB,EAAE;IAChE,KAAK,CAACD,OAAO,EAAEC,IAAI,CAAC;IACpB,IAAI,CAACC,MAAM,GAAG,IAAIC,mBAAU,CAACF,IAAI,CAACC,MAAM,EAAEF,OAAO,CAAC;EACpD;AACF;AAACI,OAAA,CAAAR,OAAA,GAAAC,kBAAA","ignoreList":[]}
@@ -1,11 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _AudioNode = _interopRequireDefault(require("./AudioNode"));
8
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
- class WorkletNode extends _AudioNode.default {}
10
- exports.default = WorkletNode;
11
- //# sourceMappingURL=WorkletNode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_AudioNode","_interopRequireDefault","require","e","__esModule","default","WorkletNode","AudioNode","exports"],"sourceRoot":"../../../src","sources":["core/WorkletNode.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAoC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAErB,MAAMG,WAAW,SAASC,kBAAS,CAAC;AAAEC,OAAA,CAAAH,OAAA,GAAAC,WAAA","ignoreList":[]}
@@ -1,11 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _AudioNode = _interopRequireDefault(require("./AudioNode"));
8
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
- class WorkletProcessingNode extends _AudioNode.default {}
10
- exports.default = WorkletProcessingNode;
11
- //# sourceMappingURL=WorkletProcessingNode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_AudioNode","_interopRequireDefault","require","e","__esModule","default","WorkletProcessingNode","AudioNode","exports"],"sourceRoot":"../../../src","sources":["core/WorkletProcessingNode.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAoC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAErB,MAAMG,qBAAqB,SAASC,kBAAS,CAAC;AAAEC,OAAA,CAAAH,OAAA,GAAAC,qBAAA","ignoreList":[]}
@@ -1,11 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
8
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
- class WorkletSourceNode extends _AudioScheduledSourceNode.default {}
10
- exports.default = WorkletSourceNode;
11
- //# sourceMappingURL=WorkletSourceNode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_AudioScheduledSourceNode","_interopRequireDefault","require","e","__esModule","default","WorkletSourceNode","AudioScheduledSourceNode","exports"],"sourceRoot":"../../../src","sources":["core/WorkletSourceNode.ts"],"mappings":";;;;;;AAAA,IAAAA,yBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAkE,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEnD,MAAMG,iBAAiB,SAASC,iCAAwB,CAAC;AAAEC,OAAA,CAAAH,OAAA,GAAAC,iBAAA","ignoreList":[]}