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.
@@ -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 channelData =
46
- reinterpret_cast<uint8_t *>(audioBuffer_->getChannelData(channel));
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 =
@@ -1,5 +1,3 @@
1
- #pragma once
2
-
3
1
  #include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
4
2
  #include <audioapi/HostObjects/utils/AudioDecoderHostObject.h>
5
3
  #include <audioapi/core/utils/AudioDecoder.h>
@@ -1,5 +1,3 @@
1
- #pragma once
2
-
3
1
  #include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
4
2
  #include <audioapi/HostObjects/utils/AudioStretcherHostObject.h>
5
3
  #include <audioapi/core/utils/AudioStretcher.h>
@@ -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
- buffs_.reserve(inputChannelCount_);
19
- for (size_t i = 0; i < inputChannelCount_; ++i) {
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
- for (size_t ch = 0; ch < channelCount_; ch++) {
44
- /// here we copy
45
- /// to uint8_t* [curBuffIndex_, curBuffIndex_ + shouldProcess]
46
- /// from float* [processed, processed + shouldProcess]
47
- /// so as the we need to copy shouldProcess * sizeof(float) bytes
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
- uint8_t *buffPtr = buffs_[ch];
67
- buffs_[ch] = new uint8_t[buffRealLength_];
51
+ auto audioArray = std::make_shared<AudioArray>(bufferLength_);
52
+ audioArray->copy(bus_->getChannel(ch));
68
53
  auto sharedAudioArray =
69
- std::make_shared<AudioArrayBuffer>(buffPtr, buffRealLength_);
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
- jsArray.setExternalMemoryPressure(
75
- uiRuntimeRaw, channelCount_ * buffRealLength_);
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::vector<uint8_t*> buffs_;
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 inputBuff = new uint8_t[RENDER_QUANTUM_SIZE * sizeof(float)];
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 outputBuff = new uint8_t[RENDER_QUANTUM_SIZE * sizeof(float)];
24
- outputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(
25
- outputBuff, RENDER_QUANTUM_SIZE * sizeof(float));
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
 
@@ -37,6 +37,7 @@ class AudioBuffer : public std::enable_shared_from_this<AudioBuffer> {
37
37
  private:
38
38
  friend class AudioBufferSourceNode;
39
39
  friend class AudioBufferQueueSourceNode;
40
+ friend class AudioBufferHostObject;
40
41
 
41
42
  std::shared_ptr<AudioBus> bus_;
42
43
  };
@@ -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 buff = new uint8_t[RENDER_QUANTUM_SIZE * sizeof(float)];
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 size_;
6
+ return audioArray_->getSize() * sizeof(float);
7
7
  }
8
8
 
9
9
  uint8_t *AudioArrayBuffer::data() {
10
- return data_;
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(uint8_t *data, size_t size): data_(data), size_(size) {}
12
- ~AudioArrayBuffer() override {
13
- if (data_ == nullptr) {
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
- : data_(other.data_), size_(other.size_) {
20
- other.data_ = nullptr;
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
- uint8_t *data_;
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-2ae2776-20251013",
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"