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

📄 mmadcvt.pas

📁 一套及时通讯的原码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
   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 + -