Skip to content

Commit 141c86f

Browse files
mdydekponeciak57
andauthored
Refactor/added memory pressure (#799)
* feat: implemented alt creeateAsyncPromise and reimplemented Promise * feat: better promise handling * refactor: memory pressure added * refactor: get rid of magic numbers --------- Co-authored-by: poneciak <poneciak@gmail.com>
1 parent c8d92af commit 141c86f

File tree

8 files changed

+47
-17
lines changed

8 files changed

+47
-17
lines changed

packages/react-native-audio-api/common/cpp/audioapi/AudioAPIModuleInstaller.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,12 @@ class AudioAPIModuleInstaller {
190190
std::make_shared<AudioRecorderHostObject>(
191191
audioEventHandlerRegistry, sampleRate, bufferLength);
192192

193-
return jsi::Object::createFromHostObject(
193+
auto jsiObject = jsi::Object::createFromHostObject(
194194
runtime, audioRecorderHostObject);
195+
jsiObject.setExternalMemoryPressure(
196+
runtime, sizeof(float) * bufferLength); // rough estimate of underlying buffer
197+
198+
return jsiObject;
195199
});
196200
}
197201

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,13 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletNode) {
121121
shouldLockRuntime);
122122
auto workletNodeHostObject =
123123
std::make_shared<WorkletNodeHostObject>(workletNode);
124-
return jsi::Object::createFromHostObject(runtime, workletNodeHostObject);
124+
auto jsiObject =
125+
jsi::Object::createFromHostObject(runtime, workletNodeHostObject);
126+
jsiObject.setExternalMemoryPressure(
127+
runtime,
128+
sizeof(float) * bufferLength *
129+
inputChannelCount); // rough estimate of underlying buffer
130+
return jsiObject;
125131
#endif
126132
return jsi::Value::undefined();
127133
}
@@ -285,6 +291,14 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createConvolver) {
285291
}
286292
auto convolverHostObject =
287293
std::make_shared<ConvolverNodeHostObject>(convolver);
288-
return jsi::Object::createFromHostObject(runtime, convolverHostObject);
294+
auto jsiObject =
295+
jsi::Object::createFromHostObject(runtime, convolverHostObject);
296+
if (!args[0].isUndefined()) {
297+
auto bufferHostObject =
298+
args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
299+
jsiObject.setExternalMemoryPressure(
300+
runtime, bufferHostObject->getSizeInBytes());
301+
}
302+
return jsiObject;
289303
}
290304
} // namespace audioapi

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ ConvolverNodeHostObject::ConvolverNodeHostObject(
1111
addGetters(
1212
JSI_EXPORT_PROPERTY_GETTER(ConvolverNodeHostObject, normalize),
1313
JSI_EXPORT_PROPERTY_GETTER(ConvolverNodeHostObject, buffer));
14-
addSetters(
15-
JSI_EXPORT_PROPERTY_SETTER(ConvolverNodeHostObject, normalize),
16-
JSI_EXPORT_PROPERTY_SETTER(ConvolverNodeHostObject, buffer));
14+
addSetters(JSI_EXPORT_PROPERTY_SETTER(ConvolverNodeHostObject, normalize));
15+
addFunctions(JSI_EXPORT_FUNCTION(ConvolverNodeHostObject, setBuffer));
1716
}
1817

1918
JSI_PROPERTY_GETTER_IMPL(ConvolverNodeHostObject, normalize) {
@@ -25,23 +24,29 @@ JSI_PROPERTY_GETTER_IMPL(ConvolverNodeHostObject, buffer) {
2524
auto convolverNode = std::static_pointer_cast<ConvolverNode>(node_);
2625
auto buffer = convolverNode->getBuffer();
2726
auto bufferHostObject = std::make_shared<AudioBufferHostObject>(buffer);
28-
return jsi::Object::createFromHostObject(runtime, bufferHostObject);
27+
auto jsiObject = jsi::Object::createFromHostObject(runtime, bufferHostObject);
28+
jsiObject.setExternalMemoryPressure(
29+
runtime, bufferHostObject->getSizeInBytes() + 16);
30+
return jsiObject;
2931
}
3032

3133
JSI_PROPERTY_SETTER_IMPL(ConvolverNodeHostObject, normalize) {
3234
auto convolverNode = std::static_pointer_cast<ConvolverNode>(node_);
3335
convolverNode->setNormalize(value.getBool());
3436
}
3537

36-
JSI_PROPERTY_SETTER_IMPL(ConvolverNodeHostObject, buffer) {
38+
JSI_HOST_FUNCTION_IMPL(ConvolverNodeHostObject, setBuffer) {
3739
auto convolverNode = std::static_pointer_cast<ConvolverNode>(node_);
38-
if (value.isNull()) {
40+
if (args[0].isUndefined()) {
3941
convolverNode->setBuffer(nullptr);
40-
return;
42+
return jsi::Value::undefined();
4143
}
4244

4345
auto bufferHostObject =
44-
value.getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
46+
args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
4547
convolverNode->setBuffer(bufferHostObject->audioBuffer_);
48+
thisValue.asObject(runtime).setExternalMemoryPressure(
49+
runtime, bufferHostObject->getSizeInBytes() + 16);
50+
return jsi::Value::undefined();
4651
}
47-
} // namespace audioapi
52+
} // namespace audioapi

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ class ConvolverNodeHostObject : public AudioNodeHostObject {
1515
JSI_PROPERTY_GETTER_DECL(normalize);
1616
JSI_PROPERTY_GETTER_DECL(buffer);
1717
JSI_PROPERTY_SETTER_DECL(normalize);
18-
JSI_PROPERTY_SETTER_DECL(buffer);
18+
JSI_HOST_FUNCTION_DECL(setBuffer);
1919
};
2020
} // namespace audioapi

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ JSI_HOST_FUNCTION_IMPL(AudioBufferHostObject, getChannelData) {
5252
auto float32Array = float32ArrayCtor.callAsConstructor(runtime, arrayBuffer)
5353
.getObject(runtime);
5454

55+
float32Array.setExternalMemoryPressure(runtime, audioArrayBuffer->size());
56+
5557
return float32Array;
5658
}
5759

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,10 @@ JSI_PROPERTY_GETTER_IMPL(AudioBufferSourceNodeHostObject, buffer) {
6464
}
6565

6666
auto bufferHostObject = std::make_shared<AudioBufferHostObject>(buffer);
67-
return jsi::Object::createFromHostObject(runtime, bufferHostObject);
67+
auto jsiObject = jsi::Object::createFromHostObject(runtime, bufferHostObject);
68+
jsiObject.setExternalMemoryPressure(
69+
runtime, bufferHostObject->getSizeInBytes() + 16);
70+
return jsiObject;
6871
}
6972

7073
JSI_PROPERTY_GETTER_IMPL(AudioBufferSourceNodeHostObject, loopStart) {

packages/react-native-audio-api/src/core/ConvolverNode.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ export default class ConvolverNode extends AudioNode {
1919

2020
public set buffer(buffer: AudioBuffer | null) {
2121
if (!buffer) {
22-
(this.node as IConvolverNode).buffer = null;
22+
(this.node as IConvolverNode).setBuffer(null);
2323
return;
2424
}
25-
(this.node as IConvolverNode).buffer = buffer.buffer;
25+
(this.node as IConvolverNode).setBuffer(buffer.buffer);
2626
}
2727

2828
public get normalize(): boolean {

packages/react-native-audio-api/src/interfaces.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,10 @@ export interface IAudioBufferQueueSourceNode
195195
}
196196

197197
export interface IConvolverNode extends IAudioNode {
198-
buffer: IAudioBuffer | null;
198+
readonly buffer: IAudioBuffer | null;
199199
normalize: boolean;
200+
201+
setBuffer: (audioBuffer: IAudioBuffer | null) => void;
200202
}
201203

202204
export interface IAudioBuffer {

0 commit comments

Comments
 (0)