git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorSweidan Omar <TFS\sweidan.omar>
Mon, 17 Jan 2022 12:48:31 +0000 (12:48 +0000)
committerSweidan Omar <TFS\sweidan.omar>
Mon, 17 Jan 2022 12:48:31 +0000 (12:48 +0000)
client/DxPlay/DxPlayer.cs

index 5e25cde6ca8fedead118c1898bfe798f6d907f75..142f47a688d31abb9aa893f6c05f6025e70c9d50 100644 (file)
@@ -74,7 +74,7 @@ namespace DxPlay {
 \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
@@ -100,7 +100,7 @@ namespace DxPlay {
 \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
@@ -121,7 +121,7 @@ namespace DxPlay {
                 tcWorker.RunWorkerAsync(tcLock);\r
 \r
             } catch (Exception e) {\r
-                logger.Error(e);\r
+                logger.Error(e.StackTrace);\r
                 Dispose();\r
                 throw;\r
             }\r
@@ -157,7 +157,7 @@ namespace DxPlay {
 \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
@@ -263,17 +263,36 @@ namespace DxPlay {
             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
@@ -427,26 +446,33 @@ namespace DxPlay {
 \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
@@ -526,7 +552,7 @@ namespace DxPlay {
                             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
@@ -538,7 +564,7 @@ namespace DxPlay {
                             DsError.ThrowExceptionForHR(hr);\r
 \r
                             //lock (tcLock) {\r
-                            //    UpdateTC("");\r
+                            //    UpdateTimeCode("");\r
                             //}\r
 \r
                         }\r
@@ -558,7 +584,10 @@ namespace DxPlay {
 \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