@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.
- package/CHANGELOG.md +356 -5
- package/android/src/main/java/net/siteed/audiostudio/AudioStreamDecoder.kt +306 -94
- package/android/src/main/java/net/siteed/audiostudio/AudioStudioModule.kt +39 -6
- package/build/cjs/errors/AudioStreamError.js +9 -0
- package/build/cjs/errors/AudioStreamError.js.map +1 -1
- package/build/cjs/errors/AudioStreamError.test.js +22 -1
- package/build/cjs/errors/AudioStreamError.test.js.map +1 -1
- package/build/cjs/streamAudioData.js +99 -32
- package/build/cjs/streamAudioData.js.map +1 -1
- package/build/cjs/utils/audioProcessing.js +14 -10
- package/build/cjs/utils/audioProcessing.js.map +1 -1
- package/build/esm/errors/AudioStreamError.js +9 -0
- package/build/esm/errors/AudioStreamError.js.map +1 -1
- package/build/esm/errors/AudioStreamError.test.js +22 -1
- package/build/esm/errors/AudioStreamError.test.js.map +1 -1
- package/build/esm/streamAudioData.js +99 -32
- package/build/esm/streamAudioData.js.map +1 -1
- package/build/esm/utils/audioProcessing.js +14 -10
- package/build/esm/utils/audioProcessing.js.map +1 -1
- package/build/types/errors/AudioStreamError.d.ts.map +1 -1
- package/build/types/streamAudioData.d.ts +5 -0
- package/build/types/streamAudioData.d.ts.map +1 -1
- package/build/types/utils/audioProcessing.d.ts +2 -2
- package/build/types/utils/audioProcessing.d.ts.map +1 -1
- package/ios/AudioStreamDecoder.swift +191 -100
- package/ios/AudioStudioModule.swift +48 -9
- package/package.json +163 -146
- package/scripts/README.md +58 -0
- package/src/errors/AudioStreamError.test.ts +29 -2
- package/src/errors/AudioStreamError.ts +14 -0
- package/src/streamAudioData.ts +146 -42
- package/src/utils/audioProcessing.ts +25 -14
- package/android/src/androidTest/assets/chorus.wav +0 -0
- package/android/src/androidTest/assets/jfk.wav +0 -0
- package/android/src/androidTest/assets/osr_us_000_0010_8k.wav +0 -0
- package/android/src/androidTest/assets/recorder_hello_world.wav +0 -0
- package/android/src/androidTest/java/net/siteed/audiostudio/AudioFinalMetadataContractInstrumentedTest.kt +0 -190
- package/android/src/androidTest/java/net/siteed/audiostudio/AudioProcessorInstrumentedTest.kt +0 -197
- package/android/src/androidTest/java/net/siteed/audiostudio/AudioRecorderInstrumentedTest.kt +0 -487
- package/android/src/androidTest/java/net/siteed/audiostudio/AudioRecorderPerformanceInstrumentedTest.kt +0 -250
- package/android/src/androidTest/java/net/siteed/audiostudio/OpusRangeDecodeRegressionInstrumentedTest.kt +0 -186
- package/android/src/androidTest/java/net/siteed/audiostudio/integration/AudioFocusStrategyIntegrationTest.kt +0 -332
- package/android/src/androidTest/java/net/siteed/audiostudio/integration/BufferDurationIntegrationTest.kt +0 -324
- package/android/src/androidTest/java/net/siteed/audiostudio/integration/CompressedOnlyOutputTest.kt +0 -253
- package/android/src/androidTest/java/net/siteed/audiostudio/integration/DeviceDisconnectionFallbackTest.kt +0 -218
- package/android/src/androidTest/java/net/siteed/audiostudio/integration/EventEmissionIntervalTest.kt +0 -120
- package/android/src/androidTest/java/net/siteed/audiostudio/integration/M4aFormatTest.kt +0 -345
- package/android/src/androidTest/java/net/siteed/audiostudio/integration/OutputControlIntegrationTest.kt +0 -340
- package/android/src/androidTest/java/net/siteed/audiostudio/integration/PcmStreamingDurationTest.kt +0 -252
- package/android/src/androidTest/java/net/siteed/audiostudio/integration/README.md +0 -95
- package/android/src/androidTest/java/net/siteed/audiostudio/integration/run_integration_tests.sh +0 -43
- package/android/src/test/java/net/siteed/audiostudio/AndroidCallStateTest.kt +0 -37
- package/android/src/test/java/net/siteed/audiostudio/AndroidEventEmitterTest.kt +0 -28
- package/android/src/test/java/net/siteed/audiostudio/AudioFileHandlerTest.kt +0 -279
- package/android/src/test/java/net/siteed/audiostudio/AudioFocusStrategyTest.kt +0 -249
- package/android/src/test/java/net/siteed/audiostudio/AudioFormatTest.kt +0 -151
- package/android/src/test/java/net/siteed/audiostudio/AudioFormatUtilsTest.kt +0 -273
- package/android/src/test/java/net/siteed/audiostudio/DeviceDisconnectionFallbackUnitTest.kt +0 -140
- package/android/src/test/java/net/siteed/audiostudio/InterruptionAutoResumePolicyTest.kt +0 -49
- package/android/src/test/resources/chorus.wav +0 -0
- package/android/src/test/resources/generate_test_audio.py +0 -94
- package/android/src/test/resources/jfk.wav +0 -0
- package/android/src/test/resources/osr_us_000_0010_8k.wav +0 -0
- package/android/src/test/resources/recorder_hello_world.wav +0 -0
- package/ios/AudioStudioTests/AudioFileHandlerTests.swift +0 -338
- package/ios/AudioStudioTests/AudioFormatUtilsTests.swift +0 -331
- package/ios/AudioStudioTests/AudioStreamDecoderTests.swift +0 -128
- package/ios/AudioStudioTests/AudioTestHelpers.swift +0 -130
- package/ios/AudioStudioTests/CompressedOnlyOutputTests.swift +0 -334
- package/ios/AudioStudioTests/EventEmissionIntervalTests.swift +0 -105
- package/ios/AudioStudioTests/Info.plist +0 -22
- package/ios/AudioStudioTests/README.md +0 -39
- package/ios/AudioStudioTests/SimpleAudioTest.swift +0 -98
- package/ios/AudioStudioTests/TestAudioGenerator.swift +0 -75
- package/ios/tests/README.md +0 -41
- package/ios/tests/integration/buffer_and_fallback_test.swift +0 -178
- package/ios/tests/integration/buffer_duration_test.swift +0 -185
- package/ios/tests/integration/compressed_only_output_test.swift +0 -271
- package/ios/tests/integration/output_control_test.swift +0 -322
- package/ios/tests/integration/run_integration_tests.sh +0 -37
- package/ios/tests/opus_support_test_macos.swift +0 -154
- package/ios/tests/standalone/audio_processing_test.swift +0 -144
- package/ios/tests/standalone/audio_recording_test.swift +0 -277
- package/ios/tests/standalone/audio_streaming_test.swift +0 -249
- 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
|
-
|
|
371
|
-
|
|
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.
|
|
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
|