@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.
Files changed (223) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +124 -0
  3. package/android/CMakeCache.txt +372 -0
  4. package/android/CMakeLists.txt +44 -0
  5. package/android/Makefile +211 -0
  6. package/android/build.gradle +110 -0
  7. package/android/cmake_install.cmake +49 -0
  8. package/android/cpp-adapter.cpp +40 -0
  9. package/android/ffmpeg_16kb/include/config.h +749 -0
  10. package/android/ffmpeg_16kb/include/libavcodec/ac3_parser.h +36 -0
  11. package/android/ffmpeg_16kb/include/libavcodec/adts_parser.h +37 -0
  12. package/android/ffmpeg_16kb/include/libavcodec/arm/mathops.h +108 -0
  13. package/android/ffmpeg_16kb/include/libavcodec/avcodec.h +3192 -0
  14. package/android/ffmpeg_16kb/include/libavcodec/avdct.h +88 -0
  15. package/android/ffmpeg_16kb/include/libavcodec/avfft.h +118 -0
  16. package/android/ffmpeg_16kb/include/libavcodec/bsf.h +332 -0
  17. package/android/ffmpeg_16kb/include/libavcodec/codec.h +375 -0
  18. package/android/ffmpeg_16kb/include/libavcodec/codec_desc.h +128 -0
  19. package/android/ffmpeg_16kb/include/libavcodec/codec_id.h +661 -0
  20. package/android/ffmpeg_16kb/include/libavcodec/codec_par.h +247 -0
  21. package/android/ffmpeg_16kb/include/libavcodec/d3d11va.h +112 -0
  22. package/android/ffmpeg_16kb/include/libavcodec/defs.h +192 -0
  23. package/android/ffmpeg_16kb/include/libavcodec/dirac.h +131 -0
  24. package/android/ffmpeg_16kb/include/libavcodec/dv_profile.h +82 -0
  25. package/android/ffmpeg_16kb/include/libavcodec/dxva2.h +93 -0
  26. package/android/ffmpeg_16kb/include/libavcodec/jni.h +46 -0
  27. package/android/ffmpeg_16kb/include/libavcodec/mathops.h +255 -0
  28. package/android/ffmpeg_16kb/include/libavcodec/mediacodec.h +103 -0
  29. package/android/ffmpeg_16kb/include/libavcodec/packet.h +731 -0
  30. package/android/ffmpeg_16kb/include/libavcodec/qsv.h +109 -0
  31. package/android/ffmpeg_16kb/include/libavcodec/vdpau.h +157 -0
  32. package/android/ffmpeg_16kb/include/libavcodec/version.h +45 -0
  33. package/android/ffmpeg_16kb/include/libavcodec/version_major.h +52 -0
  34. package/android/ffmpeg_16kb/include/libavcodec/videotoolbox.h +150 -0
  35. package/android/ffmpeg_16kb/include/libavcodec/vorbis_parser.h +74 -0
  36. package/android/ffmpeg_16kb/include/libavcodec/x86/mathops.h +133 -0
  37. package/android/ffmpeg_16kb/include/libavcodec/xvmc.h +171 -0
  38. package/android/ffmpeg_16kb/include/libavdevice/avdevice.h +397 -0
  39. package/android/ffmpeg_16kb/include/libavdevice/version.h +45 -0
  40. package/android/ffmpeg_16kb/include/libavdevice/version_major.h +36 -0
  41. package/android/ffmpeg_16kb/include/libavfilter/avfilter.h +1491 -0
  42. package/android/ffmpeg_16kb/include/libavfilter/buffersink.h +173 -0
  43. package/android/ffmpeg_16kb/include/libavfilter/buffersrc.h +218 -0
  44. package/android/ffmpeg_16kb/include/libavfilter/version.h +48 -0
  45. package/android/ffmpeg_16kb/include/libavfilter/version_major.h +38 -0
  46. package/android/ffmpeg_16kb/include/libavformat/avformat.h +2826 -0
  47. package/android/ffmpeg_16kb/include/libavformat/avio.h +837 -0
  48. package/android/ffmpeg_16kb/include/libavformat/network.h +341 -0
  49. package/android/ffmpeg_16kb/include/libavformat/os_support.h +317 -0
  50. package/android/ffmpeg_16kb/include/libavformat/url.h +409 -0
  51. package/android/ffmpeg_16kb/include/libavformat/version.h +47 -0
  52. package/android/ffmpeg_16kb/include/libavformat/version_major.h +52 -0
  53. package/android/ffmpeg_16kb/include/libavutil/aarch64/timer.h +50 -0
  54. package/android/ffmpeg_16kb/include/libavutil/adler32.h +63 -0
  55. package/android/ffmpeg_16kb/include/libavutil/aes.h +69 -0
  56. package/android/ffmpeg_16kb/include/libavutil/aes_ctr.h +99 -0
  57. package/android/ffmpeg_16kb/include/libavutil/ambient_viewing_environment.h +72 -0
  58. package/android/ffmpeg_16kb/include/libavutil/arm/timer.h +46 -0
  59. package/android/ffmpeg_16kb/include/libavutil/attributes.h +173 -0
  60. package/android/ffmpeg_16kb/include/libavutil/attributes_internal.h +34 -0
  61. package/android/ffmpeg_16kb/include/libavutil/audio_fifo.h +186 -0
  62. package/android/ffmpeg_16kb/include/libavutil/avassert.h +75 -0
  63. package/android/ffmpeg_16kb/include/libavutil/avconfig.h +6 -0
  64. package/android/ffmpeg_16kb/include/libavutil/avstring.h +429 -0
  65. package/android/ffmpeg_16kb/include/libavutil/avutil.h +371 -0
  66. package/android/ffmpeg_16kb/include/libavutil/base64.h +72 -0
  67. package/android/ffmpeg_16kb/include/libavutil/blowfish.h +82 -0
  68. package/android/ffmpeg_16kb/include/libavutil/bprint.h +251 -0
  69. package/android/ffmpeg_16kb/include/libavutil/bswap.h +111 -0
  70. package/android/ffmpeg_16kb/include/libavutil/buffer.h +322 -0
  71. package/android/ffmpeg_16kb/include/libavutil/camellia.h +70 -0
  72. package/android/ffmpeg_16kb/include/libavutil/cast5.h +80 -0
  73. package/android/ffmpeg_16kb/include/libavutil/channel_layout.h +783 -0
  74. package/android/ffmpeg_16kb/include/libavutil/common.h +578 -0
  75. package/android/ffmpeg_16kb/include/libavutil/cpu.h +134 -0
  76. package/android/ffmpeg_16kb/include/libavutil/crc.h +102 -0
  77. package/android/ffmpeg_16kb/include/libavutil/csp.h +150 -0
  78. package/android/ffmpeg_16kb/include/libavutil/des.h +81 -0
  79. package/android/ffmpeg_16kb/include/libavutil/detection_bbox.h +108 -0
  80. package/android/ffmpeg_16kb/include/libavutil/dict.h +241 -0
  81. package/android/ffmpeg_16kb/include/libavutil/display.h +109 -0
  82. package/android/ffmpeg_16kb/include/libavutil/dovi_meta.h +236 -0
  83. package/android/ffmpeg_16kb/include/libavutil/downmix_info.h +115 -0
  84. package/android/ffmpeg_16kb/include/libavutil/encryption_info.h +205 -0
  85. package/android/ffmpeg_16kb/include/libavutil/error.h +128 -0
  86. package/android/ffmpeg_16kb/include/libavutil/eval.h +140 -0
  87. package/android/ffmpeg_16kb/include/libavutil/ffversion.h +5 -0
  88. package/android/ffmpeg_16kb/include/libavutil/fifo.h +448 -0
  89. package/android/ffmpeg_16kb/include/libavutil/file.h +115 -0
  90. package/android/ffmpeg_16kb/include/libavutil/film_grain_params.h +260 -0
  91. package/android/ffmpeg_16kb/include/libavutil/frame.h +964 -0
  92. package/android/ffmpeg_16kb/include/libavutil/getenv_utf8.h +86 -0
  93. package/android/ffmpeg_16kb/include/libavutil/hash.h +264 -0
  94. package/android/ffmpeg_16kb/include/libavutil/hdr_dynamic_metadata.h +343 -0
  95. package/android/ffmpeg_16kb/include/libavutil/hdr_dynamic_vivid_metadata.h +285 -0
  96. package/android/ffmpeg_16kb/include/libavutil/hmac.h +99 -0
  97. package/android/ffmpeg_16kb/include/libavutil/hwcontext.h +610 -0
  98. package/android/ffmpeg_16kb/include/libavutil/hwcontext_cuda.h +69 -0
  99. package/android/ffmpeg_16kb/include/libavutil/hwcontext_d3d11va.h +178 -0
  100. package/android/ffmpeg_16kb/include/libavutil/hwcontext_drm.h +169 -0
  101. package/android/ffmpeg_16kb/include/libavutil/hwcontext_dxva2.h +75 -0
  102. package/android/ffmpeg_16kb/include/libavutil/hwcontext_mediacodec.h +61 -0
  103. package/android/ffmpeg_16kb/include/libavutil/hwcontext_opencl.h +100 -0
  104. package/android/ffmpeg_16kb/include/libavutil/hwcontext_qsv.h +64 -0
  105. package/android/ffmpeg_16kb/include/libavutil/hwcontext_vaapi.h +117 -0
  106. package/android/ffmpeg_16kb/include/libavutil/hwcontext_vdpau.h +44 -0
  107. package/android/ffmpeg_16kb/include/libavutil/hwcontext_videotoolbox.h +96 -0
  108. package/android/ffmpeg_16kb/include/libavutil/hwcontext_vulkan.h +281 -0
  109. package/android/ffmpeg_16kb/include/libavutil/imgutils.h +331 -0
  110. package/android/ffmpeg_16kb/include/libavutil/internal.h +190 -0
  111. package/android/ffmpeg_16kb/include/libavutil/intfloat.h +77 -0
  112. package/android/ffmpeg_16kb/include/libavutil/intreadwrite.h +644 -0
  113. package/android/ffmpeg_16kb/include/libavutil/lfg.h +81 -0
  114. package/android/ffmpeg_16kb/include/libavutil/libm.h +471 -0
  115. package/android/ffmpeg_16kb/include/libavutil/log.h +387 -0
  116. package/android/ffmpeg_16kb/include/libavutil/lzo.h +66 -0
  117. package/android/ffmpeg_16kb/include/libavutil/macros.h +80 -0
  118. package/android/ffmpeg_16kb/include/libavutil/mastering_display_metadata.h +128 -0
  119. package/android/ffmpeg_16kb/include/libavutil/mathematics.h +245 -0
  120. package/android/ffmpeg_16kb/include/libavutil/md5.h +89 -0
  121. package/android/ffmpeg_16kb/include/libavutil/mem.h +609 -0
  122. package/android/ffmpeg_16kb/include/libavutil/motion_vector.h +57 -0
  123. package/android/ffmpeg_16kb/include/libavutil/murmur3.h +115 -0
  124. package/android/ffmpeg_16kb/include/libavutil/opt.h +891 -0
  125. package/android/ffmpeg_16kb/include/libavutil/parseutils.h +197 -0
  126. package/android/ffmpeg_16kb/include/libavutil/pixdesc.h +435 -0
  127. package/android/ffmpeg_16kb/include/libavutil/pixelutils.h +51 -0
  128. package/android/ffmpeg_16kb/include/libavutil/pixfmt.h +691 -0
  129. package/android/ffmpeg_16kb/include/libavutil/random_seed.h +43 -0
  130. package/android/ffmpeg_16kb/include/libavutil/rational.h +221 -0
  131. package/android/ffmpeg_16kb/include/libavutil/rc4.h +69 -0
  132. package/android/ffmpeg_16kb/include/libavutil/replaygain.h +50 -0
  133. package/android/ffmpeg_16kb/include/libavutil/reverse.h +28 -0
  134. package/android/ffmpeg_16kb/include/libavutil/ripemd.h +83 -0
  135. package/android/ffmpeg_16kb/include/libavutil/samplefmt.h +269 -0
  136. package/android/ffmpeg_16kb/include/libavutil/sha.h +90 -0
  137. package/android/ffmpeg_16kb/include/libavutil/sha512.h +92 -0
  138. package/android/ffmpeg_16kb/include/libavutil/spherical.h +227 -0
  139. package/android/ffmpeg_16kb/include/libavutil/stereo3d.h +229 -0
  140. package/android/ffmpeg_16kb/include/libavutil/tea.h +71 -0
  141. package/android/ffmpeg_16kb/include/libavutil/thread.h +204 -0
  142. package/android/ffmpeg_16kb/include/libavutil/threadmessage.h +115 -0
  143. package/android/ffmpeg_16kb/include/libavutil/time.h +56 -0
  144. package/android/ffmpeg_16kb/include/libavutil/timecode.h +199 -0
  145. package/android/ffmpeg_16kb/include/libavutil/timer.h +156 -0
  146. package/android/ffmpeg_16kb/include/libavutil/timestamp.h +78 -0
  147. package/android/ffmpeg_16kb/include/libavutil/tree.h +137 -0
  148. package/android/ffmpeg_16kb/include/libavutil/twofish.h +70 -0
  149. package/android/ffmpeg_16kb/include/libavutil/tx.h +176 -0
  150. package/android/ffmpeg_16kb/include/libavutil/uuid.h +146 -0
  151. package/android/ffmpeg_16kb/include/libavutil/version.h +122 -0
  152. package/android/ffmpeg_16kb/include/libavutil/video_enc_params.h +171 -0
  153. package/android/ffmpeg_16kb/include/libavutil/x86/asm.h +154 -0
  154. package/android/ffmpeg_16kb/include/libavutil/x86/emms.h +58 -0
  155. package/android/ffmpeg_16kb/include/libavutil/x86/timer.h +50 -0
  156. package/android/ffmpeg_16kb/include/libavutil/xtea.h +94 -0
  157. package/android/ffmpeg_16kb/include/libswresample/swresample.h +650 -0
  158. package/android/ffmpeg_16kb/include/libswresample/version.h +46 -0
  159. package/android/ffmpeg_16kb/include/libswresample/version_major.h +31 -0
  160. package/android/ffmpeg_16kb/include/libswscale/swscale.h +436 -0
  161. package/android/ffmpeg_16kb/include/libswscale/version.h +44 -0
  162. package/android/ffmpeg_16kb/include/libswscale/version_major.h +35 -0
  163. package/android/ffmpeg_16kb/lib/arm64-v8a/libavcodec.so +0 -0
  164. package/android/ffmpeg_16kb/lib/arm64-v8a/libavdevice.so +0 -0
  165. package/android/ffmpeg_16kb/lib/arm64-v8a/libavfilter.so +0 -0
  166. package/android/ffmpeg_16kb/lib/arm64-v8a/libavformat.so +0 -0
  167. package/android/ffmpeg_16kb/lib/arm64-v8a/libavutil.so +0 -0
  168. package/android/ffmpeg_16kb/lib/arm64-v8a/libswresample.so +0 -0
  169. package/android/ffmpeg_16kb/lib/arm64-v8a/libswscale.so +0 -0
  170. package/android/ffmpeg_16kb/lib/armeabi-v7a/libavcodec_neon.so +0 -0
  171. package/android/ffmpeg_16kb/lib/armeabi-v7a/libavdevice_neon.so +0 -0
  172. package/android/ffmpeg_16kb/lib/armeabi-v7a/libavfilter_neon.so +0 -0
  173. package/android/ffmpeg_16kb/lib/armeabi-v7a/libavformat_neon.so +0 -0
  174. package/android/ffmpeg_16kb/lib/armeabi-v7a/libavutil_neon.so +0 -0
  175. package/android/ffmpeg_16kb/lib/armeabi-v7a/libswresample_neon.so +0 -0
  176. package/android/ffmpeg_16kb/lib/armeabi-v7a/libswscale_neon.so +0 -0
  177. package/android/ffmpeg_16kb/lib/x86/libavcodec.so +0 -0
  178. package/android/ffmpeg_16kb/lib/x86/libavdevice.so +0 -0
  179. package/android/ffmpeg_16kb/lib/x86/libavfilter.so +0 -0
  180. package/android/ffmpeg_16kb/lib/x86/libavformat.so +0 -0
  181. package/android/ffmpeg_16kb/lib/x86/libavutil.so +0 -0
  182. package/android/ffmpeg_16kb/lib/x86/libswresample.so +0 -0
  183. package/android/ffmpeg_16kb/lib/x86/libswscale.so +0 -0
  184. package/android/ffmpeg_16kb/lib/x86_64/libavcodec.so +0 -0
  185. package/android/ffmpeg_16kb/lib/x86_64/libavdevice.so +0 -0
  186. package/android/ffmpeg_16kb/lib/x86_64/libavfilter.so +0 -0
  187. package/android/ffmpeg_16kb/lib/x86_64/libavformat.so +0 -0
  188. package/android/ffmpeg_16kb/lib/x86_64/libavutil.so +0 -0
  189. package/android/ffmpeg_16kb/lib/x86_64/libswresample.so +0 -0
  190. package/android/ffmpeg_16kb/lib/x86_64/libswscale.so +0 -0
  191. package/android/gradle.properties +5 -0
  192. package/android/src/main/AndroidManifest.xml +3 -0
  193. package/android/src/main/AndroidManifestNew.xml +2 -0
  194. package/android/src/main/java/com/audioanalyzer/AmplitudeData.java +20 -0
  195. package/android/src/main/java/com/audioanalyzer/AudioAnalyzerModule.java +52 -0
  196. package/android/src/main/java/com/audioanalyzer/AudioAnalyzerPackage.java +28 -0
  197. package/cpp/react-native-audio-analyzer.cpp +143 -0
  198. package/cpp/react-native-audio-analyzer.h +27 -0
  199. package/ios/AudioAnalyzer.h +19 -0
  200. package/ios/AudioAnalyzer.mm +43 -0
  201. package/lib/commonjs/helpers.js +34 -0
  202. package/lib/commonjs/helpers.js.map +1 -0
  203. package/lib/commonjs/helpers.test.js +49 -0
  204. package/lib/commonjs/helpers.test.js.map +1 -0
  205. package/lib/commonjs/index.js +35 -0
  206. package/lib/commonjs/index.js.map +1 -0
  207. package/lib/module/helpers.js +27 -0
  208. package/lib/module/helpers.js.map +1 -0
  209. package/lib/module/helpers.test.js +47 -0
  210. package/lib/module/helpers.test.js.map +1 -0
  211. package/lib/module/index.js +15 -0
  212. package/lib/module/index.js.map +1 -0
  213. package/lib/typescript/src/helpers.d.ts +3 -0
  214. package/lib/typescript/src/helpers.d.ts.map +1 -0
  215. package/lib/typescript/src/helpers.test.d.ts +2 -0
  216. package/lib/typescript/src/helpers.test.d.ts.map +1 -0
  217. package/lib/typescript/src/index.d.ts +7 -0
  218. package/lib/typescript/src/index.d.ts.map +1 -0
  219. package/package.json +163 -0
  220. package/react-native-audio-analyzer.podspec +44 -0
  221. package/src/helpers.test.ts +59 -0
  222. package/src/helpers.ts +34 -0
  223. 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,3 @@
1
+ export declare function scale(arr: number[]): number[];
2
+ export declare function sample(arr: number[], newSize: number): number[];
3
+ //# sourceMappingURL=helpers.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=helpers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.test.d.ts","sourceRoot":"","sources":["../../../src/helpers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export type AmplitudeData = {
2
+ amplitude: number;
3
+ timeInSeconds: number;
4
+ };
5
+ export declare function analyzeAudio(filepath: string): Promise<AmplitudeData[]>;
6
+ export * from './helpers';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}