react-native-audio-api 0.11.0-nightly-141c86f-20251118 → 0.11.0-nightly-4e6f25c-20251119

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 (167) hide show
  1. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
  2. package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
  3. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +4 -4
  4. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +11 -20
  5. package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +24 -46
  6. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +48 -78
  7. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -21
  8. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
  9. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
  10. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
  11. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +42 -78
  12. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +1 -1
  13. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +14 -18
  14. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
  15. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
  16. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
  17. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
  18. package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
  19. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +16 -28
  20. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
  21. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +4 -6
  22. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
  23. package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
  24. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
  25. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
  26. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
  27. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
  28. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +8 -10
  29. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +1 -1
  30. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +13 -27
  31. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +11 -12
  32. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +15 -22
  33. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
  34. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +7 -12
  35. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -9
  36. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +16 -30
  37. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
  38. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +6 -10
  39. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
  40. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
  41. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
  42. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
  43. package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
  44. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +2 -2
  45. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
  46. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
  47. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
  48. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +4 -8
  49. package/common/cpp/audioapi/core/AudioContext.cpp +4 -4
  50. package/common/cpp/audioapi/core/AudioContext.h +5 -2
  51. package/common/cpp/audioapi/core/AudioNode.cpp +13 -19
  52. package/common/cpp/audioapi/core/AudioNode.h +14 -7
  53. package/common/cpp/audioapi/core/AudioParam.cpp +66 -98
  54. package/common/cpp/audioapi/core/AudioParam.h +20 -12
  55. package/common/cpp/audioapi/core/BaseAudioContext.cpp +22 -34
  56. package/common/cpp/audioapi/core/BaseAudioContext.h +19 -15
  57. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
  58. package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
  59. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
  60. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
  61. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
  62. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
  63. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +17 -36
  64. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +2 -9
  65. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +18 -28
  66. package/common/cpp/audioapi/core/effects/ConvolverNode.h +19 -10
  67. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
  68. package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
  69. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
  70. package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
  71. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
  72. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
  73. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
  74. package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
  75. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
  76. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
  77. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +9 -8
  78. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +4 -5
  79. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
  80. package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
  81. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +31 -53
  82. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +35 -33
  83. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +19 -20
  84. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +38 -36
  85. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +25 -40
  86. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +3 -1
  87. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +9 -9
  88. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +3 -3
  89. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
  90. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
  91. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
  92. package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
  93. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +3 -4
  94. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +18 -16
  95. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +7 -4
  96. package/common/cpp/audioapi/core/sources/StreamerNode.h +38 -30
  97. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
  98. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
  99. package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
  100. package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
  101. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
  102. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
  103. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +13 -22
  104. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
  105. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
  106. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
  107. package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
  108. package/common/cpp/audioapi/core/utils/Constants.h +5 -3
  109. package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
  110. package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
  111. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +29 -34
  112. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +14 -16
  113. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
  114. package/common/cpp/audioapi/dsp/AudioUtils.cpp +3 -9
  115. package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
  116. package/common/cpp/audioapi/dsp/Convolver.cpp +13 -25
  117. package/common/cpp/audioapi/dsp/Convolver.h +26 -24
  118. package/common/cpp/audioapi/dsp/FFT.cpp +1 -1
  119. package/common/cpp/audioapi/dsp/FFT.h +5 -13
  120. package/common/cpp/audioapi/dsp/VectorMath.cpp +9 -43
  121. package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
  122. package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
  123. package/common/cpp/audioapi/dsp/Windows.h +24 -23
  124. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
  125. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +44 -39
  126. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
  127. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
  128. package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
  129. package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
  130. package/common/cpp/audioapi/jsi/JsiPromise.cpp +11 -21
  131. package/common/cpp/audioapi/jsi/JsiPromise.h +55 -46
  132. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
  133. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
  134. package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
  135. package/common/cpp/audioapi/utils/AudioArray.h +3 -11
  136. package/common/cpp/audioapi/utils/AudioBus.cpp +51 -149
  137. package/common/cpp/audioapi/utils/AudioBus.h +15 -15
  138. package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
  139. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
  140. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
  141. package/common/cpp/test/src/AudioParamTest.cpp +3 -2
  142. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +14 -35
  143. package/common/cpp/test/src/ConstantSourceTest.cpp +4 -6
  144. package/common/cpp/test/src/GainTest.cpp +3 -4
  145. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
  146. package/common/cpp/test/src/OscillatorTest.cpp +1 -0
  147. package/common/cpp/test/src/StereoPannerTest.cpp +5 -8
  148. package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +10 -27
  149. package/common/cpp/test/src/biquad/BiquadFilterChromium.h +7 -6
  150. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +16 -28
  151. package/common/cpp/test/src/biquad/BiquadFilterTest.h +13 -6
  152. package/ios/audioapi/ios/AudioAPIModule.h +4 -6
  153. package/ios/audioapi/ios/AudioAPIModule.mm +31 -46
  154. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +24 -33
  155. package/ios/audioapi/ios/core/IOSAudioRecorder.h +1 -2
  156. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +4 -6
  157. package/ios/audioapi/ios/core/NativeAudioPlayer.m +3 -5
  158. package/ios/audioapi/ios/core/NativeAudioRecorder.h +1 -2
  159. package/ios/audioapi/ios/core/NativeAudioRecorder.m +21 -33
  160. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +17 -37
  161. package/ios/audioapi/ios/system/AudioEngine.h +2 -4
  162. package/ios/audioapi/ios/system/AudioEngine.mm +7 -19
  163. package/ios/audioapi/ios/system/AudioSessionManager.h +2 -4
  164. package/ios/audioapi/ios/system/AudioSessionManager.mm +17 -32
  165. package/ios/audioapi/ios/system/LockScreenManager.mm +73 -105
  166. package/ios/audioapi/ios/system/NotificationManager.mm +43 -68
  167. package/package.json +2 -2
@@ -3,6 +3,8 @@
3
3
  #include <audioapi/dsp/AudioUtils.h>
4
4
  #include <audioapi/dsp/VectorMath.h>
5
5
  #include <audioapi/utils/AudioArray.h>
6
+ #include <memory>
7
+ #include <utility>
6
8
 
7
9
  namespace audioapi {
8
10
 
@@ -18,11 +20,7 @@ AudioParam::AudioParam(
18
20
  maxValue_(maxValue),
19
21
  eventsQueue_(),
20
22
  eventScheduler_(32),
21
- audioBus_(
22
- std::make_shared<AudioBus>(
23
- RENDER_QUANTUM_SIZE,
24
- 1,
25
- context->getSampleRate())) {
23
+ audioBus_(std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, 1, context->getSampleRate())) {
26
24
  inputBuses_.reserve(4);
27
25
  inputNodes_.reserve(4);
28
26
  startTime_ = 0;
@@ -61,17 +59,14 @@ void AudioParam::setValueAtTime(float value, double startTime) {
61
59
  }
62
60
 
63
61
  // Step function: instant change at startTime
64
- auto calculateValue = [](double startTime,
65
- double /* endTime */,
66
- float startValue,
67
- float endValue,
68
- double time) {
69
- if (time < startTime) {
70
- return startValue;
71
- }
62
+ auto calculateValue =
63
+ [](double startTime, double /* endTime */, float startValue, float endValue, double time) {
64
+ if (time < startTime) {
65
+ return startValue;
66
+ }
72
67
 
73
- return endValue;
74
- };
68
+ return endValue;
69
+ };
75
70
 
76
71
  param.updateQueue(ParamChangeEvent(
77
72
  startTime,
@@ -92,24 +87,19 @@ void AudioParam::linearRampToValueAtTime(float value, double endTime) {
92
87
  }
93
88
 
94
89
  // Linear interpolation function
95
- auto calculateValue = [](double startTime,
96
- double endTime,
97
- float startValue,
98
- float endValue,
99
- double time) {
100
- if (time < startTime) {
101
- return startValue;
102
- }
90
+ auto calculateValue =
91
+ [](double startTime, double endTime, float startValue, float endValue, double time) {
92
+ if (time < startTime) {
93
+ return startValue;
94
+ }
103
95
 
104
- if (time < endTime) {
105
- return static_cast<float>(
106
- startValue +
107
- (endValue - startValue) * (time - startTime) /
108
- (endTime - startTime));
109
- }
96
+ if (time < endTime) {
97
+ return static_cast<float>(
98
+ startValue + (endValue - startValue) * (time - startTime) / (endTime - startTime));
99
+ }
110
100
 
111
- return endValue;
112
- };
101
+ return endValue;
102
+ };
113
103
 
114
104
  param.updateQueue(ParamChangeEvent(
115
105
  param.getQueueEndTime(),
@@ -129,24 +119,20 @@ void AudioParam::exponentialRampToValueAtTime(float value, double endTime) {
129
119
  }
130
120
 
131
121
  // Exponential curve function using power law
132
- auto calculateValue = [](double startTime,
133
- double endTime,
134
- float startValue,
135
- float endValue,
136
- double time) {
137
- if (time < startTime) {
138
- return startValue;
139
- }
122
+ auto calculateValue =
123
+ [](double startTime, double endTime, float startValue, float endValue, double time) {
124
+ if (time < startTime) {
125
+ return startValue;
126
+ }
140
127
 
141
- if (time < endTime) {
142
- return static_cast<float>(
143
- startValue *
144
- pow(endValue / startValue,
145
- (time - startTime) / (endTime - startTime)));
146
- }
128
+ if (time < endTime) {
129
+ return static_cast<float>(
130
+ startValue *
131
+ pow(endValue / startValue, (time - startTime) / (endTime - startTime)));
132
+ }
147
133
 
148
- return endValue;
149
- };
134
+ return endValue;
135
+ };
150
136
 
151
137
  param.updateQueue(ParamChangeEvent(
152
138
  param.getQueueEndTime(),
@@ -159,26 +145,21 @@ void AudioParam::exponentialRampToValueAtTime(float value, double endTime) {
159
145
  eventScheduler_.scheduleEvent(std::move(event));
160
146
  }
161
147
 
162
- void AudioParam::setTargetAtTime(
163
- float target,
164
- double startTime,
165
- double timeConstant) {
148
+ void AudioParam::setTargetAtTime(float target, double startTime, double timeConstant) {
166
149
  auto event = [target, startTime, timeConstant](AudioParam &param) {
167
150
  if (startTime <= param.getQueueEndTime()) {
168
151
  return;
169
152
  }
170
153
  // Exponential decay function towards target value
171
- auto calculateValue =
172
- [timeConstant, target](
173
- double startTime, double, float startValue, float, double time) {
174
- if (time < startTime) {
175
- return startValue;
176
- }
154
+ auto calculateValue = [timeConstant, target](
155
+ double startTime, double, float startValue, float, double time) {
156
+ if (time < startTime) {
157
+ return startValue;
158
+ }
177
159
 
178
- return static_cast<float>(
179
- target +
180
- (startValue - target) * exp(-(time - startTime) / timeConstant));
181
- };
160
+ return static_cast<float>(
161
+ target + (startValue - target) * exp(-(time - startTime) / timeConstant));
162
+ };
182
163
  param.updateQueue(ParamChangeEvent(
183
164
  startTime,
184
165
  startTime, // SetTarget events have infinite duration conceptually
@@ -202,31 +183,25 @@ void AudioParam::setValueCurveAtTime(
202
183
  return;
203
184
  }
204
185
 
205
- auto calculateValue = [values, length](
206
- double startTime,
207
- double endTime,
208
- float startValue,
209
- float endValue,
210
- double time) {
211
- if (time < startTime) {
212
- return startValue;
213
- }
186
+ auto calculateValue =
187
+ [values, length](
188
+ double startTime, double endTime, float startValue, float endValue, double time) {
189
+ if (time < startTime) {
190
+ return startValue;
191
+ }
214
192
 
215
- if (time < endTime) {
216
- // Calculate position in the array based on time progress
217
- auto k = static_cast<int>(std::floor(
218
- static_cast<double>(length - 1) / (endTime - startTime) *
219
- (time - startTime)));
220
- // Calculate interpolation factor between adjacent array elements
221
- auto factor = static_cast<float>(
222
- (time - startTime) * static_cast<double>(length - 1) /
223
- (endTime - startTime) -
224
- k);
225
- return dsp::linearInterpolate(values->data(), k, k + 1, factor);
226
- }
193
+ if (time < endTime) {
194
+ // Calculate position in the array based on time progress
195
+ auto k = static_cast<int>(std::floor(
196
+ static_cast<double>(length - 1) / (endTime - startTime) * (time - startTime)));
197
+ // Calculate interpolation factor between adjacent array elements
198
+ auto factor = static_cast<float>(
199
+ (time - startTime) * static_cast<double>(length - 1) / (endTime - startTime) - k);
200
+ return dsp::linearInterpolate(values->data(), k, k + 1, factor);
201
+ }
227
202
 
228
- return endValue;
229
- };
203
+ return endValue;
204
+ };
230
205
 
231
206
  param.updateQueue(ParamChangeEvent(
232
207
  startTime,
@@ -243,9 +218,8 @@ void AudioParam::setValueCurveAtTime(
243
218
  }
244
219
 
245
220
  void AudioParam::cancelScheduledValues(double cancelTime) {
246
- eventScheduler_.scheduleEvent([cancelTime](AudioParam &param) {
247
- param.eventsQueue_.cancelScheduledValues(cancelTime);
248
- });
221
+ eventScheduler_.scheduleEvent(
222
+ [cancelTime](AudioParam &param) { param.eventsQueue_.cancelScheduledValues(cancelTime); });
249
223
  }
250
224
 
251
225
  void AudioParam::cancelAndHoldAtTime(double cancelTime) {
@@ -280,9 +254,7 @@ std::shared_ptr<AudioBus> AudioParam::calculateInputs(
280
254
  return processingBus;
281
255
  }
282
256
 
283
- std::shared_ptr<AudioBus> AudioParam::processARateParam(
284
- int framesToProcess,
285
- double time) {
257
+ std::shared_ptr<AudioBus> AudioParam::processARateParam(int framesToProcess, double time) {
286
258
  processScheduledEvents();
287
259
  auto processingBus = calculateInputs(audioBus_, framesToProcess);
288
260
 
@@ -313,8 +285,7 @@ void AudioParam::processInputs(
313
285
  const std::shared_ptr<AudioBus> &outputBus,
314
286
  int framesToProcess,
315
287
  bool checkIsAlreadyProcessed) {
316
- for (auto it = inputNodes_.begin(), end = inputNodes_.end(); it != end;
317
- ++it) {
288
+ for (auto it = inputNodes_.begin(), end = inputNodes_.end(); it != end; ++it) {
318
289
  auto inputNode = *it;
319
290
  assert(inputNode != nullptr);
320
291
 
@@ -323,19 +294,16 @@ void AudioParam::processInputs(
323
294
  }
324
295
 
325
296
  // Process this input node and store its output bus
326
- auto inputBus = inputNode->processAudio(
327
- outputBus, framesToProcess, checkIsAlreadyProcessed);
297
+ auto inputBus = inputNode->processAudio(outputBus, framesToProcess, checkIsAlreadyProcessed);
328
298
  inputBuses_.emplace_back(inputBus);
329
299
  }
330
300
  }
331
301
 
332
- void AudioParam::mixInputsBuses(
333
- const std::shared_ptr<AudioBus> &processingBus) {
302
+ void AudioParam::mixInputsBuses(const std::shared_ptr<AudioBus> &processingBus) {
334
303
  assert(processingBus != nullptr);
335
304
 
336
305
  // Sum all input buses into the processing bus
337
- for (auto it = inputBuses_.begin(), end = inputBuses_.end(); it != end;
338
- ++it) {
306
+ for (auto it = inputBuses_.begin(), end = inputBuses_.end(); it != end; ++it) {
339
307
  processingBus->sum(it->get(), ChannelInterpretation::SPEAKERS);
340
308
  }
341
309
 
@@ -1,23 +1,27 @@
1
1
  #pragma once
2
2
 
3
+ #include <audioapi/core/AudioNode.h>
3
4
  #include <audioapi/core/types/ParamChangeEventType.h>
5
+ #include <audioapi/core/utils/AudioParamEventQueue.h>
4
6
  #include <audioapi/core/utils/ParamChangeEvent.h>
5
7
  #include <audioapi/utils/AudioBus.h>
6
- #include <audioapi/core/AudioNode.h>
7
- #include <audioapi/core/utils/AudioParamEventQueue.h>
8
8
 
9
+ #include <audioapi/utils/CrossThreadEventScheduler.hpp>
9
10
  #include <cstddef>
10
- #include <utility>
11
11
  #include <memory>
12
- #include <vector>
13
12
  #include <unordered_set>
14
- #include <audioapi/utils/CrossThreadEventScheduler.hpp>
13
+ #include <utility>
14
+ #include <vector>
15
15
 
16
16
  namespace audioapi {
17
17
 
18
18
  class AudioParam {
19
19
  public:
20
- explicit AudioParam(float defaultValue, float minValue, float maxValue, BaseAudioContext *context);
20
+ explicit AudioParam(
21
+ float defaultValue,
22
+ float minValue,
23
+ float maxValue,
24
+ BaseAudioContext *context);
21
25
 
22
26
  /// JS-Thread only methods
23
27
  /// These methods are called only from HostObjects invoked on the JS thread.
@@ -72,15 +76,14 @@ class AudioParam {
72
76
  // JS-Thread only
73
77
  void cancelAndHoldAtTime(double cancelTime);
74
78
 
75
-
76
79
  /// Audio-Thread only methods
77
80
  /// These methods are called only from the Audio rendering thread.
78
81
 
79
82
  // Audio-Thread only (indirectly through AudioNode::connectParam by AudioNodeManager)
80
- void addInputNode(AudioNode* node);
83
+ void addInputNode(AudioNode *node);
81
84
 
82
85
  // Audio-Thread only (indirectly through AudioNode::disconnectParam by AudioNodeManager)
83
- void removeInputNode(AudioNode* node);
86
+ void removeInputNode(AudioNode *node);
84
87
 
85
88
  // Audio-Thread only
86
89
  std::shared_ptr<AudioBus> processARateParam(int framesToProcess, double time);
@@ -141,9 +144,14 @@ class AudioParam {
141
144
  eventsQueue_.pushBack(std::move(event));
142
145
  }
143
146
  float getValueAtTime(double time);
144
- void processInputs(const std::shared_ptr<AudioBus>& outputBus, int framesToProcess, bool checkIsAlreadyProcessed);
145
- void mixInputsBuses(const std::shared_ptr<AudioBus>& processingBus);
146
- std::shared_ptr<AudioBus> calculateInputs(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess);
147
+ void processInputs(
148
+ const std::shared_ptr<AudioBus> &outputBus,
149
+ int framesToProcess,
150
+ bool checkIsAlreadyProcessed);
151
+ void mixInputsBuses(const std::shared_ptr<AudioBus> &processingBus);
152
+ std::shared_ptr<AudioBus> calculateInputs(
153
+ const std::shared_ptr<AudioBus> &processingBus,
154
+ int framesToProcess);
147
155
  };
148
156
 
149
157
  } // namespace audioapi
@@ -22,12 +22,15 @@
22
22
  #include <audioapi/utils/AudioArray.h>
23
23
  #include <audioapi/utils/AudioBus.h>
24
24
  #include <audioapi/utils/CircularAudioArray.h>
25
+ #include <memory>
26
+ #include <string>
27
+ #include <utility>
28
+ #include <vector>
25
29
 
26
30
  namespace audioapi {
27
31
 
28
32
  BaseAudioContext::BaseAudioContext(
29
- const std::shared_ptr<IAudioEventHandlerRegistry>
30
- &audioEventHandlerRegistry,
33
+ const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,
31
34
  const RuntimeRegistry &runtimeRegistry) {
32
35
  nodeManager_ = std::make_shared<AudioNodeManager>();
33
36
  destination_ = std::make_shared<AudioDestinationNode>(this);
@@ -71,8 +74,7 @@ std::shared_ptr<WorkletSourceNode> BaseAudioContext::createWorkletSourceNode(
71
74
  std::weak_ptr<worklets::WorkletRuntime> runtime,
72
75
  bool shouldLockRuntime) {
73
76
  WorkletsRunner workletRunner(runtime, shareableWorklet, shouldLockRuntime);
74
- auto workletSourceNode =
75
- std::make_shared<WorkletSourceNode>(this, std::move(workletRunner));
77
+ auto workletSourceNode = std::make_shared<WorkletSourceNode>(this, std::move(workletRunner));
76
78
  nodeManager_->addSourceNode(workletSourceNode);
77
79
  return workletSourceNode;
78
80
  }
@@ -90,8 +92,7 @@ std::shared_ptr<WorkletNode> BaseAudioContext::createWorkletNode(
90
92
  return workletNode;
91
93
  }
92
94
 
93
- std::shared_ptr<WorkletProcessingNode>
94
- BaseAudioContext::createWorkletProcessingNode(
95
+ std::shared_ptr<WorkletProcessingNode> BaseAudioContext::createWorkletProcessingNode(
95
96
  std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
96
97
  std::weak_ptr<worklets::WorkletRuntime> runtime,
97
98
  bool shouldLockRuntime) {
@@ -146,26 +147,21 @@ std::shared_ptr<BiquadFilterNode> BaseAudioContext::createBiquadFilter() {
146
147
  return biquadFilter;
147
148
  }
148
149
 
149
- std::shared_ptr<AudioBufferSourceNode> BaseAudioContext::createBufferSource(
150
- bool pitchCorrection) {
151
- auto bufferSource =
152
- std::make_shared<AudioBufferSourceNode>(this, pitchCorrection);
150
+ std::shared_ptr<AudioBufferSourceNode> BaseAudioContext::createBufferSource(bool pitchCorrection) {
151
+ auto bufferSource = std::make_shared<AudioBufferSourceNode>(this, pitchCorrection);
153
152
  nodeManager_->addSourceNode(bufferSource);
154
153
  return bufferSource;
155
154
  }
156
155
 
157
- std::shared_ptr<AudioBufferQueueSourceNode>
158
- BaseAudioContext::createBufferQueueSource(bool pitchCorrection) {
159
- auto bufferSource =
160
- std::make_shared<AudioBufferQueueSourceNode>(this, pitchCorrection);
156
+ std::shared_ptr<AudioBufferQueueSourceNode> BaseAudioContext::createBufferQueueSource(
157
+ bool pitchCorrection) {
158
+ auto bufferSource = std::make_shared<AudioBufferQueueSourceNode>(this, pitchCorrection);
161
159
  nodeManager_->addSourceNode(bufferSource);
162
160
  return bufferSource;
163
161
  }
164
162
 
165
- std::shared_ptr<AudioBuffer> BaseAudioContext::createBuffer(
166
- int numberOfChannels,
167
- size_t length,
168
- float sampleRate) {
163
+ std::shared_ptr<AudioBuffer>
164
+ BaseAudioContext::createBuffer(int numberOfChannels, size_t length, float sampleRate) {
169
165
  return std::make_shared<AudioBuffer>(numberOfChannels, length, sampleRate);
170
166
  }
171
167
 
@@ -173,8 +169,7 @@ std::shared_ptr<PeriodicWave> BaseAudioContext::createPeriodicWave(
173
169
  const std::vector<std::complex<float>> &complexData,
174
170
  bool disableNormalization,
175
171
  int length) {
176
- return std::make_shared<PeriodicWave>(
177
- sampleRate_, complexData, length, disableNormalization);
172
+ return std::make_shared<PeriodicWave>(sampleRate_, complexData, length, disableNormalization);
178
173
  }
179
174
 
180
175
  std::shared_ptr<AnalyserNode> BaseAudioContext::createAnalyser() {
@@ -186,8 +181,7 @@ std::shared_ptr<AnalyserNode> BaseAudioContext::createAnalyser() {
186
181
  std::shared_ptr<ConvolverNode> BaseAudioContext::createConvolver(
187
182
  std::shared_ptr<AudioBuffer> buffer,
188
183
  bool disableNormalization) {
189
- auto convolver =
190
- std::make_shared<ConvolverNode>(this, buffer, disableNormalization);
184
+ auto convolver = std::make_shared<ConvolverNode>(this, buffer, disableNormalization);
191
185
  nodeManager_->addProcessingNode(convolver);
192
186
  return convolver;
193
187
  }
@@ -225,36 +219,30 @@ std::string BaseAudioContext::toString(ContextState state) {
225
219
  }
226
220
  }
227
221
 
228
- std::shared_ptr<PeriodicWave> BaseAudioContext::getBasicWaveForm(
229
- OscillatorType type) {
222
+ std::shared_ptr<PeriodicWave> BaseAudioContext::getBasicWaveForm(OscillatorType type) {
230
223
  switch (type) {
231
224
  case OscillatorType::SINE:
232
225
  if (cachedSineWave_ == nullptr) {
233
- cachedSineWave_ =
234
- std::make_shared<PeriodicWave>(sampleRate_, type, false);
226
+ cachedSineWave_ = std::make_shared<PeriodicWave>(sampleRate_, type, false);
235
227
  }
236
228
  return cachedSineWave_;
237
229
  case OscillatorType::SQUARE:
238
230
  if (cachedSquareWave_ == nullptr) {
239
- cachedSquareWave_ =
240
- std::make_shared<PeriodicWave>(sampleRate_, type, false);
231
+ cachedSquareWave_ = std::make_shared<PeriodicWave>(sampleRate_, type, false);
241
232
  }
242
233
  return cachedSquareWave_;
243
234
  case OscillatorType::SAWTOOTH:
244
235
  if (cachedSawtoothWave_ == nullptr) {
245
- cachedSawtoothWave_ =
246
- std::make_shared<PeriodicWave>(sampleRate_, type, false);
236
+ cachedSawtoothWave_ = std::make_shared<PeriodicWave>(sampleRate_, type, false);
247
237
  }
248
238
  return cachedSawtoothWave_;
249
239
  case OscillatorType::TRIANGLE:
250
240
  if (cachedTriangleWave_ == nullptr) {
251
- cachedTriangleWave_ =
252
- std::make_shared<PeriodicWave>(sampleRate_, type, false);
241
+ cachedTriangleWave_ = std::make_shared<PeriodicWave>(sampleRate_, type, false);
253
242
  }
254
243
  return cachedTriangleWave_;
255
244
  case OscillatorType::CUSTOM:
256
- throw std::invalid_argument(
257
- "You can't get a custom wave form. You need to create it.");
245
+ throw std::invalid_argument("You can't get a custom wave form. You need to create it.");
258
246
  break;
259
247
  }
260
248
  }
@@ -38,7 +38,9 @@ class StreamerNode;
38
38
 
39
39
  class BaseAudioContext {
40
40
  public:
41
- explicit BaseAudioContext(const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const RuntimeRegistry &runtimeRegistry);
41
+ explicit BaseAudioContext(
42
+ const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,
43
+ const RuntimeRegistry &runtimeRegistry);
42
44
  virtual ~BaseAudioContext() = default;
43
45
 
44
46
  std::string getState();
@@ -49,19 +51,19 @@ class BaseAudioContext {
49
51
 
50
52
  std::shared_ptr<RecorderAdapterNode> createRecorderAdapter();
51
53
  std::shared_ptr<WorkletSourceNode> createWorkletSourceNode(
52
- std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
53
- std::weak_ptr<worklets::WorkletRuntime> runtime,
54
- bool shouldLockRuntime = true);
54
+ std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
55
+ std::weak_ptr<worklets::WorkletRuntime> runtime,
56
+ bool shouldLockRuntime = true);
55
57
  std::shared_ptr<WorkletNode> createWorkletNode(
56
- std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
57
- std::weak_ptr<worklets::WorkletRuntime> runtime,
58
- size_t bufferLength,
59
- size_t inputChannelCount,
60
- bool shouldLockRuntime = true);
58
+ std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
59
+ std::weak_ptr<worklets::WorkletRuntime> runtime,
60
+ size_t bufferLength,
61
+ size_t inputChannelCount,
62
+ bool shouldLockRuntime = true);
61
63
  std::shared_ptr<WorkletProcessingNode> createWorkletProcessingNode(
62
- std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
63
- std::weak_ptr<worklets::WorkletRuntime> runtime,
64
- bool shouldLockRuntime = true);
64
+ std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
65
+ std::weak_ptr<worklets::WorkletRuntime> runtime,
66
+ bool shouldLockRuntime = true);
65
67
  std::shared_ptr<OscillatorNode> createOscillator();
66
68
  std::shared_ptr<ConstantSourceNode> createConstantSource();
67
69
  std::shared_ptr<StreamerNode> createStreamer();
@@ -77,7 +79,9 @@ class BaseAudioContext {
77
79
  bool disableNormalization,
78
80
  int length);
79
81
  std::shared_ptr<AnalyserNode> createAnalyser();
80
- std::shared_ptr<ConvolverNode> createConvolver(std::shared_ptr<AudioBuffer> buffer, bool disableNormalization);
82
+ std::shared_ptr<ConvolverNode> createConvolver(
83
+ std::shared_ptr<AudioBuffer> buffer,
84
+ bool disableNormalization);
81
85
 
82
86
  std::shared_ptr<PeriodicWave> getBasicWaveForm(OscillatorType type);
83
87
  [[nodiscard]] float getNyquistFrequency() const;
@@ -105,8 +109,8 @@ class BaseAudioContext {
105
109
  [[nodiscard]] virtual bool isDriverRunning() const = 0;
106
110
 
107
111
  public:
108
- std::shared_ptr<IAudioEventHandlerRegistry> audioEventHandlerRegistry_;
109
- RuntimeRegistry runtimeRegistry_;
112
+ std::shared_ptr<IAudioEventHandlerRegistry> audioEventHandlerRegistry_;
113
+ RuntimeRegistry runtimeRegistry_;
110
114
  };
111
115
 
112
116
  } // namespace audioapi
@@ -12,6 +12,7 @@
12
12
  #include <algorithm>
13
13
  #include <cassert>
14
14
  #include <iostream>
15
+ #include <memory>
15
16
  #include <thread>
16
17
  #include <utility>
17
18
 
@@ -21,16 +22,15 @@ OfflineAudioContext::OfflineAudioContext(
21
22
  int numberOfChannels,
22
23
  size_t length,
23
24
  float sampleRate,
24
- const std::shared_ptr<IAudioEventHandlerRegistry>
25
- &audioEventHandlerRegistry,
25
+ const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,
26
26
  const RuntimeRegistry &runtimeRegistry)
27
27
  : BaseAudioContext(audioEventHandlerRegistry, runtimeRegistry),
28
28
  length_(length),
29
29
  numberOfChannels_(numberOfChannels),
30
30
  currentSampleFrame_(0) {
31
31
  sampleRate_ = sampleRate;
32
- resultBus_ = std::make_shared<AudioBus>(
33
- static_cast<int>(length_), numberOfChannels_, sampleRate_);
32
+ resultBus_ =
33
+ std::make_shared<AudioBus>(static_cast<int>(length_), numberOfChannels_, sampleRate_);
34
34
  }
35
35
 
36
36
  OfflineAudioContext::~OfflineAudioContext() {
@@ -47,21 +47,18 @@ void OfflineAudioContext::resume() {
47
47
  renderAudio();
48
48
  }
49
49
 
50
- void OfflineAudioContext::suspend(
51
- double when,
52
- const std::function<void()> &callback) {
50
+ void OfflineAudioContext::suspend(double when, const std::function<void()> &callback) {
53
51
  Locker locker(mutex_);
54
52
 
55
53
  // we can only suspend once per render quantum at the end of the quantum
56
54
  // first quantum is [0, RENDER_QUANTUM_SIZE)
57
55
  auto frame = static_cast<size_t>(when * sampleRate_);
58
- frame = RENDER_QUANTUM_SIZE *
59
- ((frame + RENDER_QUANTUM_SIZE - 1) / RENDER_QUANTUM_SIZE);
56
+ frame = RENDER_QUANTUM_SIZE * ((frame + RENDER_QUANTUM_SIZE - 1) / RENDER_QUANTUM_SIZE);
60
57
 
61
58
  if (scheduledSuspends_.find(frame) != scheduledSuspends_.end()) {
62
59
  throw std::runtime_error(
63
- "cannot schedule more than one suspend at frame " +
64
- std::to_string(frame) + " (" + std::to_string(when) + " seconds)");
60
+ "cannot schedule more than one suspend at frame " + std::to_string(frame) + " (" +
61
+ std::to_string(when) + " seconds)");
65
62
  }
66
63
 
67
64
  scheduledSuspends_.emplace(frame, callback);
@@ -70,13 +67,12 @@ void OfflineAudioContext::suspend(
70
67
  void OfflineAudioContext::renderAudio() {
71
68
  state_ = ContextState::RUNNING;
72
69
  std::thread([this]() {
73
- auto audioBus = std::make_shared<AudioBus>(
74
- RENDER_QUANTUM_SIZE, numberOfChannels_, sampleRate_);
70
+ auto audioBus = std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, numberOfChannels_, sampleRate_);
75
71
 
76
72
  while (currentSampleFrame_ < length_) {
77
73
  Locker locker(mutex_);
78
- int framesToProcess = std::min(
79
- static_cast<int>(length_ - currentSampleFrame_), RENDER_QUANTUM_SIZE);
74
+ int framesToProcess =
75
+ std::min(static_cast<int>(length_ - currentSampleFrame_), RENDER_QUANTUM_SIZE);
80
76
 
81
77
  destination_->renderAudio(audioBus, framesToProcess);
82
78
 
@@ -107,8 +103,7 @@ void OfflineAudioContext::renderAudio() {
107
103
  }).detach();
108
104
  }
109
105
 
110
- void OfflineAudioContext::startRendering(
111
- OfflineAudioContextResultCallback callback) {
106
+ void OfflineAudioContext::startRendering(OfflineAudioContextResultCallback callback) {
112
107
  Locker locker(mutex_);
113
108
 
114
109
  resultCallback_ = std::move(callback);
@@ -1,12 +1,12 @@
1
1
  #pragma once
2
2
 
3
- #include "BaseAudioContext.h"
4
3
  #include <audioapi/core/utils/worklets/SafeIncludes.h>
4
+ #include "BaseAudioContext.h"
5
5
 
6
- #include <mutex>
7
6
  #include <map>
8
- #include <unordered_map>
9
7
  #include <memory>
8
+ #include <mutex>
9
+ #include <unordered_map>
10
10
 
11
11
  namespace audioapi {
12
12
 
@@ -15,11 +15,16 @@ using OfflineAudioContextResultCallback = std::function<void(std::shared_ptr<Aud
15
15
 
16
16
  class OfflineAudioContext : public BaseAudioContext {
17
17
  public:
18
- explicit OfflineAudioContext(int numberOfChannels, size_t length, float sampleRate, const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const RuntimeRegistry &runtimeRegistry);
18
+ explicit OfflineAudioContext(
19
+ int numberOfChannels,
20
+ size_t length,
21
+ float sampleRate,
22
+ const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,
23
+ const RuntimeRegistry &runtimeRegistry);
19
24
  ~OfflineAudioContext() override;
20
25
 
21
26
  void resume();
22
- void suspend(double when, const OfflineAudioContextSuspendCallback& callback);
27
+ void suspend(double when, const OfflineAudioContextSuspendCallback &callback);
23
28
 
24
29
  void startRendering(OfflineAudioContextResultCallback callback);
25
30