react-native-audio-api 0.10.0 → 0.10.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/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +2 -0
- package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +1 -0
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +3 -3
- package/common/cpp/test/src/AudioParamTest.cpp +1 -1
- package/common/cpp/test/src/AudioScheduledSourceTest.cpp +134 -0
- package/common/cpp/test/src/ConstantSourceTest.cpp +1 -1
- package/common/cpp/test/src/GainTest.cpp +1 -1
- package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +4 -4
- package/common/cpp/test/src/OscillatorTest.cpp +1 -1
- package/common/cpp/test/src/StereoPannerTest.cpp +1 -1
- package/common/cpp/test/src/biquad/BiquadFilterTest.h +1 -1
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +2 -1
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +90 -0
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -0
- package/lib/commonjs/AudioAPIModule/globals.d.js +6 -0
- package/lib/commonjs/AudioAPIModule/globals.d.js.map +1 -0
- package/lib/commonjs/AudioAPIModule/index.js +14 -0
- package/lib/commonjs/AudioAPIModule/index.js.map +1 -0
- package/lib/commonjs/api.js +14 -24
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/core/AudioContext.js +4 -7
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +8 -7
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/OfflineAudioContext.js +3 -6
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/system/AudioManager.js +1 -7
- package/lib/commonjs/system/AudioManager.js.map +1 -1
- package/lib/commonjs/utils/index.js +9 -22
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/module/AudioAPIModule/AudioAPIModule.js +87 -0
- package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -0
- package/lib/module/AudioAPIModule/globals.d.js +4 -0
- package/lib/module/AudioAPIModule/globals.d.js.map +1 -0
- package/lib/module/AudioAPIModule/index.js +4 -0
- package/lib/module/AudioAPIModule/index.js.map +1 -0
- package/lib/module/api.js +17 -28
- package/lib/module/api.js.map +1 -1
- package/lib/module/core/AudioContext.js +4 -7
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +9 -8
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/OfflineAudioContext.js +3 -6
- package/lib/module/core/OfflineAudioContext.js.map +1 -1
- package/lib/module/system/AudioManager.js +1 -7
- package/lib/module/system/AudioManager.js.map +1 -1
- package/lib/module/utils/index.js +8 -21
- package/lib/module/utils/index.js.map +1 -1
- package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +36 -0
- package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -0
- package/lib/typescript/AudioAPIModule/index.d.ts +2 -0
- package/lib/typescript/AudioAPIModule/index.d.ts.map +1 -0
- package/lib/typescript/api.d.ts +17 -26
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts +1 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +4 -4
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/OfflineAudioContext.d.ts +1 -1
- package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
- package/lib/typescript/system/AudioManager.d.ts +2 -2
- package/lib/typescript/system/AudioManager.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +1 -11
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/package.json +6 -2
- package/scripts/validate-worklets-version.js +4 -5
- package/src/AudioAPIModule/AudioAPIModule.ts +122 -0
- package/src/AudioAPIModule/globals.d.ts +35 -0
- package/src/AudioAPIModule/index.ts +1 -0
- package/src/api.ts +20 -72
- package/src/core/AudioContext.ts +4 -7
- package/src/core/BaseAudioContext.ts +58 -47
- package/src/core/OfflineAudioContext.ts +4 -7
- package/src/system/AudioManager.ts +9 -19
- package/src/utils/index.ts +9 -35
|
@@ -1,23 +1,23 @@
|
|
|
1
|
+
import AudioAPIModule from '../AudioAPIModule';
|
|
1
2
|
import { InvalidAccessError, NotSupportedError } from '../errors';
|
|
2
3
|
import { IBaseAudioContext } from '../interfaces';
|
|
3
4
|
import {
|
|
4
5
|
AudioBufferBaseSourceNodeOptions,
|
|
5
|
-
ContextState,
|
|
6
|
-
PeriodicWaveConstraints,
|
|
7
6
|
AudioWorkletRuntime,
|
|
7
|
+
ContextState,
|
|
8
8
|
ConvolverNodeOptions,
|
|
9
|
+
PeriodicWaveConstraints,
|
|
9
10
|
} from '../types';
|
|
10
|
-
import { assertWorkletsEnabled
|
|
11
|
-
import WorkletSourceNode from './WorkletSourceNode';
|
|
12
|
-
import WorkletProcessingNode from './WorkletProcessingNode';
|
|
11
|
+
import { assertWorkletsEnabled } from '../utils';
|
|
13
12
|
import AnalyserNode from './AnalyserNode';
|
|
14
13
|
import AudioBuffer from './AudioBuffer';
|
|
15
14
|
import AudioBufferQueueSourceNode from './AudioBufferQueueSourceNode';
|
|
16
|
-
import ConvolverNode from './ConvolverNode';
|
|
17
15
|
import AudioBufferSourceNode from './AudioBufferSourceNode';
|
|
16
|
+
import { decodeAudioData, decodePCMInBase64 } from './AudioDecoder';
|
|
18
17
|
import AudioDestinationNode from './AudioDestinationNode';
|
|
19
18
|
import BiquadFilterNode from './BiquadFilterNode';
|
|
20
19
|
import ConstantSourceNode from './ConstantSourceNode';
|
|
20
|
+
import ConvolverNode from './ConvolverNode';
|
|
21
21
|
import GainNode from './GainNode';
|
|
22
22
|
import OscillatorNode from './OscillatorNode';
|
|
23
23
|
import PeriodicWave from './PeriodicWave';
|
|
@@ -25,7 +25,8 @@ import RecorderAdapterNode from './RecorderAdapterNode';
|
|
|
25
25
|
import StereoPannerNode from './StereoPannerNode';
|
|
26
26
|
import StreamerNode from './StreamerNode';
|
|
27
27
|
import WorkletNode from './WorkletNode';
|
|
28
|
-
import
|
|
28
|
+
import WorkletProcessingNode from './WorkletProcessingNode';
|
|
29
|
+
import WorkletSourceNode from './WorkletSourceNode';
|
|
29
30
|
|
|
30
31
|
export default class BaseAudioContext {
|
|
31
32
|
readonly destination: AudioDestinationNode;
|
|
@@ -81,21 +82,26 @@ export default class BaseAudioContext {
|
|
|
81
82
|
`The number of input channels provided (${inputChannelCount}) can not be less than 1 or greater than 32`
|
|
82
83
|
);
|
|
83
84
|
}
|
|
85
|
+
|
|
84
86
|
if (bufferLength < 1) {
|
|
85
87
|
throw new NotSupportedError(
|
|
86
88
|
`The buffer length provided (${bufferLength}) can not be less than 1`
|
|
87
89
|
);
|
|
88
90
|
}
|
|
91
|
+
|
|
89
92
|
assertWorkletsEnabled();
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
93
|
+
|
|
94
|
+
const shareableWorklet =
|
|
95
|
+
AudioAPIModule.workletsModule!.makeShareableCloneRecursive(
|
|
96
|
+
(audioBuffers: Array<ArrayBuffer>, channelCount: number) => {
|
|
97
|
+
'worklet';
|
|
98
|
+
const floatAudioData: Array<Float32Array> = audioBuffers.map(
|
|
99
|
+
(buffer) => new Float32Array(buffer)
|
|
100
|
+
);
|
|
101
|
+
callback(floatAudioData, channelCount);
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
|
|
99
105
|
return new WorkletNode(
|
|
100
106
|
this,
|
|
101
107
|
this.context.createWorkletNode(
|
|
@@ -117,23 +123,26 @@ export default class BaseAudioContext {
|
|
|
117
123
|
workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
|
|
118
124
|
): WorkletProcessingNode {
|
|
119
125
|
assertWorkletsEnabled();
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
126
|
+
|
|
127
|
+
const shareableWorklet =
|
|
128
|
+
AudioAPIModule.workletsModule!.makeShareableCloneRecursive(
|
|
129
|
+
(
|
|
130
|
+
inputBuffers: Array<ArrayBuffer>,
|
|
131
|
+
outputBuffers: Array<ArrayBuffer>,
|
|
132
|
+
framesToProcess: number,
|
|
133
|
+
currentTime: number
|
|
134
|
+
) => {
|
|
135
|
+
'worklet';
|
|
136
|
+
const inputData: Array<Float32Array> = inputBuffers.map(
|
|
137
|
+
(buffer) => new Float32Array(buffer, 0, framesToProcess)
|
|
138
|
+
);
|
|
139
|
+
const outputData: Array<Float32Array> = outputBuffers.map(
|
|
140
|
+
(buffer) => new Float32Array(buffer, 0, framesToProcess)
|
|
141
|
+
);
|
|
142
|
+
callback(inputData, outputData, framesToProcess, currentTime);
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
|
|
137
146
|
return new WorkletProcessingNode(
|
|
138
147
|
this,
|
|
139
148
|
this.context.createWorkletProcessingNode(
|
|
@@ -153,20 +162,22 @@ export default class BaseAudioContext {
|
|
|
153
162
|
workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
|
|
154
163
|
): WorkletSourceNode {
|
|
155
164
|
assertWorkletsEnabled();
|
|
156
|
-
const shareableWorklet =
|
|
157
|
-
(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
165
|
+
const shareableWorklet =
|
|
166
|
+
AudioAPIModule.workletsModule!.makeShareableCloneRecursive(
|
|
167
|
+
(
|
|
168
|
+
audioBuffers: Array<ArrayBuffer>,
|
|
169
|
+
framesToProcess: number,
|
|
170
|
+
currentTime: number,
|
|
171
|
+
startOffset: number
|
|
172
|
+
) => {
|
|
173
|
+
'worklet';
|
|
174
|
+
const floatAudioData: Array<Float32Array> = audioBuffers.map(
|
|
175
|
+
(buffer) => new Float32Array(buffer)
|
|
176
|
+
);
|
|
177
|
+
callback(floatAudioData, framesToProcess, currentTime, startOffset);
|
|
178
|
+
}
|
|
179
|
+
);
|
|
180
|
+
|
|
170
181
|
return new WorkletSourceNode(
|
|
171
182
|
this,
|
|
172
183
|
this.context.createWorkletSourceNode(
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import AudioAPIModule from '../AudioAPIModule';
|
|
2
|
+
import { InvalidStateError, NotSupportedError } from '../errors';
|
|
1
3
|
import { IOfflineAudioContext } from '../interfaces';
|
|
2
|
-
import BaseAudioContext from './BaseAudioContext';
|
|
3
4
|
import { OfflineAudioContextOptions } from '../types';
|
|
4
|
-
import { InvalidStateError, NotSupportedError } from '../errors';
|
|
5
5
|
import AudioBuffer from './AudioBuffer';
|
|
6
|
-
import
|
|
6
|
+
import BaseAudioContext from './BaseAudioContext';
|
|
7
7
|
|
|
8
8
|
export default class OfflineAudioContext extends BaseAudioContext {
|
|
9
9
|
private isSuspended: boolean;
|
|
@@ -17,10 +17,7 @@ export default class OfflineAudioContext extends BaseAudioContext {
|
|
|
17
17
|
arg1?: number,
|
|
18
18
|
arg2?: number
|
|
19
19
|
) {
|
|
20
|
-
|
|
21
|
-
if (isWorkletsVersionSupported) {
|
|
22
|
-
audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
23
|
-
}
|
|
20
|
+
const audioRuntime = AudioAPIModule.createAudioRuntime();
|
|
24
21
|
|
|
25
22
|
if (typeof arg0 === 'object') {
|
|
26
23
|
const { numberOfChannels, length, sampleRate } = arg0;
|
|
@@ -1,26 +1,16 @@
|
|
|
1
|
+
import { AudioEventEmitter, AudioEventSubscription } from '../events';
|
|
1
2
|
import {
|
|
2
|
-
SessionOptions,
|
|
3
|
-
LockScreenInfo,
|
|
4
|
-
PermissionStatus,
|
|
5
|
-
AudioDevicesInfo,
|
|
6
|
-
} from './types';
|
|
7
|
-
import {
|
|
8
|
-
SystemEventName,
|
|
9
|
-
SystemEventCallback,
|
|
10
3
|
RemoteCommandEventName,
|
|
4
|
+
SystemEventCallback,
|
|
5
|
+
SystemEventName,
|
|
11
6
|
} from '../events/types';
|
|
12
7
|
import { NativeAudioAPIModule } from '../specs';
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
NativeAudioAPIModule.install();
|
|
23
|
-
}
|
|
8
|
+
import {
|
|
9
|
+
AudioDevicesInfo,
|
|
10
|
+
LockScreenInfo,
|
|
11
|
+
PermissionStatus,
|
|
12
|
+
SessionOptions,
|
|
13
|
+
} from './types';
|
|
24
14
|
|
|
25
15
|
class AudioManager {
|
|
26
16
|
private readonly audioEventEmitter: AudioEventEmitter;
|
package/src/utils/index.ts
CHANGED
|
@@ -1,46 +1,20 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
interface SimplifiedWorkletModule {
|
|
4
|
-
makeShareableCloneRecursive: (
|
|
5
|
-
workletCallback: ShareableWorkletCallback
|
|
6
|
-
) => ShareableWorkletCallback;
|
|
7
|
-
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
-
createWorkletRuntime: (options?: any) => any;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function clamp(value: number, min: number, max: number): number {
|
|
13
|
-
return Math.min(Math.max(value, min), max);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
let isWorkletsAvailable = false;
|
|
17
|
-
export let isWorkletsVersionSupported = false;
|
|
18
|
-
export let workletsVersion = 'unknown';
|
|
19
|
-
export const supportedWorkletsVersions = ['0.6.0', '0.6.1'];
|
|
20
|
-
export let workletsModule: SimplifiedWorkletModule;
|
|
1
|
+
import AudioAPIModule from '../AudioAPIModule';
|
|
21
2
|
|
|
22
3
|
export function assertWorkletsEnabled() {
|
|
23
|
-
if (!
|
|
4
|
+
if (!AudioAPIModule.areWorkletsAvailable) {
|
|
24
5
|
throw new Error(
|
|
25
6
|
'[react-native-audio-api]: Worklets are not available. Please install react-native-worklets to use this feature.'
|
|
26
7
|
);
|
|
27
|
-
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
if (!AudioAPIModule.isWorkletsVersionSupported) {
|
|
28
11
|
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: [${
|
|
12
|
+
`[react-native-audio-api]: Worklets version ${AudioAPIModule.workletsVersion} is not supported.
|
|
13
|
+
Please install react-native-worklets of one of the following versions: [${AudioAPIModule.supportedWorkletsVersion.join(', ')}] to use this feature.`
|
|
31
14
|
);
|
|
32
15
|
}
|
|
33
16
|
}
|
|
34
17
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const workletsModuleJson = require('react-native-worklets/package.json');
|
|
38
|
-
isWorkletsVersionSupported = supportedWorkletsVersions.includes(
|
|
39
|
-
workletsModuleJson.version
|
|
40
|
-
);
|
|
41
|
-
isWorkletsAvailable = true;
|
|
42
|
-
workletsVersion = workletsModuleJson.version;
|
|
43
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
44
|
-
} catch (error) {
|
|
45
|
-
isWorkletsAvailable = false;
|
|
18
|
+
export function clamp(value: number, min: number, max: number): number {
|
|
19
|
+
return Math.min(Math.max(value, min), max);
|
|
46
20
|
}
|