react-native-audio-api 0.6.1 → 0.6.2-rc.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/AudioDecoder.cpp +23 -0
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +31 -3
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +11 -0
- package/common/cpp/audioapi/core/BaseAudioContext.h +1 -0
- package/common/cpp/audioapi/core/utils/AudioDecoder.h +1 -0
- package/common/cpp/audioapi/libs/base64/base64.h +320 -0
- package/ios/audioapi/ios/core/AudioDecoder.mm +23 -0
- package/lib/commonjs/core/BaseAudioContext.js +8 -2
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +8 -2
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +1 -0
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/BaseAudioContext.ts +10 -2
- package/src/interfaces.ts +1 -0
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
#include <audioapi/core/utils/AudioDecoder.h>
|
|
2
|
+
#include <audioapi/dsp/VectorMath.h>
|
|
3
|
+
#include <audioapi/libs/base64/base64.h>
|
|
2
4
|
#include <audioapi/utils/AudioArray.h>
|
|
3
5
|
#include <audioapi/utils/AudioBus.h>
|
|
4
6
|
|
|
@@ -110,4 +112,25 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithMemoryBlock(
|
|
|
110
112
|
return audioBus;
|
|
111
113
|
}
|
|
112
114
|
|
|
115
|
+
std::shared_ptr<AudioBus> AudioDecoder::decodeWithPCMInBase64(
|
|
116
|
+
const std::string &data) const {
|
|
117
|
+
auto decodedData = base64_decode(data, false);
|
|
118
|
+
|
|
119
|
+
const auto uint8Data = reinterpret_cast<uint8_t *>(decodedData.data());
|
|
120
|
+
size_t frameCount = decodedData.size() / 2;
|
|
121
|
+
|
|
122
|
+
auto audioBus = std::make_shared<AudioBus>(frameCount, 1, sampleRate_);
|
|
123
|
+
auto channelData = audioBus->getChannel(0)->getData();
|
|
124
|
+
|
|
125
|
+
for (size_t i = 0; i < frameCount; ++i) {
|
|
126
|
+
auto sample =
|
|
127
|
+
static_cast<int16_t>((uint8Data[i * 2 + 1] << 8) | uint8Data[i * 2]);
|
|
128
|
+
channelData[i] = static_cast<float>(sample);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
dsp::multiplyByScalar(channelData, 1.0f / 32768.0f, channelData, frameCount);
|
|
132
|
+
|
|
133
|
+
return audioBus;
|
|
134
|
+
}
|
|
135
|
+
|
|
113
136
|
} // namespace audioapi
|
|
@@ -49,7 +49,8 @@ class BaseAudioContextHostObject : public JsiHostObject {
|
|
|
49
49
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createPeriodicWave),
|
|
50
50
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createAnalyser),
|
|
51
51
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, decodeAudioData),
|
|
52
|
-
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, decodeAudioDataSource)
|
|
52
|
+
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, decodeAudioDataSource),
|
|
53
|
+
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, decodePCMAudioDataInBase64));
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
JSI_PROPERTY_GETTER(destination) {
|
|
@@ -163,13 +164,14 @@ JSI_HOST_FUNCTION(createBufferQueueSource) {
|
|
|
163
164
|
auto promise = promiseVendor_->createPromise([this, sourcePath](std::shared_ptr<Promise> promise) {
|
|
164
165
|
std::thread([this, sourcePath, promise = std::move(promise)]() {
|
|
165
166
|
auto results = context_->decodeAudioDataSource(sourcePath);
|
|
166
|
-
auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(results);
|
|
167
167
|
|
|
168
168
|
if (!results) {
|
|
169
169
|
promise->reject("Failed to decode audio data source.");
|
|
170
170
|
return;
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
+
auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(results);
|
|
174
|
+
|
|
173
175
|
promise->resolve([audioBufferHostObject = std::move(audioBufferHostObject)](jsi::Runtime &runtime) {
|
|
174
176
|
auto jsiObject = jsi::Object::createFromHostObject(runtime, audioBufferHostObject);
|
|
175
177
|
jsiObject.setExternalMemoryPressure(runtime, audioBufferHostObject->getSizeInBytes());
|
|
@@ -189,13 +191,14 @@ JSI_HOST_FUNCTION(createBufferQueueSource) {
|
|
|
189
191
|
auto promise = promiseVendor_->createPromise([this, data, size](std::shared_ptr<Promise> promise) {
|
|
190
192
|
std::thread([this, data, size, promise = std::move(promise)]() {
|
|
191
193
|
auto results = context_->decodeAudioData(data, size);
|
|
192
|
-
auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(results);
|
|
193
194
|
|
|
194
195
|
if (!results) {
|
|
195
196
|
promise->reject("Failed to decode audio data source.");
|
|
196
197
|
return;
|
|
197
198
|
}
|
|
198
199
|
|
|
200
|
+
auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(results);
|
|
201
|
+
|
|
199
202
|
promise->resolve([audioBufferHostObject = std::move(audioBufferHostObject)](jsi::Runtime &runtime) {
|
|
200
203
|
auto jsiObject = jsi::Object::createFromHostObject(runtime, audioBufferHostObject);
|
|
201
204
|
jsiObject.setExternalMemoryPressure(runtime, audioBufferHostObject->getSizeInBytes());
|
|
@@ -207,6 +210,31 @@ JSI_HOST_FUNCTION(createBufferQueueSource) {
|
|
|
207
210
|
return promise;
|
|
208
211
|
}
|
|
209
212
|
|
|
213
|
+
JSI_HOST_FUNCTION(decodePCMAudioDataInBase64) {
|
|
214
|
+
auto b64 = args[0].getString(runtime).utf8(runtime);
|
|
215
|
+
|
|
216
|
+
auto promise = promiseVendor_->createPromise([this, b64](std::shared_ptr<Promise> promise) {
|
|
217
|
+
std::thread([this, b64, promise = std::move(promise)]() {
|
|
218
|
+
auto results = context_->decodeWithPCMInBase64(b64);
|
|
219
|
+
|
|
220
|
+
if (!results) {
|
|
221
|
+
promise->reject("Failed to decode audio data source.");
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(results);
|
|
226
|
+
|
|
227
|
+
promise->resolve([audioBufferHostObject = std::move(audioBufferHostObject)](jsi::Runtime &runtime) {
|
|
228
|
+
auto jsiObject = jsi::Object::createFromHostObject(runtime, audioBufferHostObject);
|
|
229
|
+
jsiObject.setExternalMemoryPressure(runtime, audioBufferHostObject->getSizeInBytes());
|
|
230
|
+
return jsiObject;
|
|
231
|
+
});
|
|
232
|
+
}).detach();
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
return promise;
|
|
236
|
+
}
|
|
237
|
+
|
|
210
238
|
protected:
|
|
211
239
|
std::shared_ptr<BaseAudioContext> context_;
|
|
212
240
|
std::shared_ptr<PromiseVendor> promiseVendor_;
|
|
@@ -131,6 +131,17 @@ std::shared_ptr<AudioBuffer> BaseAudioContext::decodeAudioData(
|
|
|
131
131
|
return std::make_shared<AudioBuffer>(audioBus);
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
+
std::shared_ptr<AudioBuffer> BaseAudioContext::decodeWithPCMInBase64(
|
|
135
|
+
const std::string &data) {
|
|
136
|
+
auto audioBus = audioDecoder_->decodeWithPCMInBase64(data);
|
|
137
|
+
|
|
138
|
+
if (!audioBus) {
|
|
139
|
+
return nullptr;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return std::make_shared<AudioBuffer>(audioBus);
|
|
143
|
+
}
|
|
144
|
+
|
|
134
145
|
AudioNodeManager *BaseAudioContext::getNodeManager() {
|
|
135
146
|
return nodeManager_.get();
|
|
136
147
|
}
|
|
@@ -56,6 +56,7 @@ class BaseAudioContext {
|
|
|
56
56
|
|
|
57
57
|
std::shared_ptr<AudioBuffer> decodeAudioDataSource(const std::string &path);
|
|
58
58
|
std::shared_ptr<AudioBuffer> decodeAudioData(const void *data, size_t size);
|
|
59
|
+
std::shared_ptr<AudioBuffer> decodeWithPCMInBase64(const std::string &data);
|
|
59
60
|
|
|
60
61
|
std::shared_ptr<PeriodicWave> getBasicWaveForm(OscillatorType type);
|
|
61
62
|
[[nodiscard]] float getNyquistFrequency() const;
|
|
@@ -13,6 +13,7 @@ class AudioDecoder {
|
|
|
13
13
|
|
|
14
14
|
[[nodiscard]] std::shared_ptr<AudioBus> decodeWithFilePath(const std::string &path) const;
|
|
15
15
|
[[nodiscard]] std::shared_ptr<AudioBus> decodeWithMemoryBlock(const void *data, size_t size) const;
|
|
16
|
+
[[nodiscard]] std::shared_ptr<AudioBus> decodeWithPCMInBase64(const std::string &data) const;
|
|
16
17
|
|
|
17
18
|
private:
|
|
18
19
|
float sampleRate_;
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/*
|
|
2
|
+
base64.h
|
|
3
|
+
|
|
4
|
+
base64 encoding and decoding with C++.
|
|
5
|
+
More information at
|
|
6
|
+
https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp
|
|
7
|
+
|
|
8
|
+
Version: 2.rc.09 (release candidate)
|
|
9
|
+
|
|
10
|
+
Copyright (C) 2004-2017, 2020-2022 René Nyffenegger
|
|
11
|
+
|
|
12
|
+
This source code is provided 'as-is', without any express or implied
|
|
13
|
+
warranty. In no event will the author be held liable for any damages
|
|
14
|
+
arising from the use of this software.
|
|
15
|
+
|
|
16
|
+
Permission is granted to anyone to use this software for any purpose,
|
|
17
|
+
including commercial applications, and to alter it and redistribute it
|
|
18
|
+
freely, subject to the following restrictions:
|
|
19
|
+
|
|
20
|
+
1. The origin of this source code must not be misrepresented; you must not
|
|
21
|
+
claim that you wrote the original source code. If you use this source code
|
|
22
|
+
in a product, an acknowledgment in the product documentation would be
|
|
23
|
+
appreciated but is not required.
|
|
24
|
+
|
|
25
|
+
2. Altered source versions must be plainly marked as such, and must not be
|
|
26
|
+
misrepresented as being the original source code.
|
|
27
|
+
|
|
28
|
+
3. This notice may not be removed or altered from any source distribution.
|
|
29
|
+
|
|
30
|
+
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Copyright (C) 2023 Kevin Heifner
|
|
34
|
+
*
|
|
35
|
+
* Modified to be header only.
|
|
36
|
+
* Templated for std::string, std::string_view, std::vector<char> and other char containers.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
#pragma once
|
|
40
|
+
|
|
41
|
+
#include <algorithm>
|
|
42
|
+
#include <string>
|
|
43
|
+
#include <string_view>
|
|
44
|
+
#include <stdexcept>
|
|
45
|
+
|
|
46
|
+
// Interface:
|
|
47
|
+
// Defaults allow for use:
|
|
48
|
+
// std::string s = "foobar";
|
|
49
|
+
// std::string encoded = base64_encode(s);
|
|
50
|
+
// std::string_view sv = "foobar";
|
|
51
|
+
// std::string encoded = base64_encode(sv);
|
|
52
|
+
// std::vector<char> vc = {'f', 'o', 'o'};
|
|
53
|
+
// std::string encoded = base64_encode(vc);
|
|
54
|
+
//
|
|
55
|
+
// Also allows for user provided char containers and specified return types:
|
|
56
|
+
// std::string s = "foobar";
|
|
57
|
+
// std::vector<char> encoded = base64_encode<std::vector<char>>(s);
|
|
58
|
+
|
|
59
|
+
template <typename RetString = std::string, typename String = std::string>
|
|
60
|
+
RetString base64_encode(const String& s, bool url = false);
|
|
61
|
+
|
|
62
|
+
template <typename RetString = std::string, typename String = std::string>
|
|
63
|
+
RetString base64_encode_pem(const String& s);
|
|
64
|
+
|
|
65
|
+
template <typename RetString = std::string, typename String = std::string>
|
|
66
|
+
RetString base64_encode_mime(const String& s);
|
|
67
|
+
|
|
68
|
+
template <typename RetString = std::string, typename String = std::string>
|
|
69
|
+
RetString base64_decode(const String& s, bool remove_linebreaks = false);
|
|
70
|
+
|
|
71
|
+
template <typename RetString = std::string>
|
|
72
|
+
RetString base64_encode(const unsigned char* s, size_t len, bool url = false);
|
|
73
|
+
|
|
74
|
+
namespace detail {
|
|
75
|
+
//
|
|
76
|
+
// Depending on the url parameter in base64_chars, one of
|
|
77
|
+
// two sets of base64 characters needs to be chosen.
|
|
78
|
+
// They differ in their last two characters.
|
|
79
|
+
//
|
|
80
|
+
constexpr const char* to_base64_chars[2] = {
|
|
81
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
82
|
+
"abcdefghijklmnopqrstuvwxyz"
|
|
83
|
+
"0123456789"
|
|
84
|
+
"+/",
|
|
85
|
+
|
|
86
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
87
|
+
"abcdefghijklmnopqrstuvwxyz"
|
|
88
|
+
"0123456789"
|
|
89
|
+
"-_"};
|
|
90
|
+
|
|
91
|
+
constexpr unsigned char from_base64_chars[256] = {
|
|
92
|
+
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
93
|
+
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
94
|
+
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 62, 64, 63,
|
|
95
|
+
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
|
|
96
|
+
64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
|
97
|
+
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 63,
|
|
98
|
+
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
|
99
|
+
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
|
|
100
|
+
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
101
|
+
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
102
|
+
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
103
|
+
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
104
|
+
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
105
|
+
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
106
|
+
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
107
|
+
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
inline unsigned int pos_of_char(const unsigned char chr) {
|
|
111
|
+
//
|
|
112
|
+
// Return the position of chr within base64_encode()
|
|
113
|
+
//
|
|
114
|
+
|
|
115
|
+
if (from_base64_chars[chr] != 64) return from_base64_chars[chr];
|
|
116
|
+
|
|
117
|
+
//
|
|
118
|
+
// 2020-10-23: Throw std::exception rather than const char*
|
|
119
|
+
//(Pablo Martin-Gomez, https://github.com/Bouska)
|
|
120
|
+
//
|
|
121
|
+
throw std::runtime_error("Input is not valid base64-encoded data.");
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
template <typename RetString, typename String>
|
|
125
|
+
inline RetString insert_linebreaks(const String& str, size_t distance) {
|
|
126
|
+
//
|
|
127
|
+
// Provided by https://github.com/JomaCorpFX, adapted by Rene & Kevin
|
|
128
|
+
//
|
|
129
|
+
if (!str.size()) {
|
|
130
|
+
return RetString{};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (distance < str.size()) {
|
|
134
|
+
size_t pos = distance;
|
|
135
|
+
String s{str};
|
|
136
|
+
while (pos < s.size()) {
|
|
137
|
+
s.insert(pos, "\n");
|
|
138
|
+
pos += distance + 1;
|
|
139
|
+
}
|
|
140
|
+
return s;
|
|
141
|
+
} else {
|
|
142
|
+
return str;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
template <typename RetString, typename String, unsigned int line_length>
|
|
147
|
+
inline RetString encode_with_line_breaks(String s) {
|
|
148
|
+
return insert_linebreaks<RetString, String>(base64_encode(s, false), line_length);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
template <typename RetString, typename String>
|
|
152
|
+
inline RetString encode_pem(String s) {
|
|
153
|
+
return encode_with_line_breaks<RetString, String, 64>(s);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
template <typename RetString, typename String>
|
|
157
|
+
inline RetString encode_mime(String s) {
|
|
158
|
+
return encode_with_line_breaks<RetString, String, 76>(s);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
template <typename RetString, typename String>
|
|
162
|
+
inline RetString encode(String s, bool url) {
|
|
163
|
+
return base64_encode<RetString>(reinterpret_cast<const unsigned char*>(s.data()), s.size(), url);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
} // namespace detail
|
|
167
|
+
|
|
168
|
+
template <typename RetString>
|
|
169
|
+
inline RetString base64_encode(const unsigned char* bytes_to_encode, size_t in_len, bool url) {
|
|
170
|
+
size_t len_encoded = (in_len + 2) / 3 * 4;
|
|
171
|
+
|
|
172
|
+
unsigned char trailing_char = url ? '.' : '=';
|
|
173
|
+
|
|
174
|
+
//
|
|
175
|
+
// Choose set of base64 characters. They differ
|
|
176
|
+
// for the last two positions, depending on the url
|
|
177
|
+
// parameter.
|
|
178
|
+
// A bool (as is the parameter url) is guaranteed
|
|
179
|
+
// to evaluate to either 0 or 1 in C++ therefore,
|
|
180
|
+
// the correct character set is chosen by subscripting
|
|
181
|
+
// base64_chars with url.
|
|
182
|
+
//
|
|
183
|
+
const char *base64_chars_ = detail::to_base64_chars[url];
|
|
184
|
+
|
|
185
|
+
RetString ret;
|
|
186
|
+
ret.reserve(len_encoded);
|
|
187
|
+
|
|
188
|
+
unsigned int pos = 0;
|
|
189
|
+
|
|
190
|
+
while (pos < in_len) {
|
|
191
|
+
ret.push_back(base64_chars_[(bytes_to_encode[pos + 0] & 0xfc) >> 2]);
|
|
192
|
+
|
|
193
|
+
if (pos + 1 < in_len) {
|
|
194
|
+
ret.push_back(base64_chars_[((bytes_to_encode[pos + 0] & 0x03) << 4) +
|
|
195
|
+
((bytes_to_encode[pos + 1] & 0xf0) >> 4)]);
|
|
196
|
+
|
|
197
|
+
if (pos + 2 < in_len) {
|
|
198
|
+
ret.push_back(base64_chars_[((bytes_to_encode[pos + 1] & 0x0f) << 2) +
|
|
199
|
+
((bytes_to_encode[pos + 2] & 0xc0) >> 6)]);
|
|
200
|
+
ret.push_back(base64_chars_[bytes_to_encode[pos + 2] & 0x3f]);
|
|
201
|
+
} else {
|
|
202
|
+
ret.push_back(base64_chars_[(bytes_to_encode[pos + 1] & 0x0f) << 2]);
|
|
203
|
+
ret.push_back(trailing_char);
|
|
204
|
+
}
|
|
205
|
+
} else {
|
|
206
|
+
ret.push_back(base64_chars_[(bytes_to_encode[pos + 0] & 0x03) << 4]);
|
|
207
|
+
ret.push_back(trailing_char);
|
|
208
|
+
ret.push_back(trailing_char);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
pos += 3;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return ret;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
namespace detail {
|
|
218
|
+
|
|
219
|
+
template <typename RetString, typename String>
|
|
220
|
+
inline RetString decode(const String& encoded_string, bool remove_linebreaks) {
|
|
221
|
+
static_assert(!std::is_same<RetString, std::string_view>::value,
|
|
222
|
+
"RetString should not be std::string_view");
|
|
223
|
+
|
|
224
|
+
//
|
|
225
|
+
// decode(…) is templated so that it can be used with String = const std::string&
|
|
226
|
+
// or std::string_view (requires at least C++17)
|
|
227
|
+
//
|
|
228
|
+
|
|
229
|
+
if (encoded_string.empty())
|
|
230
|
+
return RetString{};
|
|
231
|
+
|
|
232
|
+
if (remove_linebreaks) {
|
|
233
|
+
String copy{encoded_string};
|
|
234
|
+
|
|
235
|
+
copy.erase(std::remove(copy.begin(), copy.end(), '\n'), copy.end());
|
|
236
|
+
|
|
237
|
+
return base64_decode<RetString, String>(copy, false);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
size_t length_of_string = encoded_string.size();
|
|
241
|
+
size_t pos = 0;
|
|
242
|
+
|
|
243
|
+
//
|
|
244
|
+
// The approximate length (bytes) of the decoded string might be one or
|
|
245
|
+
// two bytes smaller, depending on the amount of trailing equal signs
|
|
246
|
+
// in the encoded string. This approximation is needed to reserve
|
|
247
|
+
// enough space in the string to be returned.
|
|
248
|
+
//
|
|
249
|
+
size_t approx_length_of_decoded_string = length_of_string / 4 * 3;
|
|
250
|
+
RetString ret;
|
|
251
|
+
ret.reserve(approx_length_of_decoded_string);
|
|
252
|
+
|
|
253
|
+
while (pos < length_of_string) {
|
|
254
|
+
//
|
|
255
|
+
// Iterate over encoded input string in chunks. The size of all
|
|
256
|
+
// chunks except the last one is 4 bytes.
|
|
257
|
+
//
|
|
258
|
+
// The last chunk might be padded with equal signs or dots
|
|
259
|
+
// in order to make it 4 bytes in size as well, but this
|
|
260
|
+
// is not required as per RFC 2045.
|
|
261
|
+
//
|
|
262
|
+
// All chunks except the last one produce three output bytes.
|
|
263
|
+
//
|
|
264
|
+
// The last chunk produces at least one and up to three bytes.
|
|
265
|
+
//
|
|
266
|
+
|
|
267
|
+
size_t pos_of_char_1 = pos_of_char(encoded_string.at(pos + 1));
|
|
268
|
+
|
|
269
|
+
//
|
|
270
|
+
// Emit the first output byte that is produced in each chunk:
|
|
271
|
+
//
|
|
272
|
+
ret.push_back(static_cast<typename RetString::value_type>(((pos_of_char(encoded_string.at(pos + 0))) << 2) + ((pos_of_char_1 & 0x30) >> 4)));
|
|
273
|
+
|
|
274
|
+
if ((pos + 2 < length_of_string) &&
|
|
275
|
+
// Check for data that is not padded with equal signs (which is allowed by RFC 2045)
|
|
276
|
+
encoded_string.at(pos + 2) != '=' &&
|
|
277
|
+
encoded_string.at(pos + 2) != '.' ) { // accept URL-safe base 64 strings, too, so check for '.' also.
|
|
278
|
+
//
|
|
279
|
+
// Emit a chunk's second byte (which might not be produced in the last chunk).
|
|
280
|
+
//
|
|
281
|
+
unsigned int pos_of_char_2 = pos_of_char(encoded_string.at(pos + 2));
|
|
282
|
+
ret.push_back(static_cast<typename RetString::value_type>(((pos_of_char_1 & 0x0f) << 4) + ((pos_of_char_2 & 0x3c) >> 2)));
|
|
283
|
+
|
|
284
|
+
if ((pos + 3 < length_of_string) &&
|
|
285
|
+
encoded_string.at(pos + 3) != '=' &&
|
|
286
|
+
encoded_string.at(pos + 3) != '.' ) {
|
|
287
|
+
//
|
|
288
|
+
// Emit a chunk's third byte (which might not be produced in the last chunk).
|
|
289
|
+
//
|
|
290
|
+
ret.push_back(static_cast<typename RetString::value_type>(((pos_of_char_2 & 0x03) << 6) + pos_of_char(encoded_string.at(pos + 3))));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
pos += 4;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return ret;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
} // namespace detail
|
|
301
|
+
|
|
302
|
+
template <typename RetString, typename String>
|
|
303
|
+
inline RetString base64_decode(const String& s, bool remove_linebreaks) {
|
|
304
|
+
return detail::decode<RetString, String>(s, remove_linebreaks);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
template <typename RetString, typename String>
|
|
308
|
+
inline RetString base64_encode(const String& s, bool url) {
|
|
309
|
+
return detail::encode<RetString, String>(s, url);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
template <typename RetString, typename String>
|
|
313
|
+
inline RetString base64_encode_pem (const String& s) {
|
|
314
|
+
return detail::encode_pem<RetString, String>(s);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
template <typename RetString, typename String>
|
|
318
|
+
inline RetString base64_encode_mime(const String& s) {
|
|
319
|
+
return detail::encode_mime<RetString, String>(s);
|
|
320
|
+
}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
#import <audioapi/libs/miniaudio/miniaudio.h>
|
|
3
3
|
|
|
4
4
|
#include <audioapi/core/utils/AudioDecoder.h>
|
|
5
|
+
#include <audioapi/dsp/VectorMath.h>
|
|
6
|
+
#include <audioapi/libs/base64/base64.h>
|
|
5
7
|
#include <audioapi/utils/AudioArray.h>
|
|
6
8
|
#include <audioapi/utils/AudioBus.h>
|
|
7
9
|
|
|
@@ -94,4 +96,25 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithMemoryBlock(const void *data,
|
|
|
94
96
|
|
|
95
97
|
return audioBus;
|
|
96
98
|
}
|
|
99
|
+
|
|
100
|
+
std::shared_ptr<AudioBus> AudioDecoder::decodeWithPCMInBase64(const std::string &data) const
|
|
101
|
+
{
|
|
102
|
+
auto decodedData = base64_decode(data, false);
|
|
103
|
+
|
|
104
|
+
const auto uint8Data = reinterpret_cast<uint8_t *>(decodedData.data());
|
|
105
|
+
size_t frameCount = decodedData.size() / 2;
|
|
106
|
+
|
|
107
|
+
auto audioBus = std::make_shared<AudioBus>(frameCount, 1, sampleRate_);
|
|
108
|
+
auto channelData = audioBus->getChannel(0)->getData();
|
|
109
|
+
|
|
110
|
+
for (size_t i = 0; i < frameCount; ++i) {
|
|
111
|
+
auto sample = static_cast<int16_t>((uint8Data[i * 2 + 1] << 8) | uint8Data[i * 2]);
|
|
112
|
+
channelData[i] = static_cast<float>(sample);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
dsp::multiplyByScalar(channelData, 1.0f / 32768.0f, channelData, frameCount);
|
|
116
|
+
|
|
117
|
+
return audioBus;
|
|
118
|
+
}
|
|
119
|
+
|
|
97
120
|
} // namespace audioapi
|
|
@@ -76,8 +76,14 @@ class BaseAudioContext {
|
|
|
76
76
|
}
|
|
77
77
|
return new _AudioBuffer.default(await this.context.decodeAudioDataSource(sourcePath));
|
|
78
78
|
}
|
|
79
|
-
async decodeAudioData(
|
|
80
|
-
|
|
79
|
+
async decodeAudioData(data) {
|
|
80
|
+
// pcm data in base64
|
|
81
|
+
if (typeof data === 'string') {
|
|
82
|
+
return new _AudioBuffer.default(await this.context.decodePCMAudioDataInBase64(data));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// data in array buffer
|
|
86
|
+
return new _AudioBuffer.default(await this.context.decodeAudioData(new Uint8Array(data)));
|
|
81
87
|
}
|
|
82
88
|
}
|
|
83
89
|
exports.default = BaseAudioContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioDestinationNode","_interopRequireDefault","require","_OscillatorNode","_GainNode","_StereoPannerNode","_BiquadFilterNode","_AudioBufferSourceNode","_AudioBuffer","_PeriodicWave","_AnalyserNode","_AudioBufferQueueSourceNode","_errors","e","__esModule","default","BaseAudioContext","constructor","context","destination","AudioDestinationNode","sampleRate","currentTime","state","createOscillator","OscillatorNode","createGain","GainNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createBufferSource","options","pitchCorrection","AudioBufferSourceNode","createBufferQueueSource","AudioBufferQueueSourceNode","createBuffer","numOfChannels","length","NotSupportedError","AudioBuffer","createPeriodicWave","real","imag","constraints","InvalidAccessError","disableNormalization","PeriodicWave","createAnalyser","AnalyserNode","decodeAudioDataSource","sourcePath","startsWith","replace","decodeAudioData","
|
|
1
|
+
{"version":3,"names":["_AudioDestinationNode","_interopRequireDefault","require","_OscillatorNode","_GainNode","_StereoPannerNode","_BiquadFilterNode","_AudioBufferSourceNode","_AudioBuffer","_PeriodicWave","_AnalyserNode","_AudioBufferQueueSourceNode","_errors","e","__esModule","default","BaseAudioContext","constructor","context","destination","AudioDestinationNode","sampleRate","currentTime","state","createOscillator","OscillatorNode","createGain","GainNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createBufferSource","options","pitchCorrection","AudioBufferSourceNode","createBufferQueueSource","AudioBufferQueueSourceNode","createBuffer","numOfChannels","length","NotSupportedError","AudioBuffer","createPeriodicWave","real","imag","constraints","InvalidAccessError","disableNormalization","PeriodicWave","createAnalyser","AnalyserNode","decodeAudioDataSource","sourcePath","startsWith","replace","decodeAudioData","data","decodePCMAudioDataInBase64","Uint8Array","exports"],"sourceRoot":"../../../src","sources":["core/BaseAudioContext.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -71,8 +71,14 @@ export default class BaseAudioContext {
|
|
|
71
71
|
}
|
|
72
72
|
return new AudioBuffer(await this.context.decodeAudioDataSource(sourcePath));
|
|
73
73
|
}
|
|
74
|
-
async decodeAudioData(
|
|
75
|
-
|
|
74
|
+
async decodeAudioData(data) {
|
|
75
|
+
// pcm data in base64
|
|
76
|
+
if (typeof data === 'string') {
|
|
77
|
+
return new AudioBuffer(await this.context.decodePCMAudioDataInBase64(data));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// data in array buffer
|
|
81
|
+
return new AudioBuffer(await this.context.decodeAudioData(new Uint8Array(data)));
|
|
76
82
|
}
|
|
77
83
|
}
|
|
78
84
|
//# sourceMappingURL=BaseAudioContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["AudioDestinationNode","OscillatorNode","GainNode","StereoPannerNode","BiquadFilterNode","AudioBufferSourceNode","AudioBuffer","PeriodicWave","AnalyserNode","AudioBufferQueueSourceNode","InvalidAccessError","NotSupportedError","BaseAudioContext","constructor","context","destination","sampleRate","currentTime","state","createOscillator","createGain","createStereoPanner","createBiquadFilter","createBufferSource","options","pitchCorrection","createBufferQueueSource","createBuffer","numOfChannels","length","createPeriodicWave","real","imag","constraints","disableNormalization","createAnalyser","decodeAudioDataSource","sourcePath","startsWith","replace","decodeAudioData","
|
|
1
|
+
{"version":3,"names":["AudioDestinationNode","OscillatorNode","GainNode","StereoPannerNode","BiquadFilterNode","AudioBufferSourceNode","AudioBuffer","PeriodicWave","AnalyserNode","AudioBufferQueueSourceNode","InvalidAccessError","NotSupportedError","BaseAudioContext","constructor","context","destination","sampleRate","currentTime","state","createOscillator","createGain","createStereoPanner","createBiquadFilter","createBufferSource","options","pitchCorrection","createBufferQueueSource","createBuffer","numOfChannels","length","createPeriodicWave","real","imag","constraints","disableNormalization","createAnalyser","decodeAudioDataSource","sourcePath","startsWith","replace","decodeAudioData","data","decodePCMAudioDataInBase64","Uint8Array"],"sourceRoot":"../../../src","sources":["core/BaseAudioContext.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -27,6 +27,6 @@ export default class BaseAudioContext {
|
|
|
27
27
|
createPeriodicWave(real: Float32Array, imag: Float32Array, constraints?: PeriodicWaveConstraints): PeriodicWave;
|
|
28
28
|
createAnalyser(): AnalyserNode;
|
|
29
29
|
decodeAudioDataSource(sourcePath: string): Promise<AudioBuffer>;
|
|
30
|
-
decodeAudioData(
|
|
30
|
+
decodeAudioData(data: ArrayBuffer | string): Promise<AudioBuffer>;
|
|
31
31
|
}
|
|
32
32
|
//# sourceMappingURL=BaseAudioContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseAudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/BaseAudioContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,EAC7B,MAAM,UAAU,CAAC;AAClB,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,0BAA0B,MAAM,8BAA8B,CAAC;AAGtE,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;gBAElC,OAAO,EAAE,iBAAiB;IAMtC,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,KAAK,IAAI,YAAY,CAE/B;IAED,gBAAgB,IAAI,cAAc;IAIlC,UAAU,IAAI,QAAQ;IAItB,kBAAkB,IAAI,gBAAgB;IAItC,kBAAkB,IAAI,gBAAgB;IAItC,kBAAkB,CAChB,OAAO,CAAC,EAAE,4BAA4B,GACrC,qBAAqB;IASxB,uBAAuB,IAAI,0BAA0B;IAOrD,YAAY,CACV,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,WAAW;IAwBd,kBAAkB,CAChB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,YAAY,EAClB,WAAW,CAAC,EAAE,uBAAuB,GACpC,YAAY;IAcf,cAAc,IAAI,YAAY;IAIxB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAW/D,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"BaseAudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/BaseAudioContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,EAC7B,MAAM,UAAU,CAAC;AAClB,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,0BAA0B,MAAM,8BAA8B,CAAC;AAGtE,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;gBAElC,OAAO,EAAE,iBAAiB;IAMtC,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,KAAK,IAAI,YAAY,CAE/B;IAED,gBAAgB,IAAI,cAAc;IAIlC,UAAU,IAAI,QAAQ;IAItB,kBAAkB,IAAI,gBAAgB;IAItC,kBAAkB,IAAI,gBAAgB;IAItC,kBAAkB,CAChB,OAAO,CAAC,EAAE,4BAA4B,GACrC,qBAAqB;IASxB,uBAAuB,IAAI,0BAA0B;IAOrD,YAAY,CACV,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,WAAW;IAwBd,kBAAkB,CAChB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,YAAY,EAClB,WAAW,CAAC,EAAE,uBAAuB,GACpC,YAAY;IAcf,cAAc,IAAI,YAAY;IAIxB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAW/D,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAaxE"}
|
|
@@ -16,6 +16,7 @@ export interface IBaseAudioContext {
|
|
|
16
16
|
createAnalyser: () => IAnalyserNode;
|
|
17
17
|
decodeAudioDataSource: (sourcePath: string) => Promise<IAudioBuffer>;
|
|
18
18
|
decodeAudioData: (arrayBuffer: ArrayBuffer) => Promise<IAudioBuffer>;
|
|
19
|
+
decodePCMAudioDataInBase64: (b64: string) => Promise<IAudioBuffer>;
|
|
19
20
|
}
|
|
20
21
|
export interface IAudioContext extends IBaseAudioContext {
|
|
21
22
|
close(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,gBAAgB,IAAI,eAAe,CAAC;IACpC,UAAU,IAAI,SAAS,CAAC;IACxB,kBAAkB,IAAI,iBAAiB,CAAC;IACxC,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;IAC5C,kBAAkB,EAAE,CAAC,eAAe,EAAE,OAAO,KAAK,sBAAsB,CAAC;IACzE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;IAC3D,YAAY,EAAE,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,KACf,YAAY,CAAC;IAClB,kBAAkB,EAAE,CAClB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,YAAY,EAClB,oBAAoB,EAAE,OAAO,KAC1B,aAAa,CAAC;IACnB,cAAc,EAAE,MAAM,aAAa,CAAC;IACpC,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACrE,eAAe,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,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.6.
|
|
3
|
+
"version": "0.6.2-rc.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"
|
|
@@ -130,9 +130,17 @@ export default class BaseAudioContext {
|
|
|
130
130
|
);
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
async decodeAudioData(
|
|
133
|
+
async decodeAudioData(data: ArrayBuffer | string): Promise<AudioBuffer> {
|
|
134
|
+
// pcm data in base64
|
|
135
|
+
if (typeof data === 'string') {
|
|
136
|
+
return new AudioBuffer(
|
|
137
|
+
await this.context.decodePCMAudioDataInBase64(data)
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// data in array buffer
|
|
134
142
|
return new AudioBuffer(
|
|
135
|
-
await this.context.decodeAudioData(new Uint8Array(
|
|
143
|
+
await this.context.decodeAudioData(new Uint8Array(data))
|
|
136
144
|
);
|
|
137
145
|
}
|
|
138
146
|
}
|
package/src/interfaces.ts
CHANGED
|
@@ -33,6 +33,7 @@ export interface IBaseAudioContext {
|
|
|
33
33
|
createAnalyser: () => IAnalyserNode;
|
|
34
34
|
decodeAudioDataSource: (sourcePath: string) => Promise<IAudioBuffer>;
|
|
35
35
|
decodeAudioData: (arrayBuffer: ArrayBuffer) => Promise<IAudioBuffer>;
|
|
36
|
+
decodePCMAudioDataInBase64: (b64: string) => Promise<IAudioBuffer>;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
export interface IAudioContext extends IBaseAudioContext {
|