feat: DRED (Deep REDundancy) per-channel toggle
Adds Opus 1.6 DRED support end-to-end: encoder embeds 20 ms of ML redundancy in every packet when enabled; decoder recovers lost frames from the next buffered packet's DRED extension rather than falling back to PLC comfort noise. Protocol: bool dred = 11 added to AudioConfig (backward-compatible, defaults false). C ABI: int dred added to vc_audio_config. Encoder: OPUS_SET_DRED_DURATION(2) when dred=true. Decoder: OpusDREDDecoder + per-stream OpusDRED scratch pre-allocated off the RT thread; JitterBuffer::try_copy_front_payload peeks at the next packet without popping on every PLC step; opus_decoder_dred_decode reconstructs the lost frame if DRED data is present, otherwise falls back to PLC. New test: test_dred_toggle (22/22 ctest green). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
17
PROGRESS.md
17
PROGRESS.md
@@ -39,7 +39,8 @@ up instantly. Newest status at the top.
|
||||
`allowBluetoothA2DP` and the output route must remain the headphones/A2DP device — NOT flip
|
||||
to `…Record`. If confirmed, delete the `logSessionState` calls + method and the prior
|
||||
band-aid comments in `IOSAudioRouter`/`audio_engine.cpp` can be trimmed.
|
||||
- **Verified on Windows:** `cmake --build --preset dev` clean, `ctest --preset dev` 21/21.
|
||||
- **Verified on Windows:** `cmake --build --preset dev` clean, `ctest --preset dev` 22/22
|
||||
(21/21 prior + new `test_dred_toggle`).
|
||||
iOS build & on-device run still to be done by the user on the Mac.
|
||||
|
||||
- **Planned (not started):** **External PCM feed/tap API (`vc_stream_feed_pcm` +
|
||||
@@ -393,7 +394,19 @@ iOS 18.0 deployment target. App Group `group.cat.voice.VoiceCat` for Keychain sh
|
||||
- [x] **All three client UIs** (Windows WinForms, macOS AppKit, iOS SwiftUI) expose the full
|
||||
M5 moderation and admin surface.
|
||||
- [x] **Docs** — `docs/protocol.md`, `docs/security.md` kept in sync.
|
||||
- [ ] **DRED/audio-quality polish** — not started.
|
||||
- [x] **DRED/audio-quality polish** — done (2026-06-20). `bool dred` added to `AudioConfig`
|
||||
proto (field 11) and `vc_audio_config` C ABI. Encoder: `OPUS_SET_DRED_DURATION(2)` when
|
||||
enabled (20 ms of ML redundancy per packet). Decoder: `OpusDREDDecoder` + per-stream
|
||||
`OpusDRED` scratch pre-allocated; `JitterBuffer::try_copy_front_payload` peeks at the next
|
||||
buffered packet on every PLC step; if DRED data is present, `opus_decoder_dred_decode`
|
||||
reconstructs the lost frame — otherwise falls back to standard PLC. New test:
|
||||
`test_dred_toggle` (ctest 22/22). Files: `voicecat.proto`, `voicecat.h`,
|
||||
`opus_codec.{h,cpp}`, `audio_engine.{h,cpp}`, `client.cpp`, `session.{h,cpp}`.
|
||||
- [ ] **DRED toggle in client UIs** — expose the `dred` flag in all three channel-config UIs
|
||||
so admins can enable it per channel. Windows: `ChannelEditForm` / `vc_channel_info.audio.dred`
|
||||
checkbox. macOS AppKit: channel-edit sheet. iOS SwiftUI: channel-edit form. All three UIs
|
||||
already have full channel CRUD wired; this is an additive checkbox on the existing audio-config
|
||||
section. (Core/protocol/ABI all done — this is UI-only work.)
|
||||
- [ ] **macOS ScreenCaptureKit screen-audio** — `startStream(.screenAudio)` in macOS client
|
||||
announces the stream but `start_loopback_capture()` returns false (no `VOICECAT_HAS_LOOPBACK`
|
||||
on macOS). Implement via `vc_stream_feed_pcm` + `SCStream` once the feed API ships.
|
||||
|
||||
Reference in New Issue
Block a user