feat(tx): self-monitor RX-аудио на TX в любом DUP + меньше TX pre-roll

RX MUTE (self-monitor даунлинка на передаче): кнопка теперь доступна на
ВСЕХ бэкендах, а не только Pluto/QO-100. Активна только в DUP; без DUP
кнопка disabled и звук на TX не проходит (движок гейтит по
FKeepRXDuringTX=FDisplayDuplex — двойная защита: аудио-гейт + RXA не
кормится). Добавлен RadioController.DisplayDuplex. TFlatButton теперь
рисует disabled-состояние приглушённым (текст/рамка к фону).

TX pre-roll 8144->6096 (2 блока подушки вместо 3): обоснование «нужно 3
блока» опиралось на щелчок ~0.5с после старта, который на деле оказался
bfo-глитчом тона (устранён f2d0519), а не underrun'ом подушки. Латентность
старта TX ~-10мс; startup-щелчков под нагрузкой DUP не слышно (подтверждено).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 16:09:26 +03:00
co-authored by Claude Opus 4.8
parent f2d0519c9e
commit ff2082ab04
3 changed files with 49 additions and 21 deletions
+20 -2
View File
@@ -128,10 +128,28 @@ begin
R.Top + (R.Bottom - R.Top - TH) div 2, ACaption);
end;
function BlendCol(A, B: TColor; T: Double): TColor;
// Линейная смесь A→B на долю T (0..1); системные цвета резолвим через ColorToRGB.
var ca, cb: LongInt; r, g, bl: Integer;
begin
ca := ColorToRGB(A); cb := ColorToRGB(B);
r := Round((ca and $FF) + ((cb and $FF) - (ca and $FF)) * T);
g := Round(((ca shr 8) and $FF) + (((cb shr 8) and $FF) - ((ca shr 8) and $FF)) * T);
bl := Round(((ca shr 16) and $FF)+ (((cb shr 16) and $FF)- ((ca shr 16) and $FF))* T);
Result := TColor(r or (g shl 8) or (bl shl 16));
end;
procedure TFlatButton.Paint;
begin
PaintFlatButton(Canvas, ClientRect, Caption, FActive, FHot,
FClrNorm, FClrActive, FClrHot, FClrBorder, FClrText, FClrTextAct);
if Enabled then
PaintFlatButton(Canvas, ClientRect, Caption, FActive, FHot,
FClrNorm, FClrActive, FClrHot, FClrBorder, FClrText, FClrTextAct)
else
// disabled: не active/не hot, текст и рамка приглушены к фону.
PaintFlatButton(Canvas, ClientRect, Caption, False, False,
FClrNorm, FClrActive, FClrHot,
BlendCol(FClrBorder, FClrNorm, 0.6),
BlendCol(FClrText, FClrNorm, 0.55), FClrTextAct);
end;
procedure TFlatButton.MouseEnter;