feat(audio): раздельная громкость RX и TX-монитора + фикс синка слайдера

Две сохраняемые громкости: FVolume (RX) и FTxMonVolume (self-monitor
даунлинка на передаче, дефолт 40). Контекст монитора = TX + DUP + RX MUTE
off (тот же гейт, что аудио в движке). В этом контексте слайдер/SetVolume
правят FTxMonVolume, иначе FVolume; ActiveVolume — активная под контекст.
Автопереключение громкости RX<->TX-монитор на T/R (SetMOX) и при смене
RX MUTE / DUP во время передачи (ApplyActiveVolume). Обе персистятся
(tx_mon_volume в конфиге). Веб выровнен на ActiveVolume.

Фикс: слайдер громкости не синхронизировался с загруженным значением после
подключения (в rfDevice синкался только drive, volume пропущен) → слайдер
оставался на 70, движок брал сохранённое → «прыжок» при первом касании.
Добавлен TrkVolume.Position := ActiveVolume в rfDevice.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 16:24:57 +03:00
co-authored by Claude Opus 4.8
parent ff2082ab04
commit e13d610a23
4 changed files with 49 additions and 10 deletions
+3 -2
View File
@@ -1313,7 +1313,7 @@ begin
rfAGCMode:
for i := 0 to 4 do StyleButton(BtnAGCMode[i], i = FController.FAGCMode);
rfVolume:
TrkVolume.Position := FController.FVolume;
TrkVolume.Position := FController.ActiveVolume; // RX или TX-монитор
rfRxGain:
UpdateRxGainUI;
rfDrive:
@@ -1457,6 +1457,7 @@ begin
RebuildXvtrButtons;
PushXvtrToWeb;
TrkDrive.Position := FController.FDrivePercent; // слайдер ← drive%
TrkVolume.Position := FController.ActiveVolume; // слайдер ← загруженная громкость (был баг: не синхронизировался)
UpdateDriveLabel; // переключаем единицу %/дБ под бэкенд
if Assigned(FSampleRateOverlay) then
FSampleRateOverlay.SetCurrentRate(FController.FSampleRate);
@@ -5372,7 +5373,7 @@ procedure TMainForm.PushVfoOverlayExtState;
begin
if not (Assigned(FVfoOverlay) and FVfoOverlay.Visible) then Exit;
// TxSel: этот слайс выбран для передачи. Пока слайс один → всегда True.
FVfoOverlay.SetExtState(FController.FVolume, FController.FMuted,
FVfoOverlay.SetExtState(FController.ActiveVolume, FController.FMuted,
FController.FSplitTxB, FController.FTransmitting, True);
end;