react-native-audio-api 0.11.0-nightly-568a154-20251222 → 0.11.0-nightly-94b7f30-20251224
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/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +1 -1
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +11 -3
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +47 -79
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +3 -2
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +2 -0
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +9 -1
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +1 -0
- package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +6 -2
- package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.cpp +72 -0
- package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.h +23 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +15 -13
- package/common/cpp/audioapi/core/AudioContext.h +2 -1
- package/common/cpp/audioapi/core/AudioNode.cpp +39 -24
- package/common/cpp/audioapi/core/AudioNode.h +3 -3
- package/common/cpp/audioapi/core/AudioParam.cpp +9 -6
- package/common/cpp/audioapi/core/AudioParam.h +2 -2
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +32 -21
- package/common/cpp/audioapi/core/BaseAudioContext.h +5 -1
- package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +8 -11
- package/common/cpp/audioapi/core/analysis/AnalyserNode.h +1 -1
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +9 -3
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +1 -1
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +18 -9
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +1 -1
- package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +3 -3
- package/common/cpp/audioapi/core/effects/ConvolverNode.h +1 -1
- package/common/cpp/audioapi/core/effects/DelayNode.cpp +20 -11
- package/common/cpp/audioapi/core/effects/DelayNode.h +1 -1
- package/common/cpp/audioapi/core/effects/GainNode.cpp +12 -4
- package/common/cpp/audioapi/core/effects/GainNode.h +1 -1
- package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +6 -3
- package/common/cpp/audioapi/core/effects/IIRFilterNode.h +1 -1
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +7 -4
- package/common/cpp/audioapi/core/effects/StereoPannerNode.h +1 -1
- package/common/cpp/audioapi/core/effects/WaveShaperNode.cpp +79 -0
- package/common/cpp/audioapi/core/effects/WaveShaperNode.h +66 -0
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +2 -2
- package/common/cpp/audioapi/core/effects/WorkletNode.h +2 -2
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +7 -4
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +6 -2
- package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +2 -3
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +1 -1
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +59 -25
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +4 -2
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +18 -11
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +3 -1
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +37 -21
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +3 -3
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +11 -11
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +4 -2
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +16 -8
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +1 -1
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +30 -18
- package/common/cpp/audioapi/core/sources/OscillatorNode.h +1 -1
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +4 -4
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +1 -1
- package/common/cpp/audioapi/core/sources/StreamerNode.cpp +24 -10
- package/common/cpp/audioapi/core/sources/StreamerNode.h +4 -3
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +11 -4
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +6 -2
- package/common/cpp/audioapi/core/types/OverSampleType.h +7 -0
- package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +1 -0
- package/common/cpp/audioapi/dsp/Resampler.cpp +200 -0
- package/common/cpp/audioapi/dsp/Resampler.h +65 -0
- package/common/cpp/audioapi/dsp/WaveShaper.cpp +105 -0
- package/common/cpp/audioapi/dsp/WaveShaper.h +46 -0
- package/common/cpp/audioapi/utils/AudioArray.cpp +5 -0
- package/common/cpp/audioapi/utils/AudioArray.h +6 -0
- package/common/cpp/test/RunTests.sh +1 -1
- package/common/cpp/test/src/AudioParamTest.cpp +10 -10
- package/common/cpp/test/src/AudioScheduledSourceTest.cpp +31 -15
- package/common/cpp/test/src/ConstantSourceTest.cpp +16 -14
- package/common/cpp/test/src/DelayTest.cpp +14 -13
- package/common/cpp/test/src/GainTest.cpp +10 -9
- package/common/cpp/test/src/IIRFilterTest.cpp +4 -4
- package/common/cpp/test/src/OscillatorTest.cpp +2 -2
- package/common/cpp/test/src/StereoPannerTest.cpp +14 -12
- package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +25 -25
- package/common/cpp/test/src/biquad/BiquadFilterTest.h +3 -5
- package/common/cpp/test/src/core/effects/WaveShaperNodeTest.cpp +76 -0
- package/common/cpp/test/src/dsp/ResamplerTest.cpp +117 -0
- package/ios/audioapi/ios/AudioAPIModule.mm +4 -4
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
- package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +9 -3
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +0 -3
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -1
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.web.js +20 -0
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.web.js.map +1 -0
- package/lib/commonjs/AudioAPIModule/ModuleInterfaces.js +6 -0
- package/lib/commonjs/AudioAPIModule/ModuleInterfaces.js.map +1 -0
- package/lib/commonjs/api.js +16 -0
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/api.web.js +23 -0
- package/lib/commonjs/api.web.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +4 -0
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/WaveShaperNode.js +38 -0
- package/lib/commonjs/core/WaveShaperNode.js.map +1 -0
- package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/commonjs/specs/NativeAudioAPIModule.web.js +47 -0
- package/lib/commonjs/specs/NativeAudioAPIModule.web.js.map +1 -0
- package/lib/commonjs/system/AudioManager.js.map +1 -1
- package/lib/commonjs/system/types.js +4 -0
- package/lib/commonjs/web-core/AudioContext.js +4 -0
- package/lib/commonjs/web-core/AudioContext.js.map +1 -1
- package/lib/commonjs/web-core/OfflineAudioContext.js +4 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/web-core/WaveShaperNode.js +38 -0
- package/lib/commonjs/web-core/WaveShaperNode.js.map +1 -0
- package/lib/commonjs/web-system/AudioManager.js +30 -0
- package/lib/commonjs/web-system/AudioManager.js.map +1 -0
- package/lib/commonjs/web-system/index.js +12 -0
- package/lib/commonjs/web-system/index.js.map +1 -1
- package/lib/module/AudioAPIModule/AudioAPIModule.js +0 -4
- package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -1
- package/lib/module/AudioAPIModule/AudioAPIModule.web.js +16 -0
- package/lib/module/AudioAPIModule/AudioAPIModule.web.js.map +1 -0
- package/lib/module/AudioAPIModule/ModuleInterfaces.js +4 -0
- package/lib/module/AudioAPIModule/ModuleInterfaces.js.map +1 -0
- package/lib/module/AudioAPIModule/index.js +1 -1
- package/lib/module/AudioAPIModule/index.js.map +1 -1
- package/lib/module/api.js +2 -0
- package/lib/module/api.js.map +1 -1
- package/lib/module/api.web.js +3 -1
- package/lib/module/api.web.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +4 -0
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/WaveShaperNode.js +32 -0
- package/lib/module/core/WaveShaperNode.js.map +1 -0
- package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/module/specs/NativeAudioAPIModule.web.js +44 -0
- package/lib/module/specs/NativeAudioAPIModule.web.js.map +1 -0
- package/lib/module/specs/index.js +1 -1
- package/lib/module/specs/index.js.map +1 -1
- package/lib/module/system/AudioManager.js.map +1 -1
- package/lib/module/system/types.js +2 -0
- package/lib/module/web-core/AudioContext.js +4 -0
- package/lib/module/web-core/AudioContext.js.map +1 -1
- package/lib/module/web-core/OfflineAudioContext.js +4 -0
- package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/module/web-core/WaveShaperNode.js +32 -0
- package/lib/module/web-core/WaveShaperNode.js.map +1 -0
- package/lib/module/web-system/AudioManager.js +26 -0
- package/lib/module/web-system/AudioManager.js.map +1 -0
- package/lib/module/web-system/index.js +1 -0
- package/lib/module/web-system/index.js.map +1 -1
- package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +2 -10
- package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -1
- package/lib/typescript/AudioAPIModule/AudioAPIModule.web.d.ts +13 -0
- package/lib/typescript/AudioAPIModule/AudioAPIModule.web.d.ts.map +1 -0
- package/lib/typescript/AudioAPIModule/ModuleInterfaces.d.ts +18 -0
- package/lib/typescript/AudioAPIModule/ModuleInterfaces.d.ts.map +1 -0
- package/lib/typescript/api.d.ts +2 -0
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/api.web.d.ts +3 -1
- package/lib/typescript/api.web.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/WaveShaperNode.d.ts +9 -0
- package/lib/typescript/core/WaveShaperNode.d.ts.map +1 -0
- package/lib/typescript/interfaces.d.ts +8 -2
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts +34 -0
- package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts.map +1 -0
- package/lib/typescript/system/AudioManager.d.ts +2 -2
- package/lib/typescript/system/AudioManager.d.ts.map +1 -1
- package/lib/typescript/system/notification/types.d.ts +1 -1
- package/lib/typescript/system/notification/types.d.ts.map +1 -1
- package/lib/typescript/system/types.d.ts +17 -0
- package/lib/typescript/system/types.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +1 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioContext.d.ts +2 -0
- package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/BaseAudioContext.d.ts +3 -1
- package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/OfflineAudioContext.d.ts +2 -0
- package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/WaveShaperNode.d.ts +9 -0
- package/lib/typescript/web-core/WaveShaperNode.d.ts.map +1 -0
- package/lib/typescript/web-system/AudioManager.d.ts +24 -0
- package/lib/typescript/web-system/AudioManager.d.ts.map +1 -0
- package/lib/typescript/web-system/index.d.ts +1 -0
- package/lib/typescript/web-system/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/AudioAPIModule/AudioAPIModule.ts +6 -17
- package/src/AudioAPIModule/AudioAPIModule.web.ts +18 -0
- package/src/AudioAPIModule/ModuleInterfaces.ts +25 -0
- package/src/api.ts +2 -0
- package/src/api.web.ts +3 -0
- package/src/core/BaseAudioContext.ts +5 -0
- package/src/core/WaveShaperNode.ts +43 -0
- package/src/interfaces.ts +9 -1
- package/src/specs/NativeAudioAPIModule.ts +5 -3
- package/src/specs/NativeAudioAPIModule.web.ts +93 -0
- package/src/system/AudioManager.ts +19 -14
- package/src/system/notification/types.ts +1 -1
- package/src/system/types.ts +22 -0
- package/src/types.ts +2 -0
- package/src/web-core/AudioContext.tsx +5 -0
- package/src/web-core/BaseAudioContext.tsx +3 -1
- package/src/web-core/OfflineAudioContext.tsx +5 -0
- package/src/web-core/WaveShaperNode.tsx +42 -0
- package/src/web-system/AudioManager.ts +33 -0
- package/src/web-system/index.ts +1 -0
package/src/interfaces.ts
CHANGED
|
@@ -10,6 +10,7 @@ import type {
|
|
|
10
10
|
OscillatorType,
|
|
11
11
|
Result,
|
|
12
12
|
WindowType,
|
|
13
|
+
OverSampleType,
|
|
13
14
|
} from './types';
|
|
14
15
|
|
|
15
16
|
// IMPORTANT: use only IClass, because it is a part of contract between cpp host object and js layer
|
|
@@ -91,6 +92,7 @@ export interface IBaseAudioContext {
|
|
|
91
92
|
disableNormalization: boolean
|
|
92
93
|
) => IConvolverNode;
|
|
93
94
|
createStreamer: () => IStreamerNode | null; // null when FFmpeg is not enabled
|
|
95
|
+
createWaveShaper: () => IWaveShaperNode;
|
|
94
96
|
}
|
|
95
97
|
|
|
96
98
|
export interface IAudioContext extends IBaseAudioContext {
|
|
@@ -289,6 +291,12 @@ export interface IWorkletSourceNode extends IAudioScheduledSourceNode {}
|
|
|
289
291
|
|
|
290
292
|
export interface IWorkletProcessingNode extends IAudioNode {}
|
|
291
293
|
|
|
294
|
+
export interface IWaveShaperNode extends IAudioNode {
|
|
295
|
+
readonly curve: Float32Array | null;
|
|
296
|
+
oversample: OverSampleType;
|
|
297
|
+
|
|
298
|
+
setCurve(curve: Float32Array | null): void;
|
|
299
|
+
}
|
|
292
300
|
export interface IAudioRecorderCallbackOptions
|
|
293
301
|
extends AudioRecorderCallbackOptions {
|
|
294
302
|
callbackId: string;
|
|
@@ -343,7 +351,7 @@ export interface IAudioDecoder {
|
|
|
343
351
|
|
|
344
352
|
export interface IAudioStretcher {
|
|
345
353
|
changePlaybackSpeed: (
|
|
346
|
-
arrayBuffer:
|
|
354
|
+
arrayBuffer: IAudioBuffer,
|
|
347
355
|
playbackSpeed: number
|
|
348
356
|
) => Promise<IAudioBuffer>;
|
|
349
357
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
|
|
3
|
-
import { TurboModuleRegistry } from 'react-native';
|
|
2
|
+
|
|
3
|
+
import { TurboModuleRegistry, TurboModule } from 'react-native';
|
|
4
4
|
import { AudioDevicesInfo, PermissionStatus } from '../system/types';
|
|
5
5
|
|
|
6
|
-
type OptionsMap = {
|
|
6
|
+
type OptionsMap = {
|
|
7
|
+
[key: string]: string | boolean | number | undefined;
|
|
8
|
+
};
|
|
7
9
|
type NotificationOpResponse = { success: boolean; error?: string };
|
|
8
10
|
type NotificationType = 'playback' | 'recording' | 'simple';
|
|
9
11
|
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { TurboModule } from 'react-native';
|
|
2
|
+
import { AudioDevicesInfo, PermissionStatus } from '../system/types';
|
|
3
|
+
|
|
4
|
+
// copy of spec from NativeAudioAPIModule.ts
|
|
5
|
+
type OptionsMap = {
|
|
6
|
+
[key: string]: string | boolean | number | undefined;
|
|
7
|
+
};
|
|
8
|
+
type NotificationOpResponse = { success: boolean; error?: string };
|
|
9
|
+
type NotificationType = 'playback' | 'recording' | 'simple';
|
|
10
|
+
|
|
11
|
+
interface Spec extends TurboModule {
|
|
12
|
+
install(): boolean;
|
|
13
|
+
getDevicePreferredSampleRate(): number;
|
|
14
|
+
|
|
15
|
+
// AVAudioSession management
|
|
16
|
+
setAudioSessionActivity(enabled: boolean): Promise<boolean>;
|
|
17
|
+
setAudioSessionOptions(
|
|
18
|
+
category: string,
|
|
19
|
+
mode: string,
|
|
20
|
+
options: Array<string>,
|
|
21
|
+
allowHaptics: boolean
|
|
22
|
+
): void;
|
|
23
|
+
disableSessionManagement(): void;
|
|
24
|
+
|
|
25
|
+
// Remote commands, system events and interruptions
|
|
26
|
+
observeAudioInterruptions(enabled: boolean): void;
|
|
27
|
+
activelyReclaimSession(enabled: boolean): void;
|
|
28
|
+
observeVolumeChanges(enabled: boolean): void;
|
|
29
|
+
|
|
30
|
+
// Permissions
|
|
31
|
+
requestRecordingPermissions(): Promise<PermissionStatus>;
|
|
32
|
+
checkRecordingPermissions(): Promise<PermissionStatus>;
|
|
33
|
+
requestNotificationPermissions(): Promise<PermissionStatus>;
|
|
34
|
+
checkNotificationPermissions(): Promise<PermissionStatus>;
|
|
35
|
+
|
|
36
|
+
// Audio devices
|
|
37
|
+
getDevicesInfo(): Promise<AudioDevicesInfo>;
|
|
38
|
+
|
|
39
|
+
// New notification system
|
|
40
|
+
registerNotification(
|
|
41
|
+
type: NotificationType,
|
|
42
|
+
key: string
|
|
43
|
+
): Promise<NotificationOpResponse>;
|
|
44
|
+
showNotification(
|
|
45
|
+
key: string,
|
|
46
|
+
options: OptionsMap
|
|
47
|
+
): Promise<NotificationOpResponse>;
|
|
48
|
+
updateNotification(
|
|
49
|
+
key: string,
|
|
50
|
+
options: OptionsMap
|
|
51
|
+
): Promise<NotificationOpResponse>;
|
|
52
|
+
hideNotification(key: string): Promise<NotificationOpResponse>;
|
|
53
|
+
unregisterNotification(key: string): Promise<NotificationOpResponse>;
|
|
54
|
+
isNotificationActive(key: string): Promise<boolean>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const mockAsync =
|
|
58
|
+
<T>(value: T) =>
|
|
59
|
+
() =>
|
|
60
|
+
Promise.resolve(value);
|
|
61
|
+
const mockSync =
|
|
62
|
+
<T>(value: T) =>
|
|
63
|
+
() =>
|
|
64
|
+
value;
|
|
65
|
+
|
|
66
|
+
const NativeAudioAPIModule: Spec = {
|
|
67
|
+
install: mockSync(true),
|
|
68
|
+
getDevicePreferredSampleRate: mockSync(0),
|
|
69
|
+
setAudioSessionActivity: mockAsync(true),
|
|
70
|
+
setAudioSessionOptions: mockSync({}),
|
|
71
|
+
disableSessionManagement: mockSync({}),
|
|
72
|
+
observeAudioInterruptions: mockSync({}),
|
|
73
|
+
activelyReclaimSession: mockSync({}),
|
|
74
|
+
observeVolumeChanges: mockSync({}),
|
|
75
|
+
requestRecordingPermissions: mockAsync('Granted' as PermissionStatus),
|
|
76
|
+
checkRecordingPermissions: mockAsync('Granted' as PermissionStatus),
|
|
77
|
+
requestNotificationPermissions: mockAsync('Granted' as PermissionStatus),
|
|
78
|
+
checkNotificationPermissions: mockAsync('Granted' as PermissionStatus),
|
|
79
|
+
getDevicesInfo: mockAsync({
|
|
80
|
+
availableInputs: [],
|
|
81
|
+
availableOutputs: [],
|
|
82
|
+
currentInputs: [],
|
|
83
|
+
currentOutputs: [],
|
|
84
|
+
}),
|
|
85
|
+
registerNotification: mockAsync({ success: true }),
|
|
86
|
+
showNotification: mockAsync({ success: true }),
|
|
87
|
+
updateNotification: mockAsync({ success: true }),
|
|
88
|
+
hideNotification: mockAsync({ success: true }),
|
|
89
|
+
unregisterNotification: mockAsync({ success: true }),
|
|
90
|
+
isNotificationActive: mockAsync(false),
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export { NativeAudioAPIModule };
|
|
@@ -1,24 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
SessionOptions,
|
|
3
|
+
PermissionStatus,
|
|
4
|
+
AudioDevicesInfo,
|
|
5
|
+
IAudioManager,
|
|
6
|
+
} from './types';
|
|
2
7
|
import { SystemEventName, SystemEventCallback } from '../events/types';
|
|
3
8
|
import { AudioEventEmitter, AudioEventSubscription } from '../events';
|
|
4
9
|
import { NativeAudioAPIModule } from '../specs';
|
|
5
10
|
|
|
6
|
-
class AudioManager {
|
|
11
|
+
class AudioManager implements IAudioManager {
|
|
7
12
|
private readonly audioEventEmitter: AudioEventEmitter;
|
|
8
13
|
constructor() {
|
|
9
14
|
this.audioEventEmitter = new AudioEventEmitter(global.AudioEventEmitter);
|
|
10
15
|
}
|
|
11
16
|
|
|
12
17
|
getDevicePreferredSampleRate(): number {
|
|
13
|
-
return NativeAudioAPIModule
|
|
18
|
+
return NativeAudioAPIModule.getDevicePreferredSampleRate();
|
|
14
19
|
}
|
|
15
20
|
|
|
16
21
|
setAudioSessionActivity(enabled: boolean): Promise<boolean> {
|
|
17
|
-
return NativeAudioAPIModule
|
|
22
|
+
return NativeAudioAPIModule.setAudioSessionActivity(enabled);
|
|
18
23
|
}
|
|
19
24
|
|
|
20
25
|
setAudioSessionOptions(options: SessionOptions) {
|
|
21
|
-
NativeAudioAPIModule
|
|
26
|
+
NativeAudioAPIModule.setAudioSessionOptions(
|
|
22
27
|
options.iosCategory ?? '',
|
|
23
28
|
options.iosMode ?? '',
|
|
24
29
|
options.iosOptions ?? [],
|
|
@@ -27,11 +32,11 @@ class AudioManager {
|
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
disableSessionManagement() {
|
|
30
|
-
NativeAudioAPIModule
|
|
35
|
+
NativeAudioAPIModule.disableSessionManagement();
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
observeAudioInterruptions(enabled: boolean) {
|
|
34
|
-
NativeAudioAPIModule
|
|
39
|
+
NativeAudioAPIModule.observeAudioInterruptions(enabled);
|
|
35
40
|
}
|
|
36
41
|
|
|
37
42
|
/**
|
|
@@ -48,11 +53,11 @@ class AudioManager {
|
|
|
48
53
|
* interval polling to check if other audio is playing.
|
|
49
54
|
*/
|
|
50
55
|
activelyReclaimSession(enabled: boolean) {
|
|
51
|
-
NativeAudioAPIModule
|
|
56
|
+
NativeAudioAPIModule.activelyReclaimSession(enabled);
|
|
52
57
|
}
|
|
53
58
|
|
|
54
59
|
observeVolumeChanges(enabled: boolean) {
|
|
55
|
-
NativeAudioAPIModule
|
|
60
|
+
NativeAudioAPIModule.observeVolumeChanges(enabled);
|
|
56
61
|
}
|
|
57
62
|
|
|
58
63
|
addSystemEventListener<Name extends SystemEventName>(
|
|
@@ -63,23 +68,23 @@ class AudioManager {
|
|
|
63
68
|
}
|
|
64
69
|
|
|
65
70
|
async requestRecordingPermissions(): Promise<PermissionStatus> {
|
|
66
|
-
return NativeAudioAPIModule
|
|
71
|
+
return NativeAudioAPIModule.requestRecordingPermissions();
|
|
67
72
|
}
|
|
68
73
|
|
|
69
74
|
async checkRecordingPermissions(): Promise<PermissionStatus> {
|
|
70
|
-
return NativeAudioAPIModule
|
|
75
|
+
return NativeAudioAPIModule.checkRecordingPermissions();
|
|
71
76
|
}
|
|
72
77
|
|
|
73
78
|
async requestNotificationPermissions(): Promise<PermissionStatus> {
|
|
74
|
-
return NativeAudioAPIModule
|
|
79
|
+
return NativeAudioAPIModule.requestNotificationPermissions();
|
|
75
80
|
}
|
|
76
81
|
|
|
77
82
|
async checkNotificationPermissions(): Promise<PermissionStatus> {
|
|
78
|
-
return NativeAudioAPIModule
|
|
83
|
+
return NativeAudioAPIModule.checkNotificationPermissions();
|
|
79
84
|
}
|
|
80
85
|
|
|
81
86
|
async getDevicesInfo(): Promise<AudioDevicesInfo> {
|
|
82
|
-
return NativeAudioAPIModule
|
|
87
|
+
return NativeAudioAPIModule.getDevicesInfo();
|
|
83
88
|
}
|
|
84
89
|
}
|
|
85
90
|
|
|
@@ -30,7 +30,7 @@ export interface NotificationManager<
|
|
|
30
30
|
addEventListener<T extends TEventName>(
|
|
31
31
|
eventName: T,
|
|
32
32
|
callback: NotificationCallback<T>
|
|
33
|
-
): AudioEventSubscription;
|
|
33
|
+
): AudioEventSubscription | undefined;
|
|
34
34
|
|
|
35
35
|
/// Remove an event listener.
|
|
36
36
|
removeEventListener(subscription: AudioEventSubscription): void;
|
package/src/system/types.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import type { SystemEventName, SystemEventCallback } from '../events/types';
|
|
2
|
+
import type { AudioEventSubscription } from '../events';
|
|
3
|
+
|
|
1
4
|
export type IOSCategory =
|
|
2
5
|
| 'record'
|
|
3
6
|
| 'ambient'
|
|
@@ -49,3 +52,22 @@ export interface AudioDevicesInfo {
|
|
|
49
52
|
currentInputs: AudioDeviceList; // iOS only
|
|
50
53
|
currentOutputs: AudioDeviceList; // iOS only
|
|
51
54
|
}
|
|
55
|
+
|
|
56
|
+
export interface IAudioManager {
|
|
57
|
+
getDevicePreferredSampleRate(): number;
|
|
58
|
+
setAudioSessionActivity(enabled: boolean): Promise<boolean>;
|
|
59
|
+
setAudioSessionOptions(options: SessionOptions): void;
|
|
60
|
+
disableSessionManagement(): void;
|
|
61
|
+
observeAudioInterruptions(enabled: boolean): void;
|
|
62
|
+
activelyReclaimSession(enabled: boolean): void;
|
|
63
|
+
observeVolumeChanges(enabled: boolean): void;
|
|
64
|
+
addSystemEventListener<Name extends SystemEventName>(
|
|
65
|
+
name: Name,
|
|
66
|
+
callback: SystemEventCallback<Name>
|
|
67
|
+
): AudioEventSubscription | undefined;
|
|
68
|
+
requestRecordingPermissions(): Promise<PermissionStatus>;
|
|
69
|
+
checkRecordingPermissions(): Promise<PermissionStatus>;
|
|
70
|
+
requestNotificationPermissions(): Promise<PermissionStatus>;
|
|
71
|
+
checkNotificationPermissions(): Promise<PermissionStatus>;
|
|
72
|
+
getDevicesInfo(): Promise<AudioDevicesInfo>;
|
|
73
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -121,6 +121,8 @@ export interface ConvolverNodeOptions {
|
|
|
121
121
|
disableNormalization?: boolean;
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
+
export type OverSampleType = 'none' | '2x' | '4x';
|
|
125
|
+
|
|
124
126
|
export interface AudioRecorderCallbackOptions {
|
|
125
127
|
/**
|
|
126
128
|
* The desired sample rate (in Hz) for audio buffers delivered to the
|
|
@@ -23,6 +23,7 @@ import { ConvolverNodeOptions } from './ConvolverNodeOptions';
|
|
|
23
23
|
|
|
24
24
|
import { globalWasmPromise, globalTag } from './custom/LoadCustomWasm';
|
|
25
25
|
import ConstantSourceNode from './ConstantSourceNode';
|
|
26
|
+
import WaveShaperNode from './WaveShaperNode';
|
|
26
27
|
|
|
27
28
|
export default class AudioContext implements BaseAudioContext {
|
|
28
29
|
readonly context: globalThis.AudioContext;
|
|
@@ -175,6 +176,10 @@ export default class AudioContext implements BaseAudioContext {
|
|
|
175
176
|
return new AnalyserNode(this, this.context.createAnalyser());
|
|
176
177
|
}
|
|
177
178
|
|
|
179
|
+
createWaveShaper(): WaveShaperNode {
|
|
180
|
+
return new WaveShaperNode(this, this.context.createWaveShaper());
|
|
181
|
+
}
|
|
182
|
+
|
|
178
183
|
async decodeAudioDataSource(source: string): Promise<AudioBuffer> {
|
|
179
184
|
const arrayBuffer = await fetch(source).then((response) =>
|
|
180
185
|
response.arrayBuffer()
|
|
@@ -8,6 +8,7 @@ import AudioDestinationNode from './AudioDestinationNode';
|
|
|
8
8
|
import AudioBuffer from './AudioBuffer';
|
|
9
9
|
import AudioBufferSourceNode from './AudioBufferSourceNode';
|
|
10
10
|
import BiquadFilterNode from './BiquadFilterNode';
|
|
11
|
+
import DelayNode from './DelayNode';
|
|
11
12
|
import IIRFilterNode from './IIRFilterNode';
|
|
12
13
|
import GainNode from './GainNode';
|
|
13
14
|
import OscillatorNode from './OscillatorNode';
|
|
@@ -15,7 +16,7 @@ import PeriodicWave from './PeriodicWave';
|
|
|
15
16
|
import StereoPannerNode from './StereoPannerNode';
|
|
16
17
|
import ConstantSourceNode from './ConstantSourceNode';
|
|
17
18
|
import ConvolverNode from './ConvolverNode';
|
|
18
|
-
import
|
|
19
|
+
import WaveShaperNode from './WaveShaperNode';
|
|
19
20
|
|
|
20
21
|
export default interface BaseAudioContext {
|
|
21
22
|
readonly context: globalThis.BaseAudioContext;
|
|
@@ -45,6 +46,7 @@ export default interface BaseAudioContext {
|
|
|
45
46
|
constraints?: PeriodicWaveConstraints
|
|
46
47
|
): PeriodicWave;
|
|
47
48
|
createAnalyser(): AnalyserNode;
|
|
49
|
+
createWaveShaper(): WaveShaperNode;
|
|
48
50
|
decodeAudioDataSource(source: string): Promise<AudioBuffer>;
|
|
49
51
|
decodeAudioData(arrayBuffer: ArrayBuffer): Promise<AudioBuffer>;
|
|
50
52
|
}
|
|
@@ -18,6 +18,7 @@ import OscillatorNode from './OscillatorNode';
|
|
|
18
18
|
import PeriodicWave from './PeriodicWave';
|
|
19
19
|
import StereoPannerNode from './StereoPannerNode';
|
|
20
20
|
import ConstantSourceNode from './ConstantSourceNode';
|
|
21
|
+
import WaveShaperNode from './WaveShaperNode';
|
|
21
22
|
|
|
22
23
|
import { globalWasmPromise, globalTag } from './custom/LoadCustomWasm';
|
|
23
24
|
import ConvolverNode from './ConvolverNode';
|
|
@@ -181,6 +182,10 @@ export default class OfflineAudioContext implements BaseAudioContext {
|
|
|
181
182
|
return new AnalyserNode(this, this.context.createAnalyser());
|
|
182
183
|
}
|
|
183
184
|
|
|
185
|
+
createWaveShaper(): WaveShaperNode {
|
|
186
|
+
return new WaveShaperNode(this, this.context.createWaveShaper());
|
|
187
|
+
}
|
|
188
|
+
|
|
184
189
|
async decodeAudioDataSource(source: string): Promise<AudioBuffer> {
|
|
185
190
|
const arrayBuffer = await fetch(source).then((response) =>
|
|
186
191
|
response.arrayBuffer()
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { InvalidStateError } from '../errors';
|
|
2
|
+
import AudioNode from './AudioNode';
|
|
3
|
+
|
|
4
|
+
export default class WaveShaperNode extends AudioNode {
|
|
5
|
+
private isCurveSet: boolean = false;
|
|
6
|
+
|
|
7
|
+
get curve(): Float32Array | null {
|
|
8
|
+
if (!this.isCurveSet) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return (this.node as globalThis.WaveShaperNode).curve;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
get oversample(): OverSampleType {
|
|
16
|
+
return (this.node as globalThis.WaveShaperNode).oversample;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
set curve(curve: Float32Array | null) {
|
|
20
|
+
if (curve !== null) {
|
|
21
|
+
if (this.isCurveSet) {
|
|
22
|
+
throw new InvalidStateError(
|
|
23
|
+
'The curve can only be set once and cannot be changed afterwards.'
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (curve.length < 2) {
|
|
28
|
+
throw new InvalidStateError(
|
|
29
|
+
'The curve must have at least two values if not null.'
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
this.isCurveSet = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
(this.node as globalThis.WaveShaperNode).curve = curve;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
set oversample(value: OverSampleType) {
|
|
40
|
+
(this.node as globalThis.WaveShaperNode).oversample = value;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IAudioManager, PermissionStatus } from '../system/types';
|
|
2
|
+
|
|
3
|
+
const mockAsync =
|
|
4
|
+
<T>(value: T) =>
|
|
5
|
+
() =>
|
|
6
|
+
Promise.resolve(value);
|
|
7
|
+
const mockSync =
|
|
8
|
+
<T>(value: T) =>
|
|
9
|
+
() =>
|
|
10
|
+
value;
|
|
11
|
+
|
|
12
|
+
class AudioManager implements IAudioManager {
|
|
13
|
+
getDevicePreferredSampleRate = mockSync(44100);
|
|
14
|
+
setAudioSessionActivity = mockAsync(true);
|
|
15
|
+
setAudioSessionOptions = mockSync({});
|
|
16
|
+
disableSessionManagement = mockSync({});
|
|
17
|
+
observeAudioInterruptions = mockSync(true);
|
|
18
|
+
activelyReclaimSession = mockSync({});
|
|
19
|
+
observeVolumeChanges = mockSync({});
|
|
20
|
+
addSystemEventListener = mockSync(undefined);
|
|
21
|
+
requestRecordingPermissions = mockAsync('Granted' as PermissionStatus);
|
|
22
|
+
checkRecordingPermissions = mockAsync('Granted' as PermissionStatus);
|
|
23
|
+
requestNotificationPermissions = mockAsync('Granted' as PermissionStatus);
|
|
24
|
+
checkNotificationPermissions = mockAsync('Granted' as PermissionStatus);
|
|
25
|
+
getDevicesInfo = mockAsync({
|
|
26
|
+
availableInputs: [],
|
|
27
|
+
availableOutputs: [],
|
|
28
|
+
currentInputs: [],
|
|
29
|
+
currentOutputs: [],
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default new AudioManager();
|
package/src/web-system/index.ts
CHANGED