react-native-audio-api 0.10.0-nightly-2d11b56-20251021 → 0.10.0-nightly-325e87a-20251023
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 +3 -0
- 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/common/cpp/audioapi/AudioAPIModuleInstaller.h +20 -0
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +1 -1
- package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +69 -32
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +37 -1
- package/common/cpp/audioapi/core/utils/Constants.h +2 -1
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +0 -10
- package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +2 -3
- package/common/cpp/test/CMakeLists.txt +3 -0
- package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +389 -0
- package/common/cpp/test/src/biquad/BiquadFilterChromium.h +64 -0
- package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +284 -0
- package/common/cpp/test/src/biquad/BiquadFilterTest.h +40 -0
- package/ios/audioapi/ios/AudioAPIModule.h +2 -1
- package/ios/audioapi/ios/AudioAPIModule.mm +2 -0
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +1 -2
- package/ios/audioapi/ios/system/AudioSessionManager.mm +9 -0
- package/lib/commonjs/core/AudioContext.js +1 -1
- 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 -1
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/utils/index.js +19 -4
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/module/core/AudioContext.js +2 -2
- 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 -2
- package/lib/module/core/OfflineAudioContext.js.map +1 -1
- package/lib/module/utils/index.js +15 -1
- package/lib/module/utils/index.js.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.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 +1 -1
- package/src/core/AudioContext.ts +3 -2
- package/src/core/BaseAudioContext.ts +44 -60
- package/src/core/OfflineAudioContext.ts +2 -2
- package/src/utils/index.ts +22 -1
|
@@ -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";
|
|
@@ -47,37 +47,28 @@ export default class BaseAudioContext {
|
|
|
47
47
|
if (bufferLength < 1) {
|
|
48
48
|
throw new NotSupportedError(`The buffer length provided (${bufferLength}) can not be less than 1`);
|
|
49
49
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
assertWorkletsEnabled();
|
|
51
|
+
const shareableWorklet = workletsModule.makeShareableCloneRecursive((audioBuffers, channelCount) => {
|
|
52
|
+
'worklet';
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
60
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
54
|
+
const floatAudioData = audioBuffers.map(buffer => new Float32Array(buffer));
|
|
55
|
+
callback(floatAudioData, channelCount);
|
|
56
|
+
});
|
|
57
|
+
return new WorkletNode(this, this.context.createWorkletNode(shareableWorklet, workletRuntime === 'UIRuntime', bufferLength, inputChannelCount));
|
|
61
58
|
}
|
|
62
59
|
createWorkletProcessingNode(callback, workletRuntime = 'AudioRuntime') {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
assertWorkletsEnabled();
|
|
61
|
+
const shareableWorklet = workletsModule.makeShareableCloneRecursive((inputBuffers, outputBuffers, framesToProcess, currentTime) => {
|
|
62
|
+
'worklet';
|
|
66
63
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
74
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
64
|
+
const inputData = inputBuffers.map(buffer => new Float32Array(buffer, 0, framesToProcess));
|
|
65
|
+
const outputData = outputBuffers.map(buffer => new Float32Array(buffer, 0, framesToProcess));
|
|
66
|
+
callback(inputData, outputData, framesToProcess, currentTime);
|
|
67
|
+
});
|
|
68
|
+
return new WorkletProcessingNode(this, this.context.createWorkletProcessingNode(shareableWorklet, workletRuntime === 'UIRuntime'));
|
|
75
69
|
}
|
|
76
70
|
createWorkletSourceNode(callback, workletRuntime = 'AudioRuntime') {
|
|
77
|
-
|
|
78
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
79
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
80
|
-
}
|
|
71
|
+
assertWorkletsEnabled();
|
|
81
72
|
const shareableWorklet = workletsModule.makeShareableCloneRecursive((audioBuffers, framesToProcess, currentTime, startOffset) => {
|
|
82
73
|
'worklet';
|
|
83
74
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["InvalidAccessError","NotSupportedError","
|
|
1
|
+
{"version":3,"names":["InvalidAccessError","NotSupportedError","assertWorkletsEnabled","workletsModule","WorkletSourceNode","WorkletProcessingNode","AnalyserNode","AudioBuffer","AudioBufferQueueSourceNode","AudioBufferSourceNode","AudioDestinationNode","BiquadFilterNode","ConstantSourceNode","GainNode","OscillatorNode","PeriodicWave","RecorderAdapterNode","StereoPannerNode","StreamerNode","WorkletNode","decodeAudioData","decodePCMInBase64","BaseAudioContext","constructor","context","destination","sampleRate","currentTime","state","input","ArrayBuffer","TypeError","base64String","inputSampleRate","inputChannelCount","isInterleaved","createWorkletNode","callback","bufferLength","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"],"sourceRoot":"../../../src","sources":["core/BaseAudioContext.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,11 +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
8
|
constructor(arg0, arg1, arg2) {
|
|
9
9
|
let audioRuntime = null;
|
|
10
|
-
if (
|
|
10
|
+
if (isWorkletsVersionSupported) {
|
|
11
11
|
audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
12
12
|
}
|
|
13
13
|
if (typeof arg0 === 'object') {
|
|
@@ -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,25 @@
|
|
|
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;
|
|
11
25
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
12
26
|
} catch (error) {
|
|
13
27
|
isWorkletsAvailable = false;
|
|
@@ -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 +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;gBAC5C,OAAO,CAAC,EAAE,mBAAmB;
|
|
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,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,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;AAGxC,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;IAEY,eAAe,CAC1B,KAAK,EAAE,MAAM,GAAG,WAAW,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC;IAOV,iBAAiB,CAC5B,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,EACzB,aAAa,GAAE,OAAc,GAC5B,OAAO,CAAC,WAAW,CAAC;IASvB,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":"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,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,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;AAGxC,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;IAEY,eAAe,CAC1B,KAAK,EAAE,MAAM,GAAG,WAAW,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC;IAOV,iBAAiB,CAC5B,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,EACzB,aAAa,GAAE,OAAc,GAC5B,OAAO,CAAC,WAAW,CAAC;IASvB,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;IAgCd,2BAA2B,CACzB,QAAQ,EAAE,CACR,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,EAC9B,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,EAC/B,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,KAChB,IAAI,EACT,cAAc,GAAE,mBAAoC,GACnD,qBAAqB;IA4BxB,uBAAuB,CACrB,QAAQ,EAAE,CACR,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,EAC9B,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,KAChB,IAAI,EACT,cAAc,GAAE,mBAAoC,GACnD,iBAAiB;IAyBpB,qBAAqB,IAAI,mBAAmB;IAI5C,gBAAgB,IAAI,cAAc;IAIlC,cAAc,IAAI,YAAY;IAI9B,oBAAoB,IAAI,kBAAkB;IAI1C,UAAU,IAAI,QAAQ;IAItB,kBAAkB,IAAI,gBAAgB;IAItC,kBAAkB,IAAI,gBAAgB;IAItC,kBAAkB,CAChB,OAAO,CAAC,EAAE,gCAAgC,GACzC,qBAAqB;IASxB,uBAAuB,CACrB,OAAO,CAAC,EAAE,gCAAgC,GACzC,0BAA0B;IAS7B,YAAY,CACV,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,WAAW;IAwBd,kBAAkB,CAChB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,YAAY,EAClB,WAAW,CAAC,EAAE,uBAAuB,GACpC,YAAY;IAcf,cAAc,IAAI,YAAY;CAG/B"}
|
|
@@ -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.10.0-nightly-
|
|
3
|
+
"version": "0.10.0-nightly-325e87a-20251023",
|
|
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"
|
package/src/core/AudioContext.ts
CHANGED
|
@@ -3,7 +3,7 @@ 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
9
|
constructor(options?: AudioContextOptions) {
|
|
@@ -17,7 +17,8 @@ export default class AudioContext extends BaseAudioContext {
|
|
|
17
17
|
);
|
|
18
18
|
}
|
|
19
19
|
let audioRuntime = null;
|
|
20
|
-
|
|
20
|
+
|
|
21
|
+
if (isWorkletsVersionSupported) {
|
|
21
22
|
audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
22
23
|
}
|
|
23
24
|
|
|
@@ -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';
|
|
@@ -84,30 +84,24 @@ export default class BaseAudioContext {
|
|
|
84
84
|
`The buffer length provided (${bufferLength}) can not be less than 1`
|
|
85
85
|
);
|
|
86
86
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
)
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
109
|
-
throw new Error(
|
|
110
|
-
'[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
|
|
87
|
+
assertWorkletsEnabled();
|
|
88
|
+
const shareableWorklet = workletsModule.makeShareableCloneRecursive(
|
|
89
|
+
(audioBuffers: Array<ArrayBuffer>, channelCount: number) => {
|
|
90
|
+
'worklet';
|
|
91
|
+
const floatAudioData: Array<Float32Array> = audioBuffers.map(
|
|
92
|
+
(buffer) => new Float32Array(buffer)
|
|
93
|
+
);
|
|
94
|
+
callback(floatAudioData, channelCount);
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
return new WorkletNode(
|
|
98
|
+
this,
|
|
99
|
+
this.context.createWorkletNode(
|
|
100
|
+
shareableWorklet,
|
|
101
|
+
workletRuntime === 'UIRuntime',
|
|
102
|
+
bufferLength,
|
|
103
|
+
inputChannelCount
|
|
104
|
+
)
|
|
111
105
|
);
|
|
112
106
|
}
|
|
113
107
|
|
|
@@ -120,35 +114,30 @@ export default class BaseAudioContext {
|
|
|
120
114
|
) => void,
|
|
121
115
|
workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
|
|
122
116
|
): WorkletProcessingNode {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
150
|
-
throw new Error(
|
|
151
|
-
'[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
|
|
117
|
+
assertWorkletsEnabled();
|
|
118
|
+
const shareableWorklet = workletsModule.makeShareableCloneRecursive(
|
|
119
|
+
(
|
|
120
|
+
inputBuffers: Array<ArrayBuffer>,
|
|
121
|
+
outputBuffers: Array<ArrayBuffer>,
|
|
122
|
+
framesToProcess: number,
|
|
123
|
+
currentTime: number
|
|
124
|
+
) => {
|
|
125
|
+
'worklet';
|
|
126
|
+
const inputData: Array<Float32Array> = inputBuffers.map(
|
|
127
|
+
(buffer) => new Float32Array(buffer, 0, framesToProcess)
|
|
128
|
+
);
|
|
129
|
+
const outputData: Array<Float32Array> = outputBuffers.map(
|
|
130
|
+
(buffer) => new Float32Array(buffer, 0, framesToProcess)
|
|
131
|
+
);
|
|
132
|
+
callback(inputData, outputData, framesToProcess, currentTime);
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
return new WorkletProcessingNode(
|
|
136
|
+
this,
|
|
137
|
+
this.context.createWorkletProcessingNode(
|
|
138
|
+
shareableWorklet,
|
|
139
|
+
workletRuntime === 'UIRuntime'
|
|
140
|
+
)
|
|
152
141
|
);
|
|
153
142
|
}
|
|
154
143
|
|
|
@@ -161,12 +150,7 @@ export default class BaseAudioContext {
|
|
|
161
150
|
) => void,
|
|
162
151
|
workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
|
|
163
152
|
): WorkletSourceNode {
|
|
164
|
-
|
|
165
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
166
|
-
throw new Error(
|
|
167
|
-
'[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
|
|
168
|
-
);
|
|
169
|
-
}
|
|
153
|
+
assertWorkletsEnabled();
|
|
170
154
|
const shareableWorklet = workletsModule.makeShareableCloneRecursive(
|
|
171
155
|
(
|
|
172
156
|
audioBuffers: Array<ArrayBuffer>,
|
|
@@ -3,7 +3,7 @@ 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;
|
|
@@ -18,7 +18,7 @@ export default class OfflineAudioContext extends BaseAudioContext {
|
|
|
18
18
|
arg2?: number
|
|
19
19
|
) {
|
|
20
20
|
let audioRuntime = null;
|
|
21
|
-
if (
|
|
21
|
+
if (isWorkletsVersionSupported) {
|
|
22
22
|
audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
23
23
|
}
|
|
24
24
|
|
package/src/utils/index.ts
CHANGED
|
@@ -13,12 +13,33 @@ 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;
|
|
22
43
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
23
44
|
} catch (error) {
|
|
24
45
|
isWorkletsAvailable = false;
|