@siteed/audio-studio 3.2.0-beta.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/CHANGELOG.md +356 -5
  2. package/android/src/main/java/net/siteed/audiostudio/AudioStreamDecoder.kt +306 -94
  3. package/android/src/main/java/net/siteed/audiostudio/AudioStudioModule.kt +39 -6
  4. package/build/cjs/errors/AudioStreamError.js +9 -0
  5. package/build/cjs/errors/AudioStreamError.js.map +1 -1
  6. package/build/cjs/errors/AudioStreamError.test.js +22 -1
  7. package/build/cjs/errors/AudioStreamError.test.js.map +1 -1
  8. package/build/cjs/streamAudioData.js +99 -32
  9. package/build/cjs/streamAudioData.js.map +1 -1
  10. package/build/cjs/utils/audioProcessing.js +14 -10
  11. package/build/cjs/utils/audioProcessing.js.map +1 -1
  12. package/build/esm/errors/AudioStreamError.js +9 -0
  13. package/build/esm/errors/AudioStreamError.js.map +1 -1
  14. package/build/esm/errors/AudioStreamError.test.js +22 -1
  15. package/build/esm/errors/AudioStreamError.test.js.map +1 -1
  16. package/build/esm/streamAudioData.js +99 -32
  17. package/build/esm/streamAudioData.js.map +1 -1
  18. package/build/esm/utils/audioProcessing.js +14 -10
  19. package/build/esm/utils/audioProcessing.js.map +1 -1
  20. package/build/types/errors/AudioStreamError.d.ts.map +1 -1
  21. package/build/types/streamAudioData.d.ts +5 -0
  22. package/build/types/streamAudioData.d.ts.map +1 -1
  23. package/build/types/utils/audioProcessing.d.ts +2 -2
  24. package/build/types/utils/audioProcessing.d.ts.map +1 -1
  25. package/ios/AudioStreamDecoder.swift +191 -100
  26. package/ios/AudioStudioModule.swift +48 -9
  27. package/package.json +163 -146
  28. package/scripts/README.md +58 -0
  29. package/src/errors/AudioStreamError.test.ts +29 -2
  30. package/src/errors/AudioStreamError.ts +14 -0
  31. package/src/streamAudioData.ts +146 -42
  32. package/src/utils/audioProcessing.ts +25 -14
  33. package/android/src/androidTest/assets/chorus.wav +0 -0
  34. package/android/src/androidTest/assets/jfk.wav +0 -0
  35. package/android/src/androidTest/assets/osr_us_000_0010_8k.wav +0 -0
  36. package/android/src/androidTest/assets/recorder_hello_world.wav +0 -0
  37. package/android/src/androidTest/java/net/siteed/audiostudio/AudioFinalMetadataContractInstrumentedTest.kt +0 -190
  38. package/android/src/androidTest/java/net/siteed/audiostudio/AudioProcessorInstrumentedTest.kt +0 -197
  39. package/android/src/androidTest/java/net/siteed/audiostudio/AudioRecorderInstrumentedTest.kt +0 -487
  40. package/android/src/androidTest/java/net/siteed/audiostudio/AudioRecorderPerformanceInstrumentedTest.kt +0 -250
  41. package/android/src/androidTest/java/net/siteed/audiostudio/OpusRangeDecodeRegressionInstrumentedTest.kt +0 -186
  42. package/android/src/androidTest/java/net/siteed/audiostudio/integration/AudioFocusStrategyIntegrationTest.kt +0 -332
  43. package/android/src/androidTest/java/net/siteed/audiostudio/integration/BufferDurationIntegrationTest.kt +0 -324
  44. package/android/src/androidTest/java/net/siteed/audiostudio/integration/CompressedOnlyOutputTest.kt +0 -253
  45. package/android/src/androidTest/java/net/siteed/audiostudio/integration/DeviceDisconnectionFallbackTest.kt +0 -218
  46. package/android/src/androidTest/java/net/siteed/audiostudio/integration/EventEmissionIntervalTest.kt +0 -120
  47. package/android/src/androidTest/java/net/siteed/audiostudio/integration/M4aFormatTest.kt +0 -345
  48. package/android/src/androidTest/java/net/siteed/audiostudio/integration/OutputControlIntegrationTest.kt +0 -340
  49. package/android/src/androidTest/java/net/siteed/audiostudio/integration/PcmStreamingDurationTest.kt +0 -252
  50. package/android/src/androidTest/java/net/siteed/audiostudio/integration/README.md +0 -95
  51. package/android/src/androidTest/java/net/siteed/audiostudio/integration/run_integration_tests.sh +0 -43
  52. package/android/src/test/java/net/siteed/audiostudio/AndroidCallStateTest.kt +0 -37
  53. package/android/src/test/java/net/siteed/audiostudio/AndroidEventEmitterTest.kt +0 -28
  54. package/android/src/test/java/net/siteed/audiostudio/AudioFileHandlerTest.kt +0 -279
  55. package/android/src/test/java/net/siteed/audiostudio/AudioFocusStrategyTest.kt +0 -249
  56. package/android/src/test/java/net/siteed/audiostudio/AudioFormatTest.kt +0 -151
  57. package/android/src/test/java/net/siteed/audiostudio/AudioFormatUtilsTest.kt +0 -273
  58. package/android/src/test/java/net/siteed/audiostudio/DeviceDisconnectionFallbackUnitTest.kt +0 -140
  59. package/android/src/test/java/net/siteed/audiostudio/InterruptionAutoResumePolicyTest.kt +0 -49
  60. package/android/src/test/resources/chorus.wav +0 -0
  61. package/android/src/test/resources/generate_test_audio.py +0 -94
  62. package/android/src/test/resources/jfk.wav +0 -0
  63. package/android/src/test/resources/osr_us_000_0010_8k.wav +0 -0
  64. package/android/src/test/resources/recorder_hello_world.wav +0 -0
  65. package/ios/AudioStudioTests/AudioFileHandlerTests.swift +0 -338
  66. package/ios/AudioStudioTests/AudioFormatUtilsTests.swift +0 -331
  67. package/ios/AudioStudioTests/AudioStreamDecoderTests.swift +0 -128
  68. package/ios/AudioStudioTests/AudioTestHelpers.swift +0 -130
  69. package/ios/AudioStudioTests/CompressedOnlyOutputTests.swift +0 -334
  70. package/ios/AudioStudioTests/EventEmissionIntervalTests.swift +0 -105
  71. package/ios/AudioStudioTests/Info.plist +0 -22
  72. package/ios/AudioStudioTests/README.md +0 -39
  73. package/ios/AudioStudioTests/SimpleAudioTest.swift +0 -98
  74. package/ios/AudioStudioTests/TestAudioGenerator.swift +0 -75
  75. package/ios/tests/README.md +0 -41
  76. package/ios/tests/integration/buffer_and_fallback_test.swift +0 -178
  77. package/ios/tests/integration/buffer_duration_test.swift +0 -185
  78. package/ios/tests/integration/compressed_only_output_test.swift +0 -271
  79. package/ios/tests/integration/output_control_test.swift +0 -322
  80. package/ios/tests/integration/run_integration_tests.sh +0 -37
  81. package/ios/tests/opus_support_test_macos.swift +0 -154
  82. package/ios/tests/standalone/audio_processing_test.swift +0 -144
  83. package/ios/tests/standalone/audio_recording_test.swift +0 -277
  84. package/ios/tests/standalone/audio_streaming_test.swift +0 -249
  85. package/ios/tests/standalone/standalone_test.swift +0 -144
package/CHANGELOG.md CHANGED
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [3.2.0] - 2026-05-15
11
+
12
+ Stable release of the progressive long-audio decode API introduced in `3.2.0-beta.1`.
13
+
14
+ ### Added
15
+
16
+ - `streamAudioData(options, callbacks)` for cross-platform progressive file decoding without materializing full long recordings in memory.
17
+ - `getAudioDecodeCapabilities()` for platform decode feature discovery.
18
+ - Long-audio validation tooling and playground screen for decode/transcription progress, cancellation, and Moonshine/Sherpa benchmark runs.
19
+
20
+ ### Fixed
21
+
22
+ - Improved `streamAudioData` parity across iOS, Android, and web for channel defaults, sample-rate handling, range progress, cancellation, chunk sizing, and long-file memory behavior.
23
+
24
+ ## [3.2.0-beta.1] - 2026-05-14
25
+
26
+ Beta release for client validation of the progressive decode API.
27
+
10
28
  ### Added
11
29
 
12
30
  - `streamAudioData(options, callbacks)` — progressive Float32 file decode for
@@ -15,9 +33,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
15
33
  rate, channel downmix, and stable error codes via the new
16
34
  `AudioStreamError` class.
17
35
  - `getAudioDecodeCapabilities()` for platform feature discovery.
36
+ - `validate:stream-long` physical-device harness for CDP/ADB JSONL validation
37
+ of long compressed files, including decode-only, full-buffer control,
38
+ Moonshine-feed, configurable Sherpa ONNX online-ASR, and bounded offline
39
+ Sherpa/Qwen3 segment modes, range-limited short-run comparisons, Android
40
+ memory snapshots, cancellation, stall detection, and pass/fail memory budgets.
41
+ - `validate:stream-long` can copy a previously downloaded Sherpa model from
42
+ another debug app sandbox (for example `apps/sherpa-voice`) into the
43
+ playground sandbox via `--stage-sherpa-model-from package:path`, or stage a
44
+ host model directory with `--stage-sherpa-model-host-dir`, making Qwen3
45
+ benchmarking reproducible without re-downloading the ~GB extracted model.
46
+ - Sherpa offline segment validation can release/reinitialize ASR between
47
+ segments (`--sherpa-release-between-segments`, defaulted on for Qwen3) to
48
+ reduce retained native heap during long segmented Qwen3 runs.
49
+ - `summarize:stream-long` converts `validate:stream-long` JSONL logs into
50
+ Markdown/CSV/JSON benchmark tables for comparing decode-only, Moonshine,
51
+ Sherpa online, and Sherpa/Qwen3 segmented runs.
52
+ - Long-fixture Android evidence now includes a full 100-minute Qwen3 offline
53
+ segment run with 30-second segments and ASR release/reinit between segments,
54
+ plus a Moonshine memory-budget failure path that cancels before OOM.
55
+ - The long-fixture validation matrix now covers Opus, MP3, and AAC/M4A Android
56
+ decode, with MP3/AAC short Qwen3 decode/transcribe smokes against the same
57
+ 100-minute source recording.
58
+ - Playground `/long-audio-validation` page and agentic recipe for interactive
59
+ long compressed-audio validation with live progress, cancellation, Moonshine
60
+ model id selection, pasted Sherpa `AsrModelConfig` JSON, and a Qwen3-oriented
61
+ offline segment button.
18
62
  - iOS: `AVAssetReader`-based decoder with per-`requestId` cancellation.
19
63
  - Android: `MediaExtractor` + `MediaCodec` decoder with linear resampling that
20
- preserves continuity across codec buffer boundaries.
64
+ preserves continuity across codec buffer boundaries. Codec output-format
65
+ changes (`INFO_OUTPUT_FORMAT_CHANGED`) now feed the resampler so emitted
66
+ chunk timestamps remain accurate when the codec advertises a different
67
+ source rate than the extractor.
21
68
  - Docs: `docs/STREAM_AUDIO_DATA.md`.
22
69
 
23
70
  ### Fixed
@@ -26,31 +73,90 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
26
73
  decoded samples. Float-to-`Int16`/`Int32` conversion now replaces NaN/Inf
27
74
  with `0` and clamps the scaled value into the integer range before
28
75
  conversion.
76
+ - Web `streamAudioData` now interleaves multi-channel output and defaults the
77
+ target sample rate to the source rate when `targetSampleRate` is omitted,
78
+ matching iOS/Android. `maxChunkBytes` is clamped to a minimum of one frame
79
+ (`channels * 4` bytes) to avoid the previous infinite-zero-chunk loop when
80
+ callers pass a value below the frame size.
81
+ - Android `streamAudioData` keeps the active pending buffer after growth so
82
+ the remainder shift never drops samples on the next decode iteration, and
83
+ `content://` inputs delete their cache copy after decode/cancel/error
84
+ instead of leaving a per-stream temp file on disk.
85
+ - iOS and Android `OnDestroy` now cancel any in-flight `streamAudioData`
86
+ decoders before module teardown so decoder threads cannot outlive the
87
+ React context and emit events through a destroyed module.
88
+ - iOS and Web `streamAudioData` honor `endTimeMs` when `startTimeMs` is
89
+ omitted, treating the missing start as `0` to match Android and the
90
+ documented range contract.
91
+ - iOS and Android `streamAudioData` report the decoded _range_ duration in
92
+ the progress/complete payloads (previously the full asset duration), so
93
+ `processedMs / durationMs` is accurate for bounded time ranges across all
94
+ three platforms.
95
+ - `streamAudioData` rounds `maxChunkBytes` down to a whole interleaved frame
96
+ (`channels * 4` bytes) on every platform so stereo callers with a tight
97
+ byte cap never split a frame across two chunks.
98
+ - iOS `streamAudioData` no longer pays `O(n)` `Array.removeFirst` cost per
99
+ emitted chunk; the pending buffer uses a head-index cursor with periodic
100
+ compaction.
101
+ - `streamAudioData` chunk timestamps are now absolute (range start + offset)
102
+ on Web to match iOS/Android, and `onProgress.processedMs` is elapsed time
103
+ within the requested range on every platform so the
104
+ `processedMs / durationMs` fraction stays in `[0, 1]` regardless of
105
+ `startTimeMs`.
106
+ - iOS/Android `streamAudioData` event delivery is now gated on the decoder
107
+ still being tracked by the module. Terminal events emitted by a worker
108
+ thread after `OnDestroy` (which clears the map before cancelling) are
109
+ dropped instead of forwarded through a destroyed React context. This also
110
+ survives Expo's `definition()` re-runs because there is no one-way
111
+ shutdown flag.
112
+ - Android `streamAudioData` trims encoder pre-roll: when
113
+ `SEEK_TO_CLOSEST_SYNC` lands before the requested `startTimeMs` (common
114
+ for AAC/MP3 sync-frame containers), source-rate frames whose presentation
115
+ time is before `startTimeMs` are dropped before resampling so the first
116
+ emitted sample lines up with the requested start.
117
+ - Web `streamAudioData` clamps the `onProgress` fraction to `[0, 1]` so
118
+ resample rounding on the tail chunk never reports `> 1`. iOS and Android
119
+ also emit a final `onProgress` after the tail chunk for parity with the
120
+ `complete` payload.
121
+ - iOS `streamAudioData` cancelled `complete` payload now reports the
122
+ requested range duration in `durationMs` (matching Android) instead of
123
+ the elapsed decoded duration; consumers still get the elapsed count via
124
+ `samples` and `chunks`.
29
125
 
30
126
  ## [3.1.1] - 2026-05-08
127
+
31
128
  ### Fixed
129
+
32
130
  - Trust Android final decoded PCM metadata for range extraction and trimming, including JS `Number` options bridged as Kotlin `Double`.
33
131
  - Keep default Android validation deterministic by replacing physical loopback assertions and gating long recorder benchmarks behind an opt-in flag.
34
132
 
35
133
  ### Changed
36
- - Document the playground CDP regression-contract workflow and make optional VAD model loading cache-first.
37
134
 
135
+ - Document the playground CDP regression-contract workflow and make optional VAD model loading cache-first.
38
136
 
39
137
  ## [3.1.0] - 2026-05-01
138
+
40
139
  ### Changed
140
+
41
141
  - fix(audio-studio): preserve pause intent across interruptions (#375) ([2f0f731](https://github.com/deeeed/audiolab/commit/2f0f731e412f45fc81c4fe46bec2abd3f15b4824))
42
142
  - fix(android): avoid recorder crashes from stale system callbacks (#374) ([34a9bc0](https://github.com/deeeed/audiolab/commit/34a9bc0c2f7c4e3e569862e8db43710abbde9043))
43
143
  - Document when to avoid retaining live analysis history (#373) ([aa617b0](https://github.com/deeeed/audiolab/commit/aa617b048dd790218dda43ec2ed21e0abaf38daf))
44
144
  - Let long-running analysis skip full history retention (#372) ([13c230c](https://github.com/deeeed/audiolab/commit/13c230cde655131a3a7c9472d294b2d432f79d50))
45
145
  - Keep low-rate iOS AAC recordings from losing compressed output (#371) ([a689eb0](https://github.com/deeeed/audiolab/commit/a689eb03c7436429bd3bf997430f7f7c842b2e57))
46
146
  - chore(audio-studio): release @siteed/audio-studio@3.0.5 ([9dff021](https://github.com/deeeed/audiolab/commit/9dff0219993803d29a03946cf81fe2bedb541cab))
147
+
47
148
  ## [3.0.5] - 2026-04-25
149
+
48
150
  ### Changed
151
+
49
152
  - fix(audio-studio): don't start notification on prepareRecording (Android) (#364) ([5d40d7e](https://github.com/deeeed/audiolab/commit/5d40d7e730f2b74459d319979fd9c112891b10f2))
50
153
  - docs: update api references for v3.0.4 ([12421ee](https://github.com/deeeed/audiolab/commit/12421ee6146187888492b957c0eee428fcab3e8b))
51
154
  - chore(audio-studio): release @siteed/audio-studio@3.0.4 ([3a5b7da](https://github.com/deeeed/audiolab/commit/3a5b7da8f4289a599d928dce01f262ab97398143))
155
+
52
156
  ## [3.0.4] - 2026-04-25
157
+
53
158
  ### Changed
159
+
54
160
  - fix(audio-studio): move module ops off main thread + fix iOS stop crash (#363) ([1a07d2d](https://github.com/deeeed/audiolab/commit/1a07d2d9222bfac1083b00d6de992fcb2a3be42d))
55
161
  - chore(audio-studio): release @siteed/audio-studio@3.0.3 ([9d4d14e](https://github.com/deeeed/audiolab/commit/9d4d14e8dffd4378a71f2d3dfb5d7140b8248c0f))
56
162
  - fix(audio-studio): convert trim ranges from Double to Long on Android (#347) (#360) ([6099e0e](https://github.com/deeeed/audiolab/commit/6099e0e81f3c8d7b1c109b415ad63e924f3f043b))
@@ -58,33 +164,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
58
164
  - feat(sherpa-voice): comprehensive logging + fix Android prod model extraction (#342) ([5b20594](https://github.com/deeeed/audiolab/commit/5b20594c729a9deb703cbc2e23c07daa616149ab))
59
165
  - fix(audio-studio): remove blocking CDN poll from publish.sh, sync wasmConfig to 3.0.2 ([290409a](https://github.com/deeeed/audiolab/commit/290409aae8d1160e1952a5ee1961ce3864fbb0c8))
60
166
  - chore(audio-studio): release @siteed/audio-studio@3.0.2 ([ebd3300](https://github.com/deeeed/audiolab/commit/ebd330098d2756e6d5a555126e2dfc3fb038d155))
167
+
61
168
  ## [3.0.3] - 2026-04-12
169
+
62
170
  ### Changed
171
+
63
172
  - fix(audio-studio): convert trim ranges from Double to Long on Android (#347) (#360) ([6099e0e](https://github.com/deeeed/audiolab/commit/6099e0e81f3c8d7b1c109b415ad63e924f3f043b))
64
173
  - feat(audio-studio): web trimAudio, WASM refactor, new utilities (#344) ([3d4862a](https://github.com/deeeed/audiolab/commit/3d4862a57a5eb2496169d27f758d7628d7d3659a))
65
174
  - feat(sherpa-voice): comprehensive logging + fix Android prod model extraction (#342) ([5b20594](https://github.com/deeeed/audiolab/commit/5b20594c729a9deb703cbc2e23c07daa616149ab))
66
175
  - fix(audio-studio): remove blocking CDN poll from publish.sh, sync wasmConfig to 3.0.2 ([290409a](https://github.com/deeeed/audiolab/commit/290409aae8d1160e1952a5ee1961ce3864fbb0c8))
67
176
  - chore(audio-studio): release @siteed/audio-studio@3.0.2 ([ebd3300](https://github.com/deeeed/audiolab/commit/ebd330098d2756e6d5a555126e2dfc3fb038d155))
177
+
68
178
  ## [3.0.2] - 2026-03-21
179
+
69
180
  ### Changed
181
+
70
182
  - fix(audio-studio): load WASM via CDN URL instead of broken relative path ([7427f28](https://github.com/deeeed/audiolab/commit/7427f289d273ffad609a4c6b0fb45c5094445dde))
71
183
  - chore(audio-studio): disable conventionalCommits in publisher config, rewrite clean CHANGELOG ([4a2bbfa](https://github.com/deeeed/audiolab/commit/4a2bbfa605a56cab06618c0ca1afe6ff8cb19441))
72
184
  - chore(audio-studio): release @siteed/audio-studio@3.0.1 ([04fe6f7](https://github.com/deeeed/audiolab/commit/04fe6f706d372e3ced0f83b796923c490bebd64d))
185
+
73
186
  ## [3.0.1] - 2026-03-21
187
+
74
188
  ### Fixed
189
+
75
190
  - Add `@expo/config-plugins` to `peerDependencies` — fixes Yarn PnP `ambiguous require` error during `expo prebuild` (#341)
76
191
  - WASM path resolution in build output — `prebuilt/` is now copied into `build/cjs/` and `build/esm/` so Metro resolves WASM imports correctly after install (#341)
77
192
  - Split WASM modules into separate web/native platform files to prevent Metro bundling issues (#338)
193
+
78
194
  ## [3.0.0] - 2026-03-20
195
+
79
196
  ### BREAKING CHANGES
197
+
80
198
  - Package renamed from `@siteed/expo-audio-studio` to `@siteed/audio-studio`. The old package continues as a backwards-compatible shim.
81
199
  - Native module renamed from `ExpoAudioStream` to `AudioStudio`
82
200
 
83
201
  ### Added
202
+
84
203
  - C++ mel spectrogram streaming with WASM build (#324)
85
204
  - `streamFormat: 'float32'` option — native delivers `Float32Array` to `onAudioStream`, eliminating base64 encode/decode overhead (#315)
86
205
 
87
206
  ### Fixed
207
+
88
208
  - Memory safety, WASM lifecycle, and platform bug fixes (#329)
89
209
  - iOS: audio device switching bugs during active recording
90
210
  - iOS: `resetToDefaultDevice` correctly resets engine tap when switching back to default input
@@ -95,288 +215,518 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
95
215
  - iOS: `AudioDeviceManager.prepareAudioSession` preserves existing session options
96
216
 
97
217
  ### Performance
218
+
98
219
  - Optimized mel spectrogram C++ implementation
220
+
99
221
  ## [2.18.5] - 2026-02-23
222
+
100
223
  ### Fixed
224
+
101
225
  - Android: guard Bluetooth API calls behind permission check on API 31+ (#294)
102
226
  - Android: migrate phone state listener to `TelephonyCallback` on API 31+ (#275)
103
227
  - Android: reset `startTime` in `startRecording` and validate hardware format (#298, #223)
104
228
  - Android: gate foreground service on `enableBackgroundAudio` (#288, #294)
105
229
  - Android: sanitize options before native bridge calls to prevent crash
230
+
106
231
  ## [2.18.4] - 2026-02-16
232
+
107
233
  ### Added
234
+
108
235
  - Expo SDK 54 (React Native 0.81, React 19) support (#305)
109
236
 
110
237
  ### Fixed
238
+
111
239
  - iOS: include compression data in `onAudioStream` events
112
240
  - Android: properly emit final chunk of audio data on stop (#293)
241
+
113
242
  ## [2.18.1] - 2025-08-02
243
+
114
244
  ### Added
245
+
115
246
  - Improved memory monitoring
247
+
116
248
  ## [2.18.0] - 2025-08-01
249
+
117
250
  ### Fixed
251
+
118
252
  - Android: optimize buffer size to prevent OOM errors
119
253
  - Android: invalid paused duration calculation
254
+
120
255
  ## [2.17.0] - 2025-07-31
256
+
121
257
  ### Fixed
258
+
122
259
  - Android: fix `OutOfMemoryError` by tracking stream position correctly
260
+
123
261
  ## [2.16.1] - 2025-07-27
262
+
124
263
  ### Fixed
264
+
125
265
  - Android: audio analysis accumulation showing 0 bytes
266
+
126
267
  ## [2.16.0] - 2025-07-27
268
+
127
269
  ### Performance
270
+
128
271
  - Android: optimize stop recording performance for long recordings
272
+
129
273
  ## [2.15.0] - 2025-07-15
274
+
130
275
  ### Added
276
+
131
277
  - Android: `showPauseResumeActions` option to notification config (#282)
278
+
132
279
  ## [2.14.4] - 2025-07-15
280
+
133
281
  ### Fixed
282
+
134
283
  - Plugin: respect `enableDeviceDetection` configuration for Android permissions
135
284
  - Android: add missing `BLUETOOTH_ADMIN` permission for device detection
285
+
136
286
  ## [2.14.3] - 2025-06-12
287
+
137
288
  ### Changed
289
+
138
290
  - Remove analysis bit depth logging for cleaner debug output
291
+
139
292
  ## [2.14.2] - 2025-06-11
293
+
140
294
  ### Added
295
+
141
296
  - Platform limitations validation and documentation
142
297
 
143
298
  ### Fixed
299
+
144
300
  - iOS: update compressed file size when primary output is disabled
301
+
145
302
  ## [2.14.1] - 2025-06-11
303
+
146
304
  ### Fixed
305
+
147
306
  - Android: fix duration returning 0 when primary output is disabled (#244)
307
+
148
308
  ## [2.14.0] - 2025-06-11
309
+
149
310
  ### Performance
311
+
150
312
  - Comprehensive cross-platform stop recording performance optimization
313
+
151
314
  ## [2.13.2] - 2025-06-10
315
+
152
316
  ### Fixed
317
+
153
318
  - Invalid type exports
319
+
154
320
  ## [2.13.1] - 2025-06-09
321
+
155
322
  ### Added
323
+
156
324
  - Sub-100ms audio events analysis and improvements (#270)
157
325
 
158
326
  ### Fixed
327
+
159
328
  - Update `expo-modules-core` peer dependency for Expo SDK 53 compatibility
329
+
160
330
  ## [2.13.0] - 2025-06-09
331
+
161
332
  ### Added
333
+
162
334
  - Enhanced device detection and management — configurable `enableDeviceDetection`, automatic connect/disconnect events, force refresh (#269)
335
+
163
336
  ## [2.12.3] - 2025-06-07
337
+
164
338
  ### Changed
339
+
165
340
  - Adjust audio focus request timing in `AudioRecorderManager`
341
+
166
342
  ## [2.12.2] - 2025-06-07
343
+
167
344
  ### Fixed
345
+
168
346
  - Android: audio focus strategy for background recording (#267)
347
+
169
348
  ## [2.12.0] - 2025-06-07
349
+
170
350
  ### Added
351
+
171
352
  - Android-only `audioFocusStrategy` option (#264)
172
353
 
173
354
  ### Fixed
355
+
174
356
  - Android: PCM streaming duration calculation bug (#263, #265)
357
+
175
358
  ## [2.11.0] - 2025-06-05
359
+
176
360
  ### Added
361
+
177
362
  - M4A support with `preferRawStream` option (#261)
178
363
 
179
364
  ### Fixed
365
+
180
366
  - Enforce 10ms minimum interval on both platforms (#262)
181
367
  - Android: proper `MediaCodec` resource cleanup in `AudioProcessor`
368
+
182
369
  ## [2.10.6] - 2025-06-04
370
+
183
371
  ### Fixed
372
+
184
373
  - iOS: prevent `durationMs` returning 0 (#244, #260)
374
+
185
375
  ## [2.10.5] - 2025-06-04
376
+
186
377
  ### Fixed
378
+
187
379
  - iOS: enable audio streaming when primary output is disabled (#259)
380
+
188
381
  ## [2.10.4] - 2025-06-03
382
+
189
383
  ### Fixed
384
+
190
385
  - iOS: resolve Swift compilation scope error in `AudioStreamManager` (#256)
386
+
191
387
  ## [2.10.3] - 2025-06-02
388
+
192
389
  ### Fixed
390
+
193
391
  - Prevent `UninitializedPropertyAccessException` crash in developer menu (#250)
194
392
  - Return compression info when primary output is disabled (#244, #249)
393
+
195
394
  ## [2.10.2] - 2025-05-31
395
+
196
396
  ### Fixed
397
+
197
398
  - Buffer size calculation and duplicate emission fix (#248)
399
+
198
400
  ## [2.10.1] - 2025-05-27
401
+
199
402
  ### Fixed
403
+
200
404
  - `useAudioRecorder`: update `intervalId` type for better type safety
405
+
201
406
  ## [2.10.0] - 2025-05-26
407
+
202
408
  ### Added
409
+
203
410
  - Buffer duration control and `skipFileWriting` options
204
411
  - Enhanced testing framework with instrumented tests (#242)
412
+
205
413
  ## [2.9.0] - 2025-05-15
414
+
206
415
  ### Added
416
+
207
417
  - Web audio chunk handling improvements (#240)
418
+
208
419
  ## [2.8.4] - 2025-05-11
420
+
209
421
  ### Fixed
422
+
210
423
  - Expo plugin setup
424
+
211
425
  ## [2.8.3] - 2025-05-06
426
+
212
427
  ### Changed
428
+
213
429
  - Update plugin configuration to use ESM format
430
+
214
431
  ## [2.8.2] - 2025-05-06
432
+
215
433
  ### Changed
434
+
216
435
  - TypeScript configurations for dual module (ESM/CJS) support
436
+
217
437
  ## [2.8.1] - 2025-05-06
438
+
218
439
  ### Added
440
+
219
441
  - Dual module format (ESM/CommonJS) to resolve module resolution issues (#235)
442
+
220
443
  ## [2.7.0] - 2025-05-04
444
+
221
445
  ### Fixed
446
+
222
447
  - iOS: enhance background audio recording and audio format conversion (#228)
448
+
223
449
  ## [2.6.2] - 2025-05-01
450
+
224
451
  ### Fixed
452
+
225
453
  - Android: ensure foreground-only audio recording works with `FOREGROUND_SERVICE` (#202, #221)
454
+
226
455
  ## [2.6.1] - 2025-05-01
456
+
227
457
  ### Fixed
458
+
228
459
  - iOS: resolve hardware format mismatch crash and enhance logging (#220)
460
+
229
461
  ## [2.6.0] - 2025-05-01
462
+
230
463
  ### Fixed
464
+
231
465
  - Web: resolve audio recording issue without compression (#217, #219)
466
+
232
467
  ## [2.5.0] - 2025-04-30
468
+
233
469
  ### Added
470
+
234
471
  - Complete Android implementation for audio device API (#214)
235
472
  - Cross-platform audio device detection, selection, and fallback handling (#213)
236
473
  - Zero-latency recording with `prepareRecording` API (#211)
237
474
 
238
475
  ### Fixed
476
+
239
477
  - iOS: ensure complete audio data emission on recording stop/pause (#215)
478
+
240
479
  ## [2.4.1] - 2025-04-08
480
+
241
481
  ### Added
482
+
242
483
  - Enhanced background audio handling and permission checks (#200)
484
+
243
485
  ## [2.4.0] - 2025-04-03
486
+
244
487
  ### Fixed
488
+
245
489
  - iOS: resolve sample rate mismatch and enhance recording stability (#198)
246
490
  - Android: enhance permission handling for phone state and notifications (#196)
491
+
247
492
  ## [2.3.1] - 2025-04-03
493
+
248
494
  ### Changed
495
+
249
496
  - Remove external CRC32 library dependency (#195)
497
+
250
498
  ## [2.3.0] - 2025-03-29
499
+
251
500
  ### Fixed
501
+
252
502
  - Always generate a new UUID unless filename is provided (#182)
503
+
253
504
  ## [2.2.0] - 2025-03-28
505
+
254
506
  ### Changed
507
+
255
508
  - Platform-specific CRC32 handling
509
+
256
510
  ## [2.1.0] - 2025-03-04
511
+
257
512
  ### Added
513
+
258
514
  - Mel spectrogram extraction and language detection (#157)
259
515
  - Audio import functionality and decibel visualization (#156)
260
516
  - iOS trim support with custom filename (#152)
261
517
  - Sample rate control and web trimming support (#151)
262
518
  - Audio trimming with optimized processing and detailed feedback (#150, #149)
519
+
263
520
  ## [2.0.1] - 2025-02-27
521
+
264
522
  ### Changed
523
+
265
524
  - Update background mode handling for audio stream plugin
525
+
266
526
  ## [2.0.0] - 2025-02-27
527
+
267
528
  ### Added
529
+
268
530
  - Full audio analysis with spectral features and time range controls (#132)
269
531
  - `extractAudioData` API
270
532
  - PCM player
271
533
  - Audio checksum verification and segment analysis (#143)
272
534
 
273
535
  ### Fixed
536
+
274
537
  - Audio recording reliability improvements and web IndexedDB management (#146)
538
+
275
539
  ## [1.17.0] - 2025-02-18
540
+
276
541
  ### Added
542
+
277
543
  - Interval audio analysis for web, Android, and iOS (#125, #126)
544
+
278
545
  ## [1.16.0] - 2025-02-17
546
+
279
547
  ### Fixed
548
+
280
549
  - iOS: prevent adding background modes when disabled
281
550
  - iOS: replace CallKit with `AVAudioSession` for phone call detection
551
+
282
552
  ## [1.15.1] - 2025-02-17
553
+
283
554
  ### Fixed
555
+
284
556
  - iOS: restore Opus compression support (#122)
285
557
  - Emit audio analysis without blocking the recording thread
558
+
286
559
  ## [1.15.0] - 2025-02-15
560
+
287
561
  ### Fixed
562
+
288
563
  - iOS: improve audio recording interruption handling and auto-resume (#119)
289
564
  - Android: improve background recording and call interruption handling (#118)
565
+
290
566
  ## [1.14.2] - 2025-02-13
567
+
291
568
  ### Fixed
569
+
292
570
  - Clear recording metadata on STOP action
571
+
293
572
  ## [1.14.1] - 2025-02-12
573
+
294
574
  ### Fixed
575
+
295
576
  - Enable background recording by default (#114)
577
+
296
578
  ## [1.14.0] - 2025-02-12
579
+
297
580
  ### Fixed
581
+
298
582
  - `keepAwake` issue on iOS and auto-resume after call (#113)
583
+
299
584
  ## [1.13.2] - 2025-02-10
585
+
300
586
  ### Fixed
587
+
301
588
  - Ensure foreground service starts within required timeframe
589
+
302
590
  ## [1.13.0] - 2025-02-09
591
+
303
592
  ### Added
593
+
304
594
  - Audio decode support (#104)
305
595
 
306
596
  ### Fixed
597
+
307
598
  - Background recording issues and status checking (#103)
599
+
308
600
  ## [1.12.1] - 2025-02-01
601
+
309
602
  ### Fixed
603
+
310
604
  - Improve audio recording interruption handling and consistency (#98)
605
+
311
606
  ## [1.12.0] - 2025-01-31
607
+
312
608
  ### Added
609
+
313
610
  - Call state checks before starting or resuming recording (#94)
314
611
  - Custom filename and directory support for recordings (#92)
315
612
  - Compressed recording info with file size (#90)
613
+
316
614
  ## [1.11.3] - 2025-01-25
615
+
317
616
  ### Fixed
617
+
318
618
  - Disable duplicate notification alerts (#82)
619
+
319
620
  ## [1.11.2] - 2025-01-22
621
+
320
622
  ### Fixed
623
+
321
624
  - Resources not cleaned up properly on app kill (#80)
625
+
322
626
  ## [1.11.0] - 2025-01-22
627
+
323
628
  ### Added
629
+
324
630
  - Intelligent call interruption handling and compression improvements (#78)
631
+
325
632
  ## [1.10.0] - 2025-01-14
633
+
326
634
  ### Added
635
+
327
636
  - Support for pausing and resuming compressed recordings
328
637
  - Optimized notification channel settings
638
+
329
639
  ## [1.9.2] - 2025-01-12
640
+
330
641
  ### Fixed
642
+
331
643
  - iOS: bitrate verification to prevent invalid values
644
+
332
645
  ## [1.9.1] - 2025-01-12
646
+
333
647
  ### Fixed
648
+
334
649
  - iOS: potentially missing compressed file info
650
+
335
651
  ## [1.9.0] - 2025-01-11
652
+
336
653
  ### Performance
654
+
337
655
  - Optimize memory usage and streaming performance for web audio recording (#75)
656
+
338
657
  ## [1.8.0] - 2025-01-10
658
+
339
659
  ### Added
660
+
340
661
  - Audio compression support
662
+
341
663
  ## [1.7.2] - 2025-01-07
664
+
342
665
  ### Fixed
666
+
343
667
  - Web: correct WAV header handling in audio recording
668
+
344
669
  ## [1.7.1] - 2025-01-07
670
+
345
671
  ### Fixed
672
+
346
673
  - Notification: avoid triggering new alerts on update (#71)
674
+
347
675
  ## [1.7.0] - 2025-01-05
676
+
348
677
  ### Fixed
678
+
349
679
  - iOS: improve audio resampling and duration tracking (#69)
350
680
  - Handle paused state in `stopRecording` (#68)
351
681
  - Reset audio recording state properly on iOS and Android (#66)
352
682
  - Android: total size not resetting on new recording (#64)
683
+
353
684
  ## [1.3.1] - 2024-12-05
685
+
354
686
  ### Added
687
+
355
688
  - Web: throttling and optimized event processing (#49)
689
+
356
690
  ## [1.3.0] - 2024-11-28
691
+
357
692
  ### Added
693
+
358
694
  - Standardize permission status response structure across platforms (#44)
695
+
359
696
  ## [1.2.4] - 2024-11-05
697
+
360
698
  ### Changed
699
+
361
700
  - Android: minimum audio interval set to 10ms
362
701
  - Plugin: do not include `notification` config by default to prevent iOS version mismatch
363
702
 
364
703
  ### Fixed
704
+
365
705
  - Remove frequently firing log statements on web
706
+
366
707
  ## [1.2.0] - 2024-10-24
708
+
367
709
  ### Added
710
+
368
711
  - `keepAwake` — continue recording when app is in background (default: true)
369
712
  - Customizable recording notifications for Android and iOS
370
- - Android: rich notification with live waveform, configurable actions/colors/priorities
371
- - iOS: media player integration
713
+ - Android: rich notification with live waveform, configurable actions/colors/priorities
714
+ - iOS: media player integration
715
+
372
716
  ## [1.1.17] - 2024-10-21
717
+
373
718
  ### Added
719
+
374
720
  - Bluetooth headset support on iOS
375
721
 
376
722
  ### Fixed
723
+
377
724
  - Android: not reading custom interval audio update
725
+
378
726
  ## [1.0.0] - 2024-04-01
727
+
379
728
  ### Added
729
+
380
730
  - Initial release
381
731
  - Real-time audio streaming across iOS, Android, and web
382
732
  - Configurable intervals for audio buffer receipt
@@ -385,7 +735,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
385
735
  - Audio features extraction during recording
386
736
  - Consistent WAV PCM recording format across all platforms
387
737
 
388
- [unreleased]: https://github.com/deeeed/audiolab/compare/@siteed/audio-studio@3.1.1...HEAD
738
+ [unreleased]: https://github.com/deeeed/audiolab/compare/@siteed/audio-studio@3.2.0...HEAD
739
+ [3.2.0]: https://github.com/deeeed/audiolab/compare/@siteed/audio-studio@3.1.1...@siteed/audio-studio@3.2.0
389
740
  [3.1.1]: https://github.com/deeeed/audiolab/compare/@siteed/audio-studio@3.1.0...@siteed/audio-studio@3.1.1
390
741
  [3.1.0]: https://github.com/deeeed/audiolab/compare/@siteed/audio-studio@3.0.5...@siteed/audio-studio@3.1.0
391
742
  [3.0.5]: https://github.com/deeeed/audiolab/compare/@siteed/audio-studio@3.0.4...@siteed/audio-studio@3.0.5