react-native-audio-api 0.0.1 → 0.2.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 (242) hide show
  1. package/README.md +60 -1
  2. package/RNAudioAPI.podspec +46 -0
  3. package/android/CMakeLists.txt +74 -0
  4. package/android/build.gradle +194 -0
  5. package/android/gradle.properties +5 -0
  6. package/android/libs/fftw3/arm64-v8a/libfftw3.a +0 -0
  7. package/android/libs/fftw3/armeabi-v7a/libfftw3.a +0 -0
  8. package/android/libs/fftw3/x86/libfftw3.a +0 -0
  9. package/android/libs/fftw3/x86_64/libfftw3.a +0 -0
  10. package/android/libs/include/fftw3/fftw3.h +413 -0
  11. package/android/src/main/AndroidManifest.xml +3 -0
  12. package/android/src/main/AndroidManifestNew.xml +2 -0
  13. package/android/src/main/cpp/AudioAPIInstaller/AudioAPIInstaller.cpp +22 -0
  14. package/android/src/main/cpp/AudioAPIInstaller/AudioAPIInstaller.h +48 -0
  15. package/android/src/main/cpp/AudioPlayer/AudioPlayer.cpp +66 -0
  16. package/android/src/main/cpp/AudioPlayer/AudioPlayer.h +33 -0
  17. package/android/src/main/cpp/OnLoad.cpp +9 -0
  18. package/android/src/main/java/com/swmansion/audioapi/AudioAPIPackage.kt +14 -0
  19. package/android/src/main/java/com/swmansion/audioapi/module/AudioAPIInstaller.kt +21 -0
  20. package/android/src/main/java/com/swmansion/audioapi/nativemodules/AudioAPIModule.kt +25 -0
  21. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerHostObject.cpp +52 -0
  22. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerHostObject.h +45 -0
  23. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerWrapper.h +38 -0
  24. package/common/cpp/AudioAPIInstaller/android/AudioAPIInstallerWrapper.cpp +16 -0
  25. package/common/cpp/AudioAPIInstaller/ios/AudioAPIInstallerWrapper.cpp +12 -0
  26. package/common/cpp/HostObjects/AudioBufferHostObject.cpp +143 -0
  27. package/common/cpp/HostObjects/AudioBufferHostObject.h +33 -0
  28. package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.cpp +79 -0
  29. package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.h +37 -0
  30. package/common/cpp/HostObjects/AudioContextHostObject.cpp +54 -0
  31. package/common/cpp/HostObjects/AudioContextHostObject.h +36 -0
  32. package/common/cpp/HostObjects/AudioDestinationNodeHostObject.cpp +33 -0
  33. package/common/cpp/HostObjects/AudioDestinationNodeHostObject.h +31 -0
  34. package/common/cpp/HostObjects/AudioNodeHostObject.cpp +102 -0
  35. package/common/cpp/HostObjects/AudioNodeHostObject.h +29 -0
  36. package/common/cpp/HostObjects/AudioParamHostObject.cpp +115 -0
  37. package/common/cpp/HostObjects/AudioParamHostObject.h +34 -0
  38. package/common/cpp/HostObjects/AudioScheduledSourceNodeHostObject.cpp +73 -0
  39. package/common/cpp/HostObjects/AudioScheduledSourceNodeHostObject.h +31 -0
  40. package/common/cpp/HostObjects/BaseAudioContextHostObject.cpp +214 -0
  41. package/common/cpp/HostObjects/BaseAudioContextHostObject.h +39 -0
  42. package/common/cpp/HostObjects/BiquadFilterNodeHostObject.cpp +125 -0
  43. package/common/cpp/HostObjects/BiquadFilterNodeHostObject.h +42 -0
  44. package/common/cpp/HostObjects/Constants.h +22 -0
  45. package/common/cpp/HostObjects/GainNodeHostObject.cpp +41 -0
  46. package/common/cpp/HostObjects/GainNodeHostObject.h +32 -0
  47. package/common/cpp/HostObjects/OscillatorNodeHostObject.cpp +88 -0
  48. package/common/cpp/HostObjects/OscillatorNodeHostObject.h +41 -0
  49. package/common/cpp/HostObjects/PeriodicWaveHostObject.cpp +33 -0
  50. package/common/cpp/HostObjects/PeriodicWaveHostObject.h +33 -0
  51. package/common/cpp/HostObjects/StereoPannerNodeHostObject.cpp +41 -0
  52. package/common/cpp/HostObjects/StereoPannerNodeHostObject.h +36 -0
  53. package/common/cpp/core/AudioArray.cpp +103 -0
  54. package/common/cpp/core/AudioArray.h +42 -0
  55. package/common/cpp/core/AudioBuffer.cpp +55 -0
  56. package/common/cpp/core/AudioBuffer.h +40 -0
  57. package/common/cpp/core/AudioBufferSourceNode.cpp +135 -0
  58. package/common/cpp/core/AudioBufferSourceNode.h +30 -0
  59. package/common/cpp/core/AudioBus.cpp +357 -0
  60. package/common/cpp/core/AudioBus.h +63 -0
  61. package/common/cpp/core/AudioContext.cpp +24 -0
  62. package/common/cpp/core/AudioContext.h +16 -0
  63. package/common/cpp/core/AudioDestinationNode.cpp +45 -0
  64. package/common/cpp/core/AudioDestinationNode.h +32 -0
  65. package/common/cpp/core/AudioNode.cpp +222 -0
  66. package/common/cpp/core/AudioNode.h +74 -0
  67. package/common/cpp/core/AudioNodeManager.cpp +72 -0
  68. package/common/cpp/core/AudioNodeManager.h +35 -0
  69. package/common/cpp/core/AudioParam.cpp +133 -0
  70. package/common/cpp/core/AudioParam.h +50 -0
  71. package/common/cpp/core/AudioScheduledSourceNode.cpp +53 -0
  72. package/common/cpp/core/AudioScheduledSourceNode.h +34 -0
  73. package/common/cpp/core/BaseAudioContext.cpp +157 -0
  74. package/common/cpp/core/BaseAudioContext.h +80 -0
  75. package/common/cpp/core/BiquadFilterNode.cpp +385 -0
  76. package/common/cpp/core/BiquadFilterNode.h +124 -0
  77. package/common/cpp/core/GainNode.cpp +30 -0
  78. package/common/cpp/core/GainNode.h +25 -0
  79. package/common/cpp/core/OscillatorNode.cpp +75 -0
  80. package/common/cpp/core/OscillatorNode.h +72 -0
  81. package/common/cpp/core/ParamChange.cpp +46 -0
  82. package/common/cpp/core/ParamChange.h +34 -0
  83. package/common/cpp/core/PeriodicWave.cpp +362 -0
  84. package/common/cpp/core/PeriodicWave.h +119 -0
  85. package/common/cpp/core/StereoPannerNode.cpp +56 -0
  86. package/common/cpp/core/StereoPannerNode.h +26 -0
  87. package/common/cpp/types/BiquadFilterType.h +19 -0
  88. package/common/cpp/types/ChannelCountMode.h +10 -0
  89. package/common/cpp/types/ChannelInterpretation.h +10 -0
  90. package/common/cpp/types/ContextState.h +10 -0
  91. package/common/cpp/types/OscillatorType.h +11 -0
  92. package/common/cpp/utils/FFTFrame.h +63 -0
  93. package/common/cpp/utils/Locker.h +47 -0
  94. package/common/cpp/utils/VectorMath.cpp +678 -0
  95. package/common/cpp/utils/VectorMath.h +71 -0
  96. package/common/cpp/utils/android/FFTFrame.cpp +22 -0
  97. package/common/cpp/utils/ios/FFTFrame.cpp +24 -0
  98. package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.cpp +45 -0
  99. package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.h +26 -0
  100. package/common/cpp/wrappers/AudioBufferWrapper.cpp +46 -0
  101. package/common/cpp/wrappers/AudioBufferWrapper.h +30 -0
  102. package/common/cpp/wrappers/AudioContextWrapper.cpp +17 -0
  103. package/common/cpp/wrappers/AudioContextWrapper.h +19 -0
  104. package/common/cpp/wrappers/AudioDestinationNodeWrapper.h +16 -0
  105. package/common/cpp/wrappers/AudioNodeWrapper.cpp +37 -0
  106. package/common/cpp/wrappers/AudioNodeWrapper.h +25 -0
  107. package/common/cpp/wrappers/AudioParamWrapper.cpp +42 -0
  108. package/common/cpp/wrappers/AudioParamWrapper.h +25 -0
  109. package/common/cpp/wrappers/AudioScheduledSourceNodeWrapper.cpp +23 -0
  110. package/common/cpp/wrappers/AudioScheduledSourceNodeWrapper.h +23 -0
  111. package/common/cpp/wrappers/BaseAudioContextWrapper.cpp +76 -0
  112. package/common/cpp/wrappers/BaseAudioContextWrapper.h +49 -0
  113. package/common/cpp/wrappers/BiquadFilterNodeWrapper.cpp +60 -0
  114. package/common/cpp/wrappers/BiquadFilterNodeWrapper.h +37 -0
  115. package/common/cpp/wrappers/GainNodeWrapper.cpp +14 -0
  116. package/common/cpp/wrappers/GainNodeWrapper.h +20 -0
  117. package/common/cpp/wrappers/OscillatorNodeWrapper.cpp +44 -0
  118. package/common/cpp/wrappers/OscillatorNodeWrapper.h +31 -0
  119. package/common/cpp/wrappers/PeriodicWaveWrapper.h +17 -0
  120. package/common/cpp/wrappers/StereoPannerNodeWrapper.cpp +16 -0
  121. package/common/cpp/wrappers/StereoPannerNodeWrapper.h +21 -0
  122. package/ios/AudioAPIModule.h +24 -0
  123. package/ios/AudioAPIModule.mm +44 -0
  124. package/ios/AudioPlayer/AudioPlayer.h +28 -0
  125. package/ios/AudioPlayer/AudioPlayer.m +119 -0
  126. package/ios/AudioPlayer/IOSAudioPlayer.h +33 -0
  127. package/ios/AudioPlayer/IOSAudioPlayer.mm +57 -0
  128. package/lib/module/core/AudioBuffer.js +37 -0
  129. package/lib/module/core/AudioBuffer.js.map +1 -0
  130. package/lib/module/core/AudioBufferSourceNode.js +28 -0
  131. package/lib/module/core/AudioBufferSourceNode.js.map +1 -0
  132. package/lib/module/core/AudioContext.js +10 -0
  133. package/lib/module/core/AudioContext.js.map +1 -0
  134. package/lib/module/core/AudioDestinationNode.js +7 -0
  135. package/lib/module/core/AudioDestinationNode.js.map +1 -0
  136. package/lib/module/core/AudioNode.js +22 -0
  137. package/lib/module/core/AudioNode.js.map +1 -0
  138. package/lib/module/core/AudioParam.js +35 -0
  139. package/lib/module/core/AudioParam.js.map +1 -0
  140. package/lib/module/core/AudioScheduledSourceNode.js +28 -0
  141. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -0
  142. package/lib/module/core/BaseAudioContext.js +57 -0
  143. package/lib/module/core/BaseAudioContext.js.map +1 -0
  144. package/lib/module/core/BiquadFilterNode.js +25 -0
  145. package/lib/module/core/BiquadFilterNode.js.map +1 -0
  146. package/lib/module/core/GainNode.js +9 -0
  147. package/lib/module/core/GainNode.js.map +1 -0
  148. package/lib/module/core/OscillatorNode.js +24 -0
  149. package/lib/module/core/OscillatorNode.js.map +1 -0
  150. package/lib/module/core/PeriodicWave.js +8 -0
  151. package/lib/module/core/PeriodicWave.js.map +1 -0
  152. package/lib/module/core/StereoPannerNode.js +9 -0
  153. package/lib/module/core/StereoPannerNode.js.map +1 -0
  154. package/lib/module/core/types.js +2 -0
  155. package/lib/module/core/types.js.map +1 -0
  156. package/lib/module/errors/IndexSizeError.js +8 -0
  157. package/lib/module/errors/IndexSizeError.js.map +1 -0
  158. package/lib/module/errors/InvalidAccessError.js +8 -0
  159. package/lib/module/errors/InvalidAccessError.js.map +1 -0
  160. package/lib/module/errors/InvalidStateError.js +8 -0
  161. package/lib/module/errors/InvalidStateError.js.map +1 -0
  162. package/lib/module/errors/RangeError.js +8 -0
  163. package/lib/module/errors/RangeError.js.map +1 -0
  164. package/lib/module/errors/index.js +5 -0
  165. package/lib/module/errors/index.js.map +1 -0
  166. package/lib/module/index.js +18 -0
  167. package/lib/module/index.js.map +1 -0
  168. package/lib/module/interfaces.js +2 -0
  169. package/lib/module/interfaces.js.map +1 -0
  170. package/lib/module/modules/global.d.js +2 -0
  171. package/lib/module/modules/global.d.js.map +1 -0
  172. package/lib/module/utils/install.js +22 -0
  173. package/lib/module/utils/install.js.map +1 -0
  174. package/lib/typescript/core/AudioBuffer.d.ts +12 -0
  175. package/lib/typescript/core/AudioBuffer.d.ts.map +1 -0
  176. package/lib/typescript/core/AudioBufferSourceNode.d.ts +12 -0
  177. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -0
  178. package/lib/typescript/core/AudioContext.d.ts +6 -0
  179. package/lib/typescript/core/AudioContext.d.ts.map +1 -0
  180. package/lib/typescript/core/AudioDestinationNode.d.ts +7 -0
  181. package/lib/typescript/core/AudioDestinationNode.d.ts.map +1 -0
  182. package/lib/typescript/core/AudioNode.d.ts +16 -0
  183. package/lib/typescript/core/AudioNode.d.ts.map +1 -0
  184. package/lib/typescript/core/AudioParam.d.ts +14 -0
  185. package/lib/typescript/core/AudioParam.d.ts.map +1 -0
  186. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +10 -0
  187. package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -0
  188. package/lib/typescript/core/BaseAudioContext.d.ts +26 -0
  189. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -0
  190. package/lib/typescript/core/BiquadFilterNode.d.ts +16 -0
  191. package/lib/typescript/core/BiquadFilterNode.d.ts.map +1 -0
  192. package/lib/typescript/core/GainNode.d.ts +9 -0
  193. package/lib/typescript/core/GainNode.d.ts.map +1 -0
  194. package/lib/typescript/core/OscillatorNode.d.ts +15 -0
  195. package/lib/typescript/core/OscillatorNode.d.ts.map +1 -0
  196. package/lib/typescript/core/PeriodicWave.d.ts +5 -0
  197. package/lib/typescript/core/PeriodicWave.d.ts.map +1 -0
  198. package/lib/typescript/core/StereoPannerNode.d.ts +9 -0
  199. package/lib/typescript/core/StereoPannerNode.d.ts.map +1 -0
  200. package/lib/typescript/core/types.d.ts +9 -0
  201. package/lib/typescript/core/types.d.ts.map +1 -0
  202. package/lib/typescript/errors/IndexSizeError.d.ts +5 -0
  203. package/lib/typescript/errors/IndexSizeError.d.ts.map +1 -0
  204. package/lib/typescript/errors/InvalidAccessError.d.ts +5 -0
  205. package/lib/typescript/errors/InvalidAccessError.d.ts.map +1 -0
  206. package/lib/typescript/errors/InvalidStateError.d.ts +5 -0
  207. package/lib/typescript/errors/InvalidStateError.d.ts.map +1 -0
  208. package/lib/typescript/errors/RangeError.d.ts +5 -0
  209. package/lib/typescript/errors/RangeError.d.ts.map +1 -0
  210. package/lib/typescript/errors/index.d.ts +5 -0
  211. package/lib/typescript/errors/index.d.ts.map +1 -0
  212. package/lib/typescript/index.d.ts +14 -0
  213. package/lib/typescript/index.d.ts.map +1 -0
  214. package/lib/typescript/interfaces.d.ts +78 -0
  215. package/lib/typescript/interfaces.d.ts.map +1 -0
  216. package/lib/typescript/utils/install.d.ts +7 -0
  217. package/lib/typescript/utils/install.d.ts.map +1 -0
  218. package/package.json +104 -5
  219. package/src/core/AudioBuffer.ts +68 -0
  220. package/src/core/AudioBufferSourceNode.ts +35 -0
  221. package/src/core/AudioContext.ts +12 -0
  222. package/src/core/AudioDestinationNode.ts +9 -0
  223. package/src/core/AudioNode.ts +38 -0
  224. package/src/core/AudioParam.ts +55 -0
  225. package/src/core/AudioScheduledSourceNode.ts +43 -0
  226. package/src/core/BaseAudioContext.ts +97 -0
  227. package/src/core/BiquadFilterNode.ts +49 -0
  228. package/src/core/GainNode.ts +13 -0
  229. package/src/core/OscillatorNode.ts +37 -0
  230. package/src/core/PeriodicWave.ts +10 -0
  231. package/src/core/StereoPannerNode.ts +13 -0
  232. package/src/core/types.ts +26 -0
  233. package/src/errors/IndexSizeError.ts +8 -0
  234. package/src/errors/InvalidAccessError.ts +8 -0
  235. package/src/errors/InvalidStateError.ts +8 -0
  236. package/src/errors/RangeError.ts +8 -0
  237. package/src/errors/index.ts +4 -0
  238. package/src/index.ts +25 -0
  239. package/src/interfaces.ts +120 -0
  240. package/src/modules/global.d.ts +10 -0
  241. package/src/utils/install.ts +39 -0
  242. package/index.ts +0 -1
@@ -0,0 +1,125 @@
1
+ #include "BiquadFilterNodeHostObject.h"
2
+
3
+ namespace audioapi {
4
+ using namespace facebook;
5
+
6
+ std::shared_ptr<BiquadFilterNodeWrapper>
7
+ BiquadFilterNodeHostObject::getBiquadFilterNodeWrapperFromAudioNodeWrapper() {
8
+ return std::static_pointer_cast<BiquadFilterNodeWrapper>(wrapper_);
9
+ }
10
+
11
+ BiquadFilterNodeHostObject::BiquadFilterNodeHostObject(
12
+ const std::shared_ptr<BiquadFilterNodeWrapper> &wrapper)
13
+ : AudioNodeHostObject(wrapper) {
14
+ auto frequencyParam = wrapper->getFrequencyParam();
15
+ frequencyParam_ = AudioParamHostObject::createFromWrapper(frequencyParam);
16
+ auto detuneParam = wrapper->getDetuneParam();
17
+ detuneParam_ = AudioParamHostObject::createFromWrapper(detuneParam);
18
+ auto QParam = wrapper->getQParam();
19
+ QParam_ = AudioParamHostObject::createFromWrapper(QParam);
20
+ auto gainParam = wrapper->getGainParam();
21
+ gainParam_ = AudioParamHostObject::createFromWrapper(gainParam);
22
+ }
23
+
24
+ std::vector<jsi::PropNameID> BiquadFilterNodeHostObject::getPropertyNames(
25
+ jsi::Runtime &runtime) {
26
+ std::vector<jsi::PropNameID> propertyNames =
27
+ AudioNodeHostObject::getPropertyNames(runtime);
28
+ propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "frequency"));
29
+ propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "detune"));
30
+ propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "Q"));
31
+ propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "gain"));
32
+ propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "type"));
33
+ propertyNames.push_back(
34
+ jsi::PropNameID::forAscii(runtime, "getFrequencyResponse"));
35
+ return propertyNames;
36
+ }
37
+
38
+ jsi::Value BiquadFilterNodeHostObject::get(
39
+ jsi::Runtime &runtime,
40
+ const jsi::PropNameID &propNameId) {
41
+ auto propName = propNameId.utf8(runtime);
42
+
43
+ if (propName == "frequency") {
44
+ return jsi::Object::createFromHostObject(runtime, frequencyParam_);
45
+ }
46
+
47
+ if (propName == "detune") {
48
+ return jsi::Object::createFromHostObject(runtime, detuneParam_);
49
+ }
50
+
51
+ if (propName == "Q") {
52
+ return jsi::Object::createFromHostObject(runtime, QParam_);
53
+ }
54
+
55
+ if (propName == "gain") {
56
+ return jsi::Object::createFromHostObject(runtime, gainParam_);
57
+ }
58
+
59
+ if (propName == "type") {
60
+ auto wrapper = getBiquadFilterNodeWrapperFromAudioNodeWrapper();
61
+ auto waveType = wrapper->getType();
62
+ return jsi::String::createFromUtf8(runtime, waveType);
63
+ }
64
+
65
+ if (propName == "getFrequencyResponse") {
66
+ return jsi::Function::createFromHostFunction(
67
+ runtime,
68
+ propNameId,
69
+ 3,
70
+ [this](
71
+ jsi::Runtime &rt,
72
+ const jsi::Value &thisVal,
73
+ const jsi::Value *args,
74
+ size_t count) -> jsi::Value {
75
+ auto frequencyArray = args[0].getObject(rt).asArray(rt);
76
+ auto magResponseOut = args[1].getObject(rt).asArray(rt);
77
+ auto phaseResponseOut = args[2].getObject(rt).asArray(rt);
78
+
79
+ std::vector<float> frequencyArrayVector(frequencyArray.length(rt));
80
+ for (size_t i = 0; i < frequencyArray.length(rt); i++) {
81
+ frequencyArrayVector[i] = static_cast<float>(
82
+ frequencyArray.getValueAtIndex(rt, i).getNumber());
83
+ }
84
+
85
+ std::vector<float> magResponseOutVector(magResponseOut.length(rt));
86
+ std::vector<float> phaseResponseOutVector(
87
+ phaseResponseOut.length(rt));
88
+
89
+ auto wrapper = getBiquadFilterNodeWrapperFromAudioNodeWrapper();
90
+ wrapper->getFrequencyResponse(
91
+ frequencyArrayVector,
92
+ magResponseOutVector,
93
+ phaseResponseOutVector);
94
+
95
+ for (size_t i = 0; i < magResponseOutVector.size(); i++) {
96
+ magResponseOut.setValueAtIndex(rt, i, magResponseOutVector[i]);
97
+ }
98
+
99
+ for (size_t i = 0; i < phaseResponseOutVector.size(); i++) {
100
+ phaseResponseOut.setValueAtIndex(rt, i, phaseResponseOutVector[i]);
101
+ }
102
+
103
+ return jsi::Value::undefined();
104
+ });
105
+ }
106
+
107
+ return AudioNodeHostObject::get(runtime, propNameId);
108
+ }
109
+
110
+ void BiquadFilterNodeHostObject::set(
111
+ jsi::Runtime &runtime,
112
+ const jsi::PropNameID &propNameId,
113
+ const jsi::Value &value) {
114
+ auto propName = propNameId.utf8(runtime);
115
+
116
+ if (propName == "type") {
117
+ std::string filterType = value.getString(runtime).utf8(runtime);
118
+ auto wrapper = getBiquadFilterNodeWrapperFromAudioNodeWrapper();
119
+ wrapper->setType(filterType);
120
+ return;
121
+ }
122
+
123
+ return AudioNodeHostObject::set(runtime, propNameId, value);
124
+ }
125
+ } // namespace audioapi
@@ -0,0 +1,42 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <string>
5
+ #include <vector>
6
+
7
+ #include "AudioNodeHostObject.h"
8
+ #include "AudioParamHostObject.h"
9
+ #include "BiquadFilterNodeWrapper.h"
10
+
11
+ namespace audioapi {
12
+ using namespace facebook;
13
+
14
+ class BiquadFilterNodeHostObject : public AudioNodeHostObject {
15
+ public:
16
+ explicit BiquadFilterNodeHostObject(
17
+ const std::shared_ptr<BiquadFilterNodeWrapper> &wrapper);
18
+
19
+ jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
20
+
21
+ void set(
22
+ jsi::Runtime &runtime,
23
+ const jsi::PropNameID &name,
24
+ const jsi::Value &value) override;
25
+
26
+ std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
27
+
28
+ static std::shared_ptr<BiquadFilterNodeHostObject> createFromWrapper(
29
+ const std::shared_ptr<BiquadFilterNodeWrapper> &wrapper) {
30
+ return std::make_shared<BiquadFilterNodeHostObject>(wrapper);
31
+ }
32
+
33
+ private:
34
+ std::shared_ptr<AudioParamHostObject> frequencyParam_;
35
+ std::shared_ptr<AudioParamHostObject> detuneParam_;
36
+ std::shared_ptr<AudioParamHostObject> QParam_;
37
+ std::shared_ptr<AudioParamHostObject> gainParam_;
38
+
39
+ std::shared_ptr<BiquadFilterNodeWrapper>
40
+ getBiquadFilterNodeWrapperFromAudioNodeWrapper();
41
+ };
42
+ } // namespace audioapi
@@ -0,0 +1,22 @@
1
+ #pragma once
2
+
3
+ #include <cmath>
4
+ #include <limits>
5
+
6
+ // https://webaudio.github.io/web-audio-api/
7
+
8
+ namespace audioapi {
9
+ constexpr int SAMPLE_RATE = 44100;
10
+ constexpr int CHANNEL_COUNT = 2;
11
+ constexpr float MOST_POSITIVE_SINGLE_FLOAT =
12
+ static_cast<float>(std::numeric_limits<float>::max());
13
+ constexpr float NYQUIST_FREQUENCY = SAMPLE_RATE / 2.0;
14
+ static float MAX_DETUNE = 1200 * std::log2(MOST_POSITIVE_SINGLE_FLOAT);
15
+ constexpr float MAX_GAIN = MOST_POSITIVE_SINGLE_FLOAT;
16
+ constexpr float MAX_PAN = 1.0;
17
+ constexpr float MAX_FILTER_Q = MOST_POSITIVE_SINGLE_FLOAT;
18
+ constexpr float MAX_FILTER_FREQUENCY = NYQUIST_FREQUENCY;
19
+ constexpr float MIN_FILTER_FREQUENCY = 0.0;
20
+ static float MAX_FILTER_GAIN = 40 * std::log10(MOST_POSITIVE_SINGLE_FLOAT);
21
+ constexpr float MIN_FILTER_GAIN = -MAX_GAIN;
22
+ } // namespace audioapi
@@ -0,0 +1,41 @@
1
+ #include "GainNodeHostObject.h"
2
+
3
+ namespace audioapi {
4
+ using namespace facebook;
5
+
6
+ GainNodeHostObject::GainNodeHostObject(
7
+ const std::shared_ptr<GainNodeWrapper> &wrapper)
8
+ : AudioNodeHostObject(wrapper) {
9
+ auto gainParamWrapper = wrapper->getGainParam();
10
+ gainParam_ = AudioParamHostObject::createFromWrapper(gainParamWrapper);
11
+ }
12
+
13
+ std::vector<jsi::PropNameID> GainNodeHostObject::getPropertyNames(
14
+ jsi::Runtime &runtime) {
15
+ std::vector<jsi::PropNameID> propertyNames =
16
+ AudioNodeHostObject::getPropertyNames(runtime);
17
+ propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "gain"));
18
+ return propertyNames;
19
+ }
20
+
21
+ jsi::Value GainNodeHostObject::get(
22
+ jsi::Runtime &runtime,
23
+ const jsi::PropNameID &propNameId) {
24
+ auto propName = propNameId.utf8(runtime);
25
+
26
+ if (propName == "gain") {
27
+ return jsi::Object::createFromHostObject(runtime, gainParam_);
28
+ }
29
+
30
+ return AudioNodeHostObject::get(runtime, propNameId);
31
+ }
32
+
33
+ void GainNodeHostObject::set(
34
+ jsi::Runtime &runtime,
35
+ const jsi::PropNameID &propNameId,
36
+ const jsi::Value &value) {
37
+ auto propName = propNameId.utf8(runtime);
38
+
39
+ return AudioNodeHostObject::set(runtime, propNameId, value);
40
+ }
41
+ } // namespace audioapi
@@ -0,0 +1,32 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <vector>
5
+
6
+ #include "AudioNodeHostObject.h"
7
+ #include "AudioParamHostObject.h"
8
+ #include "GainNodeWrapper.h"
9
+
10
+ namespace audioapi {
11
+ using namespace facebook;
12
+
13
+ class GainNodeHostObject : public AudioNodeHostObject {
14
+ protected:
15
+ std::shared_ptr<AudioParamHostObject> gainParam_;
16
+
17
+ public:
18
+ explicit GainNodeHostObject(const std::shared_ptr<GainNodeWrapper> &wrapper);
19
+
20
+ jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
21
+ void set(
22
+ jsi::Runtime &runtime,
23
+ const jsi::PropNameID &name,
24
+ const jsi::Value &value) override;
25
+ std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
26
+
27
+ static std::shared_ptr<GainNodeHostObject> createFromWrapper(
28
+ const std::shared_ptr<GainNodeWrapper> &wrapper) {
29
+ return std::make_shared<GainNodeHostObject>(wrapper);
30
+ }
31
+ };
32
+ } // namespace audioapi
@@ -0,0 +1,88 @@
1
+ #include "OscillatorNodeHostObject.h"
2
+
3
+ namespace audioapi {
4
+ using namespace facebook;
5
+
6
+ std::shared_ptr<OscillatorNodeWrapper>
7
+ OscillatorNodeHostObject::getOscillatorNodeWrapperFromAudioNodeWrapper() {
8
+ return std::static_pointer_cast<OscillatorNodeWrapper>(wrapper_);
9
+ }
10
+
11
+ OscillatorNodeHostObject::OscillatorNodeHostObject(
12
+ const std::shared_ptr<OscillatorNodeWrapper> &wrapper)
13
+ : AudioScheduledSourceNodeHostObject(wrapper) {
14
+ auto frequencyParam = wrapper->getFrequencyParam();
15
+ frequencyParam_ = AudioParamHostObject::createFromWrapper(frequencyParam);
16
+ auto detuneParam = wrapper->getDetuneParam();
17
+ detuneParam_ = AudioParamHostObject::createFromWrapper(detuneParam);
18
+ }
19
+
20
+ std::vector<jsi::PropNameID> OscillatorNodeHostObject::getPropertyNames(
21
+ jsi::Runtime &runtime) {
22
+ std::vector<jsi::PropNameID> propertyNames =
23
+ AudioScheduledSourceNodeHostObject::getPropertyNames(runtime);
24
+ propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "frequency"));
25
+ propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "detune"));
26
+ propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "type"));
27
+ propertyNames.push_back(
28
+ jsi::PropNameID::forAscii(runtime, "setPeriodicWave"));
29
+ return propertyNames;
30
+ }
31
+
32
+ jsi::Value OscillatorNodeHostObject::get(
33
+ jsi::Runtime &runtime,
34
+ const jsi::PropNameID &propNameId) {
35
+ auto propName = propNameId.utf8(runtime);
36
+
37
+ if (propName == "frequency") {
38
+ return jsi::Object::createFromHostObject(runtime, frequencyParam_);
39
+ }
40
+
41
+ if (propName == "detune") {
42
+ return jsi::Object::createFromHostObject(runtime, detuneParam_);
43
+ }
44
+
45
+ if (propName == "type") {
46
+ auto wrapper = getOscillatorNodeWrapperFromAudioNodeWrapper();
47
+ auto waveType = wrapper->getType();
48
+ return jsi::String::createFromUtf8(runtime, waveType);
49
+ }
50
+
51
+ if (propName == "setPeriodicWave") {
52
+ return jsi::Function::createFromHostFunction(
53
+ runtime,
54
+ propNameId,
55
+ 1,
56
+ [this](
57
+ jsi::Runtime &rt,
58
+ const jsi::Value &thisVal,
59
+ const jsi::Value *args,
60
+ size_t count) -> jsi::Value {
61
+ auto wrapper = getOscillatorNodeWrapperFromAudioNodeWrapper();
62
+ auto periodicWaveHostObject =
63
+ args[0].getObject(rt).asHostObject<PeriodicWaveHostObject>(rt);
64
+
65
+ wrapper->setPeriodicWave(periodicWaveHostObject->wrapper_);
66
+ return jsi::Value::undefined();
67
+ });
68
+ }
69
+
70
+ return AudioScheduledSourceNodeHostObject::get(runtime, propNameId);
71
+ }
72
+
73
+ void OscillatorNodeHostObject::set(
74
+ jsi::Runtime &runtime,
75
+ const jsi::PropNameID &propNameId,
76
+ const jsi::Value &value) {
77
+ auto propName = propNameId.utf8(runtime);
78
+
79
+ if (propName == "type") {
80
+ std::string waveType = value.getString(runtime).utf8(runtime);
81
+ auto wrapper = getOscillatorNodeWrapperFromAudioNodeWrapper();
82
+ wrapper->setType(waveType);
83
+ return;
84
+ }
85
+
86
+ return AudioScheduledSourceNodeHostObject::set(runtime, propNameId, value);
87
+ }
88
+ } // namespace audioapi
@@ -0,0 +1,41 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <string>
5
+ #include <vector>
6
+
7
+ #include "AudioParamHostObject.h"
8
+ #include "AudioScheduledSourceNodeHostObject.h"
9
+ #include "OscillatorNodeWrapper.h"
10
+ #include "PeriodicWaveHostObject.h"
11
+
12
+ namespace audioapi {
13
+ using namespace facebook;
14
+
15
+ class OscillatorNodeHostObject : public AudioScheduledSourceNodeHostObject {
16
+ public:
17
+ explicit OscillatorNodeHostObject(
18
+ const std::shared_ptr<OscillatorNodeWrapper> &wrapper);
19
+
20
+ jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
21
+
22
+ void set(
23
+ jsi::Runtime &runtime,
24
+ const jsi::PropNameID &name,
25
+ const jsi::Value &value) override;
26
+
27
+ std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
28
+
29
+ static std::shared_ptr<OscillatorNodeHostObject> createFromWrapper(
30
+ const std::shared_ptr<OscillatorNodeWrapper> &wrapper) {
31
+ return std::make_shared<OscillatorNodeHostObject>(wrapper);
32
+ }
33
+
34
+ private:
35
+ std::shared_ptr<AudioParamHostObject> frequencyParam_;
36
+ std::shared_ptr<AudioParamHostObject> detuneParam_;
37
+
38
+ std::shared_ptr<OscillatorNodeWrapper>
39
+ getOscillatorNodeWrapperFromAudioNodeWrapper();
40
+ };
41
+ } // namespace audioapi
@@ -0,0 +1,33 @@
1
+ #include "PeriodicWaveHostObject.h"
2
+
3
+ namespace audioapi {
4
+ using namespace facebook;
5
+
6
+ PeriodicWaveHostObject::PeriodicWaveHostObject(
7
+ const std::shared_ptr<PeriodicWaveWrapper> &wrapper)
8
+ : wrapper_(wrapper) {}
9
+
10
+ std::vector<jsi::PropNameID> PeriodicWaveHostObject::getPropertyNames(
11
+ jsi::Runtime &runtime) {
12
+ std::vector<jsi::PropNameID> propertyNames;
13
+ return propertyNames;
14
+ }
15
+
16
+ jsi::Value PeriodicWaveHostObject::get(
17
+ jsi::Runtime &runtime,
18
+ const jsi::PropNameID &propNameId) {
19
+ auto propName = propNameId.utf8(runtime);
20
+
21
+ throw std::runtime_error("Not yet implemented!");
22
+ }
23
+
24
+ void PeriodicWaveHostObject::set(
25
+ jsi::Runtime &runtime,
26
+ const jsi::PropNameID &propNameId,
27
+ const jsi::Value &value) {
28
+ auto propName = propNameId.utf8(runtime);
29
+
30
+ throw std::runtime_error("Not yet implemented!");
31
+ }
32
+
33
+ } // namespace audioapi
@@ -0,0 +1,33 @@
1
+ #pragma once
2
+
3
+ #include <jsi/jsi.h>
4
+ #include <memory>
5
+ #include <vector>
6
+
7
+ #include "PeriodicWaveWrapper.h"
8
+
9
+ namespace audioapi {
10
+ using namespace facebook;
11
+
12
+ class PeriodicWaveHostObject : public jsi::HostObject {
13
+ public:
14
+ std::shared_ptr<PeriodicWaveWrapper> wrapper_;
15
+
16
+ explicit PeriodicWaveHostObject(
17
+ const std::shared_ptr<PeriodicWaveWrapper> &wrapper);
18
+
19
+ jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
20
+
21
+ void set(
22
+ jsi::Runtime &runtime,
23
+ const jsi::PropNameID &name,
24
+ const jsi::Value &value) override;
25
+
26
+ std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
27
+
28
+ static std::shared_ptr<PeriodicWaveHostObject> createFromWrapper(
29
+ const std::shared_ptr<PeriodicWaveWrapper> &wrapper) {
30
+ return std::make_shared<PeriodicWaveHostObject>(wrapper);
31
+ }
32
+ };
33
+ } // namespace audioapi
@@ -0,0 +1,41 @@
1
+ #include "StereoPannerNodeHostObject.h"
2
+
3
+ namespace audioapi {
4
+ using namespace facebook;
5
+
6
+ StereoPannerNodeHostObject::StereoPannerNodeHostObject(
7
+ const std::shared_ptr<StereoPannerNodeWrapper> &wrapper)
8
+ : AudioNodeHostObject(wrapper) {
9
+ auto panParam = wrapper->getPanParam();
10
+ panParam_ = AudioParamHostObject::createFromWrapper(panParam);
11
+ }
12
+
13
+ std::vector<jsi::PropNameID> StereoPannerNodeHostObject::getPropertyNames(
14
+ jsi::Runtime &runtime) {
15
+ std::vector<jsi::PropNameID> propertyNames =
16
+ AudioNodeHostObject::getPropertyNames(runtime);
17
+ propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "pan"));
18
+ return propertyNames;
19
+ }
20
+
21
+ jsi::Value StereoPannerNodeHostObject::get(
22
+ jsi::Runtime &runtime,
23
+ const jsi::PropNameID &propNameId) {
24
+ auto propName = propNameId.utf8(runtime);
25
+
26
+ if (propName == "pan") {
27
+ return jsi::Object::createFromHostObject(runtime, panParam_);
28
+ }
29
+
30
+ return AudioNodeHostObject::get(runtime, propNameId);
31
+ }
32
+
33
+ void StereoPannerNodeHostObject::set(
34
+ jsi::Runtime &runtime,
35
+ const jsi::PropNameID &propNameId,
36
+ const jsi::Value &value) {
37
+ auto propName = propNameId.utf8(runtime);
38
+
39
+ return AudioNodeHostObject::set(runtime, propNameId, value);
40
+ }
41
+ } // namespace audioapi
@@ -0,0 +1,36 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <string>
5
+ #include <vector>
6
+
7
+ #include "AudioNodeHostObject.h"
8
+ #include "AudioParamHostObject.h"
9
+ #include "StereoPannerNodeWrapper.h"
10
+
11
+ namespace audioapi {
12
+ using namespace facebook;
13
+
14
+ class StereoPannerNodeHostObject : public AudioNodeHostObject {
15
+ public:
16
+ explicit StereoPannerNodeHostObject(
17
+ const std::shared_ptr<StereoPannerNodeWrapper> &wrapper);
18
+
19
+ jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
20
+
21
+ void set(
22
+ jsi::Runtime &runtime,
23
+ const jsi::PropNameID &name,
24
+ const jsi::Value &value) override;
25
+
26
+ std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
27
+
28
+ static std::shared_ptr<StereoPannerNodeHostObject> createFromWrapper(
29
+ const std::shared_ptr<StereoPannerNodeWrapper> &wrapper) {
30
+ return std::make_shared<StereoPannerNodeHostObject>(wrapper);
31
+ }
32
+
33
+ private:
34
+ std::shared_ptr<AudioParamHostObject> panParam_;
35
+ };
36
+ } // namespace audioapi
@@ -0,0 +1,103 @@
1
+ #include <algorithm>
2
+
3
+ #include "AudioArray.h"
4
+ #include "VectorMath.h"
5
+
6
+ namespace audioapi {
7
+
8
+ AudioArray::AudioArray(int size) : size_(size), data_(0) {
9
+ resize(size);
10
+ }
11
+
12
+ AudioArray::~AudioArray() {
13
+ if (data_) {
14
+ delete[] data_;
15
+ data_ = 0;
16
+ }
17
+ }
18
+
19
+ int AudioArray::getSize() const {
20
+ return size_;
21
+ }
22
+
23
+ float* AudioArray::getData() const {
24
+ return data_;
25
+ }
26
+
27
+ float& AudioArray::operator[](int index) {
28
+ return data_[index];
29
+ }
30
+
31
+ const float& AudioArray::operator[](int index) const {
32
+ return data_[index];
33
+ }
34
+
35
+ void AudioArray::normalize() {
36
+ float maxAbsValue = getMaxAbsValue();
37
+
38
+ if (maxAbsValue == 0.0f || maxAbsValue == 1.0f) {
39
+ return;
40
+ }
41
+
42
+ VectorMath::multiplyByScalar(data_, 1.0f / maxAbsValue, data_, size_);
43
+ }
44
+
45
+ void AudioArray::resize(int size) {
46
+ if (size == size_) {
47
+ if (!data_) {
48
+ data_ = new float[size];
49
+ }
50
+
51
+ zero(0, size);
52
+ return;
53
+ }
54
+
55
+ delete[] data_;
56
+ size_ = size;
57
+ data_ = new float[size_];
58
+
59
+ zero(0, size_);
60
+ }
61
+
62
+ void AudioArray::scale(float value) {
63
+ VectorMath::multiplyByScalar(data_, value, data_, size_);
64
+ }
65
+
66
+ float AudioArray::getMaxAbsValue() const {
67
+ return VectorMath::maximumMagnitude(data_, size_);
68
+ }
69
+
70
+ void AudioArray::zero() {
71
+ zero(0, size_);
72
+ }
73
+
74
+ void AudioArray::zero(int start, int length) {
75
+ memset(data_ + start, 0, length * sizeof(float));
76
+ }
77
+
78
+ void AudioArray::sum(const AudioArray* source) {
79
+ sum(source, 0, 0, size_);
80
+ }
81
+
82
+ void AudioArray::sum(const AudioArray* source, int start, int length) {
83
+ sum(source, start, start, length);
84
+ }
85
+
86
+ void AudioArray::sum(const AudioArray* source, int sourceStart, int destinationStart, int length) {
87
+ VectorMath::add(data_ + destinationStart, source->getData() + sourceStart, data_ + destinationStart, length);
88
+ }
89
+
90
+ void AudioArray::copy(const AudioArray* source) {
91
+ copy(source, 0, size_);
92
+ }
93
+
94
+ void AudioArray::copy(const AudioArray* source, int start, int length) {
95
+ copy(source, start, start, length);
96
+ }
97
+
98
+ void AudioArray::copy(const AudioArray* source, int sourceStart, int destinationStart, int length) {
99
+ memcpy(data_ + destinationStart, source->getData() + sourceStart, length * sizeof(float));
100
+ }
101
+
102
+ } // namespace audioapi
103
+
@@ -0,0 +1,42 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <algorithm>
5
+
6
+ namespace audioapi {
7
+
8
+ class AudioArray {
9
+ public:
10
+ explicit AudioArray(int size);
11
+ ~AudioArray();
12
+
13
+ [[nodiscard]] int getSize() const;
14
+ float* getData() const;
15
+
16
+
17
+ float& operator[](int index);
18
+ const float& operator[](int index) const;
19
+
20
+ void normalize();
21
+ void resize(int size);
22
+ void scale(float value);
23
+ float getMaxAbsValue() const;
24
+
25
+ void zero();
26
+ void zero(int start, int length);
27
+
28
+ void sum(const AudioArray* source);
29
+ void sum(const AudioArray* source, int start, int length);
30
+ void sum(const AudioArray* source, int sourceStart, int destinationStart, int length);
31
+
32
+ void copy(const AudioArray* source);
33
+ void copy(const AudioArray* source, int start, int length);
34
+ void copy(const AudioArray* source, int sourceStart, int destinationStart, int length);
35
+
36
+
37
+ private:
38
+ float *data_;
39
+ int size_;
40
+ };
41
+
42
+ } // namespace audioapi