mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-26 22:57:34 +00:00
Mic settings: auto PTT source, Mic In/Line In, Line In gain, Tip/Ring
- Remove manual "Mic Source" (Radio/SoundCard) setting from UI and storage; source is now determined automatically in ApplyMOX: HW PTT → txmsRadio, MOX button/CAT → txmsSoundCard if audio device configured, else txmsRadio - Replace "Line in" checkbox with "Mic jack" combo (Mic In / Line In); when Line In is selected, Mic Boost is hidden and Line In Gain (-34.5..+12 dB, step 1.5 dB) is shown and sent as DUC Specific byte 51 - Add Tip/Ring connector selector (Orion/OrionMkII boards 4/5 only, byte 50 bit 3); control is hidden for other board types - Fix byte 50 bit 1 (Mic Boost) suppressed when Line In is active - Fix byte 51 comment polarity (was reversed: 0=+12dB; correct: 0=-34.5dB) - New JSON fields: mic_line_in, mic_tip_ring, line_in_gain_db; mic_source removed Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+50
-44
@@ -303,7 +303,6 @@ type
|
||||
FWebBindAddr: string;
|
||||
FWebUser: string;
|
||||
FWebPass: string;
|
||||
FSavedMicSource: TTXMicSource; // сохраняется при переключении на txmsWeb
|
||||
FWebMicActive: Boolean; // True если текущий TX идёт через txmsWeb
|
||||
// --- CAT ---
|
||||
FCATEngine: TCATEngine;
|
||||
@@ -659,6 +658,7 @@ type
|
||||
procedure TrkVolumeChange(Sender: TObject);
|
||||
function CalcDriveByte: Byte;
|
||||
function ActiveTXFreqHz: Double;
|
||||
function DefaultMicSource: TTXMicSource;
|
||||
procedure ApplyMOX(Active: Boolean);
|
||||
procedure OnTXIQReady(const Buf: array of Double; Count: Integer);
|
||||
procedure OnPASettingsChange(MaxPower: Double; const BandCal: array of Double);
|
||||
@@ -2884,7 +2884,7 @@ begin
|
||||
begin
|
||||
if FTransmitting then
|
||||
begin
|
||||
if FTXSettings.MicSource = 1 then
|
||||
if FDSPEngine.TXMicSource = txmsSoundCard then
|
||||
StatusBar1.Panels[5].Text :=
|
||||
Format('TX sc: avail=%d ring=%d',
|
||||
[FAudioIn.Available, FDSPEngine.TXMicRingAvail])
|
||||
@@ -3283,7 +3283,7 @@ begin
|
||||
// HW mic-стрим уходит в WDSP только если выбран источник Radio.
|
||||
// Иначе сэмплы игнорируются (mic берётся со звуковой карты).
|
||||
if FTransmitting and FWDSPReady and
|
||||
(FTXSettings.MicSource = Ord(txmsRadio)) then
|
||||
(FDSPEngine.TXMicSource = txmsRadio) then
|
||||
FDSPEngine.PushTXMicSamples16(Data.Samples, 64);
|
||||
end;
|
||||
|
||||
@@ -3293,18 +3293,21 @@ end;
|
||||
|
||||
function TMainForm.BuildMicLineSelectByte: Byte;
|
||||
// openHPSDR Ethernet Protocol v4.3, DUC Specific byte 50:
|
||||
// bit 0 — Line in (1 = line-in вместо mic-in)
|
||||
// bit 1 — Mic Boost (+20 dB)
|
||||
// bit 0 — Line In (1 = line-in вместо mic-in)
|
||||
// bit 1 — Mic Boost (+20 dB); не ставим когда Line In
|
||||
// bit 2 — 0 = Orion mic PTT enabled, 1 = disabled (инверсия!)
|
||||
// bit 3 — PTT/bias polarity (не используем)
|
||||
// bit 3 — Tip/Ring (0=Tip, 1=Ring; Orion/OrionMkII)
|
||||
// bit 4 — Orion mic bias (1 = enable +5V bias)
|
||||
// bit 5 — Saturn 3.5mm/XLR (не используем)
|
||||
// bit 5 — Saturn XLR/balanced (не используем)
|
||||
begin
|
||||
Result := 0;
|
||||
if FTXSettings.MicLineIn then Result := Result or $01;
|
||||
if FTXSettings.MicBoost then Result := Result or $02;
|
||||
if not FTXSettings.MicPTTEnabled then Result := Result or $04;
|
||||
if FTXSettings.MicBias then Result := Result or $10;
|
||||
if FTXSettings.MicLineIn then
|
||||
Result := Result or $01 // bit 0: Line In
|
||||
else if FTXSettings.MicBoost then
|
||||
Result := Result or $02; // bit 1: Boost только при Mic In
|
||||
if not FTXSettings.MicPTTEnabled then Result := Result or $04; // bit 2: инверсия
|
||||
if FTXSettings.MicTipRing then Result := Result or $08; // bit 3: Ring
|
||||
if FTXSettings.MicBias then Result := Result or $10; // bit 4: bias
|
||||
end;
|
||||
|
||||
procedure TMainForm.SendDUCSpecificFromSettings;
|
||||
@@ -3326,6 +3329,9 @@ begin
|
||||
DUCPkt.DUC0RateLo := Lo(RateKsps);
|
||||
DUCPkt.DUC0Bits := 24;
|
||||
DUCPkt.MicLineSelect := BuildMicLineSelectByte;
|
||||
// Line In Gain (byte 51): 0=-34.5dB .. 31=+12dB (шаг 1.5 dB, формула Thetis).
|
||||
// При Mic In значение игнорируется железом, но шлём корректное для Line In.
|
||||
DUCPkt.LineInGain := Byte(EnsureRange(Round((FTXSettings.LineInGainDB + 34.5) / 1.5), 0, 31));
|
||||
// ATT on TX — RX-ADC step attenuator во время передачи (Thetis-style protection).
|
||||
// Дублируем значение во все три ADC-байта: на однопотоковых платах активен только
|
||||
// ADC0, на Saturn/Hermes Lite 2 — могут использоваться ADC1/ADC2.
|
||||
@@ -3335,11 +3341,21 @@ begin
|
||||
FNetwork.SendDUCSpecific(DUCPkt);
|
||||
end;
|
||||
|
||||
function TMainForm.DefaultMicSource: TTXMicSource;
|
||||
// Mic source для MOX-кнопки и Web-TX: если настроена звуковая карта — берём с неё,
|
||||
// иначе используем HW mic-стрим от трансивера.
|
||||
// HW PTT всегда переключает на txmsRadio непосредственно в ApplyMOX.
|
||||
begin
|
||||
if FAudioInDevName <> '' then Result := txmsSoundCard
|
||||
else Result := txmsRadio;
|
||||
end;
|
||||
|
||||
procedure TMainForm.ApplyTXSettingsToDSP;
|
||||
begin
|
||||
if not FWDSPReady then Exit;
|
||||
// Mic source — сначала, чтобы PullSoundCardMic уже видел правильное значение
|
||||
FDSPEngine.SetTXMicSource(TTXMicSource(FTXSettings.MicSource));
|
||||
// Mic source — выставляем значение по умолчанию для MOX-кнопки;
|
||||
// при реальном PTT ApplyMOX скорректирует источник.
|
||||
FDSPEngine.SetTXMicSource(DefaultMicSource);
|
||||
FDSPEngine.SetMicGain(FTXSettings.MicGainDB);
|
||||
FDSPEngine.SetTXFilterFull(FTXSettings.FilterLow, FTXSettings.FilterHigh,
|
||||
FTXSettings.FilterNC, FTXSettings.FilterMP,
|
||||
@@ -3368,7 +3384,7 @@ begin
|
||||
end;
|
||||
|
||||
function TMainForm.PullSoundCardMic(MaxN: Integer): Integer;
|
||||
// Колбэк, который TTXDSPThread зовёт при MicSource=SoundCard.
|
||||
// Колбэк, который TTXDSPThread зовёт при TXMicSource=txmsSoundCard.
|
||||
// Тянем только реально доступные сэмплы из FAudioIn — иначе мы пушили бы
|
||||
// нули и mic-цепь в WDSP получала бы тишину вместо реального сигнала.
|
||||
// Читаем пачкой в локальный буфер и пушим одним вызовом — экономим
|
||||
@@ -3849,15 +3865,13 @@ begin
|
||||
FAudioOutDevName := '';
|
||||
end;
|
||||
FAudioOut.Open;
|
||||
// Аудио устройство ввода (TX mic). Если в настройках выбрана конкретная
|
||||
// soundcard — открываем её и принудительно переключаем MicSource на SoundCard,
|
||||
// иначе пользователь нажмёт MOX и не поймёт почему его микрофон молчит.
|
||||
// Аудио устройство ввода (TX mic). MicSource (Radio/SoundCard) определяется
|
||||
// автоматически в ApplyMOX по источнику PTT — здесь только открываем устройство.
|
||||
if G_Settings.AudioInDevice <> '' then
|
||||
begin
|
||||
FAudioIn.DeviceIndex := FAudioIn.FindDeviceByName(G_Settings.AudioInDevice);
|
||||
FAudioInDevName := G_Settings.AudioInDevice;
|
||||
FAudioIn.Open;
|
||||
FTXSettings.MicSource := 1; // SoundCard
|
||||
end
|
||||
else
|
||||
begin
|
||||
@@ -5085,18 +5099,26 @@ begin
|
||||
end;
|
||||
if FWDSPReady then
|
||||
begin
|
||||
// Переключаем источник микрофона: при TX из браузера — txmsWeb,
|
||||
// при TX с кнопки без веб-клиента — штатный источник из настроек.
|
||||
if FTransmitting and Assigned(FWebServer) and FWebServer.WebClientActive then
|
||||
// Mic source — определяем автоматически по источнику TX:
|
||||
// Web TX → txmsWeb
|
||||
// HW PTT (FHWPTTActive при входе в ApplyMOX уже True) → txmsRadio
|
||||
// MOX-кнопка/CAT → sound card если настроена, иначе txmsRadio
|
||||
if FTransmitting then
|
||||
begin
|
||||
FSavedMicSource := TTXMicSource(FTXSettings.MicSource);
|
||||
FWebMicActive := True;
|
||||
FDSPEngine.SetTXMicSource(txmsWeb);
|
||||
if Assigned(FWebServer) and FWebServer.WebClientActive then
|
||||
begin
|
||||
FWebMicActive := True;
|
||||
FDSPEngine.SetTXMicSource(txmsWeb);
|
||||
end
|
||||
else if FHWPTTActive then
|
||||
FDSPEngine.SetTXMicSource(txmsRadio)
|
||||
else
|
||||
FDSPEngine.SetTXMicSource(DefaultMicSource);
|
||||
end
|
||||
else if not FTransmitting and FWebMicActive then
|
||||
else if FWebMicActive then
|
||||
begin
|
||||
FWebMicActive := False;
|
||||
FDSPEngine.SetTXMicSource(FSavedMicSource);
|
||||
FDSPEngine.SetTXMicSource(DefaultMicSource);
|
||||
end;
|
||||
// В non-DUP RX-IQ пакеты дропаются на входе DSP-потока во время TX,
|
||||
// чтобы TX leakage не накапливался в RXA pipeline и FFT-истории
|
||||
@@ -6683,26 +6705,9 @@ begin
|
||||
on E: Exception do
|
||||
StatusBar1.Panels[3].Text := 'Mic err: ' + E.Message;
|
||||
end;
|
||||
// Автопереключение mic-источника: явный выбор PortAudio-устройства
|
||||
// → берём mic со звуковой карты, иначе HW mic-стрим бы перебивал его.
|
||||
FTXSettings.MicSource := 1; // SoundCard
|
||||
end
|
||||
else
|
||||
begin
|
||||
StatusBar1.Panels[3].Text := 'Mic: none';
|
||||
// Нет выбранного soundcard mic → возвращаемся на HW mic-стрим.
|
||||
FTXSettings.MicSource := 0; // Radio
|
||||
end;
|
||||
if FWDSPReady then
|
||||
FDSPEngine.SetTXMicSource(TTXMicSource(FTXSettings.MicSource));
|
||||
if FDevConnected then
|
||||
begin
|
||||
FSettings.SaveTX(FDevMAC, FTXSettings);
|
||||
FSettings.Save;
|
||||
end;
|
||||
// Если открыт диалог настроек — синхронизировать UI
|
||||
if Assigned(FSettingsForm) then
|
||||
TSettingsForm(FSettingsForm).LoadTXSettings(FTXSettings);
|
||||
end;
|
||||
|
||||
procedure TMainForm.ApplyVisibility(ShowSpectrum, ShowWaterfall: Boolean);
|
||||
@@ -6770,7 +6775,8 @@ begin
|
||||
SF.OnWebSettingsChange := ApplyWebSettings;
|
||||
end;
|
||||
SF := TSettingsForm(FSettingsForm);
|
||||
SF.LoadTXSettings(FTXSettings);
|
||||
SF.LoadTXSettings(FTXSettings,
|
||||
IfThen(FNetwork.Connected, FNetwork.Device.BoardType, FPendingBoardType));
|
||||
SF.LoadAlexSettings(FAlexSettings,
|
||||
IfThen(FNetwork.Connected, FNetwork.Device.BoardType, FPendingBoardType));
|
||||
SF.LoadXvtrSettings(FXvtrSettings);
|
||||
|
||||
Reference in New Issue
Block a user