react-native-audio-api 0.8.0-nightly-daaceff-20250902 → 0.8.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/build.gradle +1 -1
- package/android/src/main/cpp/audioapi/CMakeLists.txt +3 -12
- package/android/src/main/cpp/audioapi/android/core/AudioDecoder.cpp +51 -21
- package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
- package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
- package/android/src/main/jniLibs/x86/libavformat.so +0 -0
- package/android/src/main/jniLibs/x86/libavutil.so +0 -0
- package/android/src/main/jniLibs/x86/libswresample.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
- package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
- package/common/cpp/audioapi/core/utils/AudioDecoder.h +61 -0
- package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +14 -2
- package/common/cpp/audioapi/core/utils/AudioNodeManager.h +3 -0
- package/common/cpp/audioapi/external/libavcodec.xcframework/Info.plist +5 -5
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/libavformat.xcframework/Info.plist +5 -5
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/libavutil.xcframework/Info.plist +5 -5
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +402 -0
- package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h +27 -0
- package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +11 -10
- package/common/cpp/audioapi/utils/SpscChannel.hpp +47 -38
- package/common/cpp/test/CMakeLists.txt +2 -0
- package/ios/audioapi/ios/core/AudioDecoder.mm +22 -2
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts +1 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +1 -1
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/AudioContext.ts +1 -1
- package/src/interfaces.ts +1 -1
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec.framework/libavcodec +0 -0
|
@@ -85,7 +85,7 @@ public:
|
|
|
85
85
|
Sender& operator=(Sender&& other) noexcept {
|
|
86
86
|
channel_ = std::move(other.channel_);
|
|
87
87
|
return *this;
|
|
88
|
-
}
|
|
88
|
+
}
|
|
89
89
|
Sender(Sender&& other) noexcept : channel_(std::move(other.channel_)) {}
|
|
90
90
|
|
|
91
91
|
/// @brief Try to send a value to the channel
|
|
@@ -101,30 +101,34 @@ public:
|
|
|
101
101
|
/// @param value The value to send
|
|
102
102
|
/// @note This function is lock-free but may block if the channel is full
|
|
103
103
|
void send(const T& value) noexcept(std::is_nothrow_constructible_v<T, const T&>) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
104
|
+
if (channel_->try_send(value) != ResponseStatus::SUCCESS) [[ unlikely ]] {
|
|
105
|
+
do {
|
|
106
|
+
if constexpr (Wait == WaitStrategy::YIELD) {
|
|
107
|
+
std::this_thread::yield(); // Yield to allow other threads to run
|
|
108
|
+
} else if constexpr (Wait == WaitStrategy::BUSY_LOOP) {
|
|
109
|
+
asm volatile ("" ::: "memory"); // Busy loop, just spin with compiler barrier
|
|
110
|
+
} else if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {
|
|
111
|
+
channel_->rcvCursor_.wait(channel_->rcvCursorCache_, std::memory_order_acquire);
|
|
112
|
+
}
|
|
113
|
+
} while (channel_->try_send(value) != ResponseStatus::SUCCESS);
|
|
114
|
+
}
|
|
113
115
|
}
|
|
114
116
|
|
|
115
117
|
/// @brief Send a value to the channel (move version)
|
|
116
118
|
/// @param value The value to send
|
|
117
119
|
/// @note This function is lock-free but may block if the channel is full.
|
|
118
|
-
void send(T&& value) noexcept(std::
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
120
|
+
void send(T&& value) noexcept(std::is_nothrow_move_constructible_v<T>) {
|
|
121
|
+
if (channel_->try_send(std::move(value)) != ResponseStatus::SUCCESS) [[ unlikely ]] {
|
|
122
|
+
do {
|
|
123
|
+
if constexpr (Wait == WaitStrategy::YIELD) {
|
|
124
|
+
std::this_thread::yield(); // Yield to allow other threads to run
|
|
125
|
+
} else if constexpr (Wait == WaitStrategy::BUSY_LOOP) {
|
|
126
|
+
asm volatile ("" ::: "memory"); // Busy loop, just spin with compiler barrier
|
|
127
|
+
} else if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {
|
|
128
|
+
channel_->rcvCursor_.wait(channel_->rcvCursorCache_, std::memory_order_acquire);
|
|
129
|
+
}
|
|
130
|
+
} while (channel_->try_send(std::move(value)) != ResponseStatus::SUCCESS);
|
|
131
|
+
}
|
|
128
132
|
}
|
|
129
133
|
|
|
130
134
|
private:
|
|
@@ -167,7 +171,8 @@ public:
|
|
|
167
171
|
/// @note This function is lock-free but may block if the channel is empty.
|
|
168
172
|
T receive() noexcept(std::is_nothrow_default_constructible_v<T> && std::is_nothrow_move_assignable_v<T> && std::is_nothrow_destructible_v<T>) {
|
|
169
173
|
T value;
|
|
170
|
-
|
|
174
|
+
if (channel_->try_receive(value) != ResponseStatus::SUCCESS) [[ unlikely ]] {
|
|
175
|
+
do {
|
|
171
176
|
if constexpr (Wait == WaitStrategy::YIELD) {
|
|
172
177
|
std::this_thread::yield(); // Yield to allow other threads to run
|
|
173
178
|
} else if constexpr (Wait == WaitStrategy::BUSY_LOOP) {
|
|
@@ -175,6 +180,7 @@ public:
|
|
|
175
180
|
} else if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {
|
|
176
181
|
channel_->sendCursor_.wait(channel_->sendCursorCache_, std::memory_order_acquire);
|
|
177
182
|
}
|
|
183
|
+
} while (channel_->try_receive(value) != ResponseStatus::SUCCESS);
|
|
178
184
|
}
|
|
179
185
|
return value;
|
|
180
186
|
}
|
|
@@ -198,21 +204,21 @@ public:
|
|
|
198
204
|
/// @param capacity The minimum capacity of the channel, for performance it will be allocated with next power of 2
|
|
199
205
|
/// Uses raw memory allocation so the T type is not required to provide default constructors
|
|
200
206
|
/// alignment is the key for performance it makes sure that objects are properly aligned in memory for faster access
|
|
201
|
-
explicit InnerChannel(size_t capacity) :
|
|
207
|
+
explicit InnerChannel(size_t capacity) :
|
|
202
208
|
capacity_(next_power_of_2(capacity)),
|
|
203
209
|
capacity_mask_(capacity_ - 1),
|
|
204
210
|
buffer_(static_cast<T*>(operator new[](capacity_ * sizeof(T), std::align_val_t{alignof(T)}))) {
|
|
205
|
-
|
|
211
|
+
|
|
206
212
|
// Initialize cache values for better performance
|
|
207
213
|
rcvCursorCache_ = 0;
|
|
208
214
|
sendCursorCache_ = 0;
|
|
209
|
-
|
|
215
|
+
|
|
210
216
|
// Initialize reader state for overwrite strategy
|
|
211
217
|
if constexpr (Strategy == OverflowStrategy::OVERWRITE_ON_FULL) {
|
|
212
218
|
oldestOccupied_.store(false, std::memory_order_relaxed);
|
|
213
219
|
}
|
|
214
220
|
}
|
|
215
|
-
|
|
221
|
+
|
|
216
222
|
/// This should not be called if there is existing handle to reader or writer
|
|
217
223
|
~InnerChannel() {
|
|
218
224
|
size_t sendCursor = sendCursor_.load(std::memory_order_seq_cst);
|
|
@@ -226,7 +232,10 @@ public:
|
|
|
226
232
|
}
|
|
227
233
|
|
|
228
234
|
// Deallocate the buffer
|
|
229
|
-
::operator delete[](
|
|
235
|
+
::operator delete[](
|
|
236
|
+
buffer_,
|
|
237
|
+
capacity_ * sizeof(T),
|
|
238
|
+
std::align_val_t{alignof(T)});
|
|
230
239
|
}
|
|
231
240
|
|
|
232
241
|
/// @brief Try to send a value to the channel
|
|
@@ -240,8 +249,8 @@ public:
|
|
|
240
249
|
} else {
|
|
241
250
|
return try_send_overwrite_on_full(std::forward<U>(value));
|
|
242
251
|
}
|
|
243
|
-
}
|
|
244
|
-
|
|
252
|
+
}
|
|
253
|
+
|
|
245
254
|
/// @brief Try to receive a value from the channel
|
|
246
255
|
/// @param value The variable to store the received value
|
|
247
256
|
/// @return ResponseStatus indicating the result of the operation
|
|
@@ -255,7 +264,7 @@ public:
|
|
|
255
264
|
return ResponseStatus::SKIP_DUE_TO_OVERWRITE;
|
|
256
265
|
}
|
|
257
266
|
}
|
|
258
|
-
|
|
267
|
+
|
|
259
268
|
size_t rcvCursor = rcvCursor_.load(std::memory_order_relaxed); // only receiver thread reads this
|
|
260
269
|
|
|
261
270
|
if (rcvCursor == sendCursorCache_) {
|
|
@@ -274,11 +283,11 @@ public:
|
|
|
274
283
|
buffer_[rcvCursor].~T(); // Call destructor
|
|
275
284
|
|
|
276
285
|
rcvCursor_.store(next_index(rcvCursor), std::memory_order_release);
|
|
277
|
-
|
|
286
|
+
|
|
278
287
|
if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {
|
|
279
288
|
rcvCursor_.notify_one(); // Notify sender that a value has been received
|
|
280
289
|
}
|
|
281
|
-
|
|
290
|
+
|
|
282
291
|
if constexpr (Strategy == OverflowStrategy::OVERWRITE_ON_FULL) {
|
|
283
292
|
oldestOccupied_.store(false, std::memory_order_release);
|
|
284
293
|
}
|
|
@@ -301,7 +310,7 @@ private:
|
|
|
301
310
|
|
|
302
311
|
// Construct the new element in place
|
|
303
312
|
new (&buffer_[sendCursor]) T(std::forward<U>(value));
|
|
304
|
-
|
|
313
|
+
|
|
305
314
|
sendCursor_.store(next_sendCursor, std::memory_order_release);
|
|
306
315
|
|
|
307
316
|
if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {
|
|
@@ -310,7 +319,7 @@ private:
|
|
|
310
319
|
|
|
311
320
|
return ResponseStatus::SUCCESS;
|
|
312
321
|
}
|
|
313
|
-
|
|
322
|
+
|
|
314
323
|
/// @brief Try to send with OVERWRITE_ON_FULL strategy
|
|
315
324
|
template<typename U>
|
|
316
325
|
inline ResponseStatus try_send_overwrite_on_full(U&& value) noexcept(std::is_nothrow_constructible_v<T, U&&>) {
|
|
@@ -336,7 +345,7 @@ private:
|
|
|
336
345
|
} else {
|
|
337
346
|
rcvCursorCache_ = newestRcvCursor;
|
|
338
347
|
}
|
|
339
|
-
|
|
348
|
+
|
|
340
349
|
oldestOccupied_.store(false, std::memory_order_release);
|
|
341
350
|
}
|
|
342
351
|
}
|
|
@@ -344,11 +353,11 @@ private:
|
|
|
344
353
|
// Normal case: buffer not full
|
|
345
354
|
new (&buffer_[sendCursor]) T(std::forward<U>(value));
|
|
346
355
|
sendCursor_.store(next_sendCursor, std::memory_order_release);
|
|
347
|
-
|
|
356
|
+
|
|
348
357
|
if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {
|
|
349
358
|
sendCursor_.notify_one(); // Notify receiver that a value has been sent
|
|
350
359
|
}
|
|
351
|
-
|
|
360
|
+
|
|
352
361
|
return ResponseStatus::SUCCESS;
|
|
353
362
|
}
|
|
354
363
|
|
|
@@ -357,7 +366,7 @@ private:
|
|
|
357
366
|
/// @return The next power of 2
|
|
358
367
|
static constexpr size_t next_power_of_2(const size_t n) noexcept {
|
|
359
368
|
if (n <= 1) return 1;
|
|
360
|
-
|
|
369
|
+
|
|
361
370
|
// Use bit manipulation for efficiency
|
|
362
371
|
size_t power = 1;
|
|
363
372
|
while (power < n) {
|
|
@@ -382,7 +391,7 @@ private:
|
|
|
382
391
|
alignas(64) std::atomic<size_t> sendCursor_{0};
|
|
383
392
|
alignas(64) size_t rcvCursorCache_{0}; // reduces cache coherency
|
|
384
393
|
|
|
385
|
-
/// Consumer-side data (accessed by receiver thread)
|
|
394
|
+
/// Consumer-side data (accessed by receiver thread)
|
|
386
395
|
alignas(64) std::atomic<size_t> rcvCursor_{0};
|
|
387
396
|
alignas(64) size_t sendCursorCache_{0}; // reduces cache coherency
|
|
388
397
|
|
|
@@ -28,6 +28,8 @@ list(REMOVE_ITEM RNAUDIOAPI_SRC
|
|
|
28
28
|
"${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/core/AudioContext.cpp"
|
|
29
29
|
"${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/core/sources/StreamerNode.cpp"
|
|
30
30
|
"${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/core/sources/StreamerNode.h"
|
|
31
|
+
"${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp"
|
|
32
|
+
"${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h"
|
|
31
33
|
)
|
|
32
34
|
|
|
33
35
|
file(GLOB_RECURSE RNAUDIOAPI_LIBS
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
#include <audioapi/dsp/VectorMath.h>
|
|
9
9
|
#include <audioapi/libs/audio-stretch/stretch.h>
|
|
10
10
|
#include <audioapi/libs/base64/base64.h>
|
|
11
|
+
#include <audioapi/libs/ffmpeg/FFmpegDecoding.h>
|
|
11
12
|
#include <audioapi/utils/AudioArray.h>
|
|
12
13
|
#include <audioapi/utils/AudioBus.h>
|
|
13
14
|
|
|
@@ -53,6 +54,15 @@ AudioDecoder::makeAudioBusFromInt16Buffer(const std::vector<int16_t> &buffer, in
|
|
|
53
54
|
|
|
54
55
|
std::shared_ptr<AudioBus> AudioDecoder::decodeWithFilePath(const std::string &path) const
|
|
55
56
|
{
|
|
57
|
+
std::vector<int16_t> buffer;
|
|
58
|
+
if (AudioDecoder::pathHasExtension(path, {".mp4", ".m4a", ".aac"})) {
|
|
59
|
+
buffer = ffmpegdecoding::decodeWithFilePath(path, static_cast<int>(sampleRate_));
|
|
60
|
+
if (buffer.empty()) {
|
|
61
|
+
NSLog(@"Failed to decode with FFmpeg: %s", path.c_str());
|
|
62
|
+
return nullptr;
|
|
63
|
+
}
|
|
64
|
+
return makeAudioBusFromInt16Buffer(buffer, numChannels_, sampleRate_);
|
|
65
|
+
}
|
|
56
66
|
ma_decoding_backend_vtable *customBackends[] = {ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
|
|
57
67
|
|
|
58
68
|
ma_decoder decoder;
|
|
@@ -67,7 +77,7 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithFilePath(const std::string &pa
|
|
|
67
77
|
}
|
|
68
78
|
|
|
69
79
|
ma_uint64 framesRead = 0;
|
|
70
|
-
|
|
80
|
+
buffer = readAllPcmFrames(decoder, numChannels_, framesRead);
|
|
71
81
|
if (framesRead == 0) {
|
|
72
82
|
NSLog(@"Failed to decode");
|
|
73
83
|
ma_decoder_uninit(&decoder);
|
|
@@ -80,6 +90,16 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithFilePath(const std::string &pa
|
|
|
80
90
|
|
|
81
91
|
std::shared_ptr<AudioBus> AudioDecoder::decodeWithMemoryBlock(const void *data, size_t size) const
|
|
82
92
|
{
|
|
93
|
+
std::vector<int16_t> buffer;
|
|
94
|
+
const AudioFormat format = AudioDecoder::detectAudioFormat(data, size);
|
|
95
|
+
if (format == AudioFormat::MP4 || format == AudioFormat::M4A || format == AudioFormat::AAC) {
|
|
96
|
+
buffer = ffmpegdecoding::decodeWithMemoryBlock(data, size, static_cast<int>(sampleRate_));
|
|
97
|
+
if (buffer.empty()) {
|
|
98
|
+
NSLog(@"Failed to decode with FFmpeg");
|
|
99
|
+
return nullptr;
|
|
100
|
+
}
|
|
101
|
+
return makeAudioBusFromInt16Buffer(buffer, numChannels_, sampleRate_);
|
|
102
|
+
}
|
|
83
103
|
ma_decoding_backend_vtable *customBackends[] = {ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
|
|
84
104
|
|
|
85
105
|
ma_decoder decoder;
|
|
@@ -94,7 +114,7 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithMemoryBlock(const void *data,
|
|
|
94
114
|
}
|
|
95
115
|
|
|
96
116
|
ma_uint64 framesRead = 0;
|
|
97
|
-
|
|
117
|
+
buffer = readAllPcmFrames(decoder, numChannels_, framesRead);
|
|
98
118
|
if (framesRead == 0) {
|
|
99
119
|
NSLog(@"Failed to decode");
|
|
100
120
|
ma_decoder_uninit(&decoder);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_system","_errors","e","__esModule","default","AudioContext","BaseAudioContext","constructor","options","sampleRate","NotSupportedError","global","createAudioContext","AudioManager","getDevicePreferredSampleRate","initSuspended","close","context","resume","suspend","exports"],"sourceRoot":"../../../src","sources":["core/AudioContext.ts"],"mappings":";;;;;;AACA,IAAAA,iBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AAA8C,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE/B,MAAMG,YAAY,SAASC,yBAAgB,CAAC;EACzDC,WAAWA,CAACC,OAA6B,EAAE;IACzC,IACEA,OAAO,IACPA,OAAO,CAACC,UAAU,KACjBD,OAAO,CAACC,UAAU,GAAG,IAAI,IAAID,OAAO,CAACC,UAAU,GAAG,KAAK,CAAC,EACzD;MACA,MAAM,IAAIC,yBAAiB,CACzB,6CAA6CF,OAAO,CAACC,UAAU,EACjE,CAAC;IACH;IAEA,KAAK,CACHE,MAAM,CAACC,kBAAkB,CACvBJ,OAAO,EAAEC,UAAU,IAAII,eAAY,CAACC,4BAA4B,CAAC,CAAC,EAClEN,OAAO,EAAEO,aAAa,IAAI,KAC5B,CACF,CAAC;EACH;EAEA,MAAMC,KAAKA,CAAA,
|
|
1
|
+
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_system","_errors","e","__esModule","default","AudioContext","BaseAudioContext","constructor","options","sampleRate","NotSupportedError","global","createAudioContext","AudioManager","getDevicePreferredSampleRate","initSuspended","close","context","resume","suspend","exports"],"sourceRoot":"../../../src","sources":["core/AudioContext.ts"],"mappings":";;;;;;AACA,IAAAA,iBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AAA8C,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE/B,MAAMG,YAAY,SAASC,yBAAgB,CAAC;EACzDC,WAAWA,CAACC,OAA6B,EAAE;IACzC,IACEA,OAAO,IACPA,OAAO,CAACC,UAAU,KACjBD,OAAO,CAACC,UAAU,GAAG,IAAI,IAAID,OAAO,CAACC,UAAU,GAAG,KAAK,CAAC,EACzD;MACA,MAAM,IAAIC,yBAAiB,CACzB,6CAA6CF,OAAO,CAACC,UAAU,EACjE,CAAC;IACH;IAEA,KAAK,CACHE,MAAM,CAACC,kBAAkB,CACvBJ,OAAO,EAAEC,UAAU,IAAII,eAAY,CAACC,4BAA4B,CAAC,CAAC,EAClEN,OAAO,EAAEO,aAAa,IAAI,KAC5B,CACF,CAAC;EACH;EAEA,MAAMC,KAAKA,CAAA,EAAkB;IAC3B,OAAQ,IAAI,CAACC,OAAO,CAAmBD,KAAK,CAAC,CAAC;EAChD;EAEA,MAAME,MAAMA,CAAA,EAAqB;IAC/B,OAAQ,IAAI,CAACD,OAAO,CAAmBC,MAAM,CAAC,CAAC;EACjD;EAEA,MAAMC,OAAOA,CAAA,EAAqB;IAChC,OAAQ,IAAI,CAACF,OAAO,CAAmBE,OAAO,CAAC,CAAC;EAClD;AACF;AAACC,OAAA,CAAAhB,OAAA,GAAAC,YAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BaseAudioContext","AudioManager","NotSupportedError","AudioContext","constructor","options","sampleRate","global","createAudioContext","getDevicePreferredSampleRate","initSuspended","close","context","resume","suspend"],"sourceRoot":"../../../src","sources":["core/AudioContext.ts"],"mappings":";;AACA,OAAOA,gBAAgB,MAAM,uBAAoB;AACjD,OAAOC,YAAY,MAAM,oBAAW;AAEpC,SAASC,iBAAiB,QAAQ,oBAAW;AAE7C,eAAe,MAAMC,YAAY,SAASH,gBAAgB,CAAC;EACzDI,WAAWA,CAACC,OAA6B,EAAE;IACzC,IACEA,OAAO,IACPA,OAAO,CAACC,UAAU,KACjBD,OAAO,CAACC,UAAU,GAAG,IAAI,IAAID,OAAO,CAACC,UAAU,GAAG,KAAK,CAAC,EACzD;MACA,MAAM,IAAIJ,iBAAiB,CACzB,6CAA6CG,OAAO,CAACC,UAAU,EACjE,CAAC;IACH;IAEA,KAAK,CACHC,MAAM,CAACC,kBAAkB,CACvBH,OAAO,EAAEC,UAAU,IAAIL,YAAY,CAACQ,4BAA4B,CAAC,CAAC,EAClEJ,OAAO,EAAEK,aAAa,IAAI,KAC5B,CACF,CAAC;EACH;EAEA,MAAMC,KAAKA,CAAA,
|
|
1
|
+
{"version":3,"names":["BaseAudioContext","AudioManager","NotSupportedError","AudioContext","constructor","options","sampleRate","global","createAudioContext","getDevicePreferredSampleRate","initSuspended","close","context","resume","suspend"],"sourceRoot":"../../../src","sources":["core/AudioContext.ts"],"mappings":";;AACA,OAAOA,gBAAgB,MAAM,uBAAoB;AACjD,OAAOC,YAAY,MAAM,oBAAW;AAEpC,SAASC,iBAAiB,QAAQ,oBAAW;AAE7C,eAAe,MAAMC,YAAY,SAASH,gBAAgB,CAAC;EACzDI,WAAWA,CAACC,OAA6B,EAAE;IACzC,IACEA,OAAO,IACPA,OAAO,CAACC,UAAU,KACjBD,OAAO,CAACC,UAAU,GAAG,IAAI,IAAID,OAAO,CAACC,UAAU,GAAG,KAAK,CAAC,EACzD;MACA,MAAM,IAAIJ,iBAAiB,CACzB,6CAA6CG,OAAO,CAACC,UAAU,EACjE,CAAC;IACH;IAEA,KAAK,CACHC,MAAM,CAACC,kBAAkB,CACvBH,OAAO,EAAEC,UAAU,IAAIL,YAAY,CAACQ,4BAA4B,CAAC,CAAC,EAClEJ,OAAO,EAAEK,aAAa,IAAI,KAC5B,CACF,CAAC;EACH;EAEA,MAAMC,KAAKA,CAAA,EAAkB;IAC3B,OAAQ,IAAI,CAACC,OAAO,CAAmBD,KAAK,CAAC,CAAC;EAChD;EAEA,MAAME,MAAMA,CAAA,EAAqB;IAC/B,OAAQ,IAAI,CAACD,OAAO,CAAmBC,MAAM,CAAC,CAAC;EACjD;EAEA,MAAMC,OAAOA,CAAA,EAAqB;IAChC,OAAQ,IAAI,CAACF,OAAO,CAAmBE,OAAO,CAAC,CAAC;EAClD;AACF","ignoreList":[]}
|
|
@@ -2,7 +2,7 @@ import BaseAudioContext from './BaseAudioContext';
|
|
|
2
2
|
import { AudioContextOptions } from '../types';
|
|
3
3
|
export default class AudioContext extends BaseAudioContext {
|
|
4
4
|
constructor(options?: AudioContextOptions);
|
|
5
|
-
close(): Promise<
|
|
5
|
+
close(): Promise<void>;
|
|
6
6
|
resume(): Promise<boolean>;
|
|
7
7
|
suspend(): Promise<boolean>;
|
|
8
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/AudioContext.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG/C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,gBAAgB;gBAC5C,OAAO,CAAC,EAAE,mBAAmB;IAmBnC,KAAK,IAAI,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"AudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/AudioContext.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG/C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,gBAAgB;gBAC5C,OAAO,CAAC,EAAE,mBAAmB;IAmBnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAI1B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAGlC"}
|
|
@@ -21,7 +21,7 @@ export interface IBaseAudioContext {
|
|
|
21
21
|
createStreamer: () => IStreamerNode;
|
|
22
22
|
}
|
|
23
23
|
export interface IAudioContext extends IBaseAudioContext {
|
|
24
|
-
close(): Promise<
|
|
24
|
+
close(): Promise<void>;
|
|
25
25
|
resume(): Promise<boolean>;
|
|
26
26
|
suspend(): Promise<boolean>;
|
|
27
27
|
}
|
|
@@ -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,qBAAqB,IAAI,oBAAoB,CAAC;IAC9C,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;IACrE,0BAA0B,EAAE,CAC1B,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B,cAAc,EAAE,MAAM,aAAa,CAAC;CACrC;AAED,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,KAAK,IAAI,OAAO,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.8.0
|
|
3
|
+
"version": "0.8.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/core/AudioContext.ts
CHANGED
package/src/interfaces.ts
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>en</string> <key>CFBundleExecutable</key> <string>libavcodec</string> <key>CFBundleIdentifier</key> <string>io.qt.ffmpegkit.libavcodec</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> <string>libavcodec</string> <key>CFBundlePackageType</key> <string>FMWK</string> <key>CFBundleShortVersionString</key> <string>7.0.2</string> <key>CFBundleVersion</key> <string>7.0.2</string> <key>CFBundleSignature</key> <string>????</string> <key>MinimumOSVersion</key> <string>16.0</string> <key>CFBundleSupportedPlatforms</key> <array> <string>iPhoneOS</string> </array> <key>NSPrincipalClass</key> <string></string> </dict> </plist>
|