diff --git a/AudioOutput.pas b/AudioOutput.pas index 45bc72b..49b61e7 100644 --- a/AudioOutput.pas +++ b/AudioOutput.pas @@ -142,6 +142,7 @@ type procedure WriteDouble(Left, Right: Double); // Convenience: массив Single procedure Write(const Left, Right: array of Single; Count: Integer); + procedure Clear; property IsOpen: Boolean read FOpen; property LastError: string read GetLastError; @@ -542,6 +543,18 @@ begin FOpen := False; end; +procedure TAudioOutput.Clear; +begin + FMutex.Enter; + try + FInPt := 0; + FOutPt := 0; + FillChar(FBuf, SizeOf(FBuf), 0); + finally + FMutex.Leave; + end; +end; + // --------------------------------------------------------------------------- // WriteDouble — точная копия audio_write() из оригинала // --------------------------------------------------------------------------- diff --git a/MainForm.pas b/MainForm.pas index f7e183c..b45cab4 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -4444,7 +4444,10 @@ begin end; procedure TMainForm.ApplyMOX(Active: Boolean); +var + WasTransmitting: Boolean; begin + WasTransmitting := FTransmitting; FTransmitting := Active; FDUCPendingCount := 0; if FTransmitting then @@ -4468,6 +4471,12 @@ begin if FWDSPReady then begin FDSPEngine.SetTXRun(FTransmitting); + if WasTransmitting and (not FTransmitting) and (not FDisplayDuplex) then + begin + FDSPEngine.FlushRX; + if Assigned(FAudioOut) then + FAudioOut.Clear; + end; // SetTXRun переключает FActiveDisplayID на TX_DISP_ID; при DUP возвращаем // источник на RX, чтобы видеть приём во время передачи. if FTransmitting and FDisplayDuplex then diff --git a/WDSPEngine.pas b/WDSPEngine.pas index cd41118..63648cb 100644 --- a/WDSPEngine.pas +++ b/WDSPEngine.pas @@ -324,6 +324,7 @@ type procedure PushDDCPacket(const Buf: array of Byte; DataOffset: Integer; IQPairs: Integer); + procedure FlushRX; // RX управление procedure SetMode(Mode: Integer); @@ -1112,6 +1113,17 @@ begin RTLEventSetEvent(FQueueSem); // будим DSP поток (как sem_post в piHPSDR) end; +procedure TWDSPEngine.FlushRX; +begin + FQueueHead := FQueueTail; + FRXAccPos := 0; + FDispPos := 0; + if Length(FRXAccI) > 0 then FillChar(FRXAccI[0], Length(FRXAccI) * SizeOf(Double), 0); + if Length(FRXAccQ) > 0 then FillChar(FRXAccQ[0], Length(FRXAccQ) * SizeOf(Double), 0); + if Length(FRXIn) > 0 then FillChar(FRXIn[0], Length(FRXIn) * SizeOf(Double), 0); + if Length(FRXOut) > 0 then FillChar(FRXOut[0], Length(FRXOut) * SizeOf(Double), 0); +end; + procedure TWDSPEngine.PushIQItemToDSP(const Item: TIQQueueItem); // Вызывается из DSP потока — декодирует IQ и накапливает до FBufSize var