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:
2026-05-21 18:31:48 +03:00
co-authored by Claude Sonnet 4.6
parent 960cadd4b0
commit cd9e504e8f
2 changed files with 12 additions and 10 deletions
+8 -5
View File
@@ -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
View File
@@ -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;