mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
Phase 5 (D1): move RX audio routing into the controller
OnAudioReady moves from MainForm into TRadioController (radio-speaker push + local AudioOut). The web steal becomes a route hook: controller fires OnAudioConsume; TWebAdapter.AudioConsume mixes to mono and pushes to the web client, returning True to skip local AudioOut. Behavior-preserving; removes the last audio-path coupling to MainForm. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
682025e99b
commit
7c8fd298ae
@@ -79,6 +79,12 @@ type
|
||||
// Маршалинг произвольного метода в поток контроллера (GUI: TThread.Synchronize).
|
||||
TUIInvokeEvent = procedure(M: TThreadMethod) of object;
|
||||
|
||||
// Перехват RX-аудио потребителем (web-адаптер): вернуть True, если аудио
|
||||
// отправлено клиенту и НЕ должно идти в локальный AudioOut. Вызывается из
|
||||
// DSP-потока (как сам OnAudioReady) — реализация должна быть thread-safe.
|
||||
TAudioConsumeEvent = function(const Left, Right: array of Single;
|
||||
Count: Integer): Boolean of object;
|
||||
|
||||
// Снимок состояния для синхронизации нового фронтенда (Arduino/Web на connect).
|
||||
TRadioSnapshot = record
|
||||
VfoA, VfoB, CenterFreq, SpanHz: Double;
|
||||
@@ -110,6 +116,7 @@ type
|
||||
FOnInvoke: TUIInvokeEvent;
|
||||
FOnStateChanged: TRadioStateEvent;
|
||||
FOnAfterTune: TThreadMethod; // пост-тюн хук: канал-оркестрация после SetVfoA
|
||||
FOnAudioConsume: TAudioConsumeEvent; // web-перехват RX-аудио (если активен клиент)
|
||||
procedure Changed(Field: TRadioField);
|
||||
procedure ApplyAGCToEngine; // применяет FAGCMode к WDSP (единый маппинг)
|
||||
procedure ApplyModeDefaults; // дефолтный фильтр/девиация под текущий FMode
|
||||
@@ -265,6 +272,7 @@ type
|
||||
// ---- Колбэки движков (вызываются из рабочих потоков сети/DSP) ----
|
||||
// Чистая обработка данных без UI; навешиваются на FNetwork/FDSPEngine
|
||||
// вызывающим (GUI или демон) после CreateEngines.
|
||||
procedure OnAudioReady(const Left, Right: array of Single; Count: Integer);
|
||||
procedure OnMicPacket(const Data: TMicDataPacket);
|
||||
function PullSoundCardMic(MaxN: Integer): Integer;
|
||||
procedure OnDDCIQ(DDCIndex: Integer; const Data: TDDCIQPacket);
|
||||
@@ -429,6 +437,7 @@ type
|
||||
// рендера) — сюда вешается канальная оркестрация (ChannelController.OnVfoTuned),
|
||||
// чтобы любой путь тюнинга (desktop/web/CAT/энкодер) был канал-aware headless.
|
||||
property OnAfterTune: TThreadMethod read FOnAfterTune write FOnAfterTune;
|
||||
property OnAudioConsume: TAudioConsumeEvent read FOnAudioConsume write FOnAudioConsume;
|
||||
end;
|
||||
|
||||
implementation
|
||||
@@ -732,6 +741,19 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TRadioController.OnAudioReady(const Left, Right: array of Single;
|
||||
Count: Integer);
|
||||
// DSP-поток: маршрут RX-аудио. Встроенный динамик трансивера (DDC Audio,
|
||||
// port 1028) — независимый канал. Затем web-адаптер может перехватить аудио
|
||||
// (активный клиент); если перехвачено — в локальный AudioOut не пишем.
|
||||
begin
|
||||
if FSendAudioToRadio then
|
||||
FNetwork.SendSpeakerAudio(Left, Right, Count);
|
||||
if Assigned(FOnAudioConsume) and FOnAudioConsume(Left, Right, Count) then
|
||||
Exit;
|
||||
FAudioOut.Write(Left, Right, Count);
|
||||
end;
|
||||
|
||||
procedure TRadioController.OnMicPacket(const Data: TMicDataPacket);
|
||||
// HW mic-стрим уходит в WDSP только если выбран источник Radio; иначе сэмплы
|
||||
// игнорируются (mic берётся со звуковой карты).
|
||||
|
||||
Reference in New Issue
Block a user