On Sunday 16 December 2007 01:21:17 Robin Sheat wrote: > OK, as a followup, I've attached a diff against head that makes the > headphone lights light appropriately when used with my kernel patch[0]. Some more patchy-goodness. This is against head, again.
This incorporates my previous LED-make-work stuff and the headphone LEDs. It also takes the three LEDs near the top and turns them into VU meters. It looks quite cool. Finally, it somewhat fixes the pitch knob jumpyness by faking pitch-bend button presses. It's not very nice, but it works better than it did. When I get time again I'll look into doing that in a better way. -- Robin <[EMAIL PROTECTED]> JabberID: <[EMAIL PROTECTED]> Hostes alienigeni me abduxerunt. Qui annus est? PGP Key 0xA99CEB6D = 5957 6D23 8B16 EFAB FEF8 7175 14D3 6485 A99C EB6D
Index: src/herculeslinux.h
===================================================================
--- src/herculeslinux.h (revision 1696)
+++ src/herculeslinux.h (working copy)
@@ -98,22 +98,22 @@
const int kiHerculesCrossfade = 0x28;
// TODO: 1.5.0+ investigate and revise led codes
-const int kiHerculesLedRightSync = 0;
-const int kiHerculesLedLeftLoop = 1;
-const int kiHerculesLedRightLoop = 2;
-const int kiHerculesLedLeftMasterTempo = 3;
-const int kiHerculesLedRightMasterTempo = 4;
-const int kiHerculesLedLeftFx = 5;
-const int kiHerculesLedRightFx = 6;
-const int kiHerculesLedRightCueLamp = 7;
-const int kiHerculesLedRightCueBtn = 8;
-const int kiHerculesLedRightPlay = 9;
-const int kiHerculesLedLeftCueLamp = 10;
-const int kiHerculesLedLeftPlay = 11;
-const int kiHerculesLedLeftHeadphone = 12;
-const int kiHerculesLedRightHeadphone = 13;
-const int kiHerculesLedLeftCueBtn = 14;
-const int kiHerculesLedLeftSync = 15;
+const int kiHerculesLedRightSync = 0x0D;
+const int kiHerculesLedLeftLoop = 0x0E;
+const int kiHerculesLedRightLoop = 0x0F;
+const int kiHerculesLedLeftMasterTempo = 0x00;
+const int kiHerculesLedRightMasterTempo = 0x01;
+const int kiHerculesLedLeftFx = 0x02;
+const int kiHerculesLedRightFx = 0x03;
+const int kiHerculesLedRightCueLamp = 0x04;
+const int kiHerculesLedRightCueBtn = 0x05;
+//const int kiHerculesLedRightPlay = 9; // doesn't exist
+const int kiHerculesLedLeftCueLamp = 0x07;
+//const int kiHerculesLedLeftPlay = 11; // doesn't exist
+const int kiHerculesLedLeftHeadphone = 0x09;
+const int kiHerculesLedRightHeadphone = 0x0A;
+const int kiHerculesLedLeftCueBtn = 0x0B;
+const int kiHerculesLedLeftSync = 0x0C;
#define __THOMAS_HERC__
#ifdef __THOMAS_HERC__
@@ -164,7 +164,9 @@
double m_dJogLeftOld, m_dJogRightOld;
- double PitchChange(const QString ControlSide, const int ev_value, int &m_iPitchPrevious, int &m_iPitchOffset);
+ //double PitchChange(const QString ControlSide, const int ev_value, int &m_iPitchPrevious, int &m_iPitchOffset);
+ int PitchChange(const QString ControlSide, const int ev_value, int &m_iPitchPrevious, int &m_iPitchOffset);
+ bool m_bClearLeftPitchPlus, m_bClearLeftPitchMinus, m_bClearRightPitchPlus, m_bClearRightPitchMinus;
};
#endif
Index: src/herculeslinuxlegacy.cpp
===================================================================
--- src/herculeslinuxlegacy.cpp (revision 1696)
+++ src/herculeslinuxlegacy.cpp (working copy)
@@ -18,8 +18,12 @@
m_dJogRightOld = 0.;
m_iPitchOffsetLeft=-9999;
m_iPitchOffsetRight=-9999;
- m_iPitchLeft = 127;
- m_iPitchRight = 127;
+ m_iPitchLeft = -1;
+ m_iPitchRight = -1;
+ m_bClearLeftPitchPlus=false;
+ m_bClearLeftPitchMinus=false;
+ m_bClearRightPitchPlus=false;
+ m_bClearRightPitchMinus=false;
}
HerculesLinux::~HerculesLinux()
@@ -30,30 +34,73 @@
{
while (1)
{
+
getNextEvent();
if (m_pControlObjectLeftBtnPlayProxy->get()!=m_bPlayLeft)
{
m_bPlayLeft=!m_bPlayLeft;
- led_write(kiHerculesLedLeftPlay, m_bPlayLeft);
+ led_write(kiHerculesLedLeftCueBtn, m_bPlayLeft);
}
if (m_pControlObjectRightBtnPlayProxy->get()!=m_bPlayRight)
{
m_bPlayRight=!m_bPlayRight;
- led_write(kiHerculesLedRightPlay, m_bPlayRight);
+ led_write(kiHerculesLedRightCueBtn, m_bPlayRight);
}
if (m_pControlObjectLeftBtnLoopProxy->get()!=m_bLoopLeft)
{
m_bLoopLeft=!m_bLoopLeft;
- led_write(kiHerculesLedLeftCueBtn, m_bLoopLeft);
+ //led_write(kiHerculesLedLeftCueBtn, m_bLoopLeft);
}
if (m_pControlObjectRightBtnLoopProxy->get()!=m_bLoopRight)
{
m_bLoopRight=!m_bLoopRight;
- led_write(kiHerculesLedRightCueBtn, m_bLoopRight);
+ //led_write(kiHerculesLedRightCueBtn, m_bLoopRight);
}
- m_bHeadphoneLeft=m_pControlObjectLeftBtnHeadphoneProxy->get();
- m_bHeadphoneRight=m_pControlObjectRightBtnHeadphoneProxy->get();
+ if (m_pControlObjectLeftBtnHeadphoneProxy->get() != m_bHeadphoneLeft) {
+ m_bHeadphoneLeft=!m_bHeadphoneLeft;
+ led_write(kiHerculesLedLeftHeadphone, m_bHeadphoneLeft);
+ }
+ if (m_pControlObjectRightBtnHeadphoneProxy->get() != m_bHeadphoneRight) {
+ m_bHeadphoneRight=!m_bHeadphoneRight;
+ led_write(kiHerculesLedRightHeadphone, m_bHeadphoneRight);
+ }
+ int leftVU = (int)(m_pControlObjectLeftVuMeter->get()*4.0);
+ if (leftVU != m_iLeftVU) {
+ m_iLeftVU = leftVU;
+ led_write(kiHerculesLedLeftFx, leftVU == 3);
+ led_write(kiHerculesLedLeftCueLamp, leftVU > 1);
+ led_write(kiHerculesLedLeftLoop, leftVU > 0);
+ }
+ int rightVU = (int)(m_pControlObjectRightVuMeter->get()*4.0);
+ if (rightVU != m_iRightVU) {
+ m_iRightVU = rightVU;
+ led_write(kiHerculesLedRightFx, rightVU == 3);
+ led_write(kiHerculesLedRightCueLamp, rightVU > 1);
+ led_write(kiHerculesLedRightLoop, rightVU > 0);
+ }
+ // We wait as long as possible to do this, otherwise we reset too
+ // quick, and the faked press is never picked up.
+ // (note: this currently isn't used, as no matter where I put it
+ // it's too fast. A better solution would be to find/make a relative
+ // shifter interface)
+ if (m_bClearLeftPitchPlus) {
+ m_bClearLeftPitchPlus = false;
+ sendButtonEvent(0,m_pControlObjectLeftBtnPitchBendPlus);
+ }
+ if (m_bClearLeftPitchMinus) {
+ m_bClearLeftPitchMinus = false;
+ sendButtonEvent(0,m_pControlObjectLeftBtnPitchBendMinus);
+ }
+ if (m_bClearRightPitchPlus) {
+ m_bClearRightPitchPlus = false;
+ sendButtonEvent(0,m_pControlObjectRightBtnPitchBendPlus);
+ }
+ if (m_bClearRightPitchMinus) {
+ m_bClearRightPitchMinus = false;
+ sendButtonEvent(0,m_pControlObjectRightBtnPitchBendMinus);
+ }
+
}
}
@@ -78,8 +125,8 @@
// Turn off led
led_write(kiHerculesLedLeftCueBtn, false);
led_write(kiHerculesLedRightCueBtn, false);
- led_write(kiHerculesLedLeftPlay, false);
- led_write(kiHerculesLedRightPlay, false);
+// led_write(kiHerculesLedLeftPlay, false);
+// led_write(kiHerculesLedRightPlay, false);
led_write(kiHerculesLedLeftSync, false);
led_write(kiHerculesLedRightSync, false);
led_write(kiHerculesLedLeftHeadphone, false);
@@ -204,7 +251,8 @@
//qDebug("code %i",ev.code);
int iDiff;
double dDiff;
-
+ int pitchValue;
+
switch (ev.code)
{
case kiHerculesLeftTreble:
@@ -221,8 +269,15 @@
sendEvent(ev.value/d1, m_pControlObjectLeftVolume);
break;
case kiHerculesLeftPitch:
- //qDebug("");
- sendEvent(PitchChange("Left", ev.value, m_iPitchLeft, m_iPitchOffsetLeft), m_pControlObjectLeftPitch);
+ pitchValue = PitchChange("Left", ev.value, m_iPitchLeft, m_iPitchOffsetLeft);
+ if (pitchValue > 0) {
+ for (int i=0; i<pitchValue; i++)
+ sendButtonEvent(1, m_pControlObjectLeftBtnPitchBendPlus);
+ } else {
+ for (int i=0; i>pitchValue; i--)
+ sendButtonEvent(1, m_pControlObjectLeftBtnPitchBendMinus);
+ }
+// sendEvent(PitchChange("Left", ev.value, m_iPitchLeft, m_iPitchOffsetLeft), m_pControlObjectLeftPitch);
break;
case kiHerculesLeftJog:
iDiff = 0;
@@ -253,7 +308,17 @@
break;
case kiHerculesRightPitch:
//qDebug("");
- sendEvent(PitchChange("Right", ev.value, m_iPitchRight, m_iPitchOffsetRight), m_pControlObjectRightPitch);
+ pitchValue = PitchChange("Right", ev.value, m_iPitchRight, m_iPitchOffsetRight);
+ if (pitchValue > 0) {
+ for (int i=0; i<pitchValue; i++) {
+ sendButtonEvent(1, m_pControlObjectRightBtnPitchBendPlus);
+ }
+ } else {
+ for (int i=0; i>pitchValue; i--) {
+ sendButtonEvent(1, m_pControlObjectRightBtnPitchBendMinus);
+ }
+ }
+// sendEvent(PitchChange("Right", ev.value, m_iPitchRight, m_iPitchOffsetRight), m_pControlObjectRightPitch);
break;
case kiHerculesRightJog:
iDiff = 0;
@@ -336,13 +401,13 @@
case kiHerculesLeftBtnHeadphone:
if (ev.value) {
- led_write(kiHerculesLedLeftHeadphone, !m_pControlObjectLeftBtnHeadphone->get());
+ //led_write(kiHerculesLedLeftHeadphone, !m_pControlObjectLeftBtnHeadphone->get());
sendButtonEvent(!m_bHeadphoneLeft, m_pControlObjectLeftBtnHeadphone);
}
break;
case kiHerculesRightBtnHeadphone:
if (ev.value) {
- led_write(kiHerculesLedRightHeadphone, !m_pControlObjectRightBtnHeadphone->get());
+ //led_write(kiHerculesLedRightHeadphone, !m_pControlObjectRightBtnHeadphone->get());
sendButtonEvent(!m_bHeadphoneRight, m_pControlObjectRightBtnHeadphone);
}
break;
@@ -454,15 +519,15 @@
struct input_event ev;
memset(&ev, 0, sizeof(struct input_event));
- //ev.type = EV_LED;
- ev.type = 0x0000;
+ ev.type = EV_LED;
+ //ev.type = 0x0000;
ev.code = iLed;
if (bOn)
- ev.value = 3;
+ ev.value = 1;
else
ev.value = 0;
- //qDebug("Hercules: led_write(iLed=%d, bOn=%d)", iLed, bOn);
+ //qDebug("Hercules: led_write(iLed=%d, value=%d)", iLed, ev.value);
if (write(m_iFd, &ev, sizeof(struct input_event)) != sizeof(struct input_event))
qDebug("Hercules: write(): %s", strerror(errno));
@@ -484,12 +549,12 @@
}
}
-double HerculesLinux::PitchChange(const QString ControlSide, const int ev_value, int &m_iPitchPrevious, int &m_iPitchOffset) {
+/*double HerculesLinux::PitchChange(const QString ControlSide, const int ev_value, int &m_iPitchPrevious, int &m_iPitchOffset) {
// Handle the initial event from the Hercules and set pitch to default of 0% change
if (m_iPitchPrevious < 0) {
m_iPitchOffset = ev_value;
m_iPitchPrevious = 64;
- return m_iPitchPrevious;
+ return ((m_iPitchPrevious+1)-64)/64.;
}
int delta = ev_value - m_iPitchOffset;
@@ -520,5 +585,27 @@
// old range was 0..127
// new range is -1.0 to 1.0
return ((m_iPitchPrevious+1) - 64)/64.;
+}*/
+
+/*
+ The old version of this sets the absolute pitch, but the herc doesn't have
+ an absolute pitch slider, so this treats it like a pitch bend
+*/
+int HerculesLinux::PitchChange(const QString ControlSide, const int ev_value, int &m_iPitchPrevious, int &m_iPitchOffset) {
+ // We have to ignore the first value we get here, as that lets us calibrate.
+ // We don't know which way they've turned it. A better option would be
+ // either to query it on start, or reset the device. I don't know how to
+ // do either through the event interface.
+ if (m_iPitchPrevious < 0)
+ m_iPitchPrevious = ev_value;
+ int delta = ev_value - m_iPitchPrevious;
+ if (delta >= 240) {
+ delta = (255 - delta) * -1;
+ } else if (delta <= -240) {
+ delta = 255 + delta;
+ }
+ m_iPitchPrevious = ev_value;
+ return delta;
}
+
Index: src/hercules.cpp
===================================================================
--- src/hercules.cpp (revision 1696)
+++ src/hercules.cpp (working copy)
@@ -61,6 +61,11 @@
m_pControlObjectLeftBtnHeadphoneProxy = new ControlObjectThread(ControlObject::getControl(ConfigKey("[Channel1]","pfl")));
m_pControlObjectRightBtnHeadphoneProxy = new ControlObjectThread(ControlObject::getControl(ConfigKey("[Channel2]","pfl")));
+ m_pControlObjectLeftVuMeter = new ControlObjectThread(ControlObject::getControl(ConfigKey("[Channel1]","VuMeter")));
+ Q_ASSERT(m_pControlObjectLeftVuMeter != 0);
+ m_pControlObjectRightVuMeter = new ControlObjectThread(ControlObject::getControl(ConfigKey("[Channel2]","VuMeter")));
+ Q_ASSERT(m_pControlObjectRightVuMeter != 0);
+
selectMapping(kqInputMappingHerculesStandard);
m_pRotaryLeft = new Rotary();
@@ -165,6 +170,7 @@
m_pControlObjectRightBtn123[1] = m_pControlObjectRightBtn2;
m_pControlObjectRightBtn123[2] = m_pControlObjectRightBtn3;
m_pControlObjectRightBtnFx = new ControlObjectThread(new ControlObject(ConfigKey("[Channel2]","Hercules4")));
+
}
void Hercules::changeJogMode(int iLeftFxMode, int iRightFxMode)
Index: src/hercules.h
===================================================================
--- src/hercules.h (revision 1696)
+++ src/hercules.h (working copy)
@@ -103,7 +103,7 @@
Rotary *m_pRotaryLeft, *m_pRotaryRight;
ControlObjectThread *m_pControlObjectLeftBeatLoop, *m_pControlObjectRightBeatLoop;
-
+ ControlObjectThread *m_pControlObjectLeftVuMeter, *m_pControlObjectRightVuMeter;
QString m_qMapping;
@@ -114,6 +114,7 @@
m_bSyncLeft, m_bSyncRight;
double m_dLeftVolumeOld, m_dRightVolumeOld;
+ int m_iLeftVU, m_iRightVU;
};
#endif
signature.asc
Description: This is a digitally signed message part.
------------------------------------------------------------------------- SF.Net email is sponsored by: Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________ Mixxx-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mixxx-devel
