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.
Files changed (42) hide show
  1. package/android/src/main/cpp/audioapi/android/core/{utils/AudioDecoder.cpp → AudioDecoder.cpp} +75 -79
  2. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +43 -99
  3. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +101 -1
  4. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +3 -0
  5. package/common/cpp/audioapi/core/AudioContext.cpp +2 -0
  6. package/common/cpp/audioapi/core/BaseAudioContext.cpp +35 -0
  7. package/common/cpp/audioapi/core/BaseAudioContext.h +12 -4
  8. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +2 -0
  9. package/common/cpp/audioapi/core/utils/AudioDecoder.h +90 -36
  10. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +282 -241
  11. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h +19 -57
  12. package/common/cpp/test/CMakeLists.txt +1 -1
  13. package/ios/audioapi/ios/core/AudioDecoder.mm +156 -0
  14. package/lib/commonjs/api.js +1 -14
  15. package/lib/commonjs/api.js.map +1 -1
  16. package/lib/commonjs/core/BaseAudioContext.js +18 -11
  17. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  18. package/lib/module/api.js +1 -2
  19. package/lib/module/api.js.map +1 -1
  20. package/lib/module/core/BaseAudioContext.js +18 -11
  21. package/lib/module/core/BaseAudioContext.js.map +1 -1
  22. package/lib/typescript/api.d.ts +1 -3
  23. package/lib/typescript/api.d.ts.map +1 -1
  24. package/lib/typescript/core/BaseAudioContext.d.ts +6 -3
  25. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  26. package/lib/typescript/interfaces.d.ts +3 -6
  27. package/lib/typescript/interfaces.d.ts.map +1 -1
  28. package/package.json +1 -1
  29. package/src/api.ts +0 -5
  30. package/src/core/BaseAudioContext.ts +29 -26
  31. package/src/interfaces.ts +6 -18
  32. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +0 -107
  33. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.h +0 -28
  34. package/common/cpp/audioapi/core/types/AudioFormat.h +0 -16
  35. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +0 -160
  36. package/lib/commonjs/core/AudioDecoder.js +0 -48
  37. package/lib/commonjs/core/AudioDecoder.js.map +0 -1
  38. package/lib/module/core/AudioDecoder.js +0 -42
  39. package/lib/module/core/AudioDecoder.js.map +0 -1
  40. package/lib/typescript/core/AudioDecoder.d.ts +0 -4
  41. package/lib/typescript/core/AudioDecoder.d.ts.map +0 -1
  42. 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":"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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.9.0-nightly-96a5bcd-20251007",
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 { decodeAudioData, decodePCMInBase64 } from './AudioDecoder';
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,16 +0,0 @@
1
- #pragma once
2
-
3
- namespace audioapi {
4
-
5
- enum class AudioFormat {
6
- UNKNOWN,
7
- WAV,
8
- OGG,
9
- FLAC,
10
- AAC,
11
- MP3,
12
- M4A,
13
- MP4,
14
- MOV
15
- };
16
- } // 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"}