📄 mmadcvt.pas
字号:
{========================================================================}
{= (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 + -