亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? soundin.pas

?? ACM_VOIP_VCL VOIP
?? PAS
字號:
unit soundin;
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html

Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.

The Original Code is: ACMIn.pas, released August 28, 2000.

The Initial Developer of the Original Code is Peter Morris (pete@stuckindoors.com),
Portions created by Peter Morris are Copyright (C) 2000 Peter Morris.
All Rights Reserved.

Purpose of file:
Allows you to open an audio-input stream, in almost any format

Contributor(s):
None as yet


Last Modified: September 14, 2000
Current Version: 1.10

You may retrieve the latest version of this file at http://www.stuckindoors.com/dib

Known Issues:
TrueSpeech doesn't work for some reason.
-----------------------------------------------------------------------------}

//November 2nd, 2000
//Pete M
//I was stupidly freeing the wav header data before calling an event, this
//caused intermittent Access Violations.  This is now fixed.

//adapted and changed to build good voip component by remko weingarten


//remko@prinsengracht.org    date october 2002



interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  soundconverter, MMSystem, headers;

type
  TACMBufferCount = 2..64;
    PMixDetails = ^TMixDetails;
    TMixDetails = record
                 Destination,Source : Word;
                 Name : string;
                 VolControlID,MuteControlID, MeterControlID : dword;
                 Left, Right, Meter : Word;
                 CtrlType : Word;
                 Mute, Mono, Speakers, Available : boolean;
                 Next:PMixDetails;
                end;

  TBufferFullEvent = procedure(Sender : TObject; Data : Pointer; Size:longint) of object;
  EACMIn = Class(Exception);
  TACMIn = class(TComponent)


  private
    FActive                   : Boolean;
    FBufferList               : TList;
    FBufferSize               : DWord;
    FFormat                   : TACMWaveFormat;
    FNumBuffers               : TACMBufferCount;
    FWindowHandle             : HWnd;
    FOnBufferFull             : TBufferFullEvent;
    procedure DoBufferFull(Header : PWaveHdr);
    procedure SetBufferSize(const Value: DWord);
    procedure SetNumBuffers(const Value: TACMBufferCount);

  protected
    function  NewHeader : PWaveHDR;
    procedure DisposeHeader(Header : PWaveHDR);
    procedure WndProc(Var Message : TMessage);
  public
      FWaveInHandle             : HWaveIn;
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
    procedure Open(aFormat : TACMWaveFormat);
    procedure Close;
    procedure RaiseException(const aMessage : String; Result : Integer);
     property Active         : Boolean
        read FActive;
      property WindowHandle   : HWnd
        read FWindowHandle;
    published
      property BufferSize     : DWord
        read FBufferSize
        write SetBufferSize;
      property NumBuffers     : TACMBufferCount
        read FNumBuffers
        write SetNumBuffers;

      property OnBufferFull   : TBufferFullEvent
        read FOnBufferFull
        write FOnBufferFull;
 end;


implementation


constructor TACMIn.Create(AOwner:TComponent);
begin
 inherited;
 FBufferList := TList.Create;
 FActive := False;
 FBufferSize := 8192;
 FWaveInHandle := 0;
 FWindowHandle := AllocateHWND(WndProc);
 FNumBuffers := 4;
end;

procedure TACMIn.DoBufferFull(Header : PWaveHdr);
var
   Res                        : Integer;
   BytesRecorded              : Integer;
   Data                       : Pointer;
begin
  if Active then begin

    BytesRecorded:=header.dwBytesRecorded;

    if assigned(FOnBufferFull) then begin
      Getmem(Data, BytesRecorded);
      try
        move(header.lpData^,Data^,BytesRecorded);
        FOnBufferFull(Self, data, BytesRecorded); 
      finally
        Freemem(Data);
      end;
    end;

    Res := WaveInUnPrepareHeader(FWaveInHandle,Header,sizeof(TWavehdr));
    if Res <>0  then RaiseException('WaveIn-UnprepareHeader', Res);

    header.dwbufferlength:=FBufferSize;
    header.dwBytesRecorded:=0;
    header.dwUser:=0;
    header.dwflags:=0;
    header.dwloops:=0;
    FillMemory(Header.lpData,FBufferSize,0); //snap het nut er niet van...

    Res := WaveInPrepareHeader(FWaveInHandle,Header,sizeof(TWavehdr));
    if Res <> 0 then RaiseException('WaveIn-PrepareHeader', Res);

    Res:=WaveInAddBuffer(FWaveInHandle,Header,sizeof(TWaveHdr));
    if Res <> 0 then RaiseException('WaveInAddBuffer', Res);


   end else
    if not (csDestroying in ComponentState) then
      DisposeHeader(Header);

end;

procedure TACMIn.Open(aFormat : TACMWaveFormat);
var
  Res                         : Integer;
  J                           : Integer;
  Device                      : Integer;
  Params                      : Integer;
begin
  if Active then exit;
  FWaveInHandle := 0;
  FFormat := aFormat;


  if FFormat.Format.wFormatTag = 1 then begin
    Params := CALLBACK_WINDOW;
    Device := -1;
  end else begin
    Params := CALLBACK_WINDOW or WAVE_MAPPED;
    Device := 0;
  end;
if aformat.format.wFormatTag=1 then
  Res := WaveInOpen(@FWaveInHandle,Device,@aFormat.Format,FWindowHandle,0,CALLBACK_WINDOW ) else
Res := WaveInOpen(@FWaveInHandle,Device,@aFormat.Format,FWindowHandle,0,CALLBACK_WINDOW or WAVE_MAPPED);
  if Res <> 0 then RaiseException('WaveIn-Open',Res);

  for j:= 1 to FNumBuffers do NewHeader;

  Res := WaveInStart(FWaveInHandle);
  if Res <> 0 then RaiseException('WaveIn-Start',Res);

  FActive := True;
end;

destructor TACMIn.Destroy;
begin
  if Active then Close;
  FBufferList.Free;
  DeAllocateHWND(FWindowHandle);
  inherited;
end;

procedure TACMIn.RaiseException(const aMessage: String; Result: Integer);
begin
try
if factive then close;
except
end;
  case Result of
    ACMERR_NotPossible : Raise EACMIn.Create(aMessage + ' The requested operation cannot be performed.');
    ACMERR_BUSY : Raise EACMIn.Create(aMessage + ' The conversion stream is already in use.');
    ACMERR_UNPREPARED : Raise EACMIn.Create(aMessage + ' Cannot perform this action on a header that has not been prepared.');
    MMSYSERR_InvalFlag : Raise EACMIn.Create(aMessage + ' At least one flag is invalid.');
    MMSYSERR_InvalHandle : Raise EACMIn.Create(aMessage + ' The specified handle is invalid.');
    MMSYSERR_InvalParam : Raise EACMIn.Create(aMessage + ' At least one parameter is invalid.');
    MMSYSERR_NoMem : Raise EACMIn.Create(aMessage + ' The system is unable to allocate resources.');
    MMSYSERR_NoDriver : Raise EACMIn.Create(aMessage + ' A suitable driver is not available to provide valid format selections.');
    MMSYSERR_ALLOCATED : Raise EACMIn.Create(aMessage + ' The specified resource is already in use.');
    MMSYSERR_BADDEVICEID : Raise EACMIn.Create(aMessage + ' The specified resource does not exist.');
    WAVERR_BADFORMAT : Raise EACMIn.Create(aMessage + ' Unsupported audio format.');
    WAVERR_SYNC : Raise EACMIn.Create(aMessage + ' The specified device does not support asynchronous operation.');
  else
    if Result <> 0 then
      Raise EACMIn.Create(SysUtils.Format('%s raised an unknown error (code #%d)',[aMessage,Result]));
  end;

end;

procedure TACMIn.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    MM_WIM_Data: DoBufferFull(PWaveHDR(Message.LParam));
  end;
inherited
end;


procedure TACMIn.Close;
var
  X                           : Integer;
begin
  if not Active then Exit;
  FActive := False;
  WaveInReset(FWaveInHandle);
  WaveInClose(FWaveInHandle);
  FWaveInHandle := 0;
  For X:=FBufferList.Count-1 downto 0 do DisposeHeader(PWaveHDR(FBufferList[X]));
end;

procedure TACMIn.SetBufferSize(const Value: DWord);
begin
  if Active then exit;
  FBufferSize := Value;
end;

function TACMIn.NewHeader: PWaveHDR;
var
  Res                         : Integer;
begin
  Getmem(Result, SizeOf(TWaveHDR));
  FBufferList.Add(Result);
  with Result^ do begin
    Getmem(lpData,FBufferSize);
    dwBufferLength := FBufferSize;
    dwBytesRecorded := 0;
    dwFlags := 0;
    dwLoops := 0;
    Res := WaveInPrepareHeader(FWaveInHandle,Result,sizeof(TWaveHDR));
    if Res <> 0 then RaiseException('WaveIn-PrepareHeader',Res);

    Res := WaveInAddBuffer(FWaveInHandle,Result,SizeOf(TWaveHDR));
    if Res <> 0 then RaiseException('WaveIn-AddBuffer',Res);
  end;
end;

procedure TACMIn.SetNumBuffers(const Value: TACMBufferCount);
begin
  if Active then exit;
  FNumBuffers := Value;
end;

procedure TACMIn.DisposeHeader(Header: PWaveHDR);
var
  X                           : Integer;
begin
  X := FBufferList.IndexOf(Header);
  if X < 0 then exit;
  Freemem(header.lpData);
  Freemem(header);
  FBufferList.Delete(X);
end;

end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久青草欧美一区二区三区| 日本午夜精品视频在线观看 | 国产美女一区二区| 欧美一区二区视频网站| 日本vs亚洲vs韩国一区三区二区| 亚洲精品在线观看视频| 国产精品综合在线视频| 亚洲主播在线播放| 亚洲精品在线三区| 久久免费精品国产久精品久久久久| 91精品国产91综合久久蜜臀| 欧美美女网站色| 国产不卡在线视频| 亚洲精品国产高清久久伦理二区| 欧美一区二区二区| 精品999久久久| 久久一区二区三区四区| 欧美日韩一区二区三区四区五区| 色呦呦国产精品| 亚洲欧美日韩国产综合| 日韩午夜在线影院| 在线看国产日韩| 国产成人精品影视| 国产精品欧美久久久久一区二区| 欧美一级日韩免费不卡| 欧美日韩在线直播| 日韩视频在线你懂得| 久久影音资源网| 国产精品伦一区二区三级视频| 亚洲欧美二区三区| 日韩av在线播放中文字幕| 韩国av一区二区三区在线观看| 亚洲男人的天堂网| 日产欧产美韩系列久久99| 国产在线不卡一卡二卡三卡四卡| 91在线视频18| 成人午夜在线视频| 国产成人av影院| 欧美午夜不卡视频| 日本乱人伦aⅴ精品| 本田岬高潮一区二区三区| 久久66热偷产精品| 久久精品国产亚洲a| 全国精品久久少妇| 99久久精品国产导航| 欧美一区二区三区白人| 中文字幕一区二区三| 日本一区二区三级电影在线观看| 日韩精品最新网址| 久久蜜桃av一区精品变态类天堂 | 制服丝袜亚洲网站| 在线成人免费视频| 综合久久一区二区三区| 136国产福利精品导航| 久久精品国产一区二区| 在线亚洲高清视频| 一区二区中文视频| 国产老肥熟一区二区三区| 制服丝袜av成人在线看| 亚洲欧美成人一区二区三区| 国产91丝袜在线观看| 日韩三级视频在线看| 亚洲一级不卡视频| 亚洲婷婷在线视频| 在线观看一区日韩| 久久久高清一区二区三区| 亚洲国产毛片aaaaa无费看| 中文字幕一区二区三区不卡在线 | 婷婷开心激情综合| 久久se这里有精品| 欧美日韩国产综合一区二区三区 | 日韩欧美色综合网站| 午夜精品久久久久久久久久久 | 亚洲电影在线播放| 一级中文字幕一区二区| 午夜欧美在线一二页| 欧美性做爰猛烈叫床潮| 亚洲欧美日韩国产中文在线| 91玉足脚交白嫩脚丫在线播放| 日韩欧美中文字幕一区| 欧美精品丝袜中出| 伊人开心综合网| 色悠悠久久综合| 亚洲视频在线一区二区| 色综合久久久网| 亚洲男同性视频| 在线观看av一区| 首页国产欧美日韩丝袜| 国产一区二区三区四| 精品福利一区二区三区| 国产综合色产在线精品| 久久精品亚洲国产奇米99| 亚洲综合色噜噜狠狠| 欧美精三区欧美精三区| 美女视频第一区二区三区免费观看网站| 国产不卡视频一区| 亚洲欧美一区二区视频| 日本二三区不卡| 欧美a一区二区| 久久久www成人免费毛片麻豆 | 2020国产精品| 成人小视频免费观看| 亚洲精品成人在线| 这里只有精品视频在线观看| 久久精品国产99国产精品| 久久日韩粉嫩一区二区三区| 99久久婷婷国产综合精品| 亚洲图片欧美综合| 久久综合五月天婷婷伊人| 亚洲乱码国产乱码精品精可以看| 色天天综合色天天久久| 日韩经典中文字幕一区| 久久精品这里都是精品| 在线影视一区二区三区| 老司机午夜精品| 最新成人av在线| 欧美一区二区三区的| 成人午夜视频免费看| 亚洲成人综合在线| www一区二区| 在线观看亚洲精品| 国产精品综合二区| 久久av老司机精品网站导航| 欧美国产一区在线| 毛片av中文字幕一区二区| 国产精品久久夜| 成人av资源站| 亚洲人成伊人成综合网小说| 欧美mv和日韩mv的网站| 国产在线观看一区二区| 亚洲成人激情社区| 国产精品女人毛片| 亚洲欧美日本韩国| 欧美一区二区三区视频免费播放 | 亚洲精品写真福利| 久久精品一区二区三区av| 在线免费不卡视频| 丁香网亚洲国际| 激情综合亚洲精品| 日韩经典中文字幕一区| 亚洲成人福利片| 亚洲视频一二区| 国产精品区一区二区三区| 欧美精品一区二区三区视频| 欧美高清视频一二三区| 欧美色倩网站大全免费| 色8久久人人97超碰香蕉987| 99久久婷婷国产| 高清国产午夜精品久久久久久| 精品午夜久久福利影院| 美腿丝袜亚洲综合| 麻豆免费精品视频| 精品亚洲aⅴ乱码一区二区三区| 美女被吸乳得到大胸91| 婷婷夜色潮精品综合在线| 亚洲综合男人的天堂| 一区二区在线免费观看| 亚洲精品第一国产综合野| 亚洲欧美日韩国产手机在线| 一区二区中文字幕在线| 亚洲欧美另类久久久精品| 亚洲一区成人在线| 天天综合网 天天综合色| 日韩电影在线免费| 美日韩一区二区| 国产麻豆一精品一av一免费| 国产精品2024| 成人国产免费视频| 91国产丝袜在线播放| 欧洲国产伦久久久久久久| 在线观看亚洲精品视频| 555www色欧美视频| 精品国产免费人成在线观看| 国产偷国产偷精品高清尤物| 最新热久久免费视频| 一区二区三区在线看| 午夜视频一区二区| 精品在线免费视频| av激情亚洲男人天堂| 欧美色综合天天久久综合精品| 欧美猛男超大videosgay| 精品国产伦一区二区三区观看方式| 久久综合色之久久综合| 亚洲三级在线播放| 日本三级亚洲精品| 成人午夜激情片| 欧美日韩高清影院| 久久天天做天天爱综合色| 亚洲免费观看在线视频| 日韩**一区毛片| 成人国产精品视频| 欧美日韩黄色一区二区| 欧美高清在线精品一区| 午夜精品一区二区三区免费视频| 国产又粗又猛又爽又黄91精品| 成人av在线资源网站| 日韩免费观看高清完整版| 亚洲欧美日韩一区二区三区在线观看| 免费一级片91| 欧美色视频一区|