react-native-audio-api 0.10.0-nightly-2ae2776-20251013 → 0.10.0-nightly-cced1c6-20251015
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/HostObjects/sources/AudioBufferHostObject.cpp +3 -8
- package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +0 -2
- package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +0 -2
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +16 -28
- package/common/cpp/audioapi/core/effects/WorkletNode.h +2 -3
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +5 -6
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +1 -0
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +2 -3
- package/common/cpp/audioapi/jsi/AudioArrayBuffer.cpp +2 -2
- package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +10 -11
- package/common/cpp/audioapi/utils/AudioBus.cpp +4 -0
- package/common/cpp/audioapi/utils/AudioBus.h +1 -0
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +1 -2
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
|
|
2
2
|
|
|
3
3
|
#include <audioapi/jsi/AudioArrayBuffer.h>
|
|
4
|
+
#include <audioapi/utils/AudioBus.h>
|
|
4
5
|
|
|
5
6
|
namespace audioapi {
|
|
6
7
|
|
|
@@ -42,14 +43,8 @@ JSI_PROPERTY_GETTER_IMPL(AudioBufferHostObject, numberOfChannels) {
|
|
|
42
43
|
|
|
43
44
|
JSI_HOST_FUNCTION_IMPL(AudioBufferHostObject, getChannelData) {
|
|
44
45
|
auto channel = static_cast<int>(args[0].getNumber());
|
|
45
|
-
auto
|
|
46
|
-
|
|
47
|
-
auto length = static_cast<int>(audioBuffer_->getLength());
|
|
48
|
-
auto size = static_cast<int>(length * sizeof(float));
|
|
49
|
-
|
|
50
|
-
// reading or writing from this ArrayBuffer could cause a crash
|
|
51
|
-
// if underlying channelData is deallocated
|
|
52
|
-
auto audioArrayBuffer = std::make_shared<AudioArrayBuffer>(channelData, size);
|
|
46
|
+
auto audioArrayBuffer = std::make_shared<AudioArrayBuffer>(
|
|
47
|
+
audioBuffer_->bus_->getSharedChannel(channel));
|
|
53
48
|
auto arrayBuffer = jsi::ArrayBuffer(runtime, audioArrayBuffer);
|
|
54
49
|
|
|
55
50
|
auto float32ArrayCtor =
|
|
@@ -9,25 +9,16 @@ WorkletNode::WorkletNode(
|
|
|
9
9
|
size_t bufferLength,
|
|
10
10
|
size_t inputChannelCount)
|
|
11
11
|
: AudioNode(context),
|
|
12
|
-
buffRealLength_(bufferLength * sizeof(float)),
|
|
13
|
-
bufferLength_(bufferLength),
|
|
14
12
|
workletRunner_(runtime),
|
|
15
13
|
shareableWorklet_(worklet),
|
|
14
|
+
bufferLength_(bufferLength),
|
|
16
15
|
inputChannelCount_(inputChannelCount),
|
|
17
16
|
curBuffIndex_(0) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
buffs_.emplace_back(new uint8_t[buffRealLength_]);
|
|
21
|
-
}
|
|
17
|
+
bus_ = std::make_shared<AudioBus>(
|
|
18
|
+
bufferLength, inputChannelCount, context->getSampleRate());
|
|
22
19
|
isInitialized_ = true;
|
|
23
20
|
}
|
|
24
21
|
|
|
25
|
-
WorkletNode::~WorkletNode() {
|
|
26
|
-
for (auto &buff : buffs_) {
|
|
27
|
-
delete[] buff;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
22
|
std::shared_ptr<AudioBus> WorkletNode::processNode(
|
|
32
23
|
const std::shared_ptr<AudioBus> &processingBus,
|
|
33
24
|
int framesToProcess) {
|
|
@@ -40,17 +31,11 @@ std::shared_ptr<AudioBus> WorkletNode::processNode(
|
|
|
40
31
|
size_t needsToProcess = framesToProcess - processed;
|
|
41
32
|
size_t shouldProcess = std::min(framesToWorkletInvoke, needsToProcess);
|
|
42
33
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
auto channelData = processingBus->getChannel(ch)->getData();
|
|
49
|
-
std::memcpy(
|
|
50
|
-
/* dest */ buffs_[ch] + curBuffIndex_ * sizeof(float),
|
|
51
|
-
/* src */ reinterpret_cast<const uint8_t *>(channelData + processed),
|
|
52
|
-
/* size */ shouldProcess * sizeof(float));
|
|
53
|
-
}
|
|
34
|
+
/// here we copy
|
|
35
|
+
/// to [curBuffIndex_, curBuffIndex_ + shouldProcess]
|
|
36
|
+
/// from [processed, processed + shouldProcess]
|
|
37
|
+
bus_->copy(processingBus.get(), processed, curBuffIndex_, shouldProcess);
|
|
38
|
+
|
|
54
39
|
processed += shouldProcess;
|
|
55
40
|
curBuffIndex_ += shouldProcess;
|
|
56
41
|
|
|
@@ -63,16 +48,19 @@ std::shared_ptr<AudioBus> WorkletNode::processNode(
|
|
|
63
48
|
/// Arguments preparation
|
|
64
49
|
auto jsArray = jsi::Array(uiRuntimeRaw, channelCount_);
|
|
65
50
|
for (size_t ch = 0; ch < channelCount_; ch++) {
|
|
66
|
-
|
|
67
|
-
|
|
51
|
+
auto audioArray = std::make_shared<AudioArray>(bufferLength_);
|
|
52
|
+
audioArray->copy(bus_->getChannel(ch));
|
|
68
53
|
auto sharedAudioArray =
|
|
69
|
-
std::make_shared<AudioArrayBuffer>(
|
|
54
|
+
std::make_shared<AudioArrayBuffer>(audioArray);
|
|
55
|
+
auto sharedAudioArraySize = sharedAudioArray->size();
|
|
70
56
|
auto arrayBuffer =
|
|
71
57
|
jsi::ArrayBuffer(uiRuntimeRaw, std::move(sharedAudioArray));
|
|
58
|
+
arrayBuffer.setExternalMemoryPressure(
|
|
59
|
+
uiRuntimeRaw, sharedAudioArraySize);
|
|
72
60
|
jsArray.setValueAtIndex(uiRuntimeRaw, ch, std::move(arrayBuffer));
|
|
73
61
|
}
|
|
74
|
-
|
|
75
|
-
|
|
62
|
+
|
|
63
|
+
bus_->zero();
|
|
76
64
|
|
|
77
65
|
workletRunner_.executeWorklet(
|
|
78
66
|
shareableWorklet_,
|
|
@@ -42,7 +42,7 @@ class WorkletNode : public AudioNode {
|
|
|
42
42
|
size_t inputChannelCount
|
|
43
43
|
);
|
|
44
44
|
|
|
45
|
-
~WorkletNode() override;
|
|
45
|
+
~WorkletNode() override = default;
|
|
46
46
|
|
|
47
47
|
protected:
|
|
48
48
|
std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
|
|
@@ -51,10 +51,9 @@ class WorkletNode : public AudioNode {
|
|
|
51
51
|
private:
|
|
52
52
|
WorkletsRunner workletRunner_;
|
|
53
53
|
std::shared_ptr<worklets::SerializableWorklet> shareableWorklet_;
|
|
54
|
-
std::
|
|
54
|
+
std::shared_ptr<AudioBus> bus_;
|
|
55
55
|
|
|
56
56
|
/// @brief Length of the byte buffer that will be passed to the AudioArrayBuffer
|
|
57
|
-
size_t buffRealLength_;
|
|
58
57
|
size_t bufferLength_;
|
|
59
58
|
size_t inputChannelCount_;
|
|
60
59
|
size_t curBuffIndex_;
|
|
@@ -16,13 +16,12 @@ WorkletProcessingNode::WorkletProcessingNode(
|
|
|
16
16
|
outputBuffsHandles_.resize(maxChannelCount);
|
|
17
17
|
|
|
18
18
|
for (size_t i = 0; i < maxChannelCount; ++i) {
|
|
19
|
-
auto
|
|
20
|
-
inputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(
|
|
21
|
-
inputBuff, RENDER_QUANTUM_SIZE * sizeof(float));
|
|
19
|
+
auto inputAudioArray = std::make_shared<AudioArray>(RENDER_QUANTUM_SIZE);
|
|
20
|
+
inputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(inputAudioArray);
|
|
22
21
|
|
|
23
|
-
auto
|
|
24
|
-
outputBuffsHandles_[i] =
|
|
25
|
-
|
|
22
|
+
auto outputAudioArray = std::make_shared<AudioArray>(RENDER_QUANTUM_SIZE);
|
|
23
|
+
outputBuffsHandles_[i] =
|
|
24
|
+
std::make_shared<AudioArrayBuffer>(outputAudioArray);
|
|
26
25
|
}
|
|
27
26
|
}
|
|
28
27
|
|
|
@@ -16,9 +16,8 @@ WorkletSourceNode::WorkletSourceNode(
|
|
|
16
16
|
size_t outputChannelCount = this->getChannelCount();
|
|
17
17
|
outputBuffsHandles_.resize(outputChannelCount);
|
|
18
18
|
for (size_t i = 0; i < outputChannelCount; ++i) {
|
|
19
|
-
auto
|
|
20
|
-
outputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(
|
|
21
|
-
buff, RENDER_QUANTUM_SIZE * sizeof(float));
|
|
19
|
+
auto audioArray = std::make_shared<AudioArray>(RENDER_QUANTUM_SIZE);
|
|
20
|
+
outputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(audioArray);
|
|
22
21
|
}
|
|
23
22
|
}
|
|
24
23
|
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
namespace audioapi {
|
|
4
4
|
|
|
5
5
|
size_t AudioArrayBuffer::size() const {
|
|
6
|
-
return
|
|
6
|
+
return audioArray_->getSize() * sizeof(float);
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
uint8_t *AudioArrayBuffer::data() {
|
|
10
|
-
return
|
|
10
|
+
return reinterpret_cast<uint8_t *>(audioArray_->getData());
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
} // namespace audioapi
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include <jsi/jsi.h>
|
|
4
|
+
#include <audioapi/utils/AudioArray.h>
|
|
5
|
+
|
|
6
|
+
#include <memory>
|
|
7
|
+
#include <utility>
|
|
4
8
|
|
|
5
9
|
namespace audioapi {
|
|
6
10
|
|
|
@@ -8,16 +12,12 @@ using namespace facebook;
|
|
|
8
12
|
|
|
9
13
|
class AudioArrayBuffer : public jsi::MutableBuffer {
|
|
10
14
|
public:
|
|
11
|
-
AudioArrayBuffer(
|
|
12
|
-
~AudioArrayBuffer() override
|
|
13
|
-
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
delete[] data_;
|
|
17
|
-
}
|
|
15
|
+
explicit AudioArrayBuffer(const std::shared_ptr<AudioArray> &audioArray): audioArray_(audioArray) {}
|
|
16
|
+
~AudioArrayBuffer() override = default;
|
|
17
|
+
|
|
18
18
|
AudioArrayBuffer(AudioArrayBuffer &&other) noexcept
|
|
19
|
-
:
|
|
20
|
-
other.
|
|
19
|
+
: audioArray_(std::move(other.audioArray_)) {
|
|
20
|
+
other.audioArray_ = nullptr;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
AudioArrayBuffer(const AudioArrayBuffer &) = delete;
|
|
@@ -28,8 +28,7 @@ class AudioArrayBuffer : public jsi::MutableBuffer {
|
|
|
28
28
|
uint8_t *data() override;
|
|
29
29
|
|
|
30
30
|
private:
|
|
31
|
-
|
|
32
|
-
const size_t size_;
|
|
31
|
+
std::shared_ptr<AudioArray> audioArray_;
|
|
33
32
|
};
|
|
34
33
|
|
|
35
34
|
} // namespace audioapi
|
|
@@ -128,6 +128,10 @@ AudioArray *AudioBus::getChannelByType(int channelType) const {
|
|
|
128
128
|
}
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
std::shared_ptr<AudioArray> AudioBus::getSharedChannel(int index) const {
|
|
132
|
+
return channels_[index];
|
|
133
|
+
}
|
|
134
|
+
|
|
131
135
|
AudioArray &AudioBus::operator[](size_t index) {
|
|
132
136
|
return *channels_[index];
|
|
133
137
|
}
|
|
@@ -34,6 +34,7 @@ class AudioBus {
|
|
|
34
34
|
[[nodiscard]] size_t getSize() const;
|
|
35
35
|
[[nodiscard]] AudioArray *getChannel(int index) const;
|
|
36
36
|
[[nodiscard]] AudioArray *getChannelByType(int channelType) const;
|
|
37
|
+
[[nodiscard]] std::shared_ptr<AudioArray> getSharedChannel(int index) const;
|
|
37
38
|
|
|
38
39
|
AudioArray &operator[](size_t index);
|
|
39
40
|
const AudioArray &operator[](size_t index) const;
|
|
@@ -18,8 +18,7 @@ class IOSAudioRecorder : public AudioRecorder {
|
|
|
18
18
|
IOSAudioRecorder(
|
|
19
19
|
float sampleRate,
|
|
20
20
|
int bufferLength,
|
|
21
|
-
const std::shared_ptr<AudioEventHandlerRegistry>
|
|
22
|
-
&audioEventHandlerRegistry);
|
|
21
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
|
|
23
22
|
|
|
24
23
|
~IOSAudioRecorder() override;
|
|
25
24
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-audio-api",
|
|
3
|
-
"version": "0.10.0-nightly-
|
|
3
|
+
"version": "0.10.0-nightly-cced1c6-20251015",
|
|
4
4
|
"description": "react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification",
|
|
5
5
|
"bin": {
|
|
6
6
|
"setup-rn-audio-api-web": "./scripts/setup-rn-audio-api-web.js"
|