diff --git a/MainForm.pas b/MainForm.pas index cb52e9c..33954e4 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -438,7 +438,6 @@ type // ClientActive). Здесь только то, что дёргает UI-обёртки MainForm. procedure WebOnFreq(Hz: Double); procedure WebOnBand(Idx: Integer); - procedure WebOnSpan(Hz: Integer); procedure WebOnRun(On_: Boolean); procedure WebOnFreqA(Hz: Double); procedure WebOnXvtrBand(Idx: Integer); @@ -460,7 +459,6 @@ type procedure SyncWebFreq; procedure SyncWebBand; procedure SyncWebXvtrBand; - procedure SyncWebSpan; procedure SyncWebRun; procedure SyncWebFreqA; // --- CAT callbacks ------------------------------------------------------- @@ -899,7 +897,7 @@ begin // Host-зависимые (UI-обёртки) — пока на MainForm: FWebServer.OnFreq := WebOnFreq; FWebServer.OnBand := WebOnBand; - FWebServer.OnSpan := WebOnSpan; + FWebServer.OnSpan := FWebAdapter.OnSpan; FWebServer.OnRun := WebOnRun; FWebServer.OnDrive := FWebAdapter.OnDrive; FWebServer.OnFreqA := WebOnFreqA; @@ -4656,13 +4654,9 @@ end; procedure TMainForm.OnSampleRateSelect(SampleRate: Integer); begin - if SampleRate = FController.FSampleRate then Exit; - // Движок (пересоздание WDSP-канала, DDC-rate, восстановление DSP) — в - // контроллере; рендер overlay + AGC-линий — в OnControllerState(rfSampleRate). + // Тонкая обёртка: движок (пересоздание WDSP-канала, DDC-rate, DSP-restore) + + // персист — в команде SetSampleRate; рендер overlay/AGC — OnControllerState. FController.SetSampleRate(SampleRate); - // SampleRate глобальный — сохраняем в global settings. - if FController.FDevConnected then - FController.SaveGlobalSettings; end; // =========================================================================== @@ -4735,27 +4729,6 @@ begin ActivateXvtrBand(FWebSyncInt); end; -procedure TMainForm.WebOnSpan(Hz: Integer); -begin - FWebSyncInt := Hz; - FWebSyncM := SyncWebSpan; - TThread.Synchronize(nil, FWebSyncM); -end; - -procedure TMainForm.SyncWebSpan; -const - ValidSpans: array[0..5] of Integer = (48000, 96000, 192000, 384000, 768000, 1536000); -var - i: Integer; -begin - for i := 0 to High(ValidSpans) do - if ValidSpans[i] = FWebSyncInt then - begin - OnSampleRateSelect(FWebSyncInt); - Exit; - end; -end; - // ── Run ──────────────────────────────────────────────────────────────────── procedure TMainForm.WebOnRun(On_: Boolean); diff --git a/RadioController.pas b/RadioController.pas index 3fe494c..2e97e2d 100644 --- a/RadioController.pas +++ b/RadioController.pas @@ -1652,8 +1652,8 @@ begin FSpanHz := Hz; Changed(rfSpan); { TODO wiring } end; procedure TRadioController.SetSampleRate(Hz: Integer); // Смена частоты дискретизации DDC. В этом приложении span ≡ sample rate. // Несёт: пересоздание WDSP-канала (Close+FlushQueue+Open), новый rate в -// трансивер и полное восстановление DSP-состояния. Сохранение в global -// settings + рендер overlay/AGC-линий остаются в UI (OnControllerState). +// трансивер и полное восстановление DSP-состояния. Команда сама персистит +// (sample rate глобальный); рендер overlay/AGC-линий — в OnControllerState. begin if (Hz <= 0) or (Hz = FSampleRate) then Exit; FSampleRate := Hz; @@ -1690,6 +1690,7 @@ begin FDSPEngine.SetShift(FVfoA - FCenterFreq); end; end; + SaveGlobalSettings; // sample rate глобальный — персистим (гейт по FDevConnected внутри) Changed(rfSampleRate); end; diff --git a/WebAdapter.pas b/WebAdapter.pas index b34a7ea..6e80bf5 100644 --- a/WebAdapter.pas +++ b/WebAdapter.pas @@ -46,6 +46,7 @@ type procedure SyncAGCTop; procedure SyncVolume; procedure SyncDrive; + procedure SyncSpan; procedure SyncWfAGC; procedure SyncWfNF; procedure SyncMute; @@ -72,6 +73,7 @@ type procedure OnAGCTop(DB: Integer); procedure OnVolume(V: Integer); procedure OnDrive(V: Integer); + procedure OnSpan(Hz: Integer); procedure OnWfAGC(On_: Boolean); procedure OnWfNF(On_: Boolean); procedure OnMute(On_: Boolean); @@ -158,6 +160,24 @@ begin FSyncInt := V; FController.Invoke(@SyncDrive); end; procedure TWebAdapter.SyncDrive; begin FController.SetDrive(FSyncInt); end; // rfDrive снимет память канала (ChannelController) +procedure TWebAdapter.OnSpan(Hz: Integer); +begin FSyncInt := Hz; FController.Invoke(@SyncSpan); end; + +procedure TWebAdapter.SyncSpan; +// span ≡ sample rate. Принимаем только валидные значения (как десктоп-оверлей); +// SetSampleRate сам пересоздаёт WDSP-канал + персистит (idempotent при том же rate). +const + ValidSpans: array[0..5] of Integer = (48000, 96000, 192000, 384000, 768000, 1536000); +var i: Integer; +begin + for i := 0 to High(ValidSpans) do + if ValidSpans[i] = FSyncInt then + begin + FController.SetSampleRate(FSyncInt); + Exit; + end; +end; + procedure TWebAdapter.OnWfAGC(On_: Boolean); begin FSyncBool := On_; FController.Invoke(@SyncWfAGC); end;