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.
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
- package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +4 -4
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +11 -20
- package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +24 -46
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +48 -78
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -21
- package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +42 -78
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +1 -1
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +14 -18
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
- package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
- package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +16 -28
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +4 -6
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +8 -10
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +1 -1
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +13 -27
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +11 -12
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +15 -22
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +7 -12
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -9
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +16 -30
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +6 -10
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
- package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
- package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +4 -8
- package/common/cpp/audioapi/core/AudioContext.cpp +4 -4
- package/common/cpp/audioapi/core/AudioContext.h +5 -2
- package/common/cpp/audioapi/core/AudioNode.cpp +13 -19
- package/common/cpp/audioapi/core/AudioNode.h +14 -7
- package/common/cpp/audioapi/core/AudioParam.cpp +66 -98
- package/common/cpp/audioapi/core/AudioParam.h +20 -12
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +22 -34
- package/common/cpp/audioapi/core/BaseAudioContext.h +19 -15
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
- package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
- package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
- package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +17 -36
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +2 -9
- package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +18 -28
- package/common/cpp/audioapi/core/effects/ConvolverNode.h +19 -10
- package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
- package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
- package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
- package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
- package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
- package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
- package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +9 -8
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +4 -5
- package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +31 -53
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +35 -33
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +19 -20
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +38 -36
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +25 -40
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +3 -1
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +9 -9
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +3 -3
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
- package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +3 -4
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +18 -16
- package/common/cpp/audioapi/core/sources/StreamerNode.cpp +7 -4
- package/common/cpp/audioapi/core/sources/StreamerNode.h +38 -30
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
- package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
- package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
- package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
- package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
- package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +13 -22
- package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
- package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
- package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
- package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
- package/common/cpp/audioapi/core/utils/Constants.h +5 -3
- package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
- package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +29 -34
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +14 -16
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
- package/common/cpp/audioapi/dsp/AudioUtils.cpp +3 -9
- package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
- package/common/cpp/audioapi/dsp/Convolver.cpp +13 -25
- package/common/cpp/audioapi/dsp/Convolver.h +26 -24
- package/common/cpp/audioapi/dsp/FFT.cpp +1 -1
- package/common/cpp/audioapi/dsp/FFT.h +5 -13
- package/common/cpp/audioapi/dsp/VectorMath.cpp +9 -43
- package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
- package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
- package/common/cpp/audioapi/dsp/Windows.h +24 -23
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +44 -39
- package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
- package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
- package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
- package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
- package/common/cpp/audioapi/jsi/JsiPromise.cpp +11 -21
- package/common/cpp/audioapi/jsi/JsiPromise.h +55 -46
- package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
- package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
- package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
- package/common/cpp/audioapi/utils/AudioArray.h +3 -11
- package/common/cpp/audioapi/utils/AudioBus.cpp +51 -149
- package/common/cpp/audioapi/utils/AudioBus.h +15 -15
- package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
- package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
- package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
- package/common/cpp/test/src/AudioParamTest.cpp +3 -2
- package/common/cpp/test/src/AudioScheduledSourceTest.cpp +14 -35
- package/common/cpp/test/src/ConstantSourceTest.cpp +4 -6
- package/common/cpp/test/src/GainTest.cpp +3 -4
- package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
- package/common/cpp/test/src/OscillatorTest.cpp +1 -0
- package/common/cpp/test/src/StereoPannerTest.cpp +5 -8
- package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +10 -27
- package/common/cpp/test/src/biquad/BiquadFilterChromium.h +7 -6
- package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +16 -28
- package/common/cpp/test/src/biquad/BiquadFilterTest.h +13 -6
- package/ios/audioapi/ios/AudioAPIModule.h +4 -6
- package/ios/audioapi/ios/AudioAPIModule.mm +31 -46
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +24 -33
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +1 -2
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +4 -6
- package/ios/audioapi/ios/core/NativeAudioPlayer.m +3 -5
- package/ios/audioapi/ios/core/NativeAudioRecorder.h +1 -2
- package/ios/audioapi/ios/core/NativeAudioRecorder.m +21 -33
- package/ios/audioapi/ios/core/utils/AudioDecoder.mm +17 -37
- package/ios/audioapi/ios/system/AudioEngine.h +2 -4
- package/ios/audioapi/ios/system/AudioEngine.mm +7 -19
- package/ios/audioapi/ios/system/AudioSessionManager.h +2 -4
- package/ios/audioapi/ios/system/AudioSessionManager.mm +17 -32
- package/ios/audioapi/ios/system/LockScreenManager.mm +73 -105
- package/ios/audioapi/ios/system/NotificationManager.mm +43 -68
- 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 =
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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 =
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
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 =
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
}
|
|
128
|
+
if (time < endTime) {
|
|
129
|
+
return static_cast<float>(
|
|
130
|
+
startValue *
|
|
131
|
+
pow(endValue / startValue, (time - startTime) / (endTime - startTime)));
|
|
132
|
+
}
|
|
147
133
|
|
|
148
|
-
|
|
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 ¶m) {
|
|
167
150
|
if (startTime <= param.getQueueEndTime()) {
|
|
168
151
|
return;
|
|
169
152
|
}
|
|
170
153
|
// Exponential decay function towards target value
|
|
171
|
-
auto calculateValue =
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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 =
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
(
|
|
223
|
-
|
|
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
|
-
|
|
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(
|
|
247
|
-
|
|
248
|
-
});
|
|
221
|
+
eventScheduler_.scheduleEvent(
|
|
222
|
+
[cancelTime](AudioParam ¶m) { 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 <
|
|
13
|
+
#include <utility>
|
|
14
|
+
#include <vector>
|
|
15
15
|
|
|
16
16
|
namespace audioapi {
|
|
17
17
|
|
|
18
18
|
class AudioParam {
|
|
19
19
|
public:
|
|
20
|
-
explicit AudioParam(
|
|
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*
|
|
83
|
+
void addInputNode(AudioNode *node);
|
|
81
84
|
|
|
82
85
|
// Audio-Thread only (indirectly through AudioNode::disconnectParam by AudioNodeManager)
|
|
83
|
-
void removeInputNode(AudioNode*
|
|
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(
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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>
|
|
166
|
-
|
|
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(
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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(
|
|
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
|
-
|
|
109
|
-
|
|
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_ =
|
|
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(
|
|
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 =
|
|
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(
|
|
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&
|
|
27
|
+
void suspend(double when, const OfflineAudioContextSuspendCallback &callback);
|
|
23
28
|
|
|
24
29
|
void startRendering(OfflineAudioContextResultCallback callback);
|
|
25
30
|
|