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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? soundconverter.pas

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

{-----------------------------------------------------------------------------
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: ACMConvertor.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 specify formats required for ACMIn and ACMOut, also allows you
to convert the data rather than just play / record it.

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.
-----------------------------------------------------------------------------}




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


//remko@prinsengracht.org    date october 2002



interface

uses
  Classes, Messages, Windows, Forms, SysUtils, Controls, headers, MMSystem;

type
  EACMConvertor = class(Exception);

//  TMandatorySetting = (msFormatTag, msChannels, msSamplesPerSec, msBitsPerSample);
//  TMandatorySettings = set of TMandatorySetting;

  TACMWaveFormat = packed record
    case integer of
      0 : (Format : TWaveFormatEx);
      1 : (RawData : Array[0..128] of byte);
  end;

  TACMConvertor = Class(TComponent)
  private
    FChooseData               : TACMFORMATCHOOSEA;
    FActive                   : Boolean;
    FBufferIn                 : Pointer;
    FBufferOut                : Pointer;
    FInputBufferSize          : DWord;
    FOutputBufferSize         : DWord;
    FStartOfStream            : Boolean;
    FStreamHandle             : HACMStream;
    FStreamHeader             : TACMStreamHeader;

    procedure ReadFormatIn(Stream : TStream);
    procedure ReadFormatOut(Stream : TStream);
    procedure WriteFormatIn(Stream : TStream);
    procedure WriteFormatOut(Stream : TStream);
    procedure SetActive(const Value: Boolean);
    procedure SetInputBufferSize(const Value: DWord);
  protected
    procedure CloseStream;
    procedure DefineProperties(Filer : TFiler); override;
    procedure OpenStream;
    procedure ReadFormat(var Format : TACMWaveFormat; Stream : TStream);
    procedure WriteFormat(var Format : TACMWaveFormat; Stream : TStream);
  public
    FormatIn,
    FormatOut                 : TACMWaveFormat;
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;

    function  ChooseFormat(var Format : TACMWaveFormat; const UseDefault : Boolean) : Boolean;
    function  ChooseFormatIn(const UseDefault : Boolean) : Boolean;
    function  ChooseFormatOut(const UseDefault : Boolean) : Boolean;
    function  Convert : DWord;
    procedure RaiseException(aMessage : String; Result : MMResult);
    function  SuggestFormat(aFormat : TACMWaveFormat{; MandatorySettings : TMandatorySettings}) : TACMWaveFormat;

    property Active           : Boolean
      read FActive
      write SetActive;
    property BufferIn         : Pointer
      read FBufferIn;
    property BufferOut        : Pointer
      read FBufferOut;
    property OutputBufferSize : DWord
      read FOutputBufferSize;
  published
    property InputBufferSize  : DWord
      read FInputBufferSize
      write SetInputBufferSize;
  end;

implementation
{ TACMConvertor }

function TACMConvertor.ChooseFormat(var Format: TACMWaveFormat; const UseDefault : Boolean) : Boolean;
var
  OrigFormat                  : PWaveFormatEX;
  Res                         : Longint;
begin
  Result := False;
  GetMem(OrigFormat,Sizeof(TACMWaveFormat));
  try
    if UseDefault then
      Move(Format,OrigFormat^, SizeOf(TACMWaveFormat))
    else with OrigFormat^ do begin
      wFormatTag := 49;   // Default to GSM6.10
      nChannels := 1;     // Mono
      nSamplesPerSec := 8000; //Low enough to strean
      nAvgBytesPerSec:= 8000;
      nBlockAlign:=1;
      wbitspersample := 8;
      cbSize := SizeOf(TACMWaveFormat);
    end;

    with FChooseData do begin
      pwfx := OrigFormat;
      cbStruct := SizeOf(FChooseData);  //Size of this structure
      cbwfx := SizeOf(TACMWaveFormat);  //Size of our WaveFormat

      fdwStyle := ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT //use our default when choosing
    end;

    Res := acmFormatChoose(FChooseData);


    if Res = MMSYSERR_NoError then begin
        Move(FChooseData.pwfx^,Format, SizeOf(TACMWaveFormat));

      Result := True;
    end else
      if Res <> ACMErr_Canceled then RaiseException('Choose format', Res);
  finally
    FreeMem(OrigFormat);
  end;
end;

function TACMConvertor.ChooseFormatIn(const UseDefault : Boolean) : Boolean;
begin
  Result := ChooseFormat(FormatIn, UseDefault);
end;

function TACMConvertor.ChooseFormatOut( const UseDefault : Boolean): Boolean;
begin
  Result := ChooseFormat(FormatOut, UseDefault);
end;

procedure TACMConvertor.CloseStream;
var
  Result : MMResult;
begin
  Result := acmStreamUnPrepareHeader(FStreamHandle, FStreamHeader, 0);
  RaiseException('acmStreamUnPrepareHeader:',Result);

  Result := acmStreamClose(FStreamHandle, 0);
  RaiseException('acmStreamClose:',Result);

  FreeMem(FBufferIn);
  FreeMem(FBufferOut);
  FActive := False;
  FStartOfStream := False;
end;

function TACMConvertor.Convert: DWord;
var
  Res : MMResult;
  IsTheStart : DWord;
begin
  if FStartOfStream then
    IsTheStart := ACM_STREAMCONVERTF_BLOCKALIGN
  else
    IsTheStart := 0;

  FillChar(BufferOut^,OutputBufferSize,#0);
  Res := acmStreamConvert(FStreamHandle,FStreamHeader,
    ACM_STREAMCONVERTF_BLOCKALIGN or IsTheStart);
  RaiseException('acmStreamConvert:',Res);

  Res := acmStreamReset(FStreamHandle,0);
  RaiseException('acmStreamReset',Res);

  Result := FStreamHeader.cbDstLengthUsed;

  FStartOfStream := False;
end;

constructor TACMConvertor.Create(AOwner: TComponent);
begin
  inherited;
  FStreamHandle := 0;
  InputBufferSize := 2048;
  with FormatIn.Format do begin
    wFormatTag := 1;
    nChannels := 1;
    nSamplesPerSec := 22050;
    nAvgBytesPerSec:= 22050;
    nBlockAlign:=1;
    wbitspersample := 8;
    cbSize := SizeOf(TACMWaveFormat);
  end;
  with FormatOut.Format do begin
    wFormatTag := 1;
    nChannels := 1;
    nSamplesPerSec := 22050;
    nAvgBytesPerSec:= 22050;
    nBlockAlign:=1;
    wbitspersample := 8;
    cbSize := SizeOf(TACMWaveFormat);
  end;

end;

procedure TACMConvertor.DefineProperties(Filer: TFiler);
begin
  inherited;
  Filer.DefineBinaryProperty('ACMFormatIn',ReadFormatIn,WriteFormatIn,True);
  Filer.DefineBinaryProperty('ACMFormatOut',ReadFormatOut,WriteFormatOut,True);
end;

destructor TACMConvertor.Destroy;
begin
  Active := False;
  inherited;
end;

procedure TACMConvertor.OpenStream;
  procedure BuildHeader;
  begin
    with FStreamHeader do begin
      cbStruct := SizeOf(TACMStreamHeader);
      fdwStatus := 0;
      dwUser := 0;
      pbSrc := FBufferIn;
      cbSrcLength := InputBufferSize;
      cbSrcLengthUsed := 0;
      dwSrcUser := 0;
      pbDst := FBufferOut;
      cbDstLength := OutputBufferSize;
      cbDstLengthUsed := 0;
      dwDstUser := 0;
    end;
  end;


var
  Result : MMResult;
begin
  FStartOfStream := True;

  Result := acmStreamOpen(FStreamhandle,0, FormatIn.Format, FormatOut.Format, nil, 0, 0, 0);
  RaiseException('acmStreamOpen:',Result);

  Result := acmStreamSize(FStreamHandle, InputBufferSize, FOutputBufferSize, ACM_STREAMSIZEF_SOURCE);
  RaiseException('acmStreamSize:',Result);

  GetMem(FBufferIn, InputBufferSize);
  Getmem(FBufferOut, OutputBufferSize);
  try
    BuildHeader;
    Result := acmStreamPrepareHeader(FStreamHandle, FStreamHeader, 0);
    RaiseException('acmStreamPrepareHeader:',Result);
  except
    Freemem(FBufferIn);
    Freemem(FBufferOut);
    raise;
  end;

  FActive := True;
end;

procedure TACMConvertor.RaiseException(aMessage : String; Result: MMResult);
begin
  case Result of
    ACMERR_NotPossible : Raise EACMConvertor.Create(aMessage + ' The requested operation cannot be performed.');
    ACMERR_BUSY : Raise EACMConvertor.Create(aMessage + ' The conversion stream is already in use.');
    ACMERR_UNPREPARED : Raise EACMConvertor.Create(aMessage + ' Cannot perform this action on a header that has not been prepared.');
    MMSYSERR_InvalFlag : Raise EACMConvertor.Create(aMessage + ' At least one flag is invalid.');
    MMSYSERR_InvalHandle : Raise EACMConvertor.Create(aMessage + ' The specified handle is invalid.');
    MMSYSERR_InvalParam : Raise EACMConvertor.Create(aMessage + ' At least one parameter is invalid.');
    MMSYSERR_NoMem : Raise EACMConvertor.Create(aMessage + ' The system is unable to allocate resources.');
    MMSYSERR_NoDriver : Raise EACmConvertor.Create(aMessage + ' A suitable driver is not available to provide valid format selections.');
  else
    if Result <> 0 then
      Raise EACMConvertor.Create(Format('%s raised an unknown error (code #%d)',[aMessage,Result]));
  end;
end;

procedure TACMConvertor.ReadFormat(var Format: TACMWaveFormat;
  Stream: TStream);
var
  TheSize                     : Integer;
begin
  Stream.Read(TheSize,SizeOf(Integer));
  Stream.Read(Format,TheSize);
end;

procedure TACMConvertor.ReadFormatIn(Stream: TStream);
begin
  ReadFormat(FormatIn, Stream);
end;

procedure TACMConvertor.ReadFormatOut(Stream: TStream);
begin
  ReadFormat(FormatOut, Stream);
end;

procedure TACMConvertor.SetActive(const Value: Boolean);
begin
  if Value = FActive then exit;
  if Value then
    OpenStream
  else
    CloseStream;
end;

procedure TACMConvertor.SetInputBufferSize(const Value: DWord);
begin
  if Active then
    raise EACMConvertor.Create('You cannot change the buffer size while active.');
  FInputBufferSize := Value;
end;

function TACMConvertor.SuggestFormat(aFormat : TACMWaveFormat{; MandatorySettings : TMandatorySettings}): TACMWaveFormat;
var
  R : MMResult;
  Temp : TWaveFormatEx;
  ValidItems : DWord;
begin
  ValidItems := 0;

  (*
  if msFormatTag in MandatorySettings then
    ValidItems := ValidItems or ACM_FORMATSUGGESTF_WFORMATTAG;
  if msChannels in MandatorySettings then
    ValidItems := ValidItems or ACM_FORMATSUGGESTF_NCHANNELS;
  if msBitsPerSample in MandatorySettings then
    ValidItems := ValidItems or ACM_FORMATSUGGESTF_WBITSPERSAMPLE;
  if msSamplesPerSec in MandatorySettings then
    ValidItems := ValidItems or ACM_FORMATSUGGESTF_NSAMPLESPERSEC;*)

  R := acmFormatSuggest(0,aFormat.Format, Temp, SizeOf(TACMWaveFormat), ValidItems);
  if R <> 0 then RaiseException('SuggestFormat',R);
  move(Temp,Result,SizeOf(TACMWaveFormat));
//  Result.Format.cbSize := SizeOf(TACMWaveFormat);

end;

procedure TACMConvertor.WriteFormat(var Format: TACMWaveFormat;
  Stream: TStream);
var
  TheSize                     : Integer;
begin
  TheSize := SizeOf(Format);
  Stream.Write(TheSize, SizeOf(Integer));
  Stream.Write(Format,TheSize);
end;

procedure TACMConvertor.WriteFormatIn(Stream: TStream);
begin
  WriteFormat(FormatIn, Stream);
end;

procedure TACMConvertor.WriteFormatOut(Stream: TStream);
begin
  WriteFormat(FormatOut, Stream);
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99精品久久久久久国产越南| 高清成人在线观看| 亚洲日本中文字幕区| 国产视频一区在线观看| 久久久亚洲国产美女国产盗摄| 日韩丝袜美女视频| 日韩你懂的电影在线观看| 欧美一区二区福利在线| 日韩视频一区在线观看| 日韩免费一区二区三区在线播放| 欧美一区二区三区日韩| 欧美va亚洲va香蕉在线| 亚洲精品在线免费观看视频| 久久精品一区二区| 欧美激情一区二区三区| 中文字幕一区二区三区在线不卡| 亚洲欧美偷拍另类a∨色屁股| 亚洲女人小视频在线观看| 一区二区三区av电影| 亚洲午夜免费视频| 美女久久久精品| 国产专区综合网| 成人黄色一级视频| 色播五月激情综合网| 欧美日韩激情一区二区| 日韩精品一区二区三区在线播放| 亚洲精品一区二区三区影院| 日本一区二区三区国色天香| 亚洲免费在线视频| 日韩国产欧美一区二区三区| 九九九久久久精品| 成人永久看片免费视频天堂| 色综合天天综合网天天狠天天| 91国产免费看| 欧美大度的电影原声| 国产日韩亚洲欧美综合| 怡红院av一区二区三区| 麻豆国产一区二区| av在线播放一区二区三区| 欧美亚洲另类激情小说| 精品精品国产高清a毛片牛牛| 国产精品美女www爽爽爽| 亚洲国产一区二区三区 | 韩国精品主播一区二区在线观看| 国产成人精品一区二区三区网站观看| 成人美女视频在线观看18| 在线免费亚洲电影| 亚洲精品一线二线三线无人区| 一区视频在线播放| 麻豆成人免费电影| 成人国产亚洲欧美成人综合网| 91精品在线观看入口| 国产精品免费观看视频| 视频一区二区三区入口| 北岛玲一区二区三区四区| 欧美一区二视频| 亚洲日本丝袜连裤袜办公室| 免费成人av在线播放| 色婷婷av一区| 久久久久久99久久久精品网站| 亚洲一区二区成人在线观看| 国产成人综合精品三级| 3d动漫精品啪啪| 亚洲欧洲中文日韩久久av乱码| 九九久久精品视频| 欧美亚洲动漫精品| 国产精品高清亚洲| 国内成人自拍视频| 欧美电影影音先锋| 亚洲女人的天堂| 高清不卡一区二区在线| 日韩欧美国产午夜精品| 亚洲国产视频a| 91在线云播放| 欧美国产精品v| 精品亚洲成av人在线观看| 欧美日免费三级在线| 亚洲视频中文字幕| 国产成人aaa| 精品国产91九色蝌蚪| 日韩电影免费一区| 欧美最猛黑人xxxxx猛交| 一本色道久久综合亚洲精品按摩| 777午夜精品免费视频| 亚洲视频一区二区在线| 国产精品香蕉一区二区三区| 欧美喷水一区二区| 亚洲午夜免费电影| 91伊人久久大香线蕉| 日本一二三四高清不卡| 国产中文字幕精品| 日韩美女一区二区三区| 青青草97国产精品免费观看无弹窗版 | 精品国产乱码久久久久久久 | 国内精品视频一区二区三区八戒| 精品视频1区2区3区| 一区二区三区四区高清精品免费观看| 成人深夜福利app| 国产精品人成在线观看免费| 高清不卡一区二区在线| 国产日韩欧美不卡| 欧美日韩国产精品成人| 亚洲品质自拍视频| 欧美日韩国产bt| 亚洲成人精品影院| 欧美三日本三级三级在线播放| 洋洋成人永久网站入口| 色综合久久中文字幕| 亚洲精品国产高清久久伦理二区| 91免费看片在线观看| 玉足女爽爽91| 欧美日韩国产综合草草| 日本va欧美va欧美va精品| 91精品国产福利在线观看 | 99re这里只有精品首页| 最新日韩在线视频| 91黄色在线观看| 亚洲一卡二卡三卡四卡无卡久久| 精品视频在线视频| 免费在线看成人av| 久久蜜桃一区二区| 成人av资源网站| 一区二区三区在线影院| 欧美日韩亚洲综合一区| 青青草成人在线观看| 久久免费的精品国产v∧| 成人免费高清在线| 一级中文字幕一区二区| 欧美一区二区三区在线观看| 国产中文字幕精品| 亚洲欧美中日韩| 欧美日韩视频专区在线播放| 日本va欧美va欧美va精品| 国产午夜精品久久久久久免费视| 成年人午夜久久久| 午夜私人影院久久久久| 日韩精品一区二区三区四区视频| 粉嫩高潮美女一区二区三区| 亚洲精品国产一区二区三区四区在线| 欧美老人xxxx18| 国产在线精品一区二区| 亚洲蜜臀av乱码久久精品| 制服丝袜激情欧洲亚洲| 国产超碰在线一区| 亚洲国产欧美在线人成| 久久久久久久久免费| 色综合夜色一区| 久久成人麻豆午夜电影| 亚洲欧洲日产国产综合网| 欧美日本韩国一区| 国产91清纯白嫩初高中在线观看| 亚洲一区中文日韩| 2022国产精品视频| 色视频成人在线观看免| 国模大尺度一区二区三区| 亚洲欧美日韩国产综合在线| 欧美大片拔萝卜| 日本韩国视频一区二区| 国产综合成人久久大片91| 亚洲精品久久久久久国产精华液| 精品国产乱子伦一区| 91福利视频网站| 国产91丝袜在线播放0| 日韩国产精品大片| 亚洲男人天堂av| 久久综合成人精品亚洲另类欧美| 91福利精品第一导航| 国产精品一区二区三区乱码 | 99精品国产视频| 久久精品国产99久久6| 亚洲美女偷拍久久| 国产日本欧洲亚洲| 欧美一区二区三区免费视频| 色综合天天在线| 国产精品白丝jk黑袜喷水| 天天综合色天天| 亚洲女子a中天字幕| 国产亚洲美州欧州综合国| 欧美高清精品3d| 色欧美88888久久久久久影院| 国产成人精品网址| 国产一区二区三区蝌蚪| 亚洲九九爱视频| 国产亚洲视频系列| 欧美xxxxxxxx| 日韩一区二区三区视频在线观看| 色8久久人人97超碰香蕉987| 成人理论电影网| 国产一区二区三区免费在线观看| 日本亚洲欧美天堂免费| 亚洲图片欧美视频| 一二三四社区欧美黄| 亚洲欧美日韩国产一区二区三区| 国产丝袜欧美中文另类| 2019国产精品| 精品国产乱码久久| 精品少妇一区二区三区日产乱码| 91精品国模一区二区三区| 欧美日韩国产高清一区二区三区| 欧美影视一区在线|