react-native-audio-api 0.13.0 → 0.13.2
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/CMakeLists.txt +15 -0
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +4 -0
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidRotatingFileWriter.cpp +3 -1
- package/android/src/main/cpp/audioapi/android/system/NativeFileInfo.cpp +48 -0
- package/android/src/main/cpp/audioapi/android/system/NativeFileInfo.hpp +6 -8
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +1 -1
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +1 -1
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +1 -1
- package/common/cpp/audioapi/core/sources/AudioFileSourceNode.h +1 -1
- package/common/cpp/audioapi/core/utils/decoding/SeekDecoderDaemon.h +1 -1
- package/common/cpp/audioapi/dsp/VectorMath.cpp +81 -1
- package/common/cpp/audioapi/dsp/VectorMath.h +9 -0
- package/common/cpp/audioapi/{core/utils → dsp}/WsolaTimeStretcher.cpp +23 -16
- package/common/cpp/audioapi/{core/utils → dsp}/WsolaTimeStretcher.h +6 -4
- package/ios/audioapi/ios/core/utils/IOSRotatingFileWriter.mm +3 -1
- package/ios/audioapi/ios/system/AudioEngine.mm +10 -0
- package/lib/commonjs/web-core/AudioBufferSourceNode.web.js +7 -1
- package/lib/commonjs/web-core/AudioBufferSourceNode.web.js.map +1 -1
- package/lib/commonjs/web-core/AudioContext.web.js +2 -4
- package/lib/commonjs/web-core/AudioContext.web.js.map +1 -1
- package/lib/commonjs/web-core/OfflineAudioContext.web.js +2 -4
- package/lib/commonjs/web-core/OfflineAudioContext.web.js.map +1 -1
- package/lib/commonjs/web-core/custom/index.js +7 -0
- package/lib/commonjs/web-core/custom/index.js.map +1 -1
- package/lib/commonjs/web-core/custom/wasm-audio-bufffer-source-node-stretcher/AudioBufferSourceNodeStretcher.js +58 -6
- package/lib/commonjs/web-core/custom/wasm-audio-bufffer-source-node-stretcher/AudioBufferSourceNodeStretcher.js.map +1 -1
- package/lib/commonjs/web-core/custom/wasm-audio-bufffer-source-node-stretcher/LoadCustomWasm.js +37 -0
- package/lib/commonjs/web-core/custom/wasm-audio-bufffer-source-node-stretcher/LoadCustomWasm.js.map +1 -0
- package/lib/{module/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.js → commonjs/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.mjs} +1 -1
- package/lib/commonjs/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.mjs.map +1 -0
- package/lib/commonjs/web-core/utils/AudioBufferSourceNodeStandard.js +8 -2
- package/lib/commonjs/web-core/utils/AudioBufferSourceNodeStandard.js.map +1 -1
- package/lib/module/web-core/AudioBufferSourceNode.web.js +7 -1
- package/lib/module/web-core/AudioBufferSourceNode.web.js.map +1 -1
- package/lib/module/web-core/AudioContext.web.js +2 -4
- package/lib/module/web-core/AudioContext.web.js.map +1 -1
- package/lib/module/web-core/OfflineAudioContext.web.js +2 -4
- package/lib/module/web-core/OfflineAudioContext.web.js.map +1 -1
- package/lib/module/web-core/custom/index.js +1 -0
- package/lib/module/web-core/custom/index.js.map +1 -1
- package/lib/module/web-core/custom/wasm-audio-bufffer-source-node-stretcher/AudioBufferSourceNodeStretcher.js +57 -6
- package/lib/module/web-core/custom/wasm-audio-bufffer-source-node-stretcher/AudioBufferSourceNodeStretcher.js.map +1 -1
- package/lib/module/web-core/custom/wasm-audio-bufffer-source-node-stretcher/LoadCustomWasm.js +33 -0
- package/lib/module/web-core/custom/wasm-audio-bufffer-source-node-stretcher/LoadCustomWasm.js.map +1 -0
- package/lib/{commonjs/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.js → module/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.mjs} +6 -10
- package/lib/module/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.mjs.map +1 -0
- package/lib/module/web-core/utils/AudioBufferSourceNodeStandard.js +8 -2
- package/lib/module/web-core/utils/AudioBufferSourceNodeStandard.js.map +1 -1
- package/lib/typescript/web-core/AudioBufferSourceNode.web.d.ts +2 -0
- package/lib/typescript/web-core/AudioBufferSourceNode.web.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioContext.web.d.ts +3 -1
- package/lib/typescript/web-core/AudioContext.web.d.ts.map +1 -1
- package/lib/typescript/web-core/BaseAudioContext.web.d.ts +3 -1
- package/lib/typescript/web-core/BaseAudioContext.web.d.ts.map +1 -1
- package/lib/typescript/web-core/OfflineAudioContext.web.d.ts +3 -1
- package/lib/typescript/web-core/OfflineAudioContext.web.d.ts.map +1 -1
- package/lib/typescript/web-core/custom/index.d.ts +1 -0
- package/lib/typescript/web-core/custom/index.d.ts.map +1 -1
- package/lib/typescript/web-core/custom/wasm-audio-bufffer-source-node-stretcher/AudioBufferSourceNodeStretcher.d.ts +5 -1
- package/lib/typescript/web-core/custom/wasm-audio-bufffer-source-node-stretcher/AudioBufferSourceNodeStretcher.d.ts.map +1 -1
- package/lib/typescript/web-core/custom/wasm-audio-bufffer-source-node-stretcher/LoadCustomWasm.d.ts +5 -0
- package/lib/typescript/web-core/custom/wasm-audio-bufffer-source-node-stretcher/LoadCustomWasm.d.ts.map +1 -0
- package/lib/typescript/web-core/types.web.d.ts +3 -1
- package/lib/typescript/web-core/types.web.d.ts.map +1 -1
- package/lib/typescript/web-core/utils/AudioBufferSourceNodeStandard.d.ts +2 -0
- package/lib/typescript/web-core/utils/AudioBufferSourceNodeStandard.d.ts.map +1 -1
- package/package.json +1 -1
- package/scripts/setup-rn-audio-api-web.js +4 -4
- package/src/web-core/AudioBufferSourceNode.web.ts +9 -1
- package/src/web-core/AudioContext.web.ts +4 -2
- package/src/web-core/BaseAudioContext.web.ts +3 -1
- package/src/web-core/OfflineAudioContext.web.ts +4 -2
- package/src/web-core/custom/index.ts +1 -0
- package/src/web-core/custom/wasm-audio-bufffer-source-node-stretcher/AudioBufferSourceNodeStretcher.ts +72 -12
- package/src/web-core/custom/wasm-audio-bufffer-source-node-stretcher/LoadCustomWasm.ts +39 -0
- package/src/web-core/types.web.ts +4 -1
- package/src/web-core/utils/AudioBufferSourceNodeStandard.ts +12 -2
- package/lib/commonjs/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.d.js +0 -6
- package/lib/commonjs/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.d.js.map +0 -1
- package/lib/commonjs/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.js.map +0 -1
- package/lib/module/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.d.js +0 -4
- package/lib/module/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.d.js.map +0 -1
- package/lib/module/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.js.map +0 -1
- package/src/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/SignalsmithStretch.d.ts +0 -4
- /package/src/web-core/custom/wasm-audio-bufffer-source-node-stretcher/signalsmithStretch/{SignalsmithStretch.js → SignalsmithStretch.mjs} +0 -0
|
@@ -165,6 +165,21 @@ if (RN_AUDIO_API_FFMPEG_DISABLED)
|
|
|
165
165
|
)
|
|
166
166
|
endif()
|
|
167
167
|
|
|
168
|
+
target_compile_definitions(
|
|
169
|
+
react-native-audio-api
|
|
170
|
+
PRIVATE $<$<CONFIG:Debug>:DEBUG>
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
# Forward the SIMD capability detected in the top-level android/CMakeLists.txt so
|
|
174
|
+
# the dsp/ vector math (VectorMath, WsolaTimeStretcher) compiles its NEON/SSE2
|
|
175
|
+
# intrinsic paths instead of the scalar fallback. arm64-v8a always has NEON and
|
|
176
|
+
# x86_64 always has SSE2, so these are safe baselines for their ABIs.
|
|
177
|
+
if(HAVE_ARM_NEON_INTRINSICS)
|
|
178
|
+
target_compile_definitions(react-native-audio-api PRIVATE HAVE_ARM_NEON_INTRINSICS=1)
|
|
179
|
+
elseif(HAVE_X86_SSE2)
|
|
180
|
+
target_compile_definitions(react-native-audio-api PRIVATE HAVE_X86_SSE2=1)
|
|
181
|
+
endif()
|
|
182
|
+
|
|
168
183
|
if (RN_AUDIO_API_STATIC_EXTERNAL_LIBS_DISABLED)
|
|
169
184
|
target_compile_definitions(
|
|
170
185
|
react-native-audio-api
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#include <audioapi/android/AudioAPIModule.h>
|
|
2
2
|
#include <audioapi/android/JniEventPayloadParser.h>
|
|
3
|
+
#include <audioapi/android/system/NativeFileInfo.hpp>
|
|
3
4
|
#include <memory>
|
|
4
5
|
|
|
5
6
|
namespace audioapi {
|
|
@@ -53,6 +54,9 @@ void AudioAPIModule::registerNatives() {
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
void AudioAPIModule::injectJSIBindings() {
|
|
57
|
+
// cache app directory paths on the attached thread
|
|
58
|
+
NativeFileInfo::warmCache();
|
|
59
|
+
|
|
56
60
|
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
57
61
|
auto uiWorkletRuntime = weakWorkletsModuleProxy_.lock()->getUIWorkletRuntime();
|
|
58
62
|
#else
|
|
@@ -28,7 +28,9 @@ OpenFileResult AndroidRotatingFileWriter::openFile(
|
|
|
28
28
|
streamSampleRate_ = streamSampleRate;
|
|
29
29
|
streamChannelCount_ = streamChannelCount;
|
|
30
30
|
streamMaxBufferSize_ = streamMaxBufferSizeInFrames;
|
|
31
|
-
|
|
31
|
+
if (!fileNameOverride.empty()) {
|
|
32
|
+
fileProperties_->fileNamePrefix = fileNameOverride + fileProperties_->fileNamePrefix;
|
|
33
|
+
}
|
|
32
34
|
if (currentWriter_ == nullptr) {
|
|
33
35
|
currentWriter_ = writerFactory_(fileProperties_);
|
|
34
36
|
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#include <audioapi/android/system/NativeFileInfo.hpp>
|
|
2
|
+
|
|
3
|
+
#include <atomic>
|
|
4
|
+
#include <string>
|
|
5
|
+
|
|
6
|
+
namespace audioapi {
|
|
7
|
+
|
|
8
|
+
namespace {
|
|
9
|
+
|
|
10
|
+
std::string cachedFilesDir;
|
|
11
|
+
std::string cachedCacheDir;
|
|
12
|
+
std::atomic<bool> cacheReady{false};
|
|
13
|
+
|
|
14
|
+
std::string fetchFilesDirFromJava() {
|
|
15
|
+
static const auto method =
|
|
16
|
+
NativeFileInfo::javaClassStatic()->getStaticMethod<jni::JString()>("getFilesDir");
|
|
17
|
+
return method(NativeFileInfo::javaClassStatic())->toStdString();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
std::string fetchCacheDirFromJava() {
|
|
21
|
+
static const auto method =
|
|
22
|
+
NativeFileInfo::javaClassStatic()->getStaticMethod<jni::JString()>("getCacheDir");
|
|
23
|
+
return method(NativeFileInfo::javaClassStatic())->toStdString();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
} // namespace
|
|
27
|
+
|
|
28
|
+
void NativeFileInfo::warmCache() {
|
|
29
|
+
cachedFilesDir = fetchFilesDirFromJava();
|
|
30
|
+
cachedCacheDir = fetchCacheDirFromJava();
|
|
31
|
+
cacheReady.store(true, std::memory_order_release);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
std::string NativeFileInfo::getFilesDir() {
|
|
35
|
+
if (cacheReady.load(std::memory_order_acquire)) {
|
|
36
|
+
return cachedFilesDir;
|
|
37
|
+
}
|
|
38
|
+
return fetchFilesDirFromJava();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
std::string NativeFileInfo::getCacheDir() {
|
|
42
|
+
if (cacheReady.load(std::memory_order_acquire)) {
|
|
43
|
+
return cachedCacheDir;
|
|
44
|
+
}
|
|
45
|
+
return fetchCacheDirFromJava();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
} // namespace audioapi
|
|
@@ -7,19 +7,17 @@ namespace audioapi {
|
|
|
7
7
|
|
|
8
8
|
using namespace facebook;
|
|
9
9
|
|
|
10
|
+
/// @brief JNI bridge to Kotlin paths for recorder file output.
|
|
11
|
+
/// @note Call warmCache() from a JNI-attached thread
|
|
10
12
|
class NativeFileInfo : public jni::JavaClass<NativeFileInfo> {
|
|
11
13
|
public:
|
|
12
14
|
static auto constexpr kJavaDescriptor = "Lcom/swmansion/audioapi/system/NativeFileInfo;";
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return method(javaClassStatic())->toStdString();
|
|
17
|
-
}
|
|
16
|
+
/// @brief Fetches and caches directory paths via JNI. Must run before recording.
|
|
17
|
+
static void warmCache();
|
|
18
18
|
|
|
19
|
-
static std::string
|
|
20
|
-
|
|
21
|
-
return method(javaClassStatic())->toStdString();
|
|
22
|
-
}
|
|
19
|
+
static std::string getFilesDir();
|
|
20
|
+
static std::string getCacheDir();
|
|
23
21
|
};
|
|
24
22
|
|
|
25
23
|
} // namespace audioapi
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
#include <audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h>
|
|
3
3
|
#include <audioapi/core/sources/AudioBufferBaseSourceNode.h>
|
|
4
4
|
#include <audioapi/core/utils/Constants.h>
|
|
5
|
-
#include <audioapi/
|
|
5
|
+
#include <audioapi/dsp/WsolaTimeStretcher.h>
|
|
6
6
|
#include <audioapi/types/NodeOptions.h>
|
|
7
7
|
|
|
8
8
|
#include <algorithm>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include <audioapi/core/sources/AudioScheduledSourceNode.h>
|
|
4
|
-
#include <audioapi/
|
|
4
|
+
#include <audioapi/dsp/WsolaTimeStretcher.h>
|
|
5
5
|
#include <audioapi/utils/AudioBuffer.hpp>
|
|
6
6
|
#include <audioapi/utils/events/PositionChangedDispatcher.h>
|
|
7
7
|
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
#include <audioapi/core/AudioNode.h>
|
|
4
4
|
#include <audioapi/core/sources/AudioScheduledSourceNode.h>
|
|
5
|
-
#include <audioapi/core/utils/WsolaTimeStretcher.h>
|
|
6
5
|
#include <audioapi/core/utils/decoding/SeekDecoderDaemon.h>
|
|
6
|
+
#include <audioapi/dsp/WsolaTimeStretcher.h>
|
|
7
7
|
#include <audioapi/libs/decoding/IncrementalAudioDecoder.h>
|
|
8
8
|
#include <audioapi/types/NodeOptions.h>
|
|
9
9
|
#include <audioapi/utils/events/PositionChangedDispatcher.h>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include <audioapi/core/utils/Constants.h>
|
|
4
|
-
#include <audioapi/
|
|
4
|
+
#include <audioapi/dsp/WsolaTimeStretcher.h>
|
|
5
5
|
#include <audioapi/libs/decoding/IncrementalAudioDecoder.h>
|
|
6
6
|
#if !RN_AUDIO_API_FFMPEG_DISABLED
|
|
7
7
|
#include <audioapi/libs/ffmpeg/FFmpegDecoding.h>
|
|
@@ -89,6 +89,21 @@ float maximumMagnitude(const float *inputVector, size_t numberOfElementsToProces
|
|
|
89
89
|
return maximumValue;
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
float dotProduct(
|
|
93
|
+
const float *inputVector1,
|
|
94
|
+
const float *inputVector2,
|
|
95
|
+
size_t numberOfElementsToProcess) {
|
|
96
|
+
float result = 0;
|
|
97
|
+
vDSP_dotpr(inputVector1, 1, inputVector2, 1, &result, numberOfElementsToProcess);
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
float sumOfSquares(const float *inputVector, size_t numberOfElementsToProcess) {
|
|
102
|
+
float result = 0;
|
|
103
|
+
vDSP_svesq(inputVector, 1, &result, numberOfElementsToProcess);
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
|
|
92
107
|
void multiplyByScalarThenAddToOutput(
|
|
93
108
|
const float *inputVector,
|
|
94
109
|
float scalar,
|
|
@@ -578,7 +593,7 @@ float maximumMagnitude(const float *inputVector, size_t numberOfElementsToProces
|
|
|
578
593
|
max = std::max(max, groupMaxP[3]);
|
|
579
594
|
|
|
580
595
|
n = tailFrames;
|
|
581
|
-
#elif defined(
|
|
596
|
+
#elif defined(HAVE_ARM_NEON_INTRINSICS)
|
|
582
597
|
size_t tailFrames = n % 4;
|
|
583
598
|
const float *endP = inputVector + n - tailFrames;
|
|
584
599
|
|
|
@@ -780,6 +795,71 @@ void interleaveStereo(
|
|
|
780
795
|
}
|
|
781
796
|
}
|
|
782
797
|
|
|
798
|
+
float dotProduct(
|
|
799
|
+
const float *inputVector1,
|
|
800
|
+
const float *inputVector2,
|
|
801
|
+
size_t numberOfElementsToProcess) {
|
|
802
|
+
size_t n = numberOfElementsToProcess;
|
|
803
|
+
size_t i = 0;
|
|
804
|
+
float sum = 0.0f;
|
|
805
|
+
|
|
806
|
+
#ifdef HAVE_X86_SSE2
|
|
807
|
+
__m128 acc = _mm_setzero_ps();
|
|
808
|
+
for (; i + 4 <= n; i += 4) {
|
|
809
|
+
__m128 v1 = _mm_loadu_ps(inputVector1 + i);
|
|
810
|
+
__m128 v2 = _mm_loadu_ps(inputVector2 + i);
|
|
811
|
+
acc = _mm_add_ps(acc, _mm_mul_ps(v1, v2));
|
|
812
|
+
}
|
|
813
|
+
float lanes[4];
|
|
814
|
+
_mm_storeu_ps(lanes, acc);
|
|
815
|
+
sum = lanes[0] + lanes[1] + lanes[2] + lanes[3];
|
|
816
|
+
#elif defined(HAVE_ARM_NEON_INTRINSICS)
|
|
817
|
+
float32x4_t acc = vdupq_n_f32(0.0f);
|
|
818
|
+
for (; i + 4 <= n; i += 4) {
|
|
819
|
+
float32x4_t v1 = vld1q_f32(inputVector1 + i);
|
|
820
|
+
float32x4_t v2 = vld1q_f32(inputVector2 + i);
|
|
821
|
+
acc = vmlaq_f32(acc, v1, v2);
|
|
822
|
+
}
|
|
823
|
+
float32x2_t pair = vadd_f32(vget_low_f32(acc), vget_high_f32(acc));
|
|
824
|
+
sum = vget_lane_f32(vpadd_f32(pair, pair), 0);
|
|
825
|
+
#endif
|
|
826
|
+
|
|
827
|
+
for (; i < n; ++i) {
|
|
828
|
+
sum += inputVector1[i] * inputVector2[i];
|
|
829
|
+
}
|
|
830
|
+
return sum;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
float sumOfSquares(const float *inputVector, size_t numberOfElementsToProcess) {
|
|
834
|
+
size_t n = numberOfElementsToProcess;
|
|
835
|
+
size_t i = 0;
|
|
836
|
+
float sum = 0.0f;
|
|
837
|
+
|
|
838
|
+
#ifdef HAVE_X86_SSE2
|
|
839
|
+
__m128 acc = _mm_setzero_ps();
|
|
840
|
+
for (; i + 4 <= n; i += 4) {
|
|
841
|
+
__m128 v = _mm_loadu_ps(inputVector + i);
|
|
842
|
+
acc = _mm_add_ps(acc, _mm_mul_ps(v, v));
|
|
843
|
+
}
|
|
844
|
+
float lanes[4];
|
|
845
|
+
_mm_storeu_ps(lanes, acc);
|
|
846
|
+
sum = lanes[0] + lanes[1] + lanes[2] + lanes[3];
|
|
847
|
+
#elif defined(HAVE_ARM_NEON_INTRINSICS)
|
|
848
|
+
float32x4_t acc = vdupq_n_f32(0.0f);
|
|
849
|
+
for (; i + 4 <= n; i += 4) {
|
|
850
|
+
float32x4_t v = vld1q_f32(inputVector + i);
|
|
851
|
+
acc = vmlaq_f32(acc, v, v);
|
|
852
|
+
}
|
|
853
|
+
float32x2_t pair = vadd_f32(vget_low_f32(acc), vget_high_f32(acc));
|
|
854
|
+
sum = vget_lane_f32(vpadd_f32(pair, pair), 0);
|
|
855
|
+
#endif
|
|
856
|
+
|
|
857
|
+
for (; i < n; ++i) {
|
|
858
|
+
sum += inputVector[i] * inputVector[i];
|
|
859
|
+
}
|
|
860
|
+
return sum;
|
|
861
|
+
}
|
|
862
|
+
|
|
783
863
|
#endif
|
|
784
864
|
|
|
785
865
|
} // namespace audioapi::dsp
|
|
@@ -67,6 +67,15 @@ void multiply(
|
|
|
67
67
|
// Finds the maximum magnitude of a float vector.
|
|
68
68
|
float maximumMagnitude(const float *inputVector, size_t numberOfElementsToProcess);
|
|
69
69
|
|
|
70
|
+
// Returns the dot product of two float vectors (sum of element-wise products).
|
|
71
|
+
float dotProduct(
|
|
72
|
+
const float *inputVector1,
|
|
73
|
+
const float *inputVector2,
|
|
74
|
+
size_t numberOfElementsToProcess);
|
|
75
|
+
|
|
76
|
+
// Returns the sum of squares of a float vector
|
|
77
|
+
float sumOfSquares(const float *inputVector, size_t numberOfElementsToProcess);
|
|
78
|
+
|
|
70
79
|
void interleaveStereo(
|
|
71
80
|
const float *inputLeft,
|
|
72
81
|
const float *inputRight,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#include <audioapi/core/utils/Constants.h>
|
|
2
|
-
#include <audioapi/
|
|
2
|
+
#include <audioapi/dsp/VectorMath.h>
|
|
3
|
+
#include <audioapi/dsp/WsolaTimeStretcher.h>
|
|
3
4
|
|
|
4
5
|
#include <algorithm>
|
|
5
6
|
#include <cmath>
|
|
@@ -56,6 +57,9 @@ void WsolaTimeStretcher::configure(size_t channels, float sampleRate) {
|
|
|
56
57
|
targetBlock_.assign(channels_, std::vector<float>(windowSize_, 0.0f));
|
|
57
58
|
optimalBlock_.assign(channels_, std::vector<float>(windowSize_, 0.0f));
|
|
58
59
|
targetEnergy_.assign(channels_, 0.0f);
|
|
60
|
+
// Search span covers every candidate offset [0, searchIntervalFrames_) plus a
|
|
61
|
+
// full trailing window, so any candidate slice stays in bounds.
|
|
62
|
+
searchSpan_.assign(channels_, std::vector<float>(searchIntervalFrames_ + windowSize_, 0.0f));
|
|
59
63
|
|
|
60
64
|
reset();
|
|
61
65
|
}
|
|
@@ -266,9 +270,20 @@ bool WsolaTimeStretcher::targetIsWithinSearchRegion() const {
|
|
|
266
270
|
targetBlockIndex_ + static_cast<int>(windowSize_) <= searchBlockIndex_ + searchBlockSize;
|
|
267
271
|
}
|
|
268
272
|
|
|
273
|
+
void WsolaTimeStretcher::fillSearchSpan() {
|
|
274
|
+
const size_t spanLength = searchIntervalFrames_ + windowSize_;
|
|
275
|
+
for (size_t channel = 0; channel < channels_; ++channel) {
|
|
276
|
+
auto &span = searchSpan_[channel];
|
|
277
|
+
for (size_t j = 0; j < spanLength; ++j) {
|
|
278
|
+
span[j] = sampleAt(channel, searchBlockIndex_ + static_cast<int>(j));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
269
283
|
int WsolaTimeStretcher::findOptimalBlockIndex() {
|
|
270
284
|
fillBlock(targetBlock_, targetBlockIndex_);
|
|
271
285
|
computeTargetEnergy();
|
|
286
|
+
fillSearchSpan();
|
|
272
287
|
|
|
273
288
|
const int candidateCount = static_cast<int>(searchIntervalFrames_);
|
|
274
289
|
if (candidateCount <= 1) {
|
|
@@ -322,18 +337,15 @@ int WsolaTimeStretcher::findOptimalBlockIndex() {
|
|
|
322
337
|
|
|
323
338
|
float WsolaTimeStretcher::similarityAt(int candidateIndex) const {
|
|
324
339
|
static constexpr float EPSILON = 1e-12f;
|
|
340
|
+
const int offset = candidateIndex - searchBlockIndex_;
|
|
325
341
|
float score = 0.0f;
|
|
326
342
|
|
|
327
343
|
for (size_t channel = 0; channel < channels_; ++channel) {
|
|
328
|
-
float
|
|
329
|
-
float
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
const float candidate = sampleAt(channel, candidateIndex + static_cast<int>(frame));
|
|
334
|
-
dot += target * candidate;
|
|
335
|
-
candidateEnergy += candidate * candidate;
|
|
336
|
-
}
|
|
344
|
+
const float *target = targetBlock_[channel].data();
|
|
345
|
+
const float *candidate = searchSpan_[channel].data() + offset;
|
|
346
|
+
|
|
347
|
+
const float dot = dsp::dotProduct(target, candidate, windowSize_);
|
|
348
|
+
const float candidateEnergy = dsp::sumOfSquares(candidate, windowSize_);
|
|
337
349
|
|
|
338
350
|
score += dot / std::sqrt(targetEnergy_[channel] * candidateEnergy + EPSILON);
|
|
339
351
|
}
|
|
@@ -387,12 +399,7 @@ void WsolaTimeStretcher::fillBlock(std::vector<std::vector<float>> &block, int f
|
|
|
387
399
|
|
|
388
400
|
void WsolaTimeStretcher::computeTargetEnergy() {
|
|
389
401
|
for (size_t channel = 0; channel < channels_; ++channel) {
|
|
390
|
-
|
|
391
|
-
for (size_t frame = 0; frame < windowSize_; frame += SIMILARITY_FRAME_STRIDE) {
|
|
392
|
-
const float value = targetBlock_[channel][frame];
|
|
393
|
-
energy += value * value;
|
|
394
|
-
}
|
|
395
|
-
targetEnergy_[channel] = energy;
|
|
402
|
+
targetEnergy_[channel] = dsp::sumOfSquares(targetBlock_[channel].data(), windowSize_);
|
|
396
403
|
}
|
|
397
404
|
}
|
|
398
405
|
|
|
@@ -48,11 +48,7 @@ class WsolaTimeStretcher {
|
|
|
48
48
|
private:
|
|
49
49
|
static constexpr float OLA_WINDOW_MS = 20.0f;
|
|
50
50
|
static constexpr float SEARCH_INTERVAL_MS = 30.0f;
|
|
51
|
-
// Chromium uses a denser decimated search, but pairs it with SIMD dot products
|
|
52
|
-
// and precomputed moving energies. This lighter search keeps iOS route changes
|
|
53
|
-
// from overloading the real-time audio callback in the current implementation.
|
|
54
51
|
static constexpr size_t SEARCH_DECIMATION = 12;
|
|
55
|
-
static constexpr size_t SIMILARITY_FRAME_STRIDE = 4;
|
|
56
52
|
static constexpr size_t QUEUE_COMPACT_THRESHOLD_FRAMES = 4096;
|
|
57
53
|
|
|
58
54
|
size_t channels_{0};
|
|
@@ -82,6 +78,11 @@ class WsolaTimeStretcher {
|
|
|
82
78
|
std::vector<std::vector<float>> targetBlock_;
|
|
83
79
|
std::vector<std::vector<float>> optimalBlock_;
|
|
84
80
|
std::vector<float> targetEnergy_;
|
|
81
|
+
// Contiguous, pitch-resampled copy of the current search region per channel.
|
|
82
|
+
// Materialized once per findOptimalBlockIndex() so every candidate window is a
|
|
83
|
+
// contiguous slice, enabling SIMD cross-correlation instead of per-sample
|
|
84
|
+
// interpolation inside the search loop.
|
|
85
|
+
std::vector<std::vector<float>> searchSpan_;
|
|
85
86
|
|
|
86
87
|
void appendInput(const DSPAudioBuffer &input, size_t inputFrames);
|
|
87
88
|
size_t availableOutputFrames() const;
|
|
@@ -91,6 +92,7 @@ class WsolaTimeStretcher {
|
|
|
91
92
|
bool canRunIteration() const;
|
|
92
93
|
bool targetIsWithinSearchRegion() const;
|
|
93
94
|
int findOptimalBlockIndex();
|
|
95
|
+
void fillSearchSpan();
|
|
94
96
|
float similarityAt(int candidateIndex) const;
|
|
95
97
|
[[nodiscard]] int maxSourceIndexForBlock(int blockStartFrame) const;
|
|
96
98
|
float sampleAt(size_t channel, int frameIndex) const;
|
|
@@ -36,7 +36,9 @@ OpenFileResult IOSRotatingFileWriter::openFile(
|
|
|
36
36
|
{
|
|
37
37
|
streamFormat_ = streamFormat;
|
|
38
38
|
streamMaxBufferSizeInFrames_ = streamMaxBufferSizeInFrames;
|
|
39
|
-
|
|
39
|
+
if (!fileNameOverride.empty()) {
|
|
40
|
+
fileProperties_->fileNamePrefix = fileNameOverride + fileProperties_->fileNamePrefix;
|
|
41
|
+
}
|
|
40
42
|
if (currentWriter_ == nullptr) {
|
|
41
43
|
currentWriter_ = writerFactory_(fileProperties_);
|
|
42
44
|
}
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
@interface AudioEngine () {
|
|
27
27
|
std::mutex _engineLock;
|
|
28
|
+
BOOL _isRebuildingAudioEngine;
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
@property (nonatomic, strong)
|
|
@@ -408,15 +409,24 @@ static AudioEngine *_sharedInstance = nil;
|
|
|
408
409
|
|
|
409
410
|
- (void)rebuildAudioEngineAndResumeIfNeeded
|
|
410
411
|
{
|
|
412
|
+
if (_isRebuildingAudioEngine) {
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
_isRebuildingAudioEngine = YES;
|
|
417
|
+
|
|
411
418
|
if ([self.audioEngine isRunning]) {
|
|
412
419
|
[self.audioEngine stop];
|
|
413
420
|
}
|
|
414
421
|
|
|
415
422
|
[self rebuildAudioEngine];
|
|
423
|
+
self.sessionDeactivationInvalidatedGraph = false;
|
|
416
424
|
|
|
417
425
|
if (self.state == AudioEngineState::AudioEngineStateRunning) {
|
|
418
426
|
[self startEngine];
|
|
419
427
|
}
|
|
428
|
+
|
|
429
|
+
_isRebuildingAudioEngine = NO;
|
|
420
430
|
}
|
|
421
431
|
|
|
422
432
|
- (void)rebuildAudioEngine
|
|
@@ -19,9 +19,15 @@ class AudioBufferSourceNode {
|
|
|
19
19
|
start(when = 0, offset, duration) {
|
|
20
20
|
this.node.start(when, offset, duration);
|
|
21
21
|
}
|
|
22
|
-
stop(when
|
|
22
|
+
stop(when) {
|
|
23
23
|
this.node.stop(when);
|
|
24
24
|
}
|
|
25
|
+
get onEnded() {
|
|
26
|
+
return this.node.onEnded;
|
|
27
|
+
}
|
|
28
|
+
set onEnded(callback) {
|
|
29
|
+
this.node.onEnded = callback;
|
|
30
|
+
}
|
|
25
31
|
get detune() {
|
|
26
32
|
return this.node.detune;
|
|
27
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_custom","require","_utils","AudioBufferSourceNode","constructor","context","options","node","pitchCorrection","AudioBufferSourceNodeStretcher","AudioBufferSourceNodeStandard","connect","destination","disconnect","start","when","offset","duration","stop","detune","playbackRate","buffer","loop","value","loopStart","loopEnd","loopSkip","onLoopEnded","
|
|
1
|
+
{"version":3,"names":["_custom","require","_utils","AudioBufferSourceNode","constructor","context","options","node","pitchCorrection","AudioBufferSourceNodeStretcher","AudioBufferSourceNodeStandard","connect","destination","disconnect","start","when","offset","duration","stop","onEnded","callback","detune","playbackRate","buffer","loop","value","loopStart","loopEnd","loopSkip","onLoopEnded","exports","default"],"sourceRoot":"../../../src","sources":["web-core/AudioBufferSourceNode.web.ts"],"mappings":";;;;;;AAMA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAEe,MAAME,qBAAqB,CAAC;EAGzCC,WAAWA,CAACC,OAAyB,EAAEC,OAAkC,EAAE;IACzE,IAAI,CAACC,IAAI,GAAGD,OAAO,EAAEE,eAAe,GAChC,IAAIC,sCAA8B,CAACJ,OAAO,EAAEC,OAAO,CAAC,GACpD,IAAII,oCAA6B,CAACL,OAAO,EAAEC,OAAO,CAAC;EACzD;EAEAK,OAAOA,CAACC,WAAmC,EAA0B;IACnE,OAAO,IAAI,CAACL,IAAI,CAACI,OAAO,CAACC,WAAW,CAAC;EACvC;EAEAC,UAAUA,CAACD,WAAoC,EAAQ;IACrD,IAAI,CAACL,IAAI,CAACM,UAAU,CAACD,WAAW,CAAC;EACnC;EAEAE,KAAKA,CAACC,IAAY,GAAG,CAAC,EAAEC,MAAe,EAAEC,QAAiB,EAAQ;IAChE,IAAI,CAACV,IAAI,CAACO,KAAK,CAACC,IAAI,EAAEC,MAAM,EAAEC,QAAQ,CAAC;EACzC;EAEAC,IAAIA,CAACH,IAAa,EAAQ;IACxB,IAAI,CAACR,IAAI,CAACW,IAAI,CAACH,IAAI,CAAC;EACtB;EAEA,IAAII,OAAOA,CAAA,EAAoC;IAC7C,OAAO,IAAI,CAACZ,IAAI,CAACY,OAAO;EAC1B;EAEA,IAAIA,OAAOA,CAACC,QAAyC,EAAE;IACrD,IAAI,CAACb,IAAI,CAACY,OAAO,GAAGC,QAAQ;EAC9B;EAEA,IAAIC,MAAMA,CAAA,EAAe;IACvB,OAAO,IAAI,CAACd,IAAI,CAACc,MAAM;EACzB;EAEA,IAAIC,YAAYA,CAAA,EAAe;IAC7B,OAAO,IAAI,CAACf,IAAI,CAACe,YAAY;EAC/B;EAEA,IAAIC,MAAMA,CAAA,EAAuB;IAC/B,OAAO,IAAI,CAAChB,IAAI,CAACgB,MAAM;EACzB;EAEA,IAAIA,MAAMA,CAACA,MAA0B,EAAE;IACrC,IAAI,CAAChB,IAAI,CAACgB,MAAM,GAAGA,MAAM;EAC3B;EAEA,IAAIC,IAAIA,CAAA,EAAY;IAClB,OAAO,IAAI,CAACjB,IAAI,CAACiB,IAAI;EACvB;EAEA,IAAIA,IAAIA,CAACC,KAAc,EAAE;IACvB,IAAI,CAAClB,IAAI,CAACiB,IAAI,GAAGC,KAAK;EACxB;EAEA,IAAIC,SAASA,CAAA,EAAW;IACtB,OAAO,IAAI,CAACnB,IAAI,CAACmB,SAAS;EAC5B;EAEA,IAAIA,SAASA,CAACD,KAAa,EAAE;IAC3B,IAAI,CAAClB,IAAI,CAACmB,SAAS,GAAGD,KAAK;EAC7B;EAEA,IAAIE,OAAOA,CAAA,EAAW;IACpB,OAAO,IAAI,CAACpB,IAAI,CAACoB,OAAO;EAC1B;EAEA,IAAIA,OAAOA,CAACF,KAAa,EAAE;IACzB,IAAI,CAAClB,IAAI,CAACoB,OAAO,GAAGF,KAAK;EAC3B;EAEA,IAAIG,QAAQA,CAAA,EAAY;IACtB,OAAO,IAAI,CAACrB,IAAI,CAACqB,QAAQ;EAC3B;EAEA,IAAIA,QAAQA,CAACH,KAAc,EAAE;IAC3B,IAAI,CAAClB,IAAI,CAACqB,QAAQ,GAAGH,KAAK;EAC5B;EAEA,IAAII,WAAWA,CAAA,EAA0C;IACvD,OAAO,IAAI,CAACtB,IAAI,CAACsB,WAAW;EAC9B;EAEA,IAAIA,WAAWA,CAACT,QAA0C,EAAE;IAC1D,IAAI,CAACb,IAAI,CAACsB,WAAW,GAAGT,QAAQ;EAClC;AACF;AAACU,OAAA,CAAAC,OAAA,GAAA5B,qBAAA","ignoreList":[]}
|
|
@@ -67,10 +67,8 @@ class AudioContext {
|
|
|
67
67
|
feedback
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
|
-
createBufferSource(
|
|
71
|
-
return new _AudioBufferSourceNode.default(this,
|
|
72
|
-
pitchCorrection
|
|
73
|
-
});
|
|
70
|
+
createBufferSource(options) {
|
|
71
|
+
return new _AudioBufferSourceNode.default(this, options);
|
|
74
72
|
}
|
|
75
73
|
createMediaElementSource(mediaElement) {
|
|
76
74
|
return new _MediaElementAudioSourceNode.default(this, this.context.createMediaElementSource(mediaElement), mediaElement);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_errors","require","_AnalyserNode","_interopRequireDefault","_AudioBuffer","_AudioBufferSourceNode","_AudioDestinationNode","_BiquadFilterNode","_ConvolverNode","_DelayNode","_GainNode","_IIRFilterNode","_MediaElementAudioSourceNode","_OscillatorNode","_PeriodicWave","_StereoPannerNode","_ConstantSourceNode","_WaveShaperNode","e","__esModule","default","AudioContext","constructor","options","sampleRate","NotSupportedError","context","window","destination","AudioDestinationNode","currentTime","state","createOscillator","OscillatorNode","createConstantSource","ConstantSourceNode","createGain","GainNode","createDelay","maxDelayTime","DelayNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createConvolver","ConvolverNode","createIIRFilter","feedforward","feedback","IIRFilterNode","createBufferSource","
|
|
1
|
+
{"version":3,"names":["_errors","require","_AnalyserNode","_interopRequireDefault","_AudioBuffer","_AudioBufferSourceNode","_AudioDestinationNode","_BiquadFilterNode","_ConvolverNode","_DelayNode","_GainNode","_IIRFilterNode","_MediaElementAudioSourceNode","_OscillatorNode","_PeriodicWave","_StereoPannerNode","_ConstantSourceNode","_WaveShaperNode","e","__esModule","default","AudioContext","constructor","options","sampleRate","NotSupportedError","context","window","destination","AudioDestinationNode","currentTime","state","createOscillator","OscillatorNode","createConstantSource","ConstantSourceNode","createGain","GainNode","createDelay","maxDelayTime","DelayNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createConvolver","ConvolverNode","createIIRFilter","feedforward","feedback","IIRFilterNode","createBufferSource","AudioBufferSourceNode","createMediaElementSource","mediaElement","MediaElementAudioSourceNode","createBuffer","numberOfChannels","length","AudioBuffer","createPeriodicWave","real","imag","constraints","InvalidAccessError","PeriodicWave","createAnalyser","AnalyserNode","createWaveShaper","WaveShaperNode","decodeAudioData","source","fetchOptions","ArrayBuffer","decodedData","response","fetch","ok","arrayBuffer","TypeError","close","resume","suspend","exports"],"sourceRoot":"../../../src","sources":["web-core/AudioContext.web.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -67,10 +67,8 @@ class OfflineAudioContext {
|
|
|
67
67
|
feedback
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
|
-
createBufferSource(
|
|
71
|
-
return new _AudioBufferSourceNode.default(this,
|
|
72
|
-
pitchCorrection
|
|
73
|
-
});
|
|
70
|
+
createBufferSource(options) {
|
|
71
|
+
return new _AudioBufferSourceNode.default(this, options);
|
|
74
72
|
}
|
|
75
73
|
createBuffer(numberOfChannels, length, sampleRate) {
|
|
76
74
|
if (numberOfChannels < 1 || numberOfChannels >= 32) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_errors","require","_AnalyserNode","_interopRequireDefault","_AudioDestinationNode","_AudioBuffer","_AudioBufferSourceNode","_BiquadFilterNode","_IIRFilterNode","_GainNode","_OscillatorNode","_PeriodicWave","_StereoPannerNode","_ConstantSourceNode","_WaveShaperNode","_ConvolverNode","_DelayNode","e","__esModule","default","OfflineAudioContext","constructor","arg0","arg1","arg2","context","window","NotSupportedError","sampleRate","destination","AudioDestinationNode","currentTime","state","createOscillator","OscillatorNode","createConstantSource","ConstantSourceNode","createGain","GainNode","createDelay","maxDelayTime","DelayNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createConvolver","ConvolverNode","createIIRFilter","feedforward","feedback","IIRFilterNode","createBufferSource","
|
|
1
|
+
{"version":3,"names":["_errors","require","_AnalyserNode","_interopRequireDefault","_AudioDestinationNode","_AudioBuffer","_AudioBufferSourceNode","_BiquadFilterNode","_IIRFilterNode","_GainNode","_OscillatorNode","_PeriodicWave","_StereoPannerNode","_ConstantSourceNode","_WaveShaperNode","_ConvolverNode","_DelayNode","e","__esModule","default","OfflineAudioContext","constructor","arg0","arg1","arg2","context","window","NotSupportedError","sampleRate","destination","AudioDestinationNode","currentTime","state","createOscillator","OscillatorNode","createConstantSource","ConstantSourceNode","createGain","GainNode","createDelay","maxDelayTime","DelayNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createConvolver","ConvolverNode","createIIRFilter","feedforward","feedback","IIRFilterNode","createBufferSource","options","AudioBufferSourceNode","createBuffer","numberOfChannels","length","AudioBuffer","createPeriodicWave","real","imag","constraints","InvalidAccessError","PeriodicWave","createAnalyser","AnalyserNode","createWaveShaper","WaveShaperNode","decodeAudioDataSource","source","arrayBuffer","fetch","then","response","decodeAudioData","startRendering","resume","suspend","suspendTime","exports"],"sourceRoot":"../../../src","sources":["web-core/OfflineAudioContext.web.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,6 +9,13 @@ Object.defineProperty(exports, "AudioBufferSourceNodeStretcher", {
|
|
|
9
9
|
return _AudioBufferSourceNodeStretcher.default;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
+
Object.defineProperty(exports, "LoadCustomWasm", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _LoadCustomWasm.default;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
12
18
|
var _AudioBufferSourceNodeStretcher = _interopRequireDefault(require("./wasm-audio-bufffer-source-node-stretcher/AudioBufferSourceNodeStretcher"));
|
|
19
|
+
var _LoadCustomWasm = _interopRequireDefault(require("./wasm-audio-bufffer-source-node-stretcher/LoadCustomWasm"));
|
|
13
20
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioBufferSourceNodeStretcher","_interopRequireDefault","require","e","__esModule","default"],"sourceRoot":"../../../../src","sources":["web-core/custom/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_AudioBufferSourceNodeStretcher","_interopRequireDefault","require","_LoadCustomWasm","e","__esModule","default"],"sourceRoot":"../../../../src","sources":["web-core/custom/index.ts"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAAA,+BAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAsG,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}
|