📄 globalunit.pas
字号:
unit GlobalUnit;
interface
uses
Graphics,
Controls,
WinSock,
SysUtils,
mmsystem,
math,
Windows;
const
Cmd_Audio = 9990;
Cmd_Video = 9991;
PCMFOMAT: tWAVEFORMATEX =
(wFormatTag: WAVE_FORMAT_PCM;
nChannels: 1;
nSamplesPerSec: 8000;
nAvgBytesPerSec: 16000;
nBlockAlign: 2;
wBitsPerSample: 16;
cbSize: 0;
);
type
TRemoteListPack = record
Enable: Boolean;
IP: String;
Port: DWORD;
end;
TVideoSize = packed record
Width: Word;
Height: Word;
end;
TVideoDispMode = (vm160, vm176, vm320, vm352, vm640);
TVideoRate = (vr64, vr128, vr192, vr256, vr384, vr512, vr768, vr1024);
TUDPHead = packed record
Cmd: Word;
FromUserID: Word;
DesUserID:string[100];
end;
TOnVideoShow = procedure(FrameImage: TGraphic) of object;
TOnVolumeOut = procedure(VolumeValue: integer) of object;
TRemoteListArray = array [0..9] of TRemoteListPack;
TOnBeforAudioSend = procedure(var AData: Pointer; varASize: DWORD; var CanSend: Boolean; var RemoteList: TRemoteListArray) of object;
TOnBeforVideoSend = procedure(IsKeyFrame: Boolean; var AData: Pointer; var ASize: DWORD; var CanSend: Boolean; var RemoteList: TRemoteListArray) of object;
TOnAudioOut = procedure(Adata: Pointer; Asize: Cardinal) of object;
TOnVideoOut = procedure(Adata: Pointer; Asize: Cardinal) of object;
TOnAudioShowOut = procedure(VideoSize:TVideoSize; Adata: Pointer; Asize: Cardinal) of object;
TOnVideoShowOut = procedure(VideoSize:TVideoSize; Adata: Pointer; Asize: Cardinal) of object;
TOnVideoIn = procedure(Adata: Pointer; Asize: Cardinal) of object;
TOnAudioIn = procedure(Adata: Pointer; Asize: Cardinal) of object;
TOnBeforDrawVideoFrame = procedure(bitmap: TBitmap) of object;
TOnVideoRead = procedure(IsKeyFrame: Boolean; AData: Pointer; ASize: DWORD) of object;
TOnAudioRead = procedure(Asize: Integer; AVolume: Integer; var CanPlay: Boolean) of object;
TOnAutoSetTimeDef = procedure(AutoTimeDef: Integer) of object;
procedure pcmFindPeak(pwfx: PWaveFormatEx; pSrc: PChar; dwSrcLen: Integer;
var PeakL, PeakR: SmallInt);
implementation
procedure pcmFindPeak(pwfx: PWaveFormatEx; pSrc: PChar; dwSrcLen: Integer;
var PeakL, PeakR: SmallInt);
var
SrcNumBytes, sd: Longint;
pL, pR, sw: Smallint;
begin
PeakL := 0;
PeakR := 0;
pR := 0;
pL := 0;
if pwfx^.wBitsperSample = 8 then
begin
if pwfx^.nChannels = 2 then
begin
SrcNumBytes := dwSrcLen and not 1;
while (SrcNumBytes > 0) do
begin
{ the left channel }
sw := PByte(pSrc)^ - 128;
if abs(sw) > pL then
begin
PeakL := sw;
pL := Min(abs(sw), 127);
end;
{ the right channel }
sw := PByte(pSrc + 1)^ - 128;
if abs(sw) > pR then
begin
PeakR := sw;
pR := Min(abs(sw), 127);
end;
inc(pSrc, 2 * sizeOf(Byte));
dec(SrcNumBytes, 2 * sizeOf(Byte));
end;
PeakL := PeakL + 128;
PeakR := PeakR + 128;
end
else
begin
SrcNumBytes := dwSrcLen;
while (SrcNumBytes > 0) do
begin
{ we have only one channel }
sw := PByte(pSrc)^ - 128;
if abs(sw) > pL then
begin
PeakL := sw;
pL := Min(abs(sw), 127);
end;
inc(pSrc, sizeOf(Byte));
dec(SrcNumBytes, sizeOf(Byte));
end;
PeakL := PeakL + 128;
PeakR := PeakL;
end;
end
else
begin
if pwfx^.nChannels = 2 then
begin
SrcNumBytes := dwSrcLen and not 3;
while (SrcNumBytes > 0) do
begin
{ the left channel }
sd := PSmallint(pSrc)^;
if abs(sd) > pL then
begin
PeakL := sd;
pL := Min(abs(sd), 32767);
end;
{ the right channel }
sd := PSmallint(pSrc + 2)^;
if abs(sd) > pR then
begin
PeakR := sd;
pR := Min(abs(sd), 32767);
end;
inc(pSrc, 2 * sizeOf(SmallInt));
dec(SrcNumBytes, 2 * sizeOf(SmallInt));
end;
end
else
begin
SrcNumBytes := dwSrcLen and not 1;
while (SrcNumBytes > 0) do
begin
{ we have only one channel }
sd := PSmallint(pSrc)^;
if abs(sd) > pL then
begin
PeakL := sd;
pL := Min(abs(sd), 32767);
end;
inc(pSrc, sizeOf(SmallInt));
dec(SrcNumBytes, sizeOf(SmallInt));
end;
PeakR := PeakL;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -