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.
- package/android/src/main/cpp/audioapi/CMakeLists.txt +3 -2
- package/android/src/main/cpp/audioapi/android/core/AudioDecoder.cpp +3 -3
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +13 -12
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +0 -1
- package/{common/cpp/audioapi/libs/pffft → android/src/main/cpp/audioapi/android/libs}/pffft.c +1 -1
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIPackage.kt +1 -0
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +3 -1
- package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +16 -24
- package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +0 -4
- package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +4 -20
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +2 -3
- package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +2 -32
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +21 -14
- package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +2 -4
- package/common/cpp/audioapi/HostObjects/StretcherNodeHostObject.h +35 -0
- 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 +12 -4
- package/common/cpp/audioapi/core/BaseAudioContext.h +4 -2
- package/common/cpp/audioapi/core/Constants.h +33 -8
- package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +45 -42
- package/common/cpp/audioapi/core/analysis/AnalyserNode.h +6 -8
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -1
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +8 -12
- package/common/cpp/audioapi/core/effects/GainNode.cpp +3 -4
- package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +49 -32
- package/common/cpp/audioapi/core/effects/PeriodicWave.h +3 -8
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +3 -3
- package/common/cpp/audioapi/core/effects/StretcherNode.cpp +94 -0
- package/common/cpp/audioapi/core/effects/StretcherNode.h +35 -0
- package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +2 -9
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +2 -5
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +35 -72
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -41
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +6 -18
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +0 -7
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +3 -12
- package/common/cpp/audioapi/core/sources/OscillatorNode.h +0 -1
- package/common/cpp/audioapi/{utils → core/utils}/AudioArray.cpp +5 -5
- package/common/cpp/audioapi/{utils → core/utils}/AudioBus.cpp +29 -29
- package/common/cpp/audioapi/dsp/AudioUtils.cpp +2 -2
- package/common/cpp/audioapi/dsp/AudioUtils.h +2 -2
- package/common/cpp/audioapi/dsp/FFTFrame.cpp +100 -0
- package/common/cpp/audioapi/dsp/FFTFrame.h +74 -0
- package/common/cpp/audioapi/dsp/VectorMath.cpp +3 -3
- package/common/cpp/audioapi/dsp/VectorMath.h +2 -2
- package/common/cpp/audioapi/libs/dsp/common.h +47 -0
- package/common/cpp/audioapi/libs/{signalsmith-stretch → dsp}/delay.h +11 -9
- package/common/cpp/audioapi/libs/{signalsmith-stretch → dsp}/fft.h +7 -6
- package/common/cpp/audioapi/libs/{signalsmith-stretch → dsp}/perf.h +2 -0
- package/common/cpp/audioapi/libs/{signalsmith-stretch → dsp}/spectral.h +13 -10
- package/common/cpp/audioapi/libs/dsp/windows.h +219 -0
- package/common/cpp/audioapi/libs/{signalsmith-stretch/signalsmith-stretch.h → signalsmith-stretch.h} +4 -3
- package/ios/audioapi/ios/core/AudioDecoder.mm +3 -3
- package/ios/audioapi/ios/core/AudioPlayer.h +2 -5
- package/ios/audioapi/ios/core/AudioPlayer.m +5 -9
- package/ios/audioapi/ios/core/IOSAudioPlayer.h +0 -1
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +10 -12
- package/lib/module/api.js +2 -1
- 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 +0 -6
- package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/core/AudioScheduledSourceNode.js +0 -5
- package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +4 -0
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/StretcherNode.js +12 -0
- package/lib/module/core/StretcherNode.js.map +1 -0
- package/lib/module/web-core/AudioBufferSourceNode.js +0 -6
- package/lib/module/web-core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/web-core/AudioScheduledSourceNode.js +0 -8
- package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/typescript/api.d.ts +2 -1
- 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 +0 -3
- package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts +0 -1
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +2 -0
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/StretcherNode.d.ts +10 -0
- package/lib/typescript/core/StretcherNode.d.ts.map +1 -0
- package/lib/typescript/interfaces.d.ts +6 -3
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +0 -1
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioBufferSourceNode.d.ts +0 -3
- package/lib/typescript/web-core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +0 -1
- package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/api.ts +1 -1
- package/src/api.web.ts +0 -1
- package/src/core/AudioBufferSourceNode.ts +0 -9
- package/src/core/AudioScheduledSourceNode.ts +0 -5
- package/src/core/BaseAudioContext.ts +5 -0
- package/src/core/StretcherNode.ts +15 -0
- package/src/interfaces.ts +6 -3
- package/src/types.ts +0 -2
- package/src/web-core/AudioBufferSourceNode.tsx +0 -11
- package/src/web-core/AudioScheduledSourceNode.tsx +0 -9
- package/common/cpp/audioapi/core/types/TimeStretchType.h +0 -7
- package/common/cpp/audioapi/dsp/FFT.cpp +0 -41
- package/common/cpp/audioapi/dsp/FFT.h +0 -29
- package/common/cpp/audioapi/dsp/Windows.cpp +0 -80
- package/common/cpp/audioapi/dsp/Windows.h +0 -95
- /package/{common/cpp/audioapi/libs/pffft → android/src/main/cpp/audioapi/android/libs}/pffft.h +0 -0
- /package/common/cpp/audioapi/{utils → core/utils}/AudioArray.h +0 -0
- /package/common/cpp/audioapi/{utils → core/utils}/AudioBus.h +0 -0
- /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
|
|
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
|
|
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)
|
|
11
|
+
: renderAudio_(renderAudio) {
|
|
12
12
|
AudioStreamBuilder builder;
|
|
13
13
|
|
|
14
14
|
builder.setSharingMode(SharingMode::Exclusive)
|
|
15
|
-
->setFormat(AudioFormat::
|
|
15
|
+
->setFormat(AudioFormat::None)
|
|
16
16
|
->setFormatConversionAllowed(true)
|
|
17
17
|
->setPerformanceMode(PerformanceMode::LowLatency)
|
|
18
|
-
->setChannelCount(
|
|
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,
|
|
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)
|
|
32
|
+
: renderAudio_(renderAudio) {
|
|
33
33
|
AudioStreamBuilder builder;
|
|
34
34
|
|
|
35
35
|
builder.setSharingMode(SharingMode::Exclusive)
|
|
36
|
-
->setFormat(AudioFormat::
|
|
36
|
+
->setFormat(AudioFormat::None)
|
|
37
37
|
->setFormatConversionAllowed(true)
|
|
38
38
|
->setPerformanceMode(PerformanceMode::LowLatency)
|
|
39
|
-
->setChannelCount(
|
|
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>(
|
|
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 <
|
|
103
|
-
buffer[(processedFrames + i) *
|
|
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,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,
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
80
|
+
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
81
|
+
analyserNode->getFloatFrequencyData(data, length);
|
|
86
82
|
|
|
87
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
95
|
+
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
96
|
+
analyserNode->getByteFrequencyData(data, length);
|
|
103
97
|
|
|
104
|
-
|
|
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
|
-
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
83
|
+
float *real,
|
|
84
|
+
float *imag,
|
|
83
85
|
bool disableNormalization,
|
|
84
86
|
int length) {
|
|
85
87
|
return std::make_shared<PeriodicWave>(
|
|
86
|
-
sampleRate_,
|
|
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
|
-
|
|
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
|
-
//
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
// context
|
|
10
|
+
constexpr int RENDER_QUANTUM_SIZE = 128;
|
|
11
|
+
constexpr int CHANNEL_COUNT = 2;
|
|
12
12
|
|
|
13
13
|
// general
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|