@drutech/react-native-audio-analyzer 1.1.1-alpha.1
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/LICENSE +20 -0
- package/README.md +124 -0
- package/android/CMakeCache.txt +372 -0
- package/android/CMakeLists.txt +44 -0
- package/android/Makefile +211 -0
- package/android/build.gradle +110 -0
- package/android/cmake_install.cmake +49 -0
- package/android/cpp-adapter.cpp +40 -0
- package/android/ffmpeg_16kb/include/config.h +749 -0
- package/android/ffmpeg_16kb/include/libavcodec/ac3_parser.h +36 -0
- package/android/ffmpeg_16kb/include/libavcodec/adts_parser.h +37 -0
- package/android/ffmpeg_16kb/include/libavcodec/arm/mathops.h +108 -0
- package/android/ffmpeg_16kb/include/libavcodec/avcodec.h +3192 -0
- package/android/ffmpeg_16kb/include/libavcodec/avdct.h +88 -0
- package/android/ffmpeg_16kb/include/libavcodec/avfft.h +118 -0
- package/android/ffmpeg_16kb/include/libavcodec/bsf.h +332 -0
- package/android/ffmpeg_16kb/include/libavcodec/codec.h +375 -0
- package/android/ffmpeg_16kb/include/libavcodec/codec_desc.h +128 -0
- package/android/ffmpeg_16kb/include/libavcodec/codec_id.h +661 -0
- package/android/ffmpeg_16kb/include/libavcodec/codec_par.h +247 -0
- package/android/ffmpeg_16kb/include/libavcodec/d3d11va.h +112 -0
- package/android/ffmpeg_16kb/include/libavcodec/defs.h +192 -0
- package/android/ffmpeg_16kb/include/libavcodec/dirac.h +131 -0
- package/android/ffmpeg_16kb/include/libavcodec/dv_profile.h +82 -0
- package/android/ffmpeg_16kb/include/libavcodec/dxva2.h +93 -0
- package/android/ffmpeg_16kb/include/libavcodec/jni.h +46 -0
- package/android/ffmpeg_16kb/include/libavcodec/mathops.h +255 -0
- package/android/ffmpeg_16kb/include/libavcodec/mediacodec.h +103 -0
- package/android/ffmpeg_16kb/include/libavcodec/packet.h +731 -0
- package/android/ffmpeg_16kb/include/libavcodec/qsv.h +109 -0
- package/android/ffmpeg_16kb/include/libavcodec/vdpau.h +157 -0
- package/android/ffmpeg_16kb/include/libavcodec/version.h +45 -0
- package/android/ffmpeg_16kb/include/libavcodec/version_major.h +52 -0
- package/android/ffmpeg_16kb/include/libavcodec/videotoolbox.h +150 -0
- package/android/ffmpeg_16kb/include/libavcodec/vorbis_parser.h +74 -0
- package/android/ffmpeg_16kb/include/libavcodec/x86/mathops.h +133 -0
- package/android/ffmpeg_16kb/include/libavcodec/xvmc.h +171 -0
- package/android/ffmpeg_16kb/include/libavdevice/avdevice.h +397 -0
- package/android/ffmpeg_16kb/include/libavdevice/version.h +45 -0
- package/android/ffmpeg_16kb/include/libavdevice/version_major.h +36 -0
- package/android/ffmpeg_16kb/include/libavfilter/avfilter.h +1491 -0
- package/android/ffmpeg_16kb/include/libavfilter/buffersink.h +173 -0
- package/android/ffmpeg_16kb/include/libavfilter/buffersrc.h +218 -0
- package/android/ffmpeg_16kb/include/libavfilter/version.h +48 -0
- package/android/ffmpeg_16kb/include/libavfilter/version_major.h +38 -0
- package/android/ffmpeg_16kb/include/libavformat/avformat.h +2826 -0
- package/android/ffmpeg_16kb/include/libavformat/avio.h +837 -0
- package/android/ffmpeg_16kb/include/libavformat/network.h +341 -0
- package/android/ffmpeg_16kb/include/libavformat/os_support.h +317 -0
- package/android/ffmpeg_16kb/include/libavformat/url.h +409 -0
- package/android/ffmpeg_16kb/include/libavformat/version.h +47 -0
- package/android/ffmpeg_16kb/include/libavformat/version_major.h +52 -0
- package/android/ffmpeg_16kb/include/libavutil/aarch64/timer.h +50 -0
- package/android/ffmpeg_16kb/include/libavutil/adler32.h +63 -0
- package/android/ffmpeg_16kb/include/libavutil/aes.h +69 -0
- package/android/ffmpeg_16kb/include/libavutil/aes_ctr.h +99 -0
- package/android/ffmpeg_16kb/include/libavutil/ambient_viewing_environment.h +72 -0
- package/android/ffmpeg_16kb/include/libavutil/arm/timer.h +46 -0
- package/android/ffmpeg_16kb/include/libavutil/attributes.h +173 -0
- package/android/ffmpeg_16kb/include/libavutil/attributes_internal.h +34 -0
- package/android/ffmpeg_16kb/include/libavutil/audio_fifo.h +186 -0
- package/android/ffmpeg_16kb/include/libavutil/avassert.h +75 -0
- package/android/ffmpeg_16kb/include/libavutil/avconfig.h +6 -0
- package/android/ffmpeg_16kb/include/libavutil/avstring.h +429 -0
- package/android/ffmpeg_16kb/include/libavutil/avutil.h +371 -0
- package/android/ffmpeg_16kb/include/libavutil/base64.h +72 -0
- package/android/ffmpeg_16kb/include/libavutil/blowfish.h +82 -0
- package/android/ffmpeg_16kb/include/libavutil/bprint.h +251 -0
- package/android/ffmpeg_16kb/include/libavutil/bswap.h +111 -0
- package/android/ffmpeg_16kb/include/libavutil/buffer.h +322 -0
- package/android/ffmpeg_16kb/include/libavutil/camellia.h +70 -0
- package/android/ffmpeg_16kb/include/libavutil/cast5.h +80 -0
- package/android/ffmpeg_16kb/include/libavutil/channel_layout.h +783 -0
- package/android/ffmpeg_16kb/include/libavutil/common.h +578 -0
- package/android/ffmpeg_16kb/include/libavutil/cpu.h +134 -0
- package/android/ffmpeg_16kb/include/libavutil/crc.h +102 -0
- package/android/ffmpeg_16kb/include/libavutil/csp.h +150 -0
- package/android/ffmpeg_16kb/include/libavutil/des.h +81 -0
- package/android/ffmpeg_16kb/include/libavutil/detection_bbox.h +108 -0
- package/android/ffmpeg_16kb/include/libavutil/dict.h +241 -0
- package/android/ffmpeg_16kb/include/libavutil/display.h +109 -0
- package/android/ffmpeg_16kb/include/libavutil/dovi_meta.h +236 -0
- package/android/ffmpeg_16kb/include/libavutil/downmix_info.h +115 -0
- package/android/ffmpeg_16kb/include/libavutil/encryption_info.h +205 -0
- package/android/ffmpeg_16kb/include/libavutil/error.h +128 -0
- package/android/ffmpeg_16kb/include/libavutil/eval.h +140 -0
- package/android/ffmpeg_16kb/include/libavutil/ffversion.h +5 -0
- package/android/ffmpeg_16kb/include/libavutil/fifo.h +448 -0
- package/android/ffmpeg_16kb/include/libavutil/file.h +115 -0
- package/android/ffmpeg_16kb/include/libavutil/film_grain_params.h +260 -0
- package/android/ffmpeg_16kb/include/libavutil/frame.h +964 -0
- package/android/ffmpeg_16kb/include/libavutil/getenv_utf8.h +86 -0
- package/android/ffmpeg_16kb/include/libavutil/hash.h +264 -0
- package/android/ffmpeg_16kb/include/libavutil/hdr_dynamic_metadata.h +343 -0
- package/android/ffmpeg_16kb/include/libavutil/hdr_dynamic_vivid_metadata.h +285 -0
- package/android/ffmpeg_16kb/include/libavutil/hmac.h +99 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext.h +610 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext_cuda.h +69 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext_d3d11va.h +178 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext_drm.h +169 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext_dxva2.h +75 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext_mediacodec.h +61 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext_opencl.h +100 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext_qsv.h +64 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext_vaapi.h +117 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext_vdpau.h +44 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext_videotoolbox.h +96 -0
- package/android/ffmpeg_16kb/include/libavutil/hwcontext_vulkan.h +281 -0
- package/android/ffmpeg_16kb/include/libavutil/imgutils.h +331 -0
- package/android/ffmpeg_16kb/include/libavutil/internal.h +190 -0
- package/android/ffmpeg_16kb/include/libavutil/intfloat.h +77 -0
- package/android/ffmpeg_16kb/include/libavutil/intreadwrite.h +644 -0
- package/android/ffmpeg_16kb/include/libavutil/lfg.h +81 -0
- package/android/ffmpeg_16kb/include/libavutil/libm.h +471 -0
- package/android/ffmpeg_16kb/include/libavutil/log.h +387 -0
- package/android/ffmpeg_16kb/include/libavutil/lzo.h +66 -0
- package/android/ffmpeg_16kb/include/libavutil/macros.h +80 -0
- package/android/ffmpeg_16kb/include/libavutil/mastering_display_metadata.h +128 -0
- package/android/ffmpeg_16kb/include/libavutil/mathematics.h +245 -0
- package/android/ffmpeg_16kb/include/libavutil/md5.h +89 -0
- package/android/ffmpeg_16kb/include/libavutil/mem.h +609 -0
- package/android/ffmpeg_16kb/include/libavutil/motion_vector.h +57 -0
- package/android/ffmpeg_16kb/include/libavutil/murmur3.h +115 -0
- package/android/ffmpeg_16kb/include/libavutil/opt.h +891 -0
- package/android/ffmpeg_16kb/include/libavutil/parseutils.h +197 -0
- package/android/ffmpeg_16kb/include/libavutil/pixdesc.h +435 -0
- package/android/ffmpeg_16kb/include/libavutil/pixelutils.h +51 -0
- package/android/ffmpeg_16kb/include/libavutil/pixfmt.h +691 -0
- package/android/ffmpeg_16kb/include/libavutil/random_seed.h +43 -0
- package/android/ffmpeg_16kb/include/libavutil/rational.h +221 -0
- package/android/ffmpeg_16kb/include/libavutil/rc4.h +69 -0
- package/android/ffmpeg_16kb/include/libavutil/replaygain.h +50 -0
- package/android/ffmpeg_16kb/include/libavutil/reverse.h +28 -0
- package/android/ffmpeg_16kb/include/libavutil/ripemd.h +83 -0
- package/android/ffmpeg_16kb/include/libavutil/samplefmt.h +269 -0
- package/android/ffmpeg_16kb/include/libavutil/sha.h +90 -0
- package/android/ffmpeg_16kb/include/libavutil/sha512.h +92 -0
- package/android/ffmpeg_16kb/include/libavutil/spherical.h +227 -0
- package/android/ffmpeg_16kb/include/libavutil/stereo3d.h +229 -0
- package/android/ffmpeg_16kb/include/libavutil/tea.h +71 -0
- package/android/ffmpeg_16kb/include/libavutil/thread.h +204 -0
- package/android/ffmpeg_16kb/include/libavutil/threadmessage.h +115 -0
- package/android/ffmpeg_16kb/include/libavutil/time.h +56 -0
- package/android/ffmpeg_16kb/include/libavutil/timecode.h +199 -0
- package/android/ffmpeg_16kb/include/libavutil/timer.h +156 -0
- package/android/ffmpeg_16kb/include/libavutil/timestamp.h +78 -0
- package/android/ffmpeg_16kb/include/libavutil/tree.h +137 -0
- package/android/ffmpeg_16kb/include/libavutil/twofish.h +70 -0
- package/android/ffmpeg_16kb/include/libavutil/tx.h +176 -0
- package/android/ffmpeg_16kb/include/libavutil/uuid.h +146 -0
- package/android/ffmpeg_16kb/include/libavutil/version.h +122 -0
- package/android/ffmpeg_16kb/include/libavutil/video_enc_params.h +171 -0
- package/android/ffmpeg_16kb/include/libavutil/x86/asm.h +154 -0
- package/android/ffmpeg_16kb/include/libavutil/x86/emms.h +58 -0
- package/android/ffmpeg_16kb/include/libavutil/x86/timer.h +50 -0
- package/android/ffmpeg_16kb/include/libavutil/xtea.h +94 -0
- package/android/ffmpeg_16kb/include/libswresample/swresample.h +650 -0
- package/android/ffmpeg_16kb/include/libswresample/version.h +46 -0
- package/android/ffmpeg_16kb/include/libswresample/version_major.h +31 -0
- package/android/ffmpeg_16kb/include/libswscale/swscale.h +436 -0
- package/android/ffmpeg_16kb/include/libswscale/version.h +44 -0
- package/android/ffmpeg_16kb/include/libswscale/version_major.h +35 -0
- package/android/ffmpeg_16kb/lib/arm64-v8a/libavcodec.so +0 -0
- package/android/ffmpeg_16kb/lib/arm64-v8a/libavdevice.so +0 -0
- package/android/ffmpeg_16kb/lib/arm64-v8a/libavfilter.so +0 -0
- package/android/ffmpeg_16kb/lib/arm64-v8a/libavformat.so +0 -0
- package/android/ffmpeg_16kb/lib/arm64-v8a/libavutil.so +0 -0
- package/android/ffmpeg_16kb/lib/arm64-v8a/libswresample.so +0 -0
- package/android/ffmpeg_16kb/lib/arm64-v8a/libswscale.so +0 -0
- package/android/ffmpeg_16kb/lib/armeabi-v7a/libavcodec_neon.so +0 -0
- package/android/ffmpeg_16kb/lib/armeabi-v7a/libavdevice_neon.so +0 -0
- package/android/ffmpeg_16kb/lib/armeabi-v7a/libavfilter_neon.so +0 -0
- package/android/ffmpeg_16kb/lib/armeabi-v7a/libavformat_neon.so +0 -0
- package/android/ffmpeg_16kb/lib/armeabi-v7a/libavutil_neon.so +0 -0
- package/android/ffmpeg_16kb/lib/armeabi-v7a/libswresample_neon.so +0 -0
- package/android/ffmpeg_16kb/lib/armeabi-v7a/libswscale_neon.so +0 -0
- package/android/ffmpeg_16kb/lib/x86/libavcodec.so +0 -0
- package/android/ffmpeg_16kb/lib/x86/libavdevice.so +0 -0
- package/android/ffmpeg_16kb/lib/x86/libavfilter.so +0 -0
- package/android/ffmpeg_16kb/lib/x86/libavformat.so +0 -0
- package/android/ffmpeg_16kb/lib/x86/libavutil.so +0 -0
- package/android/ffmpeg_16kb/lib/x86/libswresample.so +0 -0
- package/android/ffmpeg_16kb/lib/x86/libswscale.so +0 -0
- package/android/ffmpeg_16kb/lib/x86_64/libavcodec.so +0 -0
- package/android/ffmpeg_16kb/lib/x86_64/libavdevice.so +0 -0
- package/android/ffmpeg_16kb/lib/x86_64/libavfilter.so +0 -0
- package/android/ffmpeg_16kb/lib/x86_64/libavformat.so +0 -0
- package/android/ffmpeg_16kb/lib/x86_64/libavutil.so +0 -0
- package/android/ffmpeg_16kb/lib/x86_64/libswresample.so +0 -0
- package/android/ffmpeg_16kb/lib/x86_64/libswscale.so +0 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/audioanalyzer/AmplitudeData.java +20 -0
- package/android/src/main/java/com/audioanalyzer/AudioAnalyzerModule.java +52 -0
- package/android/src/main/java/com/audioanalyzer/AudioAnalyzerPackage.java +28 -0
- package/cpp/react-native-audio-analyzer.cpp +143 -0
- package/cpp/react-native-audio-analyzer.h +27 -0
- package/ios/AudioAnalyzer.h +19 -0
- package/ios/AudioAnalyzer.mm +43 -0
- package/lib/commonjs/helpers.js +34 -0
- package/lib/commonjs/helpers.js.map +1 -0
- package/lib/commonjs/helpers.test.js +49 -0
- package/lib/commonjs/helpers.test.js.map +1 -0
- package/lib/commonjs/index.js +35 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/module/helpers.js +27 -0
- package/lib/module/helpers.js.map +1 -0
- package/lib/module/helpers.test.js +47 -0
- package/lib/module/helpers.test.js.map +1 -0
- package/lib/module/index.js +15 -0
- package/lib/module/index.js.map +1 -0
- package/lib/typescript/src/helpers.d.ts +3 -0
- package/lib/typescript/src/helpers.d.ts.map +1 -0
- package/lib/typescript/src/helpers.test.d.ts +2 -0
- package/lib/typescript/src/helpers.test.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +7 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +163 -0
- package/react-native-audio-analyzer.podspec +44 -0
- package/src/helpers.test.ts +59 -0
- package/src/helpers.ts +34 -0
- package/src/index.tsx +30 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
package com.audioanalyzer;
|
|
2
|
+
|
|
3
|
+
import androidx.annotation.NonNull;
|
|
4
|
+
|
|
5
|
+
import com.facebook.react.bridge.Promise;
|
|
6
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
7
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
8
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
9
|
+
import com.facebook.react.bridge.WritableArray;
|
|
10
|
+
import com.facebook.react.bridge.WritableMap;
|
|
11
|
+
import com.facebook.react.bridge.WritableNativeArray;
|
|
12
|
+
import com.facebook.react.bridge.WritableNativeMap;
|
|
13
|
+
import com.facebook.react.module.annotations.ReactModule;
|
|
14
|
+
|
|
15
|
+
@ReactModule(name = AudioAnalyzerModule.NAME)
|
|
16
|
+
public class AudioAnalyzerModule extends ReactContextBaseJavaModule {
|
|
17
|
+
public static final String NAME = "AudioAnalyzer";
|
|
18
|
+
|
|
19
|
+
public AudioAnalyzerModule(ReactApplicationContext reactContext) {
|
|
20
|
+
super(reactContext);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
@NonNull
|
|
25
|
+
public String getName() {
|
|
26
|
+
return NAME;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
static {
|
|
30
|
+
System.loadLibrary("cpp");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private static native AmplitudeData[] analyzeAudio(String filepath);
|
|
34
|
+
|
|
35
|
+
@ReactMethod
|
|
36
|
+
public void analyzeAudio(String filepath, Promise promise) {
|
|
37
|
+
try {
|
|
38
|
+
AmplitudeData[] analyze = analyzeAudio(filepath);
|
|
39
|
+
|
|
40
|
+
WritableArray resultArray = new WritableNativeArray();
|
|
41
|
+
for (AmplitudeData data : analyze) {
|
|
42
|
+
WritableMap dataMap = new WritableNativeMap();
|
|
43
|
+
dataMap.putDouble("timeInSeconds", data.getTimeInSeconds());
|
|
44
|
+
dataMap.putDouble("amplitude", data.getAmplitude());
|
|
45
|
+
resultArray.pushMap(dataMap);
|
|
46
|
+
}
|
|
47
|
+
promise.resolve(resultArray);
|
|
48
|
+
} catch (Exception e) {
|
|
49
|
+
promise.reject(e);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
package com.audioanalyzer;
|
|
2
|
+
|
|
3
|
+
import androidx.annotation.NonNull;
|
|
4
|
+
|
|
5
|
+
import com.facebook.react.ReactPackage;
|
|
6
|
+
import com.facebook.react.bridge.NativeModule;
|
|
7
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
8
|
+
import com.facebook.react.uimanager.ViewManager;
|
|
9
|
+
|
|
10
|
+
import java.util.ArrayList;
|
|
11
|
+
import java.util.Collections;
|
|
12
|
+
import java.util.List;
|
|
13
|
+
|
|
14
|
+
public class AudioAnalyzerPackage implements ReactPackage {
|
|
15
|
+
@NonNull
|
|
16
|
+
@Override
|
|
17
|
+
public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
|
|
18
|
+
List<NativeModule> modules = new ArrayList<>();
|
|
19
|
+
modules.add(new AudioAnalyzerModule(reactContext));
|
|
20
|
+
return modules;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@NonNull
|
|
24
|
+
@Override
|
|
25
|
+
public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
|
|
26
|
+
return Collections.emptyList();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#include "react-native-audio-analyzer.h"
|
|
2
|
+
#include <vector>
|
|
3
|
+
#include <cmath>
|
|
4
|
+
#include <stdexcept>
|
|
5
|
+
|
|
6
|
+
extern "C" {
|
|
7
|
+
#include <libavformat/avformat.h>
|
|
8
|
+
#include <libavcodec/avcodec.h>
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
namespace audioanalyzer {
|
|
12
|
+
|
|
13
|
+
const char* FFmpegException::getMessage() const noexcept {
|
|
14
|
+
return message;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
std::vector<AmplitudeData> analyzeAudio(const char *filename, FFmpegException *errorPtr) {
|
|
18
|
+
std::vector<AmplitudeData> amplitudeData;
|
|
19
|
+
|
|
20
|
+
// Allocate memory for the AVFormatContext
|
|
21
|
+
AVFormatContext *formatContext = avformat_alloc_context();
|
|
22
|
+
if (!formatContext) {
|
|
23
|
+
*errorPtr = FFmpegException("Failed to allocate AVFormatContext");
|
|
24
|
+
return amplitudeData;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Open the input file
|
|
28
|
+
if (avformat_open_input(&formatContext, filename, nullptr, nullptr) != 0) {
|
|
29
|
+
avformat_free_context(formatContext);
|
|
30
|
+
*errorPtr = FFmpegException("Failed to open input file");
|
|
31
|
+
return amplitudeData;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Find stream information
|
|
35
|
+
if (avformat_find_stream_info(formatContext, nullptr) < 0) {
|
|
36
|
+
avformat_close_input(&formatContext);
|
|
37
|
+
*errorPtr = FFmpegException("Failed to find stream information");
|
|
38
|
+
return amplitudeData;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Find the best audio stream
|
|
42
|
+
int audioStreamIndex = av_find_best_stream(formatContext, AVMEDIA_TYPE_AUDIO, -1, -1, nullptr, 0);
|
|
43
|
+
if (audioStreamIndex < 0) {
|
|
44
|
+
avformat_close_input(&formatContext);
|
|
45
|
+
*errorPtr = FFmpegException("Failed to find audio stream");
|
|
46
|
+
return amplitudeData;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Get codec parameters and find the corresponding decoder
|
|
50
|
+
AVCodecParameters *codecParameters = formatContext->streams[audioStreamIndex]->codecpar;
|
|
51
|
+
const AVCodec *codec = avcodec_find_decoder(codecParameters->codec_id);
|
|
52
|
+
if (!codec) {
|
|
53
|
+
avformat_close_input(&formatContext);
|
|
54
|
+
*errorPtr = FFmpegException("Failed to find codec");
|
|
55
|
+
return amplitudeData;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Allocate memory for the AVCodecContext
|
|
59
|
+
AVCodecContext *codecContext = avcodec_alloc_context3(codec);
|
|
60
|
+
if (!codecContext) {
|
|
61
|
+
avformat_close_input(&formatContext);
|
|
62
|
+
*errorPtr = FFmpegException("Failed to allocate AVCodecContext");
|
|
63
|
+
return amplitudeData;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Set codec parameters
|
|
67
|
+
if (avcodec_parameters_to_context(codecContext, codecParameters) < 0) {
|
|
68
|
+
avformat_close_input(&formatContext);
|
|
69
|
+
avcodec_free_context(&codecContext);
|
|
70
|
+
*errorPtr = FFmpegException("Failed to set codec parameters");
|
|
71
|
+
return amplitudeData;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Open the codec
|
|
75
|
+
if (avcodec_open2(codecContext, codec, nullptr) < 0) {
|
|
76
|
+
avformat_close_input(&formatContext);
|
|
77
|
+
avcodec_free_context(&codecContext);
|
|
78
|
+
*errorPtr = FFmpegException("Failed to open codec");
|
|
79
|
+
return amplitudeData;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Allocate memory for AVPacket and AVFrame
|
|
83
|
+
AVPacket packet;
|
|
84
|
+
AVFrame *frame = av_frame_alloc();
|
|
85
|
+
|
|
86
|
+
// Initialize variables for audio analysis
|
|
87
|
+
int sampleRate = codecContext->sample_rate;
|
|
88
|
+
double accumulatedAmplitude = 0.0;
|
|
89
|
+
long sampleCount = 0;
|
|
90
|
+
|
|
91
|
+
// Read frames from the input file
|
|
92
|
+
while (av_read_frame(formatContext, &packet) >= 0) {
|
|
93
|
+
if (packet.stream_index == audioStreamIndex) {
|
|
94
|
+
// Send the packet to the codec
|
|
95
|
+
if (avcodec_send_packet(codecContext, &packet) < 0) {
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Receive frames from the codec
|
|
100
|
+
while (avcodec_receive_frame(codecContext, frame) >= 0) {
|
|
101
|
+
double timestampInSeconds = frame->pts * av_q2d(formatContext->streams[audioStreamIndex]->time_base);
|
|
102
|
+
|
|
103
|
+
// Calculate amplitude for each sample in the frame
|
|
104
|
+
for (int i = 0; i < frame->nb_samples; i++) {
|
|
105
|
+
for (int ch = 0; ch < codecContext->ch_layout.nb_channels; ch++) {
|
|
106
|
+
if (frame->data[ch]) {
|
|
107
|
+
// Check if the index is within bounds
|
|
108
|
+
if (i < frame->linesize[ch]) {
|
|
109
|
+
accumulatedAmplitude += frame->data[ch][i];
|
|
110
|
+
sampleCount++;
|
|
111
|
+
|
|
112
|
+
// Calculate amplitude per second and store the data
|
|
113
|
+
if (sampleCount >= sampleRate) {
|
|
114
|
+
double amplitudePerSecond = accumulatedAmplitude / sampleRate;
|
|
115
|
+
|
|
116
|
+
AmplitudeData data{};
|
|
117
|
+
data.timeInSeconds = timestampInSeconds;
|
|
118
|
+
data.amplitude = amplitudePerSecond;
|
|
119
|
+
|
|
120
|
+
amplitudeData.push_back(data);
|
|
121
|
+
|
|
122
|
+
accumulatedAmplitude = 0.0;
|
|
123
|
+
sampleCount = 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Release the packet
|
|
133
|
+
av_packet_unref(&packet);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Clean up resources
|
|
137
|
+
avformat_close_input(&formatContext);
|
|
138
|
+
avcodec_free_context(&codecContext);
|
|
139
|
+
av_frame_free(&frame);
|
|
140
|
+
|
|
141
|
+
return amplitudeData;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#ifndef AUDIOANALYZER_H
|
|
2
|
+
#define AUDIOANALYZER_H
|
|
3
|
+
|
|
4
|
+
#include <vector>
|
|
5
|
+
|
|
6
|
+
namespace audioanalyzer {
|
|
7
|
+
struct AmplitudeData {
|
|
8
|
+
double amplitude;
|
|
9
|
+
double timeInSeconds;
|
|
10
|
+
// Other amplitude data
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
class FFmpegException {
|
|
14
|
+
private:
|
|
15
|
+
const char* message;
|
|
16
|
+
|
|
17
|
+
public:
|
|
18
|
+
FFmpegException(const char* msg) noexcept
|
|
19
|
+
: message(msg) {}
|
|
20
|
+
|
|
21
|
+
const char* getMessage() const noexcept;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
std::vector<AmplitudeData> analyzeAudio(const char *filename, FFmpegException *errorPtr);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
#endif // AUDIOANALYZER_H
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#ifdef __cplusplus
|
|
2
|
+
#import "react-native-audio-analyzer.h"
|
|
3
|
+
#endif
|
|
4
|
+
|
|
5
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
6
|
+
#import "RNAudioAnalyzerSpec.h"
|
|
7
|
+
|
|
8
|
+
@interface AudioAnalyzer : NSObject <NativeAudioAnalyzerSpec>
|
|
9
|
+
#else
|
|
10
|
+
#import <React/RCTBridgeModule.h>
|
|
11
|
+
|
|
12
|
+
@interface AudioAnalyzer : NSObject <RCTBridgeModule>
|
|
13
|
+
#endif
|
|
14
|
+
|
|
15
|
+
- (void)analyzeAudio:(NSString *)filename
|
|
16
|
+
resolver:(RCTPromiseResolveBlock)resolve
|
|
17
|
+
rejecter:(RCTPromiseRejectBlock)reject;
|
|
18
|
+
|
|
19
|
+
@end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#import "AudioAnalyzer.h"
|
|
2
|
+
#import "react-native-audio-analyzer.h"
|
|
3
|
+
#include <stdexcept>
|
|
4
|
+
|
|
5
|
+
@implementation AudioAnalyzer
|
|
6
|
+
RCT_EXPORT_MODULE()
|
|
7
|
+
|
|
8
|
+
RCT_EXPORT_METHOD(analyzeAudio:(NSString *)filename
|
|
9
|
+
resolver:(RCTPromiseResolveBlock)resolve
|
|
10
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
11
|
+
{
|
|
12
|
+
@try {
|
|
13
|
+
audioanalyzer::FFmpegException ffmpegError = nullptr;
|
|
14
|
+
|
|
15
|
+
const char *cFilename = [filename UTF8String];
|
|
16
|
+
|
|
17
|
+
std::vector<audioanalyzer::AmplitudeData> result = audioanalyzer::analyzeAudio(cFilename, &ffmpegError);
|
|
18
|
+
|
|
19
|
+
if (ffmpegError.getMessage()) {
|
|
20
|
+
NSString *errorMessage = [NSString stringWithUTF8String:ffmpegError.getMessage()];
|
|
21
|
+
reject(@"ffmpeg", errorMessage, nil);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
NSMutableArray *outputArray = [NSMutableArray array];
|
|
26
|
+
for (const auto &data : result) {
|
|
27
|
+
NSDictionary *amplitudeData = @{
|
|
28
|
+
@"amplitude": @(data.amplitude),
|
|
29
|
+
@"timeInSeconds": @(data.timeInSeconds)
|
|
30
|
+
// Other amplitude data
|
|
31
|
+
};
|
|
32
|
+
[outputArray addObject:amplitudeData];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
resolve(outputArray);
|
|
36
|
+
}
|
|
37
|
+
@catch (...) {
|
|
38
|
+
// Catch other exceptions and handle them accordingly
|
|
39
|
+
reject(@"UnknownError", @"An unknown error occurred", nil);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.sample = sample;
|
|
7
|
+
exports.scale = scale;
|
|
8
|
+
function scale(arr) {
|
|
9
|
+
if (arr.length === 0) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
const min = Math.min(...arr);
|
|
13
|
+
const max = Math.max(...arr);
|
|
14
|
+
const diff = max - min;
|
|
15
|
+
if (diff === 0) {
|
|
16
|
+
// If diff is 0, all elements in the array are the same.
|
|
17
|
+
// To avoid division by zero, return an array of the same length with 0 values.
|
|
18
|
+
return arr.map(() => 0);
|
|
19
|
+
}
|
|
20
|
+
return arr.map(value => (value - min) / diff);
|
|
21
|
+
}
|
|
22
|
+
function sample(arr, newSize) {
|
|
23
|
+
const originalSize = arr.length;
|
|
24
|
+
if (newSize === 0) {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
const result = [];
|
|
28
|
+
for (let i = 0; i < newSize; i++) {
|
|
29
|
+
const index = Math.floor(i / newSize * originalSize);
|
|
30
|
+
result.push(arr[index] ?? 0);
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["scale","arr","length","min","Math","max","diff","map","value","sample","newSize","originalSize","result","i","index","floor","push"],"sourceRoot":"../../src","sources":["helpers.ts"],"mappings":";;;;;;;AAAO,SAASA,KAAKA,CAACC,GAAa,EAAE;EACnC,IAAIA,GAAG,CAACC,MAAM,KAAK,CAAC,EAAE;IACpB,OAAO,EAAE;EACX;EAEA,MAAMC,GAAG,GAAGC,IAAI,CAACD,GAAG,CAAC,GAAGF,GAAG,CAAC;EAC5B,MAAMI,GAAG,GAAGD,IAAI,CAACC,GAAG,CAAC,GAAGJ,GAAG,CAAC;EAC5B,MAAMK,IAAI,GAAGD,GAAG,GAAGF,GAAG;EAEtB,IAAIG,IAAI,KAAK,CAAC,EAAE;IACd;IACA;IACA,OAAOL,GAAG,CAACM,GAAG,CAAC,MAAM,CAAC,CAAC;EACzB;EAEA,OAAON,GAAG,CAACM,GAAG,CAAEC,KAAK,IAAK,CAACA,KAAK,GAAGL,GAAG,IAAIG,IAAI,CAAC;AACjD;AAEO,SAASG,MAAMA,CAACR,GAAa,EAAES,OAAe,EAAE;EACrD,MAAMC,YAAY,GAAGV,GAAG,CAACC,MAAM;EAE/B,IAAIQ,OAAO,KAAK,CAAC,EAAE;IACjB,OAAO,EAAE;EACX;EAEA,MAAME,MAAgB,GAAG,EAAE;EAE3B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,OAAO,EAAEG,CAAC,EAAE,EAAE;IAChC,MAAMC,KAAK,GAAGV,IAAI,CAACW,KAAK,CAAEF,CAAC,GAAGH,OAAO,GAAIC,YAAY,CAAC;IACtDC,MAAM,CAACI,IAAI,CAACf,GAAG,CAACa,KAAK,CAAC,IAAI,CAAC,CAAC;EAC9B;EAEA,OAAOF,MAAM;AACf"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _helpers = require("./helpers");
|
|
4
|
+
describe('scale function', () => {
|
|
5
|
+
it('should scale the array values between 0 and 1', () => {
|
|
6
|
+
const inputArray = [1, 2, 3, 4, 5];
|
|
7
|
+
const scaledArray = (0, _helpers.scale)(inputArray);
|
|
8
|
+
expect(scaledArray).toEqual([0, 0.25, 0.5, 0.75, 1]);
|
|
9
|
+
});
|
|
10
|
+
it('should handle an empty array', () => {
|
|
11
|
+
const inputArray = [];
|
|
12
|
+
const scaledArray = (0, _helpers.scale)(inputArray);
|
|
13
|
+
expect(scaledArray).toEqual([]);
|
|
14
|
+
});
|
|
15
|
+
it('should handle an array with one element', () => {
|
|
16
|
+
const inputArray = [42];
|
|
17
|
+
const scaledArray = (0, _helpers.scale)(inputArray);
|
|
18
|
+
expect(scaledArray).toEqual([0]);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('sample function', () => {
|
|
22
|
+
it('should sample the array to the specified size', () => {
|
|
23
|
+
const inputArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
|
24
|
+
const newSize = 5;
|
|
25
|
+
const sampledArray = (0, _helpers.sample)(inputArray, newSize);
|
|
26
|
+
expect(sampledArray.length).toBe(newSize);
|
|
27
|
+
expect(sampledArray).toEqual([1, 3, 5, 7, 9]);
|
|
28
|
+
});
|
|
29
|
+
it('should handle an empty array', () => {
|
|
30
|
+
const inputArray = [];
|
|
31
|
+
const newSize = 0;
|
|
32
|
+
const sampledArray = (0, _helpers.sample)(inputArray, newSize);
|
|
33
|
+
expect(sampledArray).toEqual([]);
|
|
34
|
+
});
|
|
35
|
+
it('should handle an array with one element', () => {
|
|
36
|
+
const inputArray = [42];
|
|
37
|
+
const newSize = 5;
|
|
38
|
+
const sampledArray = (0, _helpers.sample)(inputArray, newSize);
|
|
39
|
+
expect(sampledArray).toEqual([42, 42, 42, 42, 42]); // The result will be an array with the same element repeated
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should handle newSize greater than the original size', () => {
|
|
43
|
+
const inputArray = [1, 2, 3];
|
|
44
|
+
const newSize = 5;
|
|
45
|
+
const sampledArray = (0, _helpers.sample)(inputArray, newSize);
|
|
46
|
+
expect(sampledArray).toEqual([1, 1, 2, 2, 3]); // The result will include elements from the original array with repetition
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=helpers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_helpers","require","describe","it","inputArray","scaledArray","scale","expect","toEqual","newSize","sampledArray","sample","length","toBe"],"sourceRoot":"../../src","sources":["helpers.test.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _exportNames = {
|
|
7
|
+
analyzeAudio: true
|
|
8
|
+
};
|
|
9
|
+
exports.analyzeAudio = analyzeAudio;
|
|
10
|
+
var _reactNative = require("react-native");
|
|
11
|
+
var _helpers = require("./helpers");
|
|
12
|
+
Object.keys(_helpers).forEach(function (key) {
|
|
13
|
+
if (key === "default" || key === "__esModule") return;
|
|
14
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
15
|
+
if (key in exports && exports[key] === _helpers[key]) return;
|
|
16
|
+
Object.defineProperty(exports, key, {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () {
|
|
19
|
+
return _helpers[key];
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
const LINKING_ERROR = `The package 'react-native-audio-analyzer' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
|
|
24
|
+
ios: "- You have run 'pod install'\n",
|
|
25
|
+
default: ''
|
|
26
|
+
}) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
|
|
27
|
+
const AudioAnalyzer = _reactNative.NativeModules.AudioAnalyzer ? _reactNative.NativeModules.AudioAnalyzer : new Proxy({}, {
|
|
28
|
+
get() {
|
|
29
|
+
throw new Error(LINKING_ERROR);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
function analyzeAudio(filepath) {
|
|
33
|
+
return AudioAnalyzer.analyzeAudio(filepath);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_helpers","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","LINKING_ERROR","Platform","select","ios","default","AudioAnalyzer","NativeModules","Proxy","Error","analyzeAudio","filepath"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AA6BA,IAAAC,QAAA,GAAAD,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAF,QAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,QAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,QAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AA3BA,MAAMS,aAAa,GAChB,sFAAqF,GACtFC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,aAAa,GAAGC,0BAAa,CAACD,aAAa,GAC7CC,0BAAa,CAACD,aAAa,GAC3B,IAAIE,KAAK,CACP,CAAC,CAAC,EACF;EACER,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIS,KAAK,CAACR,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAQE,SAASS,YAAYA,CAACC,QAAgB,EAA4B;EACvE,OAAOL,aAAa,CAACI,YAAY,CAACC,QAAQ,CAAC;AAC7C"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function scale(arr) {
|
|
2
|
+
if (arr.length === 0) {
|
|
3
|
+
return [];
|
|
4
|
+
}
|
|
5
|
+
const min = Math.min(...arr);
|
|
6
|
+
const max = Math.max(...arr);
|
|
7
|
+
const diff = max - min;
|
|
8
|
+
if (diff === 0) {
|
|
9
|
+
// If diff is 0, all elements in the array are the same.
|
|
10
|
+
// To avoid division by zero, return an array of the same length with 0 values.
|
|
11
|
+
return arr.map(() => 0);
|
|
12
|
+
}
|
|
13
|
+
return arr.map(value => (value - min) / diff);
|
|
14
|
+
}
|
|
15
|
+
export function sample(arr, newSize) {
|
|
16
|
+
const originalSize = arr.length;
|
|
17
|
+
if (newSize === 0) {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
const result = [];
|
|
21
|
+
for (let i = 0; i < newSize; i++) {
|
|
22
|
+
const index = Math.floor(i / newSize * originalSize);
|
|
23
|
+
result.push(arr[index] ?? 0);
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["scale","arr","length","min","Math","max","diff","map","value","sample","newSize","originalSize","result","i","index","floor","push"],"sourceRoot":"../../src","sources":["helpers.ts"],"mappings":"AAAA,OAAO,SAASA,KAAKA,CAACC,GAAa,EAAE;EACnC,IAAIA,GAAG,CAACC,MAAM,KAAK,CAAC,EAAE;IACpB,OAAO,EAAE;EACX;EAEA,MAAMC,GAAG,GAAGC,IAAI,CAACD,GAAG,CAAC,GAAGF,GAAG,CAAC;EAC5B,MAAMI,GAAG,GAAGD,IAAI,CAACC,GAAG,CAAC,GAAGJ,GAAG,CAAC;EAC5B,MAAMK,IAAI,GAAGD,GAAG,GAAGF,GAAG;EAEtB,IAAIG,IAAI,KAAK,CAAC,EAAE;IACd;IACA;IACA,OAAOL,GAAG,CAACM,GAAG,CAAC,MAAM,CAAC,CAAC;EACzB;EAEA,OAAON,GAAG,CAACM,GAAG,CAAEC,KAAK,IAAK,CAACA,KAAK,GAAGL,GAAG,IAAIG,IAAI,CAAC;AACjD;AAEA,OAAO,SAASG,MAAMA,CAACR,GAAa,EAAES,OAAe,EAAE;EACrD,MAAMC,YAAY,GAAGV,GAAG,CAACC,MAAM;EAE/B,IAAIQ,OAAO,KAAK,CAAC,EAAE;IACjB,OAAO,EAAE;EACX;EAEA,MAAME,MAAgB,GAAG,EAAE;EAE3B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,OAAO,EAAEG,CAAC,EAAE,EAAE;IAChC,MAAMC,KAAK,GAAGV,IAAI,CAACW,KAAK,CAAEF,CAAC,GAAGH,OAAO,GAAIC,YAAY,CAAC;IACtDC,MAAM,CAACI,IAAI,CAACf,GAAG,CAACa,KAAK,CAAC,IAAI,CAAC,CAAC;EAC9B;EAEA,OAAOF,MAAM;AACf"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { scale, sample } from './helpers';
|
|
2
|
+
describe('scale function', () => {
|
|
3
|
+
it('should scale the array values between 0 and 1', () => {
|
|
4
|
+
const inputArray = [1, 2, 3, 4, 5];
|
|
5
|
+
const scaledArray = scale(inputArray);
|
|
6
|
+
expect(scaledArray).toEqual([0, 0.25, 0.5, 0.75, 1]);
|
|
7
|
+
});
|
|
8
|
+
it('should handle an empty array', () => {
|
|
9
|
+
const inputArray = [];
|
|
10
|
+
const scaledArray = scale(inputArray);
|
|
11
|
+
expect(scaledArray).toEqual([]);
|
|
12
|
+
});
|
|
13
|
+
it('should handle an array with one element', () => {
|
|
14
|
+
const inputArray = [42];
|
|
15
|
+
const scaledArray = scale(inputArray);
|
|
16
|
+
expect(scaledArray).toEqual([0]);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe('sample function', () => {
|
|
20
|
+
it('should sample the array to the specified size', () => {
|
|
21
|
+
const inputArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
|
22
|
+
const newSize = 5;
|
|
23
|
+
const sampledArray = sample(inputArray, newSize);
|
|
24
|
+
expect(sampledArray.length).toBe(newSize);
|
|
25
|
+
expect(sampledArray).toEqual([1, 3, 5, 7, 9]);
|
|
26
|
+
});
|
|
27
|
+
it('should handle an empty array', () => {
|
|
28
|
+
const inputArray = [];
|
|
29
|
+
const newSize = 0;
|
|
30
|
+
const sampledArray = sample(inputArray, newSize);
|
|
31
|
+
expect(sampledArray).toEqual([]);
|
|
32
|
+
});
|
|
33
|
+
it('should handle an array with one element', () => {
|
|
34
|
+
const inputArray = [42];
|
|
35
|
+
const newSize = 5;
|
|
36
|
+
const sampledArray = sample(inputArray, newSize);
|
|
37
|
+
expect(sampledArray).toEqual([42, 42, 42, 42, 42]); // The result will be an array with the same element repeated
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('should handle newSize greater than the original size', () => {
|
|
41
|
+
const inputArray = [1, 2, 3];
|
|
42
|
+
const newSize = 5;
|
|
43
|
+
const sampledArray = sample(inputArray, newSize);
|
|
44
|
+
expect(sampledArray).toEqual([1, 1, 2, 2, 3]); // The result will include elements from the original array with repetition
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=helpers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["scale","sample","describe","it","inputArray","scaledArray","expect","toEqual","newSize","sampledArray","length","toBe"],"sourceRoot":"../../src","sources":["helpers.test.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { NativeModules, Platform } from 'react-native';
|
|
2
|
+
const LINKING_ERROR = `The package 'react-native-audio-analyzer' doesn't seem to be linked. Make sure: \n\n` + Platform.select({
|
|
3
|
+
ios: "- You have run 'pod install'\n",
|
|
4
|
+
default: ''
|
|
5
|
+
}) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
|
|
6
|
+
const AudioAnalyzer = NativeModules.AudioAnalyzer ? NativeModules.AudioAnalyzer : new Proxy({}, {
|
|
7
|
+
get() {
|
|
8
|
+
throw new Error(LINKING_ERROR);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
export function analyzeAudio(filepath) {
|
|
12
|
+
return AudioAnalyzer.analyzeAudio(filepath);
|
|
13
|
+
}
|
|
14
|
+
export * from './helpers';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","LINKING_ERROR","select","ios","default","AudioAnalyzer","Proxy","get","Error","analyzeAudio","filepath"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAEtD,MAAMC,aAAa,GAChB,sFAAqF,GACtFD,QAAQ,CAACE,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,aAAa,GAAGN,aAAa,CAACM,aAAa,GAC7CN,aAAa,CAACM,aAAa,GAC3B,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAQL,OAAO,SAASQ,YAAYA,CAACC,QAAgB,EAA4B;EACvE,OAAOL,aAAa,CAACI,YAAY,CAACC,QAAQ,CAAC;AAC7C;AAEA,cAAc,WAAW"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/helpers.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,YAgBlC;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,YAepD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.test.d.ts","sourceRoot":"","sources":["../../../src/helpers.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAmBA,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CAEvB,CAAC;AAEF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAEvE;AAED,cAAc,WAAW,CAAC"}
|