react-native-audio-api 0.9.0-nightly-96a5bcd-20251007 → 0.9.0
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/{utils/AudioDecoder.cpp → AudioDecoder.cpp} +75 -79
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +43 -99
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +101 -1
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +3 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +2 -0
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +35 -0
- package/common/cpp/audioapi/core/BaseAudioContext.h +12 -4
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +2 -0
- package/common/cpp/audioapi/core/utils/AudioDecoder.h +90 -36
- package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +282 -241
- package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h +19 -57
- package/common/cpp/test/CMakeLists.txt +1 -1
- package/ios/audioapi/ios/core/AudioDecoder.mm +156 -0
- package/lib/commonjs/api.js +1 -14
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +18 -11
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/module/api.js +1 -2
- package/lib/module/api.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +18 -11
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/typescript/api.d.ts +1 -3
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +6 -3
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +3 -6
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/api.ts +0 -5
- package/src/core/BaseAudioContext.ts +29 -26
- package/src/interfaces.ts +6 -18
- package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +0 -107
- package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.h +0 -28
- package/common/cpp/audioapi/core/types/AudioFormat.h +0 -16
- package/ios/audioapi/ios/core/utils/AudioDecoder.mm +0 -160
- package/lib/commonjs/core/AudioDecoder.js +0 -48
- package/lib/commonjs/core/AudioDecoder.js.map +0 -1
- package/lib/module/core/AudioDecoder.js +0 -42
- package/lib/module/core/AudioDecoder.js.map +0 -1
- package/lib/typescript/core/AudioDecoder.d.ts +0 -4
- package/lib/typescript/core/AudioDecoder.d.ts.map +0 -1
- package/src/core/AudioDecoder.ts +0 -78
|
@@ -9,7 +9,6 @@ export interface IBaseAudioContext {
|
|
|
9
9
|
readonly state: ContextState;
|
|
10
10
|
readonly sampleRate: number;
|
|
11
11
|
readonly currentTime: number;
|
|
12
|
-
readonly decoder: IAudioDecoder;
|
|
13
12
|
createRecorderAdapter(): IRecorderAdapterNode;
|
|
14
13
|
createWorkletSourceNode(shareableWorklet: ShareableWorkletCallback, shouldUseUiRuntime: boolean): IWorkletSourceNode;
|
|
15
14
|
createWorkletNode(shareableWorklet: ShareableWorkletCallback, shouldUseUiRuntime: boolean, bufferLength: number, inputChannelCount: number): IWorkletNode;
|
|
@@ -24,6 +23,9 @@ export interface IBaseAudioContext {
|
|
|
24
23
|
createBuffer: (channels: number, length: number, sampleRate: number) => IAudioBuffer;
|
|
25
24
|
createPeriodicWave: (real: Float32Array, imag: Float32Array, disableNormalization: boolean) => IPeriodicWave;
|
|
26
25
|
createAnalyser: () => IAnalyserNode;
|
|
26
|
+
decodeAudioDataSource: (sourcePath: string) => Promise<IAudioBuffer>;
|
|
27
|
+
decodeAudioData: (arrayBuffer: ArrayBuffer) => Promise<IAudioBuffer>;
|
|
28
|
+
decodePCMAudioDataInBase64: (b64: string, playbackRate: number) => Promise<IAudioBuffer>;
|
|
27
29
|
createStreamer: () => IStreamerNode;
|
|
28
30
|
}
|
|
29
31
|
export interface IAudioContext extends IBaseAudioContext {
|
|
@@ -152,11 +154,6 @@ export interface IAudioRecorder {
|
|
|
152
154
|
disconnect: () => void;
|
|
153
155
|
onAudioReady: string;
|
|
154
156
|
}
|
|
155
|
-
export interface IAudioDecoder {
|
|
156
|
-
decodeWithMemoryBlock: (arrayBuffer: ArrayBuffer, sampleRate?: number) => Promise<IAudioBuffer>;
|
|
157
|
-
decodeWithFilePath: (sourcePath: string, sampleRate?: number) => Promise<IAudioBuffer>;
|
|
158
|
-
decodeWithPCMInBase64: (b64: string, inputSampleRate: number, inputChannelCount: number, interleaved?: boolean) => Promise<IAudioBuffer>;
|
|
159
|
-
}
|
|
160
157
|
export interface IAudioEventEmitter {
|
|
161
158
|
addAudioEventListener<Name extends AudioEventName>(name: Name, callback: AudioEventCallback<Name>): string;
|
|
162
159
|
removeAudioEventListener<Name extends AudioEventName>(name: Name, subscriptionId: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,UAAU,EACX,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,mBAAmB,GAAG,CAChC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,EAC7B,YAAY,EAAE,MAAM,KACjB,IAAI,CAAC;AAEV,MAAM,MAAM,yBAAyB,GAAG,CACtC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,EAC7B,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;AAEV,MAAM,MAAM,6BAA6B,GAAG,CAC1C,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,EAC7B,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,EAC9B,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;AAEV,MAAM,MAAM,wBAAwB,GAChC,mBAAmB,GACnB,yBAAyB,GACzB,6BAA6B,CAAC;AAElC,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;
|
|
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.9.0
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification",
|
|
5
5
|
"bin": {
|
|
6
6
|
"setup-rn-audio-api-web": "./scripts/setup-rn-audio-api-web.js"
|
package/src/api.ts
CHANGED
|
@@ -2,7 +2,6 @@ import { NativeAudioAPIModule } from './specs';
|
|
|
2
2
|
import { AudioRecorderOptions } from './types';
|
|
3
3
|
import type {
|
|
4
4
|
IAudioContext,
|
|
5
|
-
IAudioDecoder,
|
|
6
5
|
IAudioRecorder,
|
|
7
6
|
IOfflineAudioContext,
|
|
8
7
|
IAudioEventEmitter,
|
|
@@ -26,8 +25,6 @@ declare global {
|
|
|
26
25
|
|
|
27
26
|
var createAudioRecorder: (options: AudioRecorderOptions) => IAudioRecorder;
|
|
28
27
|
|
|
29
|
-
var createAudioDecoder: () => IAudioDecoder;
|
|
30
|
-
|
|
31
28
|
var AudioEventEmitter: IAudioEventEmitter;
|
|
32
29
|
}
|
|
33
30
|
/* eslint-disable no-var */
|
|
@@ -36,7 +33,6 @@ if (
|
|
|
36
33
|
global.createAudioContext == null ||
|
|
37
34
|
global.createOfflineAudioContext == null ||
|
|
38
35
|
global.createAudioRecorder == null ||
|
|
39
|
-
global.createAudioDecoder == null ||
|
|
40
36
|
global.AudioEventEmitter == null
|
|
41
37
|
) {
|
|
42
38
|
if (!NativeAudioAPIModule) {
|
|
@@ -72,7 +68,6 @@ export { default as StreamerNode } from './core/StreamerNode';
|
|
|
72
68
|
export { default as ConstantSourceNode } from './core/ConstantSourceNode';
|
|
73
69
|
export { default as AudioManager } from './system';
|
|
74
70
|
export { default as useSystemVolume } from './hooks/useSystemVolume';
|
|
75
|
-
export { decodeAudioData, decodePCMInBase64 } from './core/AudioDecoder';
|
|
76
71
|
|
|
77
72
|
export {
|
|
78
73
|
OscillatorType,
|
|
@@ -15,7 +15,6 @@ import AudioBufferQueueSourceNode from './AudioBufferQueueSourceNode';
|
|
|
15
15
|
import AudioBufferSourceNode from './AudioBufferSourceNode';
|
|
16
16
|
import AudioDestinationNode from './AudioDestinationNode';
|
|
17
17
|
import BiquadFilterNode from './BiquadFilterNode';
|
|
18
|
-
import ConstantSourceNode from './ConstantSourceNode';
|
|
19
18
|
import GainNode from './GainNode';
|
|
20
19
|
import OscillatorNode from './OscillatorNode';
|
|
21
20
|
import PeriodicWave from './PeriodicWave';
|
|
@@ -23,7 +22,7 @@ import RecorderAdapterNode from './RecorderAdapterNode';
|
|
|
23
22
|
import StereoPannerNode from './StereoPannerNode';
|
|
24
23
|
import StreamerNode from './StreamerNode';
|
|
25
24
|
import WorkletNode from './WorkletNode';
|
|
26
|
-
import
|
|
25
|
+
import ConstantSourceNode from './ConstantSourceNode';
|
|
27
26
|
|
|
28
27
|
export default class BaseAudioContext {
|
|
29
28
|
readonly destination: AudioDestinationNode;
|
|
@@ -44,30 +43,6 @@ export default class BaseAudioContext {
|
|
|
44
43
|
return this.context.state;
|
|
45
44
|
}
|
|
46
45
|
|
|
47
|
-
public async decodeAudioData(
|
|
48
|
-
input: string | ArrayBuffer,
|
|
49
|
-
sampleRate?: number
|
|
50
|
-
): Promise<AudioBuffer> {
|
|
51
|
-
if (!(typeof input === 'string' || input instanceof ArrayBuffer)) {
|
|
52
|
-
throw new TypeError('Input must be a string or ArrayBuffer');
|
|
53
|
-
}
|
|
54
|
-
return await decodeAudioData(input, sampleRate ?? this.sampleRate);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
public async decodePCMInBase64(
|
|
58
|
-
base64String: string,
|
|
59
|
-
inputSampleRate: number,
|
|
60
|
-
inputChannelCount: number,
|
|
61
|
-
isInterleaved: boolean = true
|
|
62
|
-
): Promise<AudioBuffer> {
|
|
63
|
-
return await decodePCMInBase64(
|
|
64
|
-
base64String,
|
|
65
|
-
inputSampleRate,
|
|
66
|
-
inputChannelCount,
|
|
67
|
-
isInterleaved
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
46
|
createWorkletNode(
|
|
72
47
|
callback: (audioData: Array<Float32Array>, channelCount: number) => void,
|
|
73
48
|
bufferLength: number,
|
|
@@ -289,4 +264,32 @@ export default class BaseAudioContext {
|
|
|
289
264
|
createAnalyser(): AnalyserNode {
|
|
290
265
|
return new AnalyserNode(this, this.context.createAnalyser());
|
|
291
266
|
}
|
|
267
|
+
|
|
268
|
+
/** Decodes audio data from a local file path. */
|
|
269
|
+
async decodeAudioDataSource(sourcePath: string): Promise<AudioBuffer> {
|
|
270
|
+
// Remove the file:// prefix if it exists
|
|
271
|
+
if (sourcePath.startsWith('file://')) {
|
|
272
|
+
sourcePath = sourcePath.replace('file://', '');
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return new AudioBuffer(
|
|
276
|
+
await this.context.decodeAudioDataSource(sourcePath)
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/** Decodes audio data from an ArrayBuffer. */
|
|
281
|
+
async decodeAudioData(data: ArrayBuffer): Promise<AudioBuffer> {
|
|
282
|
+
return new AudioBuffer(
|
|
283
|
+
await this.context.decodeAudioData(new Uint8Array(data))
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
async decodePCMInBase64Data(
|
|
288
|
+
base64: string,
|
|
289
|
+
playbackRate: number = 1.0
|
|
290
|
+
): Promise<AudioBuffer> {
|
|
291
|
+
return new AudioBuffer(
|
|
292
|
+
await this.context.decodePCMAudioDataInBase64(base64, playbackRate)
|
|
293
|
+
);
|
|
294
|
+
}
|
|
292
295
|
}
|
package/src/interfaces.ts
CHANGED
|
@@ -37,7 +37,6 @@ export interface IBaseAudioContext {
|
|
|
37
37
|
readonly state: ContextState;
|
|
38
38
|
readonly sampleRate: number;
|
|
39
39
|
readonly currentTime: number;
|
|
40
|
-
readonly decoder: IAudioDecoder;
|
|
41
40
|
|
|
42
41
|
createRecorderAdapter(): IRecorderAdapterNode;
|
|
43
42
|
createWorkletSourceNode(
|
|
@@ -74,6 +73,12 @@ export interface IBaseAudioContext {
|
|
|
74
73
|
disableNormalization: boolean
|
|
75
74
|
) => IPeriodicWave;
|
|
76
75
|
createAnalyser: () => IAnalyserNode;
|
|
76
|
+
decodeAudioDataSource: (sourcePath: string) => Promise<IAudioBuffer>;
|
|
77
|
+
decodeAudioData: (arrayBuffer: ArrayBuffer) => Promise<IAudioBuffer>;
|
|
78
|
+
decodePCMAudioDataInBase64: (
|
|
79
|
+
b64: string,
|
|
80
|
+
playbackRate: number
|
|
81
|
+
) => Promise<IAudioBuffer>;
|
|
77
82
|
createStreamer: () => IStreamerNode;
|
|
78
83
|
}
|
|
79
84
|
|
|
@@ -259,23 +264,6 @@ export interface IAudioRecorder {
|
|
|
259
264
|
onAudioReady: string;
|
|
260
265
|
}
|
|
261
266
|
|
|
262
|
-
export interface IAudioDecoder {
|
|
263
|
-
decodeWithMemoryBlock: (
|
|
264
|
-
arrayBuffer: ArrayBuffer,
|
|
265
|
-
sampleRate?: number
|
|
266
|
-
) => Promise<IAudioBuffer>;
|
|
267
|
-
decodeWithFilePath: (
|
|
268
|
-
sourcePath: string,
|
|
269
|
-
sampleRate?: number
|
|
270
|
-
) => Promise<IAudioBuffer>;
|
|
271
|
-
decodeWithPCMInBase64: (
|
|
272
|
-
b64: string,
|
|
273
|
-
inputSampleRate: number,
|
|
274
|
-
inputChannelCount: number,
|
|
275
|
-
interleaved?: boolean
|
|
276
|
-
) => Promise<IAudioBuffer>;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
267
|
export interface IAudioEventEmitter {
|
|
280
268
|
addAudioEventListener<Name extends AudioEventName>(
|
|
281
269
|
name: Name,
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
|
|
4
|
-
#include <audioapi/HostObjects/utils/AudioDecoderHostObject.h>
|
|
5
|
-
#include <audioapi/core/utils/AudioDecoder.h>
|
|
6
|
-
#include <audioapi/jsi/JsiPromise.h>
|
|
7
|
-
|
|
8
|
-
#include <jsi/jsi.h>
|
|
9
|
-
#include <memory>
|
|
10
|
-
#include <string>
|
|
11
|
-
#include <thread>
|
|
12
|
-
#include <utility>
|
|
13
|
-
|
|
14
|
-
namespace audioapi {
|
|
15
|
-
AudioDecoderHostObject::AudioDecoderHostObject(
|
|
16
|
-
jsi::Runtime *runtime,
|
|
17
|
-
const std::shared_ptr<react::CallInvoker> &callInvoker) {
|
|
18
|
-
promiseVendor_ = std::make_shared<PromiseVendor>(runtime, callInvoker);
|
|
19
|
-
addFunctions(
|
|
20
|
-
JSI_EXPORT_FUNCTION(AudioDecoderHostObject, decodeWithPCMInBase64),
|
|
21
|
-
JSI_EXPORT_FUNCTION(AudioDecoderHostObject, decodeWithFilePath),
|
|
22
|
-
JSI_EXPORT_FUNCTION(AudioDecoderHostObject, decodeWithMemoryBlock));
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
JSI_HOST_FUNCTION_IMPL(AudioDecoderHostObject, decodeWithMemoryBlock) {
|
|
26
|
-
auto arrayBuffer = args[0]
|
|
27
|
-
.getObject(runtime)
|
|
28
|
-
.getPropertyAsObject(runtime, "buffer")
|
|
29
|
-
.getArrayBuffer(runtime);
|
|
30
|
-
auto data = arrayBuffer.data(runtime);
|
|
31
|
-
auto size = static_cast<int>(arrayBuffer.size(runtime));
|
|
32
|
-
|
|
33
|
-
auto sampleRate = args[1].getNumber();
|
|
34
|
-
|
|
35
|
-
return promiseVendor_->createAsyncPromise(
|
|
36
|
-
[data, size, sampleRate](
|
|
37
|
-
jsi::Runtime &runtime) -> std::variant<jsi::Value, std::string> {
|
|
38
|
-
auto result =
|
|
39
|
-
AudioDecoder::decodeWithMemoryBlock(data, size, sampleRate);
|
|
40
|
-
|
|
41
|
-
if (!result) {
|
|
42
|
-
return std::string("Failed to decode audio data.");
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
auto audioBufferHostObject =
|
|
46
|
-
std::make_shared<AudioBufferHostObject>(result);
|
|
47
|
-
|
|
48
|
-
auto jsiObject =
|
|
49
|
-
jsi::Object::createFromHostObject(runtime, audioBufferHostObject);
|
|
50
|
-
jsiObject.setExternalMemoryPressure(
|
|
51
|
-
runtime, audioBufferHostObject->getSizeInBytes());
|
|
52
|
-
return jsiObject;
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
JSI_HOST_FUNCTION_IMPL(AudioDecoderHostObject, decodeWithFilePath) {
|
|
57
|
-
auto sourcePath = args[0].getString(runtime).utf8(runtime);
|
|
58
|
-
auto sampleRate = args[1].getNumber();
|
|
59
|
-
|
|
60
|
-
return promiseVendor_->createAsyncPromise(
|
|
61
|
-
[sourcePath, sampleRate](
|
|
62
|
-
jsi::Runtime &runtime) -> std::variant<jsi::Value, std::string> {
|
|
63
|
-
auto result = AudioDecoder::decodeWithFilePath(sourcePath, sampleRate);
|
|
64
|
-
|
|
65
|
-
if (!result) {
|
|
66
|
-
return std::string("Failed to decode audio data source.");
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
auto audioBufferHostObject =
|
|
70
|
-
std::make_shared<AudioBufferHostObject>(result);
|
|
71
|
-
|
|
72
|
-
auto jsiObject =
|
|
73
|
-
jsi::Object::createFromHostObject(runtime, audioBufferHostObject);
|
|
74
|
-
jsiObject.setExternalMemoryPressure(
|
|
75
|
-
runtime, audioBufferHostObject->getSizeInBytes());
|
|
76
|
-
return jsiObject;
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
JSI_HOST_FUNCTION_IMPL(AudioDecoderHostObject, decodeWithPCMInBase64) {
|
|
81
|
-
auto b64 = args[0].getString(runtime).utf8(runtime);
|
|
82
|
-
auto inputSampleRate = args[1].getNumber();
|
|
83
|
-
auto inputChannelCount = args[2].getNumber();
|
|
84
|
-
auto interleaved = args[3].getBool();
|
|
85
|
-
|
|
86
|
-
return promiseVendor_->createAsyncPromise(
|
|
87
|
-
[b64, inputSampleRate, inputChannelCount, interleaved](
|
|
88
|
-
jsi::Runtime &runtime) -> std::variant<jsi::Value, std::string> {
|
|
89
|
-
auto result = AudioDecoder::decodeWithPCMInBase64(
|
|
90
|
-
b64, inputSampleRate, inputChannelCount, interleaved);
|
|
91
|
-
|
|
92
|
-
if (!result) {
|
|
93
|
-
return std::string("Failed to decode audio data source.");
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
auto audioBufferHostObject =
|
|
97
|
-
std::make_shared<AudioBufferHostObject>(result);
|
|
98
|
-
|
|
99
|
-
auto jsiObject =
|
|
100
|
-
jsi::Object::createFromHostObject(runtime, audioBufferHostObject);
|
|
101
|
-
jsiObject.setExternalMemoryPressure(
|
|
102
|
-
runtime, audioBufferHostObject->getSizeInBytes());
|
|
103
|
-
return jsiObject;
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
} // namespace audioapi
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
|
|
4
|
-
#include <audioapi/core/utils/AudioDecoder.h>
|
|
5
|
-
#include <audioapi/jsi/JsiPromise.h>
|
|
6
|
-
|
|
7
|
-
#include <jsi/jsi.h>
|
|
8
|
-
#include <memory>
|
|
9
|
-
#include <string>
|
|
10
|
-
#include <thread>
|
|
11
|
-
#include <utility>
|
|
12
|
-
|
|
13
|
-
namespace audioapi {
|
|
14
|
-
using namespace facebook;
|
|
15
|
-
|
|
16
|
-
class AudioDecoderHostObject : public JsiHostObject {
|
|
17
|
-
public:
|
|
18
|
-
explicit AudioDecoderHostObject(
|
|
19
|
-
jsi::Runtime *runtime,
|
|
20
|
-
const std::shared_ptr<react::CallInvoker> &callInvoker);
|
|
21
|
-
JSI_HOST_FUNCTION_DECL(decodeWithMemoryBlock);
|
|
22
|
-
JSI_HOST_FUNCTION_DECL(decodeWithFilePath);
|
|
23
|
-
JSI_HOST_FUNCTION_DECL(decodeWithPCMInBase64);
|
|
24
|
-
|
|
25
|
-
private:
|
|
26
|
-
std::shared_ptr<PromiseVendor> promiseVendor_;
|
|
27
|
-
};
|
|
28
|
-
} // namespace audioapi
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
#define MINIAUDIO_IMPLEMENTATION
|
|
2
|
-
#import <audioapi/libs/miniaudio/miniaudio.h>
|
|
3
|
-
|
|
4
|
-
#include <audioapi/libs/miniaudio/decoders/libopus/miniaudio_libopus.h>
|
|
5
|
-
#include <audioapi/libs/miniaudio/decoders/libvorbis/miniaudio_libvorbis.h>
|
|
6
|
-
|
|
7
|
-
#include <audioapi/core/sources/AudioBuffer.h>
|
|
8
|
-
#include <audioapi/core/utils/AudioDecoder.h>
|
|
9
|
-
#include <audioapi/dsp/VectorMath.h>
|
|
10
|
-
#include <audioapi/libs/audio-stretch/stretch.h>
|
|
11
|
-
#include <audioapi/libs/base64/base64.h>
|
|
12
|
-
#include <audioapi/libs/ffmpeg/FFmpegDecoding.h>
|
|
13
|
-
#include <audioapi/utils/AudioArray.h>
|
|
14
|
-
#include <audioapi/utils/AudioBus.h>
|
|
15
|
-
|
|
16
|
-
namespace audioapi {
|
|
17
|
-
|
|
18
|
-
// Decoding audio in fixed-size chunks because total frame count can't be
|
|
19
|
-
// determined in advance. Note: ma_decoder_get_length_in_pcm_frames() always
|
|
20
|
-
// returns 0 for Vorbis decoders.
|
|
21
|
-
std::vector<float> AudioDecoder::readAllPcmFrames(ma_decoder &decoder, int outputChannels)
|
|
22
|
-
{
|
|
23
|
-
std::vector<float> buffer;
|
|
24
|
-
std::vector<float> temp(CHUNK_SIZE * outputChannels);
|
|
25
|
-
ma_uint64 outFramesRead = 0;
|
|
26
|
-
|
|
27
|
-
while (true) {
|
|
28
|
-
ma_uint64 tempFramesDecoded = 0;
|
|
29
|
-
ma_decoder_read_pcm_frames(&decoder, temp.data(), CHUNK_SIZE, &tempFramesDecoded);
|
|
30
|
-
if (tempFramesDecoded == 0) {
|
|
31
|
-
break;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
buffer.insert(buffer.end(), temp.data(), temp.data() + tempFramesDecoded * outputChannels);
|
|
35
|
-
outFramesRead += tempFramesDecoded;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (outFramesRead == 0) {
|
|
39
|
-
NSLog(@"Failed to decode");
|
|
40
|
-
}
|
|
41
|
-
return buffer;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
std::shared_ptr<AudioBuffer> AudioDecoder::makeAudioBufferFromFloatBuffer(
|
|
45
|
-
const std::vector<float> &buffer,
|
|
46
|
-
float outputSampleRate,
|
|
47
|
-
int outputChannels)
|
|
48
|
-
{
|
|
49
|
-
if (buffer.empty()) {
|
|
50
|
-
return nullptr;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
auto outputFrames = buffer.size() / outputChannels;
|
|
54
|
-
auto audioBus = std::make_shared<AudioBus>(outputFrames, outputChannels, outputSampleRate);
|
|
55
|
-
|
|
56
|
-
for (int ch = 0; ch < outputChannels; ++ch) {
|
|
57
|
-
auto channelData = audioBus->getChannel(ch)->getData();
|
|
58
|
-
for (int i = 0; i < outputFrames; ++i) {
|
|
59
|
-
channelData[i] = buffer[i * outputChannels + ch];
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return std::make_shared<AudioBuffer>(audioBus);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithFilePath(const std::string &path, float sampleRate)
|
|
66
|
-
{
|
|
67
|
-
if (AudioDecoder::pathHasExtension(path, {".mp4", ".m4a", ".aac"})) {
|
|
68
|
-
auto buffer = ffmpegdecoder::decodeWithFilePath(path, static_cast<int>(sampleRate));
|
|
69
|
-
if (buffer == nullptr) {
|
|
70
|
-
NSLog(@"Failed to decode with FFmpeg: %s", path.c_str());
|
|
71
|
-
return nullptr;
|
|
72
|
-
}
|
|
73
|
-
return buffer;
|
|
74
|
-
}
|
|
75
|
-
ma_decoder decoder;
|
|
76
|
-
ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
|
|
77
|
-
ma_decoding_backend_vtable *customBackends[] = {ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
|
|
78
|
-
|
|
79
|
-
config.ppCustomBackendVTables = customBackends;
|
|
80
|
-
config.customBackendCount = sizeof(customBackends) / sizeof(customBackends[0]);
|
|
81
|
-
|
|
82
|
-
if (ma_decoder_init_file(path.c_str(), &config, &decoder) != MA_SUCCESS) {
|
|
83
|
-
NSLog(@"Failed to initialize decoder for file: %s", path.c_str());
|
|
84
|
-
ma_decoder_uninit(&decoder);
|
|
85
|
-
return nullptr;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
auto outputSampleRate = static_cast<float>(decoder.outputSampleRate);
|
|
89
|
-
auto outputChannels = static_cast<int>(decoder.outputChannels);
|
|
90
|
-
|
|
91
|
-
std::vector<float> buffer = readAllPcmFrames(decoder, outputChannels);
|
|
92
|
-
ma_decoder_uninit(&decoder);
|
|
93
|
-
return makeAudioBufferFromFloatBuffer(buffer, outputSampleRate, outputChannels);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithMemoryBlock(const void *data, size_t size, float sampleRate)
|
|
97
|
-
{
|
|
98
|
-
const AudioFormat format = AudioDecoder::detectAudioFormat(data, size);
|
|
99
|
-
if (format == AudioFormat::MP4 || format == AudioFormat::M4A || format == AudioFormat::AAC) {
|
|
100
|
-
auto buffer = ffmpegdecoder::decodeWithMemoryBlock(data, size, static_cast<int>(sampleRate));
|
|
101
|
-
if (buffer == nullptr) {
|
|
102
|
-
NSLog(@"Failed to decode with FFmpeg");
|
|
103
|
-
return nullptr;
|
|
104
|
-
}
|
|
105
|
-
return buffer;
|
|
106
|
-
}
|
|
107
|
-
ma_decoder decoder;
|
|
108
|
-
ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
|
|
109
|
-
|
|
110
|
-
ma_decoding_backend_vtable *customBackends[] = {ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
|
|
111
|
-
|
|
112
|
-
config.ppCustomBackendVTables = customBackends;
|
|
113
|
-
config.customBackendCount = sizeof(customBackends) / sizeof(customBackends[0]);
|
|
114
|
-
|
|
115
|
-
if (ma_decoder_init_memory(data, size, &config, &decoder) != MA_SUCCESS) {
|
|
116
|
-
NSLog(@"Failed to initialize decoder for memory block");
|
|
117
|
-
ma_decoder_uninit(&decoder);
|
|
118
|
-
return nullptr;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
auto outputSampleRate = static_cast<float>(decoder.outputSampleRate);
|
|
122
|
-
auto outputChannels = static_cast<int>(decoder.outputChannels);
|
|
123
|
-
|
|
124
|
-
std::vector<float> buffer = readAllPcmFrames(decoder, outputChannels);
|
|
125
|
-
ma_decoder_uninit(&decoder);
|
|
126
|
-
return makeAudioBufferFromFloatBuffer(buffer, outputSampleRate, outputChannels);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithPCMInBase64(
|
|
130
|
-
const std::string &data,
|
|
131
|
-
float inputSampleRate,
|
|
132
|
-
int inputChannelCount,
|
|
133
|
-
bool interleaved)
|
|
134
|
-
{
|
|
135
|
-
auto decodedData = base64_decode(data, false);
|
|
136
|
-
const auto uint8Data = reinterpret_cast<uint8_t *>(decodedData.data());
|
|
137
|
-
size_t numFramesDecoded = decodedData.size() / (inputChannelCount * sizeof(int16_t));
|
|
138
|
-
|
|
139
|
-
auto audioBus = std::make_shared<AudioBus>(numFramesDecoded, inputChannelCount, inputSampleRate);
|
|
140
|
-
|
|
141
|
-
for (int ch = 0; ch < inputChannelCount; ++ch) {
|
|
142
|
-
auto channelData = audioBus->getChannel(ch)->getData();
|
|
143
|
-
|
|
144
|
-
for (size_t i = 0; i < numFramesDecoded; ++i) {
|
|
145
|
-
size_t offset;
|
|
146
|
-
if (interleaved) {
|
|
147
|
-
// Ch1, Ch2, Ch1, Ch2, ...
|
|
148
|
-
offset = (i * inputChannelCount + ch) * sizeof(int16_t);
|
|
149
|
-
} else {
|
|
150
|
-
// Ch1, Ch1, Ch1, ..., Ch2, Ch2, Ch2, ...
|
|
151
|
-
offset = (ch * numFramesDecoded + i) * sizeof(int16_t);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
channelData[i] = uint8ToFloat(uint8Data[offset], uint8Data[offset + 1]);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
return std::make_shared<AudioBuffer>(audioBus);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
} // namespace audioapi
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.decodeAudioData = decodeAudioData;
|
|
7
|
-
exports.decodePCMInBase64 = decodePCMInBase64;
|
|
8
|
-
var _AudioBuffer = _interopRequireDefault(require("./AudioBuffer"));
|
|
9
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
class AudioDecoder {
|
|
11
|
-
static instance = null;
|
|
12
|
-
constructor() {
|
|
13
|
-
this.decoder = global.createAudioDecoder();
|
|
14
|
-
}
|
|
15
|
-
static getInstance() {
|
|
16
|
-
if (!AudioDecoder.instance) {
|
|
17
|
-
AudioDecoder.instance = new AudioDecoder();
|
|
18
|
-
}
|
|
19
|
-
return AudioDecoder.instance;
|
|
20
|
-
}
|
|
21
|
-
async decodeAudioDataInstance(input, sampleRate) {
|
|
22
|
-
let buffer;
|
|
23
|
-
if (typeof input === 'string') {
|
|
24
|
-
// Remove the file:// prefix if it exists
|
|
25
|
-
if (input.startsWith('file://')) {
|
|
26
|
-
input = input.replace('file://', '');
|
|
27
|
-
}
|
|
28
|
-
buffer = await this.decoder.decodeWithFilePath(input, sampleRate ?? 0);
|
|
29
|
-
} else if (input instanceof ArrayBuffer) {
|
|
30
|
-
buffer = await this.decoder.decodeWithMemoryBlock(new Uint8Array(input), sampleRate ?? 0);
|
|
31
|
-
}
|
|
32
|
-
if (!buffer) {
|
|
33
|
-
throw new Error('Unsupported input type or failed to decode audio');
|
|
34
|
-
}
|
|
35
|
-
return new _AudioBuffer.default(buffer);
|
|
36
|
-
}
|
|
37
|
-
async decodePCMInBase64Instance(base64String, inputSampleRate, inputChannelCount, interleaved) {
|
|
38
|
-
const buffer = await this.decoder.decodeWithPCMInBase64(base64String, inputSampleRate, inputChannelCount, interleaved);
|
|
39
|
-
return new _AudioBuffer.default(buffer);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
async function decodeAudioData(input, sampleRate) {
|
|
43
|
-
return AudioDecoder.getInstance().decodeAudioDataInstance(input, sampleRate);
|
|
44
|
-
}
|
|
45
|
-
async function decodePCMInBase64(base64String, inputSampleRate, inputChannelCount, isInterleaved = true) {
|
|
46
|
-
return AudioDecoder.getInstance().decodePCMInBase64Instance(base64String, inputSampleRate, inputChannelCount, isInterleaved);
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=AudioDecoder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioBuffer","_interopRequireDefault","require","e","__esModule","default","AudioDecoder","instance","constructor","decoder","global","createAudioDecoder","getInstance","decodeAudioDataInstance","input","sampleRate","buffer","startsWith","replace","decodeWithFilePath","ArrayBuffer","decodeWithMemoryBlock","Uint8Array","Error","AudioBuffer","decodePCMInBase64Instance","base64String","inputSampleRate","inputChannelCount","interleaved","decodeWithPCMInBase64","decodeAudioData","decodePCMInBase64","isInterleaved"],"sourceRoot":"../../../src","sources":["core/AudioDecoder.ts"],"mappings":";;;;;;;AACA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAwC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAExC,MAAMG,YAAY,CAAC;EACjB,OAAeC,QAAQ,GAAwB,IAAI;EAG3CC,WAAWA,CAAA,EAAG;IACpB,IAAI,CAACC,OAAO,GAAGC,MAAM,CAACC,kBAAkB,CAAC,CAAC;EAC5C;EAEA,OAAcC,WAAWA,CAAA,EAAiB;IACxC,IAAI,CAACN,YAAY,CAACC,QAAQ,EAAE;MAC1BD,YAAY,CAACC,QAAQ,GAAG,IAAID,YAAY,CAAC,CAAC;IAC5C;IACA,OAAOA,YAAY,CAACC,QAAQ;EAC9B;EAEA,MAAaM,uBAAuBA,CAClCC,KAA2B,EAC3BC,UAAmB,EACG;IACtB,IAAIC,MAAM;IACV,IAAI,OAAOF,KAAK,KAAK,QAAQ,EAAE;MAC7B;MACA,IAAIA,KAAK,CAACG,UAAU,CAAC,SAAS,CAAC,EAAE;QAC/BH,KAAK,GAAGA,KAAK,CAACI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;MACtC;MACAF,MAAM,GAAG,MAAM,IAAI,CAACP,OAAO,CAACU,kBAAkB,CAACL,KAAK,EAAEC,UAAU,IAAI,CAAC,CAAC;IACxE,CAAC,MAAM,IAAID,KAAK,YAAYM,WAAW,EAAE;MACvCJ,MAAM,GAAG,MAAM,IAAI,CAACP,OAAO,CAACY,qBAAqB,CAC/C,IAAIC,UAAU,CAACR,KAAK,CAAC,EACrBC,UAAU,IAAI,CAChB,CAAC;IACH;IAEA,IAAI,CAACC,MAAM,EAAE;MACX,MAAM,IAAIO,KAAK,CAAC,kDAAkD,CAAC;IACrE;IACA,OAAO,IAAIC,oBAAW,CAACR,MAAM,CAAC;EAChC;EAEA,MAAaS,yBAAyBA,CACpCC,YAAoB,EACpBC,eAAuB,EACvBC,iBAAyB,EACzBC,WAAoB,EACE;IACtB,MAAMb,MAAM,GAAG,MAAM,IAAI,CAACP,OAAO,CAACqB,qBAAqB,CACrDJ,YAAY,EACZC,eAAe,EACfC,iBAAiB,EACjBC,WACF,CAAC;IACD,OAAO,IAAIL,oBAAW,CAACR,MAAM,CAAC;EAChC;AACF;AAEO,eAAee,eAAeA,CACnCjB,KAA2B,EAC3BC,UAAmB,EACG;EACtB,OAAOT,YAAY,CAACM,WAAW,CAAC,CAAC,CAACC,uBAAuB,CAACC,KAAK,EAAEC,UAAU,CAAC;AAC9E;AAEO,eAAeiB,iBAAiBA,CACrCN,YAAoB,EACpBC,eAAuB,EACvBC,iBAAyB,EACzBK,aAAsB,GAAG,IAAI,EACP;EACtB,OAAO3B,YAAY,CAACM,WAAW,CAAC,CAAC,CAACa,yBAAyB,CACzDC,YAAY,EACZC,eAAe,EACfC,iBAAiB,EACjBK,aACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import AudioBuffer from "./AudioBuffer.js";
|
|
4
|
-
class AudioDecoder {
|
|
5
|
-
static instance = null;
|
|
6
|
-
constructor() {
|
|
7
|
-
this.decoder = global.createAudioDecoder();
|
|
8
|
-
}
|
|
9
|
-
static getInstance() {
|
|
10
|
-
if (!AudioDecoder.instance) {
|
|
11
|
-
AudioDecoder.instance = new AudioDecoder();
|
|
12
|
-
}
|
|
13
|
-
return AudioDecoder.instance;
|
|
14
|
-
}
|
|
15
|
-
async decodeAudioDataInstance(input, sampleRate) {
|
|
16
|
-
let buffer;
|
|
17
|
-
if (typeof input === 'string') {
|
|
18
|
-
// Remove the file:// prefix if it exists
|
|
19
|
-
if (input.startsWith('file://')) {
|
|
20
|
-
input = input.replace('file://', '');
|
|
21
|
-
}
|
|
22
|
-
buffer = await this.decoder.decodeWithFilePath(input, sampleRate ?? 0);
|
|
23
|
-
} else if (input instanceof ArrayBuffer) {
|
|
24
|
-
buffer = await this.decoder.decodeWithMemoryBlock(new Uint8Array(input), sampleRate ?? 0);
|
|
25
|
-
}
|
|
26
|
-
if (!buffer) {
|
|
27
|
-
throw new Error('Unsupported input type or failed to decode audio');
|
|
28
|
-
}
|
|
29
|
-
return new AudioBuffer(buffer);
|
|
30
|
-
}
|
|
31
|
-
async decodePCMInBase64Instance(base64String, inputSampleRate, inputChannelCount, interleaved) {
|
|
32
|
-
const buffer = await this.decoder.decodeWithPCMInBase64(base64String, inputSampleRate, inputChannelCount, interleaved);
|
|
33
|
-
return new AudioBuffer(buffer);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
export async function decodeAudioData(input, sampleRate) {
|
|
37
|
-
return AudioDecoder.getInstance().decodeAudioDataInstance(input, sampleRate);
|
|
38
|
-
}
|
|
39
|
-
export async function decodePCMInBase64(base64String, inputSampleRate, inputChannelCount, isInterleaved = true) {
|
|
40
|
-
return AudioDecoder.getInstance().decodePCMInBase64Instance(base64String, inputSampleRate, inputChannelCount, isInterleaved);
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=AudioDecoder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["AudioBuffer","AudioDecoder","instance","constructor","decoder","global","createAudioDecoder","getInstance","decodeAudioDataInstance","input","sampleRate","buffer","startsWith","replace","decodeWithFilePath","ArrayBuffer","decodeWithMemoryBlock","Uint8Array","Error","decodePCMInBase64Instance","base64String","inputSampleRate","inputChannelCount","interleaved","decodeWithPCMInBase64","decodeAudioData","decodePCMInBase64","isInterleaved"],"sourceRoot":"../../../src","sources":["core/AudioDecoder.ts"],"mappings":";;AACA,OAAOA,WAAW,MAAM,kBAAe;AAEvC,MAAMC,YAAY,CAAC;EACjB,OAAeC,QAAQ,GAAwB,IAAI;EAG3CC,WAAWA,CAAA,EAAG;IACpB,IAAI,CAACC,OAAO,GAAGC,MAAM,CAACC,kBAAkB,CAAC,CAAC;EAC5C;EAEA,OAAcC,WAAWA,CAAA,EAAiB;IACxC,IAAI,CAACN,YAAY,CAACC,QAAQ,EAAE;MAC1BD,YAAY,CAACC,QAAQ,GAAG,IAAID,YAAY,CAAC,CAAC;IAC5C;IACA,OAAOA,YAAY,CAACC,QAAQ;EAC9B;EAEA,MAAaM,uBAAuBA,CAClCC,KAA2B,EAC3BC,UAAmB,EACG;IACtB,IAAIC,MAAM;IACV,IAAI,OAAOF,KAAK,KAAK,QAAQ,EAAE;MAC7B;MACA,IAAIA,KAAK,CAACG,UAAU,CAAC,SAAS,CAAC,EAAE;QAC/BH,KAAK,GAAGA,KAAK,CAACI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;MACtC;MACAF,MAAM,GAAG,MAAM,IAAI,CAACP,OAAO,CAACU,kBAAkB,CAACL,KAAK,EAAEC,UAAU,IAAI,CAAC,CAAC;IACxE,CAAC,MAAM,IAAID,KAAK,YAAYM,WAAW,EAAE;MACvCJ,MAAM,GAAG,MAAM,IAAI,CAACP,OAAO,CAACY,qBAAqB,CAC/C,IAAIC,UAAU,CAACR,KAAK,CAAC,EACrBC,UAAU,IAAI,CAChB,CAAC;IACH;IAEA,IAAI,CAACC,MAAM,EAAE;MACX,MAAM,IAAIO,KAAK,CAAC,kDAAkD,CAAC;IACrE;IACA,OAAO,IAAIlB,WAAW,CAACW,MAAM,CAAC;EAChC;EAEA,MAAaQ,yBAAyBA,CACpCC,YAAoB,EACpBC,eAAuB,EACvBC,iBAAyB,EACzBC,WAAoB,EACE;IACtB,MAAMZ,MAAM,GAAG,MAAM,IAAI,CAACP,OAAO,CAACoB,qBAAqB,CACrDJ,YAAY,EACZC,eAAe,EACfC,iBAAiB,EACjBC,WACF,CAAC;IACD,OAAO,IAAIvB,WAAW,CAACW,MAAM,CAAC;EAChC;AACF;AAEA,OAAO,eAAec,eAAeA,CACnChB,KAA2B,EAC3BC,UAAmB,EACG;EACtB,OAAOT,YAAY,CAACM,WAAW,CAAC,CAAC,CAACC,uBAAuB,CAACC,KAAK,EAAEC,UAAU,CAAC;AAC9E;AAEA,OAAO,eAAegB,iBAAiBA,CACrCN,YAAoB,EACpBC,eAAuB,EACvBC,iBAAyB,EACzBK,aAAsB,GAAG,IAAI,EACP;EACtB,OAAO1B,YAAY,CAACM,WAAW,CAAC,CAAC,CAACY,yBAAyB,CACzDC,YAAY,EACZC,eAAe,EACfC,iBAAiB,EACjBK,aACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import AudioBuffer from './AudioBuffer';
|
|
2
|
-
export declare function decodeAudioData(input: string | ArrayBuffer, sampleRate?: number): Promise<AudioBuffer>;
|
|
3
|
-
export declare function decodePCMInBase64(base64String: string, inputSampleRate: number, inputChannelCount: number, isInterleaved?: boolean): Promise<AudioBuffer>;
|
|
4
|
-
//# sourceMappingURL=AudioDecoder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AudioDecoder.d.ts","sourceRoot":"","sources":["../../../src/core/AudioDecoder.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,eAAe,CAAC;AAyDxC,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,GAAG,WAAW,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC,CAEtB;AAED,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,EACzB,aAAa,GAAE,OAAc,GAC5B,OAAO,CAAC,WAAW,CAAC,CAOtB"}
|