Skip to content

Commit 971bf36

Browse files
refactor: update AudioNodeHostObject to use Graph and HostNode
1 parent c607534 commit 971bf36

32 files changed

Lines changed: 346 additions & 374 deletions

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
#include <audioapi/core/AudioNode.h>
55

66
#include <memory>
7+
#include <utility>
78

89
namespace audioapi {
910

1011
AudioNodeHostObject::AudioNodeHostObject(
11-
const std::shared_ptr<AudioNode> &node,
12+
const std::shared_ptr<utils::graph::Graph> &graph,
13+
std::unique_ptr<AudioNode> node,
1214
const AudioNodeOptions &options)
13-
: node_(node),
15+
: utils::graph::HostNode(graph, std::move(node)),
1416
numberOfInputs_(options.numberOfInputs),
1517
numberOfOutputs_(options.numberOfOutputs),
1618
channelCount_(options.channelCount),
@@ -60,29 +62,32 @@ JSI_HOST_FUNCTION_IMPL(AudioNodeHostObject, connect) {
6062
auto obj = args[0].getObject(runtime);
6163
if (obj.isHostObject<AudioNodeHostObject>(runtime)) {
6264
auto node = obj.getHostObject<AudioNodeHostObject>(runtime);
63-
node_->connect(std::shared_ptr<AudioNodeHostObject>(node)->node_);
65+
connectNode(*node);
6466
}
6567
if (obj.isHostObject<AudioParamHostObject>(runtime)) {
6668
auto param = obj.getHostObject<AudioParamHostObject>(runtime);
67-
node_->connect(std::shared_ptr<AudioParamHostObject>(param)->param_);
69+
// TODO
70+
// connectParam(*param->owner_, param->param_.get());
6871
}
6972
return jsi::Value::undefined();
7073
}
7174

7275
JSI_HOST_FUNCTION_IMPL(AudioNodeHostObject, disconnect) {
7376
if (args[0].isUndefined()) {
74-
node_->disconnect();
77+
// TODO
78+
// node_->disconnect();
7579
return jsi::Value::undefined();
7680
}
7781
auto obj = args[0].getObject(runtime);
7882
if (obj.isHostObject<AudioNodeHostObject>(runtime)) {
7983
auto node = obj.getHostObject<AudioNodeHostObject>(runtime);
80-
node_->disconnect(std::shared_ptr<AudioNodeHostObject>(node)->node_);
84+
disconnectNode(*node);
8185
}
8286

8387
if (obj.isHostObject<AudioParamHostObject>(runtime)) {
8488
auto param = obj.getHostObject<AudioParamHostObject>(runtime);
85-
node_->disconnect(std::shared_ptr<AudioParamHostObject>(param)->param_);
89+
// TODO
90+
// disconnectParam(*param->owner_, param->param_.get());
8691
}
8792
return jsi::Value::undefined();
8893
}

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/AudioNodeHostObject.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
#include <audioapi/core/types/ChannelCountMode.h>
44
#include <audioapi/core/types/ChannelInterpretation.h>
5+
#include <audioapi/core/utils/graph/Graph.hpp>
6+
#include <audioapi/core/utils/graph/HostNode.hpp>
57
#include <audioapi/jsi/JsiHostObject.h>
68
#include <audioapi/types/NodeOptions.h>
79

@@ -13,10 +15,11 @@ using namespace facebook;
1315

1416
class AudioNode;
1517

16-
class AudioNodeHostObject : public JsiHostObject {
18+
class AudioNodeHostObject : public JsiHostObject, public utils::graph::HostNode {
1719
public:
1820
explicit AudioNodeHostObject(
19-
const std::shared_ptr<AudioNode> &node,
21+
const std::shared_ptr<utils::graph::Graph> &graph,
22+
std::unique_ptr<AudioNode> node,
2023
const AudioNodeOptions &options = AudioNodeOptions());
2124
~AudioNodeHostObject() override;
2225

@@ -30,8 +33,6 @@ class AudioNodeHostObject : public JsiHostObject {
3033
JSI_HOST_FUNCTION_DECL(disconnect);
3134

3235
protected:
33-
std::shared_ptr<AudioNode> node_;
34-
3536
const int numberOfInputs_;
3637
const int numberOfOutputs_;
3738
size_t channelCount_;

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp

Lines changed: 24 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ BaseAudioContextHostObject::BaseAudioContextHostObject(
3636
promiseVendor_(std::make_shared<PromiseVendor>(runtime, callInvoker)),
3737
callInvoker_(callInvoker) {
3838
context_->initialize();
39-
destination_ = std::make_shared<AudioDestinationNodeHostObject>(context_->getDestination());
39+
// TODO
40+
// destination_ = std::make_shared<AudioDestinationNodeHostObject>(context_->getGraph(), context_->getDestination());
4041

4142
addGetters(
4243
JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, destination),
@@ -92,19 +93,13 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletSourceNode) {
9293
#if RN_AUDIO_API_ENABLE_WORKLETS
9394
auto shareableWorklet =
9495
worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(runtime, args[0]);
95-
std::weak_ptr<worklets::WorkletRuntime> workletRuntime;
9696
auto shouldUseUiRuntime = args[1].getBool();
97-
auto shouldLockRuntime = shouldUseUiRuntime;
98-
if (shouldUseUiRuntime) {
99-
workletRuntime = context_->getRuntimeRegistry().uiRuntime;
100-
} else {
101-
workletRuntime = context_->getRuntimeRegistry().audioRuntime;
102-
}
97+
std::weak_ptr<worklets::WorkletRuntime> workletRuntime = shouldUseUiRuntime
98+
? context_->getRuntimeRegistry().uiRuntime
99+
: context_->getRuntimeRegistry().audioRuntime;
103100

104-
auto workletSourceNode =
105-
context_->createWorkletSourceNode(shareableWorklet, workletRuntime, shouldLockRuntime);
106-
auto workletSourceNodeHostObject =
107-
std::make_shared<WorkletSourceNodeHostObject>(workletSourceNode);
101+
auto workletSourceNodeHostObject = std::make_shared<WorkletSourceNodeHostObject>(
102+
context_->getGraph(), context_, workletRuntime, shareableWorklet, shouldUseUiRuntime);
108103
return jsi::Object::createFromHostObject(runtime, workletSourceNodeHostObject);
109104
#endif
110105
return jsi::Value::undefined();
@@ -114,21 +109,21 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletNode) {
114109
#if RN_AUDIO_API_ENABLE_WORKLETS
115110
auto shareableWorklet =
116111
worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(runtime, args[0]);
117-
118-
std::weak_ptr<worklets::WorkletRuntime> workletRuntime;
119112
auto shouldUseUiRuntime = args[1].getBool();
120-
auto shouldLockRuntime = shouldUseUiRuntime;
121-
if (shouldUseUiRuntime) {
122-
workletRuntime = context_->getRuntimeRegistry().uiRuntime;
123-
} else {
124-
workletRuntime = context_->getRuntimeRegistry().audioRuntime;
125-
}
113+
std::weak_ptr<worklets::WorkletRuntime> workletRuntime = shouldUseUiRuntime
114+
? context_->getRuntimeRegistry().uiRuntime
115+
: context_->getRuntimeRegistry().audioRuntime;
126116
auto bufferLength = static_cast<size_t>(args[2].getNumber());
127117
auto inputChannelCount = static_cast<size_t>(args[3].getNumber());
128118

129-
auto workletNode = context_->createWorkletNode(
130-
shareableWorklet, workletRuntime, bufferLength, inputChannelCount, shouldLockRuntime);
131-
auto workletNodeHostObject = std::make_shared<WorkletNodeHostObject>(workletNode);
119+
auto workletNodeHostObject = std::make_shared<WorkletNodeHostObject>(
120+
context_->getGraph(),
121+
context_,
122+
workletRuntime,
123+
shareableWorklet,
124+
shouldUseUiRuntime,
125+
bufferLength,
126+
inputChannelCount);
132127
auto jsiObject = jsi::Object::createFromHostObject(runtime, workletNodeHostObject);
133128
jsiObject.setExternalMemoryPressure(
134129
runtime,
@@ -142,28 +137,20 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletProcessingNode)
142137
#if RN_AUDIO_API_ENABLE_WORKLETS
143138
auto shareableWorklet =
144139
worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(runtime, args[0]);
145-
146-
std::weak_ptr<worklets::WorkletRuntime> workletRuntime;
147140
auto shouldUseUiRuntime = args[1].getBool();
148-
auto shouldLockRuntime = shouldUseUiRuntime;
149-
if (shouldUseUiRuntime) {
150-
workletRuntime = context_->getRuntimeRegistry().uiRuntime;
151-
} else {
152-
workletRuntime = context_->getRuntimeRegistry().audioRuntime;
153-
}
141+
std::weak_ptr<worklets::WorkletRuntime> workletRuntime = shouldUseUiRuntime
142+
? context_->getRuntimeRegistry().uiRuntime
143+
: context_->getRuntimeRegistry().audioRuntime;
154144

155-
auto workletProcessingNode =
156-
context_->createWorkletProcessingNode(shareableWorklet, workletRuntime, shouldLockRuntime);
157-
auto workletProcessingNodeHostObject =
158-
std::make_shared<WorkletProcessingNodeHostObject>(workletProcessingNode);
145+
auto workletProcessingNodeHostObject = std::make_shared<WorkletProcessingNodeHostObject>(
146+
context_->getGraph(), context_, workletRuntime, shareableWorklet, shouldUseUiRuntime);
159147
return jsi::Object::createFromHostObject(runtime, workletProcessingNodeHostObject);
160148
#endif
161149
return jsi::Value::undefined();
162150
}
163151

164152
JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createRecorderAdapter) {
165-
auto recorderAdapter = context_->createRecorderAdapter();
166-
auto recorderAdapterHostObject = std::make_shared<RecorderAdapterNodeHostObject>(recorderAdapter);
153+
auto recorderAdapterHostObject = std::make_shared<RecorderAdapterNodeHostObject>(context_);
167154
return jsi::Object::createFromHostObject(runtime, recorderAdapterHostObject);
168155
}
169156

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ namespace audioapi {
1111
AnalyserNodeHostObject::AnalyserNodeHostObject(
1212
const std::shared_ptr<BaseAudioContext> &context,
1313
const AnalyserOptions &options)
14-
: AudioNodeHostObject(context->createAnalyser(options), options) {
14+
: AudioNodeHostObject(
15+
context->getGraph(),
16+
std::make_unique<AnalyserNode>(context, options),
17+
options) {
1518
addGetters(
1619
JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, fftSize),
1720
JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, minDecibels),
@@ -32,48 +35,43 @@ AnalyserNodeHostObject::AnalyserNodeHostObject(
3235
}
3336

3437
JSI_PROPERTY_GETTER_IMPL(AnalyserNodeHostObject, fftSize) {
35-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
38+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
3639
return {analyserNode->getFFTSize()};
3740
}
3841

3942
JSI_PROPERTY_GETTER_IMPL(AnalyserNodeHostObject, minDecibels) {
40-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
43+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
4144
return {analyserNode->getMinDecibels()};
4245
}
4346

4447
JSI_PROPERTY_GETTER_IMPL(AnalyserNodeHostObject, maxDecibels) {
45-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
48+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
4649
return {analyserNode->getMaxDecibels()};
4750
}
4851

4952
JSI_PROPERTY_GETTER_IMPL(AnalyserNodeHostObject, smoothingTimeConstant) {
50-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
53+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
5154
return {analyserNode->getSmoothingTimeConstant()};
5255
}
5356

5457
JSI_PROPERTY_SETTER_IMPL(AnalyserNodeHostObject, fftSize) {
55-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
56-
57-
auto fftSize = static_cast<int>(value.getNumber());
58-
analyserNode->setFFTSize(fftSize);
58+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
59+
analyserNode->setFFTSize(static_cast<int>(value.getNumber()));
5960
}
6061

6162
JSI_PROPERTY_SETTER_IMPL(AnalyserNodeHostObject, minDecibels) {
62-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
63-
auto minDecibels = static_cast<float>(value.getNumber());
64-
analyserNode->setMinDecibels(minDecibels);
63+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
64+
analyserNode->setMinDecibels(static_cast<float>(value.getNumber()));
6565
}
6666

6767
JSI_PROPERTY_SETTER_IMPL(AnalyserNodeHostObject, maxDecibels) {
68-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
69-
auto maxDecibels = static_cast<float>(value.getNumber());
70-
analyserNode->setMaxDecibels(maxDecibels);
68+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
69+
analyserNode->setMaxDecibels(static_cast<float>(value.getNumber()));
7170
}
7271

7372
JSI_PROPERTY_SETTER_IMPL(AnalyserNodeHostObject, smoothingTimeConstant) {
74-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
75-
auto smoothingTimeConstant = static_cast<float>(value.getNumber());
76-
analyserNode->setSmoothingTimeConstant(smoothingTimeConstant);
73+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
74+
analyserNode->setSmoothingTimeConstant(static_cast<float>(value.getNumber()));
7775
}
7876

7977
JSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getFloatFrequencyData) {
@@ -82,7 +80,7 @@ JSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getFloatFrequencyData) {
8280
auto data = reinterpret_cast<float *>(arrayBuffer.data(runtime));
8381
auto length = static_cast<int>(arrayBuffer.size(runtime) / sizeof(float));
8482

85-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
83+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
8684
analyserNode->getFloatFrequencyData(data, length);
8785

8886
return jsi::Value::undefined();
@@ -94,7 +92,7 @@ JSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getByteFrequencyData) {
9492
auto data = arrayBuffer.data(runtime);
9593
auto length = static_cast<int>(arrayBuffer.size(runtime));
9694

97-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
95+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
9896
analyserNode->getByteFrequencyData(data, length);
9997

10098
return jsi::Value::undefined();
@@ -106,7 +104,7 @@ JSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getFloatTimeDomainData) {
106104
auto data = reinterpret_cast<float *>(arrayBuffer.data(runtime));
107105
auto length = static_cast<int>(arrayBuffer.size(runtime) / sizeof(float));
108106

109-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
107+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
110108
analyserNode->getFloatTimeDomainData(data, length);
111109

112110
return jsi::Value::undefined();
@@ -118,7 +116,7 @@ JSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getByteTimeDomainData) {
118116
auto data = arrayBuffer.data(runtime);
119117
auto length = static_cast<int>(arrayBuffer.size(runtime));
120118

121-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
119+
auto analyserNode = static_cast<AnalyserNode *>(node_->handle->audioNode->asAudioNode());
122120
analyserNode->getByteTimeDomainData(data, length);
123121

124122
return jsi::Value::undefined();

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
#include <audioapi/types/NodeOptions.h>
66

77
#include <memory>
8+
#include <utility>
89

910
namespace audioapi {
1011
using namespace facebook;
1112

1213
class AudioDestinationNodeHostObject : public AudioNodeHostObject {
1314
public:
14-
explicit AudioDestinationNodeHostObject(const std::shared_ptr<AudioDestinationNode> &node)
15-
: AudioNodeHostObject(node, AudioDestinationOptions()) {}
15+
explicit AudioDestinationNodeHostObject(
16+
const std::shared_ptr<utils::graph::Graph> &graph,
17+
std::unique_ptr<AudioNode> node)
18+
: AudioNodeHostObject(graph, std::move(node), AudioDestinationOptions()) {}
1619
};
1720
} // namespace audioapi

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,12 @@ namespace audioapi {
1414
BiquadFilterNodeHostObject::BiquadFilterNodeHostObject(
1515
const std::shared_ptr<BaseAudioContext> &context,
1616
const BiquadFilterOptions &options)
17-
: AudioNodeHostObject(context->createBiquadFilter(options), options), type_(options.type) {
18-
auto biquadFilterNode = std::static_pointer_cast<BiquadFilterNode>(node_);
17+
: AudioNodeHostObject(
18+
context->getGraph(),
19+
std::make_unique<BiquadFilterNode>(context, options),
20+
options),
21+
type_(options.type) {
22+
auto biquadFilterNode = static_cast<BiquadFilterNode *>(node_->handle->audioNode->asAudioNode());
1923
frequencyParam_ = std::make_shared<AudioParamHostObject>(biquadFilterNode->getFrequencyParam());
2024
detuneParam_ = std::make_shared<AudioParamHostObject>(biquadFilterNode->getDetuneParam());
2125
QParam_ = std::make_shared<AudioParamHostObject>(biquadFilterNode->getQParam());
@@ -54,11 +58,12 @@ JSI_PROPERTY_GETTER_IMPL(BiquadFilterNodeHostObject, type) {
5458
}
5559

5660
JSI_PROPERTY_SETTER_IMPL(BiquadFilterNodeHostObject, type) {
57-
auto biquadFilterNode = std::static_pointer_cast<BiquadFilterNode>(node_);
61+
auto handle = node_->handle;
62+
auto biquadFilterNode = static_cast<BiquadFilterNode *>(handle->audioNode->asAudioNode());
5863

5964
auto type = js_enum_parser::filterTypeFromString(value.asString(runtime).utf8(runtime));
60-
auto event = [biquadFilterNode, type](BaseAudioContext &) {
61-
biquadFilterNode->setType(type);
65+
auto event = [handle, type](BaseAudioContext &) {
66+
static_cast<BiquadFilterNode *>(handle->audioNode->asAudioNode())->setType(type);
6267
};
6368
biquadFilterNode->scheduleAudioEvent(std::move(event));
6469
type_ = type;
@@ -78,7 +83,7 @@ JSI_HOST_FUNCTION_IMPL(BiquadFilterNodeHostObject, getFrequencyResponse) {
7883
args[2].getObject(runtime).getPropertyAsObject(runtime, "buffer").getArrayBuffer(runtime);
7984
auto phaseResponseOut = reinterpret_cast<float *>(arrayBufferPhase.data(runtime));
8085

81-
auto biquadFilterNode = std::static_pointer_cast<BiquadFilterNode>(node_);
86+
auto biquadFilterNode = static_cast<BiquadFilterNode *>(node_->handle->audioNode->asAudioNode());
8287
biquadFilterNode->getFrequencyResponse(
8388
frequencyArray, magResponseOut, phaseResponseOut, length, type_);
8489

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ namespace audioapi {
1818
ConvolverNodeHostObject::ConvolverNodeHostObject(
1919
const std::shared_ptr<BaseAudioContext> &context,
2020
const ConvolverOptions &options)
21-
: AudioNodeHostObject(context->createConvolver(options), options),
21+
: AudioNodeHostObject(
22+
context->getGraph(),
23+
std::make_unique<ConvolverNode>(context, options),
24+
options),
2225
normalize_(!options.disableNormalization) {
2326
if (options.buffer != nullptr) {
2427
setBuffer(options.buffer);
@@ -57,7 +60,8 @@ void ConvolverNodeHostObject::setBuffer(const std::shared_ptr<AudioBuffer> &buff
5760
return;
5861
}
5962

60-
auto convolverNode = std::static_pointer_cast<ConvolverNode>(node_);
63+
auto handle = node_->handle;
64+
auto convolverNode = static_cast<ConvolverNode *>(handle->audioNode->asAudioNode());
6165

6266
auto copiedBuffer = std::make_shared<AudioBuffer>(*buffer);
6367

@@ -102,7 +106,8 @@ void ConvolverNodeHostObject::setBuffer(const std::shared_ptr<AudioBuffer> &buff
102106
intermediateBuffer,
103107
scaleFactor});
104108

105-
auto event = [convolverNode, setupData](BaseAudioContext &) {
109+
auto event = [handle, setupData](BaseAudioContext &) {
110+
auto convolverNode = static_cast<ConvolverNode *>(handle->audioNode->asAudioNode());
106111
convolverNode->setBuffer(
107112
setupData->buffer,
108113
std::move(setupData->convolvers),

0 commit comments

Comments
 (0)