react-native-audio-api 0.3.0-rc1 → 0.3.1
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/CMakeLists.txt +4 -4
- package/android/build.gradle +1 -3
- package/android/libs/include/miniaudio.h +92621 -0
- package/android/src/main/cpp/AudioAPIInstaller/AudioAPIInstaller.cpp +10 -12
- package/android/src/main/cpp/AudioAPIInstaller/AudioAPIInstaller.h +16 -9
- package/android/src/main/cpp/AudioDecoder/AudioDecoder.cpp +64 -0
- package/android/src/main/cpp/AudioDecoder/AudioDecoder.h +21 -0
- package/android/src/main/cpp/AudioPlayer/AudioPlayer.h +2 -2
- package/android/src/main/java/com/swmansion/audioapi/module/AudioAPIInstaller.kt +14 -4
- package/android/src/main/java/com/swmansion/audioapi/nativemodules/AudioAPIModule.kt +2 -3
- package/common/cpp/AudioAPIInstaller/AudioAPIInstallerHostObject.h +26 -27
- package/common/cpp/HostObjects/AudioBufferHostObject.h +79 -13
- package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.h +93 -14
- package/common/cpp/HostObjects/AudioContextHostObject.h +10 -19
- package/common/cpp/HostObjects/AudioDestinationNodeHostObject.h +3 -16
- package/common/cpp/HostObjects/AudioNodeHostObject.h +48 -11
- package/common/cpp/HostObjects/AudioParamHostObject.h +56 -14
- package/common/cpp/HostObjects/AudioScheduledSourceNodeHostObject.h +23 -16
- package/common/cpp/HostObjects/BaseAudioContextHostObject.h +131 -13
- package/common/cpp/HostObjects/BiquadFilterNodeHostObject.h +76 -18
- package/common/cpp/HostObjects/Constants.h +2 -0
- package/common/cpp/HostObjects/GainNodeHostObject.h +10 -15
- package/common/cpp/HostObjects/OscillatorNodeHostObject.h +40 -17
- package/common/cpp/HostObjects/PeriodicWaveHostObject.h +4 -17
- package/common/cpp/HostObjects/StereoPannerNodeHostObject.h +10 -17
- package/common/cpp/core/AudioBufferSourceNode.cpp +180 -73
- package/common/cpp/core/AudioBufferSourceNode.h +41 -1
- package/common/cpp/core/AudioDestinationNode.cpp +1 -0
- package/common/cpp/core/AudioDestinationNode.h +1 -1
- package/common/cpp/core/AudioScheduledSourceNode.cpp +86 -21
- package/common/cpp/core/AudioScheduledSourceNode.h +12 -4
- package/common/cpp/core/BaseAudioContext.cpp +8 -5
- package/common/cpp/core/BaseAudioContext.h +5 -3
- package/common/cpp/core/OscillatorNode.cpp +7 -2
- package/common/cpp/jsi/JsiHostObject.cpp +85 -0
- package/common/cpp/jsi/JsiHostObject.h +94 -0
- package/common/cpp/jsi/JsiPromise.cpp +65 -0
- package/common/cpp/jsi/JsiPromise.h +48 -0
- package/common/cpp/utils/AudioUtils.cpp +26 -0
- package/common/cpp/utils/AudioUtils.h +16 -0
- package/ios/AudioAPIModule.mm +3 -6
- package/ios/AudioDecoder/AudioDecoder.h +1 -1
- package/ios/AudioDecoder/AudioDecoder.m +14 -102
- package/ios/AudioDecoder/IOSAudioDecoder.h +2 -0
- package/ios/AudioDecoder/IOSAudioDecoder.mm +7 -1
- package/ios/AudioPlayer/AudioPlayer.m +3 -1
- package/lib/module/core/AudioBufferSourceNode.js +15 -0
- package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +2 -3
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/index.js +18 -3
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/core/AudioBufferSourceNode.d.ts +7 -0
- package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +2 -2
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/types.d.ts +0 -6
- package/lib/typescript/core/types.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +8 -4
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +5 -1
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/AudioBufferSourceNode.ts +23 -0
- package/src/core/BaseAudioContext.ts +3 -8
- package/src/core/types.ts +0 -7
- package/src/index.ts +26 -12
- package/src/interfaces.ts +6 -1
- package/android/libs/fftw3/x86/libfftw3.a +0 -0
- package/android/libs/fftw3/x86_64/libfftw3.a +0 -0
- package/common/cpp/AudioAPIInstaller/AudioAPIInstallerHostObject.cpp +0 -54
- package/common/cpp/AudioAPIInstaller/AudioAPIInstallerWrapper.h +0 -38
- package/common/cpp/AudioAPIInstaller/android/AudioAPIInstallerWrapper.cpp +0 -16
- package/common/cpp/AudioAPIInstaller/ios/AudioAPIInstallerWrapper.cpp +0 -12
- package/common/cpp/HostObjects/AudioBufferHostObject.cpp +0 -149
- package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.cpp +0 -79
- package/common/cpp/HostObjects/AudioContextHostObject.cpp +0 -54
- package/common/cpp/HostObjects/AudioDestinationNodeHostObject.cpp +0 -33
- package/common/cpp/HostObjects/AudioNodeHostObject.cpp +0 -102
- package/common/cpp/HostObjects/AudioParamHostObject.cpp +0 -115
- package/common/cpp/HostObjects/AudioScheduledSourceNodeHostObject.cpp +0 -73
- package/common/cpp/HostObjects/BaseAudioContextHostObject.cpp +0 -240
- package/common/cpp/HostObjects/BiquadFilterNodeHostObject.cpp +0 -125
- package/common/cpp/HostObjects/GainNodeHostObject.cpp +0 -41
- package/common/cpp/HostObjects/OscillatorNodeHostObject.cpp +0 -88
- package/common/cpp/HostObjects/PeriodicWaveHostObject.cpp +0 -33
- package/common/cpp/HostObjects/StereoPannerNodeHostObject.cpp +0 -41
- package/common/cpp/utils/JsiPromise.cpp +0 -59
- package/common/cpp/utils/JsiPromise.h +0 -42
- package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.cpp +0 -45
- package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.h +0 -26
- package/common/cpp/wrappers/AudioBufferWrapper.cpp +0 -46
- package/common/cpp/wrappers/AudioBufferWrapper.h +0 -30
- package/common/cpp/wrappers/AudioContextWrapper.cpp +0 -17
- package/common/cpp/wrappers/AudioContextWrapper.h +0 -19
- package/common/cpp/wrappers/AudioDestinationNodeWrapper.h +0 -16
- package/common/cpp/wrappers/AudioNodeWrapper.cpp +0 -37
- package/common/cpp/wrappers/AudioNodeWrapper.h +0 -25
- package/common/cpp/wrappers/AudioParamWrapper.cpp +0 -42
- package/common/cpp/wrappers/AudioParamWrapper.h +0 -25
- package/common/cpp/wrappers/AudioScheduledSourceNodeWrapper.cpp +0 -23
- package/common/cpp/wrappers/AudioScheduledSourceNodeWrapper.h +0 -23
- package/common/cpp/wrappers/BaseAudioContextWrapper.cpp +0 -83
- package/common/cpp/wrappers/BaseAudioContextWrapper.h +0 -50
- package/common/cpp/wrappers/BiquadFilterNodeWrapper.cpp +0 -60
- package/common/cpp/wrappers/BiquadFilterNodeWrapper.h +0 -37
- package/common/cpp/wrappers/GainNodeWrapper.cpp +0 -14
- package/common/cpp/wrappers/GainNodeWrapper.h +0 -20
- package/common/cpp/wrappers/OscillatorNodeWrapper.cpp +0 -44
- package/common/cpp/wrappers/OscillatorNodeWrapper.h +0 -31
- package/common/cpp/wrappers/PeriodicWaveWrapper.h +0 -17
- package/common/cpp/wrappers/StereoPannerNodeWrapper.cpp +0 -16
- package/common/cpp/wrappers/StereoPannerNodeWrapper.h +0 -21
- package/lib/module/utils/resolveAudioSource.js +0 -10
- package/lib/module/utils/resolveAudioSource.js.map +0 -1
- package/lib/typescript/utils/resolveAudioSource.d.ts +0 -3
- package/lib/typescript/utils/resolveAudioSource.d.ts.map +0 -1
- package/src/utils/resolveAudioSource.ts +0 -14
- /package/android/libs/{fftw3/arm64-v8a → arm64-v8a}/libfftw3.a +0 -0
- /package/android/libs/{fftw3/armeabi-v7a → armeabi-v7a}/libfftw3.a +0 -0
- /package/android/libs/include/{fftw3/fftw3.h → fftw3.h} +0 -0
|
@@ -5,18 +5,16 @@ namespace audioapi {
|
|
|
5
5
|
using namespace facebook::jni;
|
|
6
6
|
|
|
7
7
|
AudioAPIInstaller::AudioAPIInstaller(
|
|
8
|
-
jni::alias_ref<AudioAPIInstaller::jhybridobject> &jThis
|
|
9
|
-
|
|
8
|
+
jni::alias_ref<AudioAPIInstaller::jhybridobject> &jThis,
|
|
9
|
+
jsi::Runtime *rnRuntime,
|
|
10
|
+
const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker)
|
|
11
|
+
: javaPart_(make_global(jThis)),
|
|
12
|
+
rnRuntime_(rnRuntime),
|
|
13
|
+
jsCallInvoker_(jsCallInvoker) {}
|
|
10
14
|
|
|
11
|
-
void AudioAPIInstaller::install(
|
|
12
|
-
auto
|
|
13
|
-
std::make_shared<
|
|
14
|
-
|
|
15
|
-
audioAPIInstallerWrapper, jsContext);
|
|
15
|
+
void AudioAPIInstaller::install() {
|
|
16
|
+
auto hostObject =
|
|
17
|
+
std::make_shared<AudioAPIInstallerHostObject>(rnRuntime_, jsCallInvoker_);
|
|
18
|
+
hostObject->install();
|
|
16
19
|
}
|
|
17
|
-
|
|
18
|
-
std::shared_ptr<AudioContext> AudioAPIInstaller::createAudioContext() {
|
|
19
|
-
return std::make_shared<AudioContext>();
|
|
20
|
-
}
|
|
21
|
-
|
|
22
20
|
} // namespace audioapi
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
+
#include <ReactCommon/CallInvokerHolder.h>
|
|
3
4
|
#include <fbjni/fbjni.h>
|
|
4
|
-
#include <jsi/jsi.h>
|
|
5
5
|
#include <react/jni/CxxModuleWrapper.h>
|
|
6
6
|
#include <react/jni/JMessageQueueThread.h>
|
|
7
7
|
#include <memory>
|
|
8
8
|
#include <utility>
|
|
9
9
|
|
|
10
10
|
#include "AudioAPIInstallerHostObject.h"
|
|
11
|
-
#include "AudioAPIInstallerWrapper.h"
|
|
12
11
|
#include "AudioContext.h"
|
|
13
12
|
|
|
14
13
|
namespace audioapi {
|
|
15
14
|
|
|
16
15
|
using namespace facebook;
|
|
17
|
-
using namespace
|
|
16
|
+
using namespace react;
|
|
18
17
|
|
|
19
18
|
class AudioAPIInstaller : public jni::HybridClass<AudioAPIInstaller> {
|
|
20
19
|
public:
|
|
@@ -22,8 +21,13 @@ class AudioAPIInstaller : public jni::HybridClass<AudioAPIInstaller> {
|
|
|
22
21
|
"Lcom/swmansion/audioapi/module/AudioAPIInstaller;";
|
|
23
22
|
|
|
24
23
|
static jni::local_ref<AudioAPIInstaller::jhybriddata> initHybrid(
|
|
25
|
-
jni::alias_ref<jhybridobject> jThis
|
|
26
|
-
|
|
24
|
+
jni::alias_ref<jhybridobject> jThis,
|
|
25
|
+
jlong jsContext,
|
|
26
|
+
jni::alias_ref<facebook::react::CallInvokerHolder::javaobject>
|
|
27
|
+
jsCallInvokerHolder) {
|
|
28
|
+
auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
|
|
29
|
+
auto rnRuntime = reinterpret_cast<jsi::Runtime *>(jsContext);
|
|
30
|
+
return makeCxxInstance(jThis, rnRuntime, jsCallInvoker);
|
|
27
31
|
}
|
|
28
32
|
|
|
29
33
|
static void registerNatives() {
|
|
@@ -33,16 +37,19 @@ class AudioAPIInstaller : public jni::HybridClass<AudioAPIInstaller> {
|
|
|
33
37
|
});
|
|
34
38
|
}
|
|
35
39
|
|
|
36
|
-
|
|
37
|
-
void install(jlong jsContext);
|
|
40
|
+
void install();
|
|
38
41
|
|
|
39
42
|
private:
|
|
40
43
|
friend HybridBase;
|
|
41
44
|
|
|
42
|
-
global_ref<AudioAPIInstaller::javaobject> javaPart_;
|
|
45
|
+
jni::global_ref<AudioAPIInstaller::javaobject> javaPart_;
|
|
46
|
+
jsi::Runtime *rnRuntime_;
|
|
47
|
+
std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker_;
|
|
43
48
|
|
|
44
49
|
explicit AudioAPIInstaller(
|
|
45
|
-
jni::alias_ref<AudioAPIInstaller::jhybridobject> &jThis
|
|
50
|
+
jni::alias_ref<AudioAPIInstaller::jhybridobject> &jThis,
|
|
51
|
+
jsi::Runtime *rnRuntime,
|
|
52
|
+
const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker);
|
|
46
53
|
};
|
|
47
54
|
|
|
48
55
|
} // namespace audioapi
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#include "AudioDecoder.h"
|
|
2
|
+
|
|
3
|
+
#define MINIAUDIO_IMPLEMENTATION
|
|
4
|
+
#include <android/log.h>
|
|
5
|
+
#include <miniaudio.h>
|
|
6
|
+
|
|
7
|
+
#include "AudioArray.h"
|
|
8
|
+
#include "AudioBus.h"
|
|
9
|
+
|
|
10
|
+
namespace audioapi {
|
|
11
|
+
|
|
12
|
+
AudioDecoder::AudioDecoder(int sampleRate) : sampleRate_(sampleRate) {}
|
|
13
|
+
|
|
14
|
+
AudioBus *AudioDecoder::decodeWithFilePath(const std::string &path) const {
|
|
15
|
+
ma_decoder decoder;
|
|
16
|
+
ma_decoder_config config =
|
|
17
|
+
ma_decoder_config_init(ma_format_f32, 2, sampleRate_);
|
|
18
|
+
ma_result result = ma_decoder_init_file(path.c_str(), &config, &decoder);
|
|
19
|
+
if (result != MA_SUCCESS) {
|
|
20
|
+
__android_log_print(
|
|
21
|
+
ANDROID_LOG_ERROR,
|
|
22
|
+
"AudioDecoder",
|
|
23
|
+
"Failed to initialize decoder for file: %s",
|
|
24
|
+
path.c_str());
|
|
25
|
+
return new AudioBus(1, 1, 1);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
ma_uint64 totalFrameCount;
|
|
29
|
+
ma_decoder_get_length_in_pcm_frames(&decoder, &totalFrameCount);
|
|
30
|
+
|
|
31
|
+
auto *audioBus =
|
|
32
|
+
new AudioBus(sampleRate_, static_cast<int>(totalFrameCount), 2);
|
|
33
|
+
auto *buffer = new float[totalFrameCount * 2];
|
|
34
|
+
|
|
35
|
+
ma_uint64 framesDecoded;
|
|
36
|
+
ma_decoder_read_pcm_frames(&decoder, buffer, totalFrameCount, &framesDecoded);
|
|
37
|
+
if (framesDecoded == 0) {
|
|
38
|
+
__android_log_print(
|
|
39
|
+
ANDROID_LOG_ERROR,
|
|
40
|
+
"AudioDecoder",
|
|
41
|
+
"Failed to decode audio file: %s",
|
|
42
|
+
path.c_str());
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
for (int i = 0; i < decoder.outputChannels; ++i) {
|
|
46
|
+
float *channelData = audioBus->getChannel(i)->getData();
|
|
47
|
+
|
|
48
|
+
for (ma_uint64 j = 0; j < framesDecoded; ++j) {
|
|
49
|
+
channelData[j] = buffer[j * decoder.outputChannels + i];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
delete[] buffer;
|
|
54
|
+
ma_decoder_uninit(&decoder);
|
|
55
|
+
|
|
56
|
+
return audioBus;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
AudioBus *AudioDecoder::decodeWithArrayBuffer() const {
|
|
60
|
+
// TODO: implement this
|
|
61
|
+
return new AudioBus(1, 1, 1);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <string>
|
|
4
|
+
|
|
5
|
+
namespace audioapi {
|
|
6
|
+
|
|
7
|
+
class AudioBus;
|
|
8
|
+
|
|
9
|
+
class AudioDecoder {
|
|
10
|
+
public:
|
|
11
|
+
explicit AudioDecoder(int sampleRate);
|
|
12
|
+
|
|
13
|
+
[[nodiscard]] AudioBus *decodeWithFilePath(const std::string &path) const;
|
|
14
|
+
// TODO: implement this
|
|
15
|
+
[[nodiscard]] AudioBus *decodeWithArrayBuffer() const;
|
|
16
|
+
|
|
17
|
+
private:
|
|
18
|
+
int sampleRate_;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
} // namespace audioapi
|
|
@@ -14,8 +14,8 @@ class AudioPlayer : public AudioStreamDataCallback {
|
|
|
14
14
|
public:
|
|
15
15
|
explicit AudioPlayer(const std::function<void(AudioBus *, int)> &renderAudio);
|
|
16
16
|
|
|
17
|
-
int getSampleRate() const;
|
|
18
|
-
int getBufferSizeInFrames() const;
|
|
17
|
+
[[nodiscard]] int getSampleRate() const;
|
|
18
|
+
[[nodiscard]] int getBufferSizeInFrames() const;
|
|
19
19
|
void start();
|
|
20
20
|
void stop();
|
|
21
21
|
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
package com.swmansion.audioapi.module
|
|
2
2
|
|
|
3
3
|
import com.facebook.jni.HybridData
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
+
import com.facebook.react.common.annotations.FrameworkAPI
|
|
6
|
+
import com.facebook.react.turbomodule.core.CallInvokerHolderImpl
|
|
4
7
|
|
|
5
|
-
class
|
|
8
|
+
@OptIn(FrameworkAPI::class)
|
|
9
|
+
class AudioAPIInstaller(
|
|
10
|
+
reactContext: ReactApplicationContext,
|
|
11
|
+
) {
|
|
6
12
|
private val mHybridData: HybridData?
|
|
7
13
|
|
|
8
14
|
companion object {
|
|
@@ -12,10 +18,14 @@ class AudioAPIInstaller {
|
|
|
12
18
|
}
|
|
13
19
|
|
|
14
20
|
init {
|
|
15
|
-
|
|
21
|
+
val jsCallInvokerHolder = reactContext.jsCallInvokerHolder as CallInvokerHolderImpl
|
|
22
|
+
mHybridData = initHybrid(reactContext.javaScriptContextHolder!!.get(), jsCallInvokerHolder)
|
|
16
23
|
}
|
|
17
24
|
|
|
18
|
-
external fun initHybrid(
|
|
25
|
+
external fun initHybrid(
|
|
26
|
+
jsContext: Long,
|
|
27
|
+
callInvoker: CallInvokerHolderImpl,
|
|
28
|
+
): HybridData?
|
|
19
29
|
|
|
20
|
-
external fun install(
|
|
30
|
+
external fun install()
|
|
21
31
|
}
|
|
@@ -12,9 +12,8 @@ class AudioAPIModule(
|
|
|
12
12
|
|
|
13
13
|
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
14
14
|
fun install(): Boolean {
|
|
15
|
-
val audioAPIInstaller = AudioAPIInstaller()
|
|
16
|
-
|
|
17
|
-
audioAPIInstaller.install(jsContext)
|
|
15
|
+
val audioAPIInstaller = AudioAPIInstaller(reactContext)
|
|
16
|
+
audioAPIInstaller.install()
|
|
18
17
|
|
|
19
18
|
return true
|
|
20
19
|
}
|
|
@@ -6,44 +6,43 @@
|
|
|
6
6
|
#include <utility>
|
|
7
7
|
#include <vector>
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
#include
|
|
9
|
+
#include <JsiHostObject.h>
|
|
10
|
+
#include <JsiPromise.h>
|
|
11
11
|
#include "AudioContextHostObject.h"
|
|
12
|
-
#include "JsiPromise.h"
|
|
13
12
|
|
|
14
13
|
namespace audioapi {
|
|
15
14
|
using namespace facebook;
|
|
16
15
|
|
|
17
|
-
class
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
class AudioAPIInstallerHostObject
|
|
17
|
+
: public JsiHostObject,
|
|
18
|
+
public std::enable_shared_from_this<AudioAPIInstallerHostObject> {
|
|
20
19
|
public:
|
|
21
20
|
explicit AudioAPIInstallerHostObject(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const std::shared_ptr<AudioAPIInstallerWrapper> &wrapper,
|
|
27
|
-
jlong jsContext) {
|
|
28
|
-
auto runtime = reinterpret_cast<jsi::Runtime *>(jsContext);
|
|
29
|
-
auto hostObject = std::make_shared<AudioAPIInstallerHostObject>(wrapper);
|
|
30
|
-
auto object = jsi::Object::createFromHostObject(*runtime, hostObject);
|
|
31
|
-
runtime->global().setProperty(
|
|
32
|
-
*runtime, "__AudioAPIInstaller", std::move(object));
|
|
33
|
-
}
|
|
34
|
-
#endif
|
|
21
|
+
jsi::Runtime *runtime,
|
|
22
|
+
const std::shared_ptr<react::CallInvoker> &jsInvoker)
|
|
23
|
+
: rnRuntime_(runtime) {
|
|
24
|
+
promiseVendor_ = std::make_shared<PromiseVendor>(runtime, jsInvoker);
|
|
35
25
|
|
|
36
|
-
|
|
26
|
+
addFunctions(
|
|
27
|
+
JSI_EXPORT_FUNCTION(AudioAPIInstallerHostObject, createAudioContext));
|
|
28
|
+
}
|
|
37
29
|
|
|
38
|
-
void
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
30
|
+
void install() {
|
|
31
|
+
auto object =
|
|
32
|
+
jsi::Object::createFromHostObject(*rnRuntime_, shared_from_this());
|
|
33
|
+
rnRuntime_->global().setProperty(
|
|
34
|
+
*rnRuntime_, "__AudioAPIInstaller", std::move(object));
|
|
35
|
+
}
|
|
42
36
|
|
|
43
|
-
|
|
37
|
+
JSI_HOST_FUNCTION(createAudioContext) {
|
|
38
|
+
auto audioContext = std::make_shared<AudioContext>();
|
|
39
|
+
auto audioContextHostObject =
|
|
40
|
+
std::make_shared<AudioContextHostObject>(audioContext, promiseVendor_);
|
|
41
|
+
return jsi::Object::createFromHostObject(runtime, audioContextHostObject);
|
|
42
|
+
}
|
|
44
43
|
|
|
45
44
|
private:
|
|
46
|
-
std::shared_ptr<
|
|
47
|
-
|
|
45
|
+
std::shared_ptr<PromiseVendor> promiseVendor_;
|
|
46
|
+
jsi::Runtime *rnRuntime_;
|
|
48
47
|
};
|
|
49
48
|
} // namespace audioapi
|
|
@@ -4,30 +4,96 @@
|
|
|
4
4
|
#include <memory>
|
|
5
5
|
#include <vector>
|
|
6
6
|
|
|
7
|
-
#include
|
|
7
|
+
#include <JsiHostObject.h>
|
|
8
|
+
#include "AudioBuffer.h"
|
|
8
9
|
|
|
9
10
|
namespace audioapi {
|
|
10
11
|
using namespace facebook;
|
|
11
12
|
|
|
12
|
-
class AudioBufferHostObject : public
|
|
13
|
+
class AudioBufferHostObject : public JsiHostObject {
|
|
13
14
|
public:
|
|
14
|
-
std::shared_ptr<
|
|
15
|
+
std::shared_ptr<AudioBuffer> audioBuffer_;
|
|
15
16
|
|
|
16
17
|
explicit AudioBufferHostObject(
|
|
17
|
-
const std::shared_ptr<
|
|
18
|
+
const std::shared_ptr<AudioBuffer> &audioBuffer)
|
|
19
|
+
: audioBuffer_(audioBuffer) {
|
|
20
|
+
addGetters(
|
|
21
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, sampleRate),
|
|
22
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, length),
|
|
23
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, duration),
|
|
24
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, numberOfChannels));
|
|
18
25
|
|
|
19
|
-
|
|
26
|
+
addFunctions(
|
|
27
|
+
JSI_EXPORT_FUNCTION(AudioBufferHostObject, getChannelData),
|
|
28
|
+
JSI_EXPORT_FUNCTION(AudioBufferHostObject, copyFromChannel),
|
|
29
|
+
JSI_EXPORT_FUNCTION(AudioBufferHostObject, copyToChannel));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
JSI_PROPERTY_GETTER(sampleRate) {
|
|
33
|
+
return {audioBuffer_->getSampleRate()};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
JSI_PROPERTY_GETTER(length) {
|
|
37
|
+
return {audioBuffer_->getLength()};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
JSI_PROPERTY_GETTER(duration) {
|
|
41
|
+
return {audioBuffer_->getDuration()};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
JSI_PROPERTY_GETTER(numberOfChannels) {
|
|
45
|
+
return {audioBuffer_->getNumberOfChannels()};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
JSI_HOST_FUNCTION(getChannelData) {
|
|
49
|
+
int channel = static_cast<int>(args[0].getNumber());
|
|
50
|
+
float *channelData = audioBuffer_->getChannelData(channel);
|
|
51
|
+
|
|
52
|
+
auto array = jsi::Array(runtime, audioBuffer_->getLength());
|
|
53
|
+
for (int i = 0; i < audioBuffer_->getLength(); i++) {
|
|
54
|
+
array.setValueAtIndex(runtime, i, jsi::Value(channelData[i]));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return array;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
JSI_HOST_FUNCTION(copyFromChannel) {
|
|
61
|
+
auto destination = args[0].getObject(runtime).asArray(runtime);
|
|
62
|
+
auto destinationLength =
|
|
63
|
+
static_cast<int>(destination.getProperty(runtime, "length").asNumber());
|
|
64
|
+
auto channelNumber = static_cast<int>(args[1].getNumber());
|
|
65
|
+
auto startInChannel = static_cast<int>(args[2].getNumber());
|
|
66
|
+
|
|
67
|
+
auto *destinationData = new float[destinationLength];
|
|
68
|
+
|
|
69
|
+
audioBuffer_->copyFromChannel(
|
|
70
|
+
destinationData, destinationLength, channelNumber, startInChannel);
|
|
71
|
+
|
|
72
|
+
for (int i = 0; i < destinationLength; i++) {
|
|
73
|
+
destination.setValueAtIndex(runtime, i, jsi::Value(destinationData[i]));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return jsi::Value::undefined();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
JSI_HOST_FUNCTION(copyToChannel) {
|
|
80
|
+
auto source = args[0].getObject(runtime).asArray(runtime);
|
|
81
|
+
auto sourceLength =
|
|
82
|
+
static_cast<int>(source.getProperty(runtime, "length").asNumber());
|
|
83
|
+
auto channelNumber = static_cast<int>(args[1].getNumber());
|
|
84
|
+
auto startInChannel = static_cast<int>(args[2].getNumber());
|
|
85
|
+
|
|
86
|
+
auto *sourceData = new float[sourceLength];
|
|
20
87
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
88
|
+
for (int i = 0; i < sourceLength; i++) {
|
|
89
|
+
sourceData[i] =
|
|
90
|
+
static_cast<float>(source.getValueAtIndex(runtime, i).getNumber());
|
|
91
|
+
}
|
|
25
92
|
|
|
26
|
-
|
|
93
|
+
audioBuffer_->copyToChannel(
|
|
94
|
+
sourceData, sourceLength, channelNumber, startInChannel);
|
|
27
95
|
|
|
28
|
-
|
|
29
|
-
const std::shared_ptr<AudioBufferWrapper> &wrapper) {
|
|
30
|
-
return std::make_shared<AudioBufferHostObject>(wrapper);
|
|
96
|
+
return jsi::Value::undefined();
|
|
31
97
|
}
|
|
32
98
|
};
|
|
33
99
|
} // namespace audioapi
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
#include <vector>
|
|
5
5
|
|
|
6
6
|
#include "AudioBufferHostObject.h"
|
|
7
|
-
#include "
|
|
7
|
+
#include "AudioBufferSourceNode.h"
|
|
8
|
+
#include "AudioParamHostObject.h"
|
|
8
9
|
#include "AudioScheduledSourceNodeHostObject.h"
|
|
9
10
|
|
|
10
11
|
namespace audioapi {
|
|
@@ -14,24 +15,102 @@ class AudioBufferSourceNodeHostObject
|
|
|
14
15
|
: public AudioScheduledSourceNodeHostObject {
|
|
15
16
|
public:
|
|
16
17
|
explicit AudioBufferSourceNodeHostObject(
|
|
17
|
-
const std::shared_ptr<
|
|
18
|
+
const std::shared_ptr<AudioBufferSourceNode> &node)
|
|
19
|
+
: AudioScheduledSourceNodeHostObject(node) {
|
|
20
|
+
addGetters(
|
|
21
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loop),
|
|
22
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, buffer),
|
|
23
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopStart),
|
|
24
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopEnd),
|
|
25
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, detune),
|
|
26
|
+
JSI_EXPORT_PROPERTY_GETTER(
|
|
27
|
+
AudioBufferSourceNodeHostObject, playbackRate));
|
|
28
|
+
addSetters(
|
|
29
|
+
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loop),
|
|
30
|
+
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, buffer));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
JSI_PROPERTY_GETTER(loop) {
|
|
34
|
+
auto audioBufferSourceNode =
|
|
35
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
36
|
+
auto loop = audioBufferSourceNode->getLoop();
|
|
37
|
+
return {loop};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
JSI_PROPERTY_GETTER(buffer) {
|
|
41
|
+
auto audioBufferSourceNode =
|
|
42
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
43
|
+
auto buffer = audioBufferSourceNode->getBuffer();
|
|
44
|
+
|
|
45
|
+
if (!buffer) {
|
|
46
|
+
return jsi::Value::null();
|
|
47
|
+
}
|
|
18
48
|
|
|
19
|
-
|
|
49
|
+
auto bufferHostObject = std::make_shared<AudioBufferHostObject>(buffer);
|
|
50
|
+
return jsi::Object::createFromHostObject(runtime, bufferHostObject);
|
|
51
|
+
}
|
|
20
52
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
53
|
+
JSI_PROPERTY_GETTER(loopStart) {
|
|
54
|
+
auto audioBufferSourceNode =
|
|
55
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
56
|
+
auto loopStart = audioBufferSourceNode->getLoopStart();
|
|
57
|
+
return {loopStart};
|
|
58
|
+
}
|
|
25
59
|
|
|
26
|
-
|
|
60
|
+
JSI_PROPERTY_GETTER(loopEnd) {
|
|
61
|
+
auto audioBufferSourceNode =
|
|
62
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
63
|
+
auto loopEnd = audioBufferSourceNode->getLoopEnd();
|
|
64
|
+
return {loopEnd};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
JSI_PROPERTY_GETTER(detune) {
|
|
68
|
+
auto audioBufferSourceNode =
|
|
69
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
70
|
+
auto detune = audioBufferSourceNode->getDetuneParam();
|
|
71
|
+
auto detuneHostObject = std::make_shared<AudioParamHostObject>(detune);
|
|
72
|
+
return jsi::Object::createFromHostObject(runtime, detuneHostObject);
|
|
73
|
+
}
|
|
27
74
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
75
|
+
JSI_PROPERTY_GETTER(playbackRate) {
|
|
76
|
+
auto audioBufferSourceNode =
|
|
77
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
78
|
+
auto playbackRate = audioBufferSourceNode->getPlaybackRateParam();
|
|
79
|
+
auto playbackRateHostObject =
|
|
80
|
+
std::make_shared<AudioParamHostObject>(playbackRate);
|
|
81
|
+
return jsi::Object::createFromHostObject(runtime, playbackRateHostObject);
|
|
31
82
|
}
|
|
32
83
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
84
|
+
JSI_PROPERTY_SETTER(loop) {
|
|
85
|
+
auto audioBufferSourceNode =
|
|
86
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
87
|
+
audioBufferSourceNode->setLoop(value.getBool());
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
JSI_PROPERTY_SETTER(buffer) {
|
|
91
|
+
auto audioBufferSourceNode =
|
|
92
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
93
|
+
if (value.isNull()) {
|
|
94
|
+
audioBufferSourceNode->setBuffer(std::shared_ptr<AudioBuffer>(nullptr));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
auto bufferHostObject =
|
|
99
|
+
value.getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
|
|
100
|
+
audioBufferSourceNode->setBuffer(bufferHostObject->audioBuffer_);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
JSI_PROPERTY_SETTER(loopStart) {
|
|
104
|
+
auto audioBufferSourceNode =
|
|
105
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
106
|
+
audioBufferSourceNode->setLoopStart(value.getNumber());
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
JSI_PROPERTY_SETTER(loopEnd) {
|
|
110
|
+
auto audioBufferSourceNode =
|
|
111
|
+
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
112
|
+
audioBufferSourceNode->setLoopEnd(value.getNumber());
|
|
113
|
+
}
|
|
36
114
|
};
|
|
115
|
+
|
|
37
116
|
} // namespace audioapi
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
#include <memory>
|
|
5
5
|
#include <vector>
|
|
6
6
|
|
|
7
|
-
#include"
|
|
8
|
-
#include "AudioContextWrapper.h"
|
|
7
|
+
#include "AudioContext.h"
|
|
9
8
|
#include "BaseAudioContextHostObject.h"
|
|
10
9
|
|
|
11
10
|
namespace audioapi {
|
|
@@ -14,24 +13,16 @@ using namespace facebook;
|
|
|
14
13
|
class AudioContextHostObject : public BaseAudioContextHostObject {
|
|
15
14
|
public:
|
|
16
15
|
explicit AudioContextHostObject(
|
|
17
|
-
const std::shared_ptr<
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
void set(
|
|
22
|
-
jsi::Runtime &runtime,
|
|
23
|
-
const jsi::PropNameID &name,
|
|
24
|
-
const jsi::Value &value) override;
|
|
25
|
-
|
|
26
|
-
std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
|
|
27
|
-
|
|
28
|
-
static std::shared_ptr<AudioContextHostObject> createFromWrapper(
|
|
29
|
-
const std::shared_ptr<AudioContextWrapper> &wrapper, std::shared_ptr<JsiPromise::PromiseVendor> promiseVendor) {
|
|
30
|
-
return std::make_shared<AudioContextHostObject>(wrapper, promiseVendor);
|
|
16
|
+
const std::shared_ptr<AudioContext> &audioContext,
|
|
17
|
+
const std::shared_ptr<PromiseVendor> &promiseVendor)
|
|
18
|
+
: BaseAudioContextHostObject(audioContext, promiseVendor) {
|
|
19
|
+
addFunctions(JSI_EXPORT_FUNCTION(AudioContextHostObject, close));
|
|
31
20
|
}
|
|
32
21
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
22
|
+
JSI_HOST_FUNCTION(close) {
|
|
23
|
+
auto audioContext = std::static_pointer_cast<AudioContext>(context_);
|
|
24
|
+
audioContext->close();
|
|
25
|
+
return jsi::Value::undefined();
|
|
26
|
+
}
|
|
36
27
|
};
|
|
37
28
|
} // namespace audioapi
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#include <memory>
|
|
4
4
|
#include <vector>
|
|
5
5
|
|
|
6
|
-
#include "
|
|
6
|
+
#include "AudioDestinationNode.h"
|
|
7
7
|
#include "AudioNodeHostObject.h"
|
|
8
8
|
|
|
9
9
|
namespace audioapi {
|
|
@@ -12,20 +12,7 @@ using namespace facebook;
|
|
|
12
12
|
class AudioDestinationNodeHostObject : public AudioNodeHostObject {
|
|
13
13
|
public:
|
|
14
14
|
explicit AudioDestinationNodeHostObject(
|
|
15
|
-
const std::shared_ptr<
|
|
16
|
-
|
|
17
|
-
jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
|
|
18
|
-
|
|
19
|
-
void set(
|
|
20
|
-
jsi::Runtime &runtime,
|
|
21
|
-
const jsi::PropNameID &name,
|
|
22
|
-
const jsi::Value &value) override;
|
|
23
|
-
|
|
24
|
-
std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
|
|
25
|
-
|
|
26
|
-
static std::shared_ptr<AudioDestinationNodeHostObject> createFromWrapper(
|
|
27
|
-
const std::shared_ptr<AudioDestinationNodeWrapper> &wrapper) {
|
|
28
|
-
return std::make_shared<AudioDestinationNodeHostObject>(wrapper);
|
|
29
|
-
}
|
|
15
|
+
const std::shared_ptr<AudioDestinationNode> &node)
|
|
16
|
+
: AudioNodeHostObject(node) {}
|
|
30
17
|
};
|
|
31
18
|
} // namespace audioapi
|