react-native-audio-api 0.8.3-nightly-d178688-20250925 → 0.8.3-nightly-2295d0d-20250926
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RNAudioAPI.podspec +8 -5
- package/android/build.gradle +44 -4
- package/android/src/main/cpp/audioapi/CMakeLists.txt +65 -0
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +29 -1
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +14 -0
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +7 -1
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +6 -1
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +1 -1
- package/android/src/main/cpp/audioapi/android/core/NativeAudioRecorder.hpp +36 -0
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +11 -1
- package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +24 -0
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +15 -2
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +31 -13
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +57 -0
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +6 -46
- package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +70 -6
- package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.h +10 -66
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +105 -0
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +17 -91
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +292 -6
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +26 -242
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +70 -0
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +6 -50
- package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +18 -0
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +148 -0
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.h +37 -0
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +92 -0
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +29 -0
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +20 -0
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h +19 -0
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +21 -0
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +21 -0
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +41 -0
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +28 -0
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +69 -0
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +33 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +73 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +29 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +94 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +46 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +60 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +25 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +133 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +34 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +52 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h +25 -0
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +55 -0
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +27 -0
- package/common/cpp/audioapi/HostObjects/{RecorderAdapterNodeHostObject.h → sources/RecorderAdapterNodeHostObject.h} +1 -2
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +22 -0
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +28 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +3 -2
- package/common/cpp/audioapi/core/AudioContext.h +2 -1
- package/common/cpp/audioapi/core/AudioNode.h +1 -1
- package/common/cpp/audioapi/core/AudioParam.h +1 -1
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +15 -1
- package/common/cpp/audioapi/core/BaseAudioContext.h +7 -3
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +4 -3
- package/common/cpp/audioapi/core/OfflineAudioContext.h +2 -1
- package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +1 -1
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +1 -1
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +86 -0
- package/common/cpp/audioapi/core/effects/WorkletNode.h +64 -0
- package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +1 -1
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +2 -2
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +1 -1
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +1 -1
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +1 -1
- package/common/cpp/audioapi/core/sources/StreamerNode.h +0 -8
- package/common/cpp/audioapi/core/{AudioParamEventQueue.cpp → utils/AudioParamEventQueue.cpp} +1 -1
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +45 -0
- package/common/cpp/audioapi/core/utils/worklets/UiWorkletsRunner.cpp +9 -0
- package/common/cpp/audioapi/core/utils/worklets/UiWorkletsRunner.h +73 -0
- package/common/cpp/audioapi/dsp/Windows.cpp +1 -1
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +1 -1
- package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +14 -1
- package/common/cpp/audioapi/jsi/JsiHostObject.h +6 -12
- package/common/cpp/audioapi/utils/AudioBus.cpp +1 -1
- package/common/cpp/test/CMakeLists.txt +8 -3
- package/common/cpp/test/GainTest.cpp +1 -1
- package/common/cpp/test/OscillatorTest.cpp +1 -1
- package/ios/audioapi/ios/AudioAPIModule.mm +32 -5
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +1 -1
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +1 -2
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
- package/lib/commonjs/api.js +7 -0
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +29 -0
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/WorkletNode.js +11 -0
- package/lib/commonjs/core/WorkletNode.js.map +1 -0
- package/lib/commonjs/utils/index.js +9 -0
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/module/api.js +1 -0
- package/lib/module/api.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +29 -0
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/WorkletNode.js +5 -0
- package/lib/module/core/WorkletNode.js.map +1 -0
- package/lib/module/utils/index.js +8 -0
- package/lib/module/utils/index.js.map +1 -1
- package/lib/typescript/api.d.ts +1 -0
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +2 -0
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/WorkletNode.d.ts +4 -0
- package/lib/typescript/core/WorkletNode.d.ts.map +1 -0
- package/lib/typescript/interfaces.d.ts +3 -0
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +2 -0
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/api.ts +1 -0
- package/src/core/BaseAudioContext.ts +51 -0
- package/src/core/WorkletNode.ts +3 -0
- package/src/interfaces.ts +7 -0
- package/src/utils/index.ts +10 -0
- package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +0 -149
- package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +0 -76
- package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +0 -120
- package/common/cpp/audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h +0 -67
- package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +0 -142
- package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +0 -86
- package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +0 -56
- package/common/cpp/audioapi/HostObjects/BiquadFilterNodeHostObject.h +0 -89
- package/common/cpp/audioapi/HostObjects/GainNodeHostObject.h +0 -27
- package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +0 -65
- package/common/cpp/audioapi/HostObjects/StereoPannerNodeHostObject.h +0 -29
- package/common/cpp/audioapi/HostObjects/StreamerNodeHostObject.h +0 -30
- package/common/cpp/audioapi/events/AudioEventHandlerRegistryHostObject.h +0 -48
- package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.h +0 -7
- package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.mm +0 -12
- /package/common/cpp/audioapi/HostObjects/{AudioDestinationNodeHostObject.h → destinations/AudioDestinationNodeHostObject.h} +0 -0
- /package/common/cpp/audioapi/HostObjects/{PeriodicWaveHostObject.h → effects/PeriodicWaveHostObject.h} +0 -0
- /package/common/cpp/audioapi/core/{AudioParamEventQueue.h → utils/AudioParamEventQueue.h} +0 -0
- /package/common/cpp/audioapi/core/{Constants.h → utils/Constants.h} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-audio-api",
|
|
3
|
-
"version": "0.8.3-nightly-
|
|
3
|
+
"version": "0.8.3-nightly-2295d0d-20250926",
|
|
4
4
|
"description": "react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification",
|
|
5
5
|
"bin": {
|
|
6
6
|
"setup-rn-audio-api-web": "./scripts/setup-rn-audio-api-web.js"
|
|
@@ -80,7 +80,8 @@
|
|
|
80
80
|
},
|
|
81
81
|
"peerDependencies": {
|
|
82
82
|
"react": "*",
|
|
83
|
-
"react-native": "*"
|
|
83
|
+
"react-native": "*",
|
|
84
|
+
"react-native-worklets": "~0.6.0"
|
|
84
85
|
},
|
|
85
86
|
"devDependencies": {
|
|
86
87
|
"@babel/cli": "^7.20.0",
|
package/src/api.ts
CHANGED
|
@@ -40,6 +40,7 @@ if (
|
|
|
40
40
|
NativeAudioAPIModule.install();
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
export { default as WorkletNode } from './core/WorkletNode';
|
|
43
44
|
export { default as RecorderAdapterNode } from './core/RecorderAdapterNode';
|
|
44
45
|
export { default as AudioBuffer } from './core/AudioBuffer';
|
|
45
46
|
export { default as AudioBufferSourceNode } from './core/AudioBufferSourceNode';
|
|
@@ -17,6 +17,8 @@ import AudioBufferQueueSourceNode from './AudioBufferQueueSourceNode';
|
|
|
17
17
|
import StreamerNode from './StreamerNode';
|
|
18
18
|
import { InvalidAccessError, NotSupportedError } from '../errors';
|
|
19
19
|
import RecorderAdapterNode from './RecorderAdapterNode';
|
|
20
|
+
import WorkletNode from './WorkletNode';
|
|
21
|
+
import { isWorkletsAvailable, workletsModule } from '../utils';
|
|
20
22
|
|
|
21
23
|
export default class BaseAudioContext {
|
|
22
24
|
readonly destination: AudioDestinationNode;
|
|
@@ -37,6 +39,55 @@ export default class BaseAudioContext {
|
|
|
37
39
|
return this.context.state;
|
|
38
40
|
}
|
|
39
41
|
|
|
42
|
+
createWorkletNode(
|
|
43
|
+
callback: (audioData: Array<Float32Array>, channelCount: number) => void,
|
|
44
|
+
bufferLength: number,
|
|
45
|
+
inputChannelCount: number
|
|
46
|
+
): WorkletNode {
|
|
47
|
+
if (inputChannelCount < 1 || inputChannelCount > 32) {
|
|
48
|
+
throw new NotSupportedError(
|
|
49
|
+
`The number of input channels provided (${inputChannelCount}) can not be less than 1 or greater than 32`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
if (bufferLength < 1) {
|
|
53
|
+
throw new NotSupportedError(
|
|
54
|
+
`The buffer length provided (${bufferLength}) can not be less than 1`
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (isWorkletsAvailable) {
|
|
59
|
+
const shareableWorklet = workletsModule.makeShareableCloneRecursive(
|
|
60
|
+
(audioBuffers: Array<ArrayBuffer>, channelCount: number) => {
|
|
61
|
+
'worklet';
|
|
62
|
+
const floatAudioData: Array<Float32Array> = audioBuffers.map(
|
|
63
|
+
(buffer) => new Float32Array(buffer)
|
|
64
|
+
);
|
|
65
|
+
callback(floatAudioData, channelCount);
|
|
66
|
+
|
|
67
|
+
/// !IMPORTANT Workaround
|
|
68
|
+
/// This is required for now because the worklet is run using runGuarded in C++ which does not invoke any interaction with
|
|
69
|
+
/// the event queue which means if no task is being scheduled, the worklet's side effect won't happen.
|
|
70
|
+
/// So worklet will be called but any of its interactions with the UI thread will not be visible.
|
|
71
|
+
|
|
72
|
+
/// This forces to flush queue
|
|
73
|
+
requestAnimationFrame(() => {});
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
return new WorkletNode(
|
|
77
|
+
this,
|
|
78
|
+
this.context.createWorkletNode(
|
|
79
|
+
shareableWorklet,
|
|
80
|
+
bufferLength,
|
|
81
|
+
inputChannelCount
|
|
82
|
+
)
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
86
|
+
throw new Error(
|
|
87
|
+
'[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
40
91
|
createRecorderAdapter(): RecorderAdapterNode {
|
|
41
92
|
return new RecorderAdapterNode(this, this.context.createRecorderAdapter());
|
|
42
93
|
}
|
package/src/interfaces.ts
CHANGED
|
@@ -15,6 +15,11 @@ export interface IBaseAudioContext {
|
|
|
15
15
|
readonly currentTime: number;
|
|
16
16
|
|
|
17
17
|
createRecorderAdapter(): IRecorderAdapterNode;
|
|
18
|
+
createWorkletNode: (
|
|
19
|
+
shareableWorklet: any,
|
|
20
|
+
bufferLength: number,
|
|
21
|
+
inputChannelCount: number
|
|
22
|
+
) => IWorkletNode;
|
|
18
23
|
createOscillator(): IOscillatorNode;
|
|
19
24
|
createGain(): IGainNode;
|
|
20
25
|
createStereoPanner(): IStereoPannerNode;
|
|
@@ -202,6 +207,8 @@ export interface IAnalyserNode extends IAudioNode {
|
|
|
202
207
|
|
|
203
208
|
export interface IRecorderAdapterNode extends IAudioNode {}
|
|
204
209
|
|
|
210
|
+
export interface IWorkletNode extends IAudioNode {}
|
|
211
|
+
|
|
205
212
|
export interface IAudioRecorder {
|
|
206
213
|
start: () => void;
|
|
207
214
|
stop: () => void;
|
package/src/utils/index.ts
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
1
|
export function clamp(value: number, min: number, max: number): number {
|
|
2
2
|
return Math.min(Math.max(value, min), max);
|
|
3
3
|
}
|
|
4
|
+
|
|
5
|
+
export let isWorkletsAvailable = false;
|
|
6
|
+
export let workletsModule: any = null;
|
|
7
|
+
|
|
8
|
+
try {
|
|
9
|
+
workletsModule = require('react-native-worklets');
|
|
10
|
+
isWorkletsAvailable = true;
|
|
11
|
+
} catch (error) {
|
|
12
|
+
isWorkletsAvailable = false;
|
|
13
|
+
}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <audioapi/core/analysis/AnalyserNode.h>
|
|
4
|
-
#include <audioapi/HostObjects/AudioNodeHostObject.h>
|
|
5
|
-
|
|
6
|
-
#include <memory>
|
|
7
|
-
#include <string>
|
|
8
|
-
#include <vector>
|
|
9
|
-
|
|
10
|
-
namespace audioapi {
|
|
11
|
-
using namespace facebook;
|
|
12
|
-
|
|
13
|
-
class AnalyserNodeHostObject : public AudioNodeHostObject {
|
|
14
|
-
public:
|
|
15
|
-
explicit AnalyserNodeHostObject(const std::shared_ptr<AnalyserNode> &node)
|
|
16
|
-
: AudioNodeHostObject(node) {
|
|
17
|
-
addGetters(
|
|
18
|
-
JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, fftSize),
|
|
19
|
-
JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, frequencyBinCount),
|
|
20
|
-
JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, minDecibels),
|
|
21
|
-
JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, maxDecibels),
|
|
22
|
-
JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, smoothingTimeConstant),
|
|
23
|
-
JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, window));
|
|
24
|
-
|
|
25
|
-
addFunctions(
|
|
26
|
-
JSI_EXPORT_FUNCTION(
|
|
27
|
-
AnalyserNodeHostObject, getFloatFrequencyData),
|
|
28
|
-
JSI_EXPORT_FUNCTION(
|
|
29
|
-
AnalyserNodeHostObject, getByteFrequencyData),
|
|
30
|
-
JSI_EXPORT_FUNCTION(
|
|
31
|
-
AnalyserNodeHostObject, getFloatTimeDomainData),
|
|
32
|
-
JSI_EXPORT_FUNCTION(
|
|
33
|
-
AnalyserNodeHostObject, getByteTimeDomainData));
|
|
34
|
-
|
|
35
|
-
addSetters(
|
|
36
|
-
JSI_EXPORT_PROPERTY_SETTER(AnalyserNodeHostObject, fftSize),
|
|
37
|
-
JSI_EXPORT_PROPERTY_SETTER(AnalyserNodeHostObject, minDecibels),
|
|
38
|
-
JSI_EXPORT_PROPERTY_SETTER(AnalyserNodeHostObject, maxDecibels),
|
|
39
|
-
JSI_EXPORT_PROPERTY_SETTER(
|
|
40
|
-
AnalyserNodeHostObject, smoothingTimeConstant),
|
|
41
|
-
JSI_EXPORT_PROPERTY_SETTER(AnalyserNodeHostObject, window));
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
JSI_PROPERTY_GETTER(fftSize) {
|
|
45
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
46
|
-
return {static_cast<int>(analyserNode->getFftSize())};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
JSI_PROPERTY_GETTER(frequencyBinCount) {
|
|
50
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
51
|
-
return {static_cast<int>(analyserNode->getFrequencyBinCount())};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
JSI_PROPERTY_GETTER(minDecibels) {
|
|
55
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
56
|
-
return {analyserNode->getMinDecibels()};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
JSI_PROPERTY_GETTER(maxDecibels) {
|
|
60
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
61
|
-
return {analyserNode->getMaxDecibels()};
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
JSI_PROPERTY_GETTER(smoothingTimeConstant) {
|
|
65
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
66
|
-
return {analyserNode->getSmoothingTimeConstant()};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
JSI_PROPERTY_GETTER(window) {
|
|
70
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
71
|
-
auto windowType = analyserNode->getWindowType();
|
|
72
|
-
return jsi::String::createFromUtf8(runtime, windowType);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
JSI_HOST_FUNCTION(getFloatFrequencyData) {
|
|
76
|
-
auto arrayBuffer = args[0].getObject(runtime).getPropertyAsObject(runtime, "buffer").getArrayBuffer(runtime);
|
|
77
|
-
auto data = reinterpret_cast<float *>(arrayBuffer.data(runtime));
|
|
78
|
-
auto length = static_cast<int>(arrayBuffer.size(runtime));
|
|
79
|
-
|
|
80
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
81
|
-
analyserNode->getFloatFrequencyData(data, length);
|
|
82
|
-
|
|
83
|
-
return jsi::Value::undefined();
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
JSI_HOST_FUNCTION(getByteFrequencyData) {
|
|
87
|
-
auto arrayBuffer = args[0].getObject(runtime).getPropertyAsObject(runtime, "buffer").getArrayBuffer(runtime);
|
|
88
|
-
auto data = arrayBuffer.data(runtime);
|
|
89
|
-
auto length = static_cast<int>(arrayBuffer.size(runtime));
|
|
90
|
-
|
|
91
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
92
|
-
analyserNode->getByteFrequencyData(data, length);
|
|
93
|
-
|
|
94
|
-
return jsi::Value::undefined();
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
JSI_HOST_FUNCTION(getFloatTimeDomainData) {
|
|
98
|
-
auto arrayBuffer = args[0].getObject(runtime).getPropertyAsObject(runtime, "buffer").getArrayBuffer(runtime);
|
|
99
|
-
auto data = reinterpret_cast<float *>(arrayBuffer.data(runtime));
|
|
100
|
-
auto length = static_cast<int>(arrayBuffer.size(runtime));
|
|
101
|
-
|
|
102
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
103
|
-
analyserNode->getFloatTimeDomainData(data, length);
|
|
104
|
-
|
|
105
|
-
return jsi::Value::undefined();
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
JSI_HOST_FUNCTION(getByteTimeDomainData) {
|
|
109
|
-
auto arrayBuffer = args[0].getObject(runtime).getPropertyAsObject(runtime, "buffer").getArrayBuffer(runtime);
|
|
110
|
-
auto data = arrayBuffer.data(runtime);
|
|
111
|
-
auto length = static_cast<int>(arrayBuffer.size(runtime));
|
|
112
|
-
|
|
113
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
114
|
-
analyserNode->getByteTimeDomainData(data, length);
|
|
115
|
-
|
|
116
|
-
return jsi::Value::undefined();
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
JSI_PROPERTY_SETTER(fftSize) {
|
|
120
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
121
|
-
auto fftSize = static_cast<int>(value.getNumber());
|
|
122
|
-
analyserNode->setFftSize(fftSize);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
JSI_PROPERTY_SETTER(minDecibels) {
|
|
126
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
127
|
-
auto minDecibels = static_cast<float>(value.getNumber());
|
|
128
|
-
analyserNode->setMinDecibels(minDecibels);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
JSI_PROPERTY_SETTER(maxDecibels) {
|
|
132
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
133
|
-
auto maxDecibels = static_cast<float>(value.getNumber());
|
|
134
|
-
analyserNode->setMaxDecibels(maxDecibels);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
JSI_PROPERTY_SETTER(smoothingTimeConstant) {
|
|
138
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
139
|
-
auto smoothingTimeConstant = static_cast<float>(value.getNumber());
|
|
140
|
-
analyserNode->setSmoothingTimeConstant(smoothingTimeConstant);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
JSI_PROPERTY_SETTER(window) {
|
|
144
|
-
auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);
|
|
145
|
-
analyserNode->setWindowType(value.getString(runtime).utf8(runtime));
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
} // namespace audioapi
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <audioapi/core/sources/AudioBufferBaseSourceNode.h>
|
|
4
|
-
#include <audioapi/HostObjects/AudioParamHostObject.h>
|
|
5
|
-
#include <audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h>
|
|
6
|
-
|
|
7
|
-
#include <memory>
|
|
8
|
-
#include <vector>
|
|
9
|
-
|
|
10
|
-
namespace audioapi {
|
|
11
|
-
using namespace facebook;
|
|
12
|
-
|
|
13
|
-
class AudioBufferBaseSourceNodeHostObject
|
|
14
|
-
: public AudioScheduledSourceNodeHostObject {
|
|
15
|
-
public:
|
|
16
|
-
explicit AudioBufferBaseSourceNodeHostObject(
|
|
17
|
-
const std::shared_ptr<AudioBufferBaseSourceNode> &node)
|
|
18
|
-
: AudioScheduledSourceNodeHostObject(node) {
|
|
19
|
-
addGetters(
|
|
20
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, detune),
|
|
21
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, playbackRate),
|
|
22
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, onPositionChangedInterval));
|
|
23
|
-
|
|
24
|
-
addSetters(
|
|
25
|
-
JSI_EXPORT_PROPERTY_SETTER(AudioBufferBaseSourceNodeHostObject, onPositionChanged),
|
|
26
|
-
JSI_EXPORT_PROPERTY_SETTER(AudioBufferBaseSourceNodeHostObject, onPositionChangedInterval));
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
~AudioBufferBaseSourceNodeHostObject() {
|
|
30
|
-
auto sourceNode =
|
|
31
|
-
std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
|
|
32
|
-
|
|
33
|
-
// When JSI object is garbage collected (together with the eventual callback),
|
|
34
|
-
// underlying source node might still be active and try to call the non-existing callback.
|
|
35
|
-
sourceNode->clearOnPositionChangedCallback();
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
JSI_PROPERTY_GETTER(detune) {
|
|
39
|
-
auto sourceNode =
|
|
40
|
-
std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
|
|
41
|
-
auto detune = sourceNode->getDetuneParam();
|
|
42
|
-
auto detuneHostObject = std::make_shared<AudioParamHostObject>(detune);
|
|
43
|
-
return jsi::Object::createFromHostObject(runtime, detuneHostObject);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
JSI_PROPERTY_GETTER(playbackRate) {
|
|
47
|
-
auto sourceNode =
|
|
48
|
-
std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
|
|
49
|
-
auto playbackRate = sourceNode->getPlaybackRateParam();
|
|
50
|
-
auto playbackRateHostObject =
|
|
51
|
-
std::make_shared<AudioParamHostObject>(playbackRate);
|
|
52
|
-
return jsi::Object::createFromHostObject(runtime, playbackRateHostObject);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
JSI_PROPERTY_SETTER(onPositionChanged) {
|
|
56
|
-
auto sourceNode =
|
|
57
|
-
std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
|
|
58
|
-
|
|
59
|
-
sourceNode->setOnPositionChangedCallbackId(std::stoull(value.getString(runtime).utf8(runtime)));
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
JSI_PROPERTY_GETTER(onPositionChangedInterval) {
|
|
63
|
-
auto sourceNode =
|
|
64
|
-
std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
|
|
65
|
-
return jsi::Value(sourceNode->getOnPositionChangedInterval());
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
JSI_PROPERTY_SETTER(onPositionChangedInterval) {
|
|
69
|
-
auto sourceNode =
|
|
70
|
-
std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
|
|
71
|
-
|
|
72
|
-
sourceNode->setOnPositionChangedInterval(static_cast<int>(value.getNumber()));
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
} // namespace audioapi
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <audioapi/core/sources/AudioBuffer.h>
|
|
4
|
-
#include <audioapi/jsi/AudioArrayBuffer.h>
|
|
5
|
-
#include <audioapi/jsi/JsiHostObject.h>
|
|
6
|
-
|
|
7
|
-
#include <jsi/jsi.h>
|
|
8
|
-
#include <cstddef>
|
|
9
|
-
#include <memory>
|
|
10
|
-
#include <utility>
|
|
11
|
-
#include <vector>
|
|
12
|
-
|
|
13
|
-
namespace audioapi {
|
|
14
|
-
using namespace facebook;
|
|
15
|
-
|
|
16
|
-
class AudioBufferHostObject : public JsiHostObject {
|
|
17
|
-
public:
|
|
18
|
-
std::shared_ptr<AudioBuffer> audioBuffer_;
|
|
19
|
-
|
|
20
|
-
explicit AudioBufferHostObject(
|
|
21
|
-
const std::shared_ptr<AudioBuffer> &audioBuffer)
|
|
22
|
-
: audioBuffer_(audioBuffer) {
|
|
23
|
-
addGetters(
|
|
24
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, sampleRate),
|
|
25
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, length),
|
|
26
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, duration),
|
|
27
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, numberOfChannels));
|
|
28
|
-
|
|
29
|
-
addFunctions(
|
|
30
|
-
JSI_EXPORT_FUNCTION(AudioBufferHostObject, getChannelData),
|
|
31
|
-
JSI_EXPORT_FUNCTION(AudioBufferHostObject, copyFromChannel),
|
|
32
|
-
JSI_EXPORT_FUNCTION(AudioBufferHostObject, copyToChannel));
|
|
33
|
-
}
|
|
34
|
-
AudioBufferHostObject(const AudioBufferHostObject &) = delete;
|
|
35
|
-
AudioBufferHostObject &operator=(const AudioBufferHostObject &) = delete;
|
|
36
|
-
AudioBufferHostObject(AudioBufferHostObject &&other) noexcept
|
|
37
|
-
: JsiHostObject(std::move(other)),
|
|
38
|
-
audioBuffer_(std::move(other.audioBuffer_)) {}
|
|
39
|
-
AudioBufferHostObject &operator=(AudioBufferHostObject &&other) noexcept {
|
|
40
|
-
if (this != &other) {
|
|
41
|
-
JsiHostObject::operator=(std::move(other));
|
|
42
|
-
audioBuffer_ = std::move(other.audioBuffer_);
|
|
43
|
-
}
|
|
44
|
-
return *this;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
[[nodiscard]] size_t getSizeInBytes() const {
|
|
48
|
-
return audioBuffer_->getLength() * audioBuffer_->getNumberOfChannels() *
|
|
49
|
-
sizeof(float);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
JSI_PROPERTY_GETTER(sampleRate) {
|
|
53
|
-
return {audioBuffer_->getSampleRate()};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
JSI_PROPERTY_GETTER(length) {
|
|
57
|
-
return {static_cast<double>(audioBuffer_->getLength())};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
JSI_PROPERTY_GETTER(duration) {
|
|
61
|
-
return {audioBuffer_->getDuration()};
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
JSI_PROPERTY_GETTER(numberOfChannels) {
|
|
65
|
-
return {audioBuffer_->getNumberOfChannels()};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
JSI_HOST_FUNCTION(getChannelData) {
|
|
69
|
-
auto channel = static_cast<int>(args[0].getNumber());
|
|
70
|
-
auto channelData =
|
|
71
|
-
reinterpret_cast<uint8_t *>(audioBuffer_->getChannelData(channel));
|
|
72
|
-
auto length = static_cast<int>(audioBuffer_->getLength());
|
|
73
|
-
auto size = static_cast<int>(length * sizeof(float));
|
|
74
|
-
|
|
75
|
-
// reading or writing from this ArrayBuffer could cause a crash
|
|
76
|
-
// if underlying channelData is deallocated
|
|
77
|
-
auto audioArrayBuffer =
|
|
78
|
-
std::make_shared<AudioArrayBuffer>(channelData, size);
|
|
79
|
-
auto arrayBuffer = jsi::ArrayBuffer(runtime, audioArrayBuffer);
|
|
80
|
-
|
|
81
|
-
auto float32ArrayCtor =
|
|
82
|
-
runtime.global().getPropertyAsFunction(runtime, "Float32Array");
|
|
83
|
-
auto float32Array = float32ArrayCtor.callAsConstructor(runtime, arrayBuffer)
|
|
84
|
-
.getObject(runtime);
|
|
85
|
-
|
|
86
|
-
return float32Array;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
JSI_HOST_FUNCTION(copyFromChannel) {
|
|
90
|
-
auto arrayBuffer = args[0]
|
|
91
|
-
.getObject(runtime)
|
|
92
|
-
.getPropertyAsObject(runtime, "buffer")
|
|
93
|
-
.getArrayBuffer(runtime);
|
|
94
|
-
auto destination = reinterpret_cast<float *>(arrayBuffer.data(runtime));
|
|
95
|
-
auto length = static_cast<int>(arrayBuffer.size(runtime));
|
|
96
|
-
auto channelNumber = static_cast<int>(args[1].getNumber());
|
|
97
|
-
auto startInChannel = static_cast<size_t>(args[2].getNumber());
|
|
98
|
-
|
|
99
|
-
audioBuffer_->copyFromChannel(
|
|
100
|
-
destination, length, channelNumber, startInChannel);
|
|
101
|
-
|
|
102
|
-
return jsi::Value::undefined();
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
JSI_HOST_FUNCTION(copyToChannel) {
|
|
106
|
-
auto arrayBuffer = args[0]
|
|
107
|
-
.getObject(runtime)
|
|
108
|
-
.getPropertyAsObject(runtime, "buffer")
|
|
109
|
-
.getArrayBuffer(runtime);
|
|
110
|
-
auto source = reinterpret_cast<float *>(arrayBuffer.data(runtime));
|
|
111
|
-
auto length = static_cast<int>(arrayBuffer.size(runtime));
|
|
112
|
-
auto channelNumber = static_cast<int>(args[1].getNumber());
|
|
113
|
-
auto startInChannel = static_cast<size_t>(args[2].getNumber());
|
|
114
|
-
|
|
115
|
-
audioBuffer_->copyToChannel(source, length, channelNumber, startInChannel);
|
|
116
|
-
|
|
117
|
-
return jsi::Value::undefined();
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
} // namespace audioapi
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <audioapi/HostObjects/AudioBufferHostObject.h>
|
|
4
|
-
#include <audioapi/core/sources/AudioBufferQueueSourceNode.h>
|
|
5
|
-
#include <audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h>
|
|
6
|
-
|
|
7
|
-
#include <memory>
|
|
8
|
-
#include <vector>
|
|
9
|
-
|
|
10
|
-
namespace audioapi {
|
|
11
|
-
using namespace facebook;
|
|
12
|
-
|
|
13
|
-
class AudioBufferQueueSourceNodeHostObject
|
|
14
|
-
: public AudioBufferBaseSourceNodeHostObject {
|
|
15
|
-
public:
|
|
16
|
-
explicit AudioBufferQueueSourceNodeHostObject(
|
|
17
|
-
const std::shared_ptr<AudioBufferQueueSourceNode> &node)
|
|
18
|
-
: AudioBufferBaseSourceNodeHostObject(node) {
|
|
19
|
-
addFunctions(
|
|
20
|
-
JSI_EXPORT_FUNCTION(AudioBufferQueueSourceNodeHostObject, enqueueBuffer),
|
|
21
|
-
JSI_EXPORT_FUNCTION(AudioBufferQueueSourceNodeHostObject, pause));
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
JSI_HOST_FUNCTION(pause) {
|
|
25
|
-
auto audioBufferQueueSourceNode =
|
|
26
|
-
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
|
|
27
|
-
|
|
28
|
-
audioBufferQueueSourceNode->pause();
|
|
29
|
-
|
|
30
|
-
return jsi::Value::undefined();
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
JSI_HOST_FUNCTION(enqueueBuffer) {
|
|
34
|
-
auto audioBufferQueueSourceNode =
|
|
35
|
-
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
|
|
36
|
-
|
|
37
|
-
auto audioBufferHostObject =
|
|
38
|
-
args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
|
|
39
|
-
|
|
40
|
-
auto bufferId = audioBufferQueueSourceNode->enqueueBuffer(audioBufferHostObject->audioBuffer_);
|
|
41
|
-
|
|
42
|
-
return jsi::String::createFromUtf8(runtime, bufferId);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
JSI_HOST_FUNCTION(dequeueBuffer) {
|
|
46
|
-
auto audioBufferQueueSourceNode =
|
|
47
|
-
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
|
|
48
|
-
|
|
49
|
-
auto bufferId =
|
|
50
|
-
args[0].getNumber();
|
|
51
|
-
|
|
52
|
-
audioBufferQueueSourceNode->dequeueBuffer(bufferId);
|
|
53
|
-
|
|
54
|
-
return jsi::Value::undefined();
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
JSI_HOST_FUNCTION(clearBuffers) {
|
|
58
|
-
auto audioBufferQueueSourceNode =
|
|
59
|
-
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
|
|
60
|
-
|
|
61
|
-
audioBufferQueueSourceNode->clearBuffers();
|
|
62
|
-
|
|
63
|
-
return jsi::Value::undefined();
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
} // namespace audioapi
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <audioapi/HostObjects/AudioBufferHostObject.h>
|
|
4
|
-
#include <audioapi/core/sources/AudioBufferSourceNode.h>
|
|
5
|
-
#include <audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h>
|
|
6
|
-
|
|
7
|
-
#include <memory>
|
|
8
|
-
#include <vector>
|
|
9
|
-
|
|
10
|
-
namespace audioapi {
|
|
11
|
-
using namespace facebook;
|
|
12
|
-
|
|
13
|
-
class AudioBufferSourceNodeHostObject
|
|
14
|
-
: public AudioBufferBaseSourceNodeHostObject {
|
|
15
|
-
public:
|
|
16
|
-
explicit AudioBufferSourceNodeHostObject(
|
|
17
|
-
const std::shared_ptr<AudioBufferSourceNode> &node)
|
|
18
|
-
: AudioBufferBaseSourceNodeHostObject(node) {
|
|
19
|
-
addGetters(
|
|
20
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loop),
|
|
21
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopSkip),
|
|
22
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, buffer),
|
|
23
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopStart),
|
|
24
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopEnd));
|
|
25
|
-
|
|
26
|
-
addSetters(
|
|
27
|
-
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loop),
|
|
28
|
-
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopSkip),
|
|
29
|
-
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopStart),
|
|
30
|
-
JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopEnd));
|
|
31
|
-
|
|
32
|
-
// start method is overridden in this class
|
|
33
|
-
functions_->erase("start");
|
|
34
|
-
|
|
35
|
-
addFunctions(
|
|
36
|
-
JSI_EXPORT_FUNCTION(AudioBufferSourceNodeHostObject, start),
|
|
37
|
-
JSI_EXPORT_FUNCTION(AudioBufferSourceNodeHostObject, setBuffer));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
JSI_PROPERTY_GETTER(loop) {
|
|
41
|
-
auto audioBufferSourceNode =
|
|
42
|
-
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
43
|
-
auto loop = audioBufferSourceNode->getLoop();
|
|
44
|
-
return {loop};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
JSI_PROPERTY_GETTER(loopSkip) {
|
|
48
|
-
auto audioBufferSourceNode =
|
|
49
|
-
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
50
|
-
auto loopSkip = audioBufferSourceNode->getLoopSkip();
|
|
51
|
-
return {loopSkip};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
JSI_PROPERTY_GETTER(buffer) {
|
|
55
|
-
auto audioBufferSourceNode =
|
|
56
|
-
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
57
|
-
auto buffer = audioBufferSourceNode->getBuffer();
|
|
58
|
-
|
|
59
|
-
if (!buffer) {
|
|
60
|
-
return jsi::Value::null();
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
auto bufferHostObject = std::make_shared<AudioBufferHostObject>(buffer);
|
|
64
|
-
return jsi::Object::createFromHostObject(runtime, bufferHostObject);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
JSI_PROPERTY_GETTER(loopStart) {
|
|
68
|
-
auto audioBufferSourceNode =
|
|
69
|
-
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
70
|
-
auto loopStart = audioBufferSourceNode->getLoopStart();
|
|
71
|
-
return {loopStart};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
JSI_PROPERTY_GETTER(loopEnd) {
|
|
75
|
-
auto audioBufferSourceNode =
|
|
76
|
-
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
77
|
-
auto loopEnd = audioBufferSourceNode->getLoopEnd();
|
|
78
|
-
return {loopEnd};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
JSI_PROPERTY_SETTER(loop) {
|
|
82
|
-
auto audioBufferSourceNode =
|
|
83
|
-
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
84
|
-
audioBufferSourceNode->setLoop(value.getBool());
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
JSI_PROPERTY_SETTER(loopSkip) {
|
|
88
|
-
auto audioBufferSourceNode =
|
|
89
|
-
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
90
|
-
audioBufferSourceNode->setLoopSkip(value.getBool());
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
JSI_PROPERTY_SETTER(loopStart) {
|
|
94
|
-
auto audioBufferSourceNode =
|
|
95
|
-
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
96
|
-
audioBufferSourceNode->setLoopStart(value.getNumber());
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
JSI_PROPERTY_SETTER(loopEnd) {
|
|
100
|
-
auto audioBufferSourceNode =
|
|
101
|
-
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
102
|
-
audioBufferSourceNode->setLoopEnd(value.getNumber());
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
JSI_HOST_FUNCTION(start) {
|
|
106
|
-
auto when = args[0].getNumber();
|
|
107
|
-
auto offset = args[1].getNumber();
|
|
108
|
-
|
|
109
|
-
auto audioBufferSourceNode =
|
|
110
|
-
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
111
|
-
|
|
112
|
-
if (args[2].isUndefined()) {
|
|
113
|
-
audioBufferSourceNode->start(when, offset);
|
|
114
|
-
|
|
115
|
-
return jsi::Value::undefined();
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
auto duration = args[2].getNumber();
|
|
119
|
-
audioBufferSourceNode->start(when, offset, duration);
|
|
120
|
-
|
|
121
|
-
return jsi::Value::undefined();
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
JSI_HOST_FUNCTION(setBuffer) {
|
|
125
|
-
auto audioBufferSourceNode =
|
|
126
|
-
std::static_pointer_cast<AudioBufferSourceNode>(node_);
|
|
127
|
-
|
|
128
|
-
if (args[0].isNull()) {
|
|
129
|
-
audioBufferSourceNode->setBuffer(std::shared_ptr<AudioBuffer>(nullptr));
|
|
130
|
-
return jsi::Value::undefined();
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
auto bufferHostObject =
|
|
134
|
-
args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
|
|
135
|
-
thisValue.asObject(runtime).setExternalMemoryPressure(runtime,
|
|
136
|
-
bufferHostObject->getSizeInBytes() + 16);
|
|
137
|
-
audioBufferSourceNode->setBuffer(bufferHostObject->audioBuffer_);
|
|
138
|
-
return jsi::Value::undefined();
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
} // namespace audioapi
|