react-native-audio-api 0.8.3-nightly-e918179-20251003 → 0.8.3-nightly-ea268f4-20251004
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/common/cpp/audioapi/AudioAPIModuleInstaller.h +31 -14
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +74 -4
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +3 -0
- package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +18 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +20 -1
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +3 -0
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +19 -0
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +21 -0
- package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +18 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +2 -2
- package/common/cpp/audioapi/core/AudioContext.h +2 -2
- package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +32 -3
- package/common/cpp/audioapi/core/BaseAudioContext.h +9 -4
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +2 -2
- package/common/cpp/audioapi/core/OfflineAudioContext.h +2 -2
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +4 -3
- package/common/cpp/audioapi/core/effects/WorkletNode.h +4 -3
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +89 -0
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +52 -0
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +1 -6
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +30 -0
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +6 -0
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +1 -6
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +51 -0
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +26 -0
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +82 -0
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +47 -0
- package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +12 -6
- package/common/cpp/audioapi/core/utils/Constants.h +5 -0
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +7 -0
- package/common/cpp/audioapi/core/utils/worklets/{UiWorkletsRunner.cpp → WorkletsRunner.cpp} +2 -2
- package/common/cpp/audioapi/core/utils/worklets/{UiWorkletsRunner.h → WorkletsRunner.h} +2 -2
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +2 -1
- package/common/cpp/audioapi/jsi/JsiPromise.cpp +23 -27
- package/common/cpp/audioapi/jsi/JsiPromise.h +10 -1
- package/common/cpp/audioapi/utils/ThreadPool.hpp +104 -0
- package/common/cpp/test/AudioParamTest.cpp +204 -0
- package/common/cpp/test/CMakeLists.txt +3 -0
- package/common/cpp/test/GainTest.cpp +2 -1
- package/common/cpp/test/OscillatorTest.cpp +2 -1
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +2 -1
- package/lib/commonjs/api.js +27 -0
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/api.web.js +8 -0
- package/lib/commonjs/api.web.js.map +1 -1
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js +7 -7
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioBufferQueueSourceNode.js +1 -6
- package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioBufferSourceNode.js +15 -0
- package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioContext.js +10 -1
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +35 -2
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/ConstantSourceNode.js +17 -0
- package/lib/commonjs/core/ConstantSourceNode.js.map +1 -0
- package/lib/commonjs/core/OfflineAudioContext.js +11 -2
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/core/WorkletProcessingNode.js +11 -0
- package/lib/commonjs/core/WorkletProcessingNode.js.map +1 -0
- package/lib/commonjs/core/WorkletSourceNode.js +11 -0
- package/lib/commonjs/core/WorkletSourceNode.js.map +1 -0
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/web-core/AudioContext.js +4 -0
- package/lib/commonjs/web-core/AudioContext.js.map +1 -1
- package/lib/commonjs/web-core/ConstantSourceNode.js +17 -0
- package/lib/commonjs/web-core/ConstantSourceNode.js.map +1 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js +4 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/module/api.js +4 -1
- package/lib/module/api.js.map +1 -1
- package/lib/module/api.web.js +1 -0
- package/lib/module/api.web.js.map +1 -1
- package/lib/module/core/AudioBufferBaseSourceNode.js +7 -7
- package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/module/core/AudioBufferQueueSourceNode.js +1 -6
- package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
- package/lib/module/core/AudioBufferSourceNode.js +15 -0
- package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/core/AudioContext.js +10 -1
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +35 -2
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/ConstantSourceNode.js +11 -0
- package/lib/module/core/ConstantSourceNode.js.map +1 -0
- package/lib/module/core/OfflineAudioContext.js +11 -2
- package/lib/module/core/OfflineAudioContext.js.map +1 -1
- package/lib/module/core/WorkletProcessingNode.js +5 -0
- package/lib/module/core/WorkletProcessingNode.js.map +1 -0
- package/lib/module/core/WorkletSourceNode.js +5 -0
- package/lib/module/core/WorkletSourceNode.js.map +1 -0
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/web-core/AudioContext.js +4 -0
- package/lib/module/web-core/AudioContext.js.map +1 -1
- package/lib/module/web-core/ConstantSourceNode.js +11 -0
- package/lib/module/web-core/ConstantSourceNode.js.map +1 -0
- package/lib/module/web-core/OfflineAudioContext.js +4 -0
- package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/typescript/api.d.ts +6 -3
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/api.web.d.ts +1 -0
- package/lib/typescript/api.web.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +2 -2
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
- package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferSourceNode.d.ts +4 -0
- package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts +1 -0
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +8 -2
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/ConstantSourceNode.d.ts +9 -0
- package/lib/typescript/core/ConstantSourceNode.d.ts.map +1 -0
- package/lib/typescript/core/OfflineAudioContext.d.ts +1 -0
- package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/WorkletProcessingNode.d.ts +4 -0
- package/lib/typescript/core/WorkletProcessingNode.d.ts.map +1 -0
- package/lib/typescript/core/WorkletSourceNode.d.ts +4 -0
- package/lib/typescript/core/WorkletSourceNode.d.ts.map +1 -0
- package/lib/typescript/events/types.d.ts +1 -0
- package/lib/typescript/events/types.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +16 -2
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +1 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +1 -0
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioContext.d.ts +2 -0
- package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/BaseAudioContext.d.ts +2 -0
- package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/ConstantSourceNode.d.ts +8 -0
- package/lib/typescript/web-core/ConstantSourceNode.d.ts.map +1 -0
- package/lib/typescript/web-core/OfflineAudioContext.d.ts +2 -0
- package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/api.ts +10 -2
- package/src/api.web.ts +1 -0
- package/src/core/AudioBufferBaseSourceNode.ts +9 -9
- package/src/core/AudioBufferQueueSourceNode.ts +1 -9
- package/src/core/AudioBufferSourceNode.ts +28 -0
- package/src/core/AudioContext.ts +12 -1
- package/src/core/BaseAudioContext.ts +90 -1
- package/src/core/ConstantSourceNode.ts +13 -0
- package/src/core/OfflineAudioContext.ts +18 -2
- package/src/core/WorkletProcessingNode.ts +3 -0
- package/src/core/WorkletSourceNode.ts +3 -0
- package/src/events/types.ts +1 -0
- package/src/interfaces.ts +42 -2
- package/src/types.ts +2 -0
- package/src/utils/index.ts +3 -0
- package/src/web-core/AudioContext.tsx +5 -0
- package/src/web-core/BaseAudioContext.tsx +2 -0
- package/src/web-core/ConstantSourceNode.tsx +12 -0
- package/src/web-core/OfflineAudioContext.tsx +5 -0
|
@@ -26,11 +26,10 @@ class AudioAPIModuleInstaller {
|
|
|
26
26
|
const std::shared_ptr<react::CallInvoker> &jsCallInvoker,
|
|
27
27
|
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
|
|
28
28
|
std::shared_ptr<worklets::WorkletRuntime> uiRuntime = nullptr) {
|
|
29
|
-
auto workletRunner = std::make_shared<UiWorkletsRunner>(uiRuntime);
|
|
30
29
|
|
|
31
|
-
auto createAudioContext = getCreateAudioContextFunction(jsiRuntime, jsCallInvoker, audioEventHandlerRegistry,
|
|
30
|
+
auto createAudioContext = getCreateAudioContextFunction(jsiRuntime, jsCallInvoker, audioEventHandlerRegistry, uiRuntime);
|
|
32
31
|
auto createAudioRecorder = getCreateAudioRecorderFunction(jsiRuntime, audioEventHandlerRegistry);
|
|
33
|
-
auto createOfflineAudioContext = getCreateOfflineAudioContextFunction(jsiRuntime, jsCallInvoker, audioEventHandlerRegistry,
|
|
32
|
+
auto createOfflineAudioContext = getCreateOfflineAudioContextFunction(jsiRuntime, jsCallInvoker, audioEventHandlerRegistry, uiRuntime);
|
|
34
33
|
|
|
35
34
|
jsiRuntime->global().setProperty(*jsiRuntime, "createAudioContext", createAudioContext);
|
|
36
35
|
jsiRuntime->global().setProperty(*jsiRuntime, "createAudioRecorder", createAudioRecorder);
|
|
@@ -45,12 +44,12 @@ class AudioAPIModuleInstaller {
|
|
|
45
44
|
jsi::Runtime *jsiRuntime,
|
|
46
45
|
const std::shared_ptr<react::CallInvoker> &jsCallInvoker,
|
|
47
46
|
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
|
|
48
|
-
const std::
|
|
47
|
+
const std::weak_ptr<worklets::WorkletRuntime> &uiRuntime) {
|
|
49
48
|
return jsi::Function::createFromHostFunction(
|
|
50
49
|
*jsiRuntime,
|
|
51
50
|
jsi::PropNameID::forAscii(*jsiRuntime, "createAudioContext"),
|
|
52
51
|
0,
|
|
53
|
-
[jsCallInvoker, audioEventHandlerRegistry,
|
|
52
|
+
[jsCallInvoker, audioEventHandlerRegistry, uiRuntime](
|
|
54
53
|
jsi::Runtime &runtime,
|
|
55
54
|
const jsi::Value &thisValue,
|
|
56
55
|
const jsi::Value *args,
|
|
@@ -58,8 +57,17 @@ class AudioAPIModuleInstaller {
|
|
|
58
57
|
std::shared_ptr<AudioContext> audioContext;
|
|
59
58
|
auto sampleRate = static_cast<float>(args[0].getNumber());
|
|
60
59
|
auto initSuspended = args[1].getBool();
|
|
61
|
-
audioContext = std::make_shared<AudioContext>(sampleRate, initSuspended, audioEventHandlerRegistry, workletRunner);
|
|
62
60
|
|
|
61
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
62
|
+
auto runtimeRegistry = RuntimeRegistry{
|
|
63
|
+
.uiRuntime = uiRuntime,
|
|
64
|
+
.audioRuntime = worklets::extractWorkletRuntime(runtime, args[2])
|
|
65
|
+
};
|
|
66
|
+
#else
|
|
67
|
+
auto runtimeRegistry = RuntimeRegistry{};
|
|
68
|
+
#endif
|
|
69
|
+
|
|
70
|
+
audioContext = std::make_shared<AudioContext>(sampleRate, initSuspended, audioEventHandlerRegistry, runtimeRegistry);
|
|
63
71
|
auto audioContextHostObject = std::make_shared<AudioContextHostObject>(
|
|
64
72
|
audioContext, &runtime, jsCallInvoker);
|
|
65
73
|
|
|
@@ -72,12 +80,12 @@ class AudioAPIModuleInstaller {
|
|
|
72
80
|
jsi::Runtime *jsiRuntime,
|
|
73
81
|
const std::shared_ptr<react::CallInvoker> &jsCallInvoker,
|
|
74
82
|
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
|
|
75
|
-
const std::
|
|
83
|
+
const std::weak_ptr<worklets::WorkletRuntime> &uiRuntime) {
|
|
76
84
|
return jsi::Function::createFromHostFunction(
|
|
77
85
|
*jsiRuntime,
|
|
78
86
|
jsi::PropNameID::forAscii(*jsiRuntime, "createOfflineAudioContext"),
|
|
79
87
|
0,
|
|
80
|
-
[jsCallInvoker, audioEventHandlerRegistry,
|
|
88
|
+
[jsCallInvoker, audioEventHandlerRegistry, uiRuntime](
|
|
81
89
|
jsi::Runtime &runtime,
|
|
82
90
|
const jsi::Value &thisValue,
|
|
83
91
|
const jsi::Value *args,
|
|
@@ -86,12 +94,21 @@ class AudioAPIModuleInstaller {
|
|
|
86
94
|
auto length = static_cast<size_t>(args[1].getNumber());
|
|
87
95
|
auto sampleRate = static_cast<float>(args[2].getNumber());
|
|
88
96
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
97
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
98
|
+
auto runtimeRegistry = RuntimeRegistry{
|
|
99
|
+
.uiRuntime = uiRuntime,
|
|
100
|
+
.audioRuntime = worklets::extractWorkletRuntime(runtime, args[3])
|
|
101
|
+
};
|
|
102
|
+
#else
|
|
103
|
+
auto runtimeRegistry = RuntimeRegistry{};
|
|
104
|
+
#endif
|
|
105
|
+
|
|
106
|
+
auto offlineAudioContext = std::make_shared<OfflineAudioContext>(numberOfChannels, length, sampleRate, audioEventHandlerRegistry, runtimeRegistry);
|
|
107
|
+
auto audioContextHostObject = std::make_shared<OfflineAudioContextHostObject>(
|
|
108
|
+
offlineAudioContext, &runtime, jsCallInvoker);
|
|
109
|
+
|
|
110
|
+
return jsi::Object::createFromHostObject(
|
|
111
|
+
runtime, audioContextHostObject);
|
|
95
112
|
});
|
|
96
113
|
}
|
|
97
114
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#include <audioapi/HostObjects/BaseAudioContextHostObject.h>
|
|
2
2
|
|
|
3
3
|
#include <audioapi/HostObjects/WorkletNodeHostObject.h>
|
|
4
|
+
#include <audioapi/HostObjects/WorkletProcessingNodeHostObject.h>
|
|
4
5
|
#include <audioapi/HostObjects/analysis/AnalyserNodeHostObject.h>
|
|
5
6
|
#include <audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h>
|
|
6
7
|
#include <audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h>
|
|
@@ -10,11 +11,12 @@
|
|
|
10
11
|
#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
|
|
11
12
|
#include <audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h>
|
|
12
13
|
#include <audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h>
|
|
14
|
+
#include <audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h>
|
|
13
15
|
#include <audioapi/HostObjects/sources/OscillatorNodeHostObject.h>
|
|
14
16
|
#include <audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h>
|
|
15
17
|
#include <audioapi/HostObjects/sources/StreamerNodeHostObject.h>
|
|
18
|
+
#include <audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h>
|
|
16
19
|
#include <audioapi/core/BaseAudioContext.h>
|
|
17
|
-
#include <audioapi/core/utils/worklets/UiWorkletsRunner.h>
|
|
18
20
|
|
|
19
21
|
namespace audioapi {
|
|
20
22
|
|
|
@@ -32,10 +34,14 @@ BaseAudioContextHostObject::BaseAudioContextHostObject(
|
|
|
32
34
|
JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, currentTime));
|
|
33
35
|
|
|
34
36
|
addFunctions(
|
|
37
|
+
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createWorkletSourceNode),
|
|
35
38
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createWorkletNode),
|
|
39
|
+
JSI_EXPORT_FUNCTION(
|
|
40
|
+
BaseAudioContextHostObject, createWorkletProcessingNode),
|
|
36
41
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createRecorderAdapter),
|
|
37
42
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createOscillator),
|
|
38
43
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStreamer),
|
|
44
|
+
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createConstantSource),
|
|
39
45
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createGain),
|
|
40
46
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStereoPanner),
|
|
41
47
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBiquadFilter),
|
|
@@ -68,16 +74,47 @@ JSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, currentTime) {
|
|
|
68
74
|
return {context_->getCurrentTime()};
|
|
69
75
|
}
|
|
70
76
|
|
|
77
|
+
JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletSourceNode) {
|
|
78
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
79
|
+
auto shareableWorklet =
|
|
80
|
+
worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(
|
|
81
|
+
runtime, args[0]);
|
|
82
|
+
std::weak_ptr<worklets::WorkletRuntime> workletRuntime;
|
|
83
|
+
auto shouldUseUiRuntime = args[1].getBool();
|
|
84
|
+
if (shouldUseUiRuntime) {
|
|
85
|
+
workletRuntime = context_->runtimeRegistry_.uiRuntime;
|
|
86
|
+
} else {
|
|
87
|
+
workletRuntime = context_->runtimeRegistry_.audioRuntime;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
auto workletSourceNode =
|
|
91
|
+
context_->createWorkletSourceNode(shareableWorklet, workletRuntime);
|
|
92
|
+
auto workletSourceNodeHostObject =
|
|
93
|
+
std::make_shared<WorkletSourceNodeHostObject>(workletSourceNode);
|
|
94
|
+
return jsi::Object::createFromHostObject(
|
|
95
|
+
runtime, workletSourceNodeHostObject);
|
|
96
|
+
#endif
|
|
97
|
+
return jsi::Value::undefined();
|
|
98
|
+
}
|
|
99
|
+
|
|
71
100
|
JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletNode) {
|
|
72
101
|
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
73
102
|
auto shareableWorklet =
|
|
74
103
|
worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(
|
|
75
104
|
runtime, args[0]);
|
|
76
|
-
|
|
77
|
-
|
|
105
|
+
|
|
106
|
+
std::weak_ptr<worklets::WorkletRuntime> workletRuntime;
|
|
107
|
+
auto shouldUseUiRuntime = args[1].getBool();
|
|
108
|
+
if (shouldUseUiRuntime) {
|
|
109
|
+
workletRuntime = context_->runtimeRegistry_.uiRuntime;
|
|
110
|
+
} else {
|
|
111
|
+
workletRuntime = context_->runtimeRegistry_.audioRuntime;
|
|
112
|
+
}
|
|
113
|
+
auto bufferLength = static_cast<size_t>(args[2].getNumber());
|
|
114
|
+
auto inputChannelCount = static_cast<size_t>(args[3].getNumber());
|
|
78
115
|
|
|
79
116
|
auto workletNode = context_->createWorkletNode(
|
|
80
|
-
shareableWorklet, bufferLength, inputChannelCount);
|
|
117
|
+
shareableWorklet, workletRuntime, bufferLength, inputChannelCount);
|
|
81
118
|
auto workletNodeHostObject =
|
|
82
119
|
std::make_shared<WorkletNodeHostObject>(workletNode);
|
|
83
120
|
return jsi::Object::createFromHostObject(runtime, workletNodeHostObject);
|
|
@@ -85,6 +122,32 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletNode) {
|
|
|
85
122
|
return jsi::Value::undefined();
|
|
86
123
|
}
|
|
87
124
|
|
|
125
|
+
JSI_HOST_FUNCTION_IMPL(
|
|
126
|
+
BaseAudioContextHostObject,
|
|
127
|
+
createWorkletProcessingNode) {
|
|
128
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
129
|
+
auto shareableWorklet =
|
|
130
|
+
worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(
|
|
131
|
+
runtime, args[0]);
|
|
132
|
+
|
|
133
|
+
std::weak_ptr<worklets::WorkletRuntime> workletRuntime;
|
|
134
|
+
auto shouldUseUiRuntime = args[1].getBool();
|
|
135
|
+
if (shouldUseUiRuntime) {
|
|
136
|
+
workletRuntime = context_->runtimeRegistry_.uiRuntime;
|
|
137
|
+
} else {
|
|
138
|
+
workletRuntime = context_->runtimeRegistry_.audioRuntime;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
auto workletProcessingNode =
|
|
142
|
+
context_->createWorkletProcessingNode(shareableWorklet, workletRuntime);
|
|
143
|
+
auto workletProcessingNodeHostObject =
|
|
144
|
+
std::make_shared<WorkletProcessingNodeHostObject>(workletProcessingNode);
|
|
145
|
+
return jsi::Object::createFromHostObject(
|
|
146
|
+
runtime, workletProcessingNodeHostObject);
|
|
147
|
+
#endif
|
|
148
|
+
return jsi::Value::undefined();
|
|
149
|
+
}
|
|
150
|
+
|
|
88
151
|
JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createRecorderAdapter) {
|
|
89
152
|
auto recorderAdapter = context_->createRecorderAdapter();
|
|
90
153
|
auto recorderAdapterHostObject =
|
|
@@ -108,6 +171,13 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createStreamer) {
|
|
|
108
171
|
return object;
|
|
109
172
|
}
|
|
110
173
|
|
|
174
|
+
JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createConstantSource) {
|
|
175
|
+
auto constantSource = context_->createConstantSource();
|
|
176
|
+
auto constantSourceHostObject =
|
|
177
|
+
std::make_shared<ConstantSourceNodeHostObject>(constantSource);
|
|
178
|
+
return jsi::Object::createFromHostObject(runtime, constantSourceHostObject);
|
|
179
|
+
}
|
|
180
|
+
|
|
111
181
|
JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createGain) {
|
|
112
182
|
auto gain = context_->createGain();
|
|
113
183
|
auto gainHostObject = std::make_shared<GainNodeHostObject>(gain);
|
|
@@ -26,10 +26,13 @@ class BaseAudioContextHostObject : public JsiHostObject {
|
|
|
26
26
|
JSI_PROPERTY_GETTER_DECL(sampleRate);
|
|
27
27
|
JSI_PROPERTY_GETTER_DECL(currentTime);
|
|
28
28
|
|
|
29
|
+
JSI_HOST_FUNCTION_DECL(createWorkletSourceNode);
|
|
29
30
|
JSI_HOST_FUNCTION_DECL(createWorkletNode);
|
|
31
|
+
JSI_HOST_FUNCTION_DECL(createWorkletProcessingNode);
|
|
30
32
|
JSI_HOST_FUNCTION_DECL(createRecorderAdapter);
|
|
31
33
|
JSI_HOST_FUNCTION_DECL(createOscillator);
|
|
32
34
|
JSI_HOST_FUNCTION_DECL(createStreamer);
|
|
35
|
+
JSI_HOST_FUNCTION_DECL(createConstantSource);
|
|
33
36
|
JSI_HOST_FUNCTION_DECL(createGain);
|
|
34
37
|
JSI_HOST_FUNCTION_DECL(createStereoPanner);
|
|
35
38
|
JSI_HOST_FUNCTION_DECL(createBiquadFilter);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/HostObjects/AudioNodeHostObject.h>
|
|
4
|
+
#include <audioapi/core/effects/WorkletProcessingNode.h>
|
|
5
|
+
|
|
6
|
+
#include <memory>
|
|
7
|
+
#include <vector>
|
|
8
|
+
|
|
9
|
+
namespace audioapi {
|
|
10
|
+
using namespace facebook;
|
|
11
|
+
|
|
12
|
+
class WorkletProcessingNodeHostObject : public AudioNodeHostObject {
|
|
13
|
+
public:
|
|
14
|
+
explicit WorkletProcessingNodeHostObject(const std::shared_ptr<WorkletProcessingNode> &node)
|
|
15
|
+
: AudioNodeHostObject(node) {
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
} // namespace audioapi
|
|
@@ -19,7 +19,8 @@ AudioBufferSourceNodeHostObject::AudioBufferSourceNodeHostObject(
|
|
|
19
19
|
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loop),
|
|
20
20
|
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopSkip),
|
|
21
21
|
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopStart),
|
|
22
|
-
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopEnd)
|
|
22
|
+
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopEnd),
|
|
23
|
+
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, onLoopEnded));
|
|
23
24
|
|
|
24
25
|
// start method is overridden in this class
|
|
25
26
|
functions_->erase("start");
|
|
@@ -29,6 +30,16 @@ AudioBufferSourceNodeHostObject::AudioBufferSourceNodeHostObject(
|
|
|
29
30
|
JSI_EXPORT_FUNCTION(AudioBufferSourceNodeHostObject, setBuffer));
|
|
30
31
|
}
|
|
31
32
|
|
|
33
|
+
AudioBufferSourceNodeHostObject::~AudioBufferSourceNodeHostObject() {
|
|
34
|
+
auto audioBufferSourceNode =
|
|
35
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
36
|
+
|
|
37
|
+
// When JSI object is garbage collected (together with the eventual callback),
|
|
38
|
+
// underlying source node might still be active and try to call the
|
|
39
|
+
// non-existing callback.
|
|
40
|
+
audioBufferSourceNode->clearOnLoopEndedCallback();
|
|
41
|
+
}
|
|
42
|
+
|
|
32
43
|
JSI_PROPERTY_GETTER_IMPL(AudioBufferSourceNodeHostObject, loop) {
|
|
33
44
|
auto audioBufferSourceNode =
|
|
34
45
|
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
@@ -94,6 +105,14 @@ JSI_PROPERTY_SETTER_IMPL(AudioBufferSourceNodeHostObject, loopEnd) {
|
|
|
94
105
|
audioBufferSourceNode->setLoopEnd(value.getNumber());
|
|
95
106
|
}
|
|
96
107
|
|
|
108
|
+
JSI_PROPERTY_SETTER_IMPL(AudioBufferSourceNodeHostObject, onLoopEnded) {
|
|
109
|
+
auto audioBufferSourceNode =
|
|
110
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
111
|
+
|
|
112
|
+
audioBufferSourceNode->setOnLoopEndedCallbackId(
|
|
113
|
+
std::stoull(value.getString(runtime).utf8(runtime)));
|
|
114
|
+
}
|
|
115
|
+
|
|
97
116
|
JSI_HOST_FUNCTION_IMPL(AudioBufferSourceNodeHostObject, start) {
|
|
98
117
|
auto when = args[0].getNumber();
|
|
99
118
|
auto offset = args[1].getNumber();
|
|
@@ -16,6 +16,8 @@ class AudioBufferSourceNodeHostObject
|
|
|
16
16
|
explicit AudioBufferSourceNodeHostObject(
|
|
17
17
|
const std::shared_ptr<AudioBufferSourceNode> &node);
|
|
18
18
|
|
|
19
|
+
~AudioBufferSourceNodeHostObject() override;
|
|
20
|
+
|
|
19
21
|
JSI_PROPERTY_GETTER_DECL(loop);
|
|
20
22
|
JSI_PROPERTY_GETTER_DECL(loopSkip);
|
|
21
23
|
JSI_PROPERTY_GETTER_DECL(buffer);
|
|
@@ -26,6 +28,7 @@ class AudioBufferSourceNodeHostObject
|
|
|
26
28
|
JSI_PROPERTY_SETTER_DECL(loopSkip);
|
|
27
29
|
JSI_PROPERTY_SETTER_DECL(loopStart);
|
|
28
30
|
JSI_PROPERTY_SETTER_DECL(loopEnd);
|
|
31
|
+
JSI_PROPERTY_SETTER_DECL(onLoopEnded);
|
|
29
32
|
|
|
30
33
|
JSI_HOST_FUNCTION_DECL(start);
|
|
31
34
|
JSI_HOST_FUNCTION_DECL(setBuffer);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#include <audioapi/HostObjects/AudioParamHostObject.h>
|
|
2
|
+
#include <audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h>
|
|
3
|
+
#include <audioapi/core/sources/ConstantSourceNode.h>
|
|
4
|
+
|
|
5
|
+
namespace audioapi {
|
|
6
|
+
|
|
7
|
+
ConstantSourceNodeHostObject::ConstantSourceNodeHostObject(
|
|
8
|
+
const std::shared_ptr<ConstantSourceNode> &node)
|
|
9
|
+
: AudioScheduledSourceNodeHostObject(node) {
|
|
10
|
+
addGetters(JSI_EXPORT_PROPERTY_GETTER(ConstantSourceNodeHostObject, offset));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
JSI_PROPERTY_GETTER_IMPL(ConstantSourceNodeHostObject, offset) {
|
|
14
|
+
auto constantSourceNode = std::static_pointer_cast<ConstantSourceNode>(node_);
|
|
15
|
+
auto offsetParam_ = std::make_shared<AudioParamHostObject>(
|
|
16
|
+
constantSourceNode->getOffsetParam());
|
|
17
|
+
return jsi::Object::createFromHostObject(runtime, offsetParam_);
|
|
18
|
+
}
|
|
19
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h>
|
|
4
|
+
|
|
5
|
+
#include <memory>
|
|
6
|
+
#include <string>
|
|
7
|
+
#include <vector>
|
|
8
|
+
|
|
9
|
+
namespace audioapi {
|
|
10
|
+
using namespace facebook;
|
|
11
|
+
|
|
12
|
+
class ConstantSourceNode;
|
|
13
|
+
|
|
14
|
+
class ConstantSourceNodeHostObject : public AudioScheduledSourceNodeHostObject {
|
|
15
|
+
public:
|
|
16
|
+
explicit ConstantSourceNodeHostObject(
|
|
17
|
+
const std::shared_ptr<ConstantSourceNode> &node);
|
|
18
|
+
|
|
19
|
+
JSI_PROPERTY_GETTER_DECL(offset);
|
|
20
|
+
};
|
|
21
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h>
|
|
4
|
+
#include <audioapi/core/sources/WorkletSourceNode.h>
|
|
5
|
+
|
|
6
|
+
#include <memory>
|
|
7
|
+
#include <vector>
|
|
8
|
+
|
|
9
|
+
namespace audioapi {
|
|
10
|
+
using namespace facebook;
|
|
11
|
+
|
|
12
|
+
class WorkletSourceNodeHostObject : public AudioScheduledSourceNodeHostObject {
|
|
13
|
+
public:
|
|
14
|
+
explicit WorkletSourceNodeHostObject(const std::shared_ptr<WorkletSourceNode> &node)
|
|
15
|
+
: AudioScheduledSourceNodeHostObject(node) {
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
} // namespace audioapi
|
|
@@ -15,8 +15,8 @@ AudioContext::AudioContext(
|
|
|
15
15
|
bool initSuspended,
|
|
16
16
|
const std::shared_ptr<IAudioEventHandlerRegistry>
|
|
17
17
|
&audioEventHandlerRegistry,
|
|
18
|
-
const
|
|
19
|
-
: BaseAudioContext(audioEventHandlerRegistry,
|
|
18
|
+
const RuntimeRegistry &runtimeRegistry)
|
|
19
|
+
: BaseAudioContext(audioEventHandlerRegistry, runtimeRegistry) {
|
|
20
20
|
#ifdef ANDROID
|
|
21
21
|
audioPlayer_ = std::make_shared<AudioPlayer>(
|
|
22
22
|
this->renderAudio(), sampleRate, destination_->getChannelCount());
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include <audioapi/core/BaseAudioContext.h>
|
|
4
|
-
#include <audioapi/core/utils/worklets/
|
|
4
|
+
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
5
5
|
|
|
6
6
|
#include <memory>
|
|
7
7
|
#include <functional>
|
|
@@ -15,7 +15,7 @@ class IOSAudioPlayer;
|
|
|
15
15
|
|
|
16
16
|
class AudioContext : public BaseAudioContext {
|
|
17
17
|
public:
|
|
18
|
-
explicit AudioContext(float sampleRate, bool initSuspended, const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const
|
|
18
|
+
explicit AudioContext(float sampleRate, bool initSuspended, const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const RuntimeRegistry &runtimeRegistry);
|
|
19
19
|
~AudioContext() override;
|
|
20
20
|
|
|
21
21
|
void close();
|
|
@@ -219,9 +219,9 @@ void AudioParam::setValueCurveAtTime(
|
|
|
219
219
|
(time - startTime)));
|
|
220
220
|
// Calculate interpolation factor between adjacent array elements
|
|
221
221
|
auto factor = static_cast<float>(
|
|
222
|
-
k -
|
|
223
222
|
(time - startTime) * static_cast<double>(length - 1) /
|
|
224
|
-
(endTime - startTime)
|
|
223
|
+
(endTime - startTime) -
|
|
224
|
+
k);
|
|
225
225
|
return dsp::linearInterpolate(values->data(), k, k + 1, factor);
|
|
226
226
|
}
|
|
227
227
|
|
|
@@ -5,12 +5,15 @@
|
|
|
5
5
|
#include <audioapi/core/effects/GainNode.h>
|
|
6
6
|
#include <audioapi/core/effects/StereoPannerNode.h>
|
|
7
7
|
#include <audioapi/core/effects/WorkletNode.h>
|
|
8
|
+
#include <audioapi/core/effects/WorkletProcessingNode.h>
|
|
8
9
|
#include <audioapi/core/sources/AudioBuffer.h>
|
|
9
10
|
#include <audioapi/core/sources/AudioBufferQueueSourceNode.h>
|
|
10
11
|
#include <audioapi/core/sources/AudioBufferSourceNode.h>
|
|
12
|
+
#include <audioapi/core/sources/ConstantSourceNode.h>
|
|
11
13
|
#include <audioapi/core/sources/OscillatorNode.h>
|
|
12
14
|
#include <audioapi/core/sources/RecorderAdapterNode.h>
|
|
13
15
|
#include <audioapi/core/sources/StreamerNode.h>
|
|
16
|
+
#include <audioapi/core/sources/WorkletSourceNode.h>
|
|
14
17
|
#include <audioapi/core/utils/AudioDecoder.h>
|
|
15
18
|
#include <audioapi/core/utils/AudioNodeManager.h>
|
|
16
19
|
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
@@ -24,12 +27,12 @@ namespace audioapi {
|
|
|
24
27
|
BaseAudioContext::BaseAudioContext(
|
|
25
28
|
const std::shared_ptr<IAudioEventHandlerRegistry>
|
|
26
29
|
&audioEventHandlerRegistry,
|
|
27
|
-
const
|
|
30
|
+
const RuntimeRegistry &runtimeRegistry) {
|
|
28
31
|
nodeManager_ = std::make_shared<AudioNodeManager>();
|
|
29
32
|
destination_ = std::make_shared<AudioDestinationNode>(this);
|
|
30
33
|
|
|
31
34
|
audioEventHandlerRegistry_ = audioEventHandlerRegistry;
|
|
32
|
-
|
|
35
|
+
runtimeRegistry_ = runtimeRegistry;
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
std::string BaseAudioContext::getState() {
|
|
@@ -62,16 +65,36 @@ std::shared_ptr<AudioDestinationNode> BaseAudioContext::getDestination() {
|
|
|
62
65
|
return destination_;
|
|
63
66
|
}
|
|
64
67
|
|
|
68
|
+
std::shared_ptr<WorkletSourceNode> BaseAudioContext::createWorkletSourceNode(
|
|
69
|
+
std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
|
|
70
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime) {
|
|
71
|
+
auto workletSourceNode =
|
|
72
|
+
std::make_shared<WorkletSourceNode>(this, shareableWorklet, runtime);
|
|
73
|
+
nodeManager_->addSourceNode(workletSourceNode);
|
|
74
|
+
return workletSourceNode;
|
|
75
|
+
}
|
|
76
|
+
|
|
65
77
|
std::shared_ptr<WorkletNode> BaseAudioContext::createWorkletNode(
|
|
66
78
|
std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
|
|
79
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime,
|
|
67
80
|
size_t bufferLength,
|
|
68
81
|
size_t inputChannelCount) {
|
|
69
82
|
auto workletNode = std::make_shared<WorkletNode>(
|
|
70
|
-
this, shareableWorklet, bufferLength, inputChannelCount);
|
|
83
|
+
this, shareableWorklet, runtime, bufferLength, inputChannelCount);
|
|
71
84
|
nodeManager_->addProcessingNode(workletNode);
|
|
72
85
|
return workletNode;
|
|
73
86
|
}
|
|
74
87
|
|
|
88
|
+
std::shared_ptr<WorkletProcessingNode>
|
|
89
|
+
BaseAudioContext::createWorkletProcessingNode(
|
|
90
|
+
std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
|
|
91
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime) {
|
|
92
|
+
auto workletProcessingNode =
|
|
93
|
+
std::make_shared<WorkletProcessingNode>(this, shareableWorklet, runtime);
|
|
94
|
+
nodeManager_->addProcessingNode(workletProcessingNode);
|
|
95
|
+
return workletProcessingNode;
|
|
96
|
+
}
|
|
97
|
+
|
|
75
98
|
std::shared_ptr<RecorderAdapterNode> BaseAudioContext::createRecorderAdapter() {
|
|
76
99
|
auto recorderAdapter = std::make_shared<RecorderAdapterNode>(this);
|
|
77
100
|
nodeManager_->addProcessingNode(recorderAdapter);
|
|
@@ -84,6 +107,12 @@ std::shared_ptr<OscillatorNode> BaseAudioContext::createOscillator() {
|
|
|
84
107
|
return oscillator;
|
|
85
108
|
}
|
|
86
109
|
|
|
110
|
+
std::shared_ptr<ConstantSourceNode> BaseAudioContext::createConstantSource() {
|
|
111
|
+
auto constantSource = std::make_shared<ConstantSourceNode>(this);
|
|
112
|
+
nodeManager_->addSourceNode(constantSource);
|
|
113
|
+
return constantSource;
|
|
114
|
+
}
|
|
115
|
+
|
|
87
116
|
#ifndef AUDIO_API_TEST_SUITE
|
|
88
117
|
std::shared_ptr<StreamerNode> BaseAudioContext::createStreamer() {
|
|
89
118
|
auto streamer = std::make_shared<StreamerNode>(this);
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
#include <audioapi/core/types/ContextState.h>
|
|
4
4
|
#include <audioapi/core/types/OscillatorType.h>
|
|
5
|
-
#include <audioapi/core/utils/worklets/UiWorkletsRunner.h>
|
|
6
5
|
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
7
6
|
|
|
8
7
|
#include <functional>
|
|
@@ -21,6 +20,7 @@ class GainNode;
|
|
|
21
20
|
class AudioBuffer;
|
|
22
21
|
class PeriodicWave;
|
|
23
22
|
class OscillatorNode;
|
|
23
|
+
class ConstantSourceNode;
|
|
24
24
|
class StereoPannerNode;
|
|
25
25
|
class AudioNodeManager;
|
|
26
26
|
class BiquadFilterNode;
|
|
@@ -32,12 +32,14 @@ class AnalyserNode;
|
|
|
32
32
|
class AudioEventHandlerRegistry;
|
|
33
33
|
class IAudioEventHandlerRegistry;
|
|
34
34
|
class RecorderAdapterNode;
|
|
35
|
+
class WorkletSourceNode;
|
|
35
36
|
class WorkletNode;
|
|
37
|
+
class WorkletProcessingNode;
|
|
36
38
|
class StreamerNode;
|
|
37
39
|
|
|
38
40
|
class BaseAudioContext {
|
|
39
41
|
public:
|
|
40
|
-
explicit BaseAudioContext(const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const
|
|
42
|
+
explicit BaseAudioContext(const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const RuntimeRegistry &runtimeRegistry);
|
|
41
43
|
virtual ~BaseAudioContext() = default;
|
|
42
44
|
|
|
43
45
|
std::string getState();
|
|
@@ -47,8 +49,11 @@ class BaseAudioContext {
|
|
|
47
49
|
std::shared_ptr<AudioDestinationNode> getDestination();
|
|
48
50
|
|
|
49
51
|
std::shared_ptr<RecorderAdapterNode> createRecorderAdapter();
|
|
50
|
-
std::shared_ptr<
|
|
52
|
+
std::shared_ptr<WorkletSourceNode> createWorkletSourceNode(std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet, std::weak_ptr<worklets::WorkletRuntime> runtime);
|
|
53
|
+
std::shared_ptr<WorkletNode> createWorkletNode(std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet, std::weak_ptr<worklets::WorkletRuntime> runtime, size_t bufferLength, size_t inputChannelCount);
|
|
54
|
+
std::shared_ptr<WorkletProcessingNode> createWorkletProcessingNode(std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet, std::weak_ptr<worklets::WorkletRuntime> runtime);
|
|
51
55
|
std::shared_ptr<OscillatorNode> createOscillator();
|
|
56
|
+
std::shared_ptr<ConstantSourceNode> createConstantSource();
|
|
52
57
|
std::shared_ptr<StreamerNode> createStreamer();
|
|
53
58
|
std::shared_ptr<GainNode> createGain();
|
|
54
59
|
std::shared_ptr<StereoPannerNode> createStereoPanner();
|
|
@@ -96,7 +101,7 @@ class BaseAudioContext {
|
|
|
96
101
|
|
|
97
102
|
public:
|
|
98
103
|
std::shared_ptr<IAudioEventHandlerRegistry> audioEventHandlerRegistry_;
|
|
99
|
-
|
|
104
|
+
RuntimeRegistry runtimeRegistry_;
|
|
100
105
|
};
|
|
101
106
|
|
|
102
107
|
} // namespace audioapi
|
|
@@ -24,8 +24,8 @@ OfflineAudioContext::OfflineAudioContext(
|
|
|
24
24
|
float sampleRate,
|
|
25
25
|
const std::shared_ptr<IAudioEventHandlerRegistry>
|
|
26
26
|
&audioEventHandlerRegistry,
|
|
27
|
-
const
|
|
28
|
-
: BaseAudioContext(audioEventHandlerRegistry,
|
|
27
|
+
const RuntimeRegistry &runtimeRegistry)
|
|
28
|
+
: BaseAudioContext(audioEventHandlerRegistry, runtimeRegistry),
|
|
29
29
|
length_(length),
|
|
30
30
|
numberOfChannels_(numberOfChannels),
|
|
31
31
|
currentSampleFrame_(0) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include "BaseAudioContext.h"
|
|
4
|
-
#include <audioapi/core/utils/worklets/
|
|
4
|
+
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
5
5
|
|
|
6
6
|
#include <mutex>
|
|
7
7
|
#include <map>
|
|
@@ -15,7 +15,7 @@ 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
|
|
18
|
+
explicit OfflineAudioContext(int numberOfChannels, size_t length, float sampleRate, const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const RuntimeRegistry &runtimeRegistry);
|
|
19
19
|
~OfflineAudioContext() override;
|
|
20
20
|
|
|
21
21
|
void resume();
|
|
@@ -5,12 +5,13 @@ namespace audioapi {
|
|
|
5
5
|
WorkletNode::WorkletNode(
|
|
6
6
|
BaseAudioContext *context,
|
|
7
7
|
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
8
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime,
|
|
8
9
|
size_t bufferLength,
|
|
9
10
|
size_t inputChannelCount)
|
|
10
11
|
: AudioNode(context),
|
|
11
12
|
buffRealLength_(bufferLength * sizeof(float)),
|
|
12
13
|
bufferLength_(bufferLength),
|
|
13
|
-
workletRunner_(
|
|
14
|
+
workletRunner_(runtime),
|
|
14
15
|
shareableWorklet_(worklet),
|
|
15
16
|
inputChannelCount_(inputChannelCount),
|
|
16
17
|
curBuffIndex_(0) {
|
|
@@ -57,7 +58,7 @@ void WorkletNode::processNode(
|
|
|
57
58
|
if (curBuffIndex_ == bufferLength_) {
|
|
58
59
|
// Reset buffer index, channel buffers and execute worklet
|
|
59
60
|
curBuffIndex_ = 0;
|
|
60
|
-
workletRunner_
|
|
61
|
+
workletRunner_.executeOnRuntimeGuardedSync(
|
|
61
62
|
[this, channelCount_](jsi::Runtime &uiRuntimeRaw) {
|
|
62
63
|
/// Arguments preparation
|
|
63
64
|
auto jsArray = jsi::Array(uiRuntimeRaw, channelCount_);
|
|
@@ -73,7 +74,7 @@ void WorkletNode::processNode(
|
|
|
73
74
|
jsArray.setExternalMemoryPressure(
|
|
74
75
|
uiRuntimeRaw, channelCount_ * buffRealLength_);
|
|
75
76
|
|
|
76
|
-
workletRunner_
|
|
77
|
+
workletRunner_.executeWorklet(
|
|
77
78
|
shareableWorklet_,
|
|
78
79
|
std::move(jsArray),
|
|
79
80
|
jsi::Value(uiRuntimeRaw, static_cast<int>(channelCount_)));
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
#include <jsi/jsi.h>
|
|
5
|
-
#include <audioapi/core/utils/worklets/
|
|
5
|
+
#include <audioapi/core/utils/worklets/WorkletsRunner.h>
|
|
6
6
|
#include <audioapi/core/AudioNode.h>
|
|
7
7
|
#include <audioapi/core/BaseAudioContext.h>
|
|
8
8
|
#include <audioapi/utils/AudioBus.h>
|
|
@@ -20,10 +20,10 @@ class WorkletNode : public AudioNode {
|
|
|
20
20
|
explicit WorkletNode(
|
|
21
21
|
BaseAudioContext *context,
|
|
22
22
|
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
23
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime,
|
|
23
24
|
size_t bufferLength,
|
|
24
25
|
size_t inputChannelCount
|
|
25
26
|
) : AudioNode(context) {}
|
|
26
|
-
~WorkletNode() override = default;
|
|
27
27
|
|
|
28
28
|
protected:
|
|
29
29
|
void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override {}
|
|
@@ -37,6 +37,7 @@ class WorkletNode : public AudioNode {
|
|
|
37
37
|
explicit WorkletNode(
|
|
38
38
|
BaseAudioContext *context,
|
|
39
39
|
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
40
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime,
|
|
40
41
|
size_t bufferLength,
|
|
41
42
|
size_t inputChannelCount
|
|
42
43
|
);
|
|
@@ -48,7 +49,7 @@ class WorkletNode : public AudioNode {
|
|
|
48
49
|
|
|
49
50
|
|
|
50
51
|
private:
|
|
51
|
-
|
|
52
|
+
WorkletsRunner workletRunner_;
|
|
52
53
|
std::shared_ptr<worklets::SerializableWorklet> shareableWorklet_;
|
|
53
54
|
std::vector<uint8_t*> buffs_;
|
|
54
55
|
|