diff --git a/DMX-2.0/Conduite.cs b/DMX-2.0/Conduite.cs index fd5e846..aedf58a 100644 --- a/DMX-2.0/Conduite.cs +++ b/DMX-2.0/Conduite.cs @@ -87,7 +87,7 @@ namespace DMX2 delegate{ return master * 255 /100; }, - false + true ); if (startthread) StartThread(); @@ -155,6 +155,7 @@ namespace DMX2 } set { master= value; + masterEventTarget.FeedBack (); } } diff --git a/DMX-2.0/EventManager.cs b/DMX-2.0/EventManager.cs index 369a74f..a1cd9fd 100644 --- a/DMX-2.0/EventManager.cs +++ b/DMX-2.0/EventManager.cs @@ -140,7 +140,7 @@ namespace DMX2 public delegate int GetData(); EventAction action; GetData getdata; - bool canfeedback=false , nofeedback=false; + bool canfeedback=false;// , nofeedback=false; readonly List fbInfos = new List(); public actionEventTargetEx(EventAction _action, GetData _getdata,bool feedback) @@ -161,16 +161,16 @@ namespace DMX2 return true; } - nofeedback=true; + //nofeedback=true; bool res =action(data); - nofeedback=false; + //nofeedback=false; return res; } - public void FeedBack (byte data) + public void FeedBack () { - if (nofeedback) - return; + //if (nofeedback) return; + byte data = (byte)getdata (); foreach (var info in fbInfos) { info.FeedBack(data); } diff --git a/DMX-2.0/MidiEventProvider.cs b/DMX-2.0/MidiEventProvider.cs index d9bf6e3..8585dde 100644 --- a/DMX-2.0/MidiEventProvider.cs +++ b/DMX-2.0/MidiEventProvider.cs @@ -174,13 +174,14 @@ namespace DMX2 public MidiEventProvider (EventManager manager) { - /*MidiDevice dev = new MidiDevice("VMPK Input:VMPK Input"); +#if DEBUG + MidiDevice dev = new MidiDevice("VMPK Input:VMPK Input"); dev.HasFeedback = true; knowndevices.Add(dev.Name,dev); dev = new MidiDevice("VMPK Output:VMPK Output"); dev.HasFeedback = true; - knowndevices.Add(dev.Name,dev);*/ - + knowndevices.Add(dev.Name,dev); +#endif manager.RegisterProvider (this); AlsaSeqLib.Init (); @@ -277,7 +278,7 @@ namespace DMX2 { foreach (var ievent in eventlist.Values) { if (ievent.Page == page) { - ievent.SendEvent(); + ievent.SendFeedback(); foreach (int src in feedbacksources) { int lnvk = CombineHash (src, ievent.MidiEvCode); if (ievent.LastKnownValue != -1) @@ -303,16 +304,16 @@ namespace DMX2 return false; uint _page = uint.Parse (res.Groups ["page"].Value); int _evHC = res.Groups ["id"].Value.GetHashCode (); - midiEventSender sender = null; + midiFeedbackSender sender = null; res = regexCtrlEventID.Match (eventId); if (res.Success) { byte chan = byte.Parse (res.Groups ["chan"].Value); uint param = uint.Parse (res.Groups ["param"].Value); - sender = new midiCCEvSender (this, chan, param); + sender = new midiCCFbSender (this, chan, param); } else if ((res = regexPbEventID.Match (eventId)).Success){ byte chan = byte.Parse (res.Groups ["chan"].Value); - sender = new midiPBEvSender (this, chan); + sender = new midiPBFbSender (this, chan); } eventlist.Add (eventId, new internalEventDesc (eventId, _page, _evHC,sender)); } @@ -478,12 +479,12 @@ namespace DMX2 // TODO : Pitchbend feedback case AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER: eventlist.Add (id, new internalEventDesc (id, page, evHC, - new midiCCEvSender(this,channel,evS.data_ev_ctrl.param)) + new midiCCFbSender(this,channel,evS.data_ev_ctrl.param)) ); break; case AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_PITCHBEND: eventlist.Add (id, new internalEventDesc (id, page, evHC, - new midiPBEvSender(this,channel)) + new midiPBFbSender(this,channel)) ); break; default: @@ -506,9 +507,11 @@ namespace DMX2 continue; */ //last = evData; - if (eventlist [id].Bound) { + eventlist [id].CallEvent (callback, evData); + + /*if (eventlist [id].Bound) { callback (evData); - } + }*/ lastValueOfSrc [lnvk] = (byte)value; eventlist [id].LastKnownValue = (byte)value; @@ -654,7 +657,7 @@ namespace DMX2 readonly uint page; readonly int midiEvCode; - readonly midiEventSender evsender; + readonly midiFeedbackSender fbSender; public bool Bound { get { @@ -683,12 +686,12 @@ namespace DMX2 } } - public internalEventDesc (string _id, uint _page, int _evHCode, midiEventSender _evsender) + public internalEventDesc (string _id, uint _page, int _evHCode, midiFeedbackSender _evsender) { internalName = _id; page = _page; midiEvCode = _evHCode; - evsender = _evsender; + fbSender = _evsender; } int lastknownvalue = -1; @@ -702,25 +705,33 @@ namespace DMX2 } } - public void SendEvent () + bool nofbflag=false; + + public void SendFeedback () { - if(evsender !=null) - evsender.SendEvent (lastknownvalue); + if(fbSender !=null && !nofbflag) + fbSender.SendFeedback (lastknownvalue); } + public void CallEvent (EventManagerCallback callback, EventData evData) + { + nofbflag = true; + callback (evData); + nofbflag = false; + } } - abstract class midiEventSender { - public abstract void SendEvent (int value); + abstract class midiFeedbackSender { + public abstract void SendFeedback (int value); } - class midiCCEvSender : midiEventSender { + class midiCCFbSender : midiFeedbackSender { readonly MidiEventProvider prov; AlsaSeqLib.snd_seq_event_t ev; AlsaSeqLib.snd_seq_event_t ev2; - public midiCCEvSender (MidiEventProvider _prov, byte _chan, uint _param){ + public midiCCFbSender (MidiEventProvider _prov, byte _chan, uint _param){ prov = _prov; ev = new AlsaSeqLib.snd_seq_event_t(); ev.type = AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER; @@ -729,7 +740,7 @@ namespace DMX2 ev2 = ev; ev2.data_ev_ctrl.param += 32; } - public override void SendEvent (int value) + public override void SendFeedback (int value) { if (prov.use14b && ev.data_ev_ctrl.param <32 ) { value = value * prov.max14bValue / 255; @@ -745,19 +756,19 @@ namespace DMX2 } } - class midiPBEvSender : midiEventSender { + class midiPBFbSender : midiFeedbackSender { readonly MidiEventProvider prov; AlsaSeqLib.snd_seq_event_t ev; - public midiPBEvSender (MidiEventProvider _prov, byte _chan){ + public midiPBFbSender (MidiEventProvider _prov, byte _chan){ prov = _prov; ev = new AlsaSeqLib.snd_seq_event_t(); ev.type = AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_PITCHBEND; ev.data_ev_ctrl.channel = _chan; } - public override void SendEvent (int value) + public override void SendFeedback (int value) { // value = ((evS.data_ev_ctrl.value + 7000) * 255 / 14000); ev.data_ev_ctrl.value = value * 14000 / 255 - 7000; @@ -783,7 +794,7 @@ namespace DMX2 iev.LastKnownValue = data; if (prov.CurrentPage == iev.Page || iev.Page == 0) { - iev.SendEvent(); + iev.SendFeedback(); foreach (int src in prov.feedbacksources) { int lnvk = CombineHash (src, iev.MidiEvCode); if (iev.LastKnownValue != -1) diff --git a/DMX-2.0/SequenceurLineaire.cs b/DMX-2.0/SequenceurLineaire.cs index 7a17afd..7b676aa 100644 --- a/DMX-2.0/SequenceurLineaire.cs +++ b/DMX-2.0/SequenceurLineaire.cs @@ -127,7 +127,7 @@ namespace DMX2 Dictionary valeursrecues= new Dictionary(); SequenceurLineaire seq; int max=0;//, signe=-2; - bool nofeedback = false; + //bool nofeedback = false; bool attache; @@ -161,9 +161,9 @@ namespace DMX2 return true; } - nofeedback = true; + //nofeedback = true; seq.ChangeValeur(circuit,max); - nofeedback = false; + //nofeedback = false; attache = true; return true; } @@ -190,8 +190,8 @@ namespace DMX2 public void FeedBack (byte data) { - if (nofeedback) - return; + /*if (nofeedback) + return;*/ Attache = false; foreach (var fb in feedbacks) { @@ -238,6 +238,7 @@ namespace DMX2 } set { master = value; + masterEventTarget.FeedBack (); } } @@ -253,7 +254,7 @@ namespace DMX2 delegate{ return Master * 255 /100; }, - false + true ); goNextEventTarget = new actionEventTarget ( diff --git a/DMX-2.0/SequenceurMacro.cs b/DMX-2.0/SequenceurMacro.cs index b99b750..9e29526 100644 --- a/DMX-2.0/SequenceurMacro.cs +++ b/DMX-2.0/SequenceurMacro.cs @@ -166,6 +166,7 @@ namespace DMX2 } set { master = value; + masterEventTarget.FeedBack (); } } @@ -190,7 +191,7 @@ namespace DMX2 delegate{ return Master *255/100; }, - false + true ); goNextEventTarget = new actionEventTarget ( diff --git a/DMX-2.0/SequenceurSon.cs b/DMX-2.0/SequenceurSon.cs index 246e6c5..7bb22c7 100644 --- a/DMX-2.0/SequenceurSon.cs +++ b/DMX-2.0/SequenceurSon.cs @@ -55,6 +55,8 @@ namespace DMX2 Gst.State state,pending; Gst.StateChangeReturn scret; + actionEventTargetEx volumeEventTarget=null; + public ReadOnlyCollection Files { get { return files.AsReadOnly(); @@ -92,6 +94,7 @@ namespace DMX2 volume=value; if(element!=null) element["volume"] = (double)volume / 100.0d ; + volumeEventTarget.FeedBack (); } } @@ -188,6 +191,17 @@ namespace DMX2 public SequenceurSon () { GstInit(); + volumeEventTarget = new actionEventTargetEx ( + delegate(EventData data) { + Volume = (uint)(100 * data.value / 255); + return true; + }, + delegate{ + return (int)(Volume * 255 /100); + }, + true + ); + } #region implemented abstract members of DMX2.Sequenceur public override SequenceurUI GetUI ()