react-native-audio-api 0.3.2 → 0.4.1

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 (65) hide show
  1. package/README.md +17 -11
  2. package/android/src/main/cpp/core/AudioPlayer.cpp +38 -11
  3. package/android/src/main/cpp/core/AudioPlayer.h +5 -1
  4. package/common/cpp/HostObjects/AnalyserNodeHostObject.h +151 -0
  5. package/common/cpp/HostObjects/AudioAPIInstallerHostObject.h +11 -3
  6. package/common/cpp/HostObjects/AudioNodeHostObject.h +5 -0
  7. package/common/cpp/HostObjects/BaseAudioContextHostObject.h +8 -0
  8. package/common/cpp/core/AnalyserNode.cpp +237 -0
  9. package/common/cpp/core/AnalyserNode.h +54 -0
  10. package/common/cpp/core/AudioContext.cpp +41 -1
  11. package/common/cpp/core/AudioContext.h +17 -0
  12. package/common/cpp/core/AudioNode.cpp +21 -8
  13. package/common/cpp/core/AudioNode.h +1 -0
  14. package/common/cpp/core/AudioScheduledSourceNode.cpp +1 -2
  15. package/common/cpp/core/BaseAudioContext.cpp +5 -40
  16. package/common/cpp/core/BaseAudioContext.h +7 -18
  17. package/common/cpp/core/Constants.h +11 -2
  18. package/common/cpp/core/PeriodicWave.cpp +2 -2
  19. package/common/cpp/jsi/JsiHostObject.h +1 -1
  20. package/common/cpp/jsi/JsiPromise.h +1 -0
  21. package/common/cpp/utils/AudioUtils.cpp +7 -0
  22. package/common/cpp/utils/AudioUtils.h +5 -1
  23. package/common/cpp/utils/FFTFrame.cpp +69 -23
  24. package/common/cpp/utils/FFTFrame.h +25 -10
  25. package/common/cpp/utils/VectorMath.cpp +10 -0
  26. package/common/cpp/utils/VectorMath.h +2 -0
  27. package/ios/core/AudioPlayer.h +3 -2
  28. package/ios/core/AudioPlayer.m +49 -15
  29. package/ios/core/IOSAudioPlayer.h +3 -1
  30. package/ios/core/IOSAudioPlayer.mm +46 -10
  31. package/lib/module/core/AnalyserNode.js +59 -0
  32. package/lib/module/core/AnalyserNode.js.map +1 -0
  33. package/lib/module/core/AudioContext.js +2 -2
  34. package/lib/module/core/AudioContext.js.map +1 -1
  35. package/lib/module/core/AudioNode.js +5 -5
  36. package/lib/module/core/AudioNode.js.map +1 -1
  37. package/lib/module/core/BaseAudioContext.js +8 -0
  38. package/lib/module/core/BaseAudioContext.js.map +1 -1
  39. package/lib/module/index.js +35 -6
  40. package/lib/module/index.js.map +1 -1
  41. package/lib/module/index.native.js +1 -0
  42. package/lib/module/index.native.js.map +1 -1
  43. package/lib/typescript/core/AnalyserNode.d.ts +18 -0
  44. package/lib/typescript/core/AnalyserNode.d.ts.map +1 -0
  45. package/lib/typescript/core/AudioContext.d.ts +1 -1
  46. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  47. package/lib/typescript/core/AudioNode.d.ts +2 -2
  48. package/lib/typescript/core/AudioNode.d.ts.map +1 -1
  49. package/lib/typescript/core/BaseAudioContext.d.ts +2 -0
  50. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  51. package/lib/typescript/index.d.ts +16 -3
  52. package/lib/typescript/index.d.ts.map +1 -1
  53. package/lib/typescript/index.native.d.ts +1 -0
  54. package/lib/typescript/index.native.d.ts.map +1 -1
  55. package/lib/typescript/interfaces.d.ts +13 -1
  56. package/lib/typescript/interfaces.d.ts.map +1 -1
  57. package/package.json +4 -2
  58. package/src/core/AnalyserNode.ts +85 -0
  59. package/src/core/AudioContext.ts +2 -2
  60. package/src/core/AudioNode.ts +5 -5
  61. package/src/core/BaseAudioContext.ts +10 -0
  62. package/src/index.native.ts +1 -0
  63. package/src/index.ts +57 -6
  64. package/src/interfaces.ts +15 -1
  65. package/src/specs/global.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/index.native.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,GACb,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/index.native.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,GACb,MAAM,cAAc,CAAC"}
@@ -11,6 +11,7 @@ export interface IBaseAudioContext {
11
11
  createBufferSource: () => IAudioBufferSourceNode;
12
12
  createBuffer: (channels: number, length: number, sampleRate: number) => IAudioBuffer;
13
13
  createPeriodicWave: (real: number[], imag: number[], disableNormalization: boolean) => IPeriodicWave;
14
+ createAnalyser: () => IAnalyserNode;
14
15
  decodeAudioDataSource: (sourcePath: string) => Promise<IAudioBuffer>;
15
16
  }
16
17
  export interface IAudioContext extends IBaseAudioContext {
@@ -24,7 +25,7 @@ export interface IAudioNode {
24
25
  readonly channelCountMode: ChannelCountMode;
25
26
  readonly channelInterpretation: ChannelInterpretation;
26
27
  connect: (node: IAudioNode) => void;
27
- disconnect: (node: IAudioNode) => void;
28
+ disconnect: (node?: IAudioNode) => void;
28
29
  }
29
30
  export interface IGainNode extends IAudioNode {
30
31
  readonly gain: IAudioParam;
@@ -84,4 +85,15 @@ export interface IAudioParam {
84
85
  }
85
86
  export interface IPeriodicWave {
86
87
  }
88
+ export interface IAnalyserNode extends IAudioNode {
89
+ fftSize: number;
90
+ readonly frequencyBinCount: number;
91
+ minDecibels: number;
92
+ maxDecibels: number;
93
+ smoothingTimeConstant: number;
94
+ getFloatFrequencyData: (array: number[]) => void;
95
+ getByteFrequencyData: (array: number[]) => void;
96
+ getFloatTimeDomainData: (array: number[]) => void;
97
+ getByteTimeDomainData: (array: number[]) => void;
98
+ }
87
99
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-audio-api",
3
- "version": "0.3.2",
3
+ "version": "0.4.1",
4
4
  "description": "react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -54,7 +54,9 @@
54
54
  "audio",
55
55
  "audio api",
56
56
  "web audio api",
57
- "react"
57
+ "react",
58
+ "music",
59
+ "player"
58
60
  ],
59
61
  "repository": {
60
62
  "type": "git",
@@ -0,0 +1,85 @@
1
+ import { IndexSizeError } from '../errors';
2
+ import { IAnalyserNode } from '../interfaces';
3
+ import AudioNode from './AudioNode';
4
+
5
+ export default class AnalyserNode extends AudioNode {
6
+ private static allowedFFTSize: number[] = [
7
+ 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768,
8
+ ];
9
+
10
+ public get fftSize(): number {
11
+ return (this.node as IAnalyserNode).fftSize;
12
+ }
13
+
14
+ public set fftSize(value: number) {
15
+ if (!AnalyserNode.allowedFFTSize.includes(value)) {
16
+ throw new IndexSizeError(
17
+ `Provided value (${value}) must be a power of 2 between 32 and 32768`
18
+ );
19
+ }
20
+
21
+ (this.node as IAnalyserNode).fftSize = value;
22
+ }
23
+
24
+ public get minDecibels(): number {
25
+ return (this.node as IAnalyserNode).minDecibels;
26
+ }
27
+
28
+ public set minDecibels(value: number) {
29
+ if (value >= this.maxDecibels) {
30
+ throw new IndexSizeError(
31
+ `The minDecibels value (${value}) must be less than maxDecibels`
32
+ );
33
+ }
34
+
35
+ (this.node as IAnalyserNode).minDecibels = value;
36
+ }
37
+
38
+ public get maxDecibels(): number {
39
+ return (this.node as IAnalyserNode).maxDecibels;
40
+ }
41
+
42
+ public set maxDecibels(value: number) {
43
+ if (value <= this.minDecibels) {
44
+ throw new IndexSizeError(
45
+ `The maxDecibels value (${value}) must be greater than minDecibels`
46
+ );
47
+ }
48
+
49
+ (this.node as IAnalyserNode).maxDecibels = value;
50
+ }
51
+
52
+ public get smoothingTimeConstant(): number {
53
+ return (this.node as IAnalyserNode).smoothingTimeConstant;
54
+ }
55
+
56
+ public set smoothingTimeConstant(value: number) {
57
+ if (value < 0 || value > 1) {
58
+ throw new IndexSizeError(
59
+ `The smoothingTimeConstant value (${value}) must be between 0 and 1`
60
+ );
61
+ }
62
+
63
+ (this.node as IAnalyserNode).smoothingTimeConstant = value;
64
+ }
65
+
66
+ public get frequencyBinCount(): number {
67
+ return (this.node as IAnalyserNode).frequencyBinCount;
68
+ }
69
+
70
+ public getFloatFrequencyData(array: number[]): void {
71
+ (this.node as IAnalyserNode).getFloatFrequencyData(array);
72
+ }
73
+
74
+ public getByteFrequencyData(array: number[]): void {
75
+ (this.node as IAnalyserNode).getByteFrequencyData(array);
76
+ }
77
+
78
+ public getFloatTimeDomainData(array: number[]): void {
79
+ (this.node as IAnalyserNode).getFloatTimeDomainData(array);
80
+ }
81
+
82
+ public getByteTimeDomainData(array: number[]): void {
83
+ (this.node as IAnalyserNode).getByteTimeDomainData(array);
84
+ }
85
+ }
@@ -2,8 +2,8 @@ import { IAudioContext } from '../interfaces';
2
2
  import BaseAudioContext from './BaseAudioContext';
3
3
 
4
4
  export default class AudioContext extends BaseAudioContext {
5
- constructor() {
6
- super(global.__AudioAPIInstaller.createAudioContext());
5
+ constructor(sampleRate?: number) {
6
+ super(global.__AudioAPIInstaller.createAudioContext(sampleRate));
7
7
  }
8
8
 
9
9
  close(): void {
@@ -22,17 +22,17 @@ export default class AudioNode {
22
22
  this.channelInterpretation = this.node.channelInterpretation;
23
23
  }
24
24
 
25
- public connect(node: AudioNode): void {
26
- if (this.context !== node.context) {
25
+ public connect(destination: AudioNode): void {
26
+ if (this.context !== destination.context) {
27
27
  throw new InvalidAccessError(
28
28
  'The AudioNodes are from different BaseAudioContexts'
29
29
  );
30
30
  }
31
31
 
32
- this.node.connect(node.node);
32
+ this.node.connect(destination.node);
33
33
  }
34
34
 
35
- public disconnect(node: AudioNode): void {
36
- this.node.disconnect(node.node);
35
+ public disconnect(destination?: AudioNode): void {
36
+ this.node.disconnect(destination?.node);
37
37
  }
38
38
  }
@@ -8,6 +8,7 @@ import BiquadFilterNode from './BiquadFilterNode';
8
8
  import AudioBufferSourceNode from './AudioBufferSourceNode';
9
9
  import AudioBuffer from './AudioBuffer';
10
10
  import PeriodicWave from './PeriodicWave';
11
+ import AnalyserNode from './AnalyserNode';
11
12
  import { InvalidAccessError } from '../errors';
12
13
 
13
14
  export default class BaseAudioContext {
@@ -95,7 +96,16 @@ export default class BaseAudioContext {
95
96
  );
96
97
  }
97
98
 
99
+ createAnalyser(): AnalyserNode {
100
+ return new AnalyserNode(this, this.context.createAnalyser());
101
+ }
102
+
98
103
  async decodeAudioDataSource(sourcePath: string): Promise<AudioBuffer> {
104
+ // Remove the file:// prefix if it exists
105
+ if (sourcePath.startsWith('file://')) {
106
+ sourcePath = sourcePath.replace('file://', '');
107
+ }
108
+
99
109
  const buffer = await this.context.decodeAudioDataSource(sourcePath);
100
110
 
101
111
  return new AudioBuffer(buffer);
@@ -9,6 +9,7 @@ export { default as AudioBufferSourceNode } from './core/AudioBufferSourceNode';
9
9
  export { default as AudioContext } from './core/AudioContext';
10
10
  export { default as AudioDestinationNode } from './core/AudioDestinationNode';
11
11
  export { default as AudioNode } from './core/AudioNode';
12
+ export { default as AnalyserNode } from './core/AnalyserNode';
12
13
  export { default as AudioParam } from './core/AudioParam';
13
14
  export { default as AudioScheduledSourceNode } from './core/AudioScheduledSourceNode';
14
15
  export { default as BaseAudioContext } from './core/BaseAudioContext';
package/src/index.ts CHANGED
@@ -97,16 +97,63 @@ export class AudioNode {
97
97
  this.channelInterpretation = this.node.channelInterpretation;
98
98
  }
99
99
 
100
- public connect(node: AudioNode): void {
101
- if (this.context !== node.context) {
100
+ public connect(destination: AudioNode): void {
101
+ if (this.context !== destination.context) {
102
102
  throw new Error('The AudioNodes are from different BaseAudioContexts');
103
103
  }
104
104
 
105
- this.node.connect(node.node);
105
+ this.node.connect(destination.node);
106
106
  }
107
107
 
108
- public disconnect(node: AudioNode): void {
109
- this.node.disconnect(node.node);
108
+ public disconnect(destination?: AudioNode): void {
109
+ if (destination === undefined) {
110
+ this.node.disconnect();
111
+ return;
112
+ }
113
+
114
+ this.node.disconnect(destination.node);
115
+ }
116
+ }
117
+
118
+ export class AnalyserNode extends AudioNode {
119
+ fftSize: number;
120
+ readonly frequencyBinCount: number;
121
+ minDecibels: number;
122
+ maxDecibels: number;
123
+ smoothingTimeConstant: number;
124
+
125
+ constructor(context: AudioContext, node: globalThis.AnalyserNode) {
126
+ super(context, node);
127
+
128
+ this.fftSize = node.fftSize;
129
+ this.frequencyBinCount = node.frequencyBinCount;
130
+ this.minDecibels = node.minDecibels;
131
+ this.maxDecibels = node.maxDecibels;
132
+ this.smoothingTimeConstant = node.smoothingTimeConstant;
133
+ }
134
+
135
+ public getByteFrequencyData(array: number[]): void {
136
+ (this.node as globalThis.AnalyserNode).getByteFrequencyData(
137
+ new Uint8Array(array)
138
+ );
139
+ }
140
+
141
+ public getByteTimeDomainData(array: number[]): void {
142
+ (this.node as globalThis.AnalyserNode).getByteTimeDomainData(
143
+ new Uint8Array(array)
144
+ );
145
+ }
146
+
147
+ public getFloatFrequencyData(array: number[]): void {
148
+ (this.node as globalThis.AnalyserNode).getFloatFrequencyData(
149
+ new Float32Array(array)
150
+ );
151
+ }
152
+
153
+ public getFloatTimeDomainData(array: number[]): void {
154
+ (this.node as globalThis.AnalyserNode).getFloatTimeDomainData(
155
+ new Float32Array(array)
156
+ );
110
157
  }
111
158
  }
112
159
 
@@ -373,7 +420,7 @@ export class AudioContext {
373
420
  readonly destination: AudioDestinationNode;
374
421
  readonly sampleRate: number;
375
422
 
376
- constructor() {
423
+ constructor(_sampleRate?: number) {
377
424
  this.context = new window.AudioContext();
378
425
 
379
426
  this.sampleRate = this.context.sampleRate;
@@ -428,6 +475,10 @@ export class AudioContext {
428
475
  );
429
476
  }
430
477
 
478
+ createAnalyser(): AnalyserNode {
479
+ return new AnalyserNode(this, this.context.createAnalyser());
480
+ }
481
+
431
482
  async decodeAudioDataSource(source: string): Promise<AudioBuffer> {
432
483
  const arrayBuffer = await fetch(source).then((response) =>
433
484
  response.arrayBuffer()
package/src/interfaces.ts CHANGED
@@ -27,6 +27,7 @@ export interface IBaseAudioContext {
27
27
  imag: number[],
28
28
  disableNormalization: boolean
29
29
  ) => IPeriodicWave;
30
+ createAnalyser: () => IAnalyserNode;
30
31
  decodeAudioDataSource: (sourcePath: string) => Promise<IAudioBuffer>;
31
32
  }
32
33
 
@@ -43,7 +44,7 @@ export interface IAudioNode {
43
44
  readonly channelInterpretation: ChannelInterpretation;
44
45
 
45
46
  connect: (node: IAudioNode) => void;
46
- disconnect: (node: IAudioNode) => void;
47
+ disconnect: (node?: IAudioNode) => void;
47
48
  }
48
49
 
49
50
  export interface IGainNode extends IAudioNode {
@@ -136,3 +137,16 @@ export interface IAudioParam {
136
137
  }
137
138
 
138
139
  export interface IPeriodicWave {}
140
+
141
+ export interface IAnalyserNode extends IAudioNode {
142
+ fftSize: number;
143
+ readonly frequencyBinCount: number;
144
+ minDecibels: number;
145
+ maxDecibels: number;
146
+ smoothingTimeConstant: number;
147
+
148
+ getFloatFrequencyData: (array: number[]) => void;
149
+ getByteFrequencyData: (array: number[]) => void;
150
+ getFloatTimeDomainData: (array: number[]) => void;
151
+ getByteTimeDomainData: (array: number[]) => void;
152
+ }
@@ -2,7 +2,7 @@
2
2
  import type { IAudioContext } from '../interfaces';
3
3
 
4
4
  type AudioAPIInstaller = {
5
- createAudioContext: () => IAudioContext;
5
+ createAudioContext: (sampleRate?: number) => IAudioContext;
6
6
  };
7
7
 
8
8
  declare global {