mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
fix(slices): squelch слайса гейтится режимом — уход из FM больше не глушит
Юзер: на слайсе включил 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 <noreply@anthropic.com>
This commit is contained in:
+21
-3
@@ -539,6 +539,7 @@ type
|
|||||||
procedure ApplySNBToChan(Chan: Integer; On_: Boolean);
|
procedure ApplySNBToChan(Chan: Integer; On_: Boolean);
|
||||||
procedure ApplyANFToChan(Chan: Integer; On_: Boolean);
|
procedure ApplyANFToChan(Chan: Integer; On_: Boolean);
|
||||||
procedure ApplyFMSQToChan(Chan: Integer; Enable: Boolean; Level: Integer);
|
procedure ApplyFMSQToChan(Chan: Integer; Enable: Boolean; Level: Integer);
|
||||||
|
procedure ApplySliceFMSQ(Idx: Integer); // squelch слайса с гейтом по режиму
|
||||||
procedure ApplyNoiseFilterState;
|
procedure ApplyNoiseFilterState;
|
||||||
procedure ProcessTXBlock; // вызывается из TTXDSPThread
|
procedure ProcessTXBlock; // вызывается из TTXDSPThread
|
||||||
procedure FeedTXDisplaySample(const I, Q: Double);
|
procedure FeedTXDisplaySample(const I, Q: Double);
|
||||||
@@ -2394,7 +2395,8 @@ begin
|
|||||||
ApplyNBToChan(Chan, FSlices[Idx].NBMode);
|
ApplyNBToChan(Chan, FSlices[Idx].NBMode);
|
||||||
ApplySNBToChan(Chan, FSlices[Idx].SNBOn);
|
ApplySNBToChan(Chan, FSlices[Idx].SNBOn);
|
||||||
ApplyANFToChan(Chan, FSlices[Idx].ANFOn);
|
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.
|
// Decoder input must not disappear or change scale with speaker volume.
|
||||||
if FSlices[Idx].Mode in [MODE_DMR, MODE_FMRAW] then
|
if FSlices[Idx].Mode in [MODE_DMR, MODE_FMRAW] then
|
||||||
SetRXAPanelGain1(Chan, 1.0)
|
SetRXAPanelGain1(Chan, 1.0)
|
||||||
@@ -2693,6 +2695,9 @@ begin
|
|||||||
SetRXAPanelGain1(FSlices[idx].Chan, 1.0)
|
SetRXAPanelGain1(FSlices[idx].Chan, 1.0)
|
||||||
else
|
else
|
||||||
SetRXAPanelGain1(FSlices[idx].Chan, FSlices[idx].Volume);
|
SetRXAPanelGain1(FSlices[idx].Chan, FSlices[idx].Volume);
|
||||||
|
// Ушли из FM — снять squelch (иначе слайс остаётся заглушенным, а
|
||||||
|
// шумодава в не-FM режимах нет); вернулись в FM — восстановить выбор.
|
||||||
|
ApplySliceFMSQ(idx);
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
FSliceLock.Leave;
|
FSliceLock.Leave;
|
||||||
@@ -2821,13 +2826,26 @@ begin
|
|||||||
idx := FindSliceIdx(Id); if idx < 0 then Exit;
|
idx := FindSliceIdx(Id); if idx < 0 then Exit;
|
||||||
FSlices[idx].FMSQOn := Enable;
|
FSlices[idx].FMSQOn := Enable;
|
||||||
FSlices[idx].FMSQLevel := Level;
|
FSlices[idx].FMSQLevel := Level;
|
||||||
if FSlices[idx].Opened then
|
ApplySliceFMSQ(idx);
|
||||||
ApplyFMSQToChan(FSlices[idx].Chan, Enable, Level);
|
|
||||||
finally
|
finally
|
||||||
FSliceLock.Leave;
|
FSliceLock.Leave;
|
||||||
end;
|
end;
|
||||||
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;
|
function TWDSPEngine.GetSliceSMeter(Id: Integer): Double;
|
||||||
var idx: Integer;
|
var idx: Integer;
|
||||||
begin
|
begin
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
<UseVersionInfo Value="True"/>
|
<UseVersionInfo Value="True"/>
|
||||||
<AutoIncrementBuild Value="True"/>
|
<AutoIncrementBuild Value="True"/>
|
||||||
<MinorVersionNr Value="9"/>
|
<MinorVersionNr Value="9"/>
|
||||||
<BuildNr Value="284"/>
|
<BuildNr Value="285"/>
|
||||||
</VersionInfo>
|
</VersionInfo>
|
||||||
<MacroValues Count="116">
|
<MacroValues Count="117">
|
||||||
<Macro1 Name="LCLWidgetType" Value="qt6"/>
|
<Macro1 Name="LCLWidgetType" Value="qt6"/>
|
||||||
<Macro2 Name="LCLWidgetType" Value="qt6"/>
|
<Macro2 Name="LCLWidgetType" Value="qt6"/>
|
||||||
<Macro3 Name="LCLWidgetType" Value="qt6"/>
|
<Macro3 Name="LCLWidgetType" Value="qt6"/>
|
||||||
@@ -136,6 +136,7 @@
|
|||||||
<Macro114 Name="LCLWidgetType" Value="qt6"/>
|
<Macro114 Name="LCLWidgetType" Value="qt6"/>
|
||||||
<Macro115 Name="LCLWidgetType" Value="qt6"/>
|
<Macro115 Name="LCLWidgetType" Value="qt6"/>
|
||||||
<Macro116 Name="LCLWidgetType" Value="qt6"/>
|
<Macro116 Name="LCLWidgetType" Value="qt6"/>
|
||||||
|
<Macro117 Name="LCLWidgetType" Value="qt6"/>
|
||||||
</MacroValues>
|
</MacroValues>
|
||||||
<BuildModes>
|
<BuildModes>
|
||||||
<Item Name="Debug" Default="True"/>
|
<Item Name="Debug" Default="True"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user