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 @@
+