react-native-audio-api 0.9.0 → 0.9.2
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 +5 -2
- package/android/build.gradle +26 -2
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +5 -0
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +1 -0
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +4 -2
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +29 -1
- package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
- package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
- package/android/src/main/jniLibs/x86/libavformat.so +0 -0
- package/android/src/main/jniLibs/x86/libavutil.so +0 -0
- package/android/src/main/jniLibs/x86/libswresample.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
- package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +37 -6
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +12 -5
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +3 -8
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +12 -6
- package/common/cpp/audioapi/core/BaseAudioContext.h +14 -3
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +39 -52
- package/common/cpp/audioapi/core/effects/WorkletNode.h +6 -10
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +17 -19
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +2 -5
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +1 -0
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +0 -4
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +0 -1
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +0 -2
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +0 -4
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +0 -1
- package/common/cpp/audioapi/core/sources/StreamerNode.cpp +16 -6
- package/common/cpp/audioapi/core/sources/StreamerNode.h +3 -1
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +14 -16
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +2 -5
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +32 -13
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +75 -2
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +50 -36
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +5 -1
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/libavformat.xcframework/Info.plist +5 -5
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/libswresample.xcframework/Info.plist +5 -5
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/jsi/AudioArrayBuffer.cpp +2 -2
- package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +10 -11
- package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +1 -1
- package/common/cpp/audioapi/utils/AudioBus.cpp +4 -0
- package/common/cpp/audioapi/utils/AudioBus.h +1 -0
- package/common/cpp/test/CMakeLists.txt +7 -4
- package/common/cpp/test/RunTests.sh +2 -2
- package/common/cpp/test/{AudioParamTest.cpp → src/AudioParamTest.cpp} +1 -1
- package/common/cpp/test/src/ConstantSourceTest.cpp +64 -0
- package/common/cpp/test/{GainTest.cpp → src/GainTest.cpp} +11 -10
- package/common/cpp/test/{MockAudioEventHandlerRegistry.h → src/MockAudioEventHandlerRegistry.h} +4 -2
- package/common/cpp/test/{OscillatorTest.cpp → src/OscillatorTest.cpp} +6 -4
- package/common/cpp/test/{StereoPannerTest.cpp → src/StereoPannerTest.cpp} +1 -1
- package/ios/audioapi/ios/AudioAPIModule.h +2 -1
- package/ios/audioapi/ios/AudioAPIModule.mm +2 -0
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +2 -1
- package/lib/commonjs/core/AudioContext.js +1 -5
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +16 -25
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/OfflineAudioContext.js +1 -5
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/utils/index.js +20 -4
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/module/core/AudioContext.js +2 -6
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +17 -26
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/OfflineAudioContext.js +2 -6
- package/lib/module/core/OfflineAudioContext.js.map +1 -1
- package/lib/module/utils/index.js +16 -1
- package/lib/module/utils/index.js.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts +0 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/OfflineAudioContext.d.ts +0 -1
- package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +4 -1
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/package.json +4 -1
- package/scripts/rnaa_utils.rb +8 -0
- package/scripts/validate-worklets-version.js +28 -0
- package/src/core/AudioContext.ts +3 -7
- package/src/core/BaseAudioContext.ts +44 -60
- package/src/core/OfflineAudioContext.ts +2 -7
- package/src/utils/index.ts +23 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BaseAudioContext","AudioManager","NotSupportedError","
|
|
1
|
+
{"version":3,"names":["BaseAudioContext","AudioManager","NotSupportedError","isWorkletsVersionSupported","workletsModule","AudioContext","constructor","options","sampleRate","audioRuntime","createWorkletRuntime","global","createAudioContext","getDevicePreferredSampleRate","initSuspended","close","context","resume","suspend"],"sourceRoot":"../../../src","sources":["core/AudioContext.ts"],"mappings":";;AACA,OAAOA,gBAAgB,MAAM,uBAAoB;AACjD,OAAOC,YAAY,MAAM,oBAAW;AAEpC,SAASC,iBAAiB,QAAQ,oBAAW;AAC7C,SAASC,0BAA0B,EAAEC,cAAc,QAAQ,mBAAU;AAErE,eAAe,MAAMC,YAAY,SAASL,gBAAgB,CAAC;EACzDM,WAAWA,CAACC,OAA6B,EAAE;IACzC,IACEA,OAAO,IACPA,OAAO,CAACC,UAAU,KACjBD,OAAO,CAACC,UAAU,GAAG,IAAI,IAAID,OAAO,CAACC,UAAU,GAAG,KAAK,CAAC,EACzD;MACA,MAAM,IAAIN,iBAAiB,CACzB,6CAA6CK,OAAO,CAACC,UAAU,EACjE,CAAC;IACH;IACA,IAAIC,YAAY,GAAG,IAAI;IAEvB,IAAIN,0BAA0B,EAAE;MAC9BM,YAAY,GAAGL,cAAc,CAACM,oBAAoB,CAAC,qBAAqB,CAAC;IAC3E;IAEA,KAAK,CACHC,MAAM,CAACC,kBAAkB,CACvBL,OAAO,EAAEC,UAAU,IAAIP,YAAY,CAACY,4BAA4B,CAAC,CAAC,EAClEN,OAAO,EAAEO,aAAa,IAAI,KAAK,EAC/BL,YACF,CACF,CAAC;EACH;EAEA,MAAMM,KAAKA,CAAA,EAAkB;IAC3B,OAAQ,IAAI,CAACC,OAAO,CAAmBD,KAAK,CAAC,CAAC;EAChD;EAEA,MAAME,MAAMA,CAAA,EAAqB;IAC/B,OAAQ,IAAI,CAACD,OAAO,CAAmBC,MAAM,CAAC,CAAC;EACjD;EAEA,MAAMC,OAAOA,CAAA,EAAqB;IAChC,OAAQ,IAAI,CAACF,OAAO,CAAmBE,OAAO,CAAC,CAAC;EAClD;AACF","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { InvalidAccessError, NotSupportedError } from "../errors/index.js";
|
|
4
|
-
import {
|
|
4
|
+
import { assertWorkletsEnabled, workletsModule } from "../utils/index.js";
|
|
5
5
|
import WorkletSourceNode from "./WorkletSourceNode.js";
|
|
6
6
|
import WorkletProcessingNode from "./WorkletProcessingNode.js";
|
|
7
7
|
import AnalyserNode from "./AnalyserNode.js";
|
|
@@ -37,37 +37,28 @@ export default class BaseAudioContext {
|
|
|
37
37
|
if (bufferLength < 1) {
|
|
38
38
|
throw new NotSupportedError(`The buffer length provided (${bufferLength}) can not be less than 1`);
|
|
39
39
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
assertWorkletsEnabled();
|
|
41
|
+
const shareableWorklet = workletsModule.makeShareableCloneRecursive((audioBuffers, channelCount) => {
|
|
42
|
+
'worklet';
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
50
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
44
|
+
const floatAudioData = audioBuffers.map(buffer => new Float32Array(buffer));
|
|
45
|
+
callback(floatAudioData, channelCount);
|
|
46
|
+
});
|
|
47
|
+
return new WorkletNode(this, this.context.createWorkletNode(shareableWorklet, workletRuntime === 'UIRuntime', bufferLength, inputChannelCount));
|
|
51
48
|
}
|
|
52
49
|
createWorkletProcessingNode(callback, workletRuntime = 'AudioRuntime') {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
50
|
+
assertWorkletsEnabled();
|
|
51
|
+
const shareableWorklet = workletsModule.makeShareableCloneRecursive((inputBuffers, outputBuffers, framesToProcess, currentTime) => {
|
|
52
|
+
'worklet';
|
|
56
53
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
64
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
54
|
+
const inputData = inputBuffers.map(buffer => new Float32Array(buffer, 0, framesToProcess));
|
|
55
|
+
const outputData = outputBuffers.map(buffer => new Float32Array(buffer, 0, framesToProcess));
|
|
56
|
+
callback(inputData, outputData, framesToProcess, currentTime);
|
|
57
|
+
});
|
|
58
|
+
return new WorkletProcessingNode(this, this.context.createWorkletProcessingNode(shareableWorklet, workletRuntime === 'UIRuntime'));
|
|
65
59
|
}
|
|
66
60
|
createWorkletSourceNode(callback, workletRuntime = 'AudioRuntime') {
|
|
67
|
-
|
|
68
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
69
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
70
|
-
}
|
|
61
|
+
assertWorkletsEnabled();
|
|
71
62
|
const shareableWorklet = workletsModule.makeShareableCloneRecursive((audioBuffers, framesToProcess, currentTime, startOffset) => {
|
|
72
63
|
'worklet';
|
|
73
64
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["InvalidAccessError","NotSupportedError","
|
|
1
|
+
{"version":3,"names":["InvalidAccessError","NotSupportedError","assertWorkletsEnabled","workletsModule","WorkletSourceNode","WorkletProcessingNode","AnalyserNode","AudioBuffer","AudioBufferQueueSourceNode","AudioBufferSourceNode","AudioDestinationNode","BiquadFilterNode","GainNode","OscillatorNode","PeriodicWave","RecorderAdapterNode","StereoPannerNode","StreamerNode","WorkletNode","ConstantSourceNode","BaseAudioContext","constructor","context","destination","sampleRate","currentTime","state","createWorkletNode","callback","bufferLength","inputChannelCount","workletRuntime","shareableWorklet","makeShareableCloneRecursive","audioBuffers","channelCount","floatAudioData","map","buffer","Float32Array","createWorkletProcessingNode","inputBuffers","outputBuffers","framesToProcess","inputData","outputData","createWorkletSourceNode","startOffset","createRecorderAdapter","createOscillator","createStreamer","createConstantSource","createGain","createStereoPanner","createBiquadFilter","createBufferSource","options","pitchCorrection","createBufferQueueSource","createBuffer","numOfChannels","length","createPeriodicWave","real","imag","constraints","disableNormalization","createAnalyser","decodeAudioDataSource","sourcePath","startsWith","replace","decodeAudioData","data","Uint8Array","decodePCMInBase64Data","base64","playbackRate","decodePCMAudioDataInBase64"],"sourceRoot":"../../../src","sources":["core/BaseAudioContext.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,14 +3,11 @@
|
|
|
3
3
|
import BaseAudioContext from "./BaseAudioContext.js";
|
|
4
4
|
import { InvalidStateError, NotSupportedError } from "../errors/index.js";
|
|
5
5
|
import AudioBuffer from "./AudioBuffer.js";
|
|
6
|
-
import {
|
|
6
|
+
import { isWorkletsVersionSupported, workletsModule } from "../utils/index.js";
|
|
7
7
|
export default class OfflineAudioContext extends BaseAudioContext {
|
|
8
|
-
// We need to keep here a reference to this runtime to better manage its lifecycle
|
|
9
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
10
|
-
|
|
11
8
|
constructor(arg0, arg1, arg2) {
|
|
12
9
|
let audioRuntime = null;
|
|
13
|
-
if (
|
|
10
|
+
if (isWorkletsVersionSupported) {
|
|
14
11
|
audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
15
12
|
}
|
|
16
13
|
if (typeof arg0 === 'object') {
|
|
@@ -29,7 +26,6 @@ export default class OfflineAudioContext extends BaseAudioContext {
|
|
|
29
26
|
}
|
|
30
27
|
this.isSuspended = false;
|
|
31
28
|
this.isRendering = false;
|
|
32
|
-
this._audioRuntime = audioRuntime;
|
|
33
29
|
}
|
|
34
30
|
async resume() {
|
|
35
31
|
if (!this.isRendering) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BaseAudioContext","InvalidStateError","NotSupportedError","AudioBuffer","
|
|
1
|
+
{"version":3,"names":["BaseAudioContext","InvalidStateError","NotSupportedError","AudioBuffer","isWorkletsVersionSupported","workletsModule","OfflineAudioContext","constructor","arg0","arg1","arg2","audioRuntime","createWorkletRuntime","numberOfChannels","length","sampleRate","global","createOfflineAudioContext","duration","isSuspended","isRendering","resume","context","suspend","suspendTime","currentTime","startRendering","audioBuffer"],"sourceRoot":"../../../src","sources":["core/OfflineAudioContext.ts"],"mappings":";;AACA,OAAOA,gBAAgB,MAAM,uBAAoB;AAEjD,SAASC,iBAAiB,EAAEC,iBAAiB,QAAQ,oBAAW;AAChE,OAAOC,WAAW,MAAM,kBAAe;AACvC,SAASC,0BAA0B,EAAEC,cAAc,QAAQ,mBAAU;AAErE,eAAe,MAAMC,mBAAmB,SAASN,gBAAgB,CAAC;EAOhEO,WAAWA,CACTC,IAAyC,EACzCC,IAAa,EACbC,IAAa,EACb;IACA,IAAIC,YAAY,GAAG,IAAI;IACvB,IAAIP,0BAA0B,EAAE;MAC9BO,YAAY,GAAGN,cAAc,CAACO,oBAAoB,CAAC,qBAAqB,CAAC;IAC3E;IAEA,IAAI,OAAOJ,IAAI,KAAK,QAAQ,EAAE;MAC5B,MAAM;QAAEK,gBAAgB;QAAEC,MAAM;QAAEC;MAAW,CAAC,GAAGP,IAAI;MACrD,KAAK,CACHQ,MAAM,CAACC,yBAAyB,CAC9BJ,gBAAgB,EAChBC,MAAM,EACNC,UAAU,EACVJ,YACF,CACF,CAAC;MAED,IAAI,CAACO,QAAQ,GAAGJ,MAAM,GAAGC,UAAU;IACrC,CAAC,MAAM,IACL,OAAOP,IAAI,KAAK,QAAQ,IACxB,OAAOC,IAAI,KAAK,QAAQ,IACxB,OAAOC,IAAI,KAAK,QAAQ,EACxB;MACA,KAAK,CAACM,MAAM,CAACC,yBAAyB,CAACT,IAAI,EAAEC,IAAI,EAAEC,IAAI,EAAEC,YAAY,CAAC,CAAC;MACvE,IAAI,CAACO,QAAQ,GAAGT,IAAI,GAAGC,IAAI;IAC7B,CAAC,MAAM;MACL,MAAM,IAAIR,iBAAiB,CAAC,+BAA+B,CAAC;IAC9D;IAEA,IAAI,CAACiB,WAAW,GAAG,KAAK;IACxB,IAAI,CAACC,WAAW,GAAG,KAAK;EAC1B;EAEA,MAAMC,MAAMA,CAAA,EAAuB;IACjC,IAAI,CAAC,IAAI,CAACD,WAAW,EAAE;MACrB,MAAM,IAAInB,iBAAiB,CACzB,sDACF,CAAC;IACH;IAEA,IAAI,CAAC,IAAI,CAACkB,WAAW,EAAE;MACrB,MAAM,IAAIlB,iBAAiB,CACzB,4DACF,CAAC;IACH;IAEA,IAAI,CAACkB,WAAW,GAAG,KAAK;IAExB,MAAO,IAAI,CAACG,OAAO,CAA0BD,MAAM,CAAC,CAAC;EACvD;EAEA,MAAME,OAAOA,CAACC,WAAmB,EAAsB;IACrD,IAAIA,WAAW,GAAG,CAAC,EAAE;MACnB,MAAM,IAAIvB,iBAAiB,CAAC,2CAA2C,CAAC;IAC1E;IAEA,IAAIuB,WAAW,GAAG,IAAI,CAACF,OAAO,CAACG,WAAW,EAAE;MAC1C,MAAM,IAAIxB,iBAAiB,CACzB,sDAAsDuB,WAAW,EACnE,CAAC;IACH;IAEA,IAAIA,WAAW,GAAG,IAAI,CAACN,QAAQ,EAAE;MAC/B,MAAM,IAAIjB,iBAAiB,CACzB,8DAA8DuB,WAAW,EAC3E,CAAC;IACH;IAEA,IAAI,CAACL,WAAW,GAAG,IAAI;IAEvB,MAAO,IAAI,CAACG,OAAO,CAA0BC,OAAO,CAACC,WAAW,CAAC;EACnE;EAEA,MAAME,cAAcA,CAAA,EAAyB;IAC3C,IAAI,IAAI,CAACN,WAAW,EAAE;MACpB,MAAM,IAAInB,iBAAiB,CAAC,0CAA0C,CAAC;IACzE;IAEA,IAAI,CAACmB,WAAW,GAAG,IAAI;IAEvB,MAAMO,WAAW,GAAG,MAClB,IAAI,CAACL,OAAO,CACZI,cAAc,CAAC,CAAC;IAElB,OAAO,IAAIvB,WAAW,CAACwB,WAAW,CAAC;EACrC;AACF","ignoreList":[]}
|
|
@@ -3,11 +3,26 @@
|
|
|
3
3
|
export function clamp(value, min, max) {
|
|
4
4
|
return Math.min(Math.max(value, min), max);
|
|
5
5
|
}
|
|
6
|
-
|
|
6
|
+
let isWorkletsAvailable = false;
|
|
7
|
+
export let isWorkletsVersionSupported = false;
|
|
8
|
+
export let workletsVersion = 'unknown';
|
|
9
|
+
export const supportedWorkletsVersions = ['0.6.0', '0.6.1'];
|
|
7
10
|
export let workletsModule;
|
|
11
|
+
export function assertWorkletsEnabled() {
|
|
12
|
+
if (!isWorkletsAvailable) {
|
|
13
|
+
throw new Error('[react-native-audio-api]: Worklets are not available. Please install react-native-worklets to use this feature.');
|
|
14
|
+
} else if (!isWorkletsVersionSupported) {
|
|
15
|
+
throw new Error(`[react-native-audio-api]: Worklets version ${workletsVersion} is not supported.
|
|
16
|
+
Please install react-native-worklets of one of the following versions: [${supportedWorkletsVersions.join(', ')}] to use this feature.`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
8
19
|
try {
|
|
9
20
|
workletsModule = require('react-native-worklets');
|
|
21
|
+
const workletsModuleJson = require('react-native-worklets/package.json');
|
|
22
|
+
isWorkletsVersionSupported = supportedWorkletsVersions.includes(workletsModuleJson.version);
|
|
10
23
|
isWorkletsAvailable = true;
|
|
24
|
+
workletsVersion = workletsModuleJson.version;
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
11
26
|
} catch (error) {
|
|
12
27
|
isWorkletsAvailable = false;
|
|
13
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["clamp","value","min","max","Math","isWorkletsAvailable","workletsModule","require","error"],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":";;AAWA,OAAO,SAASA,KAAKA,CAACC,KAAa,EAAEC,GAAW,EAAEC,GAAW,EAAU;EACrE,OAAOC,IAAI,CAACF,GAAG,CAACE,IAAI,CAACD,GAAG,CAACF,KAAK,EAAEC,GAAG,CAAC,EAAEC,GAAG,CAAC;AAC5C;AAEA,
|
|
1
|
+
{"version":3,"names":["clamp","value","min","max","Math","isWorkletsAvailable","isWorkletsVersionSupported","workletsVersion","supportedWorkletsVersions","workletsModule","assertWorkletsEnabled","Error","join","require","workletsModuleJson","includes","version","error"],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":";;AAWA,OAAO,SAASA,KAAKA,CAACC,KAAa,EAAEC,GAAW,EAAEC,GAAW,EAAU;EACrE,OAAOC,IAAI,CAACF,GAAG,CAACE,IAAI,CAACD,GAAG,CAACF,KAAK,EAAEC,GAAG,CAAC,EAAEC,GAAG,CAAC;AAC5C;AAEA,IAAIE,mBAAmB,GAAG,KAAK;AAC/B,OAAO,IAAIC,0BAA0B,GAAG,KAAK;AAC7C,OAAO,IAAIC,eAAe,GAAG,SAAS;AACtC,OAAO,MAAMC,yBAAyB,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;AAC3D,OAAO,IAAIC,cAAuC;AAElD,OAAO,SAASC,qBAAqBA,CAAA,EAAG;EACtC,IAAI,CAACL,mBAAmB,EAAE;IACxB,MAAM,IAAIM,KAAK,CACb,iHACF,CAAC;EACH,CAAC,MAAM,IAAI,CAACL,0BAA0B,EAAE;IACtC,MAAM,IAAIK,KAAK,CACb,8CAA8CJ,eAAe;AACnE,gFAAgFC,yBAAyB,CAACI,IAAI,CAAC,IAAI,CAAC,wBAChH,CAAC;EACH;AACF;AAEA,IAAI;EACFH,cAAc,GAAGI,OAAO,CAAC,uBAAuB,CAAC;EACjD,MAAMC,kBAAkB,GAAGD,OAAO,CAAC,oCAAoC,CAAC;EACxEP,0BAA0B,GAAGE,yBAAyB,CAACO,QAAQ,CAC7DD,kBAAkB,CAACE,OACrB,CAAC;EACDX,mBAAmB,GAAG,IAAI;EAC1BE,eAAe,GAAGO,kBAAkB,CAACE,OAAO;EAC5C;AACF,CAAC,CAAC,OAAOC,KAAK,EAAE;EACdZ,mBAAmB,GAAG,KAAK;AAC7B","ignoreList":[]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import BaseAudioContext from './BaseAudioContext';
|
|
2
2
|
import { AudioContextOptions } from '../types';
|
|
3
3
|
export default class AudioContext extends BaseAudioContext {
|
|
4
|
-
private _audioRuntime;
|
|
5
4
|
constructor(options?: AudioContextOptions);
|
|
6
5
|
close(): Promise<void>;
|
|
7
6
|
resume(): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/AudioContext.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAI/C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,gBAAgB;
|
|
1
|
+
{"version":3,"file":"AudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/AudioContext.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAI/C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,gBAAgB;gBAC5C,OAAO,CAAC,EAAE,mBAAmB;IAyBnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAI1B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAGlC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseAudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/BaseAudioContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,gCAAgC,EAChC,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAElB,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,0BAA0B,MAAM,8BAA8B,CAAC;AACtE,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;gBAExB,OAAO,EAAE,iBAAiB;IAMtC,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,KAAK,IAAI,YAAY,CAE/B;IAED,iBAAiB,CACf,QAAQ,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,EACxE,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EACzB,cAAc,GAAE,mBAAoC,GACnD,WAAW;
|
|
1
|
+
{"version":3,"file":"BaseAudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/BaseAudioContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,6 @@ export default class OfflineAudioContext extends BaseAudioContext {
|
|
|
5
5
|
private isSuspended;
|
|
6
6
|
private isRendering;
|
|
7
7
|
private duration;
|
|
8
|
-
private _audioRuntime;
|
|
9
8
|
constructor(options: OfflineAudioContextOptions);
|
|
10
9
|
constructor(numberOfChannels: number, length: number, sampleRate: number);
|
|
11
10
|
resume(): Promise<undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OfflineAudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/OfflineAudioContext.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,WAAW,MAAM,eAAe,CAAC;AAGxC,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,gBAAgB;IAC/D,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAS;
|
|
1
|
+
{"version":3,"file":"OfflineAudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/OfflineAudioContext.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,WAAW,MAAM,eAAe,CAAC;AAGxC,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,gBAAgB;IAC/D,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,0BAA0B;gBACnC,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAsClE,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAkB5B,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAsBhD,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;CAa7C"}
|
|
@@ -4,7 +4,10 @@ interface SimplifiedWorkletModule {
|
|
|
4
4
|
createWorkletRuntime: (options?: any) => any;
|
|
5
5
|
}
|
|
6
6
|
export declare function clamp(value: number, min: number, max: number): number;
|
|
7
|
-
export declare let
|
|
7
|
+
export declare let isWorkletsVersionSupported: boolean;
|
|
8
|
+
export declare let workletsVersion: string;
|
|
9
|
+
export declare const supportedWorkletsVersions: string[];
|
|
8
10
|
export declare let workletsModule: SimplifiedWorkletModule;
|
|
11
|
+
export declare function assertWorkletsEnabled(): void;
|
|
9
12
|
export {};
|
|
10
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAE9D,UAAU,uBAAuB;IAC/B,2BAA2B,EAAE,CAC3B,eAAe,EAAE,wBAAwB,KACtC,wBAAwB,CAAC;IAG9B,oBAAoB,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC;CAC9C;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAE9D,UAAU,uBAAuB;IAC/B,2BAA2B,EAAE,CAC3B,eAAe,EAAE,wBAAwB,KACtC,wBAAwB,CAAC;IAG9B,oBAAoB,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC;CAC9C;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;AAGD,eAAO,IAAI,0BAA0B,SAAQ,CAAC;AAC9C,eAAO,IAAI,eAAe,QAAY,CAAC;AACvC,eAAO,MAAM,yBAAyB,UAAqB,CAAC;AAC5D,eAAO,IAAI,cAAc,EAAE,uBAAuB,CAAC;AAEnD,wBAAgB,qBAAqB,SAWpC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-audio-api",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.2",
|
|
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"
|
|
@@ -35,6 +35,9 @@
|
|
|
35
35
|
"!**/.*",
|
|
36
36
|
"!**/node_modules",
|
|
37
37
|
"scripts/setup-rn-audio-api-web.js",
|
|
38
|
+
"scripts/rnaa_utils.rb",
|
|
39
|
+
"scripts/validate-worklets-version.js",
|
|
40
|
+
"scripts/download-prebuilt-binaries.sh",
|
|
38
41
|
"app.plugin.js"
|
|
39
42
|
],
|
|
40
43
|
"scripts": {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
def check_if_worklets_enabled()
|
|
2
|
+
validate_worklets_script = File.expand_path(File.join(__dir__, 'validate-worklets-version.js'))
|
|
3
|
+
unless system("node \"#{validate_worklets_script}\"")
|
|
4
|
+
# If the validation script fails, we assume worklets are not present or have an incompatible version
|
|
5
|
+
return false
|
|
6
|
+
end
|
|
7
|
+
true
|
|
8
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const semverPrerelease = require('semver/functions/prerelease');
|
|
3
|
+
const validWorkletsVersions = [
|
|
4
|
+
'0.6.0',
|
|
5
|
+
'0.6.1',
|
|
6
|
+
];
|
|
7
|
+
|
|
8
|
+
function validateVersion() {
|
|
9
|
+
let workletsVersion;
|
|
10
|
+
try {
|
|
11
|
+
const { version } = require('react-native-worklets/package.json');
|
|
12
|
+
workletsVersion = version;
|
|
13
|
+
} catch (e) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
if (semverPrerelease(workletsVersion)) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return validWorkletsVersions.includes(workletsVersion);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (!validateVersion()) {
|
|
24
|
+
console.error(
|
|
25
|
+
'Incompatible version of react-native-audio-worklets detected. Please install a compatible version.',
|
|
26
|
+
);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
package/src/core/AudioContext.ts
CHANGED
|
@@ -3,13 +3,9 @@ import BaseAudioContext from './BaseAudioContext';
|
|
|
3
3
|
import AudioManager from '../system';
|
|
4
4
|
import { AudioContextOptions } from '../types';
|
|
5
5
|
import { NotSupportedError } from '../errors';
|
|
6
|
-
import {
|
|
6
|
+
import { isWorkletsVersionSupported, workletsModule } from '../utils';
|
|
7
7
|
|
|
8
8
|
export default class AudioContext extends BaseAudioContext {
|
|
9
|
-
// We need to keep here a reference to this runtime to better manage its lifecycle
|
|
10
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
11
|
-
private _audioRuntime: any = null;
|
|
12
|
-
|
|
13
9
|
constructor(options?: AudioContextOptions) {
|
|
14
10
|
if (
|
|
15
11
|
options &&
|
|
@@ -21,7 +17,8 @@ export default class AudioContext extends BaseAudioContext {
|
|
|
21
17
|
);
|
|
22
18
|
}
|
|
23
19
|
let audioRuntime = null;
|
|
24
|
-
|
|
20
|
+
|
|
21
|
+
if (isWorkletsVersionSupported) {
|
|
25
22
|
audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
26
23
|
}
|
|
27
24
|
|
|
@@ -32,7 +29,6 @@ export default class AudioContext extends BaseAudioContext {
|
|
|
32
29
|
audioRuntime
|
|
33
30
|
)
|
|
34
31
|
);
|
|
35
|
-
this._audioRuntime = audioRuntime;
|
|
36
32
|
}
|
|
37
33
|
|
|
38
34
|
async close(): Promise<void> {
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
PeriodicWaveConstraints,
|
|
7
7
|
AudioWorkletRuntime,
|
|
8
8
|
} from '../types';
|
|
9
|
-
import {
|
|
9
|
+
import { assertWorkletsEnabled, workletsModule } from '../utils';
|
|
10
10
|
import WorkletSourceNode from './WorkletSourceNode';
|
|
11
11
|
import WorkletProcessingNode from './WorkletProcessingNode';
|
|
12
12
|
import AnalyserNode from './AnalyserNode';
|
|
@@ -59,30 +59,24 @@ export default class BaseAudioContext {
|
|
|
59
59
|
`The buffer length provided (${bufferLength}) can not be less than 1`
|
|
60
60
|
);
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
)
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
84
|
-
throw new Error(
|
|
85
|
-
'[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
|
|
62
|
+
assertWorkletsEnabled();
|
|
63
|
+
const shareableWorklet = workletsModule.makeShareableCloneRecursive(
|
|
64
|
+
(audioBuffers: Array<ArrayBuffer>, channelCount: number) => {
|
|
65
|
+
'worklet';
|
|
66
|
+
const floatAudioData: Array<Float32Array> = audioBuffers.map(
|
|
67
|
+
(buffer) => new Float32Array(buffer)
|
|
68
|
+
);
|
|
69
|
+
callback(floatAudioData, channelCount);
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
return new WorkletNode(
|
|
73
|
+
this,
|
|
74
|
+
this.context.createWorkletNode(
|
|
75
|
+
shareableWorklet,
|
|
76
|
+
workletRuntime === 'UIRuntime',
|
|
77
|
+
bufferLength,
|
|
78
|
+
inputChannelCount
|
|
79
|
+
)
|
|
86
80
|
);
|
|
87
81
|
}
|
|
88
82
|
|
|
@@ -95,35 +89,30 @@ export default class BaseAudioContext {
|
|
|
95
89
|
) => void,
|
|
96
90
|
workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
|
|
97
91
|
): WorkletProcessingNode {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
125
|
-
throw new Error(
|
|
126
|
-
'[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
|
|
92
|
+
assertWorkletsEnabled();
|
|
93
|
+
const shareableWorklet = workletsModule.makeShareableCloneRecursive(
|
|
94
|
+
(
|
|
95
|
+
inputBuffers: Array<ArrayBuffer>,
|
|
96
|
+
outputBuffers: Array<ArrayBuffer>,
|
|
97
|
+
framesToProcess: number,
|
|
98
|
+
currentTime: number
|
|
99
|
+
) => {
|
|
100
|
+
'worklet';
|
|
101
|
+
const inputData: Array<Float32Array> = inputBuffers.map(
|
|
102
|
+
(buffer) => new Float32Array(buffer, 0, framesToProcess)
|
|
103
|
+
);
|
|
104
|
+
const outputData: Array<Float32Array> = outputBuffers.map(
|
|
105
|
+
(buffer) => new Float32Array(buffer, 0, framesToProcess)
|
|
106
|
+
);
|
|
107
|
+
callback(inputData, outputData, framesToProcess, currentTime);
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
return new WorkletProcessingNode(
|
|
111
|
+
this,
|
|
112
|
+
this.context.createWorkletProcessingNode(
|
|
113
|
+
shareableWorklet,
|
|
114
|
+
workletRuntime === 'UIRuntime'
|
|
115
|
+
)
|
|
127
116
|
);
|
|
128
117
|
}
|
|
129
118
|
|
|
@@ -136,12 +125,7 @@ export default class BaseAudioContext {
|
|
|
136
125
|
) => void,
|
|
137
126
|
workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
|
|
138
127
|
): WorkletSourceNode {
|
|
139
|
-
|
|
140
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
141
|
-
throw new Error(
|
|
142
|
-
'[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
|
|
143
|
-
);
|
|
144
|
-
}
|
|
128
|
+
assertWorkletsEnabled();
|
|
145
129
|
const shareableWorklet = workletsModule.makeShareableCloneRecursive(
|
|
146
130
|
(
|
|
147
131
|
audioBuffers: Array<ArrayBuffer>,
|
|
@@ -3,17 +3,13 @@ import BaseAudioContext from './BaseAudioContext';
|
|
|
3
3
|
import { OfflineAudioContextOptions } from '../types';
|
|
4
4
|
import { InvalidStateError, NotSupportedError } from '../errors';
|
|
5
5
|
import AudioBuffer from './AudioBuffer';
|
|
6
|
-
import {
|
|
6
|
+
import { isWorkletsVersionSupported, workletsModule } from '../utils';
|
|
7
7
|
|
|
8
8
|
export default class OfflineAudioContext extends BaseAudioContext {
|
|
9
9
|
private isSuspended: boolean;
|
|
10
10
|
private isRendering: boolean;
|
|
11
11
|
private duration: number;
|
|
12
12
|
|
|
13
|
-
// We need to keep here a reference to this runtime to better manage its lifecycle
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
15
|
-
private _audioRuntime: any;
|
|
16
|
-
|
|
17
13
|
constructor(options: OfflineAudioContextOptions);
|
|
18
14
|
constructor(numberOfChannels: number, length: number, sampleRate: number);
|
|
19
15
|
constructor(
|
|
@@ -22,7 +18,7 @@ export default class OfflineAudioContext extends BaseAudioContext {
|
|
|
22
18
|
arg2?: number
|
|
23
19
|
) {
|
|
24
20
|
let audioRuntime = null;
|
|
25
|
-
if (
|
|
21
|
+
if (isWorkletsVersionSupported) {
|
|
26
22
|
audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
27
23
|
}
|
|
28
24
|
|
|
@@ -51,7 +47,6 @@ export default class OfflineAudioContext extends BaseAudioContext {
|
|
|
51
47
|
|
|
52
48
|
this.isSuspended = false;
|
|
53
49
|
this.isRendering = false;
|
|
54
|
-
this._audioRuntime = audioRuntime;
|
|
55
50
|
}
|
|
56
51
|
|
|
57
52
|
async resume(): Promise<undefined> {
|
package/src/utils/index.ts
CHANGED
|
@@ -13,12 +13,34 @@ export function clamp(value: number, min: number, max: number): number {
|
|
|
13
13
|
return Math.min(Math.max(value, min), max);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
let isWorkletsAvailable = false;
|
|
17
|
+
export let isWorkletsVersionSupported = false;
|
|
18
|
+
export let workletsVersion = 'unknown';
|
|
19
|
+
export const supportedWorkletsVersions = ['0.6.0', '0.6.1'];
|
|
17
20
|
export let workletsModule: SimplifiedWorkletModule;
|
|
18
21
|
|
|
22
|
+
export function assertWorkletsEnabled() {
|
|
23
|
+
if (!isWorkletsAvailable) {
|
|
24
|
+
throw new Error(
|
|
25
|
+
'[react-native-audio-api]: Worklets are not available. Please install react-native-worklets to use this feature.'
|
|
26
|
+
);
|
|
27
|
+
} else if (!isWorkletsVersionSupported) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`[react-native-audio-api]: Worklets version ${workletsVersion} is not supported.
|
|
30
|
+
Please install react-native-worklets of one of the following versions: [${supportedWorkletsVersions.join(', ')}] to use this feature.`
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
19
35
|
try {
|
|
20
36
|
workletsModule = require('react-native-worklets');
|
|
37
|
+
const workletsModuleJson = require('react-native-worklets/package.json');
|
|
38
|
+
isWorkletsVersionSupported = supportedWorkletsVersions.includes(
|
|
39
|
+
workletsModuleJson.version
|
|
40
|
+
);
|
|
21
41
|
isWorkletsAvailable = true;
|
|
42
|
+
workletsVersion = workletsModuleJson.version;
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
22
44
|
} catch (error) {
|
|
23
45
|
isWorkletsAvailable = false;
|
|
24
46
|
}
|