Ajout du feedback sur masters.
Ajout du feedback sur autres controles
This commit is contained in:
parent
5b810eaa8c
commit
68055d0bb9
6 changed files with 68 additions and 40 deletions
|
|
@ -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 ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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 (
|
||||||
|
|
|
||||||
|
|
@ -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 (
|
||||||
|
|
|
||||||
|
|
@ -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 ()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue