From fe6f2c2ec847b87ba14ec0f9799d788645d48e73 Mon Sep 17 00:00:00 2001 From: tzim Date: Wed, 3 Dec 2014 16:36:52 +0000 Subject: [PATCH] --- DMX-2.0/Conduite.cs | 8 ++- DMX-2.0/SeqSonUI.cs | 11 +++- DMX-2.0/SequenceurSon.cs | 128 +++++++++++++++++++++++++-------------- 3 files changed, 98 insertions(+), 49 deletions(-) diff --git a/DMX-2.0/Conduite.cs b/DMX-2.0/Conduite.cs index 88b4fb2..953a8a6 100644 --- a/DMX-2.0/Conduite.cs +++ b/DMX-2.0/Conduite.cs @@ -362,8 +362,12 @@ namespace DMX2 courante = null; if (tickThread != null) { running = false; - tickThread.Join(50); - tickThread.Abort(); + tickThread.Join (50); + tickThread.Abort (); + } + foreach (var seq in sequenceurs) { + IDisposable idis = seq as IDisposable; + if(idis!=null) idis.Dispose(); } foreach(var driver in Drivers) driver.Dispose(); diff --git a/DMX-2.0/SeqSonUI.cs b/DMX-2.0/SeqSonUI.cs index 95f86f8..323b7ac 100644 --- a/DMX-2.0/SeqSonUI.cs +++ b/DMX-2.0/SeqSonUI.cs @@ -33,6 +33,7 @@ namespace DMX2 SequenceurSon sequenceur; public bool updateflag=true; + bool updating=false; bool ff=false; bool rw=false; @@ -122,11 +123,11 @@ namespace DMX2 #region implemented abstract members of DMX2.SequenceurUI public override void Update (bool full) { + updating=true; if (full||updateflag ) { - listFiles.QueueDraw(); - SelectionneLigne(); UpdListFiles(); - +// listFiles.QueueDraw(); + SelectionneLigne(); } updateflag=false; sclVolume.Value = sequenceur.Volume; @@ -138,7 +139,10 @@ namespace DMX2 if (rw) sequenceur.PlayTime += TimeSpan.FromSeconds(-1); timeLabel.LabelProp = string.Format ("elap.{0:mm\\:ss\\.fff}\nrem. {1:mm\\:ss\\.fff}",cur,dur-cur); + titleLabel.LabelProp = sequenceur.State; + pbCur.Fraction = (dur == TimeSpan.Zero)?0:(cur.TotalMilliseconds/dur.TotalMilliseconds); + updating=false; } int IndexSelection() @@ -254,6 +258,7 @@ namespace DMX2 protected void OnListFilesCursorChanged (object sender, EventArgs e) { + if(updating)return; TreeViewColumn col; TreePath path; listFiles.GetCursor (out path, out col); diff --git a/DMX-2.0/SequenceurSon.cs b/DMX-2.0/SequenceurSon.cs index 65a5c21..15518fb 100644 --- a/DMX-2.0/SequenceurSon.cs +++ b/DMX-2.0/SequenceurSon.cs @@ -26,16 +26,8 @@ using System.Xml; namespace DMX2 { - // TODO : Sauvegarde et chargement - - public class SequenceurSon : Sequenceur + public class SequenceurSon : Sequenceur, IDisposable { - ~SequenceurSon() - { - if(element!=null) - Stop(); - element=null; - } SeqSonUI ui=null; @@ -57,7 +49,11 @@ namespace DMX2 int fadeVStart; int fadeVEnd; + TimeSpan duration = TimeSpan.Zero; + Gst.Element element = null; + Gst.State state,pending; + Gst.StateChangeReturn scret; public ReadOnlyCollection Files { get { @@ -107,28 +103,23 @@ namespace DMX2 } set{ if(element==null) return; - if(element.CurrentState != Gst.State.Paused && element.CurrentState != Gst.State.Playing){ - taskQueue.Enqueue(delegate(){ - PlayTime = value; - }); - return; - } - long pos = (long)(value.TotalMilliseconds) * 1000000; - element.Seek (Gst.Format.Time,Gst.SeekFlags.Flush|Gst.SeekFlags.Accurate,pos); + QueueTask(delegate(){ + //Console.WriteLine("Seek"); + long pos = (long)(value.TotalMilliseconds) * 1000000; + element.Seek (Gst.Format.Time,Gst.SeekFlags.Flush|Gst.SeekFlags.Accurate,pos); + }); } } - TimeSpan duration = TimeSpan.Zero; - public TimeSpan Duration { get { if(element==null) return TimeSpan.Zero; - //if(duration == TimeSpan.Zero) { - Gst.Format format = Gst.Format.Time ; - long dur; - element.QueryDuration(ref format, out dur); - duration = TimeSpan.FromMilliseconds(dur/1000000); - //} + if(duration == TimeSpan.Zero) + { + Gst.Format fmt = Gst.Format.Time; long dur; + element.QueryDuration(ref fmt,out dur); + return TimeSpan.FromMilliseconds(dur/1000000); + } return duration; } } @@ -141,10 +132,10 @@ namespace DMX2 } } - - void LoadFile (int pos) { + //Console.WriteLine("LoadFile"); + curfile = files[pos]; Stop(); @@ -161,20 +152,18 @@ namespace DMX2 public void Play () { if(element == null)return; - if(element.CurrentState != Gst.State.Paused && element.CurrentState != Gst.State.Playing){ - taskQueue.Enqueue(delegate(){ - Play(); - }); - return; - } - - element.SetState(Gst.State.Playing); + QueueTask(delegate(){ + //Console.WriteLine("Play"); + element.SetState(Gst.State.Playing); + }); } public void Pause () { if(element == null)return; - element.SetState(Gst.State.Paused); + QueueTask(delegate(){ + element.SetState(Gst.State.Paused); + }); } public void Stop () @@ -221,15 +210,54 @@ namespace DMX2 return 0; } + public string State { + get { + if(element == null) return "Stopped"; + UpdateState(); + if(pending == Gst.State.VoidPending){ + return state.ToString(); + } + if(scret == Gst.StateChangeReturn.Async) + return string.Format("{0}=>{1}", state,pending); + return string.Format("{0}=>{1} : {2}",state,pending,scret); + } + } + + void UpdateState () + { + scret = element.GetState (out state, out pending, 0UL); + } + + bool CheckAsync () + { + if (element == null) return false; + UpdateState (); + return (scret != Gst.StateChangeReturn.Async); + } + + void QueueTask (Task t) + { + if (CheckAsync ()) { + //Console.WriteLine("Sync"); + t(); + return; + } + //Console.WriteLine("Queue"); + taskQueue.Enqueue(t); + } + public override void Tick (TimeSpan time) { - if (element != null && taskQueue.Count>0) { - if (element.CurrentState == Gst.State.Paused || element.CurrentState == Gst.State.Playing) - { - Task t; - if(taskQueue.TryDequeue(out t)) t(); + if (taskQueue.Count>0 && CheckAsync()){ + //Console.WriteLine(State); + Task task; + if(taskQueue.TryDequeue(out task)) + { + //Console.WriteLine("ASync"); + task(); } } + if (fading != TimeSpan.Zero) { fading-=time; if(fading<=TimeSpan.Zero){ @@ -294,6 +322,7 @@ namespace DMX2 public override void Command (string command) { + //Console.WriteLine("Command"); lock (this) { var cmd = regexCommand1.Match (command); @@ -330,9 +359,10 @@ namespace DMX2 fadeVEnd = (int)vol; } else{ - Volume = vol; - if (ui != null) - ui.updateflag = true; + fading = TimeSpan.Zero; + Volume = vol; + if (ui != null) + ui.updateflag = true; } } @@ -423,6 +453,16 @@ namespace DMX2 } #endregion + #region IDisposable implementation + void IDisposable.Dispose () + { + if(element==null)return; + element.SetState(Gst.State.Null); + element.Dispose(); + element=null; + } + #endregion + } }