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.
Files changed (121) hide show
  1. package/android/CMakeLists.txt +4 -4
  2. package/android/build.gradle +1 -3
  3. package/android/libs/include/miniaudio.h +92621 -0
  4. package/android/src/main/cpp/AudioAPIInstaller/AudioAPIInstaller.cpp +10 -12
  5. package/android/src/main/cpp/AudioAPIInstaller/AudioAPIInstaller.h +16 -9
  6. package/android/src/main/cpp/AudioDecoder/AudioDecoder.cpp +64 -0
  7. package/android/src/main/cpp/AudioDecoder/AudioDecoder.h +21 -0
  8. package/android/src/main/cpp/AudioPlayer/AudioPlayer.h +2 -2
  9. package/android/src/main/java/com/swmansion/audioapi/module/AudioAPIInstaller.kt +14 -4
  10. package/android/src/main/java/com/swmansion/audioapi/nativemodules/AudioAPIModule.kt +2 -3
  11. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerHostObject.h +26 -27
  12. package/common/cpp/HostObjects/AudioBufferHostObject.h +79 -13
  13. package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.h +93 -14
  14. package/common/cpp/HostObjects/AudioContextHostObject.h +10 -19
  15. package/common/cpp/HostObjects/AudioDestinationNodeHostObject.h +3 -16
  16. package/common/cpp/HostObjects/AudioNodeHostObject.h +48 -11
  17. package/common/cpp/HostObjects/AudioParamHostObject.h +56 -14
  18. package/common/cpp/HostObjects/AudioScheduledSourceNodeHostObject.h +23 -16
  19. package/common/cpp/HostObjects/BaseAudioContextHostObject.h +131 -13
  20. package/common/cpp/HostObjects/BiquadFilterNodeHostObject.h +76 -18
  21. package/common/cpp/HostObjects/Constants.h +2 -0
  22. package/common/cpp/HostObjects/GainNodeHostObject.h +10 -15
  23. package/common/cpp/HostObjects/OscillatorNodeHostObject.h +40 -17
  24. package/common/cpp/HostObjects/PeriodicWaveHostObject.h +4 -17
  25. package/common/cpp/HostObjects/StereoPannerNodeHostObject.h +10 -17
  26. package/common/cpp/core/AudioBufferSourceNode.cpp +180 -73
  27. package/common/cpp/core/AudioBufferSourceNode.h +41 -1
  28. package/common/cpp/core/AudioDestinationNode.cpp +1 -0
  29. package/common/cpp/core/AudioDestinationNode.h +1 -1
  30. package/common/cpp/core/AudioScheduledSourceNode.cpp +86 -21
  31. package/common/cpp/core/AudioScheduledSourceNode.h +12 -4
  32. package/common/cpp/core/BaseAudioContext.cpp +8 -5
  33. package/common/cpp/core/BaseAudioContext.h +5 -3
  34. package/common/cpp/core/OscillatorNode.cpp +7 -2
  35. package/common/cpp/jsi/JsiHostObject.cpp +85 -0
  36. package/common/cpp/jsi/JsiHostObject.h +94 -0
  37. package/common/cpp/jsi/JsiPromise.cpp +65 -0
  38. package/common/cpp/jsi/JsiPromise.h +48 -0
  39. package/common/cpp/utils/AudioUtils.cpp +26 -0
  40. package/common/cpp/utils/AudioUtils.h +16 -0
  41. package/ios/AudioAPIModule.mm +3 -6
  42. package/ios/AudioDecoder/AudioDecoder.h +1 -1
  43. package/ios/AudioDecoder/AudioDecoder.m +14 -102
  44. package/ios/AudioDecoder/IOSAudioDecoder.h +2 -0
  45. package/ios/AudioDecoder/IOSAudioDecoder.mm +7 -1
  46. package/ios/AudioPlayer/AudioPlayer.m +3 -1
  47. package/lib/module/core/AudioBufferSourceNode.js +15 -0
  48. package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
  49. package/lib/module/core/BaseAudioContext.js +2 -3
  50. package/lib/module/core/BaseAudioContext.js.map +1 -1
  51. package/lib/module/index.js +18 -3
  52. package/lib/module/index.js.map +1 -1
  53. package/lib/typescript/core/AudioBufferSourceNode.d.ts +7 -0
  54. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
  55. package/lib/typescript/core/BaseAudioContext.d.ts +2 -2
  56. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  57. package/lib/typescript/core/types.d.ts +0 -6
  58. package/lib/typescript/core/types.d.ts.map +1 -1
  59. package/lib/typescript/index.d.ts +8 -4
  60. package/lib/typescript/index.d.ts.map +1 -1
  61. package/lib/typescript/interfaces.d.ts +5 -1
  62. package/lib/typescript/interfaces.d.ts.map +1 -1
  63. package/package.json +1 -1
  64. package/src/core/AudioBufferSourceNode.ts +23 -0
  65. package/src/core/BaseAudioContext.ts +3 -8
  66. package/src/core/types.ts +0 -7
  67. package/src/index.ts +26 -12
  68. package/src/interfaces.ts +6 -1
  69. package/android/libs/fftw3/x86/libfftw3.a +0 -0
  70. package/android/libs/fftw3/x86_64/libfftw3.a +0 -0
  71. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerHostObject.cpp +0 -54
  72. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerWrapper.h +0 -38
  73. package/common/cpp/AudioAPIInstaller/android/AudioAPIInstallerWrapper.cpp +0 -16
  74. package/common/cpp/AudioAPIInstaller/ios/AudioAPIInstallerWrapper.cpp +0 -12
  75. package/common/cpp/HostObjects/AudioBufferHostObject.cpp +0 -149
  76. package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.cpp +0 -79
  77. package/common/cpp/HostObjects/AudioContextHostObject.cpp +0 -54
  78. package/common/cpp/HostObjects/AudioDestinationNodeHostObject.cpp +0 -33
  79. package/common/cpp/HostObjects/AudioNodeHostObject.cpp +0 -102
  80. package/common/cpp/HostObjects/AudioParamHostObject.cpp +0 -115
  81. package/common/cpp/HostObjects/AudioScheduledSourceNodeHostObject.cpp +0 -73
  82. package/common/cpp/HostObjects/BaseAudioContextHostObject.cpp +0 -240
  83. package/common/cpp/HostObjects/BiquadFilterNodeHostObject.cpp +0 -125
  84. package/common/cpp/HostObjects/GainNodeHostObject.cpp +0 -41
  85. package/common/cpp/HostObjects/OscillatorNodeHostObject.cpp +0 -88
  86. package/common/cpp/HostObjects/PeriodicWaveHostObject.cpp +0 -33
  87. package/common/cpp/HostObjects/StereoPannerNodeHostObject.cpp +0 -41
  88. package/common/cpp/utils/JsiPromise.cpp +0 -59
  89. package/common/cpp/utils/JsiPromise.h +0 -42
  90. package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.cpp +0 -45
  91. package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.h +0 -26
  92. package/common/cpp/wrappers/AudioBufferWrapper.cpp +0 -46
  93. package/common/cpp/wrappers/AudioBufferWrapper.h +0 -30
  94. package/common/cpp/wrappers/AudioContextWrapper.cpp +0 -17
  95. package/common/cpp/wrappers/AudioContextWrapper.h +0 -19
  96. package/common/cpp/wrappers/AudioDestinationNodeWrapper.h +0 -16
  97. package/common/cpp/wrappers/AudioNodeWrapper.cpp +0 -37
  98. package/common/cpp/wrappers/AudioNodeWrapper.h +0 -25
  99. package/common/cpp/wrappers/AudioParamWrapper.cpp +0 -42
  100. package/common/cpp/wrappers/AudioParamWrapper.h +0 -25
  101. package/common/cpp/wrappers/AudioScheduledSourceNodeWrapper.cpp +0 -23
  102. package/common/cpp/wrappers/AudioScheduledSourceNodeWrapper.h +0 -23
  103. package/common/cpp/wrappers/BaseAudioContextWrapper.cpp +0 -83
  104. package/common/cpp/wrappers/BaseAudioContextWrapper.h +0 -50
  105. package/common/cpp/wrappers/BiquadFilterNodeWrapper.cpp +0 -60
  106. package/common/cpp/wrappers/BiquadFilterNodeWrapper.h +0 -37
  107. package/common/cpp/wrappers/GainNodeWrapper.cpp +0 -14
  108. package/common/cpp/wrappers/GainNodeWrapper.h +0 -20
  109. package/common/cpp/wrappers/OscillatorNodeWrapper.cpp +0 -44
  110. package/common/cpp/wrappers/OscillatorNodeWrapper.h +0 -31
  111. package/common/cpp/wrappers/PeriodicWaveWrapper.h +0 -17
  112. package/common/cpp/wrappers/StereoPannerNodeWrapper.cpp +0 -16
  113. package/common/cpp/wrappers/StereoPannerNodeWrapper.h +0 -21
  114. package/lib/module/utils/resolveAudioSource.js +0 -10
  115. package/lib/module/utils/resolveAudioSource.js.map +0 -1
  116. package/lib/typescript/utils/resolveAudioSource.d.ts +0 -3
  117. package/lib/typescript/utils/resolveAudioSource.d.ts.map +0 -1
  118. package/src/utils/resolveAudioSource.ts +0 -14
  119. /package/android/libs/{fftw3/arm64-v8a → arm64-v8a}/libfftw3.a +0 -0
  120. /package/android/libs/{fftw3/armeabi-v7a → armeabi-v7a}/libfftw3.a +0 -0
  121. /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
- : javaPart_(make_global(jThis)) {}
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(jlong jsContext) {
12
- auto audioAPIInstallerWrapper =
13
- std::make_shared<AudioAPIInstallerWrapper>(this);
14
- AudioAPIInstallerHostObject::createAndInstallFromWrapper(
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 facebook::jni;
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
- return makeCxxInstance(jThis);
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
- std::shared_ptr<AudioContext> createAudioContext();
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 AudioAPIInstaller {
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
- mHybridData = initHybrid()
21
+ val jsCallInvokerHolder = reactContext.jsCallInvokerHolder as CallInvokerHolderImpl
22
+ mHybridData = initHybrid(reactContext.javaScriptContextHolder!!.get(), jsCallInvokerHolder)
16
23
  }
17
24
 
18
- external fun initHybrid(): HybridData?
25
+ external fun initHybrid(
26
+ jsContext: Long,
27
+ callInvoker: CallInvokerHolderImpl,
28
+ ): HybridData?
19
29
 
20
- external fun install(jsContext: Long)
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
- val jsContext = reactContext.javaScriptContextHolder!!.get()
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 "AudioAPIInstallerWrapper.h"
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 AudioAPIInstallerWrapper;
18
-
19
- class AudioAPIInstallerHostObject : public jsi::HostObject {
16
+ class AudioAPIInstallerHostObject
17
+ : public JsiHostObject,
18
+ public std::enable_shared_from_this<AudioAPIInstallerHostObject> {
20
19
  public:
21
20
  explicit AudioAPIInstallerHostObject(
22
- const std::shared_ptr<AudioAPIInstallerWrapper> &wrapper, jsi::Runtime* runtime, const std::shared_ptr<react::CallInvoker> &jsInvoker);
23
-
24
- #ifdef ANDROID
25
- static void createAndInstallFromWrapper(
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
- jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
26
+ addFunctions(
27
+ JSI_EXPORT_FUNCTION(AudioAPIInstallerHostObject, createAudioContext));
28
+ }
37
29
 
38
- void set(
39
- jsi::Runtime &runtime,
40
- const jsi::PropNameID &name,
41
- const jsi::Value &value) override;
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
- std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
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<AudioAPIInstallerWrapper> wrapper_;
47
- std::shared_ptr<JsiPromise::PromiseVendor> promiseVendor_;
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 "AudioBufferWrapper.h"
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 jsi::HostObject {
13
+ class AudioBufferHostObject : public JsiHostObject {
13
14
  public:
14
- std::shared_ptr<AudioBufferWrapper> wrapper_;
15
+ std::shared_ptr<AudioBuffer> audioBuffer_;
15
16
 
16
17
  explicit AudioBufferHostObject(
17
- const std::shared_ptr<AudioBufferWrapper> &wrapper);
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
- jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
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
- void set(
22
- jsi::Runtime &runtime,
23
- const jsi::PropNameID &name,
24
- const jsi::Value &value) override;
88
+ for (int i = 0; i < sourceLength; i++) {
89
+ sourceData[i] =
90
+ static_cast<float>(source.getValueAtIndex(runtime, i).getNumber());
91
+ }
25
92
 
26
- std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
93
+ audioBuffer_->copyToChannel(
94
+ sourceData, sourceLength, channelNumber, startInChannel);
27
95
 
28
- static std::shared_ptr<AudioBufferHostObject> createFromWrapper(
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 "AudioBufferSourceNodeWrapper.h"
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<AudioBufferSourceNodeWrapper> &wrapper);
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
- jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
49
+ auto bufferHostObject = std::make_shared<AudioBufferHostObject>(buffer);
50
+ return jsi::Object::createFromHostObject(runtime, bufferHostObject);
51
+ }
20
52
 
21
- void set(
22
- jsi::Runtime &runtime,
23
- const jsi::PropNameID &name,
24
- const jsi::Value &value) override;
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
- std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
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
- static std::shared_ptr<AudioBufferSourceNodeHostObject> createFromWrapper(
29
- const std::shared_ptr<AudioBufferSourceNodeWrapper> &wrapper) {
30
- return std::make_shared<AudioBufferSourceNodeHostObject>(wrapper);
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
- private:
34
- std::shared_ptr<AudioBufferSourceNodeWrapper>
35
- getAudioBufferSourceNodeWrapperFromAudioNodeWrapper();
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"JsiPromise.h"
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<AudioContextWrapper> &wrapper, std::shared_ptr<JsiPromise::PromiseVendor> promiseVendor);
18
-
19
- jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
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
- private:
34
- std::shared_ptr<AudioContextWrapper>
35
- getAudioContextWrapperFromBaseAudioContextWrapper();
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 "AudioDestinationNodeWrapper.h"
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<AudioDestinationNodeWrapper> &wrapper);
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