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

Delphi控件源码

开发平台:

Delphi

  1. unit Main;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Graphics, Controls, Forms, Dialogs, DirectShow9,
  5.   ActiveX, StdCtrls, DSUtil, ComCtrls, ShellAPI, Definitions, Buttons, Classes,
  6.   ExtCtrls;
  7. type
  8.   TForm1 = class(TForm, IAsyncExCallBack)
  9.     TmrNillAll: TTimer;
  10.     Label1: TLabel;
  11.     ComboBox1: TComboBox;
  12.     Button6: TButton;
  13.     GroupBox5: TGroupBox;
  14.     Label7: TLabel;
  15.     Label2: TLabel;
  16.     Label8: TLabel;
  17.     Label3: TLabel;
  18.     TrackBar1: TTrackBar;
  19.     TrackBar2: TTrackBar;
  20.     GroupBox4: TGroupBox;
  21.     RadioButton3: TRadioButton;
  22.     RadioButton4: TRadioButton;
  23.     GroupBox2: TGroupBox;
  24.     Label20: TLabel;
  25.     Label21: TLabel;
  26.     Label22: TLabel;
  27.     Label23: TLabel;
  28.     Label24: TLabel;
  29.     Label25: TLabel;
  30.     Label26: TLabel;
  31.     Label27: TLabel;
  32.     GroupBox3: TGroupBox;
  33.     Label16: TLabel;
  34.     Label17: TLabel;
  35.     Label18: TLabel;
  36.     Label19: TLabel;
  37.     GroupBox9: TGroupBox;
  38.     Label5: TLabel;
  39.     Label6: TLabel;
  40.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  41.     procedure FormCreate(Sender: TObject);
  42.     procedure TrackBar1Change(Sender: TObject);
  43.     procedure Button6Click(Sender: TObject);
  44.     procedure TrackBar2Change(Sender: TObject);
  45.     procedure TmrNillAllTimer(Sender: TObject);
  46.     procedure Label19Click(Sender: TObject);
  47.     procedure Label26Click(Sender: TObject);
  48.   private
  49.     FCurrentUrlLocation: string;
  50.     FFontColorGroupbox4: TColor;
  51.     // destroy all used Com Objects
  52.     procedure NillAll;
  53.     // open URL
  54.     procedure OpenURL;
  55.     { All callback strings need to be copied before setting them to a Label
  56.        or any other external Object                                         }
  57.     function AsyncExFilterState(Buffering: LongBool; PreBuffering: LongBool;
  58.       Connecting: LongBool; Playing: LongBool;
  59.       BufferState: integer): HRESULT; stdcall;
  60.     function AsyncExICYNotice(IcyItemName: PChar;
  61.       ICYItem: PChar): HRESULT; stdcall;
  62.     function AsyncExMetaData(Title: PChar; URL: PChar): HRESULT; stdcall;
  63.     function AsyncExSockError(ErrString: PChar): HRESULT; stdcall;
  64.   end;
  65. const
  66.   ConnectCaption = 'connect';
  67.   DisConnectCaption = 'disconnect';
  68. var
  69.   Form1: TForm1;
  70.   GraphBuilder: IGraphBuilder = nil;
  71.   MediaControl: IMediaControl = nil;
  72.   AsyncEx: IBaseFilter = nil;
  73.   FileSource: IFilesourcefilter = nil;
  74.   AsyncExControl: IAsyncExControl = nil;
  75.   Mpeg1Splitter: IBaseFilter = nil;
  76.   Pin: IPin = nil;
  77. implementation
  78. {$R *.dfm}
  79. procedure TForm1.NillAll;
  80. begin
  81.   // MediaControl.Stop is required before destroying filters and interfaces
  82.   if Assigned(MediaControl) then
  83.     MediaControl.Stop;
  84.   if Assigned(AsyncExControl) then
  85.     AsyncExControl.FreeCallback;
  86.   Application.HandleMessage;
  87.   if Assigned(Pin) then
  88.     Pin := nil;
  89.   if Assigned(FileSource) then
  90.     FileSource := nil;
  91.   if Assigned(MediaControl) then
  92.     MediaControl := nil;
  93.   if Assigned(GraphBuilder) then
  94.     GraphBuilder := nil;
  95.   if Assigned(AsyncEx) then
  96.     AsyncEx := nil;
  97.   if Assigned(AsyncExControl) then
  98.     AsyncExControl := nil;
  99.   button6.Caption := ConnectCaption;
  100.   GroupBox4.Font.Color := FFontColorGroupbox4;
  101.   GroupBox4.Enabled := true;
  102.   RadioButton3.Enabled := true;
  103.   RadioButton4.Enabled := true;
  104. end;
  105. procedure TForm1.OpenURL();
  106. begin
  107.   NillAll;
  108.   button6.Caption := DisConnectCaption;
  109.   GroupBox4.Font.Color := clDkGray;
  110.   GroupBox4.Enabled := false;
  111.   RadioButton3.Enabled := false;
  112.   RadioButton4.Enabled := false;
  113.   CheckDSError(CoCreateInstance(TGUID(CLSID_FilterGraph), nil, CLSCTX_INPROC,
  114.     TGUID(IID_IGraphBuilder), GraphBuilder));
  115.   CheckDSError(GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl));
  116.   if failed(CoCreateInstance(CLSID_AsyncEx, nil, CLSCTX_INPROC,
  117.     IID_IBaseFilter, AsyncEx)) then
  118.   begin
  119.     showmessage('you need a registered AsyncEx filter to run this' +
  120.       ' example, location: DSPACKDemosD6-D7FiltersAsyncEx');
  121.     exit;
  122.   end;
  123.   CoCreateInstance(CLSID_Mpeg1Split, nil, CLSCTX_INPROC,
  124.     IID_IBaseFilter, Mpeg1Splitter);
  125.   CheckDSError(GraphBuilder.AddFilter(Mpeg1Splitter, 'MPEG1 Splitter'));
  126.   CheckDSError(AsyncEx.QueryInterface(IID_IAsyncExControl, AsyncExControl));
  127.   if assigned(AsyncExControl) then
  128.     if failed(AsyncExControl.SetCallBack(self)) then
  129.       exit;
  130.   if assigned(AsyncExControl) then
  131.   begin
  132.     if RadioButton3.Checked then
  133.       if failed(AsyncExControl.SetConnectToURL(
  134.         PChar(ComboBox1.Text), TrackBar1.Position * 1000, true)) then
  135.         exit;
  136.     if RadioButton4.Checked then
  137.       if failed(AsyncExControl.SetConnectToURL(
  138.         PChar(ComboBox1.Text), TrackBar1.Position * 1000, false)) then
  139.         exit;
  140.   end;
  141.   if assigned(AsyncExControl) then
  142.     if failed(AsyncExControl.SetBuffersize(
  143.       TrackBar2.Position * 1000)) then
  144.       exit;
  145.   if assigned(AsyncEx) then
  146.     if failed(AsyncEx.FindPin(pinID, Pin)) then
  147.       exit;
  148.   if assigned(GraphBuilder) then
  149.     if failed(GraphBuilder.AddFilter(AsyncEx,
  150.       StringToOleStr('DSPlayer AsyncSource'))) then
  151.       exit;
  152.   if assigned(GraphBuilder) then
  153.     if failed(GraphBuilder.Render(pin)) then
  154.       exit;
  155.   if assigned(MediaControl) then
  156.     if failed(MediaControl.Run) then
  157.       exit;
  158. end;
  159. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  160. begin
  161.   NillAll;
  162.   CoUninitialize;
  163. end;
  164. procedure TForm1.FormCreate(Sender: TObject);
  165. begin
  166.   GroupBox9.DoubleBuffered := true;
  167.   FCurrentUrlLocation := ComboBox1.Text;
  168.   FFontColorGroupbox4 := GroupBox4.Font.Color;
  169.   CoInitialize(nil);
  170.   Label18.Hint := Label18.Caption;
  171.   Label18.ShowHint := true;
  172.   Label19.Hint := Label19.Caption;
  173.   Label19.ShowHint := true;
  174.   Label19.Font.Color := clBlue;
  175.   Label19.Font.Style := [fsUnderline];
  176.   Label24.Hint := Label24.Caption;
  177.   Label24.ShowHint := true;
  178.   Label25.Hint := Label25.Caption;
  179.   Label25.ShowHint := true;
  180.   Label26.Hint := Label26.Caption;
  181.   Label26.ShowHint := true;
  182.   Label26.Font.Color := clBlue;
  183.   Label26.Font.Style := [fsUnderline];
  184.   Label8.Caption := inttostr(TrackBar1.Position) + ' kb';
  185.   Label3.Caption := inttostr(TrackBar2.Position) + ' kb';
  186. end;
  187. procedure TForm1.TrackBar1Change(Sender: TObject);
  188. begin
  189.   Label8.Caption := inttostr(TrackBar1.Position) + ' kb';
  190. end;
  191. procedure TForm1.Button6Click(Sender: TObject);
  192. begin
  193.   if Button6.Caption = ConnectCaption then
  194.   begin
  195.     if (FCurrentUrlLocation <> ComboBox1.Text) then
  196.       FCurrentUrlLocation := ComboBox1.Text;
  197.     OpenURL
  198.   end
  199.   else
  200.     NillAll;
  201. end;
  202. procedure TForm1.TrackBar2Change(Sender: TObject);
  203. begin
  204.   Label3.Caption := inttostr(TrackBar2.Position) + ' kb';
  205.   if assigned(AsyncExControl) then
  206.     AsyncExControl.SetBuffersize(TrackBar2.Position * 1000);
  207. end;
  208. procedure TForm1.TmrNillAllTimer(Sender: TObject);
  209. begin
  210.   NillAll;
  211.   TmrNillAll.Enabled := false;
  212. end;
  213. procedure TForm1.Label19Click(Sender: TObject);
  214. begin
  215.   if (Label19.Caption <> 'N/A') then
  216.     ShellExecute(0, 'open', PChar(Label19.Hint), nil, nil, SW_SHOWNORMAL);
  217. end;
  218. procedure TForm1.Label26Click(Sender: TObject);
  219. begin
  220.   if Label26.Caption <> 'N/A' then
  221.     ShellExecute(0, 'open', PChar(Label26.Hint), nil, nil, SW_SHOWNORMAL);
  222. end;
  223. // DSPlayer AsyncSource CallBack
  224. function TForm1.AsyncExFilterState(Buffering: LongBool; PreBuffering: LongBool;
  225.   Connecting: LongBool; Playing: LongBool;
  226.   BufferState: integer): HRESULT; stdcall;
  227. begin
  228.   if PreBuffering then
  229.     Label6.Caption := '( ' + inttostr(BufferState) + '% ) prebuffering....';
  230.   if Buffering then
  231.     Label6.Caption := '( ' + inttostr(BufferState) + '% ) buffering....';
  232.   if Connecting then
  233.     Label6.Caption := 'connecting....';
  234.   if Playing then
  235.     Label6.Caption := 'playing....';
  236.   if not Buffering and not PreBuffering and not Connecting and not Playing then
  237.   begin
  238.     Label6.Caption := 'N/A';
  239.     Label18.Caption := 'N/A';
  240.     Label19.Caption := 'N/A';
  241.   end;
  242.   Result := S_OK;
  243. end;
  244. function TForm1.AsyncExICYNotice(IcyItemName: PChar;
  245.   ICYItem: PChar): HRESULT; stdcall;
  246. const // ICY Item Names
  247.   ICYMetaInt = 'icy-metaint:';
  248.   ICYName = 'icy-name:';
  249.   ICYGenre = 'icy-genre:';
  250.   ICYURL = 'icy-url:';
  251.   ICYBitrate = 'icy-br:';
  252.   ICYError = 'icy-error:';
  253. begin
  254.   if IcyItemName = ICYError then
  255.   begin
  256.     showmessage(copy(ICYItem, 1, length(ICYItem)));
  257.     TmrNillAll.Enabled := true;
  258.   end;
  259.   if IcyItemName = ICYName then
  260.   begin
  261.     if length(ICYItem) > 39 then
  262.       Label24.Caption := copy(ICYItem, 1, 39) + '...'
  263.     else
  264.       Label24.Caption := copy(ICYItem, 1, length(ICYItem));
  265.     Label24.Hint := copy(ICYItem, 1, length(ICYItem));
  266.   end;
  267.   if (IcyItemName = ICYGenre) then
  268.   begin
  269.     if (length(ICYItem) > 39) then
  270.       Label25.Caption := copy(ICYItem, 1, 39) + '...'
  271.     else
  272.       Label25.Caption := copy(ICYItem, 1, length(ICYItem));
  273.     Label25.Hint := copy(ICYItem, 1, length(ICYItem));
  274.   end;
  275.   if (IcyItemName = ICYURL) then
  276.   begin
  277.     if (length(ICYItem) > 30) then
  278.       Label26.Caption := copy(ICYItem, 1, 30) + '...'
  279.     else
  280.       Label26.Caption := copy(ICYItem, 1, length(ICYItem));
  281.     Label26.Hint := copy(ICYItem, 1, length(ICYItem));
  282.   end;
  283.   if (IcyItemName = ICYBitrate) then
  284.     Label27.Caption := copy(ICYItem, 1, length(ICYItem));
  285.   Result := S_OK;
  286. end;
  287. function TForm1.AsyncExMetaData(Title: PChar; URL: PChar): HRESULT; stdcall;
  288. begin
  289.   if (length(Title) > 50) then
  290.     Label18.Caption := copy(Title, 1, 45) + '...'
  291.   else
  292.     Label18.Caption := copy(Title, 1, length(Title));
  293.   Label18.Hint := copy(Title, 1, length(Title));
  294.   if (length(URL) > 50) then
  295.     Label19.Caption := copy(URL, 1, 45) + '...'
  296.   else
  297.     Label19.Caption := copy(URL, 1, length(URL));
  298.   Label19.Hint := copy(URL, 1, length(URL));
  299.   Result := S_OK;
  300. end;
  301. function TForm1.AsyncExSockError(ErrString: PChar): HRESULT; stdcall;
  302. begin
  303.   showmessage('can not connect to URL'#13#10#13#10 +
  304.     'Reason:'#13#10 + copy(ErrString, 1, length(ErrString)));
  305.   TmrNillAll.Enabled := true;
  306.   Result := S_OK;
  307. end;
  308. end.