fix(display): хирургическая смена rate главного — паны не замирают

ChangeSampleRate больше не делает полный Close/Open движка (стоп DSP-потока,
разрушение всех анализаторов, сброс общей IQ-очереди): гейт FMainGated+FMainLock
дропает только main-пакеты, пересоздаются только RXA_CHAN и слайсы пана 0,
анализаторы панов живут. Контроллер не сбрасывает FWDSPReady на время смены
(OnDDCIQ продолжает кормить паны). Общий код RXA — Open/CloseMainRXChannel.
Бонус: SetChannelState dmode=1 на idle-каналах зря ждал флаш ~130мс → dmode=0
в CloseSliceChannel/CloseMainRXChannel (каналы всегда idle по локам).
Итог: смена 331→120мс, пауза аудио пан-слайса 137→40мс. Смоук ratetest ALL PASS,
подтверждено на экране.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-12 11:05:00 +03:00
co-authored by Claude Fable 5
parent a3a1ed0109
commit e26434575a
3 changed files with 215 additions and 76 deletions
+33
View File
@@ -512,6 +512,39 @@ ChangeSampleRate).
(в коде НЕ делалось — сначала экранный тест).
- Персист геометрии — вместе с общим персистом панов.
**СТАТУС «хирургический ChangeSampleRate» (2026-07-12): ГОТОВО — смоук-тест
ALL PASS, юзер подтвердил на экране («всё работает»). Отладочные пробы
RATEPROBE удалены.** Наблюдение юзера: смена rate ГЛАВНОГО пана
коротко замораживала водопады панов N (обратное — нет). Причина была в движке:
`ChangeSampleRate` делал полный Close/Open (стоп DSP-потока, разрушение ВСЕХ
анализаторов вкл. пановых, закрытие всех слайс-каналов, сброс общей IQ-очереди).
Протокол чист: оба пути шлют одинаковый полный DDC Specific (`RebuildDDCSpecific`).
Сделано (WDSPEngine.pas + RadioController.pas):
- Гейт `FMainGated` + барьер `FMainLock`: DSP-поток при взведённом гейте дропает
main-пакеты (PanId=0) из общей очереди НЕ блокируясь, паны обрабатываются без
пауз; двойная проверка гейта (снаружи и под локом) закрывает гонку установки.
- `ChangeSampleRate` теперь хирургический: закрывает/переоткрывает ТОЛЬКО
RXA_CHAN + слайс-каналы пана 0 (их InRate = главный rate); DSP/display-потоки,
TXA, TX-поток, анализаторы и паны не трогаются. RX-анализатор переармируется
`ApplyRXAnalyzerSettings` (как при зуме) — история главного сбрасывается
(неизбежно), пановые НЕ. Ошибка реконфига → `FInitialized:=False` (контроллер
увидит по `Initialized`).
- Общий код RXA вынесен: `OpenMainRXChannel` (открытие+реставрация состояния из
полей движка, вкл. FShiftHz) / `CloseMainRXChannel` — используются Open/Close/
ChangeSampleRate.
- Контроллер `SetSampleRate` больше НЕ сбрасывает `FWDSPReady` на время смены —
иначе OnDDCIQ переставал кормить паны (это был второй источник паузы).
- ★Находка по пробам: `SetChannelState(chan,0,dmode=1)` на ПРОСТАИВАЮЩЕМ канале
зря ждёт флаш ~130мс. Каналы при закрытии всегда idle (слайсы — дисциплина
FSliceLock, RXA — гейт-барьер) → dmode=1→0 в `CloseSliceChannel` и
`CloseMainRXChannel`. Итог: смена rate 331→120мс, макс. пауза аудио слайса
пана 137→40мс (~2 блока, на глаз незаметно). Бонус: закрытие слайсов/панов и
SetPanRate тоже ускорились на ~130мс/канал.
- Смоук-тест scratchpad `ratetest.pas` (синтетический тон, фидер-поток, замер
межблочных пауз аудио пан-слайса вокруг смены 384к→192к): ALL PASS — пан без
паузы >41мс, main-аудио/слайс пана 0/слайс пана 1 живы и слышат тон после
смены. Оба бинарника собираются.
### 3.6 — Pluto+ (2r2t): второй пан на втором антенном входе
Опционально, после 3.0-3.3. Обычного Pluto НЕ касается (там один RX разведён).