From: sr55 <sr55.hb@outlook.com>
Date: Sat, 15 Apr 2017 11:26:59 +0000 (+0100)
Subject: WinGui: Handle HB_STATE_MUXING and HB_STATE_SEARCHING for better progress indication... 
X-Git-Tag: 1.1.0~588
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=52d4c21b22cfc91b63a680aa7e475cc0ca6012cb;p=handbrake

WinGui: Handle HB_STATE_MUXING and HB_STATE_SEARCHING for better progress indication in the UI. #676
---

diff --git a/win/CS/HandBrake.ApplicationServices/Interop/EventArgs/EncodeProgressEventArgs.cs b/win/CS/HandBrake.ApplicationServices/Interop/EventArgs/EncodeProgressEventArgs.cs
index 5fad3248c..0da2fd178 100644
--- a/win/CS/HandBrake.ApplicationServices/Interop/EventArgs/EncodeProgressEventArgs.cs
+++ b/win/CS/HandBrake.ApplicationServices/Interop/EventArgs/EncodeProgressEventArgs.cs
@@ -40,7 +40,13 @@ namespace HandBrake.ApplicationServices.Interop.EventArgs
         /// <param name="passCount">
         /// The pass count.
         /// </param>
-        public EncodeProgressEventArgs(double fractionComplete, double currentFrameRate, double averageFrameRate, TimeSpan estimatedTimeLeft, int passId, int pass, int passCount)
+        /// <param name="isMuxing">
+        /// A flag to indicate we are muxing.
+        /// </param>
+        /// <param name="isSearching">
+        /// Gets a value indicating that we are in the searching process.
+        /// </param>
+        public EncodeProgressEventArgs(double fractionComplete, double currentFrameRate, double averageFrameRate, TimeSpan estimatedTimeLeft, int passId, int pass, int passCount, bool isMuxing, bool isSearching)
         {
             this.FractionComplete = fractionComplete;
             this.CurrentFrameRate = currentFrameRate;
@@ -49,6 +55,8 @@ namespace HandBrake.ApplicationServices.Interop.EventArgs
             this.PassId = passId;
             this.Pass = pass;
             this.PassCount = passCount;
+            this.IsMuxing = isMuxing;
+            this.IsSearching = isSearching;
         }
 
         /// <summary>
@@ -91,5 +99,31 @@ namespace HandBrake.ApplicationServices.Interop.EventArgs
         /// Gets the pass count.
         /// </summary>
         public int PassCount { get; private set; }
+
+        /// <summary>
+        /// Gets a value indicating that we are in the muxing process.
+        /// </summary>
+        public bool IsMuxing { get; private set; }
+
+        /// <summary>
+        /// Gets a value indicating that we are in the searching process.
+        /// </summary>
+        public bool IsSearching { get; }
+
+        /// <summary>
+        /// Gets a value indicating that we are doing a subtitle scan pass.
+        /// </summary>
+        public bool IsSubtitleScan
+        {
+            get
+            {
+                if (this.PassId == -1)
+                {
+                    return true;
+                }
+
+                return false;
+            }
+        }
     }
 }
diff --git a/win/CS/HandBrake.ApplicationServices/Interop/HandBrakeInstance.cs b/win/CS/HandBrake.ApplicationServices/Interop/HandBrakeInstance.cs
index de0f0b2bc..861a5edaf 100644
--- a/win/CS/HandBrake.ApplicationServices/Interop/HandBrakeInstance.cs
+++ b/win/CS/HandBrake.ApplicationServices/Interop/HandBrakeInstance.cs
@@ -492,7 +492,7 @@ namespace HandBrake.ApplicationServices.Interop
             this.log.LogMessage(statusJson, LogMessageType.Progress, LogLevel.Trace);
             JsonState state = JsonConvert.DeserializeObject<JsonState>(statusJson);
 
-            if (state != null && state.State == NativeConstants.HB_STATE_SCANNING)
+            if (state != null && (state.State == NativeConstants.HB_STATE_SCANNING || state.State == NativeConstants.HB_STATE_SEARCHING))
             {
                 if (this.ScanProgress != null)
                 {
@@ -529,12 +529,12 @@ namespace HandBrake.ApplicationServices.Interop
 
             JsonState state = JsonConvert.DeserializeObject<JsonState>(statusJson);
 
-            if (state != null && state.State == NativeConstants.HB_STATE_WORKING)
+            if (state != null && (state.State == NativeConstants.HB_STATE_WORKING || state.State == NativeConstants.HB_STATE_MUXING || state.State == NativeConstants.HB_STATE_SEARCHING))
             {
                 if (this.EncodeProgress != null)
                 {
                     var progressEventArgs = new EncodeProgressEventArgs(state.Working.Progress, state.Working.Rate, state.Working.RateAvg, new TimeSpan(state.Working.Hours, state.Working.Minutes, state.Working.Seconds),
-                        state.Working.PassID, state.Working.Pass, state.Working.PassCount);
+                        state.Working.PassID, state.Working.Pass, state.Working.PassCount, state.State == NativeConstants.HB_STATE_MUXING, state.State == NativeConstants.HB_STATE_SEARCHING);
 
                     this.EncodeProgress(this, progressEventArgs);
                 }
diff --git a/win/CS/HandBrake.ApplicationServices/Interop/HbLib/NativeConstants.cs b/win/CS/HandBrake.ApplicationServices/Interop/HbLib/NativeConstants.cs
index bc593539f..9f4615bbf 100644
--- a/win/CS/HandBrake.ApplicationServices/Interop/HbLib/NativeConstants.cs
+++ b/win/CS/HandBrake.ApplicationServices/Interop/HbLib/NativeConstants.cs
@@ -59,6 +59,7 @@ namespace HandBrake.ApplicationServices.Interop.HbLib
         public const int HB_STATE_PAUSED = 16;
         public const int HB_STATE_WORKDONE = 32;
         public const int HB_STATE_MUXING = 64;
+        public const int HB_STATE_SEARCHING = 128;
 
         // Keep aspect ratio values
         public const int HB_KEEP_WIDTH = 0x01;
diff --git a/win/CS/HandBrakeWPF/Properties/ResourcesUI.Designer.cs b/win/CS/HandBrakeWPF/Properties/ResourcesUI.Designer.cs
index 0fee65fc9..c04e4e97e 100644
--- a/win/CS/HandBrakeWPF/Properties/ResourcesUI.Designer.cs
+++ b/win/CS/HandBrakeWPF/Properties/ResourcesUI.Designer.cs
@@ -753,6 +753,15 @@ namespace HandBrakeWPF.Properties {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Muxing: This may take a while....
+        /// </summary>
+        public static string MainView_Muxing {
+            get {
+                return ResourceManager.GetString("MainView_Muxing", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Options.
         /// </summary>
@@ -816,6 +825,15 @@ namespace HandBrakeWPF.Properties {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Encoding: {0}, {1:00.00}%, Time Remaining: {2}, {3}.
+        /// </summary>
+        public static string MainView_ProgressStatusWithTask {
+            get {
+                return ResourceManager.GetString("MainView_ProgressStatusWithTask", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Remove.
         /// </summary>
@@ -834,6 +852,15 @@ namespace HandBrakeWPF.Properties {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Searching for start time.
+        /// </summary>
+        public static string MainView_Searching {
+            get {
+                return ResourceManager.GetString("MainView_Searching", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Set Default.
         /// </summary>
diff --git a/win/CS/HandBrakeWPF/Properties/ResourcesUI.resx b/win/CS/HandBrakeWPF/Properties/ResourcesUI.resx
index f6c92ea61..50a0c4bbd 100644
--- a/win/CS/HandBrakeWPF/Properties/ResourcesUI.resx
+++ b/win/CS/HandBrakeWPF/Properties/ResourcesUI.resx
@@ -899,4 +899,13 @@ This will not affect your current settings in the Subtitle tab.</value>
   <data name="OptionsView_PlaySoundWhenDone" xml:space="preserve">
     <value>Play a sound when the queue or single encode completes:</value>
   </data>
+  <data name="MainView_Muxing" xml:space="preserve">
+    <value>Muxing: This may take a while...</value>
+  </data>
+  <data name="MainView_ProgressStatusWithTask" xml:space="preserve">
+    <value>Encoding: {0}, {1:00.00}%, Time Remaining: {2}, {3}</value>
+  </data>
+  <data name="MainView_Searching" xml:space="preserve">
+    <value>Searching for start time</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/Services/Encode/EventArgs/EncodeProgressEventArgs.cs b/win/CS/HandBrakeWPF/Services/Encode/EventArgs/EncodeProgressEventArgs.cs
index 940be6568..784245af6 100644
--- a/win/CS/HandBrakeWPF/Services/Encode/EventArgs/EncodeProgressEventArgs.cs
+++ b/win/CS/HandBrakeWPF/Services/Encode/EventArgs/EncodeProgressEventArgs.cs
@@ -10,54 +10,45 @@
 namespace HandBrakeWPF.Services.Encode.EventArgs
 {
     using System;
-    using System.Runtime.Serialization;
 
     /// <summary>
     /// Encode Progress Event Args
     /// </summary>
-    [DataContract]
     public class EncodeProgressEventArgs : EventArgs
     {
         /// <summary>
         /// Gets or sets PercentComplete.
         /// </summary>
-        [DataMember]
         public double PercentComplete { get; set; }
 
         /// <summary>
         /// Gets or sets CurrentFrameRate.
         /// </summary>
-        [DataMember]
         public double CurrentFrameRate { get; set; }
 
         /// <summary>
         /// Gets or sets AverageFrameRate.
         /// </summary>
-        [DataMember]
         public double AverageFrameRate { get; set; }
 
         /// <summary>
         /// Gets or sets EstimatedTimeLeft.
         /// </summary>
-        [DataMember]
         public TimeSpan EstimatedTimeLeft { get; set; }
 
         /// <summary>
         /// Gets or sets Task.
         /// </summary>
-        [DataMember]
         public int Task { get; set; }
 
         /// <summary>
         /// Gets or sets TaskCount.
         /// </summary>
-        [DataMember]
         public int TaskCount { get; set; }
 
         /// <summary>
         /// Gets or sets ElapsedTime.
         /// </summary>
-        [DataMember]
         public TimeSpan ElapsedTime { get; set; }
 
         /// <summary>
@@ -70,5 +61,31 @@ namespace HandBrakeWPF.Services.Encode.EventArgs
         ///  2: Encode second pass
         /// </remarks>
         public int PassId { get; set; }
+
+        /// <summary>
+        /// Gets a value indicating that we are in the muxing process.
+        /// </summary>
+        public bool IsMuxing { get; set; }
+
+        /// <summary>
+        /// Gets a value indicating that we are in the searching process.
+        /// </summary>
+        public bool IsSearching { get; set; }
+
+        /// <summary>
+        /// Gets a value indicating that we are doing a subtitle scan pass.
+        /// </summary>
+        public bool IsSubtitleScan
+        {
+            get
+            {
+                if (this.PassId == -1)
+                {
+                    return true;
+                }
+
+                return false;
+            }
+        }
     }
 }
diff --git a/win/CS/HandBrakeWPF/Services/Encode/LibEncode.cs b/win/CS/HandBrakeWPF/Services/Encode/LibEncode.cs
index 03763d448..2ad5f0688 100644
--- a/win/CS/HandBrakeWPF/Services/Encode/LibEncode.cs
+++ b/win/CS/HandBrakeWPF/Services/Encode/LibEncode.cs
@@ -180,7 +180,9 @@ namespace HandBrakeWPF.Services.Encode
                 Task = e.Pass, 
                 TaskCount = e.PassCount,
                 ElapsedTime = DateTime.Now - this.startTime, 
-                PassId = e.PassId
+                PassId = e.PassId,
+                IsMuxing = e.IsMuxing,
+                IsSearching = e.IsSearching
             };
 
             this.InvokeEncodeStatusChanged(args);
diff --git a/win/CS/HandBrakeWPF/Services/Scan/EventArgs/ScanProgressEventArgs.cs b/win/CS/HandBrakeWPF/Services/Scan/EventArgs/ScanProgressEventArgs.cs
index 8d815b746..113f7a923 100644
--- a/win/CS/HandBrakeWPF/Services/Scan/EventArgs/ScanProgressEventArgs.cs
+++ b/win/CS/HandBrakeWPF/Services/Scan/EventArgs/ScanProgressEventArgs.cs
@@ -10,30 +10,25 @@
 namespace HandBrakeWPF.Services.Scan.EventArgs
 {
     using System;
-    using System.Runtime.Serialization;
 
     /// <summary>
     /// Scan Progress Event Args
     /// </summary>
-    [DataContract]
     public class ScanProgressEventArgs : EventArgs
     {
         /// <summary>
         /// Gets or sets the title currently being scanned.
         /// </summary>
-        [DataMember]
         public int CurrentTitle { get; set; }
 
         /// <summary>
         /// Gets or sets the total number of Titles.
         /// </summary>
-        [DataMember]
         public int Titles { get; set; }
 
         /// <summary>
         /// Gets or sets the percentage.
         /// </summary>
-        [DataMember]
         public decimal Percentage { get; set; }
     }
 }
diff --git a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs
index 283111b11..9bb991efc 100644
--- a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs
+++ b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs
@@ -2420,7 +2420,7 @@ namespace HandBrakeWPF.ViewModels
                     if (this.queueProcessor.EncodeService.IsEncoding)
                     {
                         string jobsPending = string.Format(Resources.Main_JobsPending_addon, this.queueProcessor.Count);
-                        if (e.PassId == -1)
+                        if (e.IsSubtitleScan)
                         {
                             this.ProgramStatusLabel = string.Format(Resources.MainViewModel_EncodeStatusChanged_SubScan_StatusLabel,
                                 e.Task,
@@ -2430,6 +2430,14 @@ namespace HandBrakeWPF.ViewModels
                                 e.ElapsedTime,
                                 jobsPending);
                         }
+                        else if (e.IsMuxing)
+                        {
+                            this.ProgramStatusLabel = ResourcesUI.MainView_Muxing;
+                        }
+                        else if (e.IsSearching)
+                        {
+                            this.ProgramStatusLabel = string.Format(ResourcesUI.MainView_ProgressStatusWithTask, ResourcesUI.MainView_Searching, e.PercentComplete, e.EstimatedTimeLeft, jobsPending);
+                        }
                         else
                         {
                             this.ProgramStatusLabel =
diff --git a/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs
index c5351d729..2267c1a44 100644
--- a/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs
+++ b/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs
@@ -519,16 +519,38 @@ namespace HandBrakeWPF.ViewModels
         {
             Execute.OnUIThread(() =>
             {
-                this.JobStatus =
-                    string.Format(
-                        Resources.QueueViewModel_QueueStatusDisplay, 
-                        e.Task, 
-                        e.TaskCount, 
-                        e.PercentComplete, 
-                        e.CurrentFrameRate, 
-                        e.AverageFrameRate, 
-                        e.EstimatedTimeLeft, 
-                        e.ElapsedTime);
+                string jobsPending = string.Format(Resources.Main_JobsPending_addon, this.queueProcessor.Count);
+                if (e.IsSubtitleScan)
+                {
+                    this.JobStatus = string.Format(Resources.MainViewModel_EncodeStatusChanged_SubScan_StatusLabel,
+                        e.Task,
+                        e.TaskCount,
+                        e.PercentComplete,
+                        e.EstimatedTimeLeft,
+                        e.ElapsedTime,
+                        jobsPending);
+                }
+                else if (e.IsMuxing)
+                {
+                    this.JobStatus = ResourcesUI.MainView_Muxing;
+                }
+                else if (e.IsSearching)
+                {
+                    this.JobStatus = string.Format(ResourcesUI.MainView_ProgressStatusWithTask, ResourcesUI.MainView_Searching, e.PercentComplete, e.EstimatedTimeLeft, jobsPending);
+                }
+                else
+                {
+                    this.JobStatus =
+                        string.Format(Resources.MainViewModel_EncodeStatusChanged_StatusLabel,
+                            e.Task,
+                            e.TaskCount,
+                            e.PercentComplete,
+                            e.CurrentFrameRate,
+                            e.AverageFrameRate,
+                            e.EstimatedTimeLeft,
+                            e.ElapsedTime,
+                            jobsPending);
+                }
             });
         }