fix flush

This commit is contained in:
2026-05-07 22:49:52 +03:00
parent 6067aae3dc
commit 28859d3e16
3 changed files with 34 additions and 0 deletions
+13
View File
@@ -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() из оригинала
// ---------------------------------------------------------------------------
+9
View File
@@ -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
+12
View File
@@ -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