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{
return master * 255 /100;
},
false
true
);
if (startthread) StartThread();
@ -155,6 +155,7 @@ namespace DMX2
}
set {
master= value;
masterEventTarget.FeedBack ();
}
}

View file

@ -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<IFeedbackInfo> fbInfos = new List<IFeedbackInfo>();
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);
}

View file

@ -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)

View file

@ -127,7 +127,7 @@ namespace DMX2
Dictionary<string,int> valeursrecues= new Dictionary<string, int>();
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 (

View file

@ -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 (

View file

@ -55,6 +55,8 @@ namespace DMX2
Gst.State state,pending;
Gst.StateChangeReturn scret;
actionEventTargetEx volumeEventTarget=null;
public ReadOnlyCollection<string> 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 ()