mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
Optimize web audio mic path: remove redundant copy and heap alloc
WebOnMic: drop intermediate Singles[] array, read PSingle directly. PushAudio: replace per-frame SetLength/array of Byte with pre-allocated FWsAudioBuf field — eliminates heap allocation from the DSP thread. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+8
-5
@@ -6135,16 +6135,19 @@ end;
|
|||||||
|
|
||||||
procedure TMainForm.WebOnMic(Samples: PSingle; Count: Integer);
|
procedure TMainForm.WebOnMic(Samples: PSingle; Count: Integer);
|
||||||
var
|
var
|
||||||
Singles: array[0..5759] of Single;
|
Buf: array[0..5759] of Double;
|
||||||
Buf: array[0..5759] of Double;
|
SP: PSingle;
|
||||||
i, n: Integer;
|
i, n: Integer;
|
||||||
begin
|
begin
|
||||||
if not FWDSPReady then Exit;
|
if not FWDSPReady then Exit;
|
||||||
n := Count;
|
n := Count;
|
||||||
if n > Length(Buf) then n := Length(Buf);
|
if n > Length(Buf) then n := Length(Buf);
|
||||||
Move(Samples^, Singles[0], n * SizeOf(Single));
|
SP := Samples;
|
||||||
for i := 0 to n - 1 do
|
for i := 0 to n - 1 do
|
||||||
Buf[i] := Singles[i];
|
begin
|
||||||
|
Buf[i] := SP^;
|
||||||
|
Inc(SP);
|
||||||
|
end;
|
||||||
FDSPEngine.PushTXMicSamplesD(Buf, n);
|
FDSPEngine.PushTXMicSamplesD(Buf, n);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|||||||
+4
-5
@@ -172,6 +172,7 @@ type
|
|||||||
FOpusBuf: array[0..OPUS_FRAME_SAMP-1] of Single;
|
FOpusBuf: array[0..OPUS_FRAME_SAMP-1] of Single;
|
||||||
FOpusBufPos: Integer;
|
FOpusBufPos: Integer;
|
||||||
FOpusOut: array[0..3999] of Byte;
|
FOpusOut: array[0..3999] of Byte;
|
||||||
|
FWsAudioBuf: array[0..4000] of Byte; // 1 байт типа + до 4000 байт Opus
|
||||||
FOpusReady: Boolean;
|
FOpusReady: Boolean;
|
||||||
// Opus decoder — для RX TX-mic аудио от браузера
|
// Opus decoder — для RX TX-mic аудио от браузера
|
||||||
FOpusDec: POpusDecoder;
|
FOpusDec: POpusDecoder;
|
||||||
@@ -1429,7 +1430,6 @@ procedure TWebServer.PushAudio(const Samples: PSingle; Count: Integer);
|
|||||||
var
|
var
|
||||||
HasWs: Boolean;
|
HasWs: Boolean;
|
||||||
i, n, Enc: Integer;
|
i, n, Enc: Integer;
|
||||||
Pkt: array of Byte;
|
|
||||||
begin
|
begin
|
||||||
if not FRunning then Exit;
|
if not FRunning then Exit;
|
||||||
FClientLock.Enter;
|
FClientLock.Enter;
|
||||||
@@ -1454,10 +1454,9 @@ begin
|
|||||||
@FOpusOut[0], SizeOf(FOpusOut));
|
@FOpusOut[0], SizeOf(FOpusOut));
|
||||||
if Enc > 0 then
|
if Enc > 0 then
|
||||||
begin
|
begin
|
||||||
SetLength(Pkt, 1 + Enc);
|
FWsAudioBuf[0] := WS_MSG_AUDIO;
|
||||||
Pkt[0] := WS_MSG_AUDIO;
|
Move(FOpusOut[0], FWsAudioBuf[1], Enc);
|
||||||
Move(FOpusOut[0], Pkt[1], Enc);
|
BroadcastBinary(FWsAudioBuf[0], 1 + Enc);
|
||||||
BroadcastBinary(Pkt[0], Length(Pkt));
|
|
||||||
end;
|
end;
|
||||||
FOpusBufPos := 0;
|
FOpusBufPos := 0;
|
||||||
end;
|
end;
|
||||||
|
|||||||
Reference in New Issue
Block a user