fix(audio): wire in-band FEC into the decoder loss path
The encoder set OPUS_SET_INBAND_FEC, but the decoder never invoked FEC -- the loss path went DRED -> PLC, so FEC redundancy was emitted (and paid for in bitrate) yet never consumed. Wire FEC recovery into AudioEngine::on_playback between DRED and PLC: copy the next buffered packet once, try DRED, else (if the stream negotiated FEC) decode(next_pkt, ..., fec=true), else PLC. Recovery priority is now DRED -> FEC -> PLC. Add per-stream RemoteStream::fec_enabled_, captured from OpusParams in init_recv_stream. Docs (voice.md) updated to match. ctest --preset dev: 27/27 green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -691,6 +691,14 @@ iOS 18.0 deployment target. App Group `group.cat.voice.VoiceCat` for Keychain sh
|
||||
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}`.
|
||||
- [x] **In-band FEC decoder wiring** — done (2026-06-22). The encoder set `OPUS_SET_INBAND_FEC`
|
||||
all along, but the decoder never invoked it — the loss path went DRED → PLC, so FEC redundancy
|
||||
was emitted (and paid for in bitrate) but never consumed. Wired the FEC recovery into
|
||||
`AudioEngine::on_playback`'s loss branch between DRED and PLC: copy the next buffered packet
|
||||
once, try DRED, else (if the stream negotiated FEC) `decode(next_pkt, …, fec=true)`, else PLC.
|
||||
Added per-stream `RemoteStream::fec_enabled_`, captured from `OpusParams` in
|
||||
`init_recv_stream`. Recovery priority is now **DRED → FEC → PLC**. ctest 27/27 green. Files:
|
||||
`audio_engine.{h,cpp}`, `docs/voice.md`.
|
||||
- [ ] **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
|
||||
|
||||
Reference in New Issue
Block a user