react-native-audio-api 0.4.12 → 0.4.14

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 +3 -2
  2. package/android/src/main/cpp/audioapi/android/core/AudioDecoder.cpp +3 -3
  3. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +13 -12
  4. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +0 -1
  5. package/{common/cpp/audioapi/libs/pffft → android/src/main/cpp/audioapi/android/libs}/pffft.c +1 -1
  6. package/android/src/main/java/com/swmansion/audioapi/AudioAPIPackage.kt +1 -0
  7. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +3 -1
  8. package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +16 -24
  9. package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +0 -4
  10. package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +4 -20
  11. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +2 -3
  12. package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +2 -32
  13. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +21 -14
  14. package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +2 -4
  15. package/common/cpp/audioapi/HostObjects/StretcherNodeHostObject.h +35 -0
  16. package/common/cpp/audioapi/core/AudioNode.cpp +2 -2
  17. package/common/cpp/audioapi/core/AudioParam.cpp +1 -1
  18. package/common/cpp/audioapi/core/BaseAudioContext.cpp +12 -4
  19. package/common/cpp/audioapi/core/BaseAudioContext.h +4 -2
  20. package/common/cpp/audioapi/core/Constants.h +33 -8
  21. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +45 -42
  22. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +6 -8
  23. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -1
  24. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +8 -12
  25. package/common/cpp/audioapi/core/effects/GainNode.cpp +3 -4
  26. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +49 -32
  27. package/common/cpp/audioapi/core/effects/PeriodicWave.h +3 -8
  28. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +3 -3
  29. package/common/cpp/audioapi/core/effects/StretcherNode.cpp +94 -0
  30. package/common/cpp/audioapi/core/effects/StretcherNode.h +35 -0
  31. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +2 -9
  32. package/common/cpp/audioapi/core/sources/AudioBuffer.h +2 -5
  33. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +35 -72
  34. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -41
  35. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +6 -18
  36. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +0 -7
  37. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +3 -12
  38. package/common/cpp/audioapi/core/sources/OscillatorNode.h +0 -1
  39. package/common/cpp/audioapi/{utils → core/utils}/AudioArray.cpp +5 -5
  40. package/common/cpp/audioapi/{utils → core/utils}/AudioBus.cpp +29 -29
  41. package/common/cpp/audioapi/dsp/AudioUtils.cpp +2 -2
  42. package/common/cpp/audioapi/dsp/AudioUtils.h +2 -2
  43. package/common/cpp/audioapi/dsp/FFTFrame.cpp +100 -0
  44. package/common/cpp/audioapi/dsp/FFTFrame.h +74 -0
  45. package/common/cpp/audioapi/dsp/VectorMath.cpp +3 -3
  46. package/common/cpp/audioapi/dsp/VectorMath.h +2 -2
  47. package/common/cpp/audioapi/libs/dsp/common.h +47 -0
  48. package/common/cpp/audioapi/libs/{signalsmith-stretch → dsp}/delay.h +11 -9
  49. package/common/cpp/audioapi/libs/{signalsmith-stretch → dsp}/fft.h +7 -6
  50. package/common/cpp/audioapi/libs/{signalsmith-stretch → dsp}/perf.h +2 -0
  51. package/common/cpp/audioapi/libs/{signalsmith-stretch → dsp}/spectral.h +13 -10
  52. package/common/cpp/audioapi/libs/dsp/windows.h +219 -0
  53. package/common/cpp/audioapi/libs/{signalsmith-stretch/signalsmith-stretch.h → signalsmith-stretch.h} +4 -3
  54. package/ios/audioapi/ios/core/AudioDecoder.mm +3 -3
  55. package/ios/audioapi/ios/core/AudioPlayer.h +2 -5
  56. package/ios/audioapi/ios/core/AudioPlayer.m +5 -9
  57. package/ios/audioapi/ios/core/IOSAudioPlayer.h +0 -1
  58. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +10 -12
  59. package/lib/module/api.js +2 -1
  60. package/lib/module/api.js.map +1 -1
  61. package/lib/module/api.web.js +1 -1
  62. package/lib/module/api.web.js.map +1 -1
  63. package/lib/module/core/AudioBufferSourceNode.js +0 -6
  64. package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
  65. package/lib/module/core/AudioScheduledSourceNode.js +0 -5
  66. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
  67. package/lib/module/core/BaseAudioContext.js +4 -0
  68. package/lib/module/core/BaseAudioContext.js.map +1 -1
  69. package/lib/module/core/StretcherNode.js +12 -0
  70. package/lib/module/core/StretcherNode.js.map +1 -0
  71. package/lib/module/web-core/AudioBufferSourceNode.js +0 -6
  72. package/lib/module/web-core/AudioBufferSourceNode.js.map +1 -1
  73. package/lib/module/web-core/AudioScheduledSourceNode.js +0 -8
  74. package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
  75. package/lib/typescript/api.d.ts +2 -1
  76. package/lib/typescript/api.d.ts.map +1 -1
  77. package/lib/typescript/api.web.d.ts +1 -1
  78. package/lib/typescript/api.web.d.ts.map +1 -1
  79. package/lib/typescript/core/AudioBufferSourceNode.d.ts +0 -3
  80. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
  81. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +0 -1
  82. package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
  83. package/lib/typescript/core/BaseAudioContext.d.ts +2 -0
  84. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  85. package/lib/typescript/core/StretcherNode.d.ts +10 -0
  86. package/lib/typescript/core/StretcherNode.d.ts.map +1 -0
  87. package/lib/typescript/interfaces.d.ts +6 -3
  88. package/lib/typescript/interfaces.d.ts.map +1 -1
  89. package/lib/typescript/types.d.ts +0 -1
  90. package/lib/typescript/types.d.ts.map +1 -1
  91. package/lib/typescript/web-core/AudioBufferSourceNode.d.ts +0 -3
  92. package/lib/typescript/web-core/AudioBufferSourceNode.d.ts.map +1 -1
  93. package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +0 -1
  94. package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts.map +1 -1
  95. package/package.json +2 -1
  96. package/src/api.ts +1 -1
  97. package/src/api.web.ts +0 -1
  98. package/src/core/AudioBufferSourceNode.ts +0 -9
  99. package/src/core/AudioScheduledSourceNode.ts +0 -5
  100. package/src/core/BaseAudioContext.ts +5 -0
  101. package/src/core/StretcherNode.ts +15 -0
  102. package/src/interfaces.ts +6 -3
  103. package/src/types.ts +0 -2
  104. package/src/web-core/AudioBufferSourceNode.tsx +0 -11
  105. package/src/web-core/AudioScheduledSourceNode.tsx +0 -9
  106. package/common/cpp/audioapi/core/types/TimeStretchType.h +0 -7
  107. package/common/cpp/audioapi/dsp/FFT.cpp +0 -41
  108. package/common/cpp/audioapi/dsp/FFT.h +0 -29
  109. package/common/cpp/audioapi/dsp/Windows.cpp +0 -80
  110. package/common/cpp/audioapi/dsp/Windows.h +0 -95
  111. /package/{common/cpp/audioapi/libs/pffft → android/src/main/cpp/audioapi/android/libs}/pffft.h +0 -0
  112. /package/common/cpp/audioapi/{utils → core/utils}/AudioArray.h +0 -0
  113. /package/common/cpp/audioapi/{utils → core/utils}/AudioBus.h +0 -0
  114. /package/common/cpp/audioapi/libs/{miniaudio/miniaudio.h → miniaudio.h} +0 -0
@@ -1,9 +1,10 @@
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 COMMON_CPP_SOURCES CONFIGURE_DEPENDS "${COMMON_CPP_DIR}/audioapi/*.cpp" "${COMMON_CPP_DIR}/audioapi/*.c")
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")
5
6
 
6
- add_library(react-native-audio-api SHARED ${ANDROID_CPP_SOURCES} ${COMMON_CPP_SOURCES})
7
+ add_library(react-native-audio-api SHARED ${ANDROID_CPP_SOURCES} ${ANDROID_C_SOURCES} ${COMMON_CPP_SOURCES})
7
8
 
8
9
  find_package(ReactAndroid REQUIRED CONFIG)
9
10
  find_package(fbjni REQUIRED CONFIG)
@@ -1,11 +1,11 @@
1
+ #include <audioapi/core/utils/AudioArray.h>
2
+ #include <audioapi/core/utils/AudioBus.h>
1
3
  #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/miniaudio.h>
8
+ #include <audioapi/libs/miniaudio.h>
9
9
 
10
10
  namespace audioapi {
11
11
 
@@ -1,49 +1,50 @@
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/utils/AudioArray.h>
5
- #include <audioapi/utils/AudioBus.h>
4
+ #include <audioapi/core/utils/AudioArray.h>
5
+ #include <audioapi/core/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), channelCount_(2) {
11
+ : renderAudio_(renderAudio) {
12
12
  AudioStreamBuilder builder;
13
13
 
14
14
  builder.setSharingMode(SharingMode::Exclusive)
15
- ->setFormat(AudioFormat::Float)
15
+ ->setFormat(AudioFormat::None)
16
16
  ->setFormatConversionAllowed(true)
17
17
  ->setPerformanceMode(PerformanceMode::LowLatency)
18
- ->setChannelCount(channelCount_)
18
+ ->setChannelCount(CHANNEL_COUNT)
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, channelCount_, sampleRate_);
25
+ RENDER_QUANTUM_SIZE, CHANNEL_COUNT, 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), channelCount_(2) {
32
+ : renderAudio_(renderAudio) {
33
33
  AudioStreamBuilder builder;
34
34
 
35
35
  builder.setSharingMode(SharingMode::Exclusive)
36
- ->setFormat(AudioFormat::Float)
36
+ ->setFormat(AudioFormat::None)
37
37
  ->setFormatConversionAllowed(true)
38
38
  ->setPerformanceMode(PerformanceMode::LowLatency)
39
- ->setChannelCount(2)
39
+ ->setChannelCount(CHANNEL_COUNT)
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>(RENDER_QUANTUM_SIZE, 2, sampleRate_);
46
+ mBus_ = std::make_shared<AudioBus>(
47
+ RENDER_QUANTUM_SIZE, CHANNEL_COUNT, sampleRate_);
47
48
  isInitialized_ = true;
48
49
  }
49
50
 
@@ -99,8 +100,8 @@ DataCallbackResult AudioPlayer::onAudioReady(
99
100
 
100
101
  // TODO: optimize this with SIMD?
101
102
  for (int i = 0; i < framesToProcess; i++) {
102
- for (int channel = 0; channel < channelCount_; channel += 1) {
103
- buffer[(processedFrames + i) * channelCount_ + channel] =
103
+ for (int channel = 0; channel < CHANNEL_COUNT; channel += 1) {
104
+ buffer[(processedFrames + i) * CHANNEL_COUNT + channel] =
104
105
  mBus_->getChannel(channel)->getData()[i];
105
106
  }
106
107
  }
@@ -37,7 +37,6 @@ class AudioPlayer : public AudioStreamDataCallback {
37
37
  std::shared_ptr<AudioBus> mBus_;
38
38
  bool isInitialized_ = false;
39
39
  float sampleRate_;
40
- int channelCount_;
41
40
  };
42
41
 
43
42
  } // namespace audioapi
@@ -61,7 +61,7 @@
61
61
  # define _USE_MATH_DEFINES // ask gently MSVC to define M_PI, M_SQRT2 etc.
62
62
  #endif
63
63
 
64
- #include <audioapi/libs/pffft/pffft.h>
64
+ #include <audioapi/android/libs/pffft.h>
65
65
  #include <stdlib.h>
66
66
  #include <stdio.h>
67
67
  #include <math.h>
@@ -24,6 +24,7 @@ class AudioAPIPackage :
24
24
  }
25
25
 
26
26
  override fun getReactModuleInfoProvider(): ReactModuleInfoProvider =
27
+
27
28
  ReactModuleInfoProvider(
28
29
  fun (): Map<String, ReactModuleInfo> =
29
30
  mapOf(
@@ -37,8 +37,10 @@ class AudioAPIModuleInstaller {
37
37
  audioContext = std::make_shared<AudioContext>(sampleRate);
38
38
  }
39
39
 
40
+ auto promiseVendor = std::make_shared<PromiseVendor>(jsiRuntime, jsCallInvoker);
41
+
40
42
  auto audioContextHostObject = std::make_shared<AudioContextHostObject>(
41
- audioContext, jsiRuntime, jsCallInvoker);
43
+ audioContext, promiseVendor);
42
44
 
43
45
  return jsi::Object::createFromHostObject(
44
46
  runtime, audioContextHostObject);
@@ -73,35 +73,31 @@ 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];
79
-
80
- auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
81
- analyserNode->getFloatFrequencyData(data, 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];
82
79
 
83
- for (int i = 0; i < length; i++) {
84
- destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
85
- }
80
+ auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
81
+ analyserNode->getFloatFrequencyData(data, length);
86
82
 
87
- delete[] data;
83
+ for (int i = 0; i < length; i++) {
84
+ destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
85
+ }
88
86
 
89
87
  return jsi::Value::undefined();
90
88
  }
91
89
 
92
90
  JSI_HOST_FUNCTION(getByteFrequencyData) {
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);
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];
99
94
 
100
- for (int i = 0; i < length; i++) {
101
- destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
102
- }
95
+ auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
96
+ analyserNode->getByteFrequencyData(data, length);
103
97
 
104
- delete[] data;
98
+ for (int i = 0; i < length; i++) {
99
+ destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
100
+ }
105
101
 
106
102
  return jsi::Value::undefined();
107
103
  }
@@ -118,8 +114,6 @@ class AnalyserNodeHostObject : public AudioNodeHostObject {
118
114
  destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
119
115
  }
120
116
 
121
- delete[] data;
122
-
123
117
  return jsi::Value::undefined();
124
118
  }
125
119
 
@@ -135,8 +129,6 @@ class AnalyserNodeHostObject : public AudioNodeHostObject {
135
129
  destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
136
130
  }
137
131
 
138
- delete[] data;
139
-
140
132
  return jsi::Value::undefined();
141
133
  }
142
134
 
@@ -74,8 +74,6 @@ class AudioBufferHostObject : public JsiHostObject {
74
74
  destination.setValueAtIndex(runtime, i, jsi::Value(destinationData[i]));
75
75
  }
76
76
 
77
- delete[] destinationData;
78
-
79
77
  return jsi::Value::undefined();
80
78
  }
81
79
 
@@ -96,8 +94,6 @@ class AudioBufferHostObject : public JsiHostObject {
96
94
  audioBuffer_->copyToChannel(
97
95
  sourceData, sourceLength, channelNumber, startInChannel);
98
96
 
99
- delete[] sourceData;
100
-
101
97
  return jsi::Value::undefined();
102
98
  }
103
99
  };
@@ -15,24 +15,21 @@ class AudioBufferSourceNodeHostObject
15
15
  : public AudioScheduledSourceNodeHostObject {
16
16
  public:
17
17
  explicit AudioBufferSourceNodeHostObject(
18
- const std::shared_ptr<AudioBufferSourceNode> &node,
19
- const std::shared_ptr<react::CallInvoker> &callInvoker)
20
- : AudioScheduledSourceNodeHostObject(node, callInvoker) {
18
+ const std::shared_ptr<AudioBufferSourceNode> &node)
19
+ : AudioScheduledSourceNodeHostObject(node) {
21
20
  addGetters(
22
21
  JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loop),
23
22
  JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, buffer),
24
23
  JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopStart),
25
24
  JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopEnd),
26
25
  JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, detune),
27
- JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, playbackRate),
28
- JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, timeStretch));
26
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, playbackRate));
29
27
 
30
28
  addSetters(
31
29
  JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loop),
32
30
  JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, buffer),
33
31
  JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopStart),
34
- JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopEnd),
35
- JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, timeStretch));
32
+ JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopEnd));
36
33
 
37
34
  // start method is overridden in this class
38
35
  functions_->erase("start");
@@ -92,13 +89,6 @@ class AudioBufferSourceNodeHostObject
92
89
  return jsi::Object::createFromHostObject(runtime, playbackRateHostObject);
93
90
  }
94
91
 
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
-
102
92
  JSI_PROPERTY_SETTER(loop) {
103
93
  auto audioBufferSourceNode =
104
94
  std::static_pointer_cast<AudioBufferSourceNode>(node_);
@@ -130,12 +120,6 @@ class AudioBufferSourceNodeHostObject
130
120
  audioBufferSourceNode->setLoopEnd(value.getNumber());
131
121
  }
132
122
 
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
-
139
123
  JSI_HOST_FUNCTION(start) {
140
124
  auto when = args[0].getNumber();
141
125
  auto offset = args[1].getNumber();
@@ -15,9 +15,8 @@ class AudioContextHostObject : public BaseAudioContextHostObject {
15
15
  public:
16
16
  explicit AudioContextHostObject(
17
17
  const std::shared_ptr<AudioContext> &audioContext,
18
- jsi::Runtime *runtime,
19
- const std::shared_ptr<react::CallInvoker> &callInvoker)
20
- : BaseAudioContextHostObject(audioContext, runtime, callInvoker) {
18
+ const std::shared_ptr<PromiseVendor> &promiseVendor)
19
+ : BaseAudioContextHostObject(audioContext, promiseVendor) {
21
20
  addFunctions(
22
21
  JSI_EXPORT_FUNCTION(AudioContextHostObject, close),
23
22
  JSI_EXPORT_FUNCTION(AudioContextHostObject, resume),
@@ -12,39 +12,13 @@ using namespace facebook;
12
12
  class AudioScheduledSourceNodeHostObject : public AudioNodeHostObject {
13
13
  public:
14
14
  explicit AudioScheduledSourceNodeHostObject(
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));
15
+ const std::shared_ptr<AudioScheduledSourceNode> &node)
16
+ : AudioNodeHostObject(node) {
20
17
  addFunctions(
21
18
  JSI_EXPORT_FUNCTION(AudioScheduledSourceNodeHostObject, start),
22
19
  JSI_EXPORT_FUNCTION(AudioScheduledSourceNodeHostObject, stop));
23
20
  }
24
21
 
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
-
48
22
  JSI_HOST_FUNCTION(start) {
49
23
  auto when = args[0].getNumber();
50
24
  auto audioScheduleSourceNode =
@@ -60,9 +34,5 @@ class AudioScheduledSourceNodeHostObject : public AudioNodeHostObject {
60
34
  audioScheduleSourceNode->stop(time);
61
35
  return jsi::Value::undefined();
62
36
  }
63
-
64
- private:
65
- std::shared_ptr<react::CallInvoker> callInvoker_;
66
- std::unique_ptr<jsi::Function> onendedCallback_;
67
37
  };
68
38
  } // namespace audioapi
@@ -12,6 +12,7 @@
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>
15
16
 
16
17
  #include <jsi/jsi.h>
17
18
  #include <memory>
@@ -26,11 +27,8 @@ class BaseAudioContextHostObject : public JsiHostObject {
26
27
  public:
27
28
  explicit BaseAudioContextHostObject(
28
29
  const std::shared_ptr<BaseAudioContext> &context,
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
-
30
+ const std::shared_ptr<PromiseVendor> &promiseVendor)
31
+ : context_(context), promiseVendor_(promiseVendor) {
34
32
  addGetters(
35
33
  JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, destination),
36
34
  JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, state),
@@ -46,6 +44,7 @@ class BaseAudioContextHostObject : public JsiHostObject {
46
44
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBuffer),
47
45
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createPeriodicWave),
48
46
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createAnalyser),
47
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStretcher),
49
48
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, decodeAudioDataSource));
50
49
  }
51
50
 
@@ -70,7 +69,7 @@ class BaseAudioContextHostObject : public JsiHostObject {
70
69
  JSI_HOST_FUNCTION(createOscillator) {
71
70
  auto oscillator = context_->createOscillator();
72
71
  auto oscillatorHostObject =
73
- std::make_shared<OscillatorNodeHostObject>(oscillator, callInvoker_);
72
+ std::make_shared<OscillatorNodeHostObject>(oscillator);
74
73
  return jsi::Object::createFromHostObject(runtime, oscillatorHostObject);
75
74
  }
76
75
 
@@ -97,7 +96,7 @@ class BaseAudioContextHostObject : public JsiHostObject {
97
96
  JSI_HOST_FUNCTION(createBufferSource) {
98
97
  auto bufferSource = context_->createBufferSource();
99
98
  auto bufferSourceHostObject =
100
- std::make_shared<AudioBufferSourceNodeHostObject>(bufferSource, callInvoker_);
99
+ std::make_shared<AudioBufferSourceNodeHostObject>(bufferSource);
101
100
  return jsi::Object::createFromHostObject(runtime, bufferSourceHostObject);
102
101
  }
103
102
 
@@ -117,19 +116,22 @@ class BaseAudioContextHostObject : public JsiHostObject {
117
116
  auto length =
118
117
  static_cast<int>(real.getProperty(runtime, "length").asNumber());
119
118
 
120
- auto complexData = std::vector<std::complex<float>>(length);
119
+ auto *realData = new float[length];
120
+ auto *imagData = new float[length];
121
121
 
122
122
  for (size_t i = 0; i < real.length(runtime); i++) {
123
- complexData[i] = std::complex<float>(
124
- static_cast<float>(real.getValueAtIndex(runtime, i).getNumber()),
125
- static_cast<float>(imag.getValueAtIndex(runtime, i).getNumber()));
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());
126
129
  }
127
130
 
128
131
  auto periodicWave = context_->createPeriodicWave(
129
- complexData, disableNormalization, length);
132
+ realData, imagData, disableNormalization, length);
130
133
  auto periodicWaveHostObject =
131
134
  std::make_shared<PeriodicWaveHostObject>(periodicWave);
132
-
133
135
  return jsi::Object::createFromHostObject(runtime, periodicWaveHostObject);
134
136
  }
135
137
 
@@ -139,6 +141,12 @@ class BaseAudioContextHostObject : public JsiHostObject {
139
141
  return jsi::Object::createFromHostObject(runtime, analyserHostObject);
140
142
  }
141
143
 
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
+
142
150
  JSI_HOST_FUNCTION(decodeAudioDataSource) {
143
151
  auto sourcePath = args[0].getString(runtime).utf8(runtime);
144
152
 
@@ -164,6 +172,5 @@ class BaseAudioContextHostObject : public JsiHostObject {
164
172
  protected:
165
173
  std::shared_ptr<BaseAudioContext> context_;
166
174
  std::shared_ptr<PromiseVendor> promiseVendor_;
167
- std::shared_ptr<react::CallInvoker> callInvoker_;
168
175
  };
169
176
  } // namespace audioapi
@@ -14,10 +14,8 @@ using namespace facebook;
14
14
 
15
15
  class OscillatorNodeHostObject : public AudioScheduledSourceNodeHostObject {
16
16
  public:
17
- explicit OscillatorNodeHostObject(
18
- const std::shared_ptr<OscillatorNode> &node,
19
- const std::shared_ptr<react::CallInvoker> &callInvoker)
20
- : AudioScheduledSourceNodeHostObject(node, callInvoker) {
17
+ explicit OscillatorNodeHostObject(const std::shared_ptr<OscillatorNode> &node)
18
+ : AudioScheduledSourceNodeHostObject(node) {
21
19
  addGetters(
22
20
  JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, frequency),
23
21
  JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, detune),
@@ -0,0 +1,35 @@
1
+ #pragma once
2
+
3
+ #include <audioapi/HostObjects/AudioNodeHostObject.h>
4
+ #include <audioapi/HostObjects/AudioParamHostObject.h>
5
+ #include <audioapi/core/effects/StretcherNode.h>
6
+
7
+ #include <memory>
8
+ #include <vector>
9
+
10
+ namespace audioapi {
11
+
12
+ using namespace facebook;
13
+
14
+ class StretcherNodeHostObject : public AudioNodeHostObject {
15
+ public:
16
+ explicit StretcherNodeHostObject(const std::shared_ptr<StretcherNode> &node): AudioNodeHostObject(node) {
17
+ addGetters(JSI_EXPORT_PROPERTY_GETTER(StretcherNodeHostObject, rate),
18
+ JSI_EXPORT_PROPERTY_GETTER(StretcherNodeHostObject, semitones));
19
+ }
20
+
21
+ JSI_PROPERTY_GETTER(rate) {
22
+ auto stretcherNode = std::static_pointer_cast<StretcherNode>(node_);
23
+ auto rateParam =
24
+ std::make_shared<AudioParamHostObject>(stretcherNode->getRateParam());
25
+ return jsi::Object::createFromHostObject(runtime, rateParam);
26
+ }
27
+
28
+ JSI_PROPERTY_GETTER(semitones) {
29
+ auto stretcherNode = std::static_pointer_cast<StretcherNode>(node_);
30
+ auto semitonesParam =
31
+ std::make_shared<AudioParamHostObject>(stretcherNode->getSemitonesParam());
32
+ return jsi::Object::createFromHostObject(runtime, semitonesParam);
33
+ }
34
+ };
35
+ } // namespace audioapi
@@ -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>
3
5
  #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 dsp::linearInterpolate(values, k, k + 1, factor);
209
+ return AudioUtils::linearInterpolate(values, k, k + 1, factor);
210
210
  }
211
211
 
212
212
  return endValue;
@@ -4,13 +4,14 @@
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>
7
8
  #include <audioapi/core/sources/AudioBuffer.h>
8
9
  #include <audioapi/core/sources/AudioBufferSourceNode.h>
9
10
  #include <audioapi/core/sources/OscillatorNode.h>
11
+ #include <audioapi/core/utils/AudioArray.h>
12
+ #include <audioapi/core/utils/AudioBus.h>
10
13
  #include <audioapi/core/utils/AudioDecoder.h>
11
14
  #include <audioapi/core/utils/AudioNodeManager.h>
12
- #include <audioapi/utils/AudioArray.h>
13
- #include <audioapi/utils/AudioBus.h>
14
15
 
15
16
  namespace audioapi {
16
17
 
@@ -79,11 +80,12 @@ std::shared_ptr<AudioBuffer> BaseAudioContext::createBuffer(
79
80
  }
80
81
 
81
82
  std::shared_ptr<PeriodicWave> BaseAudioContext::createPeriodicWave(
82
- const std::vector<std::complex<float>> &complexData,
83
+ float *real,
84
+ float *imag,
83
85
  bool disableNormalization,
84
86
  int length) {
85
87
  return std::make_shared<PeriodicWave>(
86
- sampleRate_, complexData, length, disableNormalization);
88
+ sampleRate_, real, imag, length, disableNormalization);
87
89
  }
88
90
 
89
91
  std::shared_ptr<AnalyserNode> BaseAudioContext::createAnalyser() {
@@ -92,6 +94,12 @@ std::shared_ptr<AnalyserNode> BaseAudioContext::createAnalyser() {
92
94
  return analyser;
93
95
  }
94
96
 
97
+ std::shared_ptr<StretcherNode> BaseAudioContext::createStretcher() {
98
+ auto node = std::make_shared<StretcherNode>(this);
99
+ nodeManager_->addNode(node);
100
+ return node;
101
+ }
102
+
95
103
  std::shared_ptr<AudioBuffer> BaseAudioContext::decodeAudioDataSource(
96
104
  const std::string &path) {
97
105
  auto audioBus = audioDecoder_->decodeWithFilePath(path);
@@ -8,7 +8,6 @@
8
8
  #include <string>
9
9
  #include <utility>
10
10
  #include <vector>
11
- #include <complex>
12
11
  #include <cstddef>
13
12
  #include <cassert>
14
13
 
@@ -26,6 +25,7 @@ class AudioDestinationNode;
26
25
  class AudioBufferSourceNode;
27
26
  class AudioDecoder;
28
27
  class AnalyserNode;
28
+ class StretcherNode;
29
29
 
30
30
  class BaseAudioContext {
31
31
  public:
@@ -46,10 +46,12 @@ 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
- const std::vector<std::complex<float>> &complexData,
49
+ float *real,
50
+ float *imag,
50
51
  bool disableNormalization,
51
52
  int length);
52
53
  std::shared_ptr<AnalyserNode> createAnalyser();
54
+ std::shared_ptr<StretcherNode> createStretcher();
53
55
 
54
56
  std::shared_ptr<AudioBuffer> decodeAudioDataSource(const std::string &path);
55
57
 
@@ -6,14 +6,39 @@
6
6
  // https://webaudio.github.io/web-audio-api/
7
7
 
8
8
  namespace audioapi {
9
- // audio
10
- static constexpr int RENDER_QUANTUM_SIZE = 128;
11
- static constexpr size_t MAX_FFT_SIZE = 32768;
9
+ // context
10
+ constexpr int RENDER_QUANTUM_SIZE = 128;
11
+ constexpr int CHANNEL_COUNT = 2;
12
12
 
13
13
  // general
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);
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;
19
44
  } // namespace audioapi