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

📄 mmadcvt.pas

📁 一套及时通讯的原码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{========================================================================}
{=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
{========================================================================}
{=                          All Rights Reserved                         =}
{========================================================================}
{=  D 01099 Dresden             = Fax.: +49 (0)351-8037944              =}
{=  Loewenstr.7a                = info@swiftsoft.de                     =}
{========================================================================}
{=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
{========================================================================}
{=  This code is for reference purposes only and may not be copied or   =}
{=  distributed in any format electronic or otherwise except one copy   =}
{=  for backup purposes.                                                =}
{=                                                                      =}
{=  No Delphi Component Kit or Component individually or in a collection=}
{=  subclassed or otherwise from the code in this unit, or associated   =}
{=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
{=  without express permission from SwiftSoft.                          =}
{=                                                                      =}
{=  For more licence informations please refer to the associated        =}
{=  HelpFile.                                                           =}
{========================================================================}
{=  $Date: 09.03.98 - 23:34:41 $                                        =}
{========================================================================}
unit MMADCvt;

{$I COMPILER.INC}

interface

uses
    {$IFDEF WIN32}
    Windows,
    {$ELSE}
    WinTypes,
    WinProcs,
    {$ENDIF}
    SysUtils,
    Classes,
    MMSystem,
    MMUtils,
    MMObj,
    MMDSPObj,
    MMRegs,
    MMWaveIO,
    MMADPCM,
    MMPCMSup,
    MMAntex;

type
   EMMADPCMError = class(Exception);

   {-- TMMADPCMConverter ------------------------------------------------------}
   TMMADPCMConverter = class(TMMDSPComponent)
   private
      FEnabled     : Boolean;
      FOpen        : Boolean;
      FStarted     : Boolean;
      FPSrcFormat  : PWaveFormatEx;
      FPDstFormat  : PWaveFormatEx;
      FCvtFormat   : PWaveFormatEx;
      FPSrcBuffer  : PChar;
      FPDstBuffer  : PChar;
      FSrcBufSize  : Longint;
      FDstBufSize  : Longint;
      FNumConverted: Longint;
      FNumRead     : Longint;
      FMustConvert : Boolean;        { the format must be converted    }
      FCanConvert  : Boolean;        { the format can be converted     }
      FMoreBuffers : Boolean;
      FDone        : Boolean;
      FIsLoading   : Boolean;
      Ftwh         : TMMWaveHdr;
      FBits        : TMMBits;
      FIMAParams   : TIMA_PARAMS;

      procedure SetBits(aValue: TMMBits);
      function  GetCanConvert: Boolean;
      procedure PrepareConversion;

   protected
      procedure SuggestFormat; virtual;

      procedure Loaded; override;
      procedure ChangePWaveFormat(aValue: PWaveFormatEx); override;
      procedure SetPWaveFormat(aValue: PWaveFormatEx); override;
      procedure Opened; override;
      procedure Closed; override;
      procedure Started; override;
      procedure Stopped; override;
      procedure Reseting; override;
      procedure BufferLoad(lpwh: PWaveHdr; var MoreBuffers: Boolean); override;

   public
      constructor Create(aOwner: TComponent); override;
      destructor Destroy; override;

      procedure Open;
      procedure Close;
      procedure Start;
      procedure Stop;

      property CanConvert: Boolean read GetCanConvert;

   published
      property Input;
      property Output;
      property BitLength: TMMBits read FBits write SetBits default b16Bit;
      property Enabled: Boolean read FEnabled write FEnabled default True;
   end;

implementation

const
     LOADSIZE = 4096;

{== TMMADPCMConverter =========================================================}
constructor TMMADPCMConverter.Create(aOwner: TComponent);
begin
   inherited Create(aOwner);

   FEnabled     := True;
   FOpen        := False;
   FStarted     := False;
   FMustConvert := False;
   FCanConvert  := False;
   FPSrcFormat  := nil;
   FPSrcBuffer  := nil;
   FPDstBuffer  := nil;
   FBits        := b16Bit;
   FIsLoading   := True;

   ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
   if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
end;

{-- TMMADPCMConverter ---------------------------------------------------------}
destructor TMMADPCMConverter.Destroy;
begin
   Close;

   GlobalFreeMem(Pointer(FPSrcFormat));
   GlobalFreeMem(Pointer(FPDstFormat));
   GlobalFreeMem(Pointer(FCvtFormat));

   inherited Destroy;
end;

{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.SetBits(aValue: TMMBits);
begin
   if (aValue <> FBits) then
   begin
      FBits := aValue;
      PrepareConversion;
   end;
end;

{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.Loaded;
begin
   inherited Loaded;

   FIsLoading := False;
   PrepareConversion;
end;

{-- TMMADPCMConverter ---------------------------------------------------------}
function TMMADPCMConverter.GetCanConvert: Boolean;
begin
   Result := (not FMustConvert) or FCanConvert;
end;

{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.ChangePWaveFormat(aValue: PWaveFormatEx);
begin
   if (aValue <> FPSrcFormat) then
   begin
      GlobalFreeMem(Pointer(FPSrcFormat));
      FPSrcFormat := wioCopyWaveFormat(aValue);

      PrepareConversion;
   end;
end;

{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.SetPWaveFormat(aValue: PWaveFormatEx);
begin
   (* TODO: setzen von WaveFormat nicht erlaubt !!! *)
end;

{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.SuggestFormat;
var
   wfx: TWaveFormatEx;
begin
   GlobalFreeMem(Pointer(FCvtFormat));

   if (FPSrcFormat <> nil) and FEnabled then
   case FPSrcFormat.wFormatTag of
       WAVE_FORMAT_ADPCM:
       begin
          if adpcmBuildFormatHeader(FPSrcFormat, @wfx, (Ord(FBits)+1)*8,-1,-1) then
             FCvtFormat := wioCopyWaveFormat(@wfx);
       end;
       WAVE_FORMAT_MEDIAVISION_ADPCM,
       WAVE_FORMAT_ANTEX_ADPCME,
       WAVE_FORMAT_ADPCME:
       begin
          pcmBuildWaveheader(@wfx,(Ord(FBits)+1)*8,FPSrcFormat^.nChannels,FPSrcFormat.nSamplesPerSec);
          FCvtFormat := wioCopyWaveFormat(@wfx);
        end;
   end;
end;

{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.PrepareConversion;
begin
   FMustConvert := False;
   FCanConvert := False;

   if (FPSrcFormat <> nil) and FEnabled then
   begin
      if (FPSrcFormat^.wFormatTag <> WAVE_FORMAT_PCM) then
      begin
         FMustConvert := True;

         SuggestFormat;

         if (FCvtFormat <> nil) and (FCvtFormat^.wFormatTag = WAVE_FORMAT_PCM) then
         begin
            FCanConvert := True;
            inherited SetPWaveFormat(FCvtFormat);
            exit;
         end;
      end;
   end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -