@siteed/expo-audio-stream 1.5.2 → 1.6.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 (91) hide show
  1. package/CHANGELOG.md +10 -36
  2. package/build/AudioAnalysis/AudioAnalysis.types.d.ts +74 -0
  3. package/build/AudioAnalysis/AudioAnalysis.types.d.ts.map +1 -0
  4. package/build/AudioAnalysis/AudioAnalysis.types.js +3 -0
  5. package/build/AudioAnalysis/AudioAnalysis.types.js.map +1 -0
  6. package/build/AudioAnalysis/extractAudioAnalysis.d.ts +22 -0
  7. package/build/AudioAnalysis/extractAudioAnalysis.d.ts.map +1 -0
  8. package/build/AudioAnalysis/extractAudioAnalysis.js +86 -0
  9. package/build/AudioAnalysis/extractAudioAnalysis.js.map +1 -0
  10. package/build/AudioAnalysis/extractWaveform.d.ts +8 -0
  11. package/build/AudioAnalysis/extractWaveform.d.ts.map +1 -0
  12. package/build/AudioAnalysis/extractWaveform.js +11 -0
  13. package/build/AudioAnalysis/extractWaveform.js.map +1 -0
  14. package/build/AudioRecorder.provider.d.ts +11 -0
  15. package/build/AudioRecorder.provider.d.ts.map +1 -0
  16. package/build/AudioRecorder.provider.js +36 -0
  17. package/build/AudioRecorder.provider.js.map +1 -0
  18. package/build/ExpoAudioStream.native.d.ts +3 -0
  19. package/build/ExpoAudioStream.native.d.ts.map +1 -0
  20. package/build/ExpoAudioStream.native.js +6 -0
  21. package/build/ExpoAudioStream.native.js.map +1 -0
  22. package/build/ExpoAudioStream.types.d.ts +127 -0
  23. package/build/ExpoAudioStream.types.d.ts.map +1 -0
  24. package/build/ExpoAudioStream.types.js +2 -0
  25. package/build/ExpoAudioStream.types.js.map +1 -0
  26. package/build/ExpoAudioStream.web.d.ts +44 -0
  27. package/build/ExpoAudioStream.web.d.ts.map +1 -0
  28. package/build/ExpoAudioStream.web.js +206 -0
  29. package/build/ExpoAudioStream.web.js.map +1 -0
  30. package/build/ExpoAudioStreamModule.d.ts +3 -0
  31. package/build/ExpoAudioStreamModule.d.ts.map +1 -0
  32. package/build/ExpoAudioStreamModule.js +35 -0
  33. package/build/ExpoAudioStreamModule.js.map +1 -0
  34. package/build/WebRecorder.web.d.ts +54 -0
  35. package/build/WebRecorder.web.d.ts.map +1 -0
  36. package/build/WebRecorder.web.js +336 -0
  37. package/build/WebRecorder.web.js.map +1 -0
  38. package/build/constants.d.ts +11 -0
  39. package/build/constants.d.ts.map +1 -0
  40. package/build/constants.js +14 -0
  41. package/build/constants.js.map +1 -0
  42. package/build/events.d.ts +18 -0
  43. package/build/events.d.ts.map +1 -0
  44. package/build/events.js +11 -0
  45. package/build/events.js.map +1 -0
  46. package/build/index.d.ts +11 -0
  47. package/build/index.d.ts.map +1 -0
  48. package/build/index.js.map +1 -0
  49. package/build/useAudioRecorder.d.ts +20 -0
  50. package/build/useAudioRecorder.d.ts.map +1 -0
  51. package/build/useAudioRecorder.js +311 -0
  52. package/build/useAudioRecorder.js.map +1 -0
  53. package/build/utils/BlobFix.d.ts +9 -0
  54. package/build/utils/BlobFix.d.ts.map +1 -0
  55. package/build/utils/BlobFix.js +498 -0
  56. package/build/utils/BlobFix.js.map +1 -0
  57. package/build/utils/concatenateBuffers.d.ts +8 -0
  58. package/build/utils/concatenateBuffers.d.ts.map +1 -0
  59. package/build/utils/concatenateBuffers.js +21 -0
  60. package/build/utils/concatenateBuffers.js.map +1 -0
  61. package/build/utils/convertPCMToFloat32.d.ts +13 -0
  62. package/build/utils/convertPCMToFloat32.d.ts.map +1 -0
  63. package/build/utils/convertPCMToFloat32.js +120 -0
  64. package/build/utils/convertPCMToFloat32.js.map +1 -0
  65. package/build/utils/encodingToBitDepth.d.ts +5 -0
  66. package/build/utils/encodingToBitDepth.d.ts.map +1 -0
  67. package/build/utils/encodingToBitDepth.js +13 -0
  68. package/build/utils/encodingToBitDepth.js.map +1 -0
  69. package/build/utils/getWavFileInfo.d.ts +26 -0
  70. package/build/utils/getWavFileInfo.d.ts.map +1 -0
  71. package/build/utils/getWavFileInfo.js +92 -0
  72. package/build/utils/getWavFileInfo.js.map +1 -0
  73. package/build/utils/writeWavHeader.d.ts +49 -0
  74. package/build/utils/writeWavHeader.d.ts.map +1 -0
  75. package/build/utils/writeWavHeader.js +91 -0
  76. package/build/utils/writeWavHeader.js.map +1 -0
  77. package/build/workers/InlineFeaturesExtractor.web.d.ts +2 -0
  78. package/build/workers/InlineFeaturesExtractor.web.d.ts.map +1 -0
  79. package/build/workers/InlineFeaturesExtractor.web.js +311 -0
  80. package/build/workers/InlineFeaturesExtractor.web.js.map +1 -0
  81. package/build/workers/inlineAudioWebWorker.web.d.ts +2 -0
  82. package/build/workers/inlineAudioWebWorker.web.d.ts.map +1 -0
  83. package/build/workers/inlineAudioWebWorker.web.js +251 -0
  84. package/build/workers/inlineAudioWebWorker.web.js.map +1 -0
  85. package/expo-module.config.json +9 -0
  86. package/package.json +6 -2
  87. package/plugin/build/index.d.ts +3 -0
  88. package/plugin/build/index.js +132 -0
  89. package/plugin/src/index.ts +176 -0
  90. package/plugin/tsconfig.json +10 -0
  91. package/plugin/tsconfig.tsbuildinfo +1 -0
package/CHANGELOG.md CHANGED
@@ -8,33 +8,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
  ## [Unreleased]
9
9
 
10
10
 
11
- ## [1.5.2] - 2024-12-11
11
+ ## [1.6.1] - 2024-12-11
12
+ - chore(expo-audio-stream): remove git commit step from publish script ([4a772ce](https://github.com/deeeed/expo-audio-stream/commit/4a772ce93bb7405d9b8e981f46bdf8941a71ecfe))
13
+ - chore: more publishing automation ([3693021](https://github.com/deeeed/expo-audio-stream/commit/369302107f9dca9dddd8ae68e6214481a39976ac))
14
+ - expo plugin files not published ([b88c446](https://github.com/deeeed/expo-audio-stream/commit/b88c44667013a901fccfe6f89dcb640ae2aae47f))
12
15
  - chore(expo-audio-stream): improved build publish script ([ad65a69](https://github.com/deeeed/expo-audio-stream/commit/ad65a69011273e0eab1ac0f464fc3b009fc3433d))
16
+ - fix(expo-audio-stream): missing package files ([0901a1b](https://github.com/deeeed/expo-audio-stream/commit/0901a1bbbcce3111c9b5d61ade8caa48bcdd3613))
17
+ - feat(expo-audio-stream): opt in debug log for plugin config ([03a0a71](https://github.com/deeeed/expo-audio-stream/commit/03a0a7168bb4f77638de51c55a1ad19c713b52dc))
18
+ - fix(expo-audio-stream): include all build + sourcemaps files in the package
13
19
  - fix(expo-audio-stream): missing plugin files ([e56254a](https://github.com/deeeed/expo-audio-stream/commit/e56254a4ffa1c015df3d300831ba0b392958b6c8))
14
-
15
- ## [1.5.1] - 2024-12-11
16
20
  - fix(expo-audio-stream): plugin deployment process and build system enhancements (#56) ([63fbeb8](https://github.com/deeeed/expo-audio-stream/commit/63fbeb82f56130dedeafa633e916f2ce0f8f1a67))
17
21
 
18
-
19
22
  ## [1.5.0] - 2024-12-10
20
- - feat(expo-audio-stream): add comprehensive ios audio session configuration support (#54) ([ba296ac](https://github.com/deeeed/expo-audio-stream/commit/ba296ac9be0d61e7a46cc64953e6f2c66881fdfd))
21
- - fix(expo-audio-stream): prevent invalid WAV files when stopping recording too quickly (#53) ([80f4898](https://github.com/deeeed/expo-audio-stream/commit/80f4898625cea52da8f3e34e425e61d7641353f7))
22
-
23
+ - UNPUBLISHED because of a bug in the build system
23
24
 
24
25
 
25
26
  ## [1.4.0] - 2024-12-05
26
27
  - chore: remove unusded dependencies ([ad81dd5](https://github.com/deeeed/expo-audio-stream/commit/ad81dd560c93dd1d04995a323a4ae72d4de20f3e))
27
28
 
28
29
 
29
-
30
-
31
30
  ## [1.3.1] - 2024-12-05
32
31
  - feat(web): implement throttling and optimize event processing (#49) ([da28765](https://github.com/deeeed/expo-audio-stream/commit/da2876524c2c9d6e0a980fde40a0197b929d8a7f))
33
32
 
34
33
 
35
-
36
-
37
-
38
34
  ## [1.3.0] - 2024-11-28
39
35
  ### Added
40
36
  - refactor(permissions): standardize permission status response structure across platforms (#44) ([7c9c800](https://github.com/deeeed/expo-audio-stream/commit/7c9c800d83b7cea3516643371484d5e1f3b99e4c))
@@ -44,20 +40,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
44
40
  - feat: latest expo sdk ([258ef6c](https://github.com/deeeed/expo-audio-stream/commit/258ef6cf68e70c7855f696a01204f79b0793fdc0))
45
41
 
46
42
 
47
-
48
-
49
-
50
-
51
43
  ## [1.2.5] - 2024-11-12
52
44
  ### Added
53
45
  - docs(license): add MIT license to all packages (6 files changed)
54
46
  - fix(expo-audio-stream): return actual recording settings from startRecording on iOS #37
55
47
 
56
48
 
57
-
58
-
59
-
60
-
61
49
  ## [1.2.4] - 2024-11-05
62
50
  ### Changed
63
51
  - Android minimum audio interval set to 10ms.
@@ -67,10 +55,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
67
55
  - Remove frequently firing log statements on web.
68
56
 
69
57
 
70
-
71
-
72
-
73
-
74
58
  ## [1.2.0] - 2024-10-24
75
59
  ### Added
76
60
  - Feature: Keep device awake during recording with `keepAwake` option
@@ -80,22 +64,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
80
64
  - iOS: Integration with media player
81
65
 
82
66
 
83
-
84
-
85
-
86
-
87
67
  ## [1.1.17] - 2024-10-21
88
68
  ### Added
89
69
  - Support bluetooth headset on ios
90
70
  - Fixes: android not reading custom interval audio update
91
71
 
92
72
 
93
-
94
-
95
-
96
-
97
73
  ## [1.0.0] - 2024-04-01
98
-
99
74
  ### Added
100
75
  - Initial release of @siteed/expo-audio-stream.
101
76
  - Feature: Real-time audio streaming across iOS, Android, and web.
@@ -105,9 +80,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
105
80
  - Feature: Audio features extraction during recording.
106
81
  - Feature: Consistent WAV PCM recording format across all platforms.
107
82
 
108
- [unreleased]: https://github.com/deeeed/expo-audio-stream/compare/@siteed/expo-audio-stream@1.5.2...HEAD
109
- [1.5.2]: https://github.com/deeeed/expo-audio-stream/compare/@siteed/expo-audio-stream@1.5.1...@siteed/expo-audio-stream@1.5.2
110
- [1.5.1]: https://github.com/deeeed/expo-audio-stream/compare/@siteed/expo-audio-stream@1.5.0...@siteed/expo-audio-stream@1.5.1
83
+ [unreleased]: https://github.com/deeeed/expo-audio-stream/compare/@siteed/expo-audio-stream@1.6.1...HEAD
84
+ [1.6.1]: https://github.com/deeeed/expo-audio-stream/compare/@siteed/expo-audio-stream@1.6.0...@siteed/expo-audio-stream@1.6.1
111
85
  [1.5.0]: https://github.com/deeeed/expo-audio-stream/compare/@siteed/expo-audio-stream@1.4.0...@siteed/expo-audio-stream@1.5.0
112
86
  [1.4.0]: https://github.com/deeeed/expo-audio-stream/compare/@siteed/expo-audio-stream@1.3.1...@siteed/expo-audio-stream@1.4.0
113
87
  [1.3.1]: https://github.com/deeeed/expo-audio-stream/compare/@siteed/expo-audio-stream@1.3.0...@siteed/expo-audio-stream@1.3.1
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Represents various audio features extracted from an audio signal.
3
+ */
4
+ export interface AudioFeatures {
5
+ energy: number;
6
+ mfcc: number[];
7
+ rms: number;
8
+ minAmplitude: number;
9
+ maxAmplitude: number;
10
+ zcr: number;
11
+ spectralCentroid: number;
12
+ spectralFlatness: number;
13
+ spectralRolloff: number;
14
+ spectralBandwidth: number;
15
+ chromagram: number[];
16
+ tempo: number;
17
+ hnr: number;
18
+ }
19
+ /**
20
+ * Options to specify which audio features to extract.
21
+ */
22
+ export interface AudioFeaturesOptions {
23
+ energy?: boolean;
24
+ mfcc?: boolean;
25
+ rms?: boolean;
26
+ zcr?: boolean;
27
+ spectralCentroid?: boolean;
28
+ spectralFlatness?: boolean;
29
+ spectralRolloff?: boolean;
30
+ spectralBandwidth?: boolean;
31
+ chromagram?: boolean;
32
+ tempo?: boolean;
33
+ hnr?: boolean;
34
+ }
35
+ /**
36
+ * Represents a single data point in the audio analysis.
37
+ */
38
+ export interface DataPoint {
39
+ id: number;
40
+ amplitude: number;
41
+ activeSpeech?: boolean;
42
+ dB?: number;
43
+ silent?: boolean;
44
+ features?: AudioFeatures;
45
+ startTime?: number;
46
+ endTime?: number;
47
+ startPosition?: number;
48
+ endPosition?: number;
49
+ samples?: number;
50
+ speaker?: number;
51
+ }
52
+ export type AmplitudeAlgorithm = 'peak' | 'rms';
53
+ /**
54
+ * Represents the complete data from the audio analysis.
55
+ */
56
+ export interface AudioAnalysis {
57
+ pointsPerSecond: number;
58
+ durationMs: number;
59
+ bitDepth: number;
60
+ samples: number;
61
+ numberOfChannels: number;
62
+ sampleRate: number;
63
+ dataPoints: DataPoint[];
64
+ amplitudeAlgorithm: AmplitudeAlgorithm;
65
+ amplitudeRange: {
66
+ min: number;
67
+ max: number;
68
+ };
69
+ speakerChanges?: {
70
+ timestamp: number;
71
+ speaker: number;
72
+ }[];
73
+ }
74
+ //# sourceMappingURL=AudioAnalysis.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioAnalysis.types.d.ts","sourceRoot":"","sources":["../../src/AudioAnalysis/AudioAnalysis.types.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,CAAA;AAE/C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,cAAc,EAAE;QACZ,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,EAAE,MAAM,CAAA;KACd,CAAA;IAED,cAAc,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;KAClB,EAAE,CAAA;CACN"}
@@ -0,0 +1,3 @@
1
+ // packages/expo-audio-stream/src/AudioAnalysis/AudioAnalysis.types.ts
2
+ export {};
3
+ //# sourceMappingURL=AudioAnalysis.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioAnalysis.types.js","sourceRoot":"","sources":["../../src/AudioAnalysis/AudioAnalysis.types.ts"],"names":[],"mappings":"AAAA,sEAAsE","sourcesContent":["// packages/expo-audio-stream/src/AudioAnalysis/AudioAnalysis.types.ts\n\n/**\n * Represents various audio features extracted from an audio signal.\n */\nexport interface AudioFeatures {\n energy: number // The infinite integral of the squared signal, representing the overall energy of the audio.\n mfcc: number[] // Mel-frequency cepstral coefficients, describing the short-term power spectrum of a sound.\n rms: number // Root mean square value, indicating the amplitude of the audio signal.\n minAmplitude: number // Minimum amplitude value in the audio signal.\n maxAmplitude: number // Maximum amplitude value in the audio signal.\n zcr: number // Zero-crossing rate, indicating the rate at which the signal changes sign.\n spectralCentroid: number // The center of mass of the spectrum, indicating the brightness of the sound.\n spectralFlatness: number // Measure of the flatness of the spectrum, indicating how noise-like the signal is.\n spectralRolloff: number // The frequency below which a specified percentage (usually 85%) of the total spectral energy lies.\n spectralBandwidth: number // The width of the spectrum, indicating the range of frequencies present.\n chromagram: number[] // Chromagram, representing the 12 different pitch classes of the audio.\n tempo: number // Estimated tempo of the audio signal, measured in beats per minute (BPM).\n hnr: number // Harmonics-to-noise ratio, indicating the proportion of harmonics to noise in the audio signal.\n}\n\n/**\n * Options to specify which audio features to extract.\n */\nexport interface AudioFeaturesOptions {\n energy?: boolean\n mfcc?: boolean\n rms?: boolean\n zcr?: boolean\n spectralCentroid?: boolean\n spectralFlatness?: boolean\n spectralRolloff?: boolean\n spectralBandwidth?: boolean\n chromagram?: boolean\n tempo?: boolean\n hnr?: boolean\n}\n\n/**\n * Represents a single data point in the audio analysis.\n */\nexport interface DataPoint {\n id: number\n amplitude: number\n activeSpeech?: boolean\n dB?: number\n silent?: boolean\n features?: AudioFeatures\n startTime?: number\n endTime?: number\n // start / end position in bytes\n startPosition?: number\n endPosition?: number\n // number of audio samples for this point (samples size depends on bit depth)\n samples?: number\n // TODO: speaker detection\n speaker?: number\n}\n\nexport type AmplitudeAlgorithm = 'peak' | 'rms'\n\n/**\n * Represents the complete data from the audio analysis.\n */\nexport interface AudioAnalysis {\n pointsPerSecond: number // How many consolidated value per second\n durationMs: number // Duration of the audio in milliseconds\n bitDepth: number // Bit depth of the audio\n samples: number // Size of the audio in bytes\n numberOfChannels: number // Number of audio channels\n sampleRate: number // Sample rate of the audio\n dataPoints: DataPoint[] // Array of data points from the analysis.\n amplitudeAlgorithm: AmplitudeAlgorithm // Algorithm used to calculate amplitude values.\n amplitudeRange: {\n min: number\n max: number\n }\n // TODO: speaker detection\n speakerChanges?: {\n timestamp: number // Timestamp of the speaker change in milliseconds.\n speaker: number // Speaker identifier.\n }[]\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import { ConsoleLike } from '../ExpoAudioStream.types';
2
+ import { AmplitudeAlgorithm, AudioAnalysis, AudioFeaturesOptions } from './AudioAnalysis.types';
3
+ import { WavFileInfo } from '../utils/getWavFileInfo';
4
+ export interface ExtractAudioAnalysisProps {
5
+ fileUri?: string;
6
+ wavMetadata?: WavFileInfo;
7
+ arrayBuffer?: ArrayBuffer;
8
+ bitDepth?: number;
9
+ skipWavHeader?: boolean;
10
+ durationMs?: number;
11
+ sampleRate?: number;
12
+ numberOfChannels?: number;
13
+ algorithm?: AmplitudeAlgorithm;
14
+ position?: number;
15
+ length?: number;
16
+ pointsPerSecond?: number;
17
+ features?: AudioFeaturesOptions;
18
+ featuresExtratorUrl?: string;
19
+ logger?: ConsoleLike;
20
+ }
21
+ export declare const extractAudioAnalysis: ({ fileUri, pointsPerSecond, arrayBuffer, bitDepth, skipWavHeader, durationMs, sampleRate, numberOfChannels, algorithm, features, featuresExtratorUrl, logger, }: ExtractAudioAnalysisProps) => Promise<AudioAnalysis>;
22
+ //# sourceMappingURL=extractAudioAnalysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractAudioAnalysis.d.ts","sourceRoot":"","sources":["../../src/AudioAnalysis/extractAudioAnalysis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAGtD,OAAO,EACH,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACvB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAkB,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAGrE,MAAM,WAAW,yBAAyB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,kBAAkB,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,oBAAoB,CAAA;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAA;CACvB;AAED,eAAO,MAAM,oBAAoB,oKAa9B,yBAAyB,KAAG,QAAQ,aAAa,CAsGnD,CAAA"}
@@ -0,0 +1,86 @@
1
+ import ExpoAudioStreamModule from '../ExpoAudioStreamModule';
2
+ import { isWeb } from '../constants';
3
+ import { convertPCMToFloat32 } from '../utils/convertPCMToFloat32';
4
+ import { getWavFileInfo } from '../utils/getWavFileInfo';
5
+ import { InlineFeaturesExtractor } from '../workers/InlineFeaturesExtractor.web';
6
+ export const extractAudioAnalysis = async ({ fileUri, pointsPerSecond = 20, arrayBuffer, bitDepth, skipWavHeader = true, durationMs, sampleRate, numberOfChannels, algorithm = 'rms', features, featuresExtratorUrl, logger, }) => {
7
+ if (isWeb) {
8
+ if (!arrayBuffer && !fileUri) {
9
+ throw new Error('Either arrayBuffer or fileUri must be provided');
10
+ }
11
+ if (!arrayBuffer) {
12
+ logger?.log(`fetching fileUri`, fileUri);
13
+ const response = await fetch(fileUri);
14
+ if (!response.ok) {
15
+ throw new Error(`Failed to fetch fileUri: ${response.statusText}`);
16
+ }
17
+ arrayBuffer = await response.arrayBuffer();
18
+ logger?.log(`fetched fileUri`, arrayBuffer.byteLength, arrayBuffer);
19
+ }
20
+ // Create a new copy of the ArrayBuffer to avoid detachment issues
21
+ const bufferCopy = arrayBuffer.slice(0);
22
+ logger?.log(`extractAudioAnalysis skipWavHeader=${skipWavHeader} bitDepth=${bitDepth} len=${bufferCopy.byteLength}`, bufferCopy.slice(0, 100));
23
+ let actualBitDepth = bitDepth;
24
+ if (!actualBitDepth) {
25
+ logger?.log(`extractAudioAnalysis bitDepth not provided -- getting wav file info`);
26
+ const fileInfo = await getWavFileInfo(bufferCopy);
27
+ actualBitDepth = fileInfo.bitDepth;
28
+ }
29
+ logger?.log(`extractAudioAnalysis actualBitDepth=${actualBitDepth}`);
30
+ const { pcmValues: channelData, min, max, } = await convertPCMToFloat32({
31
+ buffer: arrayBuffer,
32
+ bitDepth: actualBitDepth,
33
+ skipWavHeader,
34
+ });
35
+ logger?.log(`extractAudioAnalysis skipWaveHeader=${skipWavHeader} convertPCMToFloat32 length=${channelData.length} range: [ ${min} :: ${max} ]`);
36
+ return new Promise((resolve, reject) => {
37
+ let worker;
38
+ if (featuresExtratorUrl) {
39
+ worker = new Worker(new URL(featuresExtratorUrl, window.location.href));
40
+ }
41
+ else {
42
+ const blob = new Blob([InlineFeaturesExtractor], {
43
+ type: 'application/javascript',
44
+ });
45
+ const url = URL.createObjectURL(blob);
46
+ worker = new Worker(url);
47
+ }
48
+ worker.onmessage = (event) => {
49
+ resolve(event.data.result);
50
+ };
51
+ worker.onerror = (error) => {
52
+ reject(error);
53
+ };
54
+ worker.postMessage({
55
+ command: 'process',
56
+ channelData,
57
+ sampleRate,
58
+ pointsPerSecond,
59
+ algorithm,
60
+ bitDepth,
61
+ fullAudioDurationMs: durationMs,
62
+ numberOfChannels,
63
+ });
64
+ });
65
+ }
66
+ else {
67
+ if (!fileUri) {
68
+ throw new Error('fileUri is required');
69
+ }
70
+ logger?.log(`extractAudioAnalysis`, {
71
+ fileUri,
72
+ pointsPerSecond,
73
+ algorithm,
74
+ });
75
+ const res = await ExpoAudioStreamModule.extractAudioAnalysis({
76
+ fileUri,
77
+ pointsPerSecond,
78
+ skipWavHeader,
79
+ algorithm,
80
+ features,
81
+ });
82
+ logger?.log(`extractAudioAnalysis`, res);
83
+ return res;
84
+ }
85
+ };
86
+ //# sourceMappingURL=extractAudioAnalysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractAudioAnalysis.js","sourceRoot":"","sources":["../../src/AudioAnalysis/extractAudioAnalysis.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/expo-audio-stream/src/AudioAnalysis/extractAudioAnalysis.ts\nimport { ConsoleLike } from '../ExpoAudioStream.types'\nimport ExpoAudioStreamModule from '../ExpoAudioStreamModule'\nimport { isWeb } from '../constants'\nimport {\n AmplitudeAlgorithm,\n AudioAnalysis,\n AudioFeaturesOptions,\n} from './AudioAnalysis.types'\nimport { convertPCMToFloat32 } from '../utils/convertPCMToFloat32'\nimport { getWavFileInfo, WavFileInfo } from '../utils/getWavFileInfo'\nimport { InlineFeaturesExtractor } from '../workers/InlineFeaturesExtractor.web'\n\nexport interface ExtractAudioAnalysisProps {\n fileUri?: string // should provide either fileUri or arrayBuffer\n wavMetadata?: WavFileInfo\n arrayBuffer?: ArrayBuffer\n bitDepth?: number\n skipWavHeader?: boolean\n durationMs?: number\n sampleRate?: number\n numberOfChannels?: number\n algorithm?: AmplitudeAlgorithm\n position?: number // Optional number of bytes to skip. Default is 0\n length?: number // Optional number of bytes to read.\n pointsPerSecond?: number // Optional number of points per second. Use to reduce the number of points and compute the number of datapoints to return.\n features?: AudioFeaturesOptions\n featuresExtratorUrl?: string\n logger?: ConsoleLike\n}\n\nexport const extractAudioAnalysis = async ({\n fileUri,\n pointsPerSecond = 20,\n arrayBuffer,\n bitDepth,\n skipWavHeader = true,\n durationMs,\n sampleRate,\n numberOfChannels,\n algorithm = 'rms',\n features,\n featuresExtratorUrl,\n logger,\n}: ExtractAudioAnalysisProps): Promise<AudioAnalysis> => {\n if (isWeb) {\n if (!arrayBuffer && !fileUri) {\n throw new Error('Either arrayBuffer or fileUri must be provided')\n }\n\n if (!arrayBuffer) {\n logger?.log(`fetching fileUri`, fileUri)\n const response = await fetch(fileUri!)\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch fileUri: ${response.statusText}`\n )\n }\n\n arrayBuffer = await response.arrayBuffer()\n logger?.log(`fetched fileUri`, arrayBuffer.byteLength, arrayBuffer)\n }\n\n // Create a new copy of the ArrayBuffer to avoid detachment issues\n const bufferCopy = arrayBuffer.slice(0)\n logger?.log(\n `extractAudioAnalysis skipWavHeader=${skipWavHeader} bitDepth=${bitDepth} len=${bufferCopy.byteLength}`,\n bufferCopy.slice(0, 100)\n )\n\n let actualBitDepth = bitDepth\n if (!actualBitDepth) {\n logger?.log(\n `extractAudioAnalysis bitDepth not provided -- getting wav file info`\n )\n const fileInfo = await getWavFileInfo(bufferCopy)\n actualBitDepth = fileInfo.bitDepth\n }\n logger?.log(`extractAudioAnalysis actualBitDepth=${actualBitDepth}`)\n\n const {\n pcmValues: channelData,\n min,\n max,\n } = await convertPCMToFloat32({\n buffer: arrayBuffer,\n bitDepth: actualBitDepth,\n skipWavHeader,\n })\n logger?.log(\n `extractAudioAnalysis skipWaveHeader=${skipWavHeader} convertPCMToFloat32 length=${channelData.length} range: [ ${min} :: ${max} ]`\n )\n\n return new Promise((resolve, reject) => {\n let worker: Worker\n if (featuresExtratorUrl) {\n worker = new Worker(\n new URL(featuresExtratorUrl, window.location.href)\n )\n } else {\n const blob = new Blob([InlineFeaturesExtractor], {\n type: 'application/javascript',\n })\n const url = URL.createObjectURL(blob)\n worker = new Worker(url)\n }\n\n worker.onmessage = (event) => {\n resolve(event.data.result)\n }\n\n worker.onerror = (error) => {\n reject(error)\n }\n\n worker.postMessage({\n command: 'process',\n channelData,\n sampleRate,\n pointsPerSecond,\n algorithm,\n bitDepth,\n fullAudioDurationMs: durationMs,\n numberOfChannels,\n })\n })\n } else {\n if (!fileUri) {\n throw new Error('fileUri is required')\n }\n logger?.log(`extractAudioAnalysis`, {\n fileUri,\n pointsPerSecond,\n algorithm,\n })\n const res = await ExpoAudioStreamModule.extractAudioAnalysis({\n fileUri,\n pointsPerSecond,\n skipWavHeader,\n algorithm,\n features,\n })\n logger?.log(`extractAudioAnalysis`, res)\n return res\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export interface ExtractWaveformProps {
2
+ fileUri: string;
3
+ numberOfSamples: number;
4
+ offset?: number;
5
+ length?: number;
6
+ }
7
+ export declare const extractWaveform: ({ fileUri, numberOfSamples, offset, length, }: ExtractWaveformProps) => Promise<unknown>;
8
+ //# sourceMappingURL=extractWaveform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractWaveform.d.ts","sourceRoot":"","sources":["../../src/AudioAnalysis/extractWaveform.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AACD,eAAO,MAAM,eAAe,kDAKzB,oBAAoB,KAAG,QAAQ,OAAO,CAQxC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import ExpoAudioStreamModule from '../ExpoAudioStreamModule';
2
+ export const extractWaveform = async ({ fileUri, numberOfSamples, offset = 0, length, }) => {
3
+ const res = await ExpoAudioStreamModule.extractAudioAnalysis({
4
+ fileUri,
5
+ numberOfSamples,
6
+ offset,
7
+ length,
8
+ });
9
+ return res;
10
+ };
11
+ //# sourceMappingURL=extractWaveform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractWaveform.js","sourceRoot":"","sources":["../../src/AudioAnalysis/extractWaveform.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,0BAA0B,CAAA;AAQ5D,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,EAClC,OAAO,EACP,eAAe,EACf,MAAM,GAAG,CAAC,EACV,MAAM,GACa,EAAoB,EAAE;IACzC,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,oBAAoB,CAAC;QACzD,OAAO;QACP,eAAe;QACf,MAAM;QACN,MAAM;KACT,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACd,CAAC,CAAA","sourcesContent":["import ExpoAudioStreamModule from '../ExpoAudioStreamModule'\n\nexport interface ExtractWaveformProps {\n fileUri: string\n numberOfSamples: number\n offset?: number\n length?: number\n}\nexport const extractWaveform = async ({\n fileUri,\n numberOfSamples,\n offset = 0,\n length,\n}: ExtractWaveformProps): Promise<unknown> => {\n const res = await ExpoAudioStreamModule.extractAudioAnalysis({\n fileUri,\n numberOfSamples,\n offset,\n length,\n })\n return res\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { UseAudioRecorderState } from './ExpoAudioStream.types';
3
+ import { UseAudioRecorderProps } from './useAudioRecorder';
4
+ interface AudioRecorderProviderProps {
5
+ children: React.ReactNode;
6
+ config?: UseAudioRecorderProps;
7
+ }
8
+ export declare const AudioRecorderProvider: React.FC<AudioRecorderProviderProps>;
9
+ export declare const useSharedAudioRecorder: () => UseAudioRecorderState;
10
+ export {};
11
+ //# sourceMappingURL=AudioRecorder.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioRecorder.provider.d.ts","sourceRoot":"","sources":["../src/AudioRecorder.provider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAoC,MAAM,OAAO,CAAA;AAExD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAoB,MAAM,oBAAoB,CAAA;AAuB5E,UAAU,0BAA0B;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,MAAM,CAAC,EAAE,qBAAqB,CAAA;CACjC;AAED,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAUtE,CAAA;AAED,eAAO,MAAM,sBAAsB,6BAQlC,CAAA"}
@@ -0,0 +1,36 @@
1
+ // packages/expo-audio-stream/src/AudioRecorder.provider.tsx
2
+ import React, { createContext, useContext } from 'react';
3
+ import { useAudioRecorder } from './useAudioRecorder';
4
+ const initContext = {
5
+ isRecording: false,
6
+ isPaused: false,
7
+ durationMs: 0,
8
+ size: 0,
9
+ startRecording: async () => {
10
+ throw new Error('AudioRecorderProvider not found');
11
+ },
12
+ stopRecording: async () => {
13
+ throw new Error('AudioRecorderProvider not found');
14
+ },
15
+ pauseRecording: async () => {
16
+ throw new Error('AudioRecorderProvider not found');
17
+ },
18
+ resumeRecording: async () => {
19
+ throw new Error('AudioRecorderProvider not found');
20
+ },
21
+ };
22
+ const AudioRecorderContext = createContext(initContext);
23
+ export const AudioRecorderProvider = ({ children, config = {}, }) => {
24
+ const audioRecorder = useAudioRecorder(config);
25
+ return (<AudioRecorderContext.Provider value={audioRecorder}>
26
+ {children}
27
+ </AudioRecorderContext.Provider>);
28
+ };
29
+ export const useSharedAudioRecorder = () => {
30
+ const context = useContext(AudioRecorderContext);
31
+ if (!context) {
32
+ throw new Error('useSharedAudioRecorder must be used within an AudioRecorderProvider');
33
+ }
34
+ return context;
35
+ };
36
+ //# sourceMappingURL=AudioRecorder.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioRecorder.provider.js","sourceRoot":"","sources":["../src/AudioRecorder.provider.tsx"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAGxD,OAAO,EAAyB,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE5E,MAAM,WAAW,GAA0B;IACvC,WAAW,EAAE,KAAK;IAClB,QAAQ,EAAE,KAAK;IACf,UAAU,EAAE,CAAC;IACb,IAAI,EAAE,CAAC;IACP,cAAc,EAAE,KAAK,IAAI,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACtD,CAAC;IACD,aAAa,EAAE,KAAK,IAAI,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACtD,CAAC;IACD,cAAc,EAAE,KAAK,IAAI,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACtD,CAAC;IACD,eAAe,EAAE,KAAK,IAAI,EAAE;QACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACtD,CAAC;CACJ,CAAA;AAED,MAAM,oBAAoB,GAAG,aAAa,CAAwB,WAAW,CAAC,CAAA;AAO9E,MAAM,CAAC,MAAM,qBAAqB,GAAyC,CAAC,EACxE,QAAQ,EACR,MAAM,GAAG,EAAE,GACd,EAAE,EAAE;IACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC9C,OAAO,CACH,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAChD;YAAA,CAAC,QAAQ,CACb;QAAA,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CACnC,CAAA;AACL,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACvC,MAAM,OAAO,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAA;IAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACX,qEAAqE,CACxE,CAAA;IACL,CAAC;IACD,OAAO,OAAO,CAAA;AAClB,CAAC,CAAA","sourcesContent":["// packages/expo-audio-stream/src/AudioRecorder.provider.tsx\nimport React, { createContext, useContext } from 'react'\n\nimport { UseAudioRecorderState } from './ExpoAudioStream.types'\nimport { UseAudioRecorderProps, useAudioRecorder } from './useAudioRecorder'\n\nconst initContext: UseAudioRecorderState = {\n isRecording: false,\n isPaused: false,\n durationMs: 0,\n size: 0,\n startRecording: async () => {\n throw new Error('AudioRecorderProvider not found')\n },\n stopRecording: async () => {\n throw new Error('AudioRecorderProvider not found')\n },\n pauseRecording: async () => {\n throw new Error('AudioRecorderProvider not found')\n },\n resumeRecording: async () => {\n throw new Error('AudioRecorderProvider not found')\n },\n}\n\nconst AudioRecorderContext = createContext<UseAudioRecorderState>(initContext)\n\ninterface AudioRecorderProviderProps {\n children: React.ReactNode\n config?: UseAudioRecorderProps\n}\n\nexport const AudioRecorderProvider: React.FC<AudioRecorderProviderProps> = ({\n children,\n config = {},\n}) => {\n const audioRecorder = useAudioRecorder(config)\n return (\n <AudioRecorderContext.Provider value={audioRecorder}>\n {children}\n </AudioRecorderContext.Provider>\n )\n}\n\nexport const useSharedAudioRecorder = () => {\n const context = useContext(AudioRecorderContext)\n if (!context) {\n throw new Error(\n 'useSharedAudioRecorder must be used within an AudioRecorderProvider'\n )\n }\n return context\n}\n"]}
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ //# sourceMappingURL=ExpoAudioStream.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoAudioStream.native.d.ts","sourceRoot":"","sources":["../src/ExpoAudioStream.native.ts"],"names":[],"mappings":";AAKA,wBAAqD"}
@@ -0,0 +1,6 @@
1
+ // src/ExpoAudioStreamModule.ts
2
+ import { requireNativeModule } from 'expo-modules-core';
3
+ // It loads the native module object from the JSI or falls back to
4
+ // the bridge module (from NativeModulesProxy) if the remote debugger is on.
5
+ export default requireNativeModule('ExpoAudioStream');
6
+ //# sourceMappingURL=ExpoAudioStream.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoAudioStream.native.js","sourceRoot":"","sources":["../src/ExpoAudioStream.native.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEvD,kEAAkE;AAClE,4EAA4E;AAC5E,eAAe,mBAAmB,CAAC,iBAAiB,CAAC,CAAA","sourcesContent":["// src/ExpoAudioStreamModule.ts\nimport { requireNativeModule } from 'expo-modules-core'\n\n// It loads the native module object from the JSI or falls back to\n// the bridge module (from NativeModulesProxy) if the remote debugger is on.\nexport default requireNativeModule('ExpoAudioStream')\n"]}
@@ -0,0 +1,127 @@
1
+ import { AmplitudeAlgorithm, AudioAnalysis, AudioFeaturesOptions } from './AudioAnalysis/AudioAnalysis.types';
2
+ import { AudioAnalysisEvent } from './events';
3
+ export interface AudioStreamStatus {
4
+ isRecording: boolean;
5
+ isPaused: boolean;
6
+ durationMs: number;
7
+ size: number;
8
+ interval: number;
9
+ mimeType: string;
10
+ }
11
+ export interface AudioDataEvent {
12
+ data: string | Float32Array;
13
+ position: number;
14
+ fileUri: string;
15
+ eventDataSize: number;
16
+ totalSize: number;
17
+ }
18
+ export type EncodingType = 'pcm_32bit' | 'pcm_16bit' | 'pcm_8bit';
19
+ export type SampleRate = 16000 | 44100 | 48000;
20
+ export type BitDepth = 8 | 16 | 32;
21
+ export type ConsoleLike = {
22
+ log: (message: string, ...args: unknown[]) => void;
23
+ debug: (message: string, ...args: unknown[]) => void;
24
+ warn: (message: string, ...args: unknown[]) => void;
25
+ error: (message: string, ...args: unknown[]) => void;
26
+ };
27
+ export interface Chunk {
28
+ text: string;
29
+ timestamp: [number, number | null];
30
+ }
31
+ export interface TranscriberData {
32
+ id: string;
33
+ isBusy: boolean;
34
+ text: string;
35
+ startTime: number;
36
+ endTime: number;
37
+ chunks: Chunk[];
38
+ }
39
+ export interface AudioRecording {
40
+ fileUri: string;
41
+ filename: string;
42
+ durationMs: number;
43
+ size: number;
44
+ mimeType: string;
45
+ channels: number;
46
+ bitDepth: BitDepth;
47
+ sampleRate: SampleRate;
48
+ transcripts?: TranscriberData[];
49
+ wavPCMData?: Float32Array;
50
+ analysisData?: AudioAnalysis;
51
+ }
52
+ export interface StartRecordingResult {
53
+ fileUri: string;
54
+ mimeType: string;
55
+ channels?: number;
56
+ bitDepth?: BitDepth;
57
+ sampleRate?: SampleRate;
58
+ }
59
+ export interface AudioSessionConfig {
60
+ category?: 'Ambient' | 'SoloAmbient' | 'Playback' | 'Record' | 'PlayAndRecord' | 'MultiRoute';
61
+ mode?: 'Default' | 'VoiceChat' | 'VideoChat' | 'GameChat' | 'VideoRecording' | 'Measurement' | 'MoviePlayback' | 'SpokenAudio';
62
+ categoryOptions?: ('MixWithOthers' | 'DuckOthers' | 'InterruptSpokenAudioAndMixWithOthers' | 'AllowBluetooth' | 'AllowBluetoothA2DP' | 'AllowAirPlay' | 'DefaultToSpeaker')[];
63
+ }
64
+ export interface IOSConfig {
65
+ audioSession?: AudioSessionConfig;
66
+ }
67
+ export interface RecordingConfig {
68
+ sampleRate?: SampleRate;
69
+ channels?: 1 | 2;
70
+ encoding?: EncodingType;
71
+ interval?: number;
72
+ keepAwake?: boolean;
73
+ showNotification?: boolean;
74
+ showWaveformInNotification?: boolean;
75
+ notification?: NotificationConfig;
76
+ enableProcessing?: boolean;
77
+ ios?: IOSConfig;
78
+ pointsPerSecond?: number;
79
+ algorithm?: AmplitudeAlgorithm;
80
+ features?: AudioFeaturesOptions;
81
+ onAudioStream?: (_: AudioDataEvent) => Promise<void>;
82
+ onAudioAnalysis?: (_: AudioAnalysisEvent) => Promise<void>;
83
+ }
84
+ export interface NotificationConfig {
85
+ title?: string;
86
+ text?: string;
87
+ icon?: string;
88
+ android?: {
89
+ channelId?: string;
90
+ channelName?: string;
91
+ channelDescription?: string;
92
+ notificationId?: number;
93
+ actions?: NotificationAction[];
94
+ waveform?: WaveformConfig;
95
+ lightColor?: string;
96
+ priority?: 'min' | 'low' | 'default' | 'high' | 'max';
97
+ accentColor?: string;
98
+ };
99
+ ios?: {
100
+ categoryIdentifier?: string;
101
+ };
102
+ }
103
+ export interface NotificationAction {
104
+ title: string;
105
+ identifier: string;
106
+ icon?: string;
107
+ }
108
+ export interface WaveformConfig {
109
+ color?: string;
110
+ opacity?: number;
111
+ strokeWidth?: number;
112
+ style?: 'stroke' | 'fill';
113
+ mirror?: boolean;
114
+ height?: number;
115
+ }
116
+ export interface UseAudioRecorderState {
117
+ startRecording: (_: RecordingConfig) => Promise<StartRecordingResult>;
118
+ stopRecording: () => Promise<AudioRecording | null>;
119
+ pauseRecording: () => Promise<void>;
120
+ resumeRecording: () => Promise<void>;
121
+ isRecording: boolean;
122
+ isPaused: boolean;
123
+ durationMs: number;
124
+ size: number;
125
+ analysisData?: AudioAnalysis;
126
+ }
127
+ //# sourceMappingURL=ExpoAudioStream.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoAudioStream.types.d.ts","sourceRoot":"","sources":["../src/ExpoAudioStream.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ExpoAudioStream.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoAudioStream.types.js","sourceRoot":"","sources":["../src/ExpoAudioStream.types.ts"],"names":[],"mappings":"","sourcesContent":["// packages/expo-audio-stream/src/ExpoAudioStream.types.ts\nimport {\n AmplitudeAlgorithm,\n AudioAnalysis,\n AudioFeaturesOptions,\n} from './AudioAnalysis/AudioAnalysis.types'\nimport { AudioAnalysisEvent } from './events'\n\nexport interface AudioStreamStatus {\n isRecording: boolean\n isPaused: boolean\n durationMs: number\n size: number\n interval: number\n mimeType: string\n}\n\nexport interface AudioDataEvent {\n data: string | Float32Array\n position: number\n fileUri: string\n eventDataSize: number\n totalSize: number\n}\n\nexport type EncodingType = 'pcm_32bit' | 'pcm_16bit' | 'pcm_8bit'\nexport type SampleRate = 16000 | 44100 | 48000\nexport type BitDepth = 8 | 16 | 32\n\nexport type ConsoleLike = {\n log: (message: string, ...args: unknown[]) => void\n debug: (message: string, ...args: unknown[]) => void\n warn: (message: string, ...args: unknown[]) => void\n error: (message: string, ...args: unknown[]) => void\n}\n\nexport interface Chunk {\n text: string\n timestamp: [number, number | null]\n}\n\nexport interface TranscriberData {\n id: string\n isBusy: boolean\n text: string\n startTime: number\n endTime: number\n chunks: Chunk[]\n}\n\nexport interface AudioRecording {\n fileUri: string\n filename: string\n durationMs: number\n size: number\n mimeType: string\n channels: number\n bitDepth: BitDepth\n sampleRate: SampleRate\n transcripts?: TranscriberData[]\n wavPCMData?: Float32Array // Full PCM data for the recording in WAV format (only on web, for native use the fileUri)\n analysisData?: AudioAnalysis // Analysis data for the recording depending on enableProcessing flag\n}\n\nexport interface StartRecordingResult {\n fileUri: string\n mimeType: string\n channels?: number\n bitDepth?: BitDepth\n sampleRate?: SampleRate\n}\n\nexport interface AudioSessionConfig {\n category?:\n | 'Ambient'\n | 'SoloAmbient'\n | 'Playback'\n | 'Record'\n | 'PlayAndRecord'\n | 'MultiRoute'\n mode?:\n | 'Default'\n | 'VoiceChat'\n | 'VideoChat'\n | 'GameChat'\n | 'VideoRecording'\n | 'Measurement'\n | 'MoviePlayback'\n | 'SpokenAudio'\n categoryOptions?: (\n | 'MixWithOthers'\n | 'DuckOthers'\n | 'InterruptSpokenAudioAndMixWithOthers'\n | 'AllowBluetooth'\n | 'AllowBluetoothA2DP'\n | 'AllowAirPlay'\n | 'DefaultToSpeaker'\n )[]\n}\n\nexport interface IOSConfig {\n audioSession?: AudioSessionConfig\n}\n\nexport interface RecordingConfig {\n // Sample rate for recording (16000, 44100, or 48000 Hz)\n sampleRate?: SampleRate\n\n // Number of audio channels (1 for mono, 2 for stereo)\n channels?: 1 | 2\n\n // Encoding type for the recording (pcm_32bit, pcm_16bit, pcm_8bit)\n encoding?: EncodingType\n\n // Interval in milliseconds at which to emit recording data\n interval?: number\n\n // Keep the device awake while recording (default is false)\n keepAwake?: boolean\n\n // Show a notification during recording (default is false)\n showNotification?: boolean\n\n // Show waveform in the notification (Android only, when showNotification is true)\n showWaveformInNotification?: boolean\n\n // Configuration for the notification\n notification?: NotificationConfig\n\n // Enable audio processing (default is false)\n enableProcessing?: boolean\n\n // iOS-specific configuration\n ios?: IOSConfig\n\n // Number of data points to extract per second of audio (default is 1000)\n pointsPerSecond?: number\n\n // Algorithm to use for amplitude computation (default is \"rms\")\n algorithm?: AmplitudeAlgorithm\n\n // Feature options to extract (default is empty)\n features?: AudioFeaturesOptions\n\n // Callback function to handle audio stream\n onAudioStream?: (_: AudioDataEvent) => Promise<void>\n\n // Callback function to handle audio features extraction results\n onAudioAnalysis?: (_: AudioAnalysisEvent) => Promise<void>\n}\n\nexport interface NotificationConfig {\n // Title of the notification\n title?: string\n\n // Main text content of the notification\n text?: string\n\n // Icon to be displayed in the notification (resource name or URI)\n icon?: string\n\n // Android-specific notification configuration\n android?: {\n // Unique identifier for the notification channel\n channelId?: string\n\n // User-visible name of the notification channel\n channelName?: string\n\n // User-visible description of the notification channel\n channelDescription?: string\n\n // Unique identifier for this notification\n notificationId?: number\n\n // List of actions that can be performed from the notification\n actions?: NotificationAction[]\n\n // Configuration for the waveform visualization in the notification\n waveform?: WaveformConfig\n\n // Color of the notification LED (if device supports it)\n lightColor?: string\n\n // Priority of the notification (affects how it's displayed)\n priority?: 'min' | 'low' | 'default' | 'high' | 'max'\n\n // Accent color for the notification (used for the app icon and buttons)\n accentColor?: string\n }\n\n // iOS-specific notification configuration\n ios?: {\n // Identifier for the notification category (used for grouping similar notifications)\n categoryIdentifier?: string\n }\n}\n\nexport interface NotificationAction {\n // Display title for the action\n title: string\n\n // Unique identifier for the action\n identifier: string\n\n // Icon to be displayed for the action (Android only)\n icon?: string\n}\n\nexport interface WaveformConfig {\n color?: string // The color of the waveform (e.g., \"#FFFFFF\" for white)\n opacity?: number // Opacity of the waveform (0.0 - 1.0)\n strokeWidth?: number // Width of the waveform line (default: 1.5)\n style?: 'stroke' | 'fill' // Drawing style: \"stroke\" for outline, \"fill\" for solid\n mirror?: boolean // Whether to mirror the waveform (symmetrical display)\n height?: number // Height of the waveform view in dp (default: 64)\n}\n\nexport interface UseAudioRecorderState {\n startRecording: (_: RecordingConfig) => Promise<StartRecordingResult>\n stopRecording: () => Promise<AudioRecording | null>\n pauseRecording: () => Promise<void>\n resumeRecording: () => Promise<void>\n isRecording: boolean\n isPaused: boolean\n durationMs: number // Duration of the recording\n size: number // Size in bytes of the recorded audio\n analysisData?: AudioAnalysis // Analysis data for the recording depending on enableProcessing flag\n}\n"]}