react-native-audio-api 0.9.0-nightly-96a5bcd-20251007 → 0.9.0-nightly-7ecb495-20251008
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/common/cpp/audioapi/AudioAPIModuleInstaller.h +25 -0
- package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +78 -52
- package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +58 -0
- package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.h +26 -0
- package/common/cpp/audioapi/core/utils/AudioDecoder.h +0 -1
- package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +75 -0
- package/common/cpp/audioapi/core/utils/AudioStretcher.h +30 -0
- package/common/cpp/audioapi/core/utils/Constants.h +4 -0
- package/lib/commonjs/api.js +8 -1
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/core/AudioStretcher.js +31 -0
- package/lib/commonjs/core/AudioStretcher.js.map +1 -0
- package/lib/module/api.js +2 -1
- package/lib/module/api.js.map +1 -1
- package/lib/module/core/AudioStretcher.js +26 -0
- package/lib/module/core/AudioStretcher.js.map +1 -0
- package/lib/typescript/api.d.ts +3 -1
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/core/AudioStretcher.d.ts +3 -0
- package/lib/typescript/core/AudioStretcher.d.ts.map +1 -0
- package/lib/typescript/interfaces.d.ts +4 -0
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/api.ts +5 -0
- package/src/core/AudioStretcher.ts +43 -0
- package/src/interfaces.ts +8 -0
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
#include <audioapi/HostObjects/OfflineAudioContextHostObject.h>
|
|
5
5
|
#include <audioapi/HostObjects/inputs/AudioRecorderHostObject.h>
|
|
6
6
|
#include <audioapi/HostObjects/utils/AudioDecoderHostObject.h>
|
|
7
|
+
#include <audioapi/HostObjects/utils/AudioStretcherHostObject.h>
|
|
7
8
|
#include <audioapi/core/AudioContext.h>
|
|
8
9
|
#include <audioapi/core/OfflineAudioContext.h>
|
|
9
10
|
#include <audioapi/core/inputs/AudioRecorder.h>
|
|
@@ -36,6 +37,8 @@ class AudioAPIModuleInstaller {
|
|
|
36
37
|
jsiRuntime, jsCallInvoker, audioEventHandlerRegistry, uiRuntime);
|
|
37
38
|
auto createAudioDecoder =
|
|
38
39
|
getCreateAudioDecoderFunction(jsiRuntime, jsCallInvoker);
|
|
40
|
+
auto createAudioStretcher =
|
|
41
|
+
getCreateAudioStretcherFunction(jsiRuntime, jsCallInvoker);
|
|
39
42
|
|
|
40
43
|
jsiRuntime->global().setProperty(
|
|
41
44
|
*jsiRuntime, "createAudioContext", createAudioContext);
|
|
@@ -45,6 +48,8 @@ class AudioAPIModuleInstaller {
|
|
|
45
48
|
*jsiRuntime, "createOfflineAudioContext", createOfflineAudioContext);
|
|
46
49
|
jsiRuntime->global().setProperty(
|
|
47
50
|
*jsiRuntime, "createAudioDecoder", createAudioDecoder);
|
|
51
|
+
jsiRuntime->global().setProperty(
|
|
52
|
+
*jsiRuntime, "createAudioStretcher", createAudioStretcher);
|
|
48
53
|
|
|
49
54
|
auto audioEventHandlerRegistryHostObject =
|
|
50
55
|
std::make_shared<AudioEventHandlerRegistryHostObject>(
|
|
@@ -190,6 +195,26 @@ class AudioAPIModuleInstaller {
|
|
|
190
195
|
runtime, audioDecoderHostObject);
|
|
191
196
|
});
|
|
192
197
|
}
|
|
198
|
+
|
|
199
|
+
static jsi::Function getCreateAudioStretcherFunction(
|
|
200
|
+
jsi::Runtime *jsiRuntime,
|
|
201
|
+
const std::shared_ptr<react::CallInvoker> &jsCallInvoker) {
|
|
202
|
+
return jsi::Function::createFromHostFunction(
|
|
203
|
+
*jsiRuntime,
|
|
204
|
+
jsi::PropNameID::forAscii(*jsiRuntime, "createAudioStretcher"),
|
|
205
|
+
0,
|
|
206
|
+
[jsCallInvoker](
|
|
207
|
+
jsi::Runtime &runtime,
|
|
208
|
+
const jsi::Value &thisValue,
|
|
209
|
+
const jsi::Value *args,
|
|
210
|
+
size_t count) -> jsi::Value {
|
|
211
|
+
auto audioStretcherHostObject =
|
|
212
|
+
std::make_shared<AudioStretcherHostObject>(
|
|
213
|
+
&runtime, jsCallInvoker);
|
|
214
|
+
return jsi::Object::createFromHostObject(
|
|
215
|
+
runtime, audioStretcherHostObject);
|
|
216
|
+
});
|
|
217
|
+
}
|
|
193
218
|
};
|
|
194
219
|
|
|
195
220
|
} // namespace audioapi
|
|
@@ -32,49 +32,63 @@ JSI_HOST_FUNCTION_IMPL(AudioDecoderHostObject, decodeWithMemoryBlock) {
|
|
|
32
32
|
|
|
33
33
|
auto sampleRate = args[1].getNumber();
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
[data, size, sampleRate](
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
35
|
+
auto promise = promiseVendor_->createPromise(
|
|
36
|
+
[data, size, sampleRate](std::shared_ptr<Promise> promise) {
|
|
37
|
+
std::thread([data, size, sampleRate, promise = std::move(promise)]() {
|
|
38
|
+
auto result =
|
|
39
|
+
AudioDecoder::decodeWithMemoryBlock(data, size, sampleRate);
|
|
40
|
+
|
|
41
|
+
if (!result) {
|
|
42
|
+
promise->reject("Failed to decode audio data.");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
auto audioBufferHostObject =
|
|
47
|
+
std::make_shared<AudioBufferHostObject>(result);
|
|
48
|
+
|
|
49
|
+
promise->resolve([audioBufferHostObject = std::move(
|
|
50
|
+
audioBufferHostObject)](jsi::Runtime &runtime) {
|
|
51
|
+
auto jsiObject = jsi::Object::createFromHostObject(
|
|
52
|
+
runtime, audioBufferHostObject);
|
|
53
|
+
jsiObject.setExternalMemoryPressure(
|
|
54
|
+
runtime, audioBufferHostObject->getSizeInBytes());
|
|
55
|
+
return jsiObject;
|
|
56
|
+
});
|
|
57
|
+
}).detach();
|
|
53
58
|
});
|
|
59
|
+
return promise;
|
|
54
60
|
}
|
|
55
61
|
|
|
56
62
|
JSI_HOST_FUNCTION_IMPL(AudioDecoderHostObject, decodeWithFilePath) {
|
|
57
63
|
auto sourcePath = args[0].getString(runtime).utf8(runtime);
|
|
58
64
|
auto sampleRate = args[1].getNumber();
|
|
59
65
|
|
|
60
|
-
|
|
61
|
-
[sourcePath, sampleRate](
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
66
|
+
auto promise = promiseVendor_->createPromise(
|
|
67
|
+
[sourcePath, sampleRate](std::shared_ptr<Promise> promise) {
|
|
68
|
+
std::thread([sourcePath, sampleRate, promise = std::move(promise)]() {
|
|
69
|
+
auto result =
|
|
70
|
+
AudioDecoder::decodeWithFilePath(sourcePath, sampleRate);
|
|
71
|
+
|
|
72
|
+
if (!result) {
|
|
73
|
+
promise->reject("Failed to decode audio data source.");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
auto audioBufferHostObject =
|
|
78
|
+
std::make_shared<AudioBufferHostObject>(result);
|
|
79
|
+
|
|
80
|
+
promise->resolve([audioBufferHostObject = std::move(
|
|
81
|
+
audioBufferHostObject)](jsi::Runtime &runtime) {
|
|
82
|
+
auto jsiObject = jsi::Object::createFromHostObject(
|
|
83
|
+
runtime, audioBufferHostObject);
|
|
84
|
+
jsiObject.setExternalMemoryPressure(
|
|
85
|
+
runtime, audioBufferHostObject->getSizeInBytes());
|
|
86
|
+
return jsiObject;
|
|
87
|
+
});
|
|
88
|
+
}).detach();
|
|
77
89
|
});
|
|
90
|
+
|
|
91
|
+
return promise;
|
|
78
92
|
}
|
|
79
93
|
|
|
80
94
|
JSI_HOST_FUNCTION_IMPL(AudioDecoderHostObject, decodeWithPCMInBase64) {
|
|
@@ -83,25 +97,37 @@ JSI_HOST_FUNCTION_IMPL(AudioDecoderHostObject, decodeWithPCMInBase64) {
|
|
|
83
97
|
auto inputChannelCount = args[2].getNumber();
|
|
84
98
|
auto interleaved = args[3].getBool();
|
|
85
99
|
|
|
86
|
-
|
|
100
|
+
auto promise = promiseVendor_->createPromise(
|
|
87
101
|
[b64, inputSampleRate, inputChannelCount, interleaved](
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
std::shared_ptr<Promise> promise) {
|
|
103
|
+
std::thread([b64,
|
|
104
|
+
inputSampleRate,
|
|
105
|
+
inputChannelCount,
|
|
106
|
+
interleaved,
|
|
107
|
+
promise = std::move(promise)]() {
|
|
108
|
+
auto result = AudioDecoder::decodeWithPCMInBase64(
|
|
109
|
+
b64, inputSampleRate, inputChannelCount, interleaved);
|
|
110
|
+
|
|
111
|
+
if (!result) {
|
|
112
|
+
promise->reject("Failed to decode audio data source.");
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
auto audioBufferHostObject =
|
|
117
|
+
std::make_shared<AudioBufferHostObject>(result);
|
|
118
|
+
|
|
119
|
+
promise->resolve([audioBufferHostObject = std::move(
|
|
120
|
+
audioBufferHostObject)](jsi::Runtime &runtime) {
|
|
121
|
+
auto jsiObject = jsi::Object::createFromHostObject(
|
|
122
|
+
runtime, audioBufferHostObject);
|
|
123
|
+
jsiObject.setExternalMemoryPressure(
|
|
124
|
+
runtime, audioBufferHostObject->getSizeInBytes());
|
|
125
|
+
return jsiObject;
|
|
126
|
+
});
|
|
127
|
+
}).detach();
|
|
104
128
|
});
|
|
129
|
+
|
|
130
|
+
return promise;
|
|
105
131
|
}
|
|
106
132
|
|
|
107
133
|
} // namespace audioapi
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
|
|
4
|
+
#include <audioapi/HostObjects/utils/AudioStretcherHostObject.h>
|
|
5
|
+
#include <audioapi/core/utils/AudioStretcher.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
|
+
|
|
16
|
+
AudioStretcherHostObject::AudioStretcherHostObject(
|
|
17
|
+
jsi::Runtime *runtime,
|
|
18
|
+
const std::shared_ptr<react::CallInvoker> &callInvoker) {
|
|
19
|
+
promiseVendor_ = std::make_shared<PromiseVendor>(runtime, callInvoker);
|
|
20
|
+
addFunctions(
|
|
21
|
+
JSI_EXPORT_FUNCTION(AudioStretcherHostObject, changePlaybackSpeed));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
JSI_HOST_FUNCTION_IMPL(AudioStretcherHostObject, changePlaybackSpeed) {
|
|
25
|
+
auto audioBuffer =
|
|
26
|
+
args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
|
|
27
|
+
auto playbackSpeed = static_cast<float>(args[1].asNumber());
|
|
28
|
+
|
|
29
|
+
auto promise = promiseVendor_->createPromise(
|
|
30
|
+
[audioBuffer, playbackSpeed](std::shared_ptr<Promise> promise) {
|
|
31
|
+
std::thread([audioBuffer,
|
|
32
|
+
playbackSpeed,
|
|
33
|
+
promise = std::move(promise)]() {
|
|
34
|
+
auto result = AudioStretcher::changePlaybackSpeed(
|
|
35
|
+
*audioBuffer->audioBuffer_, playbackSpeed);
|
|
36
|
+
|
|
37
|
+
if (!result) {
|
|
38
|
+
promise->reject("Failed to change audio playback speed.");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
auto audioBufferHostObject =
|
|
43
|
+
std::make_shared<AudioBufferHostObject>(result);
|
|
44
|
+
|
|
45
|
+
promise->resolve([audioBufferHostObject = std::move(
|
|
46
|
+
audioBufferHostObject)](jsi::Runtime &runtime) {
|
|
47
|
+
auto jsiObject = jsi::Object::createFromHostObject(
|
|
48
|
+
runtime, audioBufferHostObject);
|
|
49
|
+
jsiObject.setExternalMemoryPressure(
|
|
50
|
+
runtime, audioBufferHostObject->getSizeInBytes());
|
|
51
|
+
return jsiObject;
|
|
52
|
+
});
|
|
53
|
+
}).detach();
|
|
54
|
+
});
|
|
55
|
+
return promise;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
|
|
4
|
+
#include <audioapi/core/utils/AudioStretcher.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 AudioStretcherHostObject : public JsiHostObject {
|
|
17
|
+
public:
|
|
18
|
+
explicit AudioStretcherHostObject(
|
|
19
|
+
jsi::Runtime *runtime,
|
|
20
|
+
const std::shared_ptr<react::CallInvoker> &callInvoker);
|
|
21
|
+
JSI_HOST_FUNCTION_DECL(changePlaybackSpeed);
|
|
22
|
+
|
|
23
|
+
private:
|
|
24
|
+
std::shared_ptr<PromiseVendor> promiseVendor_;
|
|
25
|
+
};
|
|
26
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#include <audioapi/core/sources/AudioBuffer.h>
|
|
2
|
+
#include <audioapi/core/utils/AudioStretcher.h>
|
|
3
|
+
#include <audioapi/core/utils/Constants.h>
|
|
4
|
+
#include <audioapi/libs/audio-stretch/stretch.h>
|
|
5
|
+
#include <audioapi/utils/AudioArray.h>
|
|
6
|
+
#include <audioapi/utils/AudioBus.h>
|
|
7
|
+
#include <cstdint>
|
|
8
|
+
|
|
9
|
+
namespace audioapi {
|
|
10
|
+
|
|
11
|
+
std::vector<int16_t> AudioStretcher::castToInt16Buffer(AudioBuffer &buffer) {
|
|
12
|
+
const size_t numChannels = buffer.getNumberOfChannels();
|
|
13
|
+
const size_t numFrames = buffer.getLength();
|
|
14
|
+
|
|
15
|
+
std::vector<int16_t> int16Buffer(numFrames * numChannels);
|
|
16
|
+
|
|
17
|
+
for (size_t ch = 0; ch < numChannels; ++ch) {
|
|
18
|
+
const float *channelData = buffer.getChannelData(ch);
|
|
19
|
+
for (size_t i = 0; i < numFrames; ++i) {
|
|
20
|
+
int16Buffer[i * numChannels + ch] = floatToInt16(channelData[i]);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return int16Buffer;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
std::shared_ptr<AudioBuffer> AudioStretcher::changePlaybackSpeed(
|
|
28
|
+
AudioBuffer buffer,
|
|
29
|
+
float playbackSpeed) {
|
|
30
|
+
const float sampleRate = buffer.getSampleRate();
|
|
31
|
+
const size_t outputChannels = buffer.getNumberOfChannels();
|
|
32
|
+
const size_t numFrames = buffer.getLength();
|
|
33
|
+
|
|
34
|
+
if (playbackSpeed == 1.0f) {
|
|
35
|
+
return std::make_shared<AudioBuffer>(buffer);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
std::vector<int16_t> int16Buffer = castToInt16Buffer(buffer);
|
|
39
|
+
|
|
40
|
+
auto stretcher = stretch_init(
|
|
41
|
+
static_cast<int>(sampleRate / UPPER_FREQUENCY_LIMIT_DETECTION),
|
|
42
|
+
static_cast<int>(sampleRate / LOWER_FREQUENCY_LIMIT_DETECTION),
|
|
43
|
+
outputChannels,
|
|
44
|
+
0x1);
|
|
45
|
+
|
|
46
|
+
int maxOutputFrames = stretch_output_capacity(
|
|
47
|
+
stretcher, static_cast<int>(numFrames), 1 / playbackSpeed);
|
|
48
|
+
std::vector<int16_t> stretchedBuffer(maxOutputFrames * outputChannels);
|
|
49
|
+
|
|
50
|
+
int outputFrames = stretch_samples(
|
|
51
|
+
stretcher,
|
|
52
|
+
int16Buffer.data(),
|
|
53
|
+
static_cast<int>(numFrames),
|
|
54
|
+
stretchedBuffer.data(),
|
|
55
|
+
1 / playbackSpeed);
|
|
56
|
+
|
|
57
|
+
outputFrames +=
|
|
58
|
+
stretch_flush(stretcher, stretchedBuffer.data() + (outputFrames));
|
|
59
|
+
stretchedBuffer.resize(outputFrames * outputChannels);
|
|
60
|
+
stretch_deinit(stretcher);
|
|
61
|
+
|
|
62
|
+
auto audioBus =
|
|
63
|
+
std::make_shared<AudioBus>(outputFrames, outputChannels, sampleRate);
|
|
64
|
+
|
|
65
|
+
for (int ch = 0; ch < outputChannels; ++ch) {
|
|
66
|
+
auto channelData = audioBus->getChannel(ch)->getData();
|
|
67
|
+
for (int i = 0; i < outputFrames; ++i) {
|
|
68
|
+
channelData[i] = int16ToFloat(stretchedBuffer[i * outputChannels + ch]);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return std::make_shared<AudioBuffer>(audioBus);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <memory>
|
|
4
|
+
#include <vector>
|
|
5
|
+
|
|
6
|
+
namespace audioapi {
|
|
7
|
+
|
|
8
|
+
class AudioBus;
|
|
9
|
+
class AudioBuffer;
|
|
10
|
+
|
|
11
|
+
class AudioStretcher {
|
|
12
|
+
public:
|
|
13
|
+
AudioStretcher() = delete;
|
|
14
|
+
|
|
15
|
+
[[nodiscard]] static std::shared_ptr<AudioBuffer> changePlaybackSpeed(
|
|
16
|
+
AudioBuffer buffer,
|
|
17
|
+
float playbackSpeed);
|
|
18
|
+
|
|
19
|
+
private:
|
|
20
|
+
static std::vector<int16_t> castToInt16Buffer(AudioBuffer &buffer);
|
|
21
|
+
|
|
22
|
+
[[nodiscard]] static inline int16_t floatToInt16(float sample) {
|
|
23
|
+
return static_cast<int16_t>(sample * INT16_MAX);
|
|
24
|
+
}
|
|
25
|
+
[[nodiscard]] static inline float int16ToFloat(int16_t sample) {
|
|
26
|
+
return static_cast<float>(sample) / INT16_MAX;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
} // namespace audioapi
|
|
@@ -10,6 +10,10 @@ namespace audioapi {
|
|
|
10
10
|
static constexpr int RENDER_QUANTUM_SIZE = 128;
|
|
11
11
|
static constexpr size_t MAX_FFT_SIZE = 32768;
|
|
12
12
|
|
|
13
|
+
// stretcher
|
|
14
|
+
static constexpr float UPPER_FREQUENCY_LIMIT_DETECTION = 333.0f;
|
|
15
|
+
static constexpr float LOWER_FREQUENCY_LIMIT_DETECTION = 55.0f;
|
|
16
|
+
|
|
13
17
|
// general
|
|
14
18
|
static constexpr float MOST_POSITIVE_SINGLE_FLOAT = static_cast<float>(std::numeric_limits<float>::max());
|
|
15
19
|
static constexpr float MOST_NEGATIVE_SINGLE_FLOAT = static_cast<float>(std::numeric_limits<float>::lowest());
|
package/lib/commonjs/api.js
CHANGED
|
@@ -219,6 +219,12 @@ Object.defineProperty(exports, "WorkletSourceNode", {
|
|
|
219
219
|
return _WorkletSourceNode.default;
|
|
220
220
|
}
|
|
221
221
|
});
|
|
222
|
+
Object.defineProperty(exports, "changePlaybackSpeed", {
|
|
223
|
+
enumerable: true,
|
|
224
|
+
get: function () {
|
|
225
|
+
return _AudioStretcher.default;
|
|
226
|
+
}
|
|
227
|
+
});
|
|
222
228
|
Object.defineProperty(exports, "decodeAudioData", {
|
|
223
229
|
enumerable: true,
|
|
224
230
|
get: function () {
|
|
@@ -263,6 +269,7 @@ var _ConstantSourceNode = _interopRequireDefault(require("./core/ConstantSourceN
|
|
|
263
269
|
var _system = _interopRequireDefault(require("./system"));
|
|
264
270
|
var _useSystemVolume = _interopRequireDefault(require("./hooks/useSystemVolume"));
|
|
265
271
|
var _AudioDecoder = require("./core/AudioDecoder");
|
|
272
|
+
var _AudioStretcher = _interopRequireDefault(require("./core/AudioStretcher"));
|
|
266
273
|
var _types = require("./types");
|
|
267
274
|
var _errors = require("./errors");
|
|
268
275
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -270,7 +277,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
270
277
|
|
|
271
278
|
/* eslint-disable no-var */
|
|
272
279
|
|
|
273
|
-
if (global.createAudioContext == null || global.createOfflineAudioContext == null || global.createAudioRecorder == null || global.createAudioDecoder == null || global.AudioEventEmitter == null) {
|
|
280
|
+
if (global.createAudioContext == null || global.createOfflineAudioContext == null || global.createAudioRecorder == null || global.createAudioDecoder == null || global.createAudioStretcher == null || global.AudioEventEmitter == null) {
|
|
274
281
|
if (!_specs.NativeAudioAPIModule) {
|
|
275
282
|
throw new Error(`Failed to install react-native-audio-api: The native module could not be found.`);
|
|
276
283
|
}
|
package/lib/commonjs/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_specs","require","_WorkletNode","_interopRequireDefault","_WorkletSourceNode","_WorkletProcessingNode","_RecorderAdapterNode","_AudioBuffer","_AudioBufferSourceNode","_AudioBufferQueueSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_GainNode","_OscillatorNode","_StereoPannerNode","_AudioRecorder","_StreamerNode","_ConstantSourceNode","_system","_useSystemVolume","_AudioDecoder","_types","_errors","e","__esModule","default","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","createAudioDecoder","AudioEventEmitter","NativeAudioAPIModule","Error","install"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_specs","require","_WorkletNode","_interopRequireDefault","_WorkletSourceNode","_WorkletProcessingNode","_RecorderAdapterNode","_AudioBuffer","_AudioBufferSourceNode","_AudioBufferQueueSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_GainNode","_OscillatorNode","_StereoPannerNode","_AudioRecorder","_StreamerNode","_ConstantSourceNode","_system","_useSystemVolume","_AudioDecoder","_AudioStretcher","_types","_errors","e","__esModule","default","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","createAudioDecoder","createAudioStretcher","AudioEventEmitter","NativeAudioAPIModule","Error","install"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAsDA,IAAAC,YAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,kBAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,sBAAA,GAAAF,sBAAA,CAAAF,OAAA;AACA,IAAAK,oBAAA,GAAAH,sBAAA,CAAAF,OAAA;AACA,IAAAM,YAAA,GAAAJ,sBAAA,CAAAF,OAAA;AACA,IAAAO,sBAAA,GAAAL,sBAAA,CAAAF,OAAA;AACA,IAAAQ,2BAAA,GAAAN,sBAAA,CAAAF,OAAA;AACA,IAAAS,aAAA,GAAAP,sBAAA,CAAAF,OAAA;AACA,IAAAU,oBAAA,GAAAR,sBAAA,CAAAF,OAAA;AACA,IAAAW,qBAAA,GAAAT,sBAAA,CAAAF,OAAA;AACA,IAAAY,UAAA,GAAAV,sBAAA,CAAAF,OAAA;AACA,IAAAa,aAAA,GAAAX,sBAAA,CAAAF,OAAA;AACA,IAAAc,WAAA,GAAAZ,sBAAA,CAAAF,OAAA;AACA,IAAAe,yBAAA,GAAAb,sBAAA,CAAAF,OAAA;AACA,IAAAgB,iBAAA,GAAAd,sBAAA,CAAAF,OAAA;AACA,IAAAiB,iBAAA,GAAAf,sBAAA,CAAAF,OAAA;AACA,IAAAkB,SAAA,GAAAhB,sBAAA,CAAAF,OAAA;AACA,IAAAmB,eAAA,GAAAjB,sBAAA,CAAAF,OAAA;AACA,IAAAoB,iBAAA,GAAAlB,sBAAA,CAAAF,OAAA;AACA,IAAAqB,cAAA,GAAAnB,sBAAA,CAAAF,OAAA;AACA,IAAAsB,aAAA,GAAApB,sBAAA,CAAAF,OAAA;AACA,IAAAuB,mBAAA,GAAArB,sBAAA,CAAAF,OAAA;AACA,IAAAwB,OAAA,GAAAtB,sBAAA,CAAAF,OAAA;AACA,IAAAyB,gBAAA,GAAAvB,sBAAA,CAAAF,OAAA;AACA,IAAA0B,aAAA,GAAA1B,OAAA;AACA,IAAA2B,eAAA,GAAAzB,sBAAA,CAAAF,OAAA;AAEA,IAAA4B,MAAA,GAAA5B,OAAA;AAWA,IAAA6B,OAAA,GAAA7B,OAAA;AAMkB,SAAAE,uBAAA4B,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAvFlB;;AAwBA;;AAEA,IACEG,MAAM,CAACC,kBAAkB,IAAI,IAAI,IACjCD,MAAM,CAACE,yBAAyB,IAAI,IAAI,IACxCF,MAAM,CAACG,mBAAmB,IAAI,IAAI,IAClCH,MAAM,CAACI,kBAAkB,IAAI,IAAI,IACjCJ,MAAM,CAACK,oBAAoB,IAAI,IAAI,IACnCL,MAAM,CAACM,iBAAiB,IAAI,IAAI,EAChC;EACA,IAAI,CAACC,2BAAoB,EAAE;IACzB,MAAM,IAAIC,KAAK,CACb,iFACF,CAAC;EACH;EAEAD,2BAAoB,CAACE,OAAO,CAAC,CAAC;AAChC","ignoreList":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = changePlaybackSpeed;
|
|
7
|
+
var _AudioBuffer = _interopRequireDefault(require("./AudioBuffer"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
class AudioStretcher {
|
|
10
|
+
static instance = null;
|
|
11
|
+
constructor() {
|
|
12
|
+
this.stretcher = global.createAudioStretcher();
|
|
13
|
+
}
|
|
14
|
+
static getInstance() {
|
|
15
|
+
if (!AudioStretcher.instance) {
|
|
16
|
+
AudioStretcher.instance = new AudioStretcher();
|
|
17
|
+
}
|
|
18
|
+
return AudioStretcher.instance;
|
|
19
|
+
}
|
|
20
|
+
async changePlaybackSpeedInstance(input, playbackSpeed) {
|
|
21
|
+
const buffer = await this.stretcher.changePlaybackSpeed(input.buffer, playbackSpeed);
|
|
22
|
+
if (!buffer) {
|
|
23
|
+
throw new Error('Failed to change playback speed');
|
|
24
|
+
}
|
|
25
|
+
return new _AudioBuffer.default(buffer);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function changePlaybackSpeed(input, playbackSpeed) {
|
|
29
|
+
return AudioStretcher.getInstance().changePlaybackSpeedInstance(input, playbackSpeed);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=AudioStretcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_AudioBuffer","_interopRequireDefault","require","e","__esModule","default","AudioStretcher","instance","constructor","stretcher","global","createAudioStretcher","getInstance","changePlaybackSpeedInstance","input","playbackSpeed","buffer","changePlaybackSpeed","Error","AudioBuffer"],"sourceRoot":"../../../src","sources":["core/AudioStretcher.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,cAAc,CAAC;EACnB,OAAeC,QAAQ,GAA0B,IAAI;EAG7CC,WAAWA,CAAA,EAAG;IACpB,IAAI,CAACC,SAAS,GAAGC,MAAM,CAACC,oBAAoB,CAAC,CAAC;EAChD;EAEA,OAAcC,WAAWA,CAAA,EAAmB;IAC1C,IAAI,CAACN,cAAc,CAACC,QAAQ,EAAE;MAC5BD,cAAc,CAACC,QAAQ,GAAG,IAAID,cAAc,CAAC,CAAC;IAChD;IACA,OAAOA,cAAc,CAACC,QAAQ;EAChC;EAEA,MAAaM,2BAA2BA,CACtCC,KAAkB,EAClBC,aAAqB,EACC;IACtB,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACP,SAAS,CAACQ,mBAAmB,CACrDH,KAAK,CAACE,MAAM,EACZD,aACF,CAAC;IAED,IAAI,CAACC,MAAM,EAAE;MACX,MAAM,IAAIE,KAAK,CAAC,iCAAiC,CAAC;IACpD;IACA,OAAO,IAAIC,oBAAW,CAACH,MAAM,CAAC;EAChC;AACF;AAEe,eAAeC,mBAAmBA,CAC/CH,KAAkB,EAClBC,aAAqB,EACC;EACtB,OAAOT,cAAc,CAACM,WAAW,CAAC,CAAC,CAACC,2BAA2B,CAC7DC,KAAK,EACLC,aACF,CAAC;AACH","ignoreList":[]}
|
package/lib/module/api.js
CHANGED
|
@@ -6,7 +6,7 @@ import { NativeAudioAPIModule } from "./specs/index.js";
|
|
|
6
6
|
|
|
7
7
|
/* eslint-disable no-var */
|
|
8
8
|
|
|
9
|
-
if (global.createAudioContext == null || global.createOfflineAudioContext == null || global.createAudioRecorder == null || global.createAudioDecoder == null || global.AudioEventEmitter == null) {
|
|
9
|
+
if (global.createAudioContext == null || global.createOfflineAudioContext == null || global.createAudioRecorder == null || global.createAudioDecoder == null || global.createAudioStretcher == null || global.AudioEventEmitter == null) {
|
|
10
10
|
if (!NativeAudioAPIModule) {
|
|
11
11
|
throw new Error(`Failed to install react-native-audio-api: The native module could not be found.`);
|
|
12
12
|
}
|
|
@@ -37,6 +37,7 @@ export { default as ConstantSourceNode } from "./core/ConstantSourceNode.js";
|
|
|
37
37
|
export { default as AudioManager } from "./system/index.js";
|
|
38
38
|
export { default as useSystemVolume } from "./hooks/useSystemVolume.js";
|
|
39
39
|
export { decodeAudioData, decodePCMInBase64 } from "./core/AudioDecoder.js";
|
|
40
|
+
export { default as changePlaybackSpeed } from "./core/AudioStretcher.js";
|
|
40
41
|
export { OscillatorType, BiquadFilterType, ChannelCountMode, ChannelInterpretation, ContextState, WindowType, PeriodicWaveConstraints, AudioWorkletRuntime } from "./types.js";
|
|
41
42
|
export { IndexSizeError, InvalidAccessError, InvalidStateError, RangeError, NotSupportedError } from "./errors/index.js";
|
|
42
43
|
//# sourceMappingURL=api.js.map
|
package/lib/module/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeAudioAPIModule","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","createAudioDecoder","AudioEventEmitter","Error","install","default","WorkletNode","WorkletSourceNode","WorkletProcessingNode","RecorderAdapterNode","AudioBuffer","AudioBufferSourceNode","AudioBufferQueueSourceNode","AudioContext","OfflineAudioContext","AudioDestinationNode","AudioNode","AnalyserNode","AudioParam","AudioScheduledSourceNode","BaseAudioContext","BiquadFilterNode","GainNode","OscillatorNode","StereoPannerNode","AudioRecorder","StreamerNode","ConstantSourceNode","AudioManager","useSystemVolume","decodeAudioData","decodePCMInBase64","OscillatorType","BiquadFilterType","ChannelCountMode","ChannelInterpretation","ContextState","WindowType","PeriodicWaveConstraints","AudioWorkletRuntime","IndexSizeError","InvalidAccessError","InvalidStateError","RangeError","NotSupportedError"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;AAAA,SAASA,oBAAoB,QAAQ,kBAAS;;
|
|
1
|
+
{"version":3,"names":["NativeAudioAPIModule","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","createAudioDecoder","createAudioStretcher","AudioEventEmitter","Error","install","default","WorkletNode","WorkletSourceNode","WorkletProcessingNode","RecorderAdapterNode","AudioBuffer","AudioBufferSourceNode","AudioBufferQueueSourceNode","AudioContext","OfflineAudioContext","AudioDestinationNode","AudioNode","AnalyserNode","AudioParam","AudioScheduledSourceNode","BaseAudioContext","BiquadFilterNode","GainNode","OscillatorNode","StereoPannerNode","AudioRecorder","StreamerNode","ConstantSourceNode","AudioManager","useSystemVolume","decodeAudioData","decodePCMInBase64","changePlaybackSpeed","OscillatorType","BiquadFilterType","ChannelCountMode","ChannelInterpretation","ContextState","WindowType","PeriodicWaveConstraints","AudioWorkletRuntime","IndexSizeError","InvalidAccessError","InvalidStateError","RangeError","NotSupportedError"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;AAAA,SAASA,oBAAoB,QAAQ,kBAAS;;AAW9C;;AAwBA;;AAEA,IACEC,MAAM,CAACC,kBAAkB,IAAI,IAAI,IACjCD,MAAM,CAACE,yBAAyB,IAAI,IAAI,IACxCF,MAAM,CAACG,mBAAmB,IAAI,IAAI,IAClCH,MAAM,CAACI,kBAAkB,IAAI,IAAI,IACjCJ,MAAM,CAACK,oBAAoB,IAAI,IAAI,IACnCL,MAAM,CAACM,iBAAiB,IAAI,IAAI,EAChC;EACA,IAAI,CAACP,oBAAoB,EAAE;IACzB,MAAM,IAAIQ,KAAK,CACb,iFACF,CAAC;EACH;EAEAR,oBAAoB,CAACS,OAAO,CAAC,CAAC;AAChC;AAEA,SAASC,OAAO,IAAIC,WAAW,QAAQ,uBAAoB;AAC3D,SAASD,OAAO,IAAIE,iBAAiB,QAAQ,6BAA0B;AACvE,SAASF,OAAO,IAAIG,qBAAqB,QAAQ,iCAA8B;AAC/E,SAASH,OAAO,IAAII,mBAAmB,QAAQ,+BAA4B;AAC3E,SAASJ,OAAO,IAAIK,WAAW,QAAQ,uBAAoB;AAC3D,SAASL,OAAO,IAAIM,qBAAqB,QAAQ,iCAA8B;AAC/E,SAASN,OAAO,IAAIO,0BAA0B,QAAQ,sCAAmC;AACzF,SAASP,OAAO,IAAIQ,YAAY,QAAQ,wBAAqB;AAC7D,SAASR,OAAO,IAAIS,mBAAmB,QAAQ,+BAA4B;AAC3E,SAAST,OAAO,IAAIU,oBAAoB,QAAQ,gCAA6B;AAC7E,SAASV,OAAO,IAAIW,SAAS,QAAQ,qBAAkB;AACvD,SAASX,OAAO,IAAIY,YAAY,QAAQ,wBAAqB;AAC7D,SAASZ,OAAO,IAAIa,UAAU,QAAQ,sBAAmB;AACzD,SAASb,OAAO,IAAIc,wBAAwB,QAAQ,oCAAiC;AACrF,SAASd,OAAO,IAAIe,gBAAgB,QAAQ,4BAAyB;AACrE,SAASf,OAAO,IAAIgB,gBAAgB,QAAQ,4BAAyB;AACrE,SAAShB,OAAO,IAAIiB,QAAQ,QAAQ,oBAAiB;AACrD,SAASjB,OAAO,IAAIkB,cAAc,QAAQ,0BAAuB;AACjE,SAASlB,OAAO,IAAImB,gBAAgB,QAAQ,4BAAyB;AACrE,SAASnB,OAAO,IAAIoB,aAAa,QAAQ,yBAAsB;AAC/D,SAASpB,OAAO,IAAIqB,YAAY,QAAQ,wBAAqB;AAC7D,SAASrB,OAAO,IAAIsB,kBAAkB,QAAQ,8BAA2B;AACzE,SAAStB,OAAO,IAAIuB,YAAY,QAAQ,mBAAU;AAClD,SAASvB,OAAO,IAAIwB,eAAe,QAAQ,4BAAyB;AACpE,SAASC,eAAe,EAAEC,iBAAiB,QAAQ,wBAAqB;AACxE,SAAS1B,OAAO,IAAI2B,mBAAmB,QAAQ,0BAAuB;AAEtE,SACEC,cAAc,EACdC,gBAAgB,EAChBC,gBAAgB,EAChBC,qBAAqB,EACrBC,YAAY,EACZC,UAAU,EACVC,uBAAuB,EACvBC,mBAAmB,QACd,YAAS;AAEhB,SACEC,cAAc,EACdC,kBAAkB,EAClBC,iBAAiB,EACjBC,UAAU,EACVC,iBAAiB,QACZ,mBAAU","ignoreList":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import AudioBuffer from "./AudioBuffer.js";
|
|
4
|
+
class AudioStretcher {
|
|
5
|
+
static instance = null;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.stretcher = global.createAudioStretcher();
|
|
8
|
+
}
|
|
9
|
+
static getInstance() {
|
|
10
|
+
if (!AudioStretcher.instance) {
|
|
11
|
+
AudioStretcher.instance = new AudioStretcher();
|
|
12
|
+
}
|
|
13
|
+
return AudioStretcher.instance;
|
|
14
|
+
}
|
|
15
|
+
async changePlaybackSpeedInstance(input, playbackSpeed) {
|
|
16
|
+
const buffer = await this.stretcher.changePlaybackSpeed(input.buffer, playbackSpeed);
|
|
17
|
+
if (!buffer) {
|
|
18
|
+
throw new Error('Failed to change playback speed');
|
|
19
|
+
}
|
|
20
|
+
return new AudioBuffer(buffer);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export default async function changePlaybackSpeed(input, playbackSpeed) {
|
|
24
|
+
return AudioStretcher.getInstance().changePlaybackSpeedInstance(input, playbackSpeed);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=AudioStretcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AudioBuffer","AudioStretcher","instance","constructor","stretcher","global","createAudioStretcher","getInstance","changePlaybackSpeedInstance","input","playbackSpeed","buffer","changePlaybackSpeed","Error"],"sourceRoot":"../../../src","sources":["core/AudioStretcher.ts"],"mappings":";;AACA,OAAOA,WAAW,MAAM,kBAAe;AAEvC,MAAMC,cAAc,CAAC;EACnB,OAAeC,QAAQ,GAA0B,IAAI;EAG7CC,WAAWA,CAAA,EAAG;IACpB,IAAI,CAACC,SAAS,GAAGC,MAAM,CAACC,oBAAoB,CAAC,CAAC;EAChD;EAEA,OAAcC,WAAWA,CAAA,EAAmB;IAC1C,IAAI,CAACN,cAAc,CAACC,QAAQ,EAAE;MAC5BD,cAAc,CAACC,QAAQ,GAAG,IAAID,cAAc,CAAC,CAAC;IAChD;IACA,OAAOA,cAAc,CAACC,QAAQ;EAChC;EAEA,MAAaM,2BAA2BA,CACtCC,KAAkB,EAClBC,aAAqB,EACC;IACtB,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACP,SAAS,CAACQ,mBAAmB,CACrDH,KAAK,CAACE,MAAM,EACZD,aACF,CAAC;IAED,IAAI,CAACC,MAAM,EAAE;MACX,MAAM,IAAIE,KAAK,CAAC,iCAAiC,CAAC;IACpD;IACA,OAAO,IAAIb,WAAW,CAACW,MAAM,CAAC;EAChC;AACF;AAEA,eAAe,eAAeC,mBAAmBA,CAC/CH,KAAkB,EAClBC,aAAqB,EACC;EACtB,OAAOT,cAAc,CAACM,WAAW,CAAC,CAAC,CAACC,2BAA2B,CAC7DC,KAAK,EACLC,aACF,CAAC;AACH","ignoreList":[]}
|
package/lib/typescript/api.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { AudioRecorderOptions } from './types';
|
|
2
|
-
import type { IAudioContext, IAudioDecoder, IAudioRecorder, IOfflineAudioContext, IAudioEventEmitter } from './interfaces';
|
|
2
|
+
import type { IAudioContext, IAudioDecoder, IAudioRecorder, IAudioStretcher, IOfflineAudioContext, IAudioEventEmitter } from './interfaces';
|
|
3
3
|
declare global {
|
|
4
4
|
var createAudioContext: (sampleRate: number, initSuspended: boolean, audioWorkletRuntime: any) => IAudioContext;
|
|
5
5
|
var createOfflineAudioContext: (numberOfChannels: number, length: number, sampleRate: number, audioWorkletRuntime: any) => IOfflineAudioContext;
|
|
6
6
|
var createAudioRecorder: (options: AudioRecorderOptions) => IAudioRecorder;
|
|
7
7
|
var createAudioDecoder: () => IAudioDecoder;
|
|
8
|
+
var createAudioStretcher: () => IAudioStretcher;
|
|
8
9
|
var AudioEventEmitter: IAudioEventEmitter;
|
|
9
10
|
}
|
|
10
11
|
export { default as WorkletNode } from './core/WorkletNode';
|
|
@@ -32,6 +33,7 @@ export { default as ConstantSourceNode } from './core/ConstantSourceNode';
|
|
|
32
33
|
export { default as AudioManager } from './system';
|
|
33
34
|
export { default as useSystemVolume } from './hooks/useSystemVolume';
|
|
34
35
|
export { decodeAudioData, decodePCMInBase64 } from './core/AudioDecoder';
|
|
36
|
+
export { default as changePlaybackSpeed } from './core/AudioStretcher';
|
|
35
37
|
export { OscillatorType, BiquadFilterType, ChannelCountMode, ChannelInterpretation, ContextState, WindowType, PeriodicWaveConstraints, AudioWorkletRuntime, } from './types';
|
|
36
38
|
export { IndexSizeError, InvalidAccessError, InvalidStateError, RangeError, NotSupportedError, } from './errors';
|
|
37
39
|
//# sourceMappingURL=api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAGtB,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,kBAAkB,EAAE,CACtB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,OAAO,EAEtB,mBAAmB,EAAE,GAAG,KACrB,aAAa,CAAC;IACnB,IAAI,yBAAyB,EAAE,CAC7B,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAElB,mBAAmB,EAAE,GAAG,KACrB,oBAAoB,CAAC;IAE1B,IAAI,mBAAmB,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,cAAc,CAAC;IAE3E,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAC;IAE5C,IAAI,iBAAiB,EAAE,kBAAkB,CAAC;CAC3C;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioStretcher.d.ts","sourceRoot":"","sources":["../../../src/core/AudioStretcher.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,eAAe,CAAC;AAiCxC,wBAA8B,mBAAmB,CAC/C,KAAK,EAAE,WAAW,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC,CAKtB"}
|
|
@@ -10,6 +10,7 @@ export interface IBaseAudioContext {
|
|
|
10
10
|
readonly sampleRate: number;
|
|
11
11
|
readonly currentTime: number;
|
|
12
12
|
readonly decoder: IAudioDecoder;
|
|
13
|
+
readonly stretcher: IAudioStretcher;
|
|
13
14
|
createRecorderAdapter(): IRecorderAdapterNode;
|
|
14
15
|
createWorkletSourceNode(shareableWorklet: ShareableWorkletCallback, shouldUseUiRuntime: boolean): IWorkletSourceNode;
|
|
15
16
|
createWorkletNode(shareableWorklet: ShareableWorkletCallback, shouldUseUiRuntime: boolean, bufferLength: number, inputChannelCount: number): IWorkletNode;
|
|
@@ -157,6 +158,9 @@ export interface IAudioDecoder {
|
|
|
157
158
|
decodeWithFilePath: (sourcePath: string, sampleRate?: number) => Promise<IAudioBuffer>;
|
|
158
159
|
decodeWithPCMInBase64: (b64: string, inputSampleRate: number, inputChannelCount: number, interleaved?: boolean) => Promise<IAudioBuffer>;
|
|
159
160
|
}
|
|
161
|
+
export interface IAudioStretcher {
|
|
162
|
+
changePlaybackSpeed: (arrayBuffer: AudioBuffer, playbackSpeed: number) => Promise<IAudioBuffer>;
|
|
163
|
+
}
|
|
160
164
|
export interface IAudioEventEmitter {
|
|
161
165
|
addAudioEventListener<Name extends AudioEventName>(name: Name, callback: AudioEventCallback<Name>): string;
|
|
162
166
|
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;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,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-nightly-
|
|
3
|
+
"version": "0.9.0-nightly-7ecb495-20251008",
|
|
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
|
@@ -4,6 +4,7 @@ import type {
|
|
|
4
4
|
IAudioContext,
|
|
5
5
|
IAudioDecoder,
|
|
6
6
|
IAudioRecorder,
|
|
7
|
+
IAudioStretcher,
|
|
7
8
|
IOfflineAudioContext,
|
|
8
9
|
IAudioEventEmitter,
|
|
9
10
|
} from './interfaces';
|
|
@@ -28,6 +29,8 @@ declare global {
|
|
|
28
29
|
|
|
29
30
|
var createAudioDecoder: () => IAudioDecoder;
|
|
30
31
|
|
|
32
|
+
var createAudioStretcher: () => IAudioStretcher;
|
|
33
|
+
|
|
31
34
|
var AudioEventEmitter: IAudioEventEmitter;
|
|
32
35
|
}
|
|
33
36
|
/* eslint-disable no-var */
|
|
@@ -37,6 +40,7 @@ if (
|
|
|
37
40
|
global.createOfflineAudioContext == null ||
|
|
38
41
|
global.createAudioRecorder == null ||
|
|
39
42
|
global.createAudioDecoder == null ||
|
|
43
|
+
global.createAudioStretcher == null ||
|
|
40
44
|
global.AudioEventEmitter == null
|
|
41
45
|
) {
|
|
42
46
|
if (!NativeAudioAPIModule) {
|
|
@@ -73,6 +77,7 @@ export { default as ConstantSourceNode } from './core/ConstantSourceNode';
|
|
|
73
77
|
export { default as AudioManager } from './system';
|
|
74
78
|
export { default as useSystemVolume } from './hooks/useSystemVolume';
|
|
75
79
|
export { decodeAudioData, decodePCMInBase64 } from './core/AudioDecoder';
|
|
80
|
+
export { default as changePlaybackSpeed } from './core/AudioStretcher';
|
|
76
81
|
|
|
77
82
|
export {
|
|
78
83
|
OscillatorType,
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { IAudioStretcher } from '../interfaces';
|
|
2
|
+
import AudioBuffer from './AudioBuffer';
|
|
3
|
+
|
|
4
|
+
class AudioStretcher {
|
|
5
|
+
private static instance: AudioStretcher | null = null;
|
|
6
|
+
protected readonly stretcher: IAudioStretcher;
|
|
7
|
+
|
|
8
|
+
private constructor() {
|
|
9
|
+
this.stretcher = global.createAudioStretcher();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public static getInstance(): AudioStretcher {
|
|
13
|
+
if (!AudioStretcher.instance) {
|
|
14
|
+
AudioStretcher.instance = new AudioStretcher();
|
|
15
|
+
}
|
|
16
|
+
return AudioStretcher.instance;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public async changePlaybackSpeedInstance(
|
|
20
|
+
input: AudioBuffer,
|
|
21
|
+
playbackSpeed: number
|
|
22
|
+
): Promise<AudioBuffer> {
|
|
23
|
+
const buffer = await this.stretcher.changePlaybackSpeed(
|
|
24
|
+
input.buffer,
|
|
25
|
+
playbackSpeed
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
if (!buffer) {
|
|
29
|
+
throw new Error('Failed to change playback speed');
|
|
30
|
+
}
|
|
31
|
+
return new AudioBuffer(buffer);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default async function changePlaybackSpeed(
|
|
36
|
+
input: AudioBuffer,
|
|
37
|
+
playbackSpeed: number
|
|
38
|
+
): Promise<AudioBuffer> {
|
|
39
|
+
return AudioStretcher.getInstance().changePlaybackSpeedInstance(
|
|
40
|
+
input,
|
|
41
|
+
playbackSpeed
|
|
42
|
+
);
|
|
43
|
+
}
|
package/src/interfaces.ts
CHANGED
|
@@ -38,6 +38,7 @@ export interface IBaseAudioContext {
|
|
|
38
38
|
readonly sampleRate: number;
|
|
39
39
|
readonly currentTime: number;
|
|
40
40
|
readonly decoder: IAudioDecoder;
|
|
41
|
+
readonly stretcher: IAudioStretcher;
|
|
41
42
|
|
|
42
43
|
createRecorderAdapter(): IRecorderAdapterNode;
|
|
43
44
|
createWorkletSourceNode(
|
|
@@ -276,6 +277,13 @@ export interface IAudioDecoder {
|
|
|
276
277
|
) => Promise<IAudioBuffer>;
|
|
277
278
|
}
|
|
278
279
|
|
|
280
|
+
export interface IAudioStretcher {
|
|
281
|
+
changePlaybackSpeed: (
|
|
282
|
+
arrayBuffer: AudioBuffer,
|
|
283
|
+
playbackSpeed: number
|
|
284
|
+
) => Promise<IAudioBuffer>;
|
|
285
|
+
}
|
|
286
|
+
|
|
279
287
|
export interface IAudioEventEmitter {
|
|
280
288
|
addAudioEventListener<Name extends AudioEventName>(
|
|
281
289
|
name: Name,
|