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

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

?? soundout.pas

?? ACM_VOIP_VCL VOIP
?? PAS
字號:
unit soundout;


{-----------------------------------------------------------------------------
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: ACMOut.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-output stream, in almost any format

Contributor(s):
None as yet


Last Modified: September 14, 2000
Current Version: 1.00

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

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



//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
  EACMOut = class(Exception);
  TBufferPlayedEvent = procedure(Sender : TObject; Header : PWaveHDR) of object;
  TACMOut = class(TComponent)
  private
    { Private declarations }
    FActive                   : Boolean;
    FNumBuffersLeft           : Byte;
    FBackBufferList           : TList;
    FNumBuffers               : Byte;
    FBufferList               : TList;
    FFormat                   : TACMWaveFormat;
    FOnBufferPlayed           : TBufferPlayedEvent;
    FWindowHandle             : HWnd;

    function GetBufferCount: Integer;
  protected
    { Protected declarations }
    function  NewHeader : PWaveHDR;
    procedure DisposeHeader(Header : PWaveHDR);
    procedure DoWaveDone(Header : PWaveHdr);
    procedure WndProc(var Message : TMessage);
  public
      FWaveOutHandle            : HWaveOut;
    { Public declarations }
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;

    procedure Close;
    procedure Open(aFormat : TACMWaveFormat);
    procedure Play( Buffer:pointer; Size : Integer);
    procedure RaiseException(const aMessage : String; Result : Integer);

    property Active           : Boolean
      read FActive;
    property BufferCount      : Integer
      read GetBufferCount;
    property Format           : TACMWaveFormat
      read FFormat;
    property WindowHandle     : HWnd
      read FWindowHandle;

  published
    { Published declarations }
    property NumBuffers      : Byte
      read FNumBuffers
      write FNumBuffers;
    property OnBufferPlayed   : TBufferPlayedEvent
      read FOnBufferPlayed
      write FOnBufferPlayed;
  end;


implementation


{ TACMOut }

procedure TACMOut.Close;
var
  X                           : Integer;
begin
  if not Active then exit;
  FActive := False;
  WaveOutReset(FWaveOutHandle);
  WaveOutClose(FWaveOutHandle);
  FBackBufferList.Clear;
  FWaveOutHandle := 0;
  For X:=FBufferList.Count-1 downto 0 do DisposeHeader(PWaveHDR(FBufferList[X]));
end;

constructor TACMOut.Create(AOwner: TComponent);
begin
  inherited;
  FBufferList := TList.Create;
  FBackBufferList := TList.Create;
  FActive := False;
  FWindowHandle := AllocateHWND(WndProc);
  FWaveOutHandle := 0;
  FNumBuffers := 4;

end;

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

procedure TACMOut.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;

procedure TACMOut.DoWaveDone(Header : PWaveHdr);
var
  Res                         : Integer;
begin
  if not Active then exit;
  if Assigned(FOnBufferPlayed) then FOnBufferPlayed(Self, Header);
  Res := WaveOutUnPrepareHeader(FWaveOutHandle, Header, SizeOf(TWaveHDR));
  if Res <> 0 then RaiseException('WaveOut-UnprepareHeader',Res);
  DisposeHeader(Header);
end;

function TACMOut.GetBufferCount: Integer;
begin
  Result := FBufferList.Count;
end;

function TACMOut.NewHeader: PWaveHDR;
begin
  GetMem(Result, SizeOf(TWaveHDR));
  FBufferList.Add(Result);
end;

procedure TACMOut.Open(aFormat: TACMWaveFormat);
var
  Res                         : Integer;
  Device                      : integer;
  Params                      : Integer;
begin
  if Active then exit;
  FWaveOutHandle := 0;
  FNumBuffersLeft := FNumBuffers;
  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;
  Res := WaveOutOpen(@FWaveOutHandle,device,@FFormat.Format,FWindowHandle,0, params);
  if Res <> 0 then RaiseException('WaveOutOpen',Res);
  FActive := True;
end;

procedure TACMOut.Play(Buffer:pointer; Size: Integer);
var
  TempHeader                  : PWaveHdr;
  Data                        : Pointer;
  Res                         : Integer;
  X                           : Integer;

  procedure PlayHeader(Header : PWaveHDR);
  begin
    Res := WaveOutPrepareHeader(FWaveOutHandle,Header,SizeOf(TWaveHDR));
    if Res <> 0 then RaiseException('WaveOut-PrepareHeader',Res);

    Res := WaveOutWrite(FWaveOutHandle, Header, SizeOf(TWaveHDR));
    if Res <> 0 then RaiseException('WaveOut-Write',Res);
  end;

begin
  if Size = 0 then exit;
  if not active then exit;
  TempHeader := NewHeader;
   GetMem(Data, Size);
   Move(Buffer^,Data^,Size);
  with TempHeader^ do begin
    lpData := data;//was data
    dwBufferLength := Size;
    dwBytesRecorded :=0; //Was " := Size;" but not needed, and crashes some PC's
    dwUser := 0;
    dwFlags := 0;
    dwLoops := 1;
  end;

  if FNumBuffersLeft > 0 then begin
    FBackBufferList.Add(TempHeader);
    Dec(FNumBuffersLeft);
  end else begin
    for X:=0 to FBackBufferList.Count-1 do
      PlayHeader(PWaveHDR(FBackBufferList[X]));
    FBackBufferList.Clear;
    PlayHeader(TempHeader);
  end;
end;

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

end;

procedure TACMOut.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    MM_WOM_DONE : DoWaveDone(PWaveHDR(Message.LParam));
  end;
  inherited
end;

end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本精品一级二级| 精品一区二区三区免费| 99在线精品观看| 国产精品日韩成人| av在线不卡电影| 一区二区三区电影在线播| 91老师国产黑色丝袜在线| 亚洲香肠在线观看| 3751色影院一区二区三区| 开心九九激情九九欧美日韩精美视频电影 | jiyouzz国产精品久久| 国产精品久久三| 欧洲精品一区二区三区在线观看| 五月天婷婷综合| 久久品道一品道久久精品| 成人黄色av网站在线| 亚洲自拍偷拍综合| 日韩欧美一区二区免费| 国产成人高清视频| 亚洲日本va在线观看| 欧美日韩成人高清| 国产精品一区二区三区99| 中文字幕一区二区视频| 欧美日韩国产精品成人| 狠狠久久亚洲欧美| 亚洲欧洲精品一区二区精品久久久| 91成人免费网站| 国产精品伊人色| 亚洲香蕉伊在人在线观| 久久精品亚洲乱码伦伦中文| 91浏览器在线视频| 国内成+人亚洲+欧美+综合在线| 中文字幕亚洲一区二区av在线| 8v天堂国产在线一区二区| 国产精品一区在线| 午夜欧美2019年伦理| 国产三级三级三级精品8ⅰ区| 在线观看亚洲精品| 国产精品资源站在线| 亚洲自拍偷拍网站| 亚洲国产电影在线观看| 欧美一区二区三区免费在线看| av成人免费在线观看| 精品一区二区精品| 亚洲第一二三四区| 最新国产の精品合集bt伙计| 精品理论电影在线观看| 欧美在线看片a免费观看| 国产精品一色哟哟哟| 91在线视频免费91| 久久激情五月激情| 性做久久久久久久久| 成人欧美一区二区三区黑人麻豆| 日韩欧美国产综合在线一区二区三区| 色av一区二区| 不卡的av电影| 国产精品一区二区久激情瑜伽 | 91麻豆swag| 成人av电影在线播放| 久久国产夜色精品鲁鲁99| 亚洲一区二区三区小说| 亚洲视频一区二区免费在线观看 | 国产精品卡一卡二| 久久久精品人体av艺术| 日韩免费视频线观看| 欧美福利视频一区| 欧美日韩免费在线视频| 色播五月激情综合网| 99vv1com这只有精品| 成人污视频在线观看| 国产一区二区三区免费| 久久精品国产**网站演员| 麻豆国产精品官网| 麻豆精品精品国产自在97香蕉| 日韩电影一区二区三区| 五月激情丁香一区二区三区| 亚洲成人精品影院| 三级久久三级久久久| 亚洲电影视频在线| 无码av免费一区二区三区试看 | 色丁香久综合在线久综合在线观看| 国产91精品久久久久久久网曝门| 国产精品自在在线| 成人av资源在线观看| 在线成人午夜影院| 日韩免费成人网| 精品少妇一区二区三区在线播放 | 国产精品妹子av| 中文字幕国产一区| 日韩理论片一区二区| 亚洲精品视频观看| 午夜国产不卡在线观看视频| 天堂精品中文字幕在线| 久久精品国产99久久6| 国产一区二区网址| av网站一区二区三区| 色婷婷精品久久二区二区蜜臂av| 欧美最猛性xxxxx直播| 欧美日韩精品二区第二页| 日韩一级黄色片| 国产三级一区二区| 亚洲午夜视频在线观看| 日本欧美一区二区| 国产成人夜色高潮福利影视| 99re免费视频精品全部| 欧美日韩精品一区二区三区| 精品精品欲导航| 国产精品久久免费看| 亚洲444eee在线观看| 韩国v欧美v亚洲v日本v| 91丨porny丨国产| 91麻豆精品国产91久久久资源速度 | 久久精品亚洲乱码伦伦中文| 综合网在线视频| 日韩国产欧美在线观看| 风间由美一区二区三区在线观看| 一本色道久久综合亚洲aⅴ蜜桃| 7777精品久久久大香线蕉| 日本一区二区三区久久久久久久久不 | 色av成人天堂桃色av| 欧美一级免费观看| 国产精品国产馆在线真实露脸| 丝袜诱惑亚洲看片| 国产成人av影院| 制服丝袜中文字幕一区| 欧美韩日一区二区三区四区| 视频在线观看国产精品| 成人一级黄色片| 日韩一区二区三区在线观看 | 久久婷婷久久一区二区三区| 亚洲美女电影在线| 国产精品一区二区黑丝| 欧美日韩在线观看一区二区| 国产精品嫩草影院com| 麻豆久久久久久| 欧美三级欧美一级| 国产精品你懂的| 国产在线视频精品一区| 欧美日韩情趣电影| 亚洲免费观看高清完整版在线| 国内精品免费在线观看| 91精品国产综合久久福利| 亚洲免费视频成人| 懂色av一区二区夜夜嗨| 精品奇米国产一区二区三区| 亚洲国产精品久久久男人的天堂| 不卡视频在线观看| 久久精品视频一区二区| 免费高清成人在线| 欧美区视频在线观看| 亚洲欧美国产毛片在线| 不卡在线观看av| 中文字幕不卡三区| 国产乱码字幕精品高清av| 日韩欧美一区二区在线视频| 亚洲在线中文字幕| 91精品福利视频| 亚洲男帅同性gay1069| www.亚洲免费av| 国产精品久久久久影视| 国产·精品毛片| 亚洲国产电影在线观看| 国产成人综合视频| 国产亚洲综合性久久久影院| 激情久久五月天| 久久久无码精品亚洲日韩按摩| 国产在线麻豆精品观看| 精品国产乱码久久久久久闺蜜| 久久国产夜色精品鲁鲁99| 日韩三级高清在线| 免费看精品久久片| 欧美不卡激情三级在线观看| 精品一区二区三区在线视频| 日韩欧美综合一区| 久草热8精品视频在线观看| 精品久久久久久久人人人人传媒 | 成人综合日日夜夜| 欧美国产国产综合| 成人的网站免费观看| 国产精品二三区| 久久精品人人做人人爽人人| 国产精品亚洲午夜一区二区三区| 久久精品水蜜桃av综合天堂| 大胆亚洲人体视频| 亚洲人成网站在线| 欧美三级中文字幕在线观看| 日韩av电影免费观看高清完整版 | 日韩三级中文字幕| 国产一区二区不卡老阿姨| 国产农村妇女毛片精品久久麻豆| av亚洲精华国产精华精华| 亚洲韩国精品一区| 日韩精品一区二区三区视频在线观看 | 亚洲小少妇裸体bbw| 欧美一区二区三区小说| 国产精品亚洲一区二区三区在线| 日韩久久一区二区| 欧美精品v国产精品v日韩精品| 九色综合狠狠综合久久| 国产精品国产三级国产|