This commit is contained in:
tzim 2014-12-03 16:36:52 +00:00
parent 0792524222
commit fe6f2c2ec8
3 changed files with 98 additions and 49 deletions

View file

@ -365,6 +365,10 @@ namespace DMX2
tickThread.Join (50); tickThread.Join (50);
tickThread.Abort (); tickThread.Abort ();
} }
foreach (var seq in sequenceurs) {
IDisposable idis = seq as IDisposable;
if(idis!=null) idis.Dispose();
}
foreach(var driver in Drivers) foreach(var driver in Drivers)
driver.Dispose(); driver.Dispose();
tickThread=null; tickThread=null;

View file

@ -33,6 +33,7 @@ namespace DMX2
SequenceurSon sequenceur; SequenceurSon sequenceur;
public bool updateflag=true; public bool updateflag=true;
bool updating=false;
bool ff=false; bool ff=false;
bool rw=false; bool rw=false;
@ -122,11 +123,11 @@ namespace DMX2
#region implemented abstract members of DMX2.SequenceurUI #region implemented abstract members of DMX2.SequenceurUI
public override void Update (bool full) public override void Update (bool full)
{ {
updating=true;
if (full||updateflag ) { if (full||updateflag ) {
listFiles.QueueDraw();
SelectionneLigne();
UpdListFiles(); UpdListFiles();
// listFiles.QueueDraw();
SelectionneLigne();
} }
updateflag=false; updateflag=false;
sclVolume.Value = sequenceur.Volume; sclVolume.Value = sequenceur.Volume;
@ -138,7 +139,10 @@ namespace DMX2
if (rw) sequenceur.PlayTime += TimeSpan.FromSeconds(-1); if (rw) sequenceur.PlayTime += TimeSpan.FromSeconds(-1);
timeLabel.LabelProp = string.Format ("<small>elap.</small>{0:mm\\:ss\\.fff}\n<small>rem. </small>{1:mm\\:ss\\.fff}",cur,dur-cur); timeLabel.LabelProp = string.Format ("<small>elap.</small>{0:mm\\:ss\\.fff}\n<small>rem. </small>{1:mm\\:ss\\.fff}",cur,dur-cur);
titleLabel.LabelProp = sequenceur.State;
pbCur.Fraction = (dur == TimeSpan.Zero)?0:(cur.TotalMilliseconds/dur.TotalMilliseconds); pbCur.Fraction = (dur == TimeSpan.Zero)?0:(cur.TotalMilliseconds/dur.TotalMilliseconds);
updating=false;
} }
int IndexSelection() int IndexSelection()
@ -254,6 +258,7 @@ namespace DMX2
protected void OnListFilesCursorChanged (object sender, EventArgs e) protected void OnListFilesCursorChanged (object sender, EventArgs e)
{ {
if(updating)return;
TreeViewColumn col; TreeViewColumn col;
TreePath path; TreePath path;
listFiles.GetCursor (out path, out col); listFiles.GetCursor (out path, out col);

View file

@ -26,16 +26,8 @@ using System.Xml;
namespace DMX2 namespace DMX2
{ {
// TODO : Sauvegarde et chargement public class SequenceurSon : Sequenceur, IDisposable
public class SequenceurSon : Sequenceur
{ {
~SequenceurSon()
{
if(element!=null)
Stop();
element=null;
}
SeqSonUI ui=null; SeqSonUI ui=null;
@ -57,7 +49,11 @@ namespace DMX2
int fadeVStart; int fadeVStart;
int fadeVEnd; int fadeVEnd;
TimeSpan duration = TimeSpan.Zero;
Gst.Element element = null; Gst.Element element = null;
Gst.State state,pending;
Gst.StateChangeReturn scret;
public ReadOnlyCollection<string> Files { public ReadOnlyCollection<string> Files {
get { get {
@ -107,28 +103,23 @@ namespace DMX2
} }
set{ set{
if(element==null) return; if(element==null) return;
if(element.CurrentState != Gst.State.Paused && element.CurrentState != Gst.State.Playing){ QueueTask(delegate(){
taskQueue.Enqueue(delegate(){ //Console.WriteLine("Seek");
PlayTime = value;
});
return;
}
long pos = (long)(value.TotalMilliseconds) * 1000000; long pos = (long)(value.TotalMilliseconds) * 1000000;
element.Seek (Gst.Format.Time,Gst.SeekFlags.Flush|Gst.SeekFlags.Accurate,pos); element.Seek (Gst.Format.Time,Gst.SeekFlags.Flush|Gst.SeekFlags.Accurate,pos);
});
} }
} }
TimeSpan duration = TimeSpan.Zero;
public TimeSpan Duration { public TimeSpan Duration {
get { get {
if(element==null) return TimeSpan.Zero; if(element==null) return TimeSpan.Zero;
//if(duration == TimeSpan.Zero) { if(duration == TimeSpan.Zero)
Gst.Format format = Gst.Format.Time ; {
long dur; Gst.Format fmt = Gst.Format.Time; long dur;
element.QueryDuration(ref format, out dur); element.QueryDuration(ref fmt,out dur);
duration = TimeSpan.FromMilliseconds(dur/1000000); return TimeSpan.FromMilliseconds(dur/1000000);
//} }
return duration; return duration;
} }
} }
@ -141,10 +132,10 @@ namespace DMX2
} }
} }
void LoadFile (int pos) void LoadFile (int pos)
{ {
//Console.WriteLine("LoadFile");
curfile = files[pos]; curfile = files[pos];
Stop(); Stop();
@ -161,20 +152,18 @@ namespace DMX2
public void Play () public void Play ()
{ {
if(element == null)return; if(element == null)return;
if(element.CurrentState != Gst.State.Paused && element.CurrentState != Gst.State.Playing){ QueueTask(delegate(){
taskQueue.Enqueue(delegate(){ //Console.WriteLine("Play");
Play();
});
return;
}
element.SetState(Gst.State.Playing); element.SetState(Gst.State.Playing);
});
} }
public void Pause () public void Pause ()
{ {
if(element == null)return; if(element == null)return;
QueueTask(delegate(){
element.SetState(Gst.State.Paused); element.SetState(Gst.State.Paused);
});
} }
public void Stop () public void Stop ()
@ -221,15 +210,54 @@ namespace DMX2
return 0; 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) public override void Tick (TimeSpan time)
{ {
if (element != null && taskQueue.Count>0) { if (taskQueue.Count>0 && CheckAsync()){
if (element.CurrentState == Gst.State.Paused || element.CurrentState == Gst.State.Playing) //Console.WriteLine(State);
Task task;
if(taskQueue.TryDequeue(out task))
{ {
Task t; //Console.WriteLine("ASync");
if(taskQueue.TryDequeue(out t)) t(); task();
} }
} }
if (fading != TimeSpan.Zero) { if (fading != TimeSpan.Zero) {
fading-=time; fading-=time;
if(fading<=TimeSpan.Zero){ if(fading<=TimeSpan.Zero){
@ -294,6 +322,7 @@ namespace DMX2
public override void Command (string command) public override void Command (string command)
{ {
//Console.WriteLine("Command");
lock (this) { lock (this) {
var cmd = regexCommand1.Match (command); var cmd = regexCommand1.Match (command);
@ -330,6 +359,7 @@ namespace DMX2
fadeVEnd = (int)vol; fadeVEnd = (int)vol;
} }
else{ else{
fading = TimeSpan.Zero;
Volume = vol; Volume = vol;
if (ui != null) if (ui != null)
ui.updateflag = true; ui.updateflag = true;
@ -423,6 +453,16 @@ namespace DMX2
} }
#endregion #endregion
#region IDisposable implementation
void IDisposable.Dispose ()
{
if(element==null)return;
element.SetState(Gst.State.Null);
element.Dispose();
element=null;
}
#endregion
} }
} }