fix(tx): Factory возвращает заводской звук, а не снимок живых настроек

«Default» строился через TXProfileCapture(живые настройки), поэтому сброс,
сделанный на профиле ESSB 5k, оставлял в нём High cut 5000 — то есть Factory
не сбрасывал ровно то, ради чего его жмут. Правило «заводское значит
заводское» было применено только к EQ (FlatEQ), теперь ко всему тембру.

База заводских профилей — DefaultTX, поверх копируется только живая обвязка
микрофона: разъём и режим (Mic In/Line In, boost, bias, PTT, Tip/Ring),
Line In gain и Mic gain. Их сброс сорвал бы настройку микшера. Мощность тоже
остаётся живой — скачок drive ушёл бы в усилитель. Всё остальное (полоса,
компрессор, leveler, ALC, phase rotator, EQ, AM carrier, TUN level) заводское.

Текст подтверждения и подсказка обещали, что полоса и динамика останутся как
есть, — переписаны под новое поведение.

Проверено прогоном: с живыми ESSB 5k + компрессор 12 дБ + Line In + mic gain
22.5 заводской Default выходит 200/3100, comp off, EQ ровный, а Line In,
mic gain и drive сохраняются.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-04 18:34:36 +03:00
co-authored by Claude Opus 5
parent f320ef1bcf
commit 0ba808e886
2 changed files with 27 additions and 9 deletions
+22 -5
View File
@@ -1910,6 +1910,15 @@ end;
procedure DefaultTXProfiles(const Base: TTXSettings; DrivePct: Integer;
out L: TTXProfileList);
var
// Заводской звук + ЖИВАЯ обвязка микрофона. Всё, что определяет тембр
// (полоса, динамика, EQ, AM carrier, TUN level), берётся из DefaultTX:
// «сброс к заводским» обязан сбрасывать именно это, иначе Default наследует
// ту полосу, на которой оператора застали (например 5000 от ESSB 5k).
// Не сбрасываем то, что описывает ЖЕЛЕЗО и безопасность: разъём и режим
// микрофона с его усилением (иначе слетит Line In у микшера) и мощность
// (внезапный скачок drive пошёл бы в усилитель).
Stock: TTXSettings;
const
// Кривые EQ для заводских ESSB. Значения — УЗЛЫ ломаной АЧХ WDSP (eq.c),
// а не «полосы»: между узлами интерполяция по дБ, а ЗА крайними узлами
@@ -1945,7 +1954,7 @@ const
AComp: Boolean; ACompGain: Double);
begin
if L.Count >= TXPROF_MAX then Exit;
TXProfileCapture(Base, DrivePct, L.Items[L.Count]);
TXProfileCapture(Stock, DrivePct, L.Items[L.Count]);
L.Items[L.Count].Name := AName;
L.Items[L.Count].FilterLow := ALow;
L.Items[L.Count].FilterHigh := AHigh;
@@ -1985,10 +1994,18 @@ begin
L.Count := 0;
L.ActiveIdx := 0;
ClearTXProfModeTable(L.MainByMode); // главный ничего не переключает
// «Default» — текущее состояние устройства (микрофонный вход, полоса,
// динамика, мощность), но с заводским EQ: после миграции старого конфига
// звук в эфире не меняется, а сброс к заводским возвращает ровный тембр.
TXProfileCapture(Base, DrivePct, L.Items[0]);
// База всех заводских профилей: заводской звук, живая обвязка микрофона.
TSettingsManager.DefaultTX(Stock);
Stock.MicLineIn := Base.MicLineIn;
Stock.MicBoost := Base.MicBoost;
Stock.MicBias := Base.MicBias;
Stock.MicPTTEnabled := Base.MicPTTEnabled;
Stock.MicTipRing := Base.MicTipRing;
Stock.LineInGainDB := Base.LineInGainDB;
Stock.MicGainDB := Base.MicGainDB;
// «Default» — ровно заводской звук: полоса 200..3100, компрессор выкл,
// leveler/ALC как в DefaultTX, EQ ровный.
TXProfileCapture(Stock, DrivePct, L.Items[0]);
L.Items[0].Name := 'Default';
FlatEQ(L.Items[0]);
L.Count := 1;