react-native-audio-api 0.4.12-beta.5 → 0.4.12

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.
Files changed (114) hide show
  1. package/android/src/main/cpp/audioapi/CMakeLists.txt +2 -3
  2. package/android/src/main/cpp/audioapi/android/core/AudioDecoder.cpp +3 -3
  3. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +10 -11
  4. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +1 -0
  5. package/android/src/main/java/com/swmansion/audioapi/AudioAPIPackage.kt +0 -1
  6. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +1 -3
  7. package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +24 -16
  8. package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +4 -0
  9. package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +20 -4
  10. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +3 -2
  11. package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +32 -2
  12. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +14 -21
  13. package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +4 -2
  14. package/common/cpp/audioapi/core/AudioNode.cpp +2 -2
  15. package/common/cpp/audioapi/core/AudioParam.cpp +1 -1
  16. package/common/cpp/audioapi/core/BaseAudioContext.cpp +4 -12
  17. package/common/cpp/audioapi/core/BaseAudioContext.h +2 -4
  18. package/common/cpp/audioapi/core/Constants.h +8 -33
  19. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +42 -45
  20. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
  21. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -1
  22. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +12 -8
  23. package/common/cpp/audioapi/core/effects/GainNode.cpp +4 -3
  24. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +32 -49
  25. package/common/cpp/audioapi/core/effects/PeriodicWave.h +8 -3
  26. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +3 -3
  27. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +9 -2
  28. package/common/cpp/audioapi/core/sources/AudioBuffer.h +5 -2
  29. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +72 -35
  30. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +41 -8
  31. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +18 -6
  32. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +7 -0
  33. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -3
  34. package/common/cpp/audioapi/core/sources/OscillatorNode.h +1 -0
  35. package/common/cpp/audioapi/core/types/TimeStretchType.h +7 -0
  36. package/common/cpp/audioapi/dsp/AudioUtils.cpp +2 -2
  37. package/common/cpp/audioapi/dsp/AudioUtils.h +2 -2
  38. package/common/cpp/audioapi/dsp/FFT.cpp +41 -0
  39. package/common/cpp/audioapi/dsp/FFT.h +29 -0
  40. package/common/cpp/audioapi/dsp/VectorMath.cpp +3 -3
  41. package/common/cpp/audioapi/dsp/VectorMath.h +2 -2
  42. package/common/cpp/audioapi/dsp/Windows.cpp +80 -0
  43. package/common/cpp/audioapi/dsp/Windows.h +95 -0
  44. package/{android/src/main/cpp/audioapi/android/libs → common/cpp/audioapi/libs/pffft}/pffft.c +1 -1
  45. package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/delay.h +9 -11
  46. package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/fft.h +6 -7
  47. package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/perf.h +0 -2
  48. package/common/cpp/audioapi/libs/{signalsmith-stretch.h → signalsmith-stretch/signalsmith-stretch.h} +3 -4
  49. package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/spectral.h +10 -13
  50. package/common/cpp/audioapi/{core/utils → utils}/AudioArray.cpp +5 -5
  51. package/common/cpp/audioapi/{core/utils → utils}/AudioBus.cpp +29 -29
  52. package/ios/audioapi/ios/core/AudioDecoder.mm +3 -3
  53. package/ios/audioapi/ios/core/AudioPlayer.h +5 -2
  54. package/ios/audioapi/ios/core/AudioPlayer.m +9 -5
  55. package/ios/audioapi/ios/core/IOSAudioPlayer.h +1 -0
  56. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +12 -10
  57. package/lib/module/api.js +1 -2
  58. package/lib/module/api.js.map +1 -1
  59. package/lib/module/api.web.js +1 -1
  60. package/lib/module/api.web.js.map +1 -1
  61. package/lib/module/core/AudioBufferSourceNode.js +6 -0
  62. package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
  63. package/lib/module/core/AudioScheduledSourceNode.js +5 -0
  64. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
  65. package/lib/module/core/BaseAudioContext.js +0 -4
  66. package/lib/module/core/BaseAudioContext.js.map +1 -1
  67. package/lib/module/web-core/AudioBufferSourceNode.js +6 -0
  68. package/lib/module/web-core/AudioBufferSourceNode.js.map +1 -1
  69. package/lib/module/web-core/AudioScheduledSourceNode.js +8 -0
  70. package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
  71. package/lib/typescript/api.d.ts +1 -2
  72. package/lib/typescript/api.d.ts.map +1 -1
  73. package/lib/typescript/api.web.d.ts +1 -1
  74. package/lib/typescript/api.web.d.ts.map +1 -1
  75. package/lib/typescript/core/AudioBufferSourceNode.d.ts +3 -0
  76. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
  77. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +1 -0
  78. package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
  79. package/lib/typescript/core/BaseAudioContext.d.ts +0 -2
  80. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  81. package/lib/typescript/interfaces.d.ts +3 -6
  82. package/lib/typescript/interfaces.d.ts.map +1 -1
  83. package/lib/typescript/types.d.ts +1 -0
  84. package/lib/typescript/types.d.ts.map +1 -1
  85. package/lib/typescript/web-core/AudioBufferSourceNode.d.ts +3 -0
  86. package/lib/typescript/web-core/AudioBufferSourceNode.d.ts.map +1 -1
  87. package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +1 -0
  88. package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts.map +1 -1
  89. package/package.json +1 -2
  90. package/src/api.ts +1 -1
  91. package/src/api.web.ts +1 -0
  92. package/src/core/AudioBufferSourceNode.ts +9 -0
  93. package/src/core/AudioScheduledSourceNode.ts +5 -0
  94. package/src/core/BaseAudioContext.ts +0 -5
  95. package/src/interfaces.ts +3 -6
  96. package/src/types.ts +2 -0
  97. package/src/web-core/AudioBufferSourceNode.tsx +11 -0
  98. package/src/web-core/AudioScheduledSourceNode.tsx +9 -0
  99. package/common/cpp/audioapi/HostObjects/StretcherNodeHostObject.h +0 -35
  100. package/common/cpp/audioapi/core/effects/StretcherNode.cpp +0 -94
  101. package/common/cpp/audioapi/core/effects/StretcherNode.h +0 -35
  102. package/common/cpp/audioapi/dsp/FFTFrame.cpp +0 -100
  103. package/common/cpp/audioapi/dsp/FFTFrame.h +0 -74
  104. package/common/cpp/audioapi/libs/dsp/common.h +0 -47
  105. package/common/cpp/audioapi/libs/dsp/windows.h +0 -219
  106. package/lib/module/core/StretcherNode.js +0 -12
  107. package/lib/module/core/StretcherNode.js.map +0 -1
  108. package/lib/typescript/core/StretcherNode.d.ts +0 -10
  109. package/lib/typescript/core/StretcherNode.d.ts.map +0 -1
  110. package/src/core/StretcherNode.ts +0 -15
  111. /package/common/cpp/audioapi/libs/{miniaudio.h → miniaudio/miniaudio.h} +0 -0
  112. /package/{android/src/main/cpp/audioapi/android/libs → common/cpp/audioapi/libs/pffft}/pffft.h +0 -0
  113. /package/common/cpp/audioapi/{core/utils → utils}/AudioArray.h +0 -0
  114. /package/common/cpp/audioapi/{core/utils → utils}/AudioBus.h +0 -0
@@ -1,10 +1,9 @@
1
1
  cmake_minimum_required(VERSION 3.12.0)
2
2
 
3
3
  file(GLOB_RECURSE ANDROID_CPP_SOURCES CONFIGURE_DEPENDS "${ANDROID_CPP_DIR}/audioapi/*.cpp")
4
- file(GLOB_RECURSE ANDROID_C_SOURCES CONFIGURE_DEPENDS "${ANDROID_CPP_DIR}/audioapi/*.c")
5
- file(GLOB_RECURSE COMMON_CPP_SOURCES CONFIGURE_DEPENDS "${COMMON_CPP_DIR}/audioapi/*.cpp")
4
+ file(GLOB_RECURSE COMMON_CPP_SOURCES CONFIGURE_DEPENDS "${COMMON_CPP_DIR}/audioapi/*.cpp" "${COMMON_CPP_DIR}/audioapi/*.c")
6
5
 
7
- add_library(react-native-audio-api SHARED ${ANDROID_CPP_SOURCES} ${ANDROID_C_SOURCES} ${COMMON_CPP_SOURCES})
6
+ add_library(react-native-audio-api SHARED ${ANDROID_CPP_SOURCES} ${COMMON_CPP_SOURCES})
8
7
 
9
8
  find_package(ReactAndroid REQUIRED CONFIG)
10
9
  find_package(fbjni REQUIRED CONFIG)
@@ -1,11 +1,11 @@
1
- #include <audioapi/core/utils/AudioArray.h>
2
- #include <audioapi/core/utils/AudioBus.h>
3
1
  #include <audioapi/core/utils/AudioDecoder.h>
2
+ #include <audioapi/utils/AudioArray.h>
3
+ #include <audioapi/utils/AudioBus.h>
4
4
 
5
5
  #include <android/log.h>
6
6
 
7
7
  #define MINIAUDIO_IMPLEMENTATION
8
- #include <audioapi/libs/miniaudio.h>
8
+ #include <audioapi/libs/miniaudio/miniaudio.h>
9
9
 
10
10
  namespace audioapi {
11
11
 
@@ -1,50 +1,49 @@
1
1
  #include <audioapi/android/core/AudioPlayer.h>
2
2
  #include <audioapi/core/AudioContext.h>
3
3
  #include <audioapi/core/Constants.h>
4
- #include <audioapi/core/utils/AudioArray.h>
5
- #include <audioapi/core/utils/AudioBus.h>
4
+ #include <audioapi/utils/AudioArray.h>
5
+ #include <audioapi/utils/AudioBus.h>
6
6
 
7
7
  namespace audioapi {
8
8
 
9
9
  AudioPlayer::AudioPlayer(
10
10
  const std::function<void(std::shared_ptr<AudioBus>, int)> &renderAudio)
11
- : renderAudio_(renderAudio) {
11
+ : renderAudio_(renderAudio), channelCount_(2) {
12
12
  AudioStreamBuilder builder;
13
13
 
14
14
  builder.setSharingMode(SharingMode::Exclusive)
15
15
  ->setFormat(AudioFormat::Float)
16
16
  ->setFormatConversionAllowed(true)
17
17
  ->setPerformanceMode(PerformanceMode::LowLatency)
18
- ->setChannelCount(CHANNEL_COUNT)
18
+ ->setChannelCount(channelCount_)
19
19
  ->setSampleRateConversionQuality(SampleRateConversionQuality::Medium)
20
20
  ->setDataCallback(this)
21
21
  ->openStream(mStream_);
22
22
 
23
23
  sampleRate_ = static_cast<float>(mStream_->getSampleRate());
24
24
  mBus_ = std::make_shared<AudioBus>(
25
- RENDER_QUANTUM_SIZE, CHANNEL_COUNT, sampleRate_);
25
+ RENDER_QUANTUM_SIZE, channelCount_, sampleRate_);
26
26
  isInitialized_ = true;
27
27
  }
28
28
 
29
29
  AudioPlayer::AudioPlayer(
30
30
  const std::function<void(std::shared_ptr<AudioBus>, int)> &renderAudio,
31
31
  float sampleRate)
32
- : renderAudio_(renderAudio) {
32
+ : renderAudio_(renderAudio), channelCount_(2) {
33
33
  AudioStreamBuilder builder;
34
34
 
35
35
  builder.setSharingMode(SharingMode::Exclusive)
36
36
  ->setFormat(AudioFormat::Float)
37
37
  ->setFormatConversionAllowed(true)
38
38
  ->setPerformanceMode(PerformanceMode::LowLatency)
39
- ->setChannelCount(CHANNEL_COUNT)
39
+ ->setChannelCount(2)
40
40
  ->setSampleRateConversionQuality(SampleRateConversionQuality::Medium)
41
41
  ->setDataCallback(this)
42
42
  ->setSampleRate(static_cast<int>(sampleRate))
43
43
  ->openStream(mStream_);
44
44
 
45
45
  sampleRate_ = sampleRate;
46
- mBus_ = std::make_shared<AudioBus>(
47
- RENDER_QUANTUM_SIZE, CHANNEL_COUNT, sampleRate_);
46
+ mBus_ = std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, 2, sampleRate_);
48
47
  isInitialized_ = true;
49
48
  }
50
49
 
@@ -100,8 +99,8 @@ DataCallbackResult AudioPlayer::onAudioReady(
100
99
 
101
100
  // TODO: optimize this with SIMD?
102
101
  for (int i = 0; i < framesToProcess; i++) {
103
- for (int channel = 0; channel < CHANNEL_COUNT; channel += 1) {
104
- buffer[(processedFrames + i) * CHANNEL_COUNT + channel] =
102
+ for (int channel = 0; channel < channelCount_; channel += 1) {
103
+ buffer[(processedFrames + i) * channelCount_ + channel] =
105
104
  mBus_->getChannel(channel)->getData()[i];
106
105
  }
107
106
  }
@@ -37,6 +37,7 @@ class AudioPlayer : public AudioStreamDataCallback {
37
37
  std::shared_ptr<AudioBus> mBus_;
38
38
  bool isInitialized_ = false;
39
39
  float sampleRate_;
40
+ int channelCount_;
40
41
  };
41
42
 
42
43
  } // namespace audioapi
@@ -24,7 +24,6 @@ class AudioAPIPackage :
24
24
  }
25
25
 
26
26
  override fun getReactModuleInfoProvider(): ReactModuleInfoProvider =
27
-
28
27
  ReactModuleInfoProvider(
29
28
  fun (): Map<String, ReactModuleInfo> =
30
29
  mapOf(
@@ -37,10 +37,8 @@ class AudioAPIModuleInstaller {
37
37
  audioContext = std::make_shared<AudioContext>(sampleRate);
38
38
  }
39
39
 
40
- auto promiseVendor = std::make_shared<PromiseVendor>(jsiRuntime, jsCallInvoker);
41
-
42
40
  auto audioContextHostObject = std::make_shared<AudioContextHostObject>(
43
- audioContext, promiseVendor);
41
+ audioContext, jsiRuntime, jsCallInvoker);
44
42
 
45
43
  return jsi::Object::createFromHostObject(
46
44
  runtime, audioContextHostObject);
@@ -73,31 +73,35 @@ class AnalyserNodeHostObject : public AudioNodeHostObject {
73
73
  }
74
74
 
75
75
  JSI_HOST_FUNCTION(getFloatFrequencyData) {
76
- auto destination = args[0].getObject(runtime).asArray(runtime);
77
- auto length = static_cast<int>(destination.getProperty(runtime, "length").asNumber());
78
- auto data = new float[length];
76
+ auto destination = args[0].getObject(runtime).asArray(runtime);
77
+ auto length = static_cast<int>(destination.getProperty(runtime, "length").asNumber());
78
+ auto data = new float[length];
79
79
 
80
- auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
81
- analyserNode->getFloatFrequencyData(data, length);
80
+ auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
81
+ analyserNode->getFloatFrequencyData(data, length);
82
82
 
83
- for (int i = 0; i < length; i++) {
84
- destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
85
- }
83
+ for (int i = 0; i < length; i++) {
84
+ destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
85
+ }
86
+
87
+ delete[] data;
86
88
 
87
89
  return jsi::Value::undefined();
88
90
  }
89
91
 
90
92
  JSI_HOST_FUNCTION(getByteFrequencyData) {
91
- auto destination = args[0].getObject(runtime).asArray(runtime);
92
- auto length = static_cast<int>(destination.getProperty(runtime, "length").asNumber());
93
- auto data = new uint8_t[length];
93
+ auto destination = args[0].getObject(runtime).asArray(runtime);
94
+ auto length = static_cast<int>(destination.getProperty(runtime, "length").asNumber());
95
+ auto data = new uint8_t[length];
96
+
97
+ auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
98
+ analyserNode->getByteFrequencyData(data, length);
94
99
 
95
- auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
96
- analyserNode->getByteFrequencyData(data, length);
100
+ for (int i = 0; i < length; i++) {
101
+ destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
102
+ }
97
103
 
98
- for (int i = 0; i < length; i++) {
99
- destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
100
- }
104
+ delete[] data;
101
105
 
102
106
  return jsi::Value::undefined();
103
107
  }
@@ -114,6 +118,8 @@ class AnalyserNodeHostObject : public AudioNodeHostObject {
114
118
  destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
115
119
  }
116
120
 
121
+ delete[] data;
122
+
117
123
  return jsi::Value::undefined();
118
124
  }
119
125
 
@@ -129,6 +135,8 @@ class AnalyserNodeHostObject : public AudioNodeHostObject {
129
135
  destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
130
136
  }
131
137
 
138
+ delete[] data;
139
+
132
140
  return jsi::Value::undefined();
133
141
  }
134
142
 
@@ -74,6 +74,8 @@ class AudioBufferHostObject : public JsiHostObject {
74
74
  destination.setValueAtIndex(runtime, i, jsi::Value(destinationData[i]));
75
75
  }
76
76
 
77
+ delete[] destinationData;
78
+
77
79
  return jsi::Value::undefined();
78
80
  }
79
81
 
@@ -94,6 +96,8 @@ class AudioBufferHostObject : public JsiHostObject {
94
96
  audioBuffer_->copyToChannel(
95
97
  sourceData, sourceLength, channelNumber, startInChannel);
96
98
 
99
+ delete[] sourceData;
100
+
97
101
  return jsi::Value::undefined();
98
102
  }
99
103
  };
@@ -15,21 +15,24 @@ class AudioBufferSourceNodeHostObject
15
15
  : public AudioScheduledSourceNodeHostObject {
16
16
  public:
17
17
  explicit AudioBufferSourceNodeHostObject(
18
- const std::shared_ptr<AudioBufferSourceNode> &node)
19
- : AudioScheduledSourceNodeHostObject(node) {
18
+ const std::shared_ptr<AudioBufferSourceNode> &node,
19
+ const std::shared_ptr<react::CallInvoker> &callInvoker)
20
+ : AudioScheduledSourceNodeHostObject(node, callInvoker) {
20
21
  addGetters(
21
22
  JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loop),
22
23
  JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, buffer),
23
24
  JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopStart),
24
25
  JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopEnd),
25
26
  JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, detune),
26
- JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, playbackRate));
27
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, playbackRate),
28
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, timeStretch));
27
29
 
28
30
  addSetters(
29
31
  JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loop),
30
32
  JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, buffer),
31
33
  JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopStart),
32
- JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopEnd));
34
+ JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopEnd),
35
+ JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, timeStretch));
33
36
 
34
37
  // start method is overridden in this class
35
38
  functions_->erase("start");
@@ -89,6 +92,13 @@ class AudioBufferSourceNodeHostObject
89
92
  return jsi::Object::createFromHostObject(runtime, playbackRateHostObject);
90
93
  }
91
94
 
95
+ JSI_PROPERTY_GETTER(timeStretch) {
96
+ auto audioBufferSourceNode =
97
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
98
+ auto timeStretch = audioBufferSourceNode->getTimeStretchType();
99
+ return jsi::String::createFromUtf8(runtime, timeStretch);
100
+ }
101
+
92
102
  JSI_PROPERTY_SETTER(loop) {
93
103
  auto audioBufferSourceNode =
94
104
  std::static_pointer_cast<AudioBufferSourceNode>(node_);
@@ -120,6 +130,12 @@ class AudioBufferSourceNodeHostObject
120
130
  audioBufferSourceNode->setLoopEnd(value.getNumber());
121
131
  }
122
132
 
133
+ JSI_PROPERTY_SETTER(timeStretch) {
134
+ auto audioBufferSourceNode =
135
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
136
+ audioBufferSourceNode->setTimeStretchType(value.getString(runtime).utf8(runtime));
137
+ }
138
+
123
139
  JSI_HOST_FUNCTION(start) {
124
140
  auto when = args[0].getNumber();
125
141
  auto offset = args[1].getNumber();
@@ -15,8 +15,9 @@ class AudioContextHostObject : public BaseAudioContextHostObject {
15
15
  public:
16
16
  explicit AudioContextHostObject(
17
17
  const std::shared_ptr<AudioContext> &audioContext,
18
- const std::shared_ptr<PromiseVendor> &promiseVendor)
19
- : BaseAudioContextHostObject(audioContext, promiseVendor) {
18
+ jsi::Runtime *runtime,
19
+ const std::shared_ptr<react::CallInvoker> &callInvoker)
20
+ : BaseAudioContextHostObject(audioContext, runtime, callInvoker) {
20
21
  addFunctions(
21
22
  JSI_EXPORT_FUNCTION(AudioContextHostObject, close),
22
23
  JSI_EXPORT_FUNCTION(AudioContextHostObject, resume),
@@ -12,13 +12,39 @@ using namespace facebook;
12
12
  class AudioScheduledSourceNodeHostObject : public AudioNodeHostObject {
13
13
  public:
14
14
  explicit AudioScheduledSourceNodeHostObject(
15
- const std::shared_ptr<AudioScheduledSourceNode> &node)
16
- : AudioNodeHostObject(node) {
15
+ const std::shared_ptr<AudioScheduledSourceNode> &node,
16
+ const std::shared_ptr<react::CallInvoker> &callInvoker)
17
+ : AudioNodeHostObject(node), callInvoker_(callInvoker) {
18
+ addSetters(
19
+ JSI_EXPORT_PROPERTY_SETTER(AudioScheduledSourceNodeHostObject, onended));
17
20
  addFunctions(
18
21
  JSI_EXPORT_FUNCTION(AudioScheduledSourceNodeHostObject, start),
19
22
  JSI_EXPORT_FUNCTION(AudioScheduledSourceNodeHostObject, stop));
20
23
  }
21
24
 
25
+ ~AudioScheduledSourceNodeHostObject() override {
26
+ // https://github.com/software-mansion/react-native-reanimated/blob/2b669b069bd70ba876d97a9e19daa509808a1b3a/packages/react-native-worklets/Common/cpp/worklets/SharedItems/Shareables.h#L39-L63
27
+ auto audioScheduleSourceNode =
28
+ std::static_pointer_cast<AudioScheduledSourceNode>(node_);
29
+ audioScheduleSourceNode->setOnendedCallback(nullptr);
30
+
31
+ onendedCallback_ = nullptr;
32
+ }
33
+
34
+ JSI_PROPERTY_SETTER(onended) {
35
+ onendedCallback_ = std::make_unique<jsi::Function>(value.getObject(runtime).getFunction(runtime));
36
+ auto audioScheduleSourceNode =
37
+ std::static_pointer_cast<AudioScheduledSourceNode>(node_);
38
+
39
+ auto lambda = [this, &runtime](double stopTime) {
40
+ callInvoker_->invokeAsync([this, &runtime, stopTime] () {
41
+ onendedCallback_->call(runtime, stopTime);
42
+ });
43
+ };
44
+
45
+ audioScheduleSourceNode->setOnendedCallback(lambda);
46
+ }
47
+
22
48
  JSI_HOST_FUNCTION(start) {
23
49
  auto when = args[0].getNumber();
24
50
  auto audioScheduleSourceNode =
@@ -34,5 +60,9 @@ class AudioScheduledSourceNodeHostObject : public AudioNodeHostObject {
34
60
  audioScheduleSourceNode->stop(time);
35
61
  return jsi::Value::undefined();
36
62
  }
63
+
64
+ private:
65
+ std::shared_ptr<react::CallInvoker> callInvoker_;
66
+ std::unique_ptr<jsi::Function> onendedCallback_;
37
67
  };
38
68
  } // namespace audioapi
@@ -12,7 +12,6 @@
12
12
  #include <audioapi/HostObjects/PeriodicWaveHostObject.h>
13
13
  #include <audioapi/HostObjects/StereoPannerNodeHostObject.h>
14
14
  #include <audioapi/HostObjects/AnalyserNodeHostObject.h>
15
- #include <audioapi/HostObjects/StretcherNodeHostObject.h>
16
15
 
17
16
  #include <jsi/jsi.h>
18
17
  #include <memory>
@@ -27,8 +26,11 @@ class BaseAudioContextHostObject : public JsiHostObject {
27
26
  public:
28
27
  explicit BaseAudioContextHostObject(
29
28
  const std::shared_ptr<BaseAudioContext> &context,
30
- const std::shared_ptr<PromiseVendor> &promiseVendor)
31
- : context_(context), promiseVendor_(promiseVendor) {
29
+ jsi::Runtime *runtime,
30
+ const std::shared_ptr<react::CallInvoker> &callInvoker)
31
+ : context_(context), callInvoker_(callInvoker) {
32
+ promiseVendor_ = std::make_shared<PromiseVendor>(runtime, callInvoker);
33
+
32
34
  addGetters(
33
35
  JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, destination),
34
36
  JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, state),
@@ -44,7 +46,6 @@ class BaseAudioContextHostObject : public JsiHostObject {
44
46
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBuffer),
45
47
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createPeriodicWave),
46
48
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createAnalyser),
47
- JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStretcher),
48
49
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, decodeAudioDataSource));
49
50
  }
50
51
 
@@ -69,7 +70,7 @@ class BaseAudioContextHostObject : public JsiHostObject {
69
70
  JSI_HOST_FUNCTION(createOscillator) {
70
71
  auto oscillator = context_->createOscillator();
71
72
  auto oscillatorHostObject =
72
- std::make_shared<OscillatorNodeHostObject>(oscillator);
73
+ std::make_shared<OscillatorNodeHostObject>(oscillator, callInvoker_);
73
74
  return jsi::Object::createFromHostObject(runtime, oscillatorHostObject);
74
75
  }
75
76
 
@@ -96,7 +97,7 @@ class BaseAudioContextHostObject : public JsiHostObject {
96
97
  JSI_HOST_FUNCTION(createBufferSource) {
97
98
  auto bufferSource = context_->createBufferSource();
98
99
  auto bufferSourceHostObject =
99
- std::make_shared<AudioBufferSourceNodeHostObject>(bufferSource);
100
+ std::make_shared<AudioBufferSourceNodeHostObject>(bufferSource, callInvoker_);
100
101
  return jsi::Object::createFromHostObject(runtime, bufferSourceHostObject);
101
102
  }
102
103
 
@@ -116,22 +117,19 @@ class BaseAudioContextHostObject : public JsiHostObject {
116
117
  auto length =
117
118
  static_cast<int>(real.getProperty(runtime, "length").asNumber());
118
119
 
119
- auto *realData = new float[length];
120
- auto *imagData = new float[length];
120
+ auto complexData = std::vector<std::complex<float>>(length);
121
121
 
122
122
  for (size_t i = 0; i < real.length(runtime); i++) {
123
- realData[i] =
124
- static_cast<float>(real.getValueAtIndex(runtime, i).getNumber());
125
- }
126
- for (size_t i = 0; i < imag.length(runtime); i++) {
127
- realData[i] =
128
- static_cast<float>(imag.getValueAtIndex(runtime, i).getNumber());
123
+ complexData[i] = std::complex<float>(
124
+ static_cast<float>(real.getValueAtIndex(runtime, i).getNumber()),
125
+ static_cast<float>(imag.getValueAtIndex(runtime, i).getNumber()));
129
126
  }
130
127
 
131
128
  auto periodicWave = context_->createPeriodicWave(
132
- realData, imagData, disableNormalization, length);
129
+ complexData, disableNormalization, length);
133
130
  auto periodicWaveHostObject =
134
131
  std::make_shared<PeriodicWaveHostObject>(periodicWave);
132
+
135
133
  return jsi::Object::createFromHostObject(runtime, periodicWaveHostObject);
136
134
  }
137
135
 
@@ -141,12 +139,6 @@ class BaseAudioContextHostObject : public JsiHostObject {
141
139
  return jsi::Object::createFromHostObject(runtime, analyserHostObject);
142
140
  }
143
141
 
144
- JSI_HOST_FUNCTION(createStretcher) {
145
- auto stretcher = context_->createStretcher();
146
- auto stretcherHostObject = std::make_shared<StretcherNodeHostObject>(stretcher);
147
- return jsi::Object::createFromHostObject(runtime, stretcherHostObject);
148
- }
149
-
150
142
  JSI_HOST_FUNCTION(decodeAudioDataSource) {
151
143
  auto sourcePath = args[0].getString(runtime).utf8(runtime);
152
144
 
@@ -172,5 +164,6 @@ class BaseAudioContextHostObject : public JsiHostObject {
172
164
  protected:
173
165
  std::shared_ptr<BaseAudioContext> context_;
174
166
  std::shared_ptr<PromiseVendor> promiseVendor_;
167
+ std::shared_ptr<react::CallInvoker> callInvoker_;
175
168
  };
176
169
  } // namespace audioapi
@@ -14,8 +14,10 @@ using namespace facebook;
14
14
 
15
15
  class OscillatorNodeHostObject : public AudioScheduledSourceNodeHostObject {
16
16
  public:
17
- explicit OscillatorNodeHostObject(const std::shared_ptr<OscillatorNode> &node)
18
- : AudioScheduledSourceNodeHostObject(node) {
17
+ explicit OscillatorNodeHostObject(
18
+ const std::shared_ptr<OscillatorNode> &node,
19
+ const std::shared_ptr<react::CallInvoker> &callInvoker)
20
+ : AudioScheduledSourceNodeHostObject(node, callInvoker) {
19
21
  addGetters(
20
22
  JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, frequency),
21
23
  JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, detune),
@@ -1,8 +1,8 @@
1
1
  #include <audioapi/core/AudioNode.h>
2
2
  #include <audioapi/core/BaseAudioContext.h>
3
- #include <audioapi/core/utils/AudioArray.h>
4
- #include <audioapi/core/utils/AudioBus.h>
5
3
  #include <audioapi/core/utils/AudioNodeManager.h>
4
+ #include <audioapi/utils/AudioArray.h>
5
+ #include <audioapi/utils/AudioBus.h>
6
6
 
7
7
  namespace audioapi {
8
8
 
@@ -206,7 +206,7 @@ void AudioParam::setValueCurveAtTime(
206
206
  (time - startTime) * static_cast<double>(length - 1) /
207
207
  (endTime - startTime));
208
208
 
209
- return AudioUtils::linearInterpolate(values, k, k + 1, factor);
209
+ return dsp::linearInterpolate(values, k, k + 1, factor);
210
210
  }
211
211
 
212
212
  return endValue;
@@ -4,14 +4,13 @@
4
4
  #include <audioapi/core/effects/BiquadFilterNode.h>
5
5
  #include <audioapi/core/effects/GainNode.h>
6
6
  #include <audioapi/core/effects/StereoPannerNode.h>
7
- #include <audioapi/core/effects/StretcherNode.h>
8
7
  #include <audioapi/core/sources/AudioBuffer.h>
9
8
  #include <audioapi/core/sources/AudioBufferSourceNode.h>
10
9
  #include <audioapi/core/sources/OscillatorNode.h>
11
- #include <audioapi/core/utils/AudioArray.h>
12
- #include <audioapi/core/utils/AudioBus.h>
13
10
  #include <audioapi/core/utils/AudioDecoder.h>
14
11
  #include <audioapi/core/utils/AudioNodeManager.h>
12
+ #include <audioapi/utils/AudioArray.h>
13
+ #include <audioapi/utils/AudioBus.h>
15
14
 
16
15
  namespace audioapi {
17
16
 
@@ -80,12 +79,11 @@ std::shared_ptr<AudioBuffer> BaseAudioContext::createBuffer(
80
79
  }
81
80
 
82
81
  std::shared_ptr<PeriodicWave> BaseAudioContext::createPeriodicWave(
83
- float *real,
84
- float *imag,
82
+ const std::vector<std::complex<float>> &complexData,
85
83
  bool disableNormalization,
86
84
  int length) {
87
85
  return std::make_shared<PeriodicWave>(
88
- sampleRate_, real, imag, length, disableNormalization);
86
+ sampleRate_, complexData, length, disableNormalization);
89
87
  }
90
88
 
91
89
  std::shared_ptr<AnalyserNode> BaseAudioContext::createAnalyser() {
@@ -94,12 +92,6 @@ std::shared_ptr<AnalyserNode> BaseAudioContext::createAnalyser() {
94
92
  return analyser;
95
93
  }
96
94
 
97
- std::shared_ptr<StretcherNode> BaseAudioContext::createStretcher() {
98
- auto node = std::make_shared<StretcherNode>(this);
99
- nodeManager_->addNode(node);
100
- return node;
101
- }
102
-
103
95
  std::shared_ptr<AudioBuffer> BaseAudioContext::decodeAudioDataSource(
104
96
  const std::string &path) {
105
97
  auto audioBus = audioDecoder_->decodeWithFilePath(path);
@@ -8,6 +8,7 @@
8
8
  #include <string>
9
9
  #include <utility>
10
10
  #include <vector>
11
+ #include <complex>
11
12
  #include <cstddef>
12
13
  #include <cassert>
13
14
 
@@ -25,7 +26,6 @@ class AudioDestinationNode;
25
26
  class AudioBufferSourceNode;
26
27
  class AudioDecoder;
27
28
  class AnalyserNode;
28
- class StretcherNode;
29
29
 
30
30
  class BaseAudioContext {
31
31
  public:
@@ -46,12 +46,10 @@ class BaseAudioContext {
46
46
  static std::shared_ptr<AudioBuffer>
47
47
  createBuffer(int numberOfChannels, size_t length, float sampleRate);
48
48
  std::shared_ptr<PeriodicWave> createPeriodicWave(
49
- float *real,
50
- float *imag,
49
+ const std::vector<std::complex<float>> &complexData,
51
50
  bool disableNormalization,
52
51
  int length);
53
52
  std::shared_ptr<AnalyserNode> createAnalyser();
54
- std::shared_ptr<StretcherNode> createStretcher();
55
53
 
56
54
  std::shared_ptr<AudioBuffer> decodeAudioDataSource(const std::string &path);
57
55
 
@@ -6,39 +6,14 @@
6
6
  // https://webaudio.github.io/web-audio-api/
7
7
 
8
8
  namespace audioapi {
9
- // context
10
- constexpr int RENDER_QUANTUM_SIZE = 128;
11
- constexpr int CHANNEL_COUNT = 2;
9
+ // audio
10
+ static constexpr int RENDER_QUANTUM_SIZE = 128;
11
+ static constexpr size_t MAX_FFT_SIZE = 32768;
12
12
 
13
13
  // general
14
- constexpr float MOST_POSITIVE_SINGLE_FLOAT = static_cast<float>(std::numeric_limits<float>::max());
15
- constexpr float MOST_NEGATIVE_SINGLE_FLOAT = static_cast<float>(std::numeric_limits<float>::lowest());
16
- constexpr float PI = static_cast<float>(M_PI);
17
-
18
- // pan
19
- constexpr float MAX_PAN = 1.0;
20
- constexpr float MIN_PAN = -1.0;
21
-
22
- // gain
23
- constexpr float MAX_GAIN = MOST_POSITIVE_SINGLE_FLOAT;
24
- constexpr float MIN_GAIN = -MAX_GAIN;
25
-
26
- // biquad filter
27
- constexpr float MIN_FILTER_FREQUENCY = 0.0;
28
- static float MAX_FILTER_GAIN = 40 * std::log10(MOST_POSITIVE_SINGLE_FLOAT);
29
- static float MIN_FILTER_GAIN = -MAX_GAIN;
30
- constexpr float MAX_FILTER_Q = MOST_POSITIVE_SINGLE_FLOAT;
31
- constexpr float MIN_FILTER_Q = -MAX_FILTER_Q;
32
-
33
- //detune
34
- static float MAX_DETUNE = 1200 * std::log2(MOST_POSITIVE_SINGLE_FLOAT);
35
- static float MIN_DETUNE = -MAX_DETUNE;
36
-
37
- // analyser node
38
- constexpr size_t MAX_FFT_SIZE = 32768;
39
- constexpr size_t MIN_FFT_SIZE = 32;
40
- constexpr size_t DEFAULT_FFT_SIZE = 2048;
41
- constexpr float DEFAULT_MAX_DECIBELS = -30;
42
- constexpr float DEFAULT_MIN_DECIBELS = -100;
43
- const float DEFAULT_SMOOTHING_TIME_CONSTANT = 0.8;
14
+ static constexpr float MOST_POSITIVE_SINGLE_FLOAT = static_cast<float>(std::numeric_limits<float>::max());
15
+ static constexpr float MOST_NEGATIVE_SINGLE_FLOAT = static_cast<float>(std::numeric_limits<float>::lowest());
16
+ static float LOG2_MOST_POSITIVE_SINGLE_FLOAT = std::log2(MOST_POSITIVE_SINGLE_FLOAT);
17
+ static float LOG10_MOST_POSITIVE_SINGLE_FLOAT = std::log10(MOST_POSITIVE_SINGLE_FLOAT);
18
+ static constexpr float PI = static_cast<float>(M_PI);
44
19
  } // namespace audioapi