mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
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:
@@ -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 разведён).
|
||||
|
||||
Reference in New Issue
Block a user