diff --git a/CHANGELOG.md b/CHANGELOG.md index 62d8a51..1100605 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,15 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Version ## [Unreleased] +### Changed + +- **`polling_rate_mode` now defaults to realtime / 1000 Hz** (was 250 Hz) so a fresh flash matches a wired DualSense's 1 ms input latency instead of polling 4× slower. Mode 2 also bypasses the report-throttling used by the 250/500 Hz modes, forwarding every BT input report immediately. Existing saved configs keep their value; this only affects fresh flashes / Reset-to-defaults. (Out-of-box "acts like USB" pass.) +- **`bt_mic_enable` now defaults to Off** (was On) — the DualSense BT microphone path has a confirmed playback-rate bug (issue #10: recordings come out ~2× too fast / half-duration). Until that's root-caused on hardware, the mic is opt-in: fresh flashes / Reset-to-defaults boot with it off, and it can be turned on from the OLED **Settings** screen (`BT Mic`) or the web config. Existing saved configs keep their current value. (Web config default should be flipped to match in `DS5Dongle-OLED-Config-Web`.) + +### Known issues + +- **BT microphone records ~2× too fast (#10).** The mic playout stage is wall-clock paced at 10 ms / 480 samples into a 48 kHz endpoint, which should be real-time, so the 2× points at the on-wire frame size/rate differing from the assumed 480 samples. Needs the OLED **Diagnostics** `Mic dec=` (samples per `opus_decode`) and `Mic in/s` (arrival rate) read on hardware to make the fix deterministic — `Mic dec=240` would confirm a half-rate stream. Mic is opt-in (off by default) in the meantime. + --- ## [0.6.11-oled-edition] — 2026-06-02 diff --git a/src/config.cpp b/src/config.cpp index a9b3667..80e5340 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -67,9 +67,11 @@ void config_valid() { body->disable_pico_led = 0; printf("[Config] disable_pico_led is invalid\n"); } - if (body->polling_rate_mode > 2) { - body->polling_rate_mode = 0; - printf("[Config] polling_rate_mode is invalid\n"); + if (body->polling_rate_mode > 2) { // 0xFF erased / out of range → default + body->polling_rate_mode = 2; // realtime / 1000 Hz — match a wired DS5's + // 1 ms polling (was 0 / 250 Hz). Existing + // saved configs keep their value. + printf("[Config] polling_rate_mode invalid, defaulting to 2 (1000 Hz)\n"); } if (body->audio_buffer_length < 16 || body->audio_buffer_length > 128) { body->audio_buffer_length = 16; // low buffer avoids the DS5's periodic re-buffer gap @@ -109,9 +111,13 @@ void config_valid() { body->screen_off_timeout = 15; // mirrors the original 15-min off tier printf("[Config] screen_off_timeout invalid, defaulting to 15 min\n"); } - if (body->bt_mic_enable > 1) { // 0xFF erased / upgrade → default ON - body->bt_mic_enable = 1; - printf("[Config] bt_mic_enable invalid, defaulting to 1 (on)\n"); + if (body->bt_mic_enable > 1) { // 0xFF erased / upgrade → default OFF + body->bt_mic_enable = 0; // opt-in: the BT mic path has a known + // 2x-playback-rate bug (#10), so it is + // off until explicitly enabled (Settings + // screen / web config). Existing saved + // configs keep their value. + printf("[Config] bt_mic_enable invalid, defaulting to 0 (off)\n"); } if (body->screen_brightness > 3) { // kBrightLevels has 4 entries (0..3) body->screen_brightness = 0; // full brightness