From c857aa9d4b1650985bd33a10d091a3ba32a28cab Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 22 Jul 2026 12:16:49 +0300 Subject: [PATCH] =?UTF-8?q?fix(slices):=20squelch=20=D1=81=D0=BB=D0=B0?= =?UTF-8?q?=D0=B9=D1=81=D0=B0=20=D0=B3=D0=B5=D0=B9=D1=82=D0=B8=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=BE=D0=BC=20=E2=80=94?= =?UTF-8?q?=20=D1=83=D1=85=D0=BE=D0=B4=20=D0=B8=D0=B7=20FM=20=D0=B1=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D1=88=D0=B5=20=D0=BD=D0=B5=20=D0=B3=D0=BB=D1=83?= =?UTF-8?q?=D1=88=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Юзер: на слайсе включил FM с шумодавом, переключил модуляцию — звука нет, а шумодава в не-FM режимах нет, выключить нечем. Блок fmsq WDSP стоит в тракте и глушит звук по шумовому выходу FM- дискриминатора. У главного приёмника он всегда гейтится режимом (ApplyModeFilter: SetFMSquelch((FMode = MODE_FM) and FFMSQOn, …), в не-FM ветке — явное выключение), а у слайсов SetSliceFMSquelch дёргал SetRXAFMSQRun(Chan,1) безусловно и после ухода из FM squelch оставался. WDSPEngine: новый ApplySliceFMSQ(Idx) — FMSQOn and (Mode = MODE_FM), то же правило, что у главного. Зовётся из SetSliceMode (ветка без пересоздания канала) и SetSliceFMSquelch, тем же гейтом накрыт OpenSliceChannel (пересоздание канала при смене rate/WFM). Выбор юзера не теряется: FMSQOn остаётся в записи слайса и в персисте, при возврате в FM восстанавливается. Co-Authored-By: Claude Opus 4.8 --- WDSPEngine.pas | 24 +++++++++++++++++++++--- ewsdr.lpi | 5 +++-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/WDSPEngine.pas b/WDSPEngine.pas index 5e8de55..5593579 100644 --- a/WDSPEngine.pas +++ b/WDSPEngine.pas @@ -539,6 +539,7 @@ type procedure ApplySNBToChan(Chan: Integer; On_: Boolean); procedure ApplyANFToChan(Chan: Integer; On_: Boolean); procedure ApplyFMSQToChan(Chan: Integer; Enable: Boolean; Level: Integer); + procedure ApplySliceFMSQ(Idx: Integer); // squelch слайса с гейтом по режиму procedure ApplyNoiseFilterState; procedure ProcessTXBlock; // вызывается из TTXDSPThread procedure FeedTXDisplaySample(const I, Q: Double); @@ -2394,7 +2395,8 @@ begin ApplyNBToChan(Chan, FSlices[Idx].NBMode); ApplySNBToChan(Chan, FSlices[Idx].SNBOn); ApplyANFToChan(Chan, FSlices[Idx].ANFOn); - ApplyFMSQToChan(Chan, FSlices[Idx].FMSQOn, FSlices[Idx].FMSQLevel); + ApplyFMSQToChan(Chan, FSlices[Idx].FMSQOn and (FSlices[Idx].Mode = MODE_FM), + FSlices[Idx].FMSQLevel); // Decoder input must not disappear or change scale with speaker volume. if FSlices[Idx].Mode in [MODE_DMR, MODE_FMRAW] then SetRXAPanelGain1(Chan, 1.0) @@ -2693,6 +2695,9 @@ begin SetRXAPanelGain1(FSlices[idx].Chan, 1.0) else SetRXAPanelGain1(FSlices[idx].Chan, FSlices[idx].Volume); + // Ушли из FM — снять squelch (иначе слайс остаётся заглушенным, а + // шумодава в не-FM режимах нет); вернулись в FM — восстановить выбор. + ApplySliceFMSQ(idx); end; finally FSliceLock.Leave; @@ -2821,13 +2826,26 @@ begin idx := FindSliceIdx(Id); if idx < 0 then Exit; FSlices[idx].FMSQOn := Enable; FSlices[idx].FMSQLevel := Level; - if FSlices[idx].Opened then - ApplyFMSQToChan(FSlices[idx].Chan, Enable, Level); + ApplySliceFMSQ(idx); finally FSliceLock.Leave; end; end; +// Squelch слайса с гейтом по режиму — как у главного приёмника +// (ApplyModeFilter: включён только в MODE_FM). Блок fmsq WDSP стоит в тракте +// и глушит звук по шумовому выходу FM-дискриминатора: оставшись включённым +// после ухода из FM, он затыкает слайс намертво, а органов управления +// шумодавом в не-FM режимах нет. Пользовательский выбор при этом сохраняется +// в FMSQOn и возвращается вместе с режимом FM. +procedure TWDSPEngine.ApplySliceFMSQ(Idx: Integer); +begin + if (Idx < 0) or (Idx > High(FSlices)) or not FSlices[Idx].Opened then Exit; + ApplyFMSQToChan(FSlices[Idx].Chan, + FSlices[Idx].FMSQOn and (FSlices[Idx].Mode = MODE_FM), + FSlices[Idx].FMSQLevel); +end; + function TWDSPEngine.GetSliceSMeter(Id: Integer): Double; var idx: Integer; begin diff --git a/ewsdr.lpi b/ewsdr.lpi index f7ae74f..4792265 100644 --- a/ewsdr.lpi +++ b/ewsdr.lpi @@ -17,9 +17,9 @@ - + - + @@ -136,6 +136,7 @@ +