react-native-audio-api 0.8.3-nightly-e918179-20251003 → 0.8.3-nightly-ea268f4-20251004

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 (158) hide show
  1. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +31 -14
  2. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +74 -4
  3. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +3 -0
  4. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +18 -0
  5. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +20 -1
  6. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +3 -0
  7. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +19 -0
  8. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +21 -0
  9. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +18 -0
  10. package/common/cpp/audioapi/core/AudioContext.cpp +2 -2
  11. package/common/cpp/audioapi/core/AudioContext.h +2 -2
  12. package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
  13. package/common/cpp/audioapi/core/BaseAudioContext.cpp +32 -3
  14. package/common/cpp/audioapi/core/BaseAudioContext.h +9 -4
  15. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +2 -2
  16. package/common/cpp/audioapi/core/OfflineAudioContext.h +2 -2
  17. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +4 -3
  18. package/common/cpp/audioapi/core/effects/WorkletNode.h +4 -3
  19. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +89 -0
  20. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +52 -0
  21. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +1 -6
  22. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +30 -0
  23. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +6 -0
  24. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +1 -6
  25. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +51 -0
  26. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +26 -0
  27. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +82 -0
  28. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +47 -0
  29. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +12 -6
  30. package/common/cpp/audioapi/core/utils/Constants.h +5 -0
  31. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +7 -0
  32. package/common/cpp/audioapi/core/utils/worklets/{UiWorkletsRunner.cpp → WorkletsRunner.cpp} +2 -2
  33. package/common/cpp/audioapi/core/utils/worklets/{UiWorkletsRunner.h → WorkletsRunner.h} +2 -2
  34. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +2 -1
  35. package/common/cpp/audioapi/jsi/JsiPromise.cpp +23 -27
  36. package/common/cpp/audioapi/jsi/JsiPromise.h +10 -1
  37. package/common/cpp/audioapi/utils/ThreadPool.hpp +104 -0
  38. package/common/cpp/test/AudioParamTest.cpp +204 -0
  39. package/common/cpp/test/CMakeLists.txt +3 -0
  40. package/common/cpp/test/GainTest.cpp +2 -1
  41. package/common/cpp/test/OscillatorTest.cpp +2 -1
  42. package/ios/audioapi/ios/core/IOSAudioRecorder.h +2 -1
  43. package/lib/commonjs/api.js +27 -0
  44. package/lib/commonjs/api.js.map +1 -1
  45. package/lib/commonjs/api.web.js +8 -0
  46. package/lib/commonjs/api.web.js.map +1 -1
  47. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +7 -7
  48. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  49. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +1 -6
  50. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  51. package/lib/commonjs/core/AudioBufferSourceNode.js +15 -0
  52. package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -1
  53. package/lib/commonjs/core/AudioContext.js +10 -1
  54. package/lib/commonjs/core/AudioContext.js.map +1 -1
  55. package/lib/commonjs/core/BaseAudioContext.js +35 -2
  56. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  57. package/lib/commonjs/core/ConstantSourceNode.js +17 -0
  58. package/lib/commonjs/core/ConstantSourceNode.js.map +1 -0
  59. package/lib/commonjs/core/OfflineAudioContext.js +11 -2
  60. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  61. package/lib/commonjs/core/WorkletProcessingNode.js +11 -0
  62. package/lib/commonjs/core/WorkletProcessingNode.js.map +1 -0
  63. package/lib/commonjs/core/WorkletSourceNode.js +11 -0
  64. package/lib/commonjs/core/WorkletSourceNode.js.map +1 -0
  65. package/lib/commonjs/utils/index.js.map +1 -1
  66. package/lib/commonjs/web-core/AudioContext.js +4 -0
  67. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  68. package/lib/commonjs/web-core/ConstantSourceNode.js +17 -0
  69. package/lib/commonjs/web-core/ConstantSourceNode.js.map +1 -0
  70. package/lib/commonjs/web-core/OfflineAudioContext.js +4 -0
  71. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  72. package/lib/module/api.js +4 -1
  73. package/lib/module/api.js.map +1 -1
  74. package/lib/module/api.web.js +1 -0
  75. package/lib/module/api.web.js.map +1 -1
  76. package/lib/module/core/AudioBufferBaseSourceNode.js +7 -7
  77. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  78. package/lib/module/core/AudioBufferQueueSourceNode.js +1 -6
  79. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  80. package/lib/module/core/AudioBufferSourceNode.js +15 -0
  81. package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
  82. package/lib/module/core/AudioContext.js +10 -1
  83. package/lib/module/core/AudioContext.js.map +1 -1
  84. package/lib/module/core/BaseAudioContext.js +35 -2
  85. package/lib/module/core/BaseAudioContext.js.map +1 -1
  86. package/lib/module/core/ConstantSourceNode.js +11 -0
  87. package/lib/module/core/ConstantSourceNode.js.map +1 -0
  88. package/lib/module/core/OfflineAudioContext.js +11 -2
  89. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  90. package/lib/module/core/WorkletProcessingNode.js +5 -0
  91. package/lib/module/core/WorkletProcessingNode.js.map +1 -0
  92. package/lib/module/core/WorkletSourceNode.js +5 -0
  93. package/lib/module/core/WorkletSourceNode.js.map +1 -0
  94. package/lib/module/utils/index.js.map +1 -1
  95. package/lib/module/web-core/AudioContext.js +4 -0
  96. package/lib/module/web-core/AudioContext.js.map +1 -1
  97. package/lib/module/web-core/ConstantSourceNode.js +11 -0
  98. package/lib/module/web-core/ConstantSourceNode.js.map +1 -0
  99. package/lib/module/web-core/OfflineAudioContext.js +4 -0
  100. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  101. package/lib/typescript/api.d.ts +6 -3
  102. package/lib/typescript/api.d.ts.map +1 -1
  103. package/lib/typescript/api.web.d.ts +1 -0
  104. package/lib/typescript/api.web.d.ts.map +1 -1
  105. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +2 -2
  106. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  107. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  108. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  109. package/lib/typescript/core/AudioBufferSourceNode.d.ts +4 -0
  110. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
  111. package/lib/typescript/core/AudioContext.d.ts +1 -0
  112. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  113. package/lib/typescript/core/BaseAudioContext.d.ts +8 -2
  114. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  115. package/lib/typescript/core/ConstantSourceNode.d.ts +9 -0
  116. package/lib/typescript/core/ConstantSourceNode.d.ts.map +1 -0
  117. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -0
  118. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  119. package/lib/typescript/core/WorkletProcessingNode.d.ts +4 -0
  120. package/lib/typescript/core/WorkletProcessingNode.d.ts.map +1 -0
  121. package/lib/typescript/core/WorkletSourceNode.d.ts +4 -0
  122. package/lib/typescript/core/WorkletSourceNode.d.ts.map +1 -0
  123. package/lib/typescript/events/types.d.ts +1 -0
  124. package/lib/typescript/events/types.d.ts.map +1 -1
  125. package/lib/typescript/interfaces.d.ts +16 -2
  126. package/lib/typescript/interfaces.d.ts.map +1 -1
  127. package/lib/typescript/types.d.ts +1 -0
  128. package/lib/typescript/types.d.ts.map +1 -1
  129. package/lib/typescript/utils/index.d.ts +1 -0
  130. package/lib/typescript/utils/index.d.ts.map +1 -1
  131. package/lib/typescript/web-core/AudioContext.d.ts +2 -0
  132. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  133. package/lib/typescript/web-core/BaseAudioContext.d.ts +2 -0
  134. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  135. package/lib/typescript/web-core/ConstantSourceNode.d.ts +8 -0
  136. package/lib/typescript/web-core/ConstantSourceNode.d.ts.map +1 -0
  137. package/lib/typescript/web-core/OfflineAudioContext.d.ts +2 -0
  138. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  139. package/package.json +1 -1
  140. package/src/api.ts +10 -2
  141. package/src/api.web.ts +1 -0
  142. package/src/core/AudioBufferBaseSourceNode.ts +9 -9
  143. package/src/core/AudioBufferQueueSourceNode.ts +1 -9
  144. package/src/core/AudioBufferSourceNode.ts +28 -0
  145. package/src/core/AudioContext.ts +12 -1
  146. package/src/core/BaseAudioContext.ts +90 -1
  147. package/src/core/ConstantSourceNode.ts +13 -0
  148. package/src/core/OfflineAudioContext.ts +18 -2
  149. package/src/core/WorkletProcessingNode.ts +3 -0
  150. package/src/core/WorkletSourceNode.ts +3 -0
  151. package/src/events/types.ts +1 -0
  152. package/src/interfaces.ts +42 -2
  153. package/src/types.ts +2 -0
  154. package/src/utils/index.ts +3 -0
  155. package/src/web-core/AudioContext.tsx +5 -0
  156. package/src/web-core/BaseAudioContext.tsx +2 -0
  157. package/src/web-core/ConstantSourceNode.tsx +12 -0
  158. package/src/web-core/OfflineAudioContext.tsx +5 -0
@@ -26,11 +26,10 @@ class AudioAPIModuleInstaller {
26
26
  const std::shared_ptr<react::CallInvoker> &jsCallInvoker,
27
27
  const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
28
28
  std::shared_ptr<worklets::WorkletRuntime> uiRuntime = nullptr) {
29
- auto workletRunner = std::make_shared<UiWorkletsRunner>(uiRuntime);
30
29
 
31
- auto createAudioContext = getCreateAudioContextFunction(jsiRuntime, jsCallInvoker, audioEventHandlerRegistry, workletRunner);
30
+ auto createAudioContext = getCreateAudioContextFunction(jsiRuntime, jsCallInvoker, audioEventHandlerRegistry, uiRuntime);
32
31
  auto createAudioRecorder = getCreateAudioRecorderFunction(jsiRuntime, audioEventHandlerRegistry);
33
- auto createOfflineAudioContext = getCreateOfflineAudioContextFunction(jsiRuntime, jsCallInvoker, audioEventHandlerRegistry, workletRunner);
32
+ auto createOfflineAudioContext = getCreateOfflineAudioContextFunction(jsiRuntime, jsCallInvoker, audioEventHandlerRegistry, uiRuntime);
34
33
 
35
34
  jsiRuntime->global().setProperty(*jsiRuntime, "createAudioContext", createAudioContext);
36
35
  jsiRuntime->global().setProperty(*jsiRuntime, "createAudioRecorder", createAudioRecorder);
@@ -45,12 +44,12 @@ class AudioAPIModuleInstaller {
45
44
  jsi::Runtime *jsiRuntime,
46
45
  const std::shared_ptr<react::CallInvoker> &jsCallInvoker,
47
46
  const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
48
- const std::shared_ptr<UiWorkletsRunner> &workletRunner) {
47
+ const std::weak_ptr<worklets::WorkletRuntime> &uiRuntime) {
49
48
  return jsi::Function::createFromHostFunction(
50
49
  *jsiRuntime,
51
50
  jsi::PropNameID::forAscii(*jsiRuntime, "createAudioContext"),
52
51
  0,
53
- [jsCallInvoker, audioEventHandlerRegistry, workletRunner](
52
+ [jsCallInvoker, audioEventHandlerRegistry, uiRuntime](
54
53
  jsi::Runtime &runtime,
55
54
  const jsi::Value &thisValue,
56
55
  const jsi::Value *args,
@@ -58,8 +57,17 @@ class AudioAPIModuleInstaller {
58
57
  std::shared_ptr<AudioContext> audioContext;
59
58
  auto sampleRate = static_cast<float>(args[0].getNumber());
60
59
  auto initSuspended = args[1].getBool();
61
- audioContext = std::make_shared<AudioContext>(sampleRate, initSuspended, audioEventHandlerRegistry, workletRunner);
62
60
 
61
+ #if RN_AUDIO_API_ENABLE_WORKLETS
62
+ auto runtimeRegistry = RuntimeRegistry{
63
+ .uiRuntime = uiRuntime,
64
+ .audioRuntime = worklets::extractWorkletRuntime(runtime, args[2])
65
+ };
66
+ #else
67
+ auto runtimeRegistry = RuntimeRegistry{};
68
+ #endif
69
+
70
+ audioContext = std::make_shared<AudioContext>(sampleRate, initSuspended, audioEventHandlerRegistry, runtimeRegistry);
63
71
  auto audioContextHostObject = std::make_shared<AudioContextHostObject>(
64
72
  audioContext, &runtime, jsCallInvoker);
65
73
 
@@ -72,12 +80,12 @@ class AudioAPIModuleInstaller {
72
80
  jsi::Runtime *jsiRuntime,
73
81
  const std::shared_ptr<react::CallInvoker> &jsCallInvoker,
74
82
  const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
75
- const std::shared_ptr<UiWorkletsRunner> &workletRunner) {
83
+ const std::weak_ptr<worklets::WorkletRuntime> &uiRuntime) {
76
84
  return jsi::Function::createFromHostFunction(
77
85
  *jsiRuntime,
78
86
  jsi::PropNameID::forAscii(*jsiRuntime, "createOfflineAudioContext"),
79
87
  0,
80
- [jsCallInvoker, audioEventHandlerRegistry, workletRunner](
88
+ [jsCallInvoker, audioEventHandlerRegistry, uiRuntime](
81
89
  jsi::Runtime &runtime,
82
90
  const jsi::Value &thisValue,
83
91
  const jsi::Value *args,
@@ -86,12 +94,21 @@ class AudioAPIModuleInstaller {
86
94
  auto length = static_cast<size_t>(args[1].getNumber());
87
95
  auto sampleRate = static_cast<float>(args[2].getNumber());
88
96
 
89
- auto offlineAudioContext = std::make_shared<OfflineAudioContext>(numberOfChannels, length, sampleRate, audioEventHandlerRegistry, workletRunner);
90
- auto audioContextHostObject = std::make_shared<OfflineAudioContextHostObject>(
91
- offlineAudioContext, &runtime, jsCallInvoker);
92
-
93
- return jsi::Object::createFromHostObject(
94
- runtime, audioContextHostObject);
97
+ #if RN_AUDIO_API_ENABLE_WORKLETS
98
+ auto runtimeRegistry = RuntimeRegistry{
99
+ .uiRuntime = uiRuntime,
100
+ .audioRuntime = worklets::extractWorkletRuntime(runtime, args[3])
101
+ };
102
+ #else
103
+ auto runtimeRegistry = RuntimeRegistry{};
104
+ #endif
105
+
106
+ auto offlineAudioContext = std::make_shared<OfflineAudioContext>(numberOfChannels, length, sampleRate, audioEventHandlerRegistry, runtimeRegistry);
107
+ auto audioContextHostObject = std::make_shared<OfflineAudioContextHostObject>(
108
+ offlineAudioContext, &runtime, jsCallInvoker);
109
+
110
+ return jsi::Object::createFromHostObject(
111
+ runtime, audioContextHostObject);
95
112
  });
96
113
  }
97
114
 
@@ -1,6 +1,7 @@
1
1
  #include <audioapi/HostObjects/BaseAudioContextHostObject.h>
2
2
 
3
3
  #include <audioapi/HostObjects/WorkletNodeHostObject.h>
4
+ #include <audioapi/HostObjects/WorkletProcessingNodeHostObject.h>
4
5
  #include <audioapi/HostObjects/analysis/AnalyserNodeHostObject.h>
5
6
  #include <audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h>
6
7
  #include <audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h>
@@ -10,11 +11,12 @@
10
11
  #include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
11
12
  #include <audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h>
12
13
  #include <audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h>
14
+ #include <audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h>
13
15
  #include <audioapi/HostObjects/sources/OscillatorNodeHostObject.h>
14
16
  #include <audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h>
15
17
  #include <audioapi/HostObjects/sources/StreamerNodeHostObject.h>
18
+ #include <audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h>
16
19
  #include <audioapi/core/BaseAudioContext.h>
17
- #include <audioapi/core/utils/worklets/UiWorkletsRunner.h>
18
20
 
19
21
  namespace audioapi {
20
22
 
@@ -32,10 +34,14 @@ BaseAudioContextHostObject::BaseAudioContextHostObject(
32
34
  JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, currentTime));
33
35
 
34
36
  addFunctions(
37
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createWorkletSourceNode),
35
38
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createWorkletNode),
39
+ JSI_EXPORT_FUNCTION(
40
+ BaseAudioContextHostObject, createWorkletProcessingNode),
36
41
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createRecorderAdapter),
37
42
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createOscillator),
38
43
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStreamer),
44
+ JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createConstantSource),
39
45
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createGain),
40
46
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStereoPanner),
41
47
  JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBiquadFilter),
@@ -68,16 +74,47 @@ JSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, currentTime) {
68
74
  return {context_->getCurrentTime()};
69
75
  }
70
76
 
77
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletSourceNode) {
78
+ #if RN_AUDIO_API_ENABLE_WORKLETS
79
+ auto shareableWorklet =
80
+ worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(
81
+ runtime, args[0]);
82
+ std::weak_ptr<worklets::WorkletRuntime> workletRuntime;
83
+ auto shouldUseUiRuntime = args[1].getBool();
84
+ if (shouldUseUiRuntime) {
85
+ workletRuntime = context_->runtimeRegistry_.uiRuntime;
86
+ } else {
87
+ workletRuntime = context_->runtimeRegistry_.audioRuntime;
88
+ }
89
+
90
+ auto workletSourceNode =
91
+ context_->createWorkletSourceNode(shareableWorklet, workletRuntime);
92
+ auto workletSourceNodeHostObject =
93
+ std::make_shared<WorkletSourceNodeHostObject>(workletSourceNode);
94
+ return jsi::Object::createFromHostObject(
95
+ runtime, workletSourceNodeHostObject);
96
+ #endif
97
+ return jsi::Value::undefined();
98
+ }
99
+
71
100
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletNode) {
72
101
  #if RN_AUDIO_API_ENABLE_WORKLETS
73
102
  auto shareableWorklet =
74
103
  worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(
75
104
  runtime, args[0]);
76
- auto bufferLength = static_cast<size_t>(args[1].getNumber());
77
- auto inputChannelCount = static_cast<size_t>(args[2].getNumber());
105
+
106
+ std::weak_ptr<worklets::WorkletRuntime> workletRuntime;
107
+ auto shouldUseUiRuntime = args[1].getBool();
108
+ if (shouldUseUiRuntime) {
109
+ workletRuntime = context_->runtimeRegistry_.uiRuntime;
110
+ } else {
111
+ workletRuntime = context_->runtimeRegistry_.audioRuntime;
112
+ }
113
+ auto bufferLength = static_cast<size_t>(args[2].getNumber());
114
+ auto inputChannelCount = static_cast<size_t>(args[3].getNumber());
78
115
 
79
116
  auto workletNode = context_->createWorkletNode(
80
- shareableWorklet, bufferLength, inputChannelCount);
117
+ shareableWorklet, workletRuntime, bufferLength, inputChannelCount);
81
118
  auto workletNodeHostObject =
82
119
  std::make_shared<WorkletNodeHostObject>(workletNode);
83
120
  return jsi::Object::createFromHostObject(runtime, workletNodeHostObject);
@@ -85,6 +122,32 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletNode) {
85
122
  return jsi::Value::undefined();
86
123
  }
87
124
 
125
+ JSI_HOST_FUNCTION_IMPL(
126
+ BaseAudioContextHostObject,
127
+ createWorkletProcessingNode) {
128
+ #if RN_AUDIO_API_ENABLE_WORKLETS
129
+ auto shareableWorklet =
130
+ worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(
131
+ runtime, args[0]);
132
+
133
+ std::weak_ptr<worklets::WorkletRuntime> workletRuntime;
134
+ auto shouldUseUiRuntime = args[1].getBool();
135
+ if (shouldUseUiRuntime) {
136
+ workletRuntime = context_->runtimeRegistry_.uiRuntime;
137
+ } else {
138
+ workletRuntime = context_->runtimeRegistry_.audioRuntime;
139
+ }
140
+
141
+ auto workletProcessingNode =
142
+ context_->createWorkletProcessingNode(shareableWorklet, workletRuntime);
143
+ auto workletProcessingNodeHostObject =
144
+ std::make_shared<WorkletProcessingNodeHostObject>(workletProcessingNode);
145
+ return jsi::Object::createFromHostObject(
146
+ runtime, workletProcessingNodeHostObject);
147
+ #endif
148
+ return jsi::Value::undefined();
149
+ }
150
+
88
151
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createRecorderAdapter) {
89
152
  auto recorderAdapter = context_->createRecorderAdapter();
90
153
  auto recorderAdapterHostObject =
@@ -108,6 +171,13 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createStreamer) {
108
171
  return object;
109
172
  }
110
173
 
174
+ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createConstantSource) {
175
+ auto constantSource = context_->createConstantSource();
176
+ auto constantSourceHostObject =
177
+ std::make_shared<ConstantSourceNodeHostObject>(constantSource);
178
+ return jsi::Object::createFromHostObject(runtime, constantSourceHostObject);
179
+ }
180
+
111
181
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createGain) {
112
182
  auto gain = context_->createGain();
113
183
  auto gainHostObject = std::make_shared<GainNodeHostObject>(gain);
@@ -26,10 +26,13 @@ class BaseAudioContextHostObject : public JsiHostObject {
26
26
  JSI_PROPERTY_GETTER_DECL(sampleRate);
27
27
  JSI_PROPERTY_GETTER_DECL(currentTime);
28
28
 
29
+ JSI_HOST_FUNCTION_DECL(createWorkletSourceNode);
29
30
  JSI_HOST_FUNCTION_DECL(createWorkletNode);
31
+ JSI_HOST_FUNCTION_DECL(createWorkletProcessingNode);
30
32
  JSI_HOST_FUNCTION_DECL(createRecorderAdapter);
31
33
  JSI_HOST_FUNCTION_DECL(createOscillator);
32
34
  JSI_HOST_FUNCTION_DECL(createStreamer);
35
+ JSI_HOST_FUNCTION_DECL(createConstantSource);
33
36
  JSI_HOST_FUNCTION_DECL(createGain);
34
37
  JSI_HOST_FUNCTION_DECL(createStereoPanner);
35
38
  JSI_HOST_FUNCTION_DECL(createBiquadFilter);
@@ -0,0 +1,18 @@
1
+ #pragma once
2
+
3
+ #include <audioapi/HostObjects/AudioNodeHostObject.h>
4
+ #include <audioapi/core/effects/WorkletProcessingNode.h>
5
+
6
+ #include <memory>
7
+ #include <vector>
8
+
9
+ namespace audioapi {
10
+ using namespace facebook;
11
+
12
+ class WorkletProcessingNodeHostObject : public AudioNodeHostObject {
13
+ public:
14
+ explicit WorkletProcessingNodeHostObject(const std::shared_ptr<WorkletProcessingNode> &node)
15
+ : AudioNodeHostObject(node) {
16
+ }
17
+ };
18
+ } // namespace audioapi
@@ -19,7 +19,8 @@ AudioBufferSourceNodeHostObject::AudioBufferSourceNodeHostObject(
19
19
  JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loop),
20
20
  JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopSkip),
21
21
  JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopStart),
22
- JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopEnd));
22
+ JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopEnd),
23
+ JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, onLoopEnded));
23
24
 
24
25
  // start method is overridden in this class
25
26
  functions_->erase("start");
@@ -29,6 +30,16 @@ AudioBufferSourceNodeHostObject::AudioBufferSourceNodeHostObject(
29
30
  JSI_EXPORT_FUNCTION(AudioBufferSourceNodeHostObject, setBuffer));
30
31
  }
31
32
 
33
+ AudioBufferSourceNodeHostObject::~AudioBufferSourceNodeHostObject() {
34
+ auto audioBufferSourceNode =
35
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
36
+
37
+ // When JSI object is garbage collected (together with the eventual callback),
38
+ // underlying source node might still be active and try to call the
39
+ // non-existing callback.
40
+ audioBufferSourceNode->clearOnLoopEndedCallback();
41
+ }
42
+
32
43
  JSI_PROPERTY_GETTER_IMPL(AudioBufferSourceNodeHostObject, loop) {
33
44
  auto audioBufferSourceNode =
34
45
  std::static_pointer_cast<AudioBufferSourceNode>(node_);
@@ -94,6 +105,14 @@ JSI_PROPERTY_SETTER_IMPL(AudioBufferSourceNodeHostObject, loopEnd) {
94
105
  audioBufferSourceNode->setLoopEnd(value.getNumber());
95
106
  }
96
107
 
108
+ JSI_PROPERTY_SETTER_IMPL(AudioBufferSourceNodeHostObject, onLoopEnded) {
109
+ auto audioBufferSourceNode =
110
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
111
+
112
+ audioBufferSourceNode->setOnLoopEndedCallbackId(
113
+ std::stoull(value.getString(runtime).utf8(runtime)));
114
+ }
115
+
97
116
  JSI_HOST_FUNCTION_IMPL(AudioBufferSourceNodeHostObject, start) {
98
117
  auto when = args[0].getNumber();
99
118
  auto offset = args[1].getNumber();
@@ -16,6 +16,8 @@ class AudioBufferSourceNodeHostObject
16
16
  explicit AudioBufferSourceNodeHostObject(
17
17
  const std::shared_ptr<AudioBufferSourceNode> &node);
18
18
 
19
+ ~AudioBufferSourceNodeHostObject() override;
20
+
19
21
  JSI_PROPERTY_GETTER_DECL(loop);
20
22
  JSI_PROPERTY_GETTER_DECL(loopSkip);
21
23
  JSI_PROPERTY_GETTER_DECL(buffer);
@@ -26,6 +28,7 @@ class AudioBufferSourceNodeHostObject
26
28
  JSI_PROPERTY_SETTER_DECL(loopSkip);
27
29
  JSI_PROPERTY_SETTER_DECL(loopStart);
28
30
  JSI_PROPERTY_SETTER_DECL(loopEnd);
31
+ JSI_PROPERTY_SETTER_DECL(onLoopEnded);
29
32
 
30
33
  JSI_HOST_FUNCTION_DECL(start);
31
34
  JSI_HOST_FUNCTION_DECL(setBuffer);
@@ -0,0 +1,19 @@
1
+ #include <audioapi/HostObjects/AudioParamHostObject.h>
2
+ #include <audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h>
3
+ #include <audioapi/core/sources/ConstantSourceNode.h>
4
+
5
+ namespace audioapi {
6
+
7
+ ConstantSourceNodeHostObject::ConstantSourceNodeHostObject(
8
+ const std::shared_ptr<ConstantSourceNode> &node)
9
+ : AudioScheduledSourceNodeHostObject(node) {
10
+ addGetters(JSI_EXPORT_PROPERTY_GETTER(ConstantSourceNodeHostObject, offset));
11
+ }
12
+
13
+ JSI_PROPERTY_GETTER_IMPL(ConstantSourceNodeHostObject, offset) {
14
+ auto constantSourceNode = std::static_pointer_cast<ConstantSourceNode>(node_);
15
+ auto offsetParam_ = std::make_shared<AudioParamHostObject>(
16
+ constantSourceNode->getOffsetParam());
17
+ return jsi::Object::createFromHostObject(runtime, offsetParam_);
18
+ }
19
+ } // namespace audioapi
@@ -0,0 +1,21 @@
1
+ #pragma once
2
+
3
+ #include <audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h>
4
+
5
+ #include <memory>
6
+ #include <string>
7
+ #include <vector>
8
+
9
+ namespace audioapi {
10
+ using namespace facebook;
11
+
12
+ class ConstantSourceNode;
13
+
14
+ class ConstantSourceNodeHostObject : public AudioScheduledSourceNodeHostObject {
15
+ public:
16
+ explicit ConstantSourceNodeHostObject(
17
+ const std::shared_ptr<ConstantSourceNode> &node);
18
+
19
+ JSI_PROPERTY_GETTER_DECL(offset);
20
+ };
21
+ } // namespace audioapi
@@ -0,0 +1,18 @@
1
+ #pragma once
2
+
3
+ #include <audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h>
4
+ #include <audioapi/core/sources/WorkletSourceNode.h>
5
+
6
+ #include <memory>
7
+ #include <vector>
8
+
9
+ namespace audioapi {
10
+ using namespace facebook;
11
+
12
+ class WorkletSourceNodeHostObject : public AudioScheduledSourceNodeHostObject {
13
+ public:
14
+ explicit WorkletSourceNodeHostObject(const std::shared_ptr<WorkletSourceNode> &node)
15
+ : AudioScheduledSourceNodeHostObject(node) {
16
+ }
17
+ };
18
+ } // namespace audioapi
@@ -15,8 +15,8 @@ AudioContext::AudioContext(
15
15
  bool initSuspended,
16
16
  const std::shared_ptr<IAudioEventHandlerRegistry>
17
17
  &audioEventHandlerRegistry,
18
- const std::shared_ptr<UiWorkletsRunner> &workletRunner)
19
- : BaseAudioContext(audioEventHandlerRegistry, workletRunner) {
18
+ const RuntimeRegistry &runtimeRegistry)
19
+ : BaseAudioContext(audioEventHandlerRegistry, runtimeRegistry) {
20
20
  #ifdef ANDROID
21
21
  audioPlayer_ = std::make_shared<AudioPlayer>(
22
22
  this->renderAudio(), sampleRate, destination_->getChannelCount());
@@ -1,7 +1,7 @@
1
1
  #pragma once
2
2
 
3
3
  #include <audioapi/core/BaseAudioContext.h>
4
- #include <audioapi/core/utils/worklets/UiWorkletsRunner.h>
4
+ #include <audioapi/core/utils/worklets/SafeIncludes.h>
5
5
 
6
6
  #include <memory>
7
7
  #include <functional>
@@ -15,7 +15,7 @@ class IOSAudioPlayer;
15
15
 
16
16
  class AudioContext : public BaseAudioContext {
17
17
  public:
18
- explicit AudioContext(float sampleRate, bool initSuspended, const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const std::shared_ptr<UiWorkletsRunner> &workletRunner);
18
+ explicit AudioContext(float sampleRate, bool initSuspended, const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const RuntimeRegistry &runtimeRegistry);
19
19
  ~AudioContext() override;
20
20
 
21
21
  void close();
@@ -219,9 +219,9 @@ void AudioParam::setValueCurveAtTime(
219
219
  (time - startTime)));
220
220
  // Calculate interpolation factor between adjacent array elements
221
221
  auto factor = static_cast<float>(
222
- k -
223
222
  (time - startTime) * static_cast<double>(length - 1) /
224
- (endTime - startTime));
223
+ (endTime - startTime) -
224
+ k);
225
225
  return dsp::linearInterpolate(values->data(), k, k + 1, factor);
226
226
  }
227
227
 
@@ -5,12 +5,15 @@
5
5
  #include <audioapi/core/effects/GainNode.h>
6
6
  #include <audioapi/core/effects/StereoPannerNode.h>
7
7
  #include <audioapi/core/effects/WorkletNode.h>
8
+ #include <audioapi/core/effects/WorkletProcessingNode.h>
8
9
  #include <audioapi/core/sources/AudioBuffer.h>
9
10
  #include <audioapi/core/sources/AudioBufferQueueSourceNode.h>
10
11
  #include <audioapi/core/sources/AudioBufferSourceNode.h>
12
+ #include <audioapi/core/sources/ConstantSourceNode.h>
11
13
  #include <audioapi/core/sources/OscillatorNode.h>
12
14
  #include <audioapi/core/sources/RecorderAdapterNode.h>
13
15
  #include <audioapi/core/sources/StreamerNode.h>
16
+ #include <audioapi/core/sources/WorkletSourceNode.h>
14
17
  #include <audioapi/core/utils/AudioDecoder.h>
15
18
  #include <audioapi/core/utils/AudioNodeManager.h>
16
19
  #include <audioapi/core/utils/worklets/SafeIncludes.h>
@@ -24,12 +27,12 @@ namespace audioapi {
24
27
  BaseAudioContext::BaseAudioContext(
25
28
  const std::shared_ptr<IAudioEventHandlerRegistry>
26
29
  &audioEventHandlerRegistry,
27
- const std::shared_ptr<UiWorkletsRunner> &workletRunner) {
30
+ const RuntimeRegistry &runtimeRegistry) {
28
31
  nodeManager_ = std::make_shared<AudioNodeManager>();
29
32
  destination_ = std::make_shared<AudioDestinationNode>(this);
30
33
 
31
34
  audioEventHandlerRegistry_ = audioEventHandlerRegistry;
32
- workletRunner_ = workletRunner;
35
+ runtimeRegistry_ = runtimeRegistry;
33
36
  }
34
37
 
35
38
  std::string BaseAudioContext::getState() {
@@ -62,16 +65,36 @@ std::shared_ptr<AudioDestinationNode> BaseAudioContext::getDestination() {
62
65
  return destination_;
63
66
  }
64
67
 
68
+ std::shared_ptr<WorkletSourceNode> BaseAudioContext::createWorkletSourceNode(
69
+ std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
70
+ std::weak_ptr<worklets::WorkletRuntime> runtime) {
71
+ auto workletSourceNode =
72
+ std::make_shared<WorkletSourceNode>(this, shareableWorklet, runtime);
73
+ nodeManager_->addSourceNode(workletSourceNode);
74
+ return workletSourceNode;
75
+ }
76
+
65
77
  std::shared_ptr<WorkletNode> BaseAudioContext::createWorkletNode(
66
78
  std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
79
+ std::weak_ptr<worklets::WorkletRuntime> runtime,
67
80
  size_t bufferLength,
68
81
  size_t inputChannelCount) {
69
82
  auto workletNode = std::make_shared<WorkletNode>(
70
- this, shareableWorklet, bufferLength, inputChannelCount);
83
+ this, shareableWorklet, runtime, bufferLength, inputChannelCount);
71
84
  nodeManager_->addProcessingNode(workletNode);
72
85
  return workletNode;
73
86
  }
74
87
 
88
+ std::shared_ptr<WorkletProcessingNode>
89
+ BaseAudioContext::createWorkletProcessingNode(
90
+ std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
91
+ std::weak_ptr<worklets::WorkletRuntime> runtime) {
92
+ auto workletProcessingNode =
93
+ std::make_shared<WorkletProcessingNode>(this, shareableWorklet, runtime);
94
+ nodeManager_->addProcessingNode(workletProcessingNode);
95
+ return workletProcessingNode;
96
+ }
97
+
75
98
  std::shared_ptr<RecorderAdapterNode> BaseAudioContext::createRecorderAdapter() {
76
99
  auto recorderAdapter = std::make_shared<RecorderAdapterNode>(this);
77
100
  nodeManager_->addProcessingNode(recorderAdapter);
@@ -84,6 +107,12 @@ std::shared_ptr<OscillatorNode> BaseAudioContext::createOscillator() {
84
107
  return oscillator;
85
108
  }
86
109
 
110
+ std::shared_ptr<ConstantSourceNode> BaseAudioContext::createConstantSource() {
111
+ auto constantSource = std::make_shared<ConstantSourceNode>(this);
112
+ nodeManager_->addSourceNode(constantSource);
113
+ return constantSource;
114
+ }
115
+
87
116
  #ifndef AUDIO_API_TEST_SUITE
88
117
  std::shared_ptr<StreamerNode> BaseAudioContext::createStreamer() {
89
118
  auto streamer = std::make_shared<StreamerNode>(this);
@@ -2,7 +2,6 @@
2
2
 
3
3
  #include <audioapi/core/types/ContextState.h>
4
4
  #include <audioapi/core/types/OscillatorType.h>
5
- #include <audioapi/core/utils/worklets/UiWorkletsRunner.h>
6
5
  #include <audioapi/core/utils/worklets/SafeIncludes.h>
7
6
 
8
7
  #include <functional>
@@ -21,6 +20,7 @@ class GainNode;
21
20
  class AudioBuffer;
22
21
  class PeriodicWave;
23
22
  class OscillatorNode;
23
+ class ConstantSourceNode;
24
24
  class StereoPannerNode;
25
25
  class AudioNodeManager;
26
26
  class BiquadFilterNode;
@@ -32,12 +32,14 @@ class AnalyserNode;
32
32
  class AudioEventHandlerRegistry;
33
33
  class IAudioEventHandlerRegistry;
34
34
  class RecorderAdapterNode;
35
+ class WorkletSourceNode;
35
36
  class WorkletNode;
37
+ class WorkletProcessingNode;
36
38
  class StreamerNode;
37
39
 
38
40
  class BaseAudioContext {
39
41
  public:
40
- explicit BaseAudioContext(const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const std::shared_ptr<UiWorkletsRunner> &workletRunner);
42
+ explicit BaseAudioContext(const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const RuntimeRegistry &runtimeRegistry);
41
43
  virtual ~BaseAudioContext() = default;
42
44
 
43
45
  std::string getState();
@@ -47,8 +49,11 @@ class BaseAudioContext {
47
49
  std::shared_ptr<AudioDestinationNode> getDestination();
48
50
 
49
51
  std::shared_ptr<RecorderAdapterNode> createRecorderAdapter();
50
- std::shared_ptr<WorkletNode> createWorkletNode(std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet, size_t bufferLength, size_t inputChannelCount);
52
+ std::shared_ptr<WorkletSourceNode> createWorkletSourceNode(std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet, std::weak_ptr<worklets::WorkletRuntime> runtime);
53
+ std::shared_ptr<WorkletNode> createWorkletNode(std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet, std::weak_ptr<worklets::WorkletRuntime> runtime, size_t bufferLength, size_t inputChannelCount);
54
+ std::shared_ptr<WorkletProcessingNode> createWorkletProcessingNode(std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet, std::weak_ptr<worklets::WorkletRuntime> runtime);
51
55
  std::shared_ptr<OscillatorNode> createOscillator();
56
+ std::shared_ptr<ConstantSourceNode> createConstantSource();
52
57
  std::shared_ptr<StreamerNode> createStreamer();
53
58
  std::shared_ptr<GainNode> createGain();
54
59
  std::shared_ptr<StereoPannerNode> createStereoPanner();
@@ -96,7 +101,7 @@ class BaseAudioContext {
96
101
 
97
102
  public:
98
103
  std::shared_ptr<IAudioEventHandlerRegistry> audioEventHandlerRegistry_;
99
- std::shared_ptr<UiWorkletsRunner> workletRunner_;
104
+ RuntimeRegistry runtimeRegistry_;
100
105
  };
101
106
 
102
107
  } // namespace audioapi
@@ -24,8 +24,8 @@ OfflineAudioContext::OfflineAudioContext(
24
24
  float sampleRate,
25
25
  const std::shared_ptr<IAudioEventHandlerRegistry>
26
26
  &audioEventHandlerRegistry,
27
- const std::shared_ptr<UiWorkletsRunner> &workletRunner)
28
- : BaseAudioContext(audioEventHandlerRegistry, workletRunner),
27
+ const RuntimeRegistry &runtimeRegistry)
28
+ : BaseAudioContext(audioEventHandlerRegistry, runtimeRegistry),
29
29
  length_(length),
30
30
  numberOfChannels_(numberOfChannels),
31
31
  currentSampleFrame_(0) {
@@ -1,7 +1,7 @@
1
1
  #pragma once
2
2
 
3
3
  #include "BaseAudioContext.h"
4
- #include <audioapi/core/utils/worklets/UiWorkletsRunner.h>
4
+ #include <audioapi/core/utils/worklets/SafeIncludes.h>
5
5
 
6
6
  #include <mutex>
7
7
  #include <map>
@@ -15,7 +15,7 @@ using OfflineAudioContextResultCallback = std::function<void(std::shared_ptr<Aud
15
15
 
16
16
  class OfflineAudioContext : public BaseAudioContext {
17
17
  public:
18
- explicit OfflineAudioContext(int numberOfChannels, size_t length, float sampleRate, const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const std::shared_ptr<UiWorkletsRunner> &workletRunner);
18
+ explicit OfflineAudioContext(int numberOfChannels, size_t length, float sampleRate, const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const RuntimeRegistry &runtimeRegistry);
19
19
  ~OfflineAudioContext() override;
20
20
 
21
21
  void resume();
@@ -5,12 +5,13 @@ namespace audioapi {
5
5
  WorkletNode::WorkletNode(
6
6
  BaseAudioContext *context,
7
7
  std::shared_ptr<worklets::SerializableWorklet> &worklet,
8
+ std::weak_ptr<worklets::WorkletRuntime> runtime,
8
9
  size_t bufferLength,
9
10
  size_t inputChannelCount)
10
11
  : AudioNode(context),
11
12
  buffRealLength_(bufferLength * sizeof(float)),
12
13
  bufferLength_(bufferLength),
13
- workletRunner_(context->workletRunner_),
14
+ workletRunner_(runtime),
14
15
  shareableWorklet_(worklet),
15
16
  inputChannelCount_(inputChannelCount),
16
17
  curBuffIndex_(0) {
@@ -57,7 +58,7 @@ void WorkletNode::processNode(
57
58
  if (curBuffIndex_ == bufferLength_) {
58
59
  // Reset buffer index, channel buffers and execute worklet
59
60
  curBuffIndex_ = 0;
60
- workletRunner_->executeOnRuntimeGuardedSync(
61
+ workletRunner_.executeOnRuntimeGuardedSync(
61
62
  [this, channelCount_](jsi::Runtime &uiRuntimeRaw) {
62
63
  /// Arguments preparation
63
64
  auto jsArray = jsi::Array(uiRuntimeRaw, channelCount_);
@@ -73,7 +74,7 @@ void WorkletNode::processNode(
73
74
  jsArray.setExternalMemoryPressure(
74
75
  uiRuntimeRaw, channelCount_ * buffRealLength_);
75
76
 
76
- workletRunner_->executeWorklet(
77
+ workletRunner_.executeWorklet(
77
78
  shareableWorklet_,
78
79
  std::move(jsArray),
79
80
  jsi::Value(uiRuntimeRaw, static_cast<int>(channelCount_)));
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
  #include <jsi/jsi.h>
5
- #include <audioapi/core/utils/worklets/UiWorkletsRunner.h>
5
+ #include <audioapi/core/utils/worklets/WorkletsRunner.h>
6
6
  #include <audioapi/core/AudioNode.h>
7
7
  #include <audioapi/core/BaseAudioContext.h>
8
8
  #include <audioapi/utils/AudioBus.h>
@@ -20,10 +20,10 @@ class WorkletNode : public AudioNode {
20
20
  explicit WorkletNode(
21
21
  BaseAudioContext *context,
22
22
  std::shared_ptr<worklets::SerializableWorklet> &worklet,
23
+ std::weak_ptr<worklets::WorkletRuntime> runtime,
23
24
  size_t bufferLength,
24
25
  size_t inputChannelCount
25
26
  ) : AudioNode(context) {}
26
- ~WorkletNode() override = default;
27
27
 
28
28
  protected:
29
29
  void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override {}
@@ -37,6 +37,7 @@ class WorkletNode : public AudioNode {
37
37
  explicit WorkletNode(
38
38
  BaseAudioContext *context,
39
39
  std::shared_ptr<worklets::SerializableWorklet> &worklet,
40
+ std::weak_ptr<worklets::WorkletRuntime> runtime,
40
41
  size_t bufferLength,
41
42
  size_t inputChannelCount
42
43
  );
@@ -48,7 +49,7 @@ class WorkletNode : public AudioNode {
48
49
 
49
50
 
50
51
  private:
51
- std::shared_ptr<UiWorkletsRunner> workletRunner_;
52
+ WorkletsRunner workletRunner_;
52
53
  std::shared_ptr<worklets::SerializableWorklet> shareableWorklet_;
53
54
  std::vector<uint8_t*> buffs_;
54
55