From 5f86f14e53b9f107ce030e6cb61efba9f5fc6a4b Mon Sep 17 00:00:00 2001 From: brunzelchen Date: Sun, 2 Jan 2011 20:33:36 +0000 Subject: - fix: crash at startup if no webcam connected - some string updates git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/branches/1.0.1 Challenge MOD@2786 b956fd51-792f-4845-bead-9b4dfca2ff2c --- Game/Code/lib/DSPack/UCaptureWDM.pas | 88 ++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 29 deletions(-) (limited to 'Game/Code/lib') diff --git a/Game/Code/lib/DSPack/UCaptureWDM.pas b/Game/Code/lib/DSPack/UCaptureWDM.pas index c483e58a..10596d54 100644 --- a/Game/Code/lib/DSPack/UCaptureWDM.pas +++ b/Game/Code/lib/DSPack/UCaptureWDM.pas @@ -66,7 +66,7 @@ type procedure Stop; end; - function ListMediaTypes(DeviceID: integer): TList; + procedure ListMediaTypes(DeviceID: integer; var types: TList); procedure GetCapDevices(var names: TList); implementation @@ -98,7 +98,7 @@ begin end; end; -function ListMediaTypes(DeviceID: integer): TList; +procedure ListMediaTypes(DeviceID: integer; var types: TList); var PinList: TPinList; tSysDev: TSysDevEnum; @@ -108,40 +108,70 @@ var k: Integer; begin - SetLength(Result, 0); + SetLength(types, 0); - tSysDev := TSysDevEnum.Create(CLSID_VideoInputDeviceCategory); + try + tSysDev := TSysDevEnum.Create(CLSID_VideoInputDeviceCategory); - FilterGraph := TFilterGraph.Create( nil ); - FilterGraph.Mode := gmCapture; - FilterGraph.Active := False; - FilterGraph.AutoCreate := False; - FilterGraph.GraphEdit := True; + FilterGraph := TFilterGraph.Create( nil ); + FilterGraph.Mode := gmCapture; + FilterGraph.Active := False; + FilterGraph.AutoCreate := False; + FilterGraph.GraphEdit := True; - Filter := TFilter.Create( nil ); - Filter.FilterGraph := FilterGraph; + Filter := TFilter.Create( nil ); + Filter.FilterGraph := FilterGraph; - Filter.BaseFilter.Moniker := tSysDev.GetMoniker(DeviceID); - Filter.FilterGraph.Active := true; - PinList := TPinList.Create(Filter as IBaseFilter); - VideoMediaTypes := TEnumMediaType.Create(PinList.First); + Filter.BaseFilter.Moniker := tSysDev.GetMoniker(DeviceID); + Filter.FilterGraph.Active := true; + PinList := TPinList.Create(Filter as IBaseFilter); + VideoMediaTypes := TEnumMediaType.Create(PinList.First); - SetLength(Result, VideoMediaTypes.Count); - for k := 0 to VideoMediaTypes.Count - 1 do - begin - Result[k] := VideoMediaTypes.MediaFormatDescription[k]; - //writeln(Result[k]); - //writeln(VideoMediaTypes.MediaFormatDescription[k]); + SetLength(types, VideoMediaTypes.Count); + for k := 0 to VideoMediaTypes.Count - 1 do + begin + types[k] := VideoMediaTypes.MediaFormatDescription[k]; + //writeln(Result[k]); + //writeln(VideoMediaTypes.MediaFormatDescription[k]); + end; + except + SetLength(types, 0); end; - PinList.Free; - VideoMediaTypes.Free; - FilterGraph.Stop; - FilterGraph.ClearGraph; - FilterGraph.Active := False; - FilterGraph.Free; - Filter.Free; - tSysDev.Free; + try + if (PinList<>nil) then + PinList.Free; + except + end; + + try + if (VideoMediaTypes<>nil) then + VideoMediaTypes.Free; + except + end; + + try + if (FilterGraph<>nil) then + begin + FilterGraph.Stop; + FilterGraph.ClearGraph; + FilterGraph.Active := False; + FilterGraph.Free; + end; + except + end; + + try + if (Filter<>nil) then + Filter.Free; + except + end; + + try + if (tSysDev<>nil) then + tSysDev.Free; + except + end; end; constructor TSampleClass.Create(DeviceID, MediaTypeID: integer); -- cgit v1.2.3