react-native-audio-api 0.8.3-nightly-d178688-20250925 → 0.8.3-nightly-cae1f96-20250927

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 (136) hide show
  1. package/RNAudioAPI.podspec +8 -5
  2. package/android/build.gradle +44 -4
  3. package/android/src/main/cpp/audioapi/CMakeLists.txt +65 -0
  4. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +29 -1
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +14 -0
  6. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +7 -1
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +6 -1
  8. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +1 -1
  9. package/android/src/main/cpp/audioapi/android/core/NativeAudioRecorder.hpp +36 -0
  10. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +11 -1
  11. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +24 -0
  12. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +15 -2
  13. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +31 -13
  14. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +57 -0
  15. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +6 -46
  16. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +70 -6
  17. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.h +10 -66
  18. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +105 -0
  19. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +17 -91
  20. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +292 -6
  21. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +26 -242
  22. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +70 -0
  23. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +6 -50
  24. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +18 -0
  25. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +148 -0
  26. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.h +37 -0
  27. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +92 -0
  28. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +29 -0
  29. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +20 -0
  30. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h +19 -0
  31. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +21 -0
  32. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +21 -0
  33. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +41 -0
  34. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +28 -0
  35. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +69 -0
  36. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +33 -0
  37. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +73 -0
  38. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +29 -0
  39. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +94 -0
  40. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +46 -0
  41. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +60 -0
  42. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +25 -0
  43. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +133 -0
  44. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +34 -0
  45. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +52 -0
  46. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h +25 -0
  47. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +55 -0
  48. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +27 -0
  49. package/common/cpp/audioapi/HostObjects/{RecorderAdapterNodeHostObject.h → sources/RecorderAdapterNodeHostObject.h} +1 -2
  50. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +22 -0
  51. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +28 -0
  52. package/common/cpp/audioapi/core/AudioContext.cpp +3 -2
  53. package/common/cpp/audioapi/core/AudioContext.h +2 -1
  54. package/common/cpp/audioapi/core/AudioNode.h +1 -1
  55. package/common/cpp/audioapi/core/AudioParam.h +1 -1
  56. package/common/cpp/audioapi/core/BaseAudioContext.cpp +15 -1
  57. package/common/cpp/audioapi/core/BaseAudioContext.h +7 -3
  58. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +4 -3
  59. package/common/cpp/audioapi/core/OfflineAudioContext.h +2 -1
  60. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +1 -1
  61. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +1 -1
  62. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +86 -0
  63. package/common/cpp/audioapi/core/effects/WorkletNode.h +64 -0
  64. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +1 -1
  65. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +2 -2
  66. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +1 -1
  67. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +1 -1
  68. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +1 -1
  69. package/common/cpp/audioapi/core/sources/StreamerNode.h +0 -8
  70. package/common/cpp/audioapi/core/{AudioParamEventQueue.cpp → utils/AudioParamEventQueue.cpp} +1 -1
  71. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +45 -0
  72. package/common/cpp/audioapi/core/utils/worklets/UiWorkletsRunner.cpp +9 -0
  73. package/common/cpp/audioapi/core/utils/worklets/UiWorkletsRunner.h +73 -0
  74. package/common/cpp/audioapi/dsp/Windows.cpp +1 -1
  75. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +1 -1
  76. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +14 -1
  77. package/common/cpp/audioapi/jsi/JsiHostObject.h +6 -12
  78. package/common/cpp/audioapi/utils/AudioBus.cpp +1 -1
  79. package/common/cpp/test/CMakeLists.txt +8 -3
  80. package/common/cpp/test/GainTest.cpp +1 -1
  81. package/common/cpp/test/OscillatorTest.cpp +1 -1
  82. package/ios/audioapi/ios/AudioAPIModule.mm +32 -5
  83. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +1 -1
  84. package/ios/audioapi/ios/core/IOSAudioRecorder.h +1 -2
  85. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
  86. package/lib/commonjs/api.js +7 -0
  87. package/lib/commonjs/api.js.map +1 -1
  88. package/lib/commonjs/core/BaseAudioContext.js +29 -0
  89. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  90. package/lib/commonjs/core/WorkletNode.js +11 -0
  91. package/lib/commonjs/core/WorkletNode.js.map +1 -0
  92. package/lib/commonjs/utils/index.js +9 -0
  93. package/lib/commonjs/utils/index.js.map +1 -1
  94. package/lib/module/api.js +1 -0
  95. package/lib/module/api.js.map +1 -1
  96. package/lib/module/core/BaseAudioContext.js +29 -0
  97. package/lib/module/core/BaseAudioContext.js.map +1 -1
  98. package/lib/module/core/WorkletNode.js +5 -0
  99. package/lib/module/core/WorkletNode.js.map +1 -0
  100. package/lib/module/utils/index.js +8 -0
  101. package/lib/module/utils/index.js.map +1 -1
  102. package/lib/typescript/api.d.ts +1 -0
  103. package/lib/typescript/api.d.ts.map +1 -1
  104. package/lib/typescript/core/BaseAudioContext.d.ts +2 -0
  105. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  106. package/lib/typescript/core/WorkletNode.d.ts +4 -0
  107. package/lib/typescript/core/WorkletNode.d.ts.map +1 -0
  108. package/lib/typescript/interfaces.d.ts +3 -0
  109. package/lib/typescript/interfaces.d.ts.map +1 -1
  110. package/lib/typescript/utils/index.d.ts +2 -0
  111. package/lib/typescript/utils/index.d.ts.map +1 -1
  112. package/package.json +3 -2
  113. package/src/api.ts +1 -0
  114. package/src/core/BaseAudioContext.ts +51 -0
  115. package/src/core/WorkletNode.ts +3 -0
  116. package/src/interfaces.ts +7 -0
  117. package/src/utils/index.ts +10 -0
  118. package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +0 -149
  119. package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +0 -76
  120. package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +0 -120
  121. package/common/cpp/audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h +0 -67
  122. package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +0 -142
  123. package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +0 -86
  124. package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +0 -56
  125. package/common/cpp/audioapi/HostObjects/BiquadFilterNodeHostObject.h +0 -89
  126. package/common/cpp/audioapi/HostObjects/GainNodeHostObject.h +0 -27
  127. package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +0 -65
  128. package/common/cpp/audioapi/HostObjects/StereoPannerNodeHostObject.h +0 -29
  129. package/common/cpp/audioapi/HostObjects/StreamerNodeHostObject.h +0 -30
  130. package/common/cpp/audioapi/events/AudioEventHandlerRegistryHostObject.h +0 -48
  131. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.h +0 -7
  132. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.mm +0 -12
  133. /package/common/cpp/audioapi/HostObjects/{AudioDestinationNodeHostObject.h → destinations/AudioDestinationNodeHostObject.h} +0 -0
  134. /package/common/cpp/audioapi/HostObjects/{PeriodicWaveHostObject.h → effects/PeriodicWaveHostObject.h} +0 -0
  135. /package/common/cpp/audioapi/core/{AudioParamEventQueue.h → utils/AudioParamEventQueue.h} +0 -0
  136. /package/common/cpp/audioapi/core/{Constants.h → utils/Constants.h} +0 -0
@@ -1,9 +1,295 @@
1
1
  #include <audioapi/HostObjects/BaseAudioContextHostObject.h>
2
2
 
3
- // Explicitly define destructors here, as they to exist in order to act as a
4
- // "key function" for the audio classes - this allow for RTTI to work
5
- // properly across dynamic library boundaries (i.e. dynamic_cast that is used by
6
- // isHostObject method), android specific issue
3
+ #include <audioapi/HostObjects/WorkletNodeHostObject.h>
4
+ #include <audioapi/HostObjects/analysis/AnalyserNodeHostObject.h>
5
+ #include <audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h>
6
+ #include <audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h>
7
+ #include <audioapi/HostObjects/effects/GainNodeHostObject.h>
8
+ #include <audioapi/HostObjects/effects/PeriodicWaveHostObject.h>
9
+ #include <audioapi/HostObjects/effects/StereoPannerNodeHostObject.h>
10
+ #include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
11
+ #include <audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h>
12
+ #include <audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h>
13
+ #include <audioapi/HostObjects/sources/OscillatorNodeHostObject.h>
14
+ #include <audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h>
15
+ #include <audioapi/HostObjects/sources/StreamerNodeHostObject.h>
16
+ #include <audioapi/core/BaseAudioContext.h>
17
+ #include <audioapi/core/utils/worklets/UiWorkletsRunner.h>
18
+
7
19
  namespace audioapi {
8
- BaseAudioContextHostObject::~BaseAudioContextHostObject() = default;
9
- }
20
+
21
+ BaseAudioContextHostObject::BaseAudioContextHostObject(
22
+ const std::shared_ptr<BaseAudioContext> &context,
23
+ jsi::Runtime *runtime,
24
+ const std::shared_ptr<react::CallInvoker> &callInvoker)
25
+ : context_(context), callInvoker_(callInvoker) {
26
+ promiseVendor_ = std::make_shared<PromiseVendor>(runtime, callInvoker);
27
+
28
+ addGetters(
29
+ JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, destination),
30
+ JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, state),
31
+ JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, sampleRate),
32
+ JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, currentTime));
33
+
34
+ addFunctions(
35
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createWorkletNode),
36
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createRecorderAdapter),
37
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createOscillator),
38
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStreamer),
39
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createGain),
40
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStereoPanner),
41
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBiquadFilter),
42
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBufferSource),
43
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBufferQueueSource),
44
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBuffer),
45
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createPeriodicWave),
46
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createAnalyser),
47
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, decodeAudioData),
48
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, decodeAudioDataSource),
49
+ JSI_EXPORT_FUNCTION(
50
+ BaseAudioContextHostObject, decodePCMAudioDataInBase64));
51
+ }
52
+
53
+ JSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, destination) {
54
+ auto destination = std::make_shared<AudioDestinationNodeHostObject>(
55
+ context_->getDestination());
56
+ return jsi::Object::createFromHostObject(runtime, destination);
57
+ }
58
+
59
+ JSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, state) {
60
+ return jsi::String::createFromUtf8(runtime, context_->getState());
61
+ }
62
+
63
+ JSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, sampleRate) {
64
+ return {context_->getSampleRate()};
65
+ }
66
+
67
+ JSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, currentTime) {
68
+ return {context_->getCurrentTime()};
69
+ }
70
+
71
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletNode) {
72
+ #if RN_AUDIO_API_ENABLE_WORKLETS
73
+ auto shareableWorklet =
74
+ worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(
75
+ runtime, args[0]);
76
+ auto bufferLength = static_cast<size_t>(args[1].getNumber());
77
+ auto inputChannelCount = static_cast<size_t>(args[2].getNumber());
78
+
79
+ auto workletNode = context_->createWorkletNode(
80
+ shareableWorklet, bufferLength, inputChannelCount);
81
+ auto workletNodeHostObject =
82
+ std::make_shared<WorkletNodeHostObject>(workletNode);
83
+ return jsi::Object::createFromHostObject(runtime, workletNodeHostObject);
84
+ #endif
85
+ return jsi::Value::undefined();
86
+ }
87
+
88
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createRecorderAdapter) {
89
+ auto recorderAdapter = context_->createRecorderAdapter();
90
+ auto recorderAdapterHostObject =
91
+ std::make_shared<RecorderAdapterNodeHostObject>(recorderAdapter);
92
+ return jsi::Object::createFromHostObject(runtime, recorderAdapterHostObject);
93
+ }
94
+
95
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createOscillator) {
96
+ auto oscillator = context_->createOscillator();
97
+ auto oscillatorHostObject =
98
+ std::make_shared<OscillatorNodeHostObject>(oscillator);
99
+ return jsi::Object::createFromHostObject(runtime, oscillatorHostObject);
100
+ }
101
+
102
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createStreamer) {
103
+ auto streamer = context_->createStreamer();
104
+ auto streamerHostObject = std::make_shared<StreamerNodeHostObject>(streamer);
105
+ auto object = jsi::Object::createFromHostObject(runtime, streamerHostObject);
106
+ object.setExternalMemoryPressure(
107
+ runtime, StreamerNodeHostObject::getSizeInBytes());
108
+ return object;
109
+ }
110
+
111
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createGain) {
112
+ auto gain = context_->createGain();
113
+ auto gainHostObject = std::make_shared<GainNodeHostObject>(gain);
114
+ return jsi::Object::createFromHostObject(runtime, gainHostObject);
115
+ }
116
+
117
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createStereoPanner) {
118
+ auto stereoPanner = context_->createStereoPanner();
119
+ auto stereoPannerHostObject =
120
+ std::make_shared<StereoPannerNodeHostObject>(stereoPanner);
121
+ return jsi::Object::createFromHostObject(runtime, stereoPannerHostObject);
122
+ }
123
+
124
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createBiquadFilter) {
125
+ auto biquadFilter = context_->createBiquadFilter();
126
+ auto biquadFilterHostObject =
127
+ std::make_shared<BiquadFilterNodeHostObject>(biquadFilter);
128
+ return jsi::Object::createFromHostObject(runtime, biquadFilterHostObject);
129
+ }
130
+
131
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createBufferSource) {
132
+ auto pitchCorrection = args[0].asBool();
133
+ auto bufferSource = context_->createBufferSource(pitchCorrection);
134
+ auto bufferSourceHostObject =
135
+ std::make_shared<AudioBufferSourceNodeHostObject>(bufferSource);
136
+ return jsi::Object::createFromHostObject(runtime, bufferSourceHostObject);
137
+ }
138
+
139
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createBufferQueueSource) {
140
+ auto pitchCorrection = args[0].asBool();
141
+ auto bufferSource = context_->createBufferQueueSource(pitchCorrection);
142
+ auto bufferStreamSourceHostObject =
143
+ std::make_shared<AudioBufferQueueSourceNodeHostObject>(bufferSource);
144
+ return jsi::Object::createFromHostObject(
145
+ runtime, bufferStreamSourceHostObject);
146
+ }
147
+
148
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createBuffer) {
149
+ auto numberOfChannels = static_cast<int>(args[0].getNumber());
150
+ auto length = static_cast<size_t>(args[1].getNumber());
151
+ auto sampleRate = static_cast<float>(args[2].getNumber());
152
+ auto buffer =
153
+ BaseAudioContext::createBuffer(numberOfChannels, length, sampleRate);
154
+ auto bufferHostObject = std::make_shared<AudioBufferHostObject>(buffer);
155
+
156
+ auto jsiObject = jsi::Object::createFromHostObject(runtime, bufferHostObject);
157
+ jsiObject.setExternalMemoryPressure(
158
+ runtime, bufferHostObject->getSizeInBytes());
159
+
160
+ return jsiObject;
161
+ }
162
+
163
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createPeriodicWave) {
164
+ auto arrayBufferReal = args[0]
165
+ .getObject(runtime)
166
+ .getPropertyAsObject(runtime, "buffer")
167
+ .getArrayBuffer(runtime);
168
+ auto real = reinterpret_cast<float *>(arrayBufferReal.data(runtime));
169
+ auto length = static_cast<int>(arrayBufferReal.size(runtime));
170
+
171
+ auto arrayBufferImag = args[1]
172
+ .getObject(runtime)
173
+ .getPropertyAsObject(runtime, "buffer")
174
+ .getArrayBuffer(runtime);
175
+ auto imag = reinterpret_cast<float *>(arrayBufferImag.data(runtime));
176
+
177
+ auto disableNormalization = args[2].getBool();
178
+
179
+ auto complexData = std::vector<std::complex<float>>(length);
180
+
181
+ for (size_t i = 0; i < length; i++) {
182
+ complexData[i] = std::complex<float>(
183
+ static_cast<float>(real[i]), static_cast<float>(imag[i]));
184
+ }
185
+
186
+ auto periodicWave =
187
+ context_->createPeriodicWave(complexData, disableNormalization, length);
188
+ auto periodicWaveHostObject =
189
+ std::make_shared<PeriodicWaveHostObject>(periodicWave);
190
+
191
+ return jsi::Object::createFromHostObject(runtime, periodicWaveHostObject);
192
+ }
193
+
194
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createAnalyser) {
195
+ auto analyser = context_->createAnalyser();
196
+ auto analyserHostObject = std::make_shared<AnalyserNodeHostObject>(analyser);
197
+ return jsi::Object::createFromHostObject(runtime, analyserHostObject);
198
+ }
199
+
200
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, decodeAudioDataSource) {
201
+ auto sourcePath = args[0].getString(runtime).utf8(runtime);
202
+
203
+ auto promise = promiseVendor_->createPromise(
204
+ [this, sourcePath](std::shared_ptr<Promise> promise) {
205
+ std::thread([this, sourcePath, promise = std::move(promise)]() {
206
+ auto results = context_->decodeAudioDataSource(sourcePath);
207
+
208
+ if (!results) {
209
+ promise->reject("Failed to decode audio data source.");
210
+ return;
211
+ }
212
+
213
+ auto audioBufferHostObject =
214
+ std::make_shared<AudioBufferHostObject>(results);
215
+
216
+ promise->resolve([audioBufferHostObject = std::move(
217
+ audioBufferHostObject)](jsi::Runtime &runtime) {
218
+ auto jsiObject = jsi::Object::createFromHostObject(
219
+ runtime, audioBufferHostObject);
220
+ jsiObject.setExternalMemoryPressure(
221
+ runtime, audioBufferHostObject->getSizeInBytes());
222
+ return jsiObject;
223
+ });
224
+ }).detach();
225
+ });
226
+
227
+ return promise;
228
+ }
229
+
230
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, decodeAudioData) {
231
+ auto arrayBuffer = args[0]
232
+ .getObject(runtime)
233
+ .getPropertyAsObject(runtime, "buffer")
234
+ .getArrayBuffer(runtime);
235
+ auto data = arrayBuffer.data(runtime);
236
+ auto size = static_cast<int>(arrayBuffer.size(runtime));
237
+
238
+ auto promise = promiseVendor_->createPromise(
239
+ [this, data, size](std::shared_ptr<Promise> promise) {
240
+ std::thread([this, data, size, promise = std::move(promise)]() {
241
+ auto results = context_->decodeAudioData(data, size);
242
+
243
+ if (!results) {
244
+ promise->reject("Failed to decode audio data source.");
245
+ return;
246
+ }
247
+
248
+ auto audioBufferHostObject =
249
+ std::make_shared<AudioBufferHostObject>(results);
250
+
251
+ promise->resolve([audioBufferHostObject = std::move(
252
+ audioBufferHostObject)](jsi::Runtime &runtime) {
253
+ auto jsiObject = jsi::Object::createFromHostObject(
254
+ runtime, audioBufferHostObject);
255
+ jsiObject.setExternalMemoryPressure(
256
+ runtime, audioBufferHostObject->getSizeInBytes());
257
+ return jsiObject;
258
+ });
259
+ }).detach();
260
+ });
261
+
262
+ return promise;
263
+ }
264
+
265
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, decodePCMAudioDataInBase64) {
266
+ auto b64 = args[0].getString(runtime).utf8(runtime);
267
+ auto playbackSpeed = static_cast<float>(args[1].getNumber());
268
+
269
+ auto promise = promiseVendor_->createPromise(
270
+ [this, b64, playbackSpeed](std::shared_ptr<Promise> promise) {
271
+ std::thread([this, b64, playbackSpeed, promise = std::move(promise)]() {
272
+ auto results = context_->decodeWithPCMInBase64(b64, playbackSpeed);
273
+
274
+ if (!results) {
275
+ promise->reject("Failed to decode audio data source.");
276
+ return;
277
+ }
278
+
279
+ auto audioBufferHostObject =
280
+ std::make_shared<AudioBufferHostObject>(results);
281
+
282
+ promise->resolve([audioBufferHostObject = std::move(
283
+ audioBufferHostObject)](jsi::Runtime &runtime) {
284
+ auto jsiObject = jsi::Object::createFromHostObject(
285
+ runtime, audioBufferHostObject);
286
+ jsiObject.setExternalMemoryPressure(
287
+ runtime, audioBufferHostObject->getSizeInBytes());
288
+ return jsiObject;
289
+ });
290
+ }).detach();
291
+ });
292
+
293
+ return promise;
294
+ }
295
+ } // namespace audioapi
@@ -2,19 +2,6 @@
2
2
 
3
3
  #include <audioapi/jsi/JsiHostObject.h>
4
4
  #include <audioapi/jsi/JsiPromise.h>
5
- #include <audioapi/HostObjects/AudioBufferHostObject.h>
6
- #include <audioapi/HostObjects/AudioBufferSourceNodeHostObject.h>
7
- #include <audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h>
8
- #include <audioapi/HostObjects/AudioDestinationNodeHostObject.h>
9
- #include <audioapi/core/BaseAudioContext.h>
10
- #include <audioapi/HostObjects/BiquadFilterNodeHostObject.h>
11
- #include <audioapi/HostObjects/GainNodeHostObject.h>
12
- #include <audioapi/HostObjects/OscillatorNodeHostObject.h>
13
- #include <audioapi/HostObjects/PeriodicWaveHostObject.h>
14
- #include <audioapi/HostObjects/StereoPannerNodeHostObject.h>
15
- #include <audioapi/HostObjects/AnalyserNodeHostObject.h>
16
- #include <audioapi/HostObjects/RecorderAdapterNodeHostObject.h>
17
- #include <audioapi/HostObjects/StreamerNodeHostObject.h>
18
5
 
19
6
  #include <jsi/jsi.h>
20
7
  #include <memory>
@@ -25,240 +12,37 @@
25
12
  namespace audioapi {
26
13
  using namespace facebook;
27
14
 
15
+ class BaseAudioContext;
16
+
28
17
  class BaseAudioContextHostObject : public JsiHostObject {
29
18
  public:
30
19
  explicit BaseAudioContextHostObject(
31
20
  const std::shared_ptr<BaseAudioContext> &context,
32
21
  jsi::Runtime *runtime,
33
- const std::shared_ptr<react::CallInvoker> &callInvoker)
34
- : context_(context), callInvoker_(callInvoker) {
35
- promiseVendor_ = std::make_shared<PromiseVendor>(runtime, callInvoker);
36
-
37
- addGetters(
38
- JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, destination),
39
- JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, state),
40
- JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, sampleRate),
41
- JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, currentTime));
42
-
43
- addFunctions(
44
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createRecorderAdapter),
45
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createOscillator),
46
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStreamer),
47
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createGain),
48
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStereoPanner),
49
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBiquadFilter),
50
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBufferSource),
51
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBufferQueueSource),
52
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBuffer),
53
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createPeriodicWave),
54
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createAnalyser),
55
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, decodeAudioData),
56
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, decodeAudioDataSource),
57
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, decodePCMAudioDataInBase64));
58
- }
59
-
60
- ~BaseAudioContextHostObject() override;
61
-
62
- JSI_PROPERTY_GETTER(destination) {
63
- auto destination = std::make_shared<AudioDestinationNodeHostObject>(
64
- context_->getDestination());
65
- return jsi::Object::createFromHostObject(runtime, destination);
66
- }
67
-
68
- JSI_PROPERTY_GETTER(state) {
69
- return jsi::String::createFromUtf8(runtime, context_->getState());
70
- }
71
-
72
- JSI_PROPERTY_GETTER(sampleRate) {
73
- return {context_->getSampleRate()};
74
- }
75
-
76
- JSI_PROPERTY_GETTER(currentTime) {
77
- return {context_->getCurrentTime()};
78
- }
79
-
80
- JSI_HOST_FUNCTION(createRecorderAdapter) {
81
- auto recorderAdapter = context_->createRecorderAdapter();
82
- auto recorderAdapterHostObject = std::make_shared<RecorderAdapterNodeHostObject>(recorderAdapter);
83
- return jsi::Object::createFromHostObject(runtime, recorderAdapterHostObject);
84
- }
85
-
86
- JSI_HOST_FUNCTION(createOscillator) {
87
- auto oscillator = context_->createOscillator();
88
- auto oscillatorHostObject =
89
- std::make_shared<OscillatorNodeHostObject>(oscillator);
90
- return jsi::Object::createFromHostObject(runtime, oscillatorHostObject);
91
- }
92
-
93
- JSI_HOST_FUNCTION(createStreamer) {
94
- auto streamer = context_->createStreamer();
95
- auto streamerHostObject =
96
- std::make_shared<StreamerNodeHostObject>(streamer);
97
- auto object = jsi::Object::createFromHostObject(runtime, streamerHostObject);
98
- object.setExternalMemoryPressure(runtime, StreamerNode::getEstimatedSize());
99
- return object;
100
- }
101
-
102
- JSI_HOST_FUNCTION(createGain) {
103
- auto gain = context_->createGain();
104
- auto gainHostObject = std::make_shared<GainNodeHostObject>(gain);
105
- return jsi::Object::createFromHostObject(runtime, gainHostObject);
106
- }
107
-
108
- JSI_HOST_FUNCTION(createStereoPanner) {
109
- auto stereoPanner = context_->createStereoPanner();
110
- auto stereoPannerHostObject =
111
- std::make_shared<StereoPannerNodeHostObject>(stereoPanner);
112
- return jsi::Object::createFromHostObject(runtime, stereoPannerHostObject);
113
- }
114
-
115
- JSI_HOST_FUNCTION(createBiquadFilter) {
116
- auto biquadFilter = context_->createBiquadFilter();
117
- auto biquadFilterHostObject =
118
- std::make_shared<BiquadFilterNodeHostObject>(biquadFilter);
119
- return jsi::Object::createFromHostObject(runtime, biquadFilterHostObject);
120
- }
121
-
122
- JSI_HOST_FUNCTION(createBufferSource) {
123
- auto pitchCorrection = args[0].asBool();
124
- auto bufferSource = context_->createBufferSource(pitchCorrection);
125
- auto bufferSourceHostObject =
126
- std::make_shared<AudioBufferSourceNodeHostObject>(bufferSource);
127
- return jsi::Object::createFromHostObject(runtime, bufferSourceHostObject);
128
- }
129
-
130
- JSI_HOST_FUNCTION(createBufferQueueSource) {
131
- auto pitchCorrection = args[0].asBool();
132
- auto bufferSource = context_->createBufferQueueSource(pitchCorrection);
133
- auto bufferStreamSourceHostObject =
134
- std::make_shared<AudioBufferQueueSourceNodeHostObject>(bufferSource);
135
- return jsi::Object::createFromHostObject(runtime, bufferStreamSourceHostObject);
136
- }
137
-
138
- JSI_HOST_FUNCTION(createBuffer) {
139
- auto numberOfChannels = static_cast<int>(args[0].getNumber());
140
- auto length = static_cast<size_t>(args[1].getNumber());
141
- auto sampleRate = static_cast<float>(args[2].getNumber());
142
- auto buffer = BaseAudioContext::createBuffer(numberOfChannels, length, sampleRate);
143
- auto bufferHostObject = std::make_shared<AudioBufferHostObject>(buffer);
144
-
145
- auto jsiObject = jsi::Object::createFromHostObject(runtime, bufferHostObject);
146
- jsiObject.setExternalMemoryPressure(runtime, bufferHostObject->getSizeInBytes());
147
-
148
- return jsiObject;
149
- }
150
-
151
- JSI_HOST_FUNCTION(createPeriodicWave) {
152
- auto arrayBufferReal = args[0].getObject(runtime).getPropertyAsObject(runtime, "buffer").getArrayBuffer(runtime);
153
- auto real = reinterpret_cast<float *>(arrayBufferReal.data(runtime));
154
- auto length = static_cast<int>(arrayBufferReal.size(runtime));
155
-
156
- auto arrayBufferImag = args[1].getObject(runtime).getPropertyAsObject(runtime, "buffer").getArrayBuffer(runtime);
157
- auto imag = reinterpret_cast<float *>(arrayBufferImag.data(runtime));
158
-
159
- auto disableNormalization = args[2].getBool();
160
-
161
- auto complexData = std::vector<std::complex<float>>(length);
162
-
163
- for (size_t i = 0; i < length; i++) {
164
- complexData[i] = std::complex<float>(
165
- static_cast<float>(real[i]),
166
- static_cast<float>(imag[i]));
167
- }
168
-
169
- auto periodicWave = context_->createPeriodicWave(
170
- complexData, disableNormalization, length);
171
- auto periodicWaveHostObject =
172
- std::make_shared<PeriodicWaveHostObject>(periodicWave);
173
-
174
- return jsi::Object::createFromHostObject(runtime, periodicWaveHostObject);
175
- }
176
-
177
- JSI_HOST_FUNCTION(createAnalyser) {
178
- auto analyser = context_->createAnalyser();
179
- auto analyserHostObject = std::make_shared<AnalyserNodeHostObject>(analyser);
180
- return jsi::Object::createFromHostObject(runtime, analyserHostObject);
181
- }
182
-
183
- JSI_HOST_FUNCTION(decodeAudioDataSource) {
184
- auto sourcePath = args[0].getString(runtime).utf8(runtime);
185
-
186
- auto promise = promiseVendor_->createPromise([this, sourcePath](std::shared_ptr<Promise> promise) {
187
- std::thread([this, sourcePath, promise = std::move(promise)]() {
188
- auto results = context_->decodeAudioDataSource(sourcePath);
189
-
190
- if (!results) {
191
- promise->reject("Failed to decode audio data source.");
192
- return;
193
- }
194
-
195
- auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(results);
196
-
197
- promise->resolve([audioBufferHostObject = std::move(audioBufferHostObject)](jsi::Runtime &runtime) {
198
- auto jsiObject = jsi::Object::createFromHostObject(runtime, audioBufferHostObject);
199
- jsiObject.setExternalMemoryPressure(runtime, audioBufferHostObject->getSizeInBytes());
200
- return jsiObject;
201
- });
202
- }).detach();
203
- });
204
-
205
- return promise;
206
- }
207
-
208
- JSI_HOST_FUNCTION(decodeAudioData) {
209
- auto arrayBuffer = args[0].getObject(runtime).getPropertyAsObject(runtime, "buffer").getArrayBuffer(runtime);
210
- auto data = arrayBuffer.data(runtime);
211
- auto size = static_cast<int>(arrayBuffer.size(runtime));
212
-
213
- auto promise = promiseVendor_->createPromise([this, data, size](std::shared_ptr<Promise> promise) {
214
- std::thread([this, data, size, promise = std::move(promise)]() {
215
- auto results = context_->decodeAudioData(data, size);
216
-
217
- if (!results) {
218
- promise->reject("Failed to decode audio data source.");
219
- return;
220
- }
221
-
222
- auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(results);
223
-
224
- promise->resolve([audioBufferHostObject = std::move(audioBufferHostObject)](jsi::Runtime &runtime) {
225
- auto jsiObject = jsi::Object::createFromHostObject(runtime, audioBufferHostObject);
226
- jsiObject.setExternalMemoryPressure(runtime, audioBufferHostObject->getSizeInBytes());
227
- return jsiObject;
228
- });
229
- }).detach();
230
- });
231
-
232
- return promise;
233
- }
234
-
235
- JSI_HOST_FUNCTION(decodePCMAudioDataInBase64) {
236
- auto b64 = args[0].getString(runtime).utf8(runtime);
237
- auto playbackSpeed = static_cast<float>(args[1].getNumber());
238
-
239
- auto promise = promiseVendor_->createPromise([this, b64, playbackSpeed](std::shared_ptr<Promise> promise) {
240
- std::thread([this, b64, playbackSpeed, promise = std::move(promise)]() {
241
- auto results = context_->decodeWithPCMInBase64(b64, playbackSpeed);
242
-
243
- if (!results) {
244
- promise->reject("Failed to decode audio data source.");
245
- return;
246
- }
247
-
248
- auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(results);
249
-
250
- promise->resolve([audioBufferHostObject = std::move(audioBufferHostObject)](jsi::Runtime &runtime) {
251
- auto jsiObject = jsi::Object::createFromHostObject(runtime, audioBufferHostObject);
252
- jsiObject.setExternalMemoryPressure(runtime, audioBufferHostObject->getSizeInBytes());
253
- return jsiObject;
254
- });
255
- }).detach();
256
- });
257
-
258
- return promise;
259
- }
260
-
261
- std::shared_ptr<BaseAudioContext> context_;
22
+ const std::shared_ptr<react::CallInvoker> &callInvoker);
23
+
24
+ JSI_PROPERTY_GETTER_DECL(destination);
25
+ JSI_PROPERTY_GETTER_DECL(state);
26
+ JSI_PROPERTY_GETTER_DECL(sampleRate);
27
+ JSI_PROPERTY_GETTER_DECL(currentTime);
28
+
29
+ JSI_HOST_FUNCTION_DECL(createWorkletNode);
30
+ JSI_HOST_FUNCTION_DECL(createRecorderAdapter);
31
+ JSI_HOST_FUNCTION_DECL(createOscillator);
32
+ JSI_HOST_FUNCTION_DECL(createStreamer);
33
+ JSI_HOST_FUNCTION_DECL(createGain);
34
+ JSI_HOST_FUNCTION_DECL(createStereoPanner);
35
+ JSI_HOST_FUNCTION_DECL(createBiquadFilter);
36
+ JSI_HOST_FUNCTION_DECL(createBufferSource);
37
+ JSI_HOST_FUNCTION_DECL(createBufferQueueSource);
38
+ JSI_HOST_FUNCTION_DECL(createBuffer);
39
+ JSI_HOST_FUNCTION_DECL(createPeriodicWave);
40
+ JSI_HOST_FUNCTION_DECL(createAnalyser);
41
+ JSI_HOST_FUNCTION_DECL(decodeAudioDataSource);
42
+ JSI_HOST_FUNCTION_DECL(decodeAudioData);
43
+ JSI_HOST_FUNCTION_DECL(decodePCMAudioDataInBase64);
44
+
45
+ std::shared_ptr<BaseAudioContext> context_;
262
46
 
263
47
  protected:
264
48
  std::shared_ptr<PromiseVendor> promiseVendor_;
@@ -0,0 +1,70 @@
1
+ #include <audioapi/HostObjects/OfflineAudioContextHostObject.h>
2
+
3
+ #include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
4
+ #include <audioapi/core/OfflineAudioContext.h>
5
+
6
+ namespace audioapi {
7
+
8
+ OfflineAudioContextHostObject::OfflineAudioContextHostObject(
9
+ const std::shared_ptr<OfflineAudioContext> &offlineAudioContext,
10
+ jsi::Runtime *runtime,
11
+ const std::shared_ptr<react::CallInvoker> &callInvoker)
12
+ : BaseAudioContextHostObject(offlineAudioContext, runtime, callInvoker) {
13
+ addFunctions(
14
+ JSI_EXPORT_FUNCTION(OfflineAudioContextHostObject, resume),
15
+ JSI_EXPORT_FUNCTION(OfflineAudioContextHostObject, suspend),
16
+ JSI_EXPORT_FUNCTION(OfflineAudioContextHostObject, startRendering));
17
+ }
18
+
19
+ JSI_HOST_FUNCTION_IMPL(OfflineAudioContextHostObject, resume) {
20
+ auto promise = promiseVendor_->createPromise(
21
+ [this](const std::shared_ptr<Promise> &promise) {
22
+ auto audioContext =
23
+ std::static_pointer_cast<OfflineAudioContext>(context_);
24
+ audioContext->resume();
25
+ });
26
+
27
+ return promise;
28
+ }
29
+
30
+ JSI_HOST_FUNCTION_IMPL(OfflineAudioContextHostObject, suspend) {
31
+ double when = args[0].getNumber();
32
+
33
+ auto promise = promiseVendor_->createPromise(
34
+ [this, when](const std::shared_ptr<Promise> &promise) {
35
+ auto audioContext =
36
+ std::static_pointer_cast<OfflineAudioContext>(context_);
37
+ OfflineAudioContextSuspendCallback callback = [promise]() {
38
+ promise->resolve(
39
+ [](jsi::Runtime &runtime) { return jsi::Value::undefined(); });
40
+ };
41
+ audioContext->suspend(when, callback);
42
+ });
43
+
44
+ return promise;
45
+ }
46
+
47
+ JSI_HOST_FUNCTION_IMPL(OfflineAudioContextHostObject, startRendering) {
48
+ auto promise = promiseVendor_->createPromise(
49
+ [this](const std::shared_ptr<Promise> &promise) {
50
+ auto audioContext =
51
+ std::static_pointer_cast<OfflineAudioContext>(context_);
52
+
53
+ OfflineAudioContextResultCallback callback =
54
+ [promise](const std::shared_ptr<AudioBuffer> &audioBuffer) -> void {
55
+ auto audioBufferHostObject =
56
+ std::make_shared<AudioBufferHostObject>(audioBuffer);
57
+ promise->resolve([audioBufferHostObject = std::move(
58
+ audioBufferHostObject)](jsi::Runtime &runtime) {
59
+ return jsi::Object::createFromHostObject(
60
+ runtime, audioBufferHostObject);
61
+ });
62
+ };
63
+
64
+ audioContext->startRendering(callback);
65
+ });
66
+
67
+ return promise;
68
+ }
69
+
70
+ } // namespace audioapi