📄 mmadcvt.pas
字号:
inherited SetPWaveFormat(FPSrcFormat);
end;
{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.Open;
begin
if not FOpen and FEnabled then
begin
if FMustConvert then
try
if FCanConvert then
begin
FSrcBufSize := LOADSIZE;
case FPSrcFormat.wFormatTag of
WAVE_FORMAT_ADPCM:
begin
FDstBufSize := PADPCMWaveFormat(FPSrcFormat)^.wSamplesPerBlock * Longint(FCvtFormat^.nBlockAlign);
FDstBufSize := FDstBufSize*(FSrcBufSize div FPSrcFormat^.nBlockAlign);
end;
WAVE_FORMAT_MEDIAVISION_ADPCM,
WAVE_FORMAT_ANTEX_ADPCME,
WAVE_FORMAT_ADPCME:
begin
FDstBufSize := 4*FSrcBufSize;
end;
end;
FPSrcBuffer := GlobalAllocMem(FSrcBufSize);
FPDstBuffer := GlobalAllocMem(FDstBufSize);
if (FPSrcBuffer = nil) or (FPDstBuffer = nil) then
begin
FCanConvert := False;
exit;
end;
end;
finally
if not FCanConvert then
raise EMMADPCMError.Create('Unable to convert to destination format');
end;
FOpen := True;
end;
end;
{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.Close;
begin
if FOpen then
begin
Stop;
FOpen := False;
GlobalFreeMem(Pointer(FPSrcBuffer));
GlobalFreeMem(Pointer(FPDstBuffer));
end;
end;
{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.Start;
begin
if FOpen and not FStarted then
begin
FStarted := True;
FMoreBuffers := False;
FDone := False;
FNumRead := 0;
FNumConverted := 0;
FillChar(FIMAParams,sizeOf(FIMAParams),0);
end;
end;
{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.Stop;
begin
if FStarted then
begin
FStarted := False;
FNumRead := FNumConverted;
end;
end;
{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.Opened;
begin
Open;
inherited Opened;
end;
{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.Closed;
begin
Close;
inherited Closed;
end;
{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.Started;
begin
inherited Started;
Start;
end;
{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.Stopped;
begin
Stop;
inherited Stopped;
end;
{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.Reseting;
begin
inherited Reseting;
FNumRead := FNumConverted;
FillChar(FIMAParams,sizeOf(FIMAParams),0);
end;
{-- TMMADPCMConverter ---------------------------------------------------------}
procedure TMMADPCMConverter.BufferLoad(lpwh: PWaveHdr; var MoreBuffers: Boolean);
Label CopyData;
var
nRead,nBytes: Longint;
begin
if FOpen and FStarted and FEnabled then
begin
{ read Data }
if (Input <> nil) then
begin
nBytes := lpwh^.dwBufferLength;
if FMustConvert and FCanConvert then
begin
CopyData:
{ get some data from the conversion buffer }
if (FNumConverted-FNumRead > 0) then
begin
nRead := Min(FNumConverted-FNumRead,nBytes);
GlobalMoveMem((FPDstBuffer+FNumRead)^,(lpwh^.lpData+lpwh^.dwBytesRecorded)^,nRead);
dec(nBytes,nRead);
inc(FNumRead,nRead);
inc(lpwh^.dwBytesRecorded,nRead);
end;
if not PMMWaveHdr(lpwh)^.LoopRec.dwLooping then
begin
{ do we need more data ? }
if FStarted and (nBytes > 0) then
begin
if not FDone then
begin
GlobalFillMem(Ftwh,sizeOf(Ftwh),0);
Ftwh.wh.lpData := FPSrcBuffer;
Ftwh.wh.dwBufferLength := FSrcBufSize;
Ftwh.LoopRec := PMMWaveHdr(lpwh)^.LoopRec;
FMoreBuffers := False;
inherited BufferLoad(@Ftwh,FMoreBuffers);
nRead := Ftwh.wh.dwBytesRecorded;
PMMWaveHdr(lpwh)^.LoopRec := Ftwh.LoopRec;
if not FMoreBuffers or (nRead <= 0) then FDone := True;
end
else nRead := 0;
if (nRead > 0) and FStarted then
begin
case FPSrcFormat.wFormatTag of
WAVE_FORMAT_ADPCM:
begin
nRead := adpcmDecode4Bit(PADPCMWaveFormat(FPSrcFormat),
FCvtFormat,
FPSrcBuffer, FPDstBuffer, nRead);
end;
WAVE_FORMAT_MEDIAVISION_ADPCM:
begin
if (FPSrcFormat^.nChannels = 1) then
nRead := wmimatopcm(FPSrcBuffer, FPDstBuffer, nRead, FIMAParams)
else if (FPSrcFormat^.nChannels = 2) then
nRead := wsimatopcm(FPSrcBuffer, FPDstBuffer, nRead, FIMAParams)
else
nRead := 0;
if (FBits = b8Bit) then
nRead := pcmBitsPerSampleAlign(8, FPDstBuffer, 16, FPDstBuffer,nRead);
end;
WAVE_FORMAT_ANTEX_ADPCME,
WAVE_FORMAT_ADPCME:
begin
if (FPSrcFormat^.nChannels = 1) then
nRead := wmdvitopcm(FPSrcBuffer, FPDstBuffer, nRead, FIMAParams)
else if (FPSrcFormat^.nChannels = 2) then
nRead := wsdvitopcm(FPSrcBuffer, FPDstBuffer, nRead, FIMAParams)
else
nRead := 0;
if (FBits = b8Bit) then
nRead := pcmBitsPerSampleAlign(8, FPDstBuffer, 16, FPDstBuffer,nRead);
end;
end;
if nRead <= 0 then
begin
if not FDone then
begin
FCanConvert := False;
exit;
end;
end
else if FStarted then
begin
FNumConverted := nRead;
FNumRead := 0;
goto CopyData;
end;
end;
end;
end;
MoreBuffers := FMoreBuffers or (FNumConverted-FNumRead > 0);
end
else inherited BufferLoad(lpwh,MoreBuffers);
end;
end
else inherited BufferLoad(lpwh,MoreBuffers);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -