MemFile.dpr
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:6k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. //------------------------------------------------------------------------------
  2. //
  3. // Desc: DirectShow sample code - application using async filter.
  4. // Converted to Delphi by
  5. // Andriy Nevhasymyy (a.n@email.com), Milenko Mitrovich (dcoder@dsp-worx.de)
  6. //
  7. // Portions created by Microsoft are
  8. // Copyright (c) 1992 - 2000, Microsoft Corporation.  All rights reserved.
  9. //------------------------------------------------------------------------------
  10. program MemFile;
  11. {$APPTYPE CONSOLE}
  12. uses
  13.   SysUtils,
  14.   Windows,
  15.   BaseClass,
  16.   DirectShow9,
  17.   DSUtil,
  18.   ActiveX,
  19.   UAsyncIo in '..UAsyncIo.pas',
  20.   UAsyncRdr in '..UAsyncRdr.pas',
  21.   UMemFile in 'UMemFile.pas',
  22.   UAsyncFlt in '..UAsyncFlt.pas';
  23. //  Select a filter into a graph and render its output pin,
  24. //  returning the graph
  25. function SelectAndRender(AReader: TBCMemFileReader;
  26.   var AFG: IFilterGraph): HResult;
  27. var
  28.   _Builder: IGraphBuilder;
  29.   _Pin: IPin;
  30. begin
  31.   if Not Assigned(AReader) then
  32.   begin
  33.     Result := E_POINTER;
  34.     Exit;
  35.   end;
  36.   //  Create filter graph
  37.   Result := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC,
  38.     IID_IFilterGraph, AFG);
  39.   if Failed(Result) then
  40.     Exit;
  41.   //  Add our filter
  42.   Result := AFG.AddFilter(AReader, nil);
  43.   if Failed(Result) then
  44.     Exit;
  45.   //  Get a GraphBuilder interface from the filter graph
  46.   Result := AFG.QueryInterface(IID_IGraphBuilder, _Builder);
  47.   if Failed(Result) then
  48.     Exit;
  49.   //  Render our output pin
  50.   _Pin := AReader.GetPin(0);
  51.   Result := _Builder.Render(_Pin);
  52.   // _Builder released on function exit
  53. end;
  54. function PlayFileWait(var AFG: IFilterGraph): HResult;
  55. var
  56.   _MC: IMediaControl;
  57.   _ME: IMediaEvent;
  58.   _Event: OAEVENT;
  59.   _EvCode: Integer;
  60. begin
  61.   if Not Assigned(AFG) then
  62.   begin
  63.     Result := E_POINTER;
  64.     Exit;
  65.   end;
  66.   Result := AFG.QueryInterface(IID_IMediaControl, _MC);
  67.   if Failed(Result) then
  68.     Exit;
  69.   Result := AFG.QueryInterface(IID_IMediaEvent, _ME);
  70.   if Failed(Result) then
  71.     Exit;
  72.   Result := _ME.GetEventHandle(_Event);
  73.   if Succeeded(Result) then
  74.   begin
  75.     Result := _MC.Run;
  76.     if Succeeded(Result) then
  77.       Result := _ME.WaitForCompletion(Infinite, _EvCode);
  78.   end;
  79. end;
  80. var
  81.   KBPerSec: DWord;
  82.   mt: TAMMediaType;
  83.   pmt: PAMMediaType;
  84.   Ext: String;
  85.   hFile: THandle;
  86.   Size: ULARGE_INTEGER;
  87.   Mem: PByte;
  88.   BytesRead: DWord;
  89.   hr: HResult;
  90.   Stream: TBCMemFileStream;
  91.   Reader: TBCMemFileReader;
  92.   FG: IFilterGraph;
  93.   procedure OnFileDone;
  94.   begin
  95.     CloseHandle(hFile);
  96.   end;
  97. begin
  98.   //  Read a file into memory, play it (or part of it), then exit
  99.   if (ParamCount < 1) or (ParamCount > 2) then
  100.   begin
  101.     WriteLn('Usage : memfile FileName <Kbytes per sec>');
  102.     ExitCode := 0;
  103.     Exit;
  104.   end;
  105.   KBPerSec := StrToInt64Def(ParamStr(2), Infinite);
  106.   pmt := @mt;
  107.   TBCMediaType(pmt).InitMediaType;
  108.   mt.majortype := MEDIATYPE_Stream;
  109.   //  Find the extension
  110.   Ext := UpperCase(ExtractFileExt(ParamStr(1)));
  111.   // Set subtype based on file extension
  112.   if (Ext = '.MPG') then
  113.     mt.subtype := MEDIASUBTYPE_MPEG1System
  114.   else
  115.     if (Ext = '.MPA') then
  116.       mt.subtype := MEDIASUBTYPE_MPEG1Audio
  117.     else
  118.       if (Ext = '.MPV') then
  119.         mt.subtype := MEDIASUBTYPE_MPEG1Video
  120.       else
  121.         if (Ext = '.DAT') then
  122.           mt.subtype := MEDIASUBTYPE_MPEG1VideoCD
  123.         else
  124.           if (Ext = '.AVI') then
  125.             mt.subtype := MEDIASUBTYPE_Avi
  126.           else
  127.             if (Ext = '.MOV') then
  128.               mt.subtype := MEDIASUBTYPE_QTMovie
  129.             else
  130.               if (Ext = '.WAV') then
  131.                 mt.subtype := MEDIASUBTYPE_WAVE
  132.               else
  133.                 begin
  134.                   WriteLn(Format('Unknown file type: %s', [Ext]));
  135.                   ExitCode := 1;
  136.                   Exit;
  137.                 end;
  138.   //  Open the file
  139.   hFile := CreateFile(PAnsiChar(ParamStr(1)), GENERIC_READ, FILE_SHARE_READ,
  140.     nil, OPEN_EXISTING, 0, 0);
  141.   if (hFile = INVALID_HANDLE_VALUE) then
  142.   begin
  143.     WriteLn(Format('Could not open %s', [ParamStr(0)]));
  144.     ExitCode := 1;
  145.     Exit;
  146.   end;
  147.   // Determine the file size
  148.   Size.LowPart := GetFileSize(hFile, @Size.HighPart);
  149.   // Allocate a buffer to hold the file's data
  150.   try
  151.     GetMem(Mem, Size.LowPart);
  152.     if (Not ReadFile(hFile, Mem^, Size.LowPart, BytesRead, nil)) or
  153.       (BytesRead <> Size.LowPart) then
  154.     begin
  155.       WriteLn(Format('Could not read file %s', [ParamStr(1)]));
  156.       ExitCode := 1;
  157.       OnFileDone;
  158.       Exit;
  159.     end;
  160.     OnFileDone;
  161.   except
  162.     WriteLn(Format('Could not allocate %d bytes', [Size.LowPart]));
  163.     ExitCode := 1;
  164.     OnFileDone;
  165.     Exit;
  166.   end;
  167.   hr := S_OK;
  168.   CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
  169.   Stream := TBCMemFileStream.Create(Mem, Size.QuadPart, KBPerSec);
  170.   Reader := TBCMemFileReader.Create(Stream, @mt, hr);
  171.   if (Failed(hr) or (Reader = nil)) then
  172.   begin
  173.     if Assigned(Reader) then
  174.       FreeAndNil(Reader);
  175.     WriteLn(Format('Could not create filter'#13#10 + 'HResult: %8.8x', [hr]));
  176.     ExitCode := 1;
  177.     CoUninitialize;
  178.     Exit;
  179.   end;
  180.   //  Make sure we don't accidentally go away!
  181.   Reader._AddRef;
  182.   FG := nil;
  183.   hr := SelectAndRender(Reader, FG);
  184.   if Failed(hr) then
  185.     begin
  186.       WriteLn(Format('Failed to create graph and render file.'#13#10 +
  187.         'HResult: %8.8x'#13#10+'Desc: %s', [hr, GetErrorString(hr)]));
  188.     end
  189.   else
  190.     begin
  191.       //  Play the file
  192.       hr := PlayFileWait(FG);
  193.       if Failed(hr) then
  194.         WriteLn(Format('Failed to play graph.'#13#10 + 'HResult: %8.8x', [hr]));
  195.     end;
  196.   // don磘 use Reader.Free !!!
  197.   // The Reader will destroy itself if the Reference Count is 0
  198.   Reader._Release;
  199.   if Assigned(FG) then
  200.     FG := nil;
  201.   CoUninitialize;
  202.   ExitCode := 0;
  203. end.