Ajout du feedback sur masters.

Ajout du feedback sur autres controles
This commit is contained in:
tzim 2015-08-26 14:11:03 +00:00
parent 5b810eaa8c
commit 68055d0bb9
6 changed files with 68 additions and 40 deletions

View file

@ -87,7 +87,7 @@ namespace DMX2
delegate{ delegate{
return master * 255 /100; return master * 255 /100;
}, },
false true
); );
if (startthread) StartThread(); if (startthread) StartThread();
@ -155,6 +155,7 @@ namespace DMX2
} }
set { set {
master= value; master= value;
masterEventTarget.FeedBack ();
} }
} }

View file

@ -140,7 +140,7 @@ namespace DMX2
public delegate int GetData(); public delegate int GetData();
EventAction action; EventAction action;
GetData getdata; GetData getdata;
bool canfeedback=false , nofeedback=false; bool canfeedback=false;// , nofeedback=false;
readonly List<IFeedbackInfo> fbInfos = new List<IFeedbackInfo>(); readonly List<IFeedbackInfo> fbInfos = new List<IFeedbackInfo>();
public actionEventTargetEx(EventAction _action, GetData _getdata,bool feedback) public actionEventTargetEx(EventAction _action, GetData _getdata,bool feedback)
@ -161,16 +161,16 @@ namespace DMX2
return true; return true;
} }
nofeedback=true; //nofeedback=true;
bool res =action(data); bool res =action(data);
nofeedback=false; //nofeedback=false;
return res; return res;
} }
public void FeedBack (byte data) public void FeedBack ()
{ {
if (nofeedback) //if (nofeedback) return;
return; byte data = (byte)getdata ();
foreach (var info in fbInfos) { foreach (var info in fbInfos) {
info.FeedBack(data); info.FeedBack(data);
} }

View file

@ -174,13 +174,14 @@ namespace DMX2
public MidiEventProvider (EventManager manager) 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; dev.HasFeedback = true;
knowndevices.Add(dev.Name,dev); knowndevices.Add(dev.Name,dev);
dev = new MidiDevice("VMPK Output:VMPK Output"); dev = new MidiDevice("VMPK Output:VMPK Output");
dev.HasFeedback = true; dev.HasFeedback = true;
knowndevices.Add(dev.Name,dev);*/ knowndevices.Add(dev.Name,dev);
#endif
manager.RegisterProvider (this); manager.RegisterProvider (this);
AlsaSeqLib.Init (); AlsaSeqLib.Init ();
@ -277,7 +278,7 @@ namespace DMX2
{ {
foreach (var ievent in eventlist.Values) { foreach (var ievent in eventlist.Values) {
if (ievent.Page == page) { if (ievent.Page == page) {
ievent.SendEvent(); ievent.SendFeedback();
foreach (int src in feedbacksources) { foreach (int src in feedbacksources) {
int lnvk = CombineHash (src, ievent.MidiEvCode); int lnvk = CombineHash (src, ievent.MidiEvCode);
if (ievent.LastKnownValue != -1) if (ievent.LastKnownValue != -1)
@ -303,16 +304,16 @@ namespace DMX2
return false; return false;
uint _page = uint.Parse (res.Groups ["page"].Value); uint _page = uint.Parse (res.Groups ["page"].Value);
int _evHC = res.Groups ["id"].Value.GetHashCode (); int _evHC = res.Groups ["id"].Value.GetHashCode ();
midiEventSender sender = null; midiFeedbackSender sender = null;
res = regexCtrlEventID.Match (eventId); res = regexCtrlEventID.Match (eventId);
if (res.Success) { if (res.Success) {
byte chan = byte.Parse (res.Groups ["chan"].Value); byte chan = byte.Parse (res.Groups ["chan"].Value);
uint param = uint.Parse (res.Groups ["param"].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){ } else if ((res = regexPbEventID.Match (eventId)).Success){
byte chan = byte.Parse (res.Groups ["chan"].Value); 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)); eventlist.Add (eventId, new internalEventDesc (eventId, _page, _evHC,sender));
} }
@ -478,12 +479,12 @@ namespace DMX2
// TODO : Pitchbend feedback // TODO : Pitchbend feedback
case AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER: case AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER:
eventlist.Add (id, new internalEventDesc (id, page, evHC, 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; break;
case AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_PITCHBEND: case AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_PITCHBEND:
eventlist.Add (id, new internalEventDesc (id, page, evHC, eventlist.Add (id, new internalEventDesc (id, page, evHC,
new midiPBEvSender(this,channel)) new midiPBFbSender(this,channel))
); );
break; break;
default: default:
@ -506,9 +507,11 @@ namespace DMX2
continue; */ continue; */
//last = evData; //last = evData;
if (eventlist [id].Bound) { eventlist [id].CallEvent (callback, evData);
/*if (eventlist [id].Bound) {
callback (evData); callback (evData);
} }*/
lastValueOfSrc [lnvk] = (byte)value; lastValueOfSrc [lnvk] = (byte)value;
eventlist [id].LastKnownValue = (byte)value; eventlist [id].LastKnownValue = (byte)value;
@ -654,7 +657,7 @@ namespace DMX2
readonly uint page; readonly uint page;
readonly int midiEvCode; readonly int midiEvCode;
readonly midiEventSender evsender; readonly midiFeedbackSender fbSender;
public bool Bound { public bool Bound {
get { 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; internalName = _id;
page = _page; page = _page;
midiEvCode = _evHCode; midiEvCode = _evHCode;
evsender = _evsender; fbSender = _evsender;
} }
int lastknownvalue = -1; int lastknownvalue = -1;
@ -702,25 +705,33 @@ namespace DMX2
} }
} }
public void SendEvent () bool nofbflag=false;
public void SendFeedback ()
{ {
if(evsender !=null) if(fbSender !=null && !nofbflag)
evsender.SendEvent (lastknownvalue); fbSender.SendFeedback (lastknownvalue);
} }
public void CallEvent (EventManagerCallback callback, EventData evData)
{
nofbflag = true;
callback (evData);
nofbflag = false;
}
} }
abstract class midiEventSender { abstract class midiFeedbackSender {
public abstract void SendEvent (int value); public abstract void SendFeedback (int value);
} }
class midiCCEvSender : midiEventSender { class midiCCFbSender : midiFeedbackSender {
readonly MidiEventProvider prov; readonly MidiEventProvider prov;
AlsaSeqLib.snd_seq_event_t ev; AlsaSeqLib.snd_seq_event_t ev;
AlsaSeqLib.snd_seq_event_t ev2; AlsaSeqLib.snd_seq_event_t ev2;
public midiCCEvSender (MidiEventProvider _prov, byte _chan, uint _param){ public midiCCFbSender (MidiEventProvider _prov, byte _chan, uint _param){
prov = _prov; prov = _prov;
ev = new AlsaSeqLib.snd_seq_event_t(); ev = new AlsaSeqLib.snd_seq_event_t();
ev.type = AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER; ev.type = AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_CONTROLLER;
@ -729,7 +740,7 @@ namespace DMX2
ev2 = ev; ev2 = ev;
ev2.data_ev_ctrl.param += 32; 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 ) { if (prov.use14b && ev.data_ev_ctrl.param <32 ) {
value = value * prov.max14bValue / 255; value = value * prov.max14bValue / 255;
@ -745,19 +756,19 @@ namespace DMX2
} }
} }
class midiPBEvSender : midiEventSender { class midiPBFbSender : midiFeedbackSender {
readonly MidiEventProvider prov; readonly MidiEventProvider prov;
AlsaSeqLib.snd_seq_event_t ev; AlsaSeqLib.snd_seq_event_t ev;
public midiPBEvSender (MidiEventProvider _prov, byte _chan){ public midiPBFbSender (MidiEventProvider _prov, byte _chan){
prov = _prov; prov = _prov;
ev = new AlsaSeqLib.snd_seq_event_t(); ev = new AlsaSeqLib.snd_seq_event_t();
ev.type = AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_PITCHBEND; ev.type = AlsaSeqLib.snd_seq_event_type_t.SND_SEQ_EVENT_PITCHBEND;
ev.data_ev_ctrl.channel = _chan; 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); { // value = ((evS.data_ev_ctrl.value + 7000) * 255 / 14000);
ev.data_ev_ctrl.value = value * 14000 / 255 - 7000; ev.data_ev_ctrl.value = value * 14000 / 255 - 7000;
@ -783,7 +794,7 @@ namespace DMX2
iev.LastKnownValue = data; iev.LastKnownValue = data;
if (prov.CurrentPage == iev.Page || iev.Page == 0) { if (prov.CurrentPage == iev.Page || iev.Page == 0) {
iev.SendEvent(); iev.SendFeedback();
foreach (int src in prov.feedbacksources) { foreach (int src in prov.feedbacksources) {
int lnvk = CombineHash (src, iev.MidiEvCode); int lnvk = CombineHash (src, iev.MidiEvCode);
if (iev.LastKnownValue != -1) if (iev.LastKnownValue != -1)

View file

@ -127,7 +127,7 @@ namespace DMX2
Dictionary<string,int> valeursrecues= new Dictionary<string, int>(); Dictionary<string,int> valeursrecues= new Dictionary<string, int>();
SequenceurLineaire seq; SequenceurLineaire seq;
int max=0;//, signe=-2; int max=0;//, signe=-2;
bool nofeedback = false; //bool nofeedback = false;
bool attache; bool attache;
@ -161,9 +161,9 @@ namespace DMX2
return true; return true;
} }
nofeedback = true; //nofeedback = true;
seq.ChangeValeur(circuit,max); seq.ChangeValeur(circuit,max);
nofeedback = false; //nofeedback = false;
attache = true; attache = true;
return true; return true;
} }
@ -190,8 +190,8 @@ namespace DMX2
public void FeedBack (byte data) public void FeedBack (byte data)
{ {
if (nofeedback) /*if (nofeedback)
return; return;*/
Attache = false; Attache = false;
foreach (var fb in feedbacks) { foreach (var fb in feedbacks) {
@ -238,6 +238,7 @@ namespace DMX2
} }
set { set {
master = value; master = value;
masterEventTarget.FeedBack ();
} }
} }
@ -253,7 +254,7 @@ namespace DMX2
delegate{ delegate{
return Master * 255 /100; return Master * 255 /100;
}, },
false true
); );
goNextEventTarget = new actionEventTarget ( goNextEventTarget = new actionEventTarget (

View file

@ -166,6 +166,7 @@ namespace DMX2
} }
set { set {
master = value; master = value;
masterEventTarget.FeedBack ();
} }
} }
@ -190,7 +191,7 @@ namespace DMX2
delegate{ delegate{
return Master *255/100; return Master *255/100;
}, },
false true
); );
goNextEventTarget = new actionEventTarget ( goNextEventTarget = new actionEventTarget (

View file

@ -55,6 +55,8 @@ namespace DMX2
Gst.State state,pending; Gst.State state,pending;
Gst.StateChangeReturn scret; Gst.StateChangeReturn scret;
actionEventTargetEx volumeEventTarget=null;
public ReadOnlyCollection<string> Files { public ReadOnlyCollection<string> Files {
get { get {
return files.AsReadOnly(); return files.AsReadOnly();
@ -92,6 +94,7 @@ namespace DMX2
volume=value; volume=value;
if(element!=null) if(element!=null)
element["volume"] = (double)volume / 100.0d ; element["volume"] = (double)volume / 100.0d ;
volumeEventTarget.FeedBack ();
} }
} }
@ -188,6 +191,17 @@ namespace DMX2
public SequenceurSon () public SequenceurSon ()
{ {
GstInit(); 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 #region implemented abstract members of DMX2.Sequenceur
public override SequenceurUI GetUI () public override SequenceurUI GetUI ()