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.
Files changed (207) hide show
  1. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +1 -1
  2. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +11 -3
  3. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +47 -79
  4. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +3 -2
  5. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +2 -0
  6. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +9 -1
  7. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +1 -0
  8. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +6 -2
  9. package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.cpp +72 -0
  10. package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.h +23 -0
  11. package/common/cpp/audioapi/core/AudioContext.cpp +15 -13
  12. package/common/cpp/audioapi/core/AudioContext.h +2 -1
  13. package/common/cpp/audioapi/core/AudioNode.cpp +39 -24
  14. package/common/cpp/audioapi/core/AudioNode.h +3 -3
  15. package/common/cpp/audioapi/core/AudioParam.cpp +9 -6
  16. package/common/cpp/audioapi/core/AudioParam.h +2 -2
  17. package/common/cpp/audioapi/core/BaseAudioContext.cpp +32 -21
  18. package/common/cpp/audioapi/core/BaseAudioContext.h +5 -1
  19. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +8 -11
  20. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +1 -1
  21. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +9 -3
  22. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +1 -1
  23. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +18 -9
  24. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +1 -1
  25. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +3 -3
  26. package/common/cpp/audioapi/core/effects/ConvolverNode.h +1 -1
  27. package/common/cpp/audioapi/core/effects/DelayNode.cpp +20 -11
  28. package/common/cpp/audioapi/core/effects/DelayNode.h +1 -1
  29. package/common/cpp/audioapi/core/effects/GainNode.cpp +12 -4
  30. package/common/cpp/audioapi/core/effects/GainNode.h +1 -1
  31. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +6 -3
  32. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +1 -1
  33. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +7 -4
  34. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +1 -1
  35. package/common/cpp/audioapi/core/effects/WaveShaperNode.cpp +79 -0
  36. package/common/cpp/audioapi/core/effects/WaveShaperNode.h +66 -0
  37. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +2 -2
  38. package/common/cpp/audioapi/core/effects/WorkletNode.h +2 -2
  39. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +7 -4
  40. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +6 -2
  41. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +2 -3
  42. package/common/cpp/audioapi/core/sources/AudioBuffer.h +1 -1
  43. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +59 -25
  44. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +4 -2
  45. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +18 -11
  46. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +3 -1
  47. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +37 -21
  48. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +3 -3
  49. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +11 -11
  50. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +4 -2
  51. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +16 -8
  52. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +1 -1
  53. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +30 -18
  54. package/common/cpp/audioapi/core/sources/OscillatorNode.h +1 -1
  55. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +4 -4
  56. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +1 -1
  57. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +24 -10
  58. package/common/cpp/audioapi/core/sources/StreamerNode.h +4 -3
  59. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +11 -4
  60. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +6 -2
  61. package/common/cpp/audioapi/core/types/OverSampleType.h +7 -0
  62. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +1 -0
  63. package/common/cpp/audioapi/dsp/Resampler.cpp +200 -0
  64. package/common/cpp/audioapi/dsp/Resampler.h +65 -0
  65. package/common/cpp/audioapi/dsp/WaveShaper.cpp +105 -0
  66. package/common/cpp/audioapi/dsp/WaveShaper.h +46 -0
  67. package/common/cpp/audioapi/utils/AudioArray.cpp +5 -0
  68. package/common/cpp/audioapi/utils/AudioArray.h +6 -0
  69. package/common/cpp/test/RunTests.sh +1 -1
  70. package/common/cpp/test/src/AudioParamTest.cpp +10 -10
  71. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +31 -15
  72. package/common/cpp/test/src/ConstantSourceTest.cpp +16 -14
  73. package/common/cpp/test/src/DelayTest.cpp +14 -13
  74. package/common/cpp/test/src/GainTest.cpp +10 -9
  75. package/common/cpp/test/src/IIRFilterTest.cpp +4 -4
  76. package/common/cpp/test/src/OscillatorTest.cpp +2 -2
  77. package/common/cpp/test/src/StereoPannerTest.cpp +14 -12
  78. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +25 -25
  79. package/common/cpp/test/src/biquad/BiquadFilterTest.h +3 -5
  80. package/common/cpp/test/src/core/effects/WaveShaperNodeTest.cpp +76 -0
  81. package/common/cpp/test/src/dsp/ResamplerTest.cpp +117 -0
  82. package/ios/audioapi/ios/AudioAPIModule.mm +4 -4
  83. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
  84. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +9 -3
  85. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +0 -3
  86. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -1
  87. package/lib/commonjs/AudioAPIModule/AudioAPIModule.web.js +20 -0
  88. package/lib/commonjs/AudioAPIModule/AudioAPIModule.web.js.map +1 -0
  89. package/lib/commonjs/AudioAPIModule/ModuleInterfaces.js +6 -0
  90. package/lib/commonjs/AudioAPIModule/ModuleInterfaces.js.map +1 -0
  91. package/lib/commonjs/api.js +16 -0
  92. package/lib/commonjs/api.js.map +1 -1
  93. package/lib/commonjs/api.web.js +23 -0
  94. package/lib/commonjs/api.web.js.map +1 -1
  95. package/lib/commonjs/core/BaseAudioContext.js +4 -0
  96. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  97. package/lib/commonjs/core/WaveShaperNode.js +38 -0
  98. package/lib/commonjs/core/WaveShaperNode.js.map +1 -0
  99. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  100. package/lib/commonjs/specs/NativeAudioAPIModule.web.js +47 -0
  101. package/lib/commonjs/specs/NativeAudioAPIModule.web.js.map +1 -0
  102. package/lib/commonjs/system/AudioManager.js.map +1 -1
  103. package/lib/commonjs/system/types.js +4 -0
  104. package/lib/commonjs/web-core/AudioContext.js +4 -0
  105. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  106. package/lib/commonjs/web-core/OfflineAudioContext.js +4 -0
  107. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  108. package/lib/commonjs/web-core/WaveShaperNode.js +38 -0
  109. package/lib/commonjs/web-core/WaveShaperNode.js.map +1 -0
  110. package/lib/commonjs/web-system/AudioManager.js +30 -0
  111. package/lib/commonjs/web-system/AudioManager.js.map +1 -0
  112. package/lib/commonjs/web-system/index.js +12 -0
  113. package/lib/commonjs/web-system/index.js.map +1 -1
  114. package/lib/module/AudioAPIModule/AudioAPIModule.js +0 -4
  115. package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -1
  116. package/lib/module/AudioAPIModule/AudioAPIModule.web.js +16 -0
  117. package/lib/module/AudioAPIModule/AudioAPIModule.web.js.map +1 -0
  118. package/lib/module/AudioAPIModule/ModuleInterfaces.js +4 -0
  119. package/lib/module/AudioAPIModule/ModuleInterfaces.js.map +1 -0
  120. package/lib/module/AudioAPIModule/index.js +1 -1
  121. package/lib/module/AudioAPIModule/index.js.map +1 -1
  122. package/lib/module/api.js +2 -0
  123. package/lib/module/api.js.map +1 -1
  124. package/lib/module/api.web.js +3 -1
  125. package/lib/module/api.web.js.map +1 -1
  126. package/lib/module/core/BaseAudioContext.js +4 -0
  127. package/lib/module/core/BaseAudioContext.js.map +1 -1
  128. package/lib/module/core/WaveShaperNode.js +32 -0
  129. package/lib/module/core/WaveShaperNode.js.map +1 -0
  130. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  131. package/lib/module/specs/NativeAudioAPIModule.web.js +44 -0
  132. package/lib/module/specs/NativeAudioAPIModule.web.js.map +1 -0
  133. package/lib/module/specs/index.js +1 -1
  134. package/lib/module/specs/index.js.map +1 -1
  135. package/lib/module/system/AudioManager.js.map +1 -1
  136. package/lib/module/system/types.js +2 -0
  137. package/lib/module/web-core/AudioContext.js +4 -0
  138. package/lib/module/web-core/AudioContext.js.map +1 -1
  139. package/lib/module/web-core/OfflineAudioContext.js +4 -0
  140. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  141. package/lib/module/web-core/WaveShaperNode.js +32 -0
  142. package/lib/module/web-core/WaveShaperNode.js.map +1 -0
  143. package/lib/module/web-system/AudioManager.js +26 -0
  144. package/lib/module/web-system/AudioManager.js.map +1 -0
  145. package/lib/module/web-system/index.js +1 -0
  146. package/lib/module/web-system/index.js.map +1 -1
  147. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +2 -10
  148. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -1
  149. package/lib/typescript/AudioAPIModule/AudioAPIModule.web.d.ts +13 -0
  150. package/lib/typescript/AudioAPIModule/AudioAPIModule.web.d.ts.map +1 -0
  151. package/lib/typescript/AudioAPIModule/ModuleInterfaces.d.ts +18 -0
  152. package/lib/typescript/AudioAPIModule/ModuleInterfaces.d.ts.map +1 -0
  153. package/lib/typescript/api.d.ts +2 -0
  154. package/lib/typescript/api.d.ts.map +1 -1
  155. package/lib/typescript/api.web.d.ts +3 -1
  156. package/lib/typescript/api.web.d.ts.map +1 -1
  157. package/lib/typescript/core/BaseAudioContext.d.ts +2 -0
  158. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  159. package/lib/typescript/core/WaveShaperNode.d.ts +9 -0
  160. package/lib/typescript/core/WaveShaperNode.d.ts.map +1 -0
  161. package/lib/typescript/interfaces.d.ts +8 -2
  162. package/lib/typescript/interfaces.d.ts.map +1 -1
  163. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +1 -1
  164. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  165. package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts +34 -0
  166. package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts.map +1 -0
  167. package/lib/typescript/system/AudioManager.d.ts +2 -2
  168. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  169. package/lib/typescript/system/notification/types.d.ts +1 -1
  170. package/lib/typescript/system/notification/types.d.ts.map +1 -1
  171. package/lib/typescript/system/types.d.ts +17 -0
  172. package/lib/typescript/system/types.d.ts.map +1 -1
  173. package/lib/typescript/types.d.ts +1 -0
  174. package/lib/typescript/types.d.ts.map +1 -1
  175. package/lib/typescript/web-core/AudioContext.d.ts +2 -0
  176. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  177. package/lib/typescript/web-core/BaseAudioContext.d.ts +3 -1
  178. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  179. package/lib/typescript/web-core/OfflineAudioContext.d.ts +2 -0
  180. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  181. package/lib/typescript/web-core/WaveShaperNode.d.ts +9 -0
  182. package/lib/typescript/web-core/WaveShaperNode.d.ts.map +1 -0
  183. package/lib/typescript/web-system/AudioManager.d.ts +24 -0
  184. package/lib/typescript/web-system/AudioManager.d.ts.map +1 -0
  185. package/lib/typescript/web-system/index.d.ts +1 -0
  186. package/lib/typescript/web-system/index.d.ts.map +1 -1
  187. package/package.json +1 -1
  188. package/src/AudioAPIModule/AudioAPIModule.ts +6 -17
  189. package/src/AudioAPIModule/AudioAPIModule.web.ts +18 -0
  190. package/src/AudioAPIModule/ModuleInterfaces.ts +25 -0
  191. package/src/api.ts +2 -0
  192. package/src/api.web.ts +3 -0
  193. package/src/core/BaseAudioContext.ts +5 -0
  194. package/src/core/WaveShaperNode.ts +43 -0
  195. package/src/interfaces.ts +9 -1
  196. package/src/specs/NativeAudioAPIModule.ts +5 -3
  197. package/src/specs/NativeAudioAPIModule.web.ts +93 -0
  198. package/src/system/AudioManager.ts +19 -14
  199. package/src/system/notification/types.ts +1 -1
  200. package/src/system/types.ts +22 -0
  201. package/src/types.ts +2 -0
  202. package/src/web-core/AudioContext.tsx +5 -0
  203. package/src/web-core/BaseAudioContext.tsx +3 -1
  204. package/src/web-core/OfflineAudioContext.tsx +5 -0
  205. package/src/web-core/WaveShaperNode.tsx +42 -0
  206. package/src/web-system/AudioManager.ts +33 -0
  207. 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: AudioBuffer,
354
+ arrayBuffer: IAudioBuffer,
347
355
  playbackSpeed: number
348
356
  ) => Promise<IAudioBuffer>;
349
357
  }
@@ -1,9 +1,11 @@
1
1
  'use strict';
2
- import type { TurboModule } from 'react-native';
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 = { [key: string]: string | boolean | number | undefined };
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 { SessionOptions, PermissionStatus, AudioDevicesInfo } from './types';
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!.getDevicePreferredSampleRate();
18
+ return NativeAudioAPIModule.getDevicePreferredSampleRate();
14
19
  }
15
20
 
16
21
  setAudioSessionActivity(enabled: boolean): Promise<boolean> {
17
- return NativeAudioAPIModule!.setAudioSessionActivity(enabled);
22
+ return NativeAudioAPIModule.setAudioSessionActivity(enabled);
18
23
  }
19
24
 
20
25
  setAudioSessionOptions(options: SessionOptions) {
21
- NativeAudioAPIModule!.setAudioSessionOptions(
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!.disableSessionManagement();
35
+ NativeAudioAPIModule.disableSessionManagement();
31
36
  }
32
37
 
33
38
  observeAudioInterruptions(enabled: boolean) {
34
- NativeAudioAPIModule!.observeAudioInterruptions(enabled);
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!.activelyReclaimSession(enabled);
56
+ NativeAudioAPIModule.activelyReclaimSession(enabled);
52
57
  }
53
58
 
54
59
  observeVolumeChanges(enabled: boolean) {
55
- NativeAudioAPIModule!.observeVolumeChanges(enabled);
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!.requestRecordingPermissions();
71
+ return NativeAudioAPIModule.requestRecordingPermissions();
67
72
  }
68
73
 
69
74
  async checkRecordingPermissions(): Promise<PermissionStatus> {
70
- return NativeAudioAPIModule!.checkRecordingPermissions();
75
+ return NativeAudioAPIModule.checkRecordingPermissions();
71
76
  }
72
77
 
73
78
  async requestNotificationPermissions(): Promise<PermissionStatus> {
74
- return NativeAudioAPIModule!.requestNotificationPermissions();
79
+ return NativeAudioAPIModule.requestNotificationPermissions();
75
80
  }
76
81
 
77
82
  async checkNotificationPermissions(): Promise<PermissionStatus> {
78
- return NativeAudioAPIModule!.checkNotificationPermissions();
83
+ return NativeAudioAPIModule.checkNotificationPermissions();
79
84
  }
80
85
 
81
86
  async getDevicesInfo(): Promise<AudioDevicesInfo> {
82
- return NativeAudioAPIModule!.getDevicesInfo();
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;
@@ -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 DelayNode from './DelayNode';
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();
@@ -1 +1,2 @@
1
1
  export * from './notification';
2
+ export { default as AudioManager } from './AudioManager';