Skip to content

Commit 2a525b9

Browse files
refactor: first part of integration
1 parent 7d2d876 commit 2a525b9

64 files changed

Lines changed: 385 additions & 1243 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,11 @@
1212
namespace audioapi {
1313

1414
AudioPlayer::AudioPlayer(
15-
const std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> &renderAudio,
15+
const std::function<void(DSPAudioBuffer *, int)> &renderAudio,
1616
float sampleRate,
1717
int channelCount)
18-
: renderAudio_(renderAudio),
19-
sampleRate_(sampleRate),
20-
channelCount_(channelCount),
21-
isRunning_(false) {
22-
isInitialized_ = openAudioStream();
18+
: renderAudio_(renderAudio), sampleRate_(sampleRate), channelCount_(channelCount) {
19+
isInitialized_.store(openAudioStream(), std::memory_order_release);
2320
}
2421

2522
bool AudioPlayer::openAudioStream() {
@@ -85,7 +82,7 @@ void AudioPlayer::suspend() {
8582
}
8683

8784
void AudioPlayer::cleanup() {
88-
isInitialized_ = false;
85+
isInitialized_.store(false, std::memory_order_release);
8986

9087
if (mStream_ != nullptr) {
9188
mStream_->close();
@@ -100,7 +97,7 @@ bool AudioPlayer::isRunning() const {
10097

10198
DataCallbackResult
10299
AudioPlayer::onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) {
103-
if (!isInitialized_) {
100+
if (!isInitialized_.load(std::memory_order_acquire)) {
104101
return DataCallbackResult::Continue;
105102
}
106103

@@ -111,7 +108,7 @@ AudioPlayer::onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numF
111108
auto framesToProcess = std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
112109

113110
if (isRunning_.load(std::memory_order_acquire)) {
114-
renderAudio_(buffer_, framesToProcess);
111+
renderAudio_(buffer_.get(), framesToProcess);
115112
} else {
116113
buffer_->zero();
117114
}
@@ -129,7 +126,7 @@ void AudioPlayer::onErrorAfterClose(oboe::AudioStream *stream, oboe::Result erro
129126
if (error == oboe::Result::ErrorDisconnected) {
130127
cleanup();
131128
if (openAudioStream()) {
132-
isInitialized_ = true;
129+
isInitialized_.store(true, std::memory_order_release);
133130
resume();
134131
}
135132
}

packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/AudioPlayer.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class AudioContext;
1717
class AudioPlayer : public AudioStreamDataCallback, AudioStreamErrorCallback {
1818
public:
1919
AudioPlayer(
20-
const std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> &renderAudio,
20+
const std::function<void(DSPAudioBuffer *, int)> &renderAudio,
2121
float sampleRate,
2222
int channelCount);
2323

@@ -40,13 +40,13 @@ class AudioPlayer : public AudioStreamDataCallback, AudioStreamErrorCallback {
4040
void onErrorAfterClose(AudioStream * /* audioStream */, Result /* error */) override;
4141

4242
private:
43-
std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> renderAudio_;
43+
std::function<void(DSPAudioBuffer *, int)> renderAudio_;
4444
std::shared_ptr<AudioStream> mStream_;
4545
std::shared_ptr<DSPAudioBuffer> buffer_;
46-
bool isInitialized_ = false;
4746
float sampleRate_;
4847
int channelCount_;
49-
std::atomic<bool> isRunning_;
48+
std::atomic<bool> isInitialized_{false};
49+
std::atomic<bool> isRunning_{false};
5050

5151
bool openAudioStream();
5252

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <audioapi/HostObjects/AudioNodeHostObject.h>
22
#include <audioapi/HostObjects/AudioParamHostObject.h>
3+
#include <audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h>
34
#include <audioapi/HostObjects/utils/JsEnumParser.h>
45
#include <audioapi/core/AudioNode.h>
56

@@ -63,8 +64,10 @@ JSI_HOST_FUNCTION_IMPL(AudioNodeHostObject, connect) {
6364
if (obj.isHostObject<AudioNodeHostObject>(runtime)) {
6465
auto node = obj.getHostObject<AudioNodeHostObject>(runtime);
6566
connectNode(*node);
66-
}
67-
if (obj.isHostObject<AudioParamHostObject>(runtime)) {
67+
} else if (obj.isHostObject<AudioDestinationNodeHostObject>(runtime)) {
68+
auto dest = obj.getHostObject<AudioDestinationNodeHostObject>(runtime);
69+
graph_->addEdge(node_, dest->rawNode());
70+
} else if (obj.isHostObject<AudioParamHostObject>(runtime)) {
6871
auto param = obj.getHostObject<AudioParamHostObject>(runtime);
6972
// TODO
7073
// connectParam(*param->owner_, param->param_.get());
@@ -82,13 +85,15 @@ JSI_HOST_FUNCTION_IMPL(AudioNodeHostObject, disconnect) {
8285
if (obj.isHostObject<AudioNodeHostObject>(runtime)) {
8386
auto node = obj.getHostObject<AudioNodeHostObject>(runtime);
8487
disconnectNode(*node);
85-
}
86-
87-
if (obj.isHostObject<AudioParamHostObject>(runtime)) {
88+
} else if (obj.isHostObject<AudioDestinationNodeHostObject>(runtime)) {
89+
auto dest = obj.getHostObject<AudioDestinationNodeHostObject>(runtime);
90+
graph_->removeEdge(node_, dest->rawNode());
91+
} else if (obj.isHostObject<AudioParamHostObject>(runtime)) {
8892
auto param = obj.getHostObject<AudioParamHostObject>(runtime);
8993
// TODO
9094
// disconnectParam(*param->owner_, param->param_.get());
9195
}
96+
9297
return jsi::Value::undefined();
9398
}
9499
} // namespace audioapi

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ BaseAudioContextHostObject::BaseAudioContextHostObject(
3535
: context_(context),
3636
promiseVendor_(std::make_shared<PromiseVendor>(runtime, callInvoker)),
3737
callInvoker_(callInvoker) {
38-
context_->initialize();
39-
// TODO
40-
// destination_ = std::make_shared<AudioDestinationNodeHostObject>(context_->getGraph(), context_->getDestination());
38+
auto *destinationNode = context_->initialize();
39+
destination_ =
40+
std::make_shared<AudioDestinationNodeHostObject>(destinationNode, context_->getDestination());
4141

4242
addGetters(
4343
JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, destination),
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h>
2+
3+
#include <memory>
4+
#include <utility>
5+
6+
namespace audioapi {
7+
8+
AudioDestinationNodeHostObject::AudioDestinationNodeHostObject(
9+
utils::graph::HostGraph::Node *node,
10+
std::shared_ptr<AudioDestinationNode> destination)
11+
: node_(node), destination_(std::move(destination)) {
12+
addGetters(
13+
JSI_EXPORT_PROPERTY_GETTER(AudioDestinationNodeHostObject, numberOfInputs),
14+
JSI_EXPORT_PROPERTY_GETTER(AudioDestinationNodeHostObject, numberOfOutputs),
15+
JSI_EXPORT_PROPERTY_GETTER(AudioDestinationNodeHostObject, channelCount));
16+
}
17+
18+
JSI_PROPERTY_GETTER_IMPL(AudioDestinationNodeHostObject, numberOfInputs) {
19+
return {1};
20+
}
21+
22+
JSI_PROPERTY_GETTER_IMPL(AudioDestinationNodeHostObject, numberOfOutputs) {
23+
return {0};
24+
}
25+
26+
JSI_PROPERTY_GETTER_IMPL(AudioDestinationNodeHostObject, channelCount) {
27+
return {static_cast<int>(destination_->getChannelCount())};
28+
}
29+
30+
} // namespace audioapi
Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,31 @@
11
#pragma once
22

3-
#include <audioapi/HostObjects/AudioNodeHostObject.h>
43
#include <audioapi/core/destinations/AudioDestinationNode.h>
5-
#include <audioapi/types/NodeOptions.h>
4+
#include <audioapi/core/utils/graph/HostGraph.hpp>
5+
#include <audioapi/jsi/JsiHostObject.h>
66

77
#include <memory>
8-
#include <utility>
98

109
namespace audioapi {
1110
using namespace facebook;
1211

13-
class AudioDestinationNodeHostObject : public AudioNodeHostObject {
12+
class AudioDestinationNodeHostObject : public JsiHostObject {
1413
public:
1514
explicit AudioDestinationNodeHostObject(
16-
const std::shared_ptr<utils::graph::Graph> &graph,
17-
std::unique_ptr<AudioNode> node)
18-
: AudioNodeHostObject(graph, std::move(node), AudioDestinationOptions()) {}
15+
utils::graph::HostGraph::Node *node,
16+
std::shared_ptr<AudioDestinationNode> destination);
17+
18+
[[nodiscard]] utils::graph::HostGraph::Node *rawNode() const {
19+
return node_;
20+
}
21+
22+
JSI_PROPERTY_GETTER_DECL(numberOfInputs);
23+
JSI_PROPERTY_GETTER_DECL(numberOfOutputs);
24+
JSI_PROPERTY_GETTER_DECL(channelCount);
25+
26+
private:
27+
utils::graph::HostGraph::Node *node_; // borrowed from BaseAudioContext; never removed
28+
std::shared_ptr<AudioDestinationNode> destination_;
1929
};
30+
2031
} // namespace audioapi

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ void ConvolverNodeHostObject::setBuffer(const std::shared_ptr<AudioBuffer> &buff
7474
std::vector<std::unique_ptr<Convolver>> convolvers;
7575
for (size_t i = 0; i < copiedBuffer->getNumberOfChannels(); ++i) {
7676
AudioArray channelData(*copiedBuffer->getChannel(i));
77-
convolvers.emplace_back();
77+
convolvers.emplace_back(std::make_unique<Convolver>());
7878
convolvers.back()->init(RENDER_QUANTUM_SIZE, channelData, copiedBuffer->getSize());
7979
}
8080
if (copiedBuffer->getNumberOfChannels() == 1) {
8181
// add one more convolver, because right now input is always stereo
8282
AudioArray channelData(*copiedBuffer->getChannel(0));
83-
convolvers.emplace_back();
83+
convolvers.emplace_back(std::make_unique<Convolver>());
8484
convolvers.back()->init(RENDER_QUANTUM_SIZE, channelData, copiedBuffer->getSize());
8585
}
8686

packages/react-native-audio-api/common/cpp/audioapi/core/AudioContext.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
#include <audioapi/core/AudioContext.h>
88
#include <audioapi/core/destinations/AudioDestinationNode.h>
9-
#include <audioapi/core/utils/AudioGraphManager.h>
109
#include <memory>
1110

1211
namespace audioapi {
@@ -23,23 +22,27 @@ AudioContext::~AudioContext() {
2322
}
2423
}
2524

26-
void AudioContext::initialize() {
27-
BaseAudioContext::initialize();
25+
utils::graph::HostGraph::Node *AudioContext::initialize() {
26+
auto *destinationNode = BaseAudioContext::initialize();
2827
#ifdef ANDROID
2928
audioPlayer_ = std::make_shared<AudioPlayer>(
30-
this->renderAudio(), getSampleRate(), destination_->getChannelCount());
29+
[this](DSPAudioBuffer *buf, int n) { processGraph(buf, n); },
30+
getSampleRate(),
31+
destination_->getChannelCount());
3132
#else
3233
audioPlayer_ = std::make_shared<IOSAudioPlayer>(
33-
this->renderAudio(), getSampleRate(), destination_->getChannelCount());
34+
[this](DSPAudioBuffer *buf, int n) { processGraph(buf, n); },
35+
getSampleRate(),
36+
destination_->getChannelCount());
3437
#endif
38+
return destinationNode;
3539
}
3640

3741
void AudioContext::close() {
3842
setState(ContextState::CLOSED);
3943

4044
audioPlayer_->stop();
4145
audioPlayer_->cleanup();
42-
getGraphManager()->cleanup();
4346
}
4447

4548
bool AudioContext::resume() {
@@ -89,12 +92,6 @@ bool AudioContext::start() {
8992
return false;
9093
}
9194

92-
std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> AudioContext::renderAudio() {
93-
return [this](const std::shared_ptr<DSPAudioBuffer> &data, int frames) {
94-
destination_->renderAudio(data, frames);
95-
};
96-
}
97-
9895
bool AudioContext::isDriverRunning() const {
9996
return audioPlayer_->isRunning();
10097
}

packages/react-native-audio-api/common/cpp/audioapi/core/AudioContext.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class AudioContext : public BaseAudioContext {
2626
bool resume();
2727
bool suspend();
2828
bool start();
29-
void initialize() override;
29+
utils::graph::HostGraph::Node *initialize() override;
3030

3131
private:
3232
#ifdef ANDROID
@@ -37,8 +37,6 @@ class AudioContext : public BaseAudioContext {
3737
std::atomic<bool> isInitialized_{false};
3838

3939
bool isDriverRunning() const override;
40-
41-
std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> renderAudio();
4240
};
4341

4442
} // namespace audioapi

0 commit comments

Comments
 (0)