react-native-audio-api 0.6.4-nightly-e199fd6-20250715 → 0.6.4-nightly-c1e4367-20250715

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.
@@ -7,7 +7,7 @@
7
7
  #define MINIAUDIO_IMPLEMENTATION
8
8
  #include <audioapi/libs/miniaudio/miniaudio.h>
9
9
 
10
- #include <android/log.h>
10
+ // #include <android/log.h>
11
11
 
12
12
  namespace audioapi {
13
13
 
@@ -18,12 +18,11 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithFilePath(
18
18
  ma_decoder_config_init(ma_format_f32, 2, static_cast<int>(sampleRate_));
19
19
  ma_result result = ma_decoder_init_file(path.c_str(), &config, &decoder);
20
20
  if (result != MA_SUCCESS) {
21
- __android_log_print(
22
- ANDROID_LOG_ERROR,
23
- "AudioDecoder",
24
- "Failed to initialize decoder for file: %s",
25
- path.c_str());
26
-
21
+ // __android_log_print(
22
+ // ANDROID_LOG_ERROR,
23
+ // "AudioDecoder",
24
+ // "Failed to initialize decoder for file: %s",
25
+ // path.c_str());
27
26
  ma_decoder_uninit(&decoder);
28
27
 
29
28
  return nullptr;
@@ -40,7 +39,7 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithFilePath(
40
39
  ma_decoder_read_pcm_frames(&decoder, buffer, totalFrameCount, &framesDecoded);
41
40
 
42
41
  if (framesDecoded == 0) {
43
- __android_log_print(ANDROID_LOG_ERROR, "AudioDecoder", "Failed to decode");
42
+ // __android_log_print(ANDROID_LOG_ERROR, "AudioDecoder", "Failed to decode");
44
43
 
45
44
  delete[] buffer;
46
45
  ma_decoder_uninit(&decoder);
@@ -70,11 +69,10 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithMemoryBlock(
70
69
  ma_decoder_config_init(ma_format_f32, 2, static_cast<int>(sampleRate_));
71
70
  ma_result result = ma_decoder_init_memory(data, size, &config, &decoder);
72
71
  if (result != MA_SUCCESS) {
73
- __android_log_print(
74
- ANDROID_LOG_ERROR,
75
- "AudioDecoder",
76
- "Failed to initialize decoder for memory block");
77
-
72
+ // __android_log_print(
73
+ // ANDROID_LOG_ERROR,
74
+ // "AudioDecoder",
75
+ // "Failed to initialize decoder for memory block");
78
76
  ma_decoder_uninit(&decoder);
79
77
 
80
78
  return nullptr;
@@ -90,7 +88,7 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithMemoryBlock(
90
88
  ma_uint64 framesDecoded;
91
89
  ma_decoder_read_pcm_frames(&decoder, buffer, totalFrameCount, &framesDecoded);
92
90
  if (framesDecoded == 0) {
93
- __android_log_print(ANDROID_LOG_ERROR, "AudioDecoder", "Failed to decode");
91
+ // __android_log_print(ANDROID_LOG_ERROR, "AudioDecoder", "Failed to decode");
94
92
 
95
93
  delete[] buffer;
96
94
  ma_decoder_uninit(&decoder);
@@ -26,15 +26,6 @@ class AudioBufferBaseSourceNodeHostObject
26
26
  JSI_EXPORT_PROPERTY_SETTER(AudioBufferBaseSourceNodeHostObject, onPositionChangedInterval));
27
27
  }
28
28
 
29
- ~AudioBufferBaseSourceNodeHostObject() {
30
- auto sourceNode =
31
- std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
32
-
33
- // When JSI object is garbage collected (together with the eventual callback),
34
- // underlying source node might still be active and try to call the non-existing callback.
35
- sourceNode->clearOnPositionChangedCallback();
36
- }
37
-
38
29
  JSI_PROPERTY_GETTER(detune) {
39
30
  auto sourceNode =
40
31
  std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
@@ -21,15 +21,6 @@ class AudioScheduledSourceNodeHostObject : public AudioNodeHostObject {
21
21
  JSI_EXPORT_FUNCTION(AudioScheduledSourceNodeHostObject, stop));
22
22
  }
23
23
 
24
- ~AudioScheduledSourceNodeHostObject() {
25
- auto audioScheduledSourceNode =
26
- std::static_pointer_cast<AudioScheduledSourceNode>(node_);
27
-
28
- // When JSI object is garbage collected (together with the eventual callback),
29
- // underlying source node might still be active and try to call the non-existing callback.
30
- audioScheduledSourceNode->clearOnEndedCallback();
31
- }
32
-
33
24
  JSI_PROPERTY_SETTER(onEnded) {
34
25
  auto audioScheduleSourceNode =
35
26
  std::static_pointer_cast<AudioScheduledSourceNode>(node_);
@@ -18,10 +18,11 @@ AudioParam::AudioParam(
18
18
  minValue_(minValue),
19
19
  maxValue_(maxValue),
20
20
  context_(context),
21
- audioBus_(std::make_shared<AudioBus>(
22
- RENDER_QUANTUM_SIZE,
23
- 1,
24
- context->getSampleRate())) {
21
+ audioBus_(
22
+ std::make_shared<AudioBus>(
23
+ RENDER_QUANTUM_SIZE,
24
+ 1,
25
+ context->getSampleRate())) {
25
26
  startTime_ = 0;
26
27
  endTime_ = 0;
27
28
  startValue_ = value_;
@@ -119,7 +119,6 @@ std::shared_ptr<AnalyserNode> BaseAudioContext::createAnalyser() {
119
119
 
120
120
  std::shared_ptr<AudioBuffer> BaseAudioContext::decodeAudioDataSource(
121
121
  const std::string &path) {
122
- #ifndef AUDIO_API_TEST_SUITE
123
122
  auto audioBus = audioDecoder_->decodeWithFilePath(path);
124
123
 
125
124
  if (!audioBus) {
@@ -127,15 +126,11 @@ std::shared_ptr<AudioBuffer> BaseAudioContext::decodeAudioDataSource(
127
126
  }
128
127
 
129
128
  return std::make_shared<AudioBuffer>(audioBus);
130
- #else
131
- return nullptr;
132
- #endif // AUDIO_API_TEST_SUITE
133
129
  }
134
130
 
135
131
  std::shared_ptr<AudioBuffer> BaseAudioContext::decodeAudioData(
136
132
  const void *data,
137
133
  size_t size) {
138
- #ifndef AUDIO_API_TEST_SUITE
139
134
  auto audioBus = audioDecoder_->decodeWithMemoryBlock(data, size);
140
135
 
141
136
  if (!audioBus) {
@@ -143,14 +138,10 @@ std::shared_ptr<AudioBuffer> BaseAudioContext::decodeAudioData(
143
138
  }
144
139
 
145
140
  return std::make_shared<AudioBuffer>(audioBus);
146
- #else
147
- return nullptr;
148
- #endif // AUDIO_API_TEST_SUITE
149
141
  }
150
142
 
151
143
  std::shared_ptr<AudioBuffer> BaseAudioContext::decodeWithPCMInBase64(
152
144
  const std::string &data) {
153
- #ifndef AUDIO_API_TEST_SUITE
154
145
  auto audioBus = audioDecoder_->decodeWithPCMInBase64(data);
155
146
 
156
147
  if (!audioBus) {
@@ -158,7 +149,6 @@ std::shared_ptr<AudioBuffer> BaseAudioContext::decodeWithPCMInBase64(
158
149
  }
159
150
 
160
151
  return std::make_shared<AudioBuffer>(audioBus);
161
- #endif // AUDIO_API_TEST_SUITE
162
152
  }
163
153
 
164
154
  AudioNodeManager *BaseAudioContext::getNodeManager() {
@@ -41,17 +41,6 @@ std::shared_ptr<AudioParam> AudioBufferBaseSourceNode::getPlaybackRateParam()
41
41
  return playbackRateParam_;
42
42
  }
43
43
 
44
- void AudioBufferBaseSourceNode::clearOnPositionChangedCallback() {
45
- if (onPositionChangedCallbackId_ == 0 || context_ == nullptr ||
46
- context_->audioEventHandlerRegistry_ == nullptr) {
47
- return;
48
- }
49
-
50
- context_->audioEventHandlerRegistry_->unregisterHandler(
51
- "positionChanged", onPositionChangedCallbackId_);
52
- onPositionChangedCallbackId_ = 0;
53
- }
54
-
55
44
  void AudioBufferBaseSourceNode::setOnPositionChangedCallbackId(
56
45
  uint64_t callbackId) {
57
46
  onPositionChangedCallbackId_ = callbackId;
@@ -5,7 +5,6 @@
5
5
 
6
6
  #include <memory>
7
7
  #include <mutex>
8
- #include <atomic>
9
8
 
10
9
  namespace audioapi {
11
10
 
@@ -20,7 +19,6 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
20
19
  [[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
21
20
  [[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;
22
21
 
23
- void clearOnPositionChangedCallback();
24
22
  void setOnPositionChangedCallbackId(uint64_t callbackId);
25
23
  void setOnPositionChangedInterval(int interval);
26
24
  [[nodiscard]] int getOnPositionChangedInterval();
@@ -39,7 +37,7 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
39
37
  // internal helper
40
38
  double vReadIndex_;
41
39
 
42
- std::atomic<uint64_t> onPositionChangedCallbackId_ = 0; // 0 means no callback
40
+ uint64_t onPositionChangedCallbackId_ = 0; // 0 means no callback
43
41
  int onPositionChangedInterval_;
44
42
  int onPositionChangedTime_ = 0;
45
43
 
@@ -54,17 +54,6 @@ bool AudioScheduledSourceNode::isStopScheduled() {
54
54
  return playbackState_ == PlaybackState::STOP_SCHEDULED;
55
55
  }
56
56
 
57
- void AudioScheduledSourceNode::clearOnEndedCallback() {
58
- if (onEndedCallbackId_ == 0 || context_ == nullptr ||
59
- context_->audioEventHandlerRegistry_ == nullptr) {
60
- return;
61
- }
62
-
63
- context_->audioEventHandlerRegistry_->unregisterHandler(
64
- "ended", onEndedCallbackId_);
65
- onEndedCallbackId_ = 0;
66
- }
67
-
68
57
  void AudioScheduledSourceNode::setOnEndedCallbackId(const uint64_t callbackId) {
69
58
  onEndedCallbackId_ = callbackId;
70
59
  }
@@ -38,7 +38,6 @@ class AudioScheduledSourceNode : public AudioNode {
38
38
  bool isFinished();
39
39
  bool isStopScheduled();
40
40
 
41
- void clearOnEndedCallback();
42
41
  void setOnEndedCallbackId(uint64_t callbackId);
43
42
 
44
43
  void disable() override;
@@ -49,7 +48,7 @@ class AudioScheduledSourceNode : public AudioNode {
49
48
 
50
49
  PlaybackState playbackState_;
51
50
 
52
- std::atomic<uint64_t> onEndedCallbackId_ = 0;
51
+ uint64_t onEndedCallbackId_ = 0;
53
52
 
54
53
  void updatePlaybackInfo(
55
54
  const std::shared_ptr<AudioBus>& processingBus,
@@ -92,18 +92,8 @@ void AudioEventHandlerRegistry::invokeHandlerWithEventBody(
92
92
  continue;
93
93
  }
94
94
 
95
- try {
96
- auto eventObject = createEventObject(body);
97
- handler->call(*runtime_, eventObject);
98
- } catch (const std::exception &e) {
99
- // re-throw the exception to be handled by the caller
100
- // std::exception is safe to parse by the rn bridge
101
- throw;
102
- } catch (...) {
103
- printf(
104
- "Unknown exception occurred while invoking handler for event: %s\n",
105
- eventName.c_str());
106
- }
95
+ auto eventObject = createEventObject(body);
96
+ handler->call(*runtime_, eventObject);
107
97
  }
108
98
  });
109
99
  }
@@ -133,26 +123,8 @@ void AudioEventHandlerRegistry::invokeHandlerWithEventBody(
133
123
  return;
134
124
  }
135
125
 
136
- // Depending on how the AudioBufferSourceNode is handled on the JS side,
137
- // it sometimes might enter race condition where the ABSN is deleted on JS
138
- // side, but it is still processed on the audio thread, leading to a crash
139
- // when f.e. `positionChanged` event is triggered.
140
-
141
- // In case of debugging this, please increment the hours spent counter
142
-
143
- // Hours spent on this: 5
144
- try {
145
- auto eventObject = createEventObject(body);
146
- handlerIt->second->call(*runtime_, eventObject);
147
- } catch (const std::exception &e) {
148
- // re-throw the exception to be handled by the caller
149
- // std::exception is safe to parse by the rn bridge
150
- throw;
151
- } catch (...) {
152
- printf(
153
- "Unknown exception occurred while invoking handler for event: %s\n",
154
- eventName.c_str());
155
- }
126
+ auto eventObject = createEventObject(body);
127
+ handlerIt->second->call(*runtime_, eventObject);
156
128
  });
157
129
  }
158
130
 
@@ -164,19 +136,20 @@ jsi::Object AudioEventHandlerRegistry::createEventObject(
164
136
  const auto name = pair.first.data();
165
137
  const auto &value = pair.second;
166
138
 
167
- if (holds_alternative<int>(value)) {
168
- eventObject.setProperty(*runtime_, name, get<int>(value));
169
- } else if (holds_alternative<double>(value)) {
170
- eventObject.setProperty(*runtime_, name, get<double>(value));
171
- } else if (holds_alternative<float>(value)) {
172
- eventObject.setProperty(*runtime_, name, get<float>(value));
173
- } else if (holds_alternative<bool>(value)) {
174
- eventObject.setProperty(*runtime_, name, get<bool>(value));
175
- } else if (holds_alternative<std::string>(value)) {
176
- eventObject.setProperty(*runtime_, name, get<std::string>(value));
177
- } else if (holds_alternative<std::shared_ptr<jsi::HostObject>>(value)) {
139
+ if (std::holds_alternative<int>(value)) {
140
+ eventObject.setProperty(*runtime_, name, std::get<int>(value));
141
+ } else if (std::holds_alternative<double>(value)) {
142
+ eventObject.setProperty(*runtime_, name, std::get<double>(value));
143
+ } else if (std::holds_alternative<float>(value)) {
144
+ eventObject.setProperty(*runtime_, name, std::get<float>(value));
145
+ } else if (std::holds_alternative<bool>(value)) {
146
+ eventObject.setProperty(*runtime_, name, std::get<bool>(value));
147
+ } else if (std::holds_alternative<std::string>(value)) {
148
+ eventObject.setProperty(*runtime_, name, std::get<std::string>(value));
149
+ } else if (std::holds_alternative<std::shared_ptr<jsi::HostObject>>(
150
+ value)) {
178
151
  auto hostObject = jsi::Object::createFromHostObject(
179
- *runtime_, get<std::shared_ptr<jsi::HostObject>>(value));
152
+ *runtime_, std::get<std::shared_ptr<jsi::HostObject>>(value));
180
153
  eventObject.setProperty(*runtime_, name, hostObject);
181
154
  }
182
155
  }
@@ -1,4 +1,5 @@
1
1
  #include <audioapi/jsi/JsiPromise.h>
2
+ #include <stdexcept>
2
3
 
3
4
  namespace audioapi {
4
5
 
@@ -7,46 +7,29 @@ set(ROOT ${CMAKE_SOURCE_DIR}/../../../../..)
7
7
  set(REACT_NATIVE_DIR "${ROOT}/node_modules/react-native")
8
8
  set(JSI_DIR "${REACT_NATIVE_DIR}/ReactCommon/jsi")
9
9
 
10
- include(CMakePrintHelpers)
11
- cmake_print_variables(ROOT)
12
-
13
10
  include(FetchContent)
14
11
  FetchContent_Declare(
15
12
  googletest
16
- URL https://github.com/google/googletest/archive/c67de117379f4d1c889c7581a0a76aa0979c2083.zip
13
+ URL https://github.com/google/googletest/archive/3983f67e32fb3e9294487b9d4f9586efa6e5d088.zip
17
14
  )
18
15
  # For Windows: Prevent overriding the parent project's compiler/linker settings
19
16
  set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
20
17
  FetchContent_MakeAvailable(googletest)
21
18
 
22
- message(STATUS "Using C++ compiler: ${CMAKE_CXX_COMPILER}")
23
-
24
19
  enable_testing()
25
- add_compile_definitions(AUDIO_API_TEST_SUITE)
26
20
 
27
21
  file(GLOB_RECURSE RNAUDIOAPI_SRC
28
22
  CONFIGURE_DEPENDS
29
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/core/AudioNode.cpp"
30
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/core/AudioParam.cpp"
31
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/core/BaseAudioContext.cpp"
32
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/core/OfflineAudioContext.cpp"
33
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/core/analysis/*.cpp"
34
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/core/destinations/*.cpp"
35
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/core/effects/*.cpp"
36
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/core/inputs/*.cpp"
37
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/core/sources/*.cpp"
38
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/core/types/*.cpp"
39
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/core/utils/*.cpp"
40
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/dsp/*.cpp"
41
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/utils/*.cpp"
23
+ "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/*.cpp"
24
+ "${ROOT}/node_modules/react-native-audio-api/android/src/main/cpp/audioapi/android/core/AudioDecoder.cpp"
42
25
  )
43
26
 
27
+ list(REMOVE_ITEM RNAUDIOAPI_SRC "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/core/AudioContext.cpp")
28
+
44
29
  file(GLOB_RECURSE RNAUDIOAPI_LIBS
45
30
  CONFIGURE_DEPENDS
46
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/libs/base64/*.h"
47
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/libs/miniaudio/*.h"
48
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/libs/pffft/*.c"
49
- "${ROOT}/packages/react-native-audio-api/common/cpp/audioapi/libs/signalsmith-stretch/*.h"
31
+ "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/*.c"
32
+ "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/*.h"
50
33
  )
51
34
 
52
35
  add_library(rnaudioapi STATIC ${RNAUDIOAPI_SRC})
@@ -85,8 +85,9 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDevicePreferredSampleRate)
85
85
  return [self.audioSessionManager getDevicePreferredSampleRate];
86
86
  }
87
87
 
88
- RCT_EXPORT_METHOD(setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)
89
- resolve reject : (RCTPromiseRejectBlock)reject)
88
+ RCT_EXPORT_METHOD(
89
+ setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)
90
+ reject)
90
91
  {
91
92
  if ([self.audioSessionManager setActive:enabled]) {
92
93
  resolve(@"true");
@@ -96,8 +97,9 @@ RCT_EXPORT_METHOD(setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseR
96
97
  resolve(@"false");
97
98
  }
98
99
 
99
- RCT_EXPORT_METHOD(setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)
100
- options allowHaptics : (BOOL)allowHaptics)
100
+ RCT_EXPORT_METHOD(
101
+ setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)
102
+ options allowHaptics : (BOOL)allowHaptics)
101
103
  {
102
104
  [self.audioSessionManager setAudioSessionOptions:category mode:mode options:options allowHaptics:allowHaptics];
103
105
  }
@@ -127,20 +129,21 @@ RCT_EXPORT_METHOD(observeVolumeChanges : (BOOL)enabled)
127
129
  [self.notificationManager observeVolumeChanges:(BOOL)enabled];
128
130
  }
129
131
 
130
- RCT_EXPORT_METHOD(requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)
131
- resolve reject : (nonnull RCTPromiseRejectBlock)reject)
132
+ RCT_EXPORT_METHOD(
133
+ requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)
134
+ reject)
132
135
  {
133
136
  [self.audioSessionManager requestRecordingPermissions:resolve reject:reject];
134
137
  }
135
138
 
136
- RCT_EXPORT_METHOD(checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)
137
- resolve reject : (nonnull RCTPromiseRejectBlock)reject)
139
+ RCT_EXPORT_METHOD(
140
+ checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)reject)
138
141
  {
139
142
  [self.audioSessionManager checkRecordingPermissions:resolve reject:reject];
140
143
  }
141
144
 
142
- RCT_EXPORT_METHOD(getDevicesInfo : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)
143
- reject)
145
+ RCT_EXPORT_METHOD(
146
+ getDevicesInfo : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)reject)
144
147
  {
145
148
  [self.audioSessionManager getDevicesInfo:resolve reject:reject];
146
149
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-audio-api",
3
- "version": "0.6.4-nightly-e199fd6-20250715",
3
+ "version": "0.6.4-nightly-c1e4367-20250715",
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"