diff --git a/DMX-2.0/DMX-2.0.csproj b/DMX-2.0/DMX-2.0.csproj index 67a5af1..67608e0 100644 --- a/DMX-2.0/DMX-2.0.csproj +++ b/DMX-2.0/DMX-2.0.csproj @@ -9,7 +9,6 @@ WinExe DMX2 DMX-2.0 - 2.0 true @@ -50,10 +49,6 @@ False gtk-sharp-2.0 - - False - gstreamer-sharp-0.10 - diff --git a/DMX-2.0/SequenceurSon.cs b/DMX-2.0/SequenceurSon.cs index 4b0b140..8e95b1f 100644 --- a/DMX-2.0/SequenceurSon.cs +++ b/DMX-2.0/SequenceurSon.cs @@ -21,7 +21,9 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Threading; +using System.Diagnostics; using System.Xml; +using System.Globalization; namespace DMX2 { @@ -31,18 +33,15 @@ namespace DMX2 SeqSonUI ui=null; - static bool gsinit=false; + Process mplayerProcess = null; List files = new List(); string curfile = string.Empty; uint volume=100; + - delegate void Task (); - - System.Collections.Concurrent.ConcurrentQueue taskQueue = - new System.Collections.Concurrent.ConcurrentQueue(); TimeSpan fading=TimeSpan.Zero; TimeSpan fadeLen; @@ -50,10 +49,7 @@ namespace DMX2 int fadeVEnd; TimeSpan duration = TimeSpan.Zero; - - Gst.Element element = null; - Gst.State state,pending; - Gst.StateChangeReturn scret; + TimeSpan position = TimeSpan.Zero; bool repeat = false; @@ -71,6 +67,7 @@ namespace DMX2 public int Index { get { + return files.IndexOf (curfile); } set { @@ -81,6 +78,45 @@ namespace DMX2 } } + bool Paused{ get; set;} + + bool CheckMplayer(){ + if (mplayerProcess == null || mplayerProcess.HasExited) { + if (mplayerProcess != null) + mplayerProcess.Dispose (); + ProcessStartInfo startinfo = new ProcessStartInfo (); + startinfo.FileName = "mplayer"; + startinfo.Arguments = "--quiet --idle --slave"; + startinfo.RedirectStandardInput = true; + startinfo.RedirectStandardOutput = true; + startinfo.UseShellExecute = false; + + mplayerProcess = Process.Start (startinfo); + mplayerProcess.OutputDataReceived += ProcessMplayerOut; + mplayerProcess.BeginOutputReadLine (); + return !mplayerProcess.HasExited; + } + return true; + } + + void ProcessMplayerOut (object sender, DataReceivedEventArgs e) + { + string data = e.Data; + if (data.StartsWith ("ANS_LENGTH")) { + string d = data.Substring (11); + double dData; + if(double.TryParse(d,NumberStyles.Number,CultureInfo.InvariantCulture,out dData)) + duration = TimeSpan.FromSeconds( dData ); + } + if (data.StartsWith ("ANS_TIME_POSITION")) { + string d = data.Substring (18); + double dData; + if(double.TryParse(d,NumberStyles.Number,CultureInfo.InvariantCulture,out dData)) + position = TimeSpan.FromSeconds( dData ); + } + Console.WriteLine ("data => {0}", data); + } + public int AddFile (int pos, string file) { lock (this) { @@ -95,38 +131,26 @@ namespace DMX2 get{ return volume;} set { volume=value; - if(element!=null) - element["volume"] = (double)volume / 100.0d ; + mplayerProcess.StandardInput.WriteLine ("volume {0} 1", volume); volumeEventTarget.FeedBack (); } } public TimeSpan PlayTime { get{ - if(element==null) return TimeSpan.Zero; - Gst.Format format = Gst.Format.Time ; long cur; - element.QueryPosition(ref format, out cur); - return TimeSpan.FromMilliseconds(cur/1000000); + if(mplayerProcess!=null && !mplayerProcess.HasExited) + mplayerProcess.StandardInput.WriteLine ("get_time_pos"); + return position; } set{ - if(element==null) return; - QueueTask(delegate(){ - //Console.WriteLine("Seek"); - long pos = (long)(value.TotalMilliseconds) * 1000000; - element.Seek (Gst.Format.Time,Gst.SeekFlags.Flush|Gst.SeekFlags.Accurate,pos); - }); + if (CheckMplayer ()) { + mplayerProcess.StandardInput.WriteLine ("seek {0} 2", value.TotalMilliseconds / 1000); + } } } public TimeSpan Duration { get { - if(element==null) return TimeSpan.Zero; - 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; } } @@ -145,55 +169,42 @@ namespace DMX2 curfile = files[pos]; Stop(); - - duration = TimeSpan.Zero; - - Uri uri = new Uri(curfile); - - element = Gst.ElementFactory.Make("playbin"); - element["uri"] = uri.AbsoluteUri; - element.SetState(Gst.State.Paused); - element["volume"] = (double)volume / 100.0d ; + mplayerProcess.StandardInput.WriteLine ("volume 0 1"); + mplayerProcess.StandardInput.WriteLine ("loadfile \"{0}\" 0", curfile); + mplayerProcess.StandardInput.WriteLine ("get_time_length"); + mplayerProcess.StandardInput.WriteLine ("pausing seek 0 2"); + mplayerProcess.StandardInput.WriteLine ("volume {0} 1", volume); + Paused = true; } public void Play () { - if(element == null)return; - QueueTask(delegate(){ - //Console.WriteLine("Play"); - element.SetState(Gst.State.Playing); - }); + if (curfile==null || !Paused) + return; + if (!CheckMplayer ()) + return; + mplayerProcess.StandardInput.WriteLine ("pause"); + Paused = false; } public void Pause () { - if(element == null)return; - QueueTask(delegate(){ - element.SetState(Gst.State.Paused); - }); + if (curfile==null || Paused) + return; + if (!CheckMplayer ()) + return; + mplayerProcess.StandardInput.WriteLine ("pause"); + Paused = true; } public void Stop () { - if(element == null)return; - element.SetState(Gst.State.Null); - element.Dispose(); - element=null; - Task t; - while(taskQueue.TryDequeue (out t)); - } - - static void GstInit () - { - if(gsinit) return; - gsinit=true; - string[] args = new string[] {"--gst-disable-segtrap"}; - Gst.Application.Init("dmx2", ref args ); + CheckMplayer (); + mplayerProcess.StandardInput.WriteLine ("stop"); } public SequenceurSon () { - GstInit(); volumeEventTarget = new actionEventTargetEx ( delegate(EventData data) { Volume = (uint)(100 * data.value / 255); @@ -230,52 +241,16 @@ namespace DMX2 public string State { get { - if(element == null) return "Stopped"; - UpdateState(); - string rpStr = repeat ? " (r)" : string.Empty; - if(pending == Gst.State.VoidPending){ - return string.Format("{0}{1}", state.ToString(),rpStr); - } - if(scret == Gst.StateChangeReturn.Async) - return string.Format("{0}=>{1}{2}", state,pending,rpStr); - return string.Format("{0}=>{1} : {2} {3}",state,pending,scret,rpStr); + return string.Empty; } } 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 (taskQueue.Count>0 && CheckAsync()){ - //Console.WriteLine(State); - Task task; - if(taskQueue.TryDequeue(out task)) - { - //Console.WriteLine("ASync"); - task(); - } - } if (fading != TimeSpan.Zero) { fading-=time; @@ -291,11 +266,6 @@ namespace DMX2 } } if (repeat) { - if (state == Gst.State.Playing) { - if ((Duration - PlayTime).TotalSeconds < 0.001) { - PlayTime = TimeSpan.Zero; - } - } } } @@ -478,10 +448,11 @@ namespace DMX2 #region IDisposable implementation void IDisposable.Dispose () { - if(element==null)return; - element.SetState(Gst.State.Null); - element.Dispose(); - element=null; + if (mplayerProcess != null && !mplayerProcess.HasExited) { + mplayerProcess.StandardInput.WriteLine ("quit"); + if (!mplayerProcess.WaitForExit (1000)) + mplayerProcess.Kill (); + } } #endregion } diff --git a/configure b/configure old mode 100755 new mode 100644