\r
Control playerWindow;\r
private PlayerGraph graph;\r
- public PlayerGraph Graph { get; set; }\r
+ public PlayerGraph Graph { get => graph; set => graph = value; }\r
private readonly DxPlaySettings settings;\r
\r
// Play an avi file into a window. Allow for snapshots.\r
\r
// Get the event handle the graph will use to signal\r
// when events occur\r
- logger.Debug("GetEventHandle");\r
+ //logger.Debug("GetEventHandle");\r
hr = graph.MediaEvent.GetEventHandle(out IntPtr hEvent);\r
DsError.ThrowExceptionForHR(hr);\r
\r
tcWorker.RunWorkerAsync(tcLock);\r
\r
} catch (Exception e) {\r
- logger.Error(e);\r
+ logger.Error(e.StackTrace);\r
Dispose();\r
throw;\r
}\r
\r
private void TcWorker_DoWork(object sender, DoWorkEventArgs e) {\r
while (!e.Cancel) {\r
- UpdateTC();\r
+ UpdateTimeCode();\r
Thread.Sleep(10);\r
\r
if (SeekTo > -1) {\r
logger.Debug("Seeking requested frame {0} got frame {1}, media position {2}, frame length {3}, corrected {4}", value, reachedFrames, requestedPosition, avgTimePerFrame, corrected);\r
}\r
\r
- private void UpdateTC() {\r
- if (graph == null || graph.MediaSeeking == null)\r
+ private void UpdateTimeCode() {\r
+ if (graph == null)\r
+ {\r
return;\r
- int hr = graph.MediaSeeking.GetCurrentPosition(out long currentPosition);\r
- DsError.ThrowExceptionForHR(hr);\r
- int frames = ReferenceTimeToFrames(currentPosition);\r
- if (CurrentTC.ZeroBasedFrames != frames) {\r
- CurrentTC.Set(frames);\r
- //logger.Debug("Current frame is {0} ({1}), media position is {2}, AVG frame time is {3}", frames, CurrentTC.ToString(), currentPosition, AvgTimePerFrame);\r
}\r
- PlayEvent?.Invoke();\r
+ else\r
+ {\r
+ if (graph.MediaSeeking == null)\r
+ {\r
+ return;\r
+ }\r
+ else\r
+ {\r
+ try\r
+ {\r
+ int hr = graph.MediaSeeking.GetCurrentPosition(out long currentPosition);\r
+ DsError.ThrowExceptionForHR(hr);\r
+ int frames = ReferenceTimeToFrames(currentPosition);\r
+ if (CurrentTC.ZeroBasedFrames != frames)\r
+ {\r
+ CurrentTC.Set(frames);\r
+ //logger.Debug("Current frame is {0} ({1}), media position is {2}, AVG frame time is {3}", frames, CurrentTC.ToString(), currentPosition, AvgTimePerFrame);\r
+ }\r
+ PlayEvent?.Invoke();\r
+ } catch(Exception e)\r
+ {\r
+ logger.Debug("e.StackTrace: "+e.StackTrace);\r
+ }\r
+ }\r
+ }\r
}\r
\r
private int ReferenceTimeToFrames(long refTime) {\r
\r
// Shut down capture\r
public void Dispose() {\r
- lock (this) {\r
+ lock (this)\r
+ {\r
if (isDisposed)\r
+ {\r
return;\r
- logger.Debug("Dispose");\r
- if (tcWorker != null) { \r
- tcWorker.CancelAsync();\r
}\r
+ else\r
+ {\r
+ logger.Debug("Dispose");\r
+ if (tcWorker != null) {\r
+ tcWorker.CancelAsync();\r
+ }\r
\r
- GC.SuppressFinalize(this);\r
- if (State != GraphState.Exiting) {\r
- SetState(State = GraphState.Exiting);\r
- // Release the thread (if the thread was started)\r
- if (m_mre != null) {\r
- m_mre.Set();\r
+ GC.SuppressFinalize(this);\r
+ if (State != GraphState.Exiting) {\r
+ SetState(State = GraphState.Exiting);\r
+ // Release the thread (if the thread was started)\r
+ if (m_mre != null) {\r
+ m_mre.Set();\r
+ }\r
}\r
- }\r
\r
- if (graph != null) {\r
- graph.Dispose();\r
- graph = null;\r
+ if (graph != null)\r
+ {\r
+ graph.Dispose();\r
+ graph = null;\r
+ }\r
}\r
}\r
GC.Collect();\r
hr = graph.MediaEvent.GetEvent(out ec, out p1, out p2, 0)\r
) {\r
// Write the event name to the debug window\r
- logger.Debug("EVENT:" + ec.ToString());\r
+ //logger.Debug("EVENT:" + ec.ToString());\r
\r
// If the clip is finished playing\r
if (ec == EventCode.Complete) {\r
DsError.ThrowExceptionForHR(hr);\r
\r
//lock (tcLock) {\r
- // UpdateTC("");\r
+ // UpdateTimeCode("");\r
//}\r
\r
}\r
\r
public void SetPlaySpeed(float value)\r
{\r
- Graph.MediaSeeking.SetRate(value);\r
+ if (Graph != null && Graph.MediaSeeking != null)\r
+ {\r
+ Graph.MediaSeeking.SetRate(value);\r
+ }\r
}\r
}\r
}\r