⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 globalunit.~pas

📁 音视频控件SunAM-V1.0 音视频控件SunAM-V1.0 音视频控件SunAM-V1.0 音视频控件SunAM-V1.0
💻 ~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;
  TOnVoiceOut = procedure(VoiceValue: 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 + -