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
+8 -5
View File
@@ -3167,14 +3167,17 @@ begin
FSpanHz := Hz;
FBandCache[FCurrentBand].SpanHz := FSpanHz; // для обратной совместимости
// 1. Останавливаем WDSP и меняем rate (Close + FlushQueue + Open).
// 1. Меняем rate главного тракта. Хирургически: движок гейтит и дропает
// только main-пакеты, DSP-поток/анализаторы/паны N живут без пауз —
// поэтому FWDSPReady НЕ сбрасываем (иначе OnDDCIQ перестал бы кормить
// паны на всё время пересборки и их водопады замирали).
if FWDSPReady and Assigned(FDSPEngine) then
begin
FWDSPReady := False;
FDSPEngine.ChangeSampleRate(Hz);
end;
// 2. Новый rate трансиверу (после остановки DSP — пакеты сразу с верным rate).
// 2. Новый rate трансиверу. Короткий хвост пакетов старого rate, дошедших
// до переключения радио, попадает в новый канал — транзиент в единицы мс
// (то же окно было и при старой схеме: FWDSPReady поднимался до того, как
// радио реально применяло DDC Specific).
if Assigned(FNetwork) and FNetwork.Connected then
FNetwork.ConfigureDDCs(1, Hz div 1000, FMainADCSrc,
FDitherEnabled, FRandomEnabled);