react-native-audio-api 0.4.12-beta.5 → 0.4.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/cpp/audioapi/CMakeLists.txt +2 -3
- package/android/src/main/cpp/audioapi/android/core/AudioDecoder.cpp +3 -3
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +10 -11
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +1 -0
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIPackage.kt +0 -1
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +1 -3
- package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +24 -16
- package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +4 -0
- package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +20 -4
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +3 -2
- package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +32 -2
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +14 -21
- package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +4 -2
- package/common/cpp/audioapi/core/AudioNode.cpp +2 -2
- package/common/cpp/audioapi/core/AudioParam.cpp +1 -1
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +4 -12
- package/common/cpp/audioapi/core/BaseAudioContext.h +2 -4
- package/common/cpp/audioapi/core/Constants.h +8 -33
- package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +42 -45
- package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -1
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +12 -8
- package/common/cpp/audioapi/core/effects/GainNode.cpp +4 -3
- package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +32 -49
- package/common/cpp/audioapi/core/effects/PeriodicWave.h +8 -3
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +3 -3
- package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +9 -2
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +5 -2
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +72 -35
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +41 -8
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +18 -6
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +7 -0
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -3
- package/common/cpp/audioapi/core/sources/OscillatorNode.h +1 -0
- package/common/cpp/audioapi/core/types/TimeStretchType.h +7 -0
- package/common/cpp/audioapi/dsp/AudioUtils.cpp +2 -2
- package/common/cpp/audioapi/dsp/AudioUtils.h +2 -2
- package/common/cpp/audioapi/dsp/FFT.cpp +41 -0
- package/common/cpp/audioapi/dsp/FFT.h +29 -0
- package/common/cpp/audioapi/dsp/VectorMath.cpp +3 -3
- package/common/cpp/audioapi/dsp/VectorMath.h +2 -2
- package/common/cpp/audioapi/dsp/Windows.cpp +80 -0
- package/common/cpp/audioapi/dsp/Windows.h +95 -0
- package/{android/src/main/cpp/audioapi/android/libs → common/cpp/audioapi/libs/pffft}/pffft.c +1 -1
- package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/delay.h +9 -11
- package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/fft.h +6 -7
- package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/perf.h +0 -2
- package/common/cpp/audioapi/libs/{signalsmith-stretch.h → signalsmith-stretch/signalsmith-stretch.h} +3 -4
- package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/spectral.h +10 -13
- package/common/cpp/audioapi/{core/utils → utils}/AudioArray.cpp +5 -5
- package/common/cpp/audioapi/{core/utils → utils}/AudioBus.cpp +29 -29
- package/ios/audioapi/ios/core/AudioDecoder.mm +3 -3
- package/ios/audioapi/ios/core/AudioPlayer.h +5 -2
- package/ios/audioapi/ios/core/AudioPlayer.m +9 -5
- package/ios/audioapi/ios/core/IOSAudioPlayer.h +1 -0
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +12 -10
- package/lib/module/api.js +1 -2
- package/lib/module/api.js.map +1 -1
- package/lib/module/api.web.js +1 -1
- package/lib/module/api.web.js.map +1 -1
- package/lib/module/core/AudioBufferSourceNode.js +6 -0
- package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/core/AudioScheduledSourceNode.js +5 -0
- package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +0 -4
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/web-core/AudioBufferSourceNode.js +6 -0
- package/lib/module/web-core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/web-core/AudioScheduledSourceNode.js +8 -0
- package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/web-core/StretcherNode.js +24 -7
- package/lib/module/web-core/StretcherNode.js.map +1 -1
- package/lib/module/web-core/custom/signalsmithStretch/README.md +1 -1
- package/lib/module/web-core/custom/signalsmithStretch/SignalsmithStretch.js +1 -0
- package/lib/module/web-core/custom/signalsmithStretch/SignalsmithStretch.js.map +1 -1
- package/lib/typescript/api.d.ts +1 -2
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/api.web.d.ts +1 -1
- package/lib/typescript/api.web.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferSourceNode.d.ts +3 -0
- package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts +1 -0
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +0 -2
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +3 -6
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +1 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioBufferSourceNode.d.ts +3 -0
- package/lib/typescript/web-core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +1 -0
- package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts.map +1 -1
- package/lib/typescript/web-core/StretcherNode.d.ts +3 -0
- package/lib/typescript/web-core/StretcherNode.d.ts.map +1 -1
- package/package.json +3 -4
- package/scripts/setup-rn-audio-api-web.js +58 -0
- package/src/api.ts +1 -1
- package/src/api.web.ts +1 -0
- package/src/core/AudioBufferSourceNode.ts +9 -0
- package/src/core/AudioScheduledSourceNode.ts +5 -0
- package/src/core/BaseAudioContext.ts +0 -5
- package/src/interfaces.ts +3 -6
- package/src/types.ts +2 -0
- package/src/web-core/AudioBufferSourceNode.tsx +11 -0
- package/src/web-core/AudioScheduledSourceNode.tsx +9 -0
- package/src/web-core/StretcherNode.tsx +28 -8
- package/src/web-core/custom/signalsmithStretch/README.md +1 -1
- package/src/web-core/custom/signalsmithStretch/SignalsmithStretch.js +1 -0
- package/common/cpp/audioapi/HostObjects/StretcherNodeHostObject.h +0 -35
- package/common/cpp/audioapi/core/effects/StretcherNode.cpp +0 -94
- package/common/cpp/audioapi/core/effects/StretcherNode.h +0 -35
- package/common/cpp/audioapi/dsp/FFTFrame.cpp +0 -100
- package/common/cpp/audioapi/dsp/FFTFrame.h +0 -74
- package/common/cpp/audioapi/libs/dsp/common.h +0 -47
- package/common/cpp/audioapi/libs/dsp/windows.h +0 -219
- package/lib/module/core/StretcherNode.js +0 -12
- package/lib/module/core/StretcherNode.js.map +0 -1
- package/lib/typescript/core/StretcherNode.d.ts +0 -10
- package/lib/typescript/core/StretcherNode.d.ts.map +0 -1
- package/scripts/setup-custom-wasm.js +0 -104
- package/src/core/StretcherNode.ts +0 -15
- /package/common/cpp/audioapi/libs/{miniaudio.h → miniaudio/miniaudio.h} +0 -0
- /package/{android/src/main/cpp/audioapi/android/libs → common/cpp/audioapi/libs/pffft}/pffft.h +0 -0
- /package/common/cpp/audioapi/{core/utils → utils}/AudioArray.h +0 -0
- /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
|
|
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} ${
|
|
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/
|
|
5
|
-
#include <audioapi/
|
|
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(
|
|
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,
|
|
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(
|
|
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 <
|
|
104
|
-
buffer[(processedFrames + i) *
|
|
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,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,
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
81
|
-
|
|
80
|
+
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
81
|
+
analyserNode->getFloatFrequencyData(data, length);
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
96
|
-
|
|
100
|
+
for (int i = 0; i < length; i++) {
|
|
101
|
+
destination.setValueAtIndex(runtime, i, jsi::Value(data[i]));
|
|
102
|
+
}
|
|
97
103
|
|
|
98
|
-
|
|
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
|
-
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31
|
-
|
|
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
|
|
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
|
-
|
|
124
|
-
|
|
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
|
-
|
|
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(
|
|
18
|
-
|
|
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
|
|
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
|
|
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_,
|
|
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
|
|
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
|
-
//
|
|
10
|
-
constexpr int RENDER_QUANTUM_SIZE = 128;
|
|
11
|
-
constexpr
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|