react-native-audio-api 0.6.0-rc.4 → 0.6.0

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 (206) hide show
  1. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +35 -2
  2. package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +4 -0
  3. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +31 -17
  4. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +1 -3
  5. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +56 -2
  6. package/android/src/main/java/com/swmansion/audioapi/AudioAPIPackage.kt +0 -12
  7. package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +35 -12
  8. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +30 -29
  9. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +20 -22
  10. package/android/src/main/java/com/swmansion/audioapi/system/MediaReceiver.kt +19 -9
  11. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionCallback.kt +30 -11
  12. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +53 -26
  13. package/android/src/main/java/com/swmansion/audioapi/system/VolumeChangeListener.kt +10 -5
  14. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +39 -0
  15. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +20 -14
  16. package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +2 -3
  17. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.h +24 -11
  18. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +1 -0
  19. package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +10 -89
  20. package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +3 -24
  21. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +2 -2
  22. package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +2 -3
  23. package/common/cpp/audioapi/core/AudioContext.cpp +4 -1
  24. package/common/cpp/audioapi/core/AudioContext.h +1 -1
  25. package/common/cpp/audioapi/core/AudioNode.cpp +31 -2
  26. package/common/cpp/audioapi/core/AudioNode.h +7 -1
  27. package/common/cpp/audioapi/core/AudioParam.cpp +84 -2
  28. package/common/cpp/audioapi/core/AudioParam.h +14 -1
  29. package/common/cpp/audioapi/core/BaseAudioContext.cpp +7 -1
  30. package/common/cpp/audioapi/core/BaseAudioContext.h +7 -1
  31. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +3 -2
  32. package/common/cpp/audioapi/core/OfflineAudioContext.h +1 -1
  33. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +19 -56
  34. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +3 -2
  35. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +28 -26
  36. package/common/cpp/audioapi/core/effects/GainNode.cpp +9 -9
  37. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +5 -2
  38. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +56 -0
  39. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +13 -13
  40. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +14 -10
  41. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +1 -1
  42. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +7 -6
  43. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +5 -3
  44. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +15 -10
  45. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +35 -1
  46. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +15 -1
  47. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +108 -0
  48. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +62 -0
  49. package/common/cpp/audioapi/events/AudioEventHandlerRegistryHostObject.h +48 -0
  50. package/common/cpp/audioapi/jsi/JsiPromise.cpp +3 -4
  51. package/common/cpp/audioapi/utils/AudioArray.h +1 -1
  52. package/common/cpp/audioapi/utils/CircularAudioArray.cpp +94 -0
  53. package/common/cpp/audioapi/utils/CircularAudioArray.h +26 -0
  54. package/ios/audioapi/ios/AudioAPIModule.h +13 -0
  55. package/ios/audioapi/ios/AudioAPIModule.mm +115 -6
  56. package/ios/audioapi/ios/core/IOSAudioRecorder.h +3 -10
  57. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +15 -52
  58. package/ios/audioapi/ios/core/NativeAudioPlayer.m +2 -0
  59. package/ios/audioapi/ios/core/NativeAudioRecorder.m +7 -3
  60. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.h +7 -0
  61. package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.mm +12 -0
  62. package/ios/audioapi/ios/system/AudioEngine.h +5 -0
  63. package/ios/audioapi/ios/system/AudioEngine.mm +7 -15
  64. package/ios/audioapi/ios/system/AudioSessionManager.h +3 -1
  65. package/ios/audioapi/ios/system/AudioSessionManager.mm +36 -17
  66. package/ios/audioapi/ios/system/LockScreenManager.h +3 -3
  67. package/ios/audioapi/ios/system/LockScreenManager.mm +36 -48
  68. package/ios/audioapi/ios/system/NotificationManager.h +3 -3
  69. package/ios/audioapi/ios/system/NotificationManager.mm +21 -29
  70. package/lib/commonjs/api.js +4 -4
  71. package/lib/commonjs/api.js.map +1 -1
  72. package/lib/commonjs/core/AudioBufferSourceNode.js +2 -2
  73. package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -1
  74. package/lib/commonjs/core/AudioNode.js +8 -2
  75. package/lib/commonjs/core/AudioNode.js.map +1 -1
  76. package/lib/commonjs/core/AudioParam.js +2 -1
  77. package/lib/commonjs/core/AudioParam.js.map +1 -1
  78. package/lib/commonjs/core/AudioRecorder.js +11 -28
  79. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  80. package/lib/commonjs/core/AudioScheduledSourceNode.js +4 -1
  81. package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
  82. package/lib/commonjs/core/BiquadFilterNode.js +4 -4
  83. package/lib/commonjs/core/BiquadFilterNode.js.map +1 -1
  84. package/lib/commonjs/core/GainNode.js +1 -1
  85. package/lib/commonjs/core/GainNode.js.map +1 -1
  86. package/lib/commonjs/core/OscillatorNode.js +2 -2
  87. package/lib/commonjs/core/OscillatorNode.js.map +1 -1
  88. package/lib/commonjs/core/StereoPannerNode.js +1 -1
  89. package/lib/commonjs/core/StereoPannerNode.js.map +1 -1
  90. package/lib/commonjs/events/AudioEventEmitter.js +22 -0
  91. package/lib/commonjs/events/AudioEventEmitter.js.map +1 -0
  92. package/lib/commonjs/events/AudioEventSubscription.js +20 -0
  93. package/lib/commonjs/events/AudioEventSubscription.js.map +1 -0
  94. package/lib/commonjs/events/index.js +21 -0
  95. package/lib/commonjs/events/index.js.map +1 -0
  96. package/lib/commonjs/events/types.js +6 -0
  97. package/lib/commonjs/events/types.js.map +1 -0
  98. package/lib/commonjs/hooks/useSytemVolume.js +1 -1
  99. package/lib/commonjs/hooks/useSytemVolume.js.map +1 -1
  100. package/lib/commonjs/specs/NativeAudioAPIModule.js +3 -3
  101. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  102. package/lib/commonjs/specs/index.js +2 -16
  103. package/lib/commonjs/specs/index.js.map +1 -1
  104. package/lib/commonjs/system/AudioManager.js +26 -26
  105. package/lib/commonjs/system/AudioManager.js.map +1 -1
  106. package/lib/module/api.js +2 -2
  107. package/lib/module/api.js.map +1 -1
  108. package/lib/module/core/AudioBufferSourceNode.js +2 -2
  109. package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
  110. package/lib/module/core/AudioNode.js +7 -2
  111. package/lib/module/core/AudioNode.js.map +1 -1
  112. package/lib/module/core/AudioParam.js +2 -1
  113. package/lib/module/core/AudioParam.js.map +1 -1
  114. package/lib/module/core/AudioRecorder.js +11 -28
  115. package/lib/module/core/AudioRecorder.js.map +1 -1
  116. package/lib/module/core/AudioScheduledSourceNode.js +4 -1
  117. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
  118. package/lib/module/core/BiquadFilterNode.js +4 -4
  119. package/lib/module/core/BiquadFilterNode.js.map +1 -1
  120. package/lib/module/core/GainNode.js +1 -1
  121. package/lib/module/core/GainNode.js.map +1 -1
  122. package/lib/module/core/OscillatorNode.js +2 -2
  123. package/lib/module/core/OscillatorNode.js.map +1 -1
  124. package/lib/module/core/StereoPannerNode.js +1 -1
  125. package/lib/module/core/StereoPannerNode.js.map +1 -1
  126. package/lib/module/events/AudioEventEmitter.js +16 -0
  127. package/lib/module/events/AudioEventEmitter.js.map +1 -0
  128. package/lib/module/events/AudioEventSubscription.js +15 -0
  129. package/lib/module/events/AudioEventSubscription.js.map +1 -0
  130. package/lib/module/events/index.js +6 -0
  131. package/lib/module/events/index.js.map +1 -0
  132. package/lib/module/events/types.js +4 -0
  133. package/lib/module/events/types.js.map +1 -0
  134. package/lib/module/hooks/useSytemVolume.js +1 -1
  135. package/lib/module/hooks/useSytemVolume.js.map +1 -1
  136. package/lib/module/specs/NativeAudioAPIModule.js +3 -2
  137. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  138. package/lib/module/specs/index.js +2 -3
  139. package/lib/module/specs/index.js.map +1 -1
  140. package/lib/module/system/AudioManager.js +27 -27
  141. package/lib/module/system/AudioManager.js.map +1 -1
  142. package/lib/typescript/api.d.ts +2 -1
  143. package/lib/typescript/api.d.ts.map +1 -1
  144. package/lib/typescript/core/AudioNode.d.ts +2 -1
  145. package/lib/typescript/core/AudioNode.d.ts.map +1 -1
  146. package/lib/typescript/core/AudioParam.d.ts +4 -2
  147. package/lib/typescript/core/AudioParam.d.ts.map +1 -1
  148. package/lib/typescript/core/AudioRecorder.d.ts +4 -14
  149. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
  150. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +3 -1
  151. package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
  152. package/lib/typescript/events/AudioEventEmitter.d.ts +10 -0
  153. package/lib/typescript/events/AudioEventEmitter.d.ts.map +1 -0
  154. package/lib/typescript/events/AudioEventSubscription.d.ts +11 -0
  155. package/lib/typescript/events/AudioEventSubscription.d.ts.map +1 -0
  156. package/lib/typescript/events/index.d.ts +4 -0
  157. package/lib/typescript/events/index.d.ts.map +1 -0
  158. package/lib/typescript/events/types.d.ts +50 -0
  159. package/lib/typescript/events/types.d.ts.map +1 -0
  160. package/lib/typescript/hooks/useSytemVolume.d.ts.map +1 -1
  161. package/lib/typescript/interfaces.d.ts +10 -10
  162. package/lib/typescript/interfaces.d.ts.map +1 -1
  163. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +15 -3
  164. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  165. package/lib/typescript/specs/index.d.ts +2 -3
  166. package/lib/typescript/specs/index.d.ts.map +1 -1
  167. package/lib/typescript/system/AudioManager.d.ts +8 -4
  168. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  169. package/lib/typescript/system/types.d.ts +1 -34
  170. package/lib/typescript/system/types.d.ts.map +1 -1
  171. package/lib/typescript/types.d.ts +0 -1
  172. package/lib/typescript/types.d.ts.map +1 -1
  173. package/package.json +3 -3
  174. package/src/api.ts +6 -3
  175. package/src/core/AudioBufferSourceNode.ts +2 -2
  176. package/src/core/AudioNode.ts +8 -3
  177. package/src/core/AudioParam.ts +5 -2
  178. package/src/core/AudioRecorder.ts +22 -62
  179. package/src/core/AudioScheduledSourceNode.ts +13 -2
  180. package/src/core/BiquadFilterNode.ts +4 -4
  181. package/src/core/GainNode.ts +1 -1
  182. package/src/core/OscillatorNode.ts +2 -2
  183. package/src/core/StereoPannerNode.ts +1 -1
  184. package/src/events/AudioEventEmitter.ts +29 -0
  185. package/src/events/AudioEventSubscription.ts +26 -0
  186. package/src/events/index.ts +4 -0
  187. package/src/events/types.ts +64 -0
  188. package/src/hooks/useSytemVolume.ts +2 -1
  189. package/src/interfaces.ts +19 -20
  190. package/src/specs/NativeAudioAPIModule.ts +23 -2
  191. package/src/specs/index.ts +2 -4
  192. package/src/system/AudioManager.ts +39 -38
  193. package/src/system/types.ts +1 -41
  194. package/src/types.ts +0 -8
  195. package/android/src/main/java/com/swmansion/audioapi/AudioManagerModule.kt +0 -64
  196. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionEventEmitter.kt +0 -88
  197. package/android/src/oldarch/NativeAudioManagerModuleSpec.java +0 -99
  198. package/ios/audioapi/ios/AudioManagerModule.h +0 -18
  199. package/ios/audioapi/ios/AudioManagerModule.mm +0 -93
  200. package/lib/commonjs/specs/NativeAudioManagerModule.js +0 -36
  201. package/lib/commonjs/specs/NativeAudioManagerModule.js.map +0 -1
  202. package/lib/module/specs/NativeAudioManagerModule.js +0 -33
  203. package/lib/module/specs/NativeAudioManagerModule.js.map +0 -1
  204. package/lib/typescript/specs/NativeAudioManagerModule.d.ts +0 -15
  205. package/lib/typescript/specs/NativeAudioManagerModule.d.ts.map +0 -1
  206. package/src/specs/NativeAudioManagerModule.ts +0 -45
@@ -24,42 +24,28 @@ class AudioRecorderHostObject : public JsiHostObject {
24
24
  public:
25
25
  explicit AudioRecorderHostObject(
26
26
  jsi::Runtime *runtime,
27
- const std::shared_ptr<react::CallInvoker> &callInvoker,
27
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
28
28
  float sampleRate,
29
- int bufferLength)
30
- : callInvoker_(callInvoker) {
31
- promiseVendor_ = std::make_shared<PromiseVendor>(runtime, callInvoker);
32
-
29
+ int bufferLength) {
33
30
  #ifdef ANDROID
34
31
  audioRecorder_ = std::make_shared<AndroidAudioRecorder>(
35
32
  sampleRate,
36
33
  bufferLength,
37
- this->getOnError(),
38
- this->getOnStatusChange(),
39
- this->getOnAudioReady()
34
+ audioEventHandlerRegistry
40
35
  );
41
36
  #else
42
37
  audioRecorder_ = std::make_shared<IOSAudioRecorder>(
43
38
  sampleRate,
44
39
  bufferLength,
45
- this->getOnError(),
46
- this->getOnStatusChange(),
47
- this->getOnAudioReady()
40
+ audioEventHandlerRegistry
48
41
  );
49
42
  #endif
50
43
 
44
+ addSetters(JSI_EXPORT_PROPERTY_SETTER(AudioRecorderHostObject, onAudioReady));
45
+
51
46
  addFunctions(
52
47
  JSI_EXPORT_FUNCTION(AudioRecorderHostObject, start),
53
- JSI_EXPORT_FUNCTION(AudioRecorderHostObject, stop),
54
- JSI_EXPORT_FUNCTION(AudioRecorderHostObject, onAudioReady),
55
- JSI_EXPORT_FUNCTION(AudioRecorderHostObject, onError),
56
- JSI_EXPORT_FUNCTION(AudioRecorderHostObject, onStatusChange));
57
- }
58
-
59
- ~AudioRecorderHostObject() override {
60
- errorCallback_ = nullptr;
61
- audioReadyCallback_ = nullptr;
62
- statusChangeCallback_ = nullptr;
48
+ JSI_EXPORT_FUNCTION(AudioRecorderHostObject, stop));
63
49
  }
64
50
 
65
51
  JSI_HOST_FUNCTION(start) {
@@ -74,76 +60,11 @@ class AudioRecorderHostObject : public JsiHostObject {
74
60
  return jsi::Value::undefined();
75
61
  }
76
62
 
77
- JSI_HOST_FUNCTION(onAudioReady) {
78
- audioReadyCallback_ = std::make_unique<jsi::Function>(args[0].getObject(runtime).getFunction(runtime));
79
-
80
- return jsi::Value::undefined();
81
- }
82
-
83
- JSI_HOST_FUNCTION(onError) {
84
- errorCallback_ = std::make_unique<jsi::Function>(args[0].getObject(runtime).getFunction(runtime));
85
-
86
- return jsi::Value::undefined();
87
- }
88
-
89
- JSI_HOST_FUNCTION(onStatusChange) {
90
- statusChangeCallback_ = std::make_unique<jsi::Function>(args[0].getObject(runtime).getFunction(runtime));
91
-
92
- return jsi::Value::undefined();
63
+ JSI_PROPERTY_SETTER(onAudioReady) {
64
+ audioRecorder_->setOnAudioReadyCallbackId(std::stoull(value.getString(runtime).utf8(runtime)));
93
65
  }
94
66
 
95
- protected:
67
+ private:
96
68
  std::shared_ptr<AudioRecorder> audioRecorder_;
97
- std::shared_ptr<PromiseVendor> promiseVendor_;
98
- std::shared_ptr<react::CallInvoker> callInvoker_;
99
-
100
- std::unique_ptr<jsi::Function> errorCallback_;
101
- std::unique_ptr<jsi::Function> audioReadyCallback_;
102
- std::unique_ptr<jsi::Function> statusChangeCallback_;
103
-
104
- std::function<void(std::shared_ptr<AudioBus>, int, double)> getOnAudioReady() {
105
- return [this](const std::shared_ptr<AudioBus> &bus, int numFrames, double when) {
106
- if (audioReadyCallback_ == nullptr) {
107
- return;
108
- }
109
-
110
- callInvoker_->invokeAsync([this, bus = bus, numFrames, when](jsi::Runtime &runtime) {
111
- auto buffer = std::make_shared<AudioBuffer>(bus);
112
- auto bufferHostObject = std::make_shared<AudioBufferHostObject>(buffer);
113
-
114
- audioReadyCallback_->call(
115
- runtime,
116
- jsi::Object::createFromHostObject(runtime, bufferHostObject),
117
- jsi::Value(numFrames),
118
- jsi::Value(when)
119
- );
120
- });
121
- };
122
- }
123
-
124
- std::function<void(void)> getOnError() {
125
- return [this]() {
126
- if (errorCallback_ == nullptr) {
127
- return;
128
- }
129
-
130
- callInvoker_->invokeAsync([this](jsi::Runtime &runtime) {
131
- errorCallback_->call(runtime);
132
- });
133
- };
134
- }
135
-
136
- std::function<void(void)> getOnStatusChange() {
137
- return [this]() {
138
- if (statusChangeCallback_ == nullptr) {
139
- return;
140
- }
141
-
142
- callInvoker_->invokeAsync([this](jsi::Runtime &runtime) {
143
- statusChangeCallback_->call(runtime);
144
- });
145
- };
146
- }
147
69
  };
148
-
149
70
  } // namespace audioapi
@@ -12,9 +12,8 @@ using namespace facebook;
12
12
  class AudioScheduledSourceNodeHostObject : public AudioNodeHostObject {
13
13
  public:
14
14
  explicit AudioScheduledSourceNodeHostObject(
15
- const std::shared_ptr<AudioScheduledSourceNode> &node,
16
- const std::shared_ptr<react::CallInvoker> &callInvoker)
17
- : AudioNodeHostObject(node), callInvoker_(callInvoker) {
15
+ const std::shared_ptr<AudioScheduledSourceNode> &node)
16
+ : AudioNodeHostObject(node) {
18
17
  addSetters(
19
18
  JSI_EXPORT_PROPERTY_SETTER(AudioScheduledSourceNodeHostObject, onended));
20
19
  addFunctions(
@@ -22,27 +21,11 @@ class AudioScheduledSourceNodeHostObject : public AudioNodeHostObject {
22
21
  JSI_EXPORT_FUNCTION(AudioScheduledSourceNodeHostObject, stop));
23
22
  }
24
23
 
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
24
  JSI_PROPERTY_SETTER(onended) {
35
- onendedCallback_ = std::make_unique<jsi::Function>(value.getObject(runtime).getFunction(runtime));
36
25
  auto audioScheduleSourceNode =
37
26
  std::static_pointer_cast<AudioScheduledSourceNode>(node_);
38
27
 
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);
28
+ audioScheduleSourceNode->setOnEndedCallbackId(std::stoull(value.getString(runtime).utf8(runtime)));
46
29
  }
47
30
 
48
31
  JSI_HOST_FUNCTION(start) {
@@ -60,9 +43,5 @@ class AudioScheduledSourceNodeHostObject : public AudioNodeHostObject {
60
43
  audioScheduleSourceNode->stop(time);
61
44
  return jsi::Value::undefined();
62
45
  }
63
-
64
- private:
65
- std::shared_ptr<react::CallInvoker> callInvoker_;
66
- std::unique_ptr<jsi::Function> onendedCallback_;
67
46
  };
68
47
  } // namespace audioapi
@@ -71,7 +71,7 @@ class BaseAudioContextHostObject : public JsiHostObject {
71
71
  JSI_HOST_FUNCTION(createOscillator) {
72
72
  auto oscillator = context_->createOscillator();
73
73
  auto oscillatorHostObject =
74
- std::make_shared<OscillatorNodeHostObject>(oscillator, callInvoker_);
74
+ std::make_shared<OscillatorNodeHostObject>(oscillator);
75
75
  return jsi::Object::createFromHostObject(runtime, oscillatorHostObject);
76
76
  }
77
77
 
@@ -99,7 +99,7 @@ class BaseAudioContextHostObject : public JsiHostObject {
99
99
  auto pitchCorrection = args[0].asBool();
100
100
  auto bufferSource = context_->createBufferSource(pitchCorrection);
101
101
  auto bufferSourceHostObject =
102
- std::make_shared<AudioBufferSourceNodeHostObject>(bufferSource, callInvoker_);
102
+ std::make_shared<AudioBufferSourceNodeHostObject>(bufferSource);
103
103
  return jsi::Object::createFromHostObject(runtime, bufferSourceHostObject);
104
104
  }
105
105
 
@@ -15,9 +15,8 @@ using namespace facebook;
15
15
  class OscillatorNodeHostObject : public AudioScheduledSourceNodeHostObject {
16
16
  public:
17
17
  explicit OscillatorNodeHostObject(
18
- const std::shared_ptr<OscillatorNode> &node,
19
- const std::shared_ptr<react::CallInvoker> &callInvoker)
20
- : AudioScheduledSourceNodeHostObject(node, callInvoker) {
18
+ const std::shared_ptr<OscillatorNode> &node)
19
+ : AudioScheduledSourceNodeHostObject(node) {
21
20
  addGetters(
22
21
  JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, frequency),
23
22
  JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, detune),
@@ -10,7 +10,10 @@
10
10
  #include <audioapi/core/utils/AudioNodeManager.h>
11
11
 
12
12
  namespace audioapi {
13
- AudioContext::AudioContext(float sampleRate) : BaseAudioContext() {
13
+ AudioContext::AudioContext(
14
+ float sampleRate,
15
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
16
+ : BaseAudioContext(audioEventHandlerRegistry) {
14
17
  #ifdef ANDROID
15
18
  audioPlayer_ = std::make_shared<AudioPlayer>(this->renderAudio(), sampleRate);
16
19
  #else
@@ -14,7 +14,7 @@ class IOSAudioPlayer;
14
14
 
15
15
  class AudioContext : public BaseAudioContext {
16
16
  public:
17
- explicit AudioContext(float sampleRate);
17
+ explicit AudioContext(float sampleRate, const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
18
18
  ~AudioContext() override;
19
19
 
20
20
  void close();
@@ -1,4 +1,5 @@
1
1
  #include <audioapi/core/AudioNode.h>
2
+ #include <audioapi/core/AudioParam.h>
2
3
  #include <audioapi/core/BaseAudioContext.h>
3
4
  #include <audioapi/core/utils/AudioNodeManager.h>
4
5
  #include <audioapi/utils/AudioArray.h>
@@ -38,10 +39,15 @@ std::string AudioNode::getChannelInterpretation() const {
38
39
  }
39
40
 
40
41
  void AudioNode::connect(const std::shared_ptr<AudioNode> &node) {
41
- context_->getNodeManager()->addPendingConnection(
42
+ context_->getNodeManager()->addPendingNodeConnection(
42
43
  shared_from_this(), node, AudioNodeManager::ConnectionType::CONNECT);
43
44
  }
44
45
 
46
+ void AudioNode::connect(const std::shared_ptr<AudioParam> &param) {
47
+ context_->getNodeManager()->addPendingParamConnection(
48
+ shared_from_this(), param, AudioNodeManager::ConnectionType::CONNECT);
49
+ }
50
+
45
51
  void AudioNode::disconnect() {
46
52
  for (auto it = outputNodes_.begin(), end = outputNodes_.end(); it != end;
47
53
  ++it) {
@@ -50,10 +56,15 @@ void AudioNode::disconnect() {
50
56
  }
51
57
 
52
58
  void AudioNode::disconnect(const std::shared_ptr<AudioNode> &node) {
53
- context_->getNodeManager()->addPendingConnection(
59
+ context_->getNodeManager()->addPendingNodeConnection(
54
60
  shared_from_this(), node, AudioNodeManager::ConnectionType::DISCONNECT);
55
61
  }
56
62
 
63
+ void AudioNode::disconnect(const std::shared_ptr<AudioParam> &param) {
64
+ context_->getNodeManager()->addPendingParamConnection(
65
+ shared_from_this(), param, AudioNodeManager::ConnectionType::DISCONNECT);
66
+ }
67
+
57
68
  bool AudioNode::isEnabled() const {
58
69
  return isEnabled_;
59
70
  }
@@ -221,6 +232,15 @@ void AudioNode::connectNode(const std::shared_ptr<AudioNode> &node) {
221
232
  }
222
233
  }
223
234
 
235
+ void AudioNode::connectParam(const std::shared_ptr<AudioParam> &param) {
236
+ auto position = outputParams_.find(param);
237
+
238
+ if (position == outputParams_.end()) {
239
+ outputParams_.insert(param);
240
+ param->addInputNode(this);
241
+ }
242
+ }
243
+
224
244
  void AudioNode::disconnectNode(const std::shared_ptr<AudioNode> &node) {
225
245
  auto position = outputNodes_.find(node);
226
246
 
@@ -230,6 +250,15 @@ void AudioNode::disconnectNode(const std::shared_ptr<AudioNode> &node) {
230
250
  }
231
251
  }
232
252
 
253
+ void AudioNode::disconnectParam(const std::shared_ptr<AudioParam> &param) {
254
+ auto position = outputParams_.find(param);
255
+
256
+ if (position != outputParams_.end()) {
257
+ param->removeInputNode(this);
258
+ outputParams_.erase(param);
259
+ }
260
+ }
261
+
233
262
  void AudioNode::onInputEnabled() {
234
263
  numberOfEnabledInputNodes_ += 1;
235
264
 
@@ -15,6 +15,7 @@ namespace audioapi {
15
15
 
16
16
  class AudioBus;
17
17
  class BaseAudioContext;
18
+ class AudioParam;
18
19
 
19
20
  class AudioNode : public std::enable_shared_from_this<AudioNode> {
20
21
  public:
@@ -27,8 +28,11 @@ class AudioNode : public std::enable_shared_from_this<AudioNode> {
27
28
  std::string getChannelCountMode() const;
28
29
  std::string getChannelInterpretation() const;
29
30
  void connect(const std::shared_ptr<AudioNode> &node);
31
+ void connect(const std::shared_ptr<AudioParam> &param);
30
32
  void disconnect();
31
33
  void disconnect(const std::shared_ptr<AudioNode> &node);
34
+ void disconnect(const std::shared_ptr<AudioParam> &param);
35
+ virtual std::shared_ptr<AudioBus> processAudio(const std::shared_ptr<AudioBus> &outputBus, int framesToProcess, bool checkIsAlreadyProcessed);
32
36
 
33
37
  bool isEnabled() const;
34
38
  void enable();
@@ -50,6 +54,7 @@ class AudioNode : public std::enable_shared_from_this<AudioNode> {
50
54
 
51
55
  std::unordered_set<AudioNode *> inputNodes_ = {};
52
56
  std::unordered_set<std::shared_ptr<AudioNode>> outputNodes_ = {};
57
+ std::unordered_set<std::shared_ptr<AudioParam>> outputParams_ = {};
53
58
 
54
59
  int numberOfEnabledInputNodes_ = 0;
55
60
  bool isInitialized_ = false;
@@ -63,7 +68,6 @@ class AudioNode : public std::enable_shared_from_this<AudioNode> {
63
68
  static std::string toString(ChannelCountMode mode);
64
69
  static std::string toString(ChannelInterpretation interpretation);
65
70
 
66
- virtual std::shared_ptr<AudioBus> processAudio(const std::shared_ptr<AudioBus> &outputBus, int framesToProcess, bool checkIsAlreadyProcessed);
67
71
  virtual void processNode(const std::shared_ptr<AudioBus>&, int) = 0;
68
72
 
69
73
  bool isAlreadyProcessed();
@@ -73,6 +77,8 @@ class AudioNode : public std::enable_shared_from_this<AudioNode> {
73
77
 
74
78
  void connectNode(const std::shared_ptr<AudioNode> &node);
75
79
  void disconnectNode(const std::shared_ptr<AudioNode> &node);
80
+ void connectParam(const std::shared_ptr<AudioParam> &param);
81
+ void disconnectParam(const std::shared_ptr<AudioParam> &param);
76
82
 
77
83
  void onInputEnabled();
78
84
  void onInputDisabled();
@@ -1,14 +1,27 @@
1
1
  #include <audioapi/core/AudioParam.h>
2
2
  #include <audioapi/core/BaseAudioContext.h>
3
3
  #include <audioapi/dsp/AudioUtils.h>
4
+ #include <audioapi/dsp/VectorMath.h>
5
+ #include <audioapi/utils/AudioArray.h>
6
+ #include <iostream>
4
7
 
5
8
  namespace audioapi {
6
9
 
7
- AudioParam::AudioParam(float defaultValue, float minValue, float maxValue)
10
+ AudioParam::AudioParam(
11
+ float defaultValue,
12
+ float minValue,
13
+ float maxValue,
14
+ BaseAudioContext *context)
8
15
  : value_(defaultValue),
9
16
  defaultValue_(defaultValue),
10
17
  minValue_(minValue),
11
- maxValue_(maxValue) {
18
+ maxValue_(maxValue),
19
+ context_(context),
20
+ audioBus_(
21
+ std::make_shared<AudioBus>(
22
+ RENDER_QUANTUM_SIZE,
23
+ 1,
24
+ context->getSampleRate())) {
12
25
  startTime_ = 0;
13
26
  endTime_ = 0;
14
27
  startValue_ = value_;
@@ -256,6 +269,44 @@ void AudioParam::cancelAndHoldAtTime(double cancelTime) {
256
269
  }
257
270
  }
258
271
 
272
+ void AudioParam::addInputNode(AudioNode *node) {
273
+ auto position = inputNodes_.find(node);
274
+ if (position == inputNodes_.end()) {
275
+ inputNodes_.insert(node);
276
+ }
277
+ }
278
+
279
+ void AudioParam::removeInputNode(AudioNode *node) {
280
+ auto position = inputNodes_.find(node);
281
+
282
+ if (position != inputNodes_.end()) {
283
+ inputNodes_.erase(position);
284
+ }
285
+ }
286
+
287
+ std::shared_ptr<AudioBus> AudioParam::processARateParam(
288
+ int framesToProcess,
289
+ double time) {
290
+ auto processingBus = audioBus_;
291
+ processingBus->zero();
292
+ if (!inputNodes_.empty()) {
293
+ processInputs(processingBus, framesToProcess, true);
294
+ mixInputsBuses(processingBus);
295
+ }
296
+ for (size_t i = 0; i < framesToProcess; i++) {
297
+ auto sample = getValueAtTime(time + i / context_->getSampleRate());
298
+ processingBus->getChannel(0)->getData()[i] += sample;
299
+ }
300
+ // processingBus is a mono bus
301
+ return processingBus;
302
+ }
303
+
304
+ float AudioParam::processKRateParam(int framesToProcess, double time) {
305
+ auto processingBus = processARateParam(framesToProcess, time);
306
+ // processingBus is a mono bus
307
+ return processingBus->getChannel(0)->getData()[0];
308
+ }
309
+
259
310
  double AudioParam::getQueueEndTime() {
260
311
  if (eventsQueue_.empty()) {
261
312
  return endTime_;
@@ -292,4 +343,35 @@ void AudioParam::updateQueue(ParamChangeEvent &event) {
292
343
  eventsQueue_.push_back(event);
293
344
  }
294
345
 
346
+ void AudioParam::processInputs(
347
+ const std::shared_ptr<AudioBus> &outputBus,
348
+ int framesToProcess,
349
+ bool checkIsAlreadyProcessed) {
350
+ for (auto it = inputNodes_.begin(), end = inputNodes_.end(); it != end;
351
+ ++it) {
352
+ auto inputNode = *it;
353
+ assert(inputNode != nullptr);
354
+
355
+ if (!inputNode->isEnabled()) {
356
+ continue;
357
+ }
358
+
359
+ auto inputBus = inputNode->processAudio(
360
+ outputBus, framesToProcess, checkIsAlreadyProcessed);
361
+ inputBuses_.push_back(inputBus);
362
+ }
363
+ }
364
+
365
+ void AudioParam::mixInputsBuses(
366
+ const std::shared_ptr<AudioBus> &processingBus) {
367
+ assert(processingBus != nullptr);
368
+
369
+ for (auto it = inputBuses_.begin(), end = inputBuses_.end(); it != end;
370
+ ++it) {
371
+ processingBus->sum(it->get(), ChannelInterpretation::SPEAKERS);
372
+ }
373
+
374
+ inputBuses_.clear();
375
+ }
376
+
295
377
  } // namespace audioapi
@@ -2,17 +2,20 @@
2
2
 
3
3
  #include <audioapi/core/utils/ParamChangeEvent.h>
4
4
  #include <audioapi/core/types/ParamChangeEventType.h>
5
+ #include <audioapi/utils/AudioBus.h>
6
+ #include <audioapi/core/AudioNode.h>
5
7
 
6
8
  #include <deque>
7
9
  #include <memory>
8
10
  #include <vector>
11
+ #include <unordered_set>
9
12
  #include <cstddef>
10
13
 
11
14
  namespace audioapi {
12
15
 
13
16
  class AudioParam {
14
17
  public:
15
- explicit AudioParam(float defaultValue, float minValue, float maxValue);
18
+ explicit AudioParam(float defaultValue, float minValue, float maxValue, BaseAudioContext *context);
16
19
 
17
20
  [[nodiscard]] float getValue() const;
18
21
  float getValueAtTime(double time);
@@ -33,23 +36,33 @@ class AudioParam {
33
36
  double duration);
34
37
  void cancelScheduledValues(double cancelTime);
35
38
  void cancelAndHoldAtTime(double cancelTime);
39
+ void addInputNode(AudioNode* node);
40
+ void removeInputNode(AudioNode* node);
41
+ std::shared_ptr<AudioBus> processARateParam(int framesToProcess, double time);
42
+ float processKRateParam(int framesToProcess, double time);
36
43
 
37
44
  private:
38
45
  float value_;
39
46
  float defaultValue_;
40
47
  float minValue_;
41
48
  float maxValue_;
49
+ BaseAudioContext *context_;
42
50
  std::deque<ParamChangeEvent> eventsQueue_;
51
+ std::unordered_set<AudioNode *> inputNodes_;
52
+ std::shared_ptr<AudioBus> audioBus_;
43
53
 
44
54
  double startTime_;
45
55
  double endTime_;
46
56
  float startValue_;
47
57
  float endValue_;
48
58
  std::function<float(double, double, float, float, double)> calculateValue_;
59
+ std::vector<std::shared_ptr<AudioBus>> inputBuses_ = {};
49
60
 
50
61
  double getQueueEndTime();
51
62
  float getQueueEndValue();
52
63
  void updateQueue(ParamChangeEvent &event);
64
+ void processInputs(const std::shared_ptr<AudioBus>& outputBus, int framesToProcess, bool checkIsAlreadyProcessed);
65
+ void mixInputsBuses(const std::shared_ptr<AudioBus>& processingBus);
53
66
  };
54
67
 
55
68
  } // namespace audioapi
@@ -9,14 +9,20 @@
9
9
  #include <audioapi/core/sources/OscillatorNode.h>
10
10
  #include <audioapi/core/utils/AudioDecoder.h>
11
11
  #include <audioapi/core/utils/AudioNodeManager.h>
12
+ #include <audioapi/events/AudioEventHandlerRegistry.h>
12
13
  #include <audioapi/utils/AudioArray.h>
13
14
  #include <audioapi/utils/AudioBus.h>
15
+ #include <audioapi/utils/CircularAudioArray.h>
14
16
 
15
17
  namespace audioapi {
16
18
 
17
- BaseAudioContext::BaseAudioContext() {
19
+ BaseAudioContext::BaseAudioContext(
20
+ const std::shared_ptr<AudioEventHandlerRegistry>
21
+ &audioEventHandlerRegistry) {
18
22
  nodeManager_ = std::make_shared<AudioNodeManager>();
19
23
  destination_ = std::make_shared<AudioDestinationNode>(this);
24
+
25
+ audioEventHandlerRegistry_ = audioEventHandlerRegistry;
20
26
  }
21
27
 
22
28
  std::string BaseAudioContext::getState() {
@@ -26,10 +26,11 @@ class AudioDestinationNode;
26
26
  class AudioBufferSourceNode;
27
27
  class AudioDecoder;
28
28
  class AnalyserNode;
29
+ class AudioEventHandlerRegistry;
29
30
 
30
31
  class BaseAudioContext {
31
32
  public:
32
- BaseAudioContext();
33
+ explicit BaseAudioContext(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
33
34
  virtual ~BaseAudioContext() = default;
34
35
 
35
36
  std::string getState();
@@ -77,6 +78,11 @@ class BaseAudioContext {
77
78
  std::shared_ptr<PeriodicWave> cachedSquareWave_ = nullptr;
78
79
  std::shared_ptr<PeriodicWave> cachedSawtoothWave_ = nullptr;
79
80
  std::shared_ptr<PeriodicWave> cachedTriangleWave_ = nullptr;
81
+
82
+ protected:
83
+ friend class AudioScheduledSourceNode;
84
+
85
+ std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;
80
86
  };
81
87
 
82
88
  } // namespace audioapi
@@ -21,8 +21,9 @@ namespace audioapi {
21
21
  OfflineAudioContext::OfflineAudioContext(
22
22
  int numberOfChannels,
23
23
  size_t length,
24
- float sampleRate)
25
- : BaseAudioContext(),
24
+ float sampleRate,
25
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
26
+ : BaseAudioContext(audioEventHandlerRegistry),
26
27
  length_(length),
27
28
  numberOfChannels_(numberOfChannels),
28
29
  currentSampleFrame_(0) {
@@ -14,7 +14,7 @@ using OfflineAudioContextResultCallback = std::function<void(std::shared_ptr<Aud
14
14
 
15
15
  class OfflineAudioContext : public BaseAudioContext {
16
16
  public:
17
- explicit OfflineAudioContext(int numberOfChannels, size_t length, float sampleRate);
17
+ explicit OfflineAudioContext(int numberOfChannels, size_t length, float sampleRate, const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
18
18
  ~OfflineAudioContext() override;
19
19
 
20
20
  void resume();