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.
- package/README.md +17 -11
- package/android/src/main/cpp/core/AudioPlayer.cpp +38 -11
- package/android/src/main/cpp/core/AudioPlayer.h +5 -1
- package/common/cpp/HostObjects/AnalyserNodeHostObject.h +151 -0
- package/common/cpp/HostObjects/AudioAPIInstallerHostObject.h +11 -3
- package/common/cpp/HostObjects/AudioNodeHostObject.h +5 -0
- package/common/cpp/HostObjects/BaseAudioContextHostObject.h +8 -0
- package/common/cpp/core/AnalyserNode.cpp +237 -0
- package/common/cpp/core/AnalyserNode.h +54 -0
- package/common/cpp/core/AudioContext.cpp +41 -1
- package/common/cpp/core/AudioContext.h +17 -0
- package/common/cpp/core/AudioNode.cpp +21 -8
- package/common/cpp/core/AudioNode.h +1 -0
- package/common/cpp/core/AudioScheduledSourceNode.cpp +1 -2
- package/common/cpp/core/BaseAudioContext.cpp +5 -40
- package/common/cpp/core/BaseAudioContext.h +7 -18
- package/common/cpp/core/Constants.h +11 -2
- package/common/cpp/core/PeriodicWave.cpp +2 -2
- package/common/cpp/jsi/JsiHostObject.h +1 -1
- package/common/cpp/jsi/JsiPromise.h +1 -0
- package/common/cpp/utils/AudioUtils.cpp +7 -0
- package/common/cpp/utils/AudioUtils.h +5 -1
- package/common/cpp/utils/FFTFrame.cpp +69 -23
- package/common/cpp/utils/FFTFrame.h +25 -10
- package/common/cpp/utils/VectorMath.cpp +10 -0
- package/common/cpp/utils/VectorMath.h +2 -0
- package/ios/core/AudioPlayer.h +3 -2
- package/ios/core/AudioPlayer.m +49 -15
- package/ios/core/IOSAudioPlayer.h +3 -1
- package/ios/core/IOSAudioPlayer.mm +46 -10
- package/lib/module/core/AnalyserNode.js +59 -0
- package/lib/module/core/AnalyserNode.js.map +1 -0
- package/lib/module/core/AudioContext.js +2 -2
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/core/AudioNode.js +5 -5
- package/lib/module/core/AudioNode.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +8 -0
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/index.js +35 -6
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.native.js +1 -0
- package/lib/module/index.native.js.map +1 -1
- package/lib/typescript/core/AnalyserNode.d.ts +18 -0
- package/lib/typescript/core/AnalyserNode.d.ts.map +1 -0
- package/lib/typescript/core/AudioContext.d.ts +1 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/AudioNode.d.ts +2 -2
- package/lib/typescript/core/AudioNode.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/index.d.ts +16 -3
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/index.native.d.ts +1 -0
- package/lib/typescript/index.native.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +13 -1
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/package.json +4 -2
- package/src/core/AnalyserNode.ts +85 -0
- package/src/core/AudioContext.ts +2 -2
- package/src/core/AudioNode.ts +5 -5
- package/src/core/BaseAudioContext.ts +10 -0
- package/src/index.native.ts +1 -0
- package/src/index.ts +57 -6
- package/src/interfaces.ts +15 -1
- 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
|
|
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":"AAAA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,gBAAgB,IAAI,eAAe,CAAC;IACpC,UAAU,IAAI,SAAS,CAAC;IACxB,kBAAkB,IAAI,iBAAiB,CAAC;IACxC,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;IAC5C,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;IACjD,YAAY,EAAE,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,KACf,YAAY,CAAC;IAClB,kBAAkB,EAAE,CAClB,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,MAAM,EAAE,EACd,oBAAoB,EAAE,OAAO,KAC1B,aAAa,CAAC;IACnB,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAEtD,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;
|
|
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
|
+
"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
|
+
}
|
package/src/core/AudioContext.ts
CHANGED
|
@@ -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 {
|
package/src/core/AudioNode.ts
CHANGED
|
@@ -22,17 +22,17 @@ export default class AudioNode {
|
|
|
22
22
|
this.channelInterpretation = this.node.channelInterpretation;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
public connect(
|
|
26
|
-
if (this.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(
|
|
32
|
+
this.node.connect(destination.node);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
public disconnect(
|
|
36
|
-
this.node.disconnect(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);
|
package/src/index.native.ts
CHANGED
|
@@ -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(
|
|
101
|
-
if (this.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(
|
|
105
|
+
this.node.connect(destination.node);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
public disconnect(
|
|
109
|
-
|
|
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
|
|
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
|
+
}
|