]> git.alsa-project.org Git - alsa-tools.git/commitdiff
us428control support for mixxx
authorCedric GESTES <goctaf@gmail.com>
Thu, 5 Oct 2006 12:59:38 +0000 (14:59 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 5 Oct 2006 12:59:38 +0000 (14:59 +0200)
This patch allow to change the mapping of the us428, the new mapping is
used with mixxx.
To use the new mapping:
./us428control -m mixxx

Signed-off-by: Cedric GESTES <goctaf@gmail.com>
us428control/Cus428Midi.cc
us428control/Cus428Midi.h
us428control/Cus428State.cc
us428control/Cus428State.h
us428control/Cus428_ctls.cc
us428control/Cus428_ctls.h
us428control/us428control.cc
us428control/usbus428ctldefs.h

index 554c1ffa083b6cba39a34d30f290d73d9062e2d2..84962a2728f8228030602e1609c1ef10a33247ca 100644 (file)
@@ -1,3 +1,4 @@
+/* -*- mode:C++; indent-tabs-mode:t; tab-width:8; c-basic-offset: 8 -*- */
 /*
  *
  * Copyright (c) 2003 by Karsten Wiese <annabellesgarden@yahoo.de>
@@ -78,7 +79,7 @@ char Cus428Midi::KnobParam[] = {
        0x35,
        0x36,
        0x37,
-       };
+};
 
 extern int verbose;
 
index 05347b079996ac00acfa83790148cae09cbe2a98..eb0c27b56113806171b35ca775ed770964208749 100644 (file)
@@ -1,3 +1,4 @@
+/* -*- mode:C++; indent-tabs-mode:t; tab-width:8; c-basic-offset: 8 -*- */
 /*
  *
  * Copyright (c) 2003 by Karsten Wiese <annabellesgarden@yahoo.de>
@@ -62,7 +63,7 @@
 
 
 class Cus428Midi {
- public:
+public:
        Cus428Midi():
                Seq(0){}
 
@@ -87,14 +88,23 @@ class Cus428Midi {
                return Err;
        }
 
-       int SendMidiControl(char Param, char Val){
-               snd_seq_ev_set_controller(&Ev, 15, Param, Val & 0x7F);
+       int SendMidiControl(char Channel, char Param, char Val){
+               snd_seq_ev_set_controller(&Ev, Channel, Param, Val & 0x7F);
                SubMitEvent();
                return 0;
-       } 
+       }
+
+       int SendMidiNote(char Channel, char Note, char Val){
+               if (!Val)
+                       snd_seq_ev_set_noteoff(&Ev, Channel, Note, Val & 0x7F);
+               else
+                       snd_seq_ev_set_noteon(&Ev, Channel, Note, Val & 0x7F);
+               SubMitEvent();
+               return 0;
+       }
 
-       int SendMidiControl(Cus428State::eKnobs K, bool Down){
-               return SendMidiControl(KnobParam[K - Cus428State::eK_RECORD], Down ? 0x7F : 0);
+       int SendMidiControl(char Channel, Cus428State::eKnobs K, bool Down){
+               return SendMidiControl(Channel, KnobParam[K - Cus428State::eK_RECORD], Down ? 0x7F : 0);
        }
 
        // To parse and dispatch input MIDI events.
@@ -106,7 +116,7 @@ class Cus428Midi {
        // Made public for friendliness.
        snd_seq_t *Seq;
 
- private:
+private:
        int Port;
        snd_seq_event_t Ev;
        int SubMitEvent(){
index 5f25152d96f21865b7d00276eedf49b11ba9d841..196262f93bf394053be4b002884d911fe34b0d59 100644 (file)
@@ -1,3 +1,4 @@
+/* -*- mode:C++; indent-tabs-mode:t; tab-width:8; c-basic-offset: 8 -*- */
 /*
  * Controller for Tascam US-X2Y
  *
@@ -46,7 +47,6 @@ void Cus428State::InitDevice(void)
                SliderChangedTo(eFaderM, ((unsigned char*)(us428ctls_sharedmem->CtlSnapShot + us428ctls_sharedmem->CtlSnapShotLast))[eFaderM]);
 }
 
-
 int Cus428State::LightSend()
 {
        int Next = us428ctls_sharedmem->p4outLast + 1;
@@ -57,6 +57,11 @@ int Cus428State::LightSend()
        return us428ctls_sharedmem->p4outLast = Next;
 }
 
+void Cus428State::SliderSend(int S)
+{
+       Midi.SendMidiControl(15, 0x40 + S, ((unsigned char*)us428_ctls)[S] / 2);
+}
+
 void Cus428State::SendVolume(usX2Y_volume &V)
 {
        int Next = us428ctls_sharedmem->p4outLast + 1;
@@ -67,23 +72,101 @@ void Cus428State::SendVolume(usX2Y_volume &V)
        us428ctls_sharedmem->p4outLast = Next;
 }
 
+void Cus428State::UserSliderChangedTo(int S, unsigned char New)
+{
+       SliderSend(S);
+}
+
 void Cus428State::SliderChangedTo(int S, unsigned char New)
 {
-       if (StateInputMonitor() && S <= eFader3
-           || S == eFaderM) {
+       if (StateInputMonitor() && S <= eFader3 || S == eFaderM) {
                usX2Y_volume &V = Volume[S >= eFader4 ? eFader4 : S];
                V.SetTo(S, New);
                if (S == eFaderM || !LightIs(eL_Mute0 + S))
                        SendVolume(V);
        }
-       else SliderSend(S);
+       else
+               UserSliderChangedTo(S, New);
 }
 
-void Cus428State::SliderSend(int S)
+void Cus428State::UserKnobChangedTo(eKnobs K, bool V)
 {
-       Midi.SendMidiControl(0x40 + S, ((unsigned char*)us428_ctls)[S] / 2);
+       switch (K) {
+       case eK_STOP:
+               if (verbose > 1)
+                       printf("Knob STOP now %i\n", V);
+               if (V) TransportToggle(T_STOP);
+               Midi.SendMidiControl(15, K, V);
+               break;
+       case eK_PLAY:
+               if (verbose > 1)
+                       printf("Knob PLAY now %i", V);
+               if (V) TransportToggle(T_PLAY);
+               if (verbose > 1)
+                       printf(" Light is %i\n", LightIs(eL_Play));
+               Midi.SendMidiControl(15, K, V);
+               break;
+       case eK_REW:
+               if (verbose > 1)
+                       printf("Knob REW now %i", V);
+               if (V) TransportToggle(T_REW);
+               if (verbose > 1)
+                       printf(" Light is %i\n", LightIs(eL_Rew));
+               Midi.SendMidiControl(15, K, V);
+               break;
+       case eK_FFWD:
+               if (verbose > 1)
+                       printf("Knob FFWD now %i", V);
+               if (V) TransportToggle(T_F_FWD);
+               if (verbose > 1)
+                       printf(" Light is %i\n", LightIs(eL_FFwd));
+               Midi.SendMidiControl(15, K, V);
+               break;
+       case eK_RECORD:
+               if (verbose > 1)
+                       printf("Knob RECORD now %i", V);
+               if (V) TransportToggle(T_RECORD);
+               if (verbose > 1)
+                       printf(" Light is %i\n", LightIs(eL_Record));
+               Midi.SendMidiControl(15, K, V);
+               break;
+       case eK_SET:
+               if (verbose > 1)
+                       printf("Knob SET now %i", V);
+               bSetLocate = V;
+               break;
+       case eK_LOCATE_L:
+               if (verbose > 1)
+                       printf("Knob LOCATE_L now %i", V);
+               if (V) {
+                       if (bSetLocate)
+                               aWheel_L = aWheel;
+                       else {
+                               aWheel = aWheel_L;
+                               LocateSend();
+                       }
+               }
+               break;
+       case eK_LOCATE_R:
+               if (verbose > 1)
+                       printf("Knob LOCATE_R now %i", V);
+               if (V) {
+                       if (bSetLocate)
+                               aWheel_R = aWheel;
+                       else {
+                               aWheel = aWheel_R;
+                               LocateSend();
+                       }
+               }
+               break;
+       default:
+               if (verbose > 1)
+                       printf("Knob %i now %i\n", K, V);
+               Midi.SendMidiControl(15, K, V);
+       }
 }
 
+
 void Cus428State::KnobChangedTo(eKnobs K, bool V)
 {
        switch (K & ~(StateInputMonitor() ? 3 : -1)) {
@@ -109,75 +192,7 @@ void Cus428State::KnobChangedTo(eKnobs K, bool V)
                }
                break;
        default:
-               switch (K) {
-               case eK_STOP:
-                       if (verbose > 1)
-                               printf("Knob STOP now %i\n", V);
-                       if (V) TransportToggle(T_STOP);
-                       Midi.SendMidiControl(K, V);
-                       break;
-               case eK_PLAY:
-                       if (verbose > 1)
-                               printf("Knob PLAY now %i", V);
-                       if (V) TransportToggle(T_PLAY);
-                       if (verbose > 1)
-                               printf(" Light is %i\n", LightIs(eL_Play));
-                       Midi.SendMidiControl(K, V);
-                       break;
-               case eK_REW:
-                       if (verbose > 1)
-                               printf("Knob REW now %i", V);
-                       if (V) TransportToggle(T_REW);
-                       if (verbose > 1)
-                               printf(" Light is %i\n", LightIs(eL_Rew));
-                       Midi.SendMidiControl(K, V);
-                       break;
-               case eK_FFWD:
-                       if (verbose > 1)
-                               printf("Knob FFWD now %i", V);
-                       if (V) TransportToggle(T_F_FWD);
-                       if (verbose > 1)
-                               printf(" Light is %i\n", LightIs(eL_FFwd));
-                       Midi.SendMidiControl(K, V);
-                       break;
-               case eK_RECORD:
-                       if (verbose > 1)
-                               printf("Knob RECORD now %i", V);
-                       if (V) TransportToggle(T_RECORD);
-                       if (verbose > 1)
-                               printf(" Light is %i\n", LightIs(eL_Record));
-                       Midi.SendMidiControl(K, V);
-                       break;
-               case eK_SET:
-                       if (verbose > 1)
-                               printf("Knob SET now %i", V);
-                       bSetLocate = V;
-                       break;
-               case eK_LOCATE_L:
-                       if (verbose > 1)
-                               printf("Knob LOCATE_L now %i", V);
-                       if (V) {
-                               if (bSetLocate)
-                                       aWheel_L = aWheel;
-                               else {
-                                       aWheel = aWheel_L;
-                                       LocateSend();
-                               }
-                       }
-                       break;
-               case eK_LOCATE_R:
-                       if (verbose > 1)
-                               printf("Knob LOCATE_R now %i", V);
-                       if (V) {
-                               if (bSetLocate)
-                                       aWheel_R = aWheel;
-                               else {
-                                       aWheel = aWheel_R;
-                                       LocateSend();
-                               }
-                       }
-                       break;
-               case eK_InputMonitor:
+               if (K == eK_InputMonitor) {
                        if (verbose > 1)
                                printf("Knob InputMonitor now %i", V);
                        if (V) {
@@ -195,35 +210,16 @@ void Cus428State::KnobChangedTo(eKnobs K, bool V)
                        }
                        if (verbose > 1)
                                printf(" Light is %i\n", LightIs(eL_InputMonitor));
-                       break;
-               default:
-                       if (verbose > 1)
-                               printf("Knob %i now %i\n", K, V);
-                       Midi.SendMidiControl(K, V);
-               }
+               } else
+                       UserKnobChangedTo(K, V);
        }
 }
 
-
-void Cus428State::WheelChangedTo(E_In84 W, char Diff)
+void Cus428State::UserWheelChangedTo(E_In84 W, char Diff)
 {
        char Param;
        switch (W) {
        case eWheelPan:
-               if (StateInputMonitor() && Light[0].Value) {
-                       int index = 0;
-
-                       while( index < 4 && (1 << index) !=  Light[0].Value)
-                               index++;
-
-                       if (index >= 4)
-                               return;
-
-                       Volume[index].PanTo(Diff, us428_ctls->Knob(eK_SET));
-                       if (!LightIs(eL_Mute0 + index))
-                               SendVolume(Volume[index]);
-                       return;
-               }
                Param = 0x4D;
                break;
        case eWheelGain:
@@ -236,12 +232,32 @@ void Cus428State::WheelChangedTo(E_In84 W, char Diff)
                Param = 0x4A;
                break;
        case eWheel:
-               Param = 0x60;
-               // Update the absolute wheel position.
+               Param = 0x60;
+               // Update the absolute wheel position.
                WheelDelta((int) ((unsigned char *) us428_ctls)[W]);
                break;
        }
-       Midi.SendMidiControl(Param, ((unsigned char *) us428_ctls)[W]);
+       Midi.SendMidiControl(15, Param, ((unsigned char *) us428_ctls)[W]);
+}
+
+void Cus428State::WheelChangedTo(E_In84 W, char Diff)
+{
+       if (W == eWheelPan && StateInputMonitor() && Light[0].Value)
+               {
+                       int index = 0;
+
+                       while( index < 4 && (1 << index) !=  Light[0].Value)
+                               index++;
+
+                       if (index >= 4)
+                               return;
+
+                       Volume[index].PanTo(Diff, us428_ctls->Knob(eK_SET));
+                       if (!LightIs(eL_Mute0 + index))
+                               SendVolume(Volume[index]);
+                       return;
+               }
+       UserWheelChangedTo(W, Diff);
 }
 
 
@@ -249,9 +265,9 @@ void Cus428State::WheelChangedTo(E_In84 W, char Diff)
 void Cus428State::LocateWheel ( unsigned char *tc )
 {
        aWheel  = (60 * 60 * 30) * (int) tc[0]          // hh - hours    [0..23]
-                       + (     60 * 30) * (int) tc[1]          // mm - minutes  [0..59]
-                       + (          30) * (int) tc[2]          // ss - seconds  [0..59]
-                       +                  (int) tc[3];         // ff - frames   [0..29]
+               + (     60 * 30) * (int) tc[1]          // mm - minutes  [0..59]
+               + (          30) * (int) tc[2]          // ss - seconds  [0..59]
+               +                  (int) tc[3];         // ff - frames   [0..29]
 }
 
 
@@ -276,8 +292,8 @@ void Cus428State::WheelDelta ( int W )
        if (dW > 0 && dW > +W_DELTA_MIN)
                dW -= W_DELTA_MAX;
        else
-       if (dW < 0 && dW < -W_DELTA_MIN)
-               dW += W_DELTA_MAX;
+               if (dW < 0 && dW < -W_DELTA_MIN)
+                       dW += W_DELTA_MAX;
 
        W0 = W;
        aWheel += dW;
@@ -356,7 +372,7 @@ void Cus428State::TransportToggle ( unsigned char T )
                        uTransport = T_STOP;
                        Midi.SendMmcCommand(MMC_CMD_STOP);
                } else {
-                   uTransport &= T_RECORD;
+                       uTransport &= T_RECORD;
                        uTransport |= T_PLAY;
                        Midi.SendMmcCommand(MMC_CMD_PLAY);
                }
@@ -366,7 +382,7 @@ void Cus428State::TransportToggle ( unsigned char T )
                        uTransport &= ~T_RECORD;
                        Midi.SendMmcCommand(MMC_CMD_RECORD_EXIT);
                } else {
-                   uTransport &= T_PLAY;
+                       uTransport &= T_PLAY;
                        uTransport |= T_RECORD;
                        Midi.SendMmcCommand(uTransport & T_PLAY ? MMC_CMD_RECORD_STROBE : MMC_CMD_RECORD_PAUSE);
                }
@@ -444,3 +460,181 @@ void Cus428State::MmcReset()
        LocateSend();
 }
 
+Cus428StateMixxx::Cus428StateMixxx(struct us428ctls_sharedmem* Pus428ctls_sharedmem):Cus428State(Pus428ctls_sharedmem)
+{
+       focus = 0;
+       eq = 0;
+       LightSet(eL_Low, 1);
+       LightSet(eL_LowMid, 0);
+       LightSet(eL_HiMid, 0);
+       LightSet(eL_High, 0);
+       LightSend();
+}
+
+void Cus428StateMixxx::UserKnobChangedTo(eKnobs K, bool V)
+{
+       switch (K) {
+       case eK_BANK_L:
+               if (verbose > 1)
+                       printf("Knob BANK_L now %i", V);
+               if (V) LightSet(eL_BankL, !LightIs(eL_BankL));
+               LightSend();
+               Midi.SendMidiNote(0, 51, V ? 127 : 0);
+               break;
+       case eK_BANK_R:
+               if (verbose > 1)
+                       printf("Knob BANK_R now %i", V);
+               if (V) LightSet(eL_BankR, !LightIs(eL_BankR));
+               LightSend();
+               Midi.SendMidiNote(1, 51, V ? 127 : 0);
+               break;
+       case eK_REW:
+               if (verbose > 1)
+                       printf("Knob REW now %i", V);
+               Midi.SendMidiNote(focus, 60, V ? 127 : 0);
+               break;
+       case eK_FFWD:
+               if (verbose > 1)
+                       printf("Knob FFWD now %i", V);
+               Midi.SendMidiNote(focus, 61, V ? 127 : 0);
+               break;
+       case eK_STOP:
+               if (verbose > 1)
+                       printf("Knob STOP now %i\n", V);
+               Midi.SendMidiNote(focus, 62, V ? 127 : 0);
+               break;
+       case eK_PLAY:
+               if (verbose > 1)
+                       printf("Knob PLAY now %i", V);
+               Midi.SendMidiNote(focus, 63, V ? 127 : 0);
+               break;
+       case eK_RECORD:
+               if (verbose > 1)
+                       printf("Knob RECORD now %i", V);
+               Midi.SendMidiNote(focus, 64, V ? 127 : 0);
+               break;
+       case eK_LOW:
+               if (verbose > 1)
+                       printf("Knob LOW now %i", V);
+               if (V)
+                       {
+                               eq = 0;
+                               LightSet(eL_Low, 1);
+                               LightSet(eL_LowMid, 0);
+                               LightSet(eL_HiMid, 0);
+                               LightSet(eL_High, 0);
+                               LightSend();
+                       }
+               break;
+       case eK_LOWMID:
+               if (verbose > 1)
+                       printf("Knob LOWMID now %i", V);
+               if (V)
+                       {
+                               eq = 1;
+                               LightSet(eL_Low, 0);
+                               LightSet(eL_LowMid, 1);
+                               LightSet(eL_HiMid, 0);
+                               LightSet(eL_High, 0);
+                               LightSend();
+                       }
+               break;
+       case eK_HIMID:
+               if (verbose > 1)
+                       printf("Knob HIMID now %i", V);
+               if (V)
+                       {
+                               eq = 2;
+                               LightSet(eL_Low, 0);
+                               LightSet(eL_LowMid, 0);
+                               LightSet(eL_HiMid, 1);
+                               LightSet(eL_High, 0);
+                               LightSend();
+                       }
+               break;
+       case eK_HIGH:
+               if (verbose > 1)
+                       printf("Knob HIGH now %i", V);
+               if (V)
+                       {
+                               eq = 3;
+                               LightSet(eL_Low, 0);
+                               LightSet(eL_LowMid, 0);
+                               LightSet(eL_HiMid, 0);
+                               LightSet(eL_High, 1);
+                               LightSend();
+                       }
+               break;
+       case eK_SET:
+               if (verbose > 1)
+                       printf("Knob SET now %i", V);
+               Midi.SendMidiNote(focus, 65, V ? 127 : 0);
+               break;
+       case eK_LOCATE_L:
+               if (verbose > 1)
+                       printf("Knob LOCATE_L now %i", V);
+               if (V) {
+                       focus = 0;
+               }
+               break;
+       case eK_LOCATE_R:
+               if (verbose > 1)
+                       printf("Knob LOCATE_R now %i", V);
+               if (V) {
+                       focus = 1;
+               }
+               break;
+       default:
+               if (verbose > 1)
+                       printf("Knob %i now %i\n", K, V);
+               if (K >= eK_Select0 && K <= eK_Select0 + 7) {
+                       if (V) LightSet(eL_Select0 + (K - eK_Select0), !LightIs(eL_Select0 + (K - eK_Select0)));
+                       LightSend();
+               } else if (K >= eK_Mute0 && K <= eK_Mute0 + 7) {
+                       if (V) LightSet(eL_Mute0 + (K - eK_Mute0), !LightIs(eL_Mute0 + (K - eK_Mute0)));
+                       LightSend();
+               }
+               Midi.SendMidiNote(0, K, V);
+       }
+}
+
+void Cus428StateMixxx::UserSliderChangedTo(int S, unsigned char New)
+{
+       //  if (verbose > 1)
+       //  printf("Slider : %d - %d - %d\n", S, New, ((unsigned char*)us428_ctls)[S]);
+       Midi.SendMidiControl(0, 0x40 + S, ((unsigned char*)us428_ctls)[S] / 2);
+}
+
+void Cus428StateMixxx::UserWheelChangedTo(E_In84 W, char Diff)
+{
+       char Param;
+       char Value;
+       char Channel;
+       //if (verbose > 1)
+       //  printf("Slider : %d - %d - %d\n", W, Diff, ((unsigned char *) us428_ctls)[W]);
+
+       Channel = 0;
+       switch (W) {
+       case eWheelGain:
+               Param = 0x48 + eq * 4;
+               break;
+       case eWheelFreq:
+               Param = 0x49 + eq * 4;
+               break;
+       case eWheelQ:
+               Param = 0x4A + eq * 4;
+               break;
+       case eWheelPan:
+               Param = 0x4B + eq * 4;
+               break;
+       case eWheel:
+               Param = 0x60;
+               Channel = focus;
+               // Update the absolute wheel position.
+               //WheelDelta((int) ((unsigned char *) us428_ctls)[W]);
+               break;
+       }
+       Value = 64 + Diff;
+       Midi.SendMidiControl(Channel, Param, Value);
+       //Midi.SendMidiControl(0, Param, ((unsigned char *) us428_ctls)[W]);
+}
index 714b1afef2f04993b1fa78b669c9473ad090fd3f..cfb5c29bd02f8674f384d675d8d8acd5e8a08676 100644 (file)
@@ -1,3 +1,4 @@
+/* -*- mode:C++; indent-tabs-mode:t; tab-width:8; c-basic-offset: 8 -*- */
 /*
  * Controller for Tascam US-X2Y
  *
@@ -24,7 +25,7 @@
 #include "Cus428_ctls.h"
 
 class Cus428State: public us428_lights{
- public:
+public:
        Cus428State(struct us428ctls_sharedmem* Pus428ctls_sharedmem)
                :us428ctls_sharedmem(Pus428ctls_sharedmem)
                ,MuteInputMonitor(0)
@@ -39,12 +40,12 @@ class Cus428State: public us428_lights{
                ,bSetLocate(false)
                ,uTransport(0)
                ,aWheelSpeed(0)
-               {
-                       init_us428_lights();
-                       for (int v = 0; v < 5; ++v) {
-                               Volume[v].init(v);
-                       }
+       {
+               init_us428_lights();
+               for (int v = 0; v < 5; ++v) {
+                       Volume[v].init(v);
                }
+       }
        enum eKnobs{
                eK_RECORD =     72,
                eK_PLAY,
@@ -84,10 +85,15 @@ class Cus428State: public us428_lights{
                eK_F3,
        };
        void InitDevice(void);
+
        void KnobChangedTo(eKnobs K, bool V);
        void SliderChangedTo(int S, unsigned char New);
-       void SliderSend(int S);
        void WheelChangedTo(E_In84 W, char Diff);
+       virtual void UserSliderChangedTo(int S, unsigned char New);
+       virtual void UserWheelChangedTo(E_In84 W, char Diff);
+       virtual void UserKnobChangedTo(eKnobs K, bool V);
+
+       void SliderSend(int S);
        Cus428_ctls *Set_us428_ctls(Cus428_ctls *New) {
                Cus428_ctls *Old = us428_ctls;
                us428_ctls = New;
@@ -104,7 +110,7 @@ class Cus428State: public us428_lights{
        void TransportSend();
        // Reset internal MMC state.
        void MmcReset();
- private:
+protected:
        void SendVolume(usX2Y_volume &V);
        struct us428ctls_sharedmem* us428ctls_sharedmem;
        bool StateInputMonitor() {
@@ -121,9 +127,9 @@ class Cus428State: public us428_lights{
 
        usX2Y_volume_t  Volume[5];
        char            MuteInputMonitor,
-                       Mute,
-                       SelectInputMonitor,
-                       Select;
+               Mute,
+               SelectInputMonitor,
+               Select;
        Cus428_ctls     *us428_ctls;
        // Differential wheel tracking.
        int W0;
@@ -140,6 +146,18 @@ class Cus428State: public us428_lights{
        int aWheelSpeed;
 };
 
+
+class Cus428StateMixxx: public Cus428State{
+public:
+       Cus428StateMixxx(struct us428ctls_sharedmem* Pus428ctls_sharedmem);
+       void UserKnobChangedTo(eKnobs K, bool V);
+       void UserSliderChangedTo(int S, unsigned char New);
+       void UserWheelChangedTo(E_In84 W, char Diff);
+protected:
+       int focus;
+       int eq;
+};
+
 extern Cus428State* OneState;
 
 #endif
index f0b13e23615e9dc3b02b1e7d8ce668342979760b..3d59aba85eb24021c01abc563af1408e2969e556 100644 (file)
@@ -1,3 +1,4 @@
+/* -*- mode:C++; indent-tabs-mode:t; tab-width:8; c-basic-offset: 8 -*- */
 /*
  * Controller for Tascam US-X2Y
  *
@@ -25,7 +26,7 @@
 
 Cus428State* OneState;
 
-void 
+void
 Cus428_ctls::dump(int n)
 {
        for (int m = 0; m < n; m++)
@@ -35,7 +36,7 @@ Cus428_ctls::dump(int n)
        printf("\n");
 }
 
-void 
+void
 Cus428_ctls::analyse(Cus428_ctls *Previous, unsigned n)
 {
        Cus428_ctls *PreviousL = Previous ? Previous : new Cus428_ctls();
@@ -43,7 +44,7 @@ Cus428_ctls::analyse(Cus428_ctls *Previous, unsigned n)
        for (; n < 9; n++) {                    //Sliders
                char Diff = DiffValAt(PreviousL, n);
                if (Diff)
-                       OneState->SliderChangedTo(n, ValAt(n));         
+                       OneState->SliderChangedTo(n, ValAt(n));
        }
        for (; n < 16; n++) {                   //Knobs
                unsigned char Diff = DiffBitAt(PreviousL, n);
@@ -57,7 +58,7 @@ Cus428_ctls::analyse(Cus428_ctls *Previous, unsigned n)
        for (; n < sizeof(*this); n++) {        //wheels
                char Diff = DiffValAt(PreviousL, n);
                if (Diff)
-                       OneState->WheelChangedTo((E_In84)n, Diff);                              
+                       OneState->WheelChangedTo((E_In84)n, Diff);
        }
        if (0 == Previous)
                delete PreviousL;
index 1d5eb4064387f6a6bbd54edaa8df397ba9769205..29da7907e410dff5346e60d0ffb74f43615cdd4b 100644 (file)
@@ -1,3 +1,4 @@
+/* -*- mode:C++; indent-tabs-mode:t; tab-width:8; c-basic-offset: 8 -*- */
 /*
  * Controller for Tascam US-X2Y
  *
@@ -24,7 +25,7 @@
 
 
 class Cus428_ctls: public us428_ctls{
- public:
+public:
        Cus428_ctls() {
                memset(this, 0, sizeof(*this));
        }
@@ -33,7 +34,7 @@ class Cus428_ctls: public us428_ctls{
        bool Knob( int K) {
                return ((char*)this)[K / 8] & (1 << K % 8);
        }
- protected:
+protected:
        unsigned char ValAt(int i) {
                return ((unsigned char*)this)[i];
        }
index e826ec48ba20106de9f1be05fc5b94720dfdcf4b..50c3573b05b36af68c1682cbc74d72df2fdf9c61 100644 (file)
@@ -1,3 +1,4 @@
+/* -*- mode:C++; indent-tabs-mode:t; tab-width:8; c-basic-offset: 8 -*- */
 /*
  * Controller for Tascam US-X2Y
  *
@@ -61,7 +62,8 @@ static void usage(void)
 {
        printf("Tascam US-428 Control\n");
        printf("version %s\n", VERSION);
-       printf("usage: "PROGNAME" [-v verbosity_level 0..2] [-c card] [-D device] [-u usb-device]\n");
+       printf("usage: "PROGNAME" [-v verbosity_level 0..2] [-c card] [-D device] [-u usb-device] [-m mode]\n");
+       printf("mode is one of (native, mixxx)\n");
 }
 /*
  * check the name id of the given hwdep handle
@@ -76,14 +78,14 @@ static int check_hwinfo(snd_hwdep_t *hw, const char *id, const char* usb_dev_nam
                return err;
        if (strcmp(snd_hwdep_info_get_id(info), id))
                return -ENODEV;
-       if (usb_dev_name) 
+       if (usb_dev_name)
                if (strcmp(snd_hwdep_info_get_name(info), usb_dev_name))
                        return -ENODEV;
 
        return 0; /* ok */
 }
 
-int US428Control(const char* DevName)
+int US428Control(const char* DevName, int mode)
 {
        snd_hwdep_t             *hw;
        int                     err;
@@ -117,7 +119,11 @@ int US428Control(const char* DevName)
                return -ENOMEM;
        }
        us428ctls_sharedmem->CtlSnapShotRed = us428ctls_sharedmem->CtlSnapShotLast;
-       OneState = new Cus428State(us428ctls_sharedmem);
+       if (mode == 1)
+               OneState = new Cus428StateMixxx(us428ctls_sharedmem);
+       else
+               OneState = new Cus428State(us428ctls_sharedmem);
+
        OneState->InitDevice();
 
        while ((pollrc = poll(pfds, npfd, 60000)) >= 0) {
@@ -152,12 +158,13 @@ int US428Control(const char* DevName)
 int main (int argc, char *argv[])
 {
        int c;
+       int mode = 0;
        int card = -1;
        char    *device_name = NULL,
                *usb_device_name = getenv("DEVICE");
        char name[64];
 
-       while ((c = getopt(argc, argv, "c:D:u:v:")) != -1) {
+       while ((c = getopt(argc, argv, "c:D:u:v:m:")) != -1) {
                switch (c) {
                case 'c':
                        card = atoi(optarg);
@@ -171,6 +178,10 @@ int main (int argc, char *argv[])
                case 'v':
                        verbose = atoi(optarg);
                        break;
+               case 'm':
+                       if (!strcmp(optarg, "mixxx"))
+                               mode = 1;
+                       break;
                default:
                        usage();
                        return 1;
@@ -190,18 +201,18 @@ int main (int argc, char *argv[])
                }
        }
        if (device_name) {
-               return US428Control(device_name) != 0;
+               return US428Control(device_name, mode) != 0;
        }
        if (card >= 0) {
                sprintf(name, "hw:%d", card);
-               return US428Control(name) != 0;
+               return US428Control(name, mode) != 0;
        }
 
        /* probe the all cards */
        for (c = 0; c < SND_CARDS; c++) {
-       //      verbose--;
+               //      verbose--;
                sprintf(name, "hw:%d", c);
-               if (! US428Control(name))
+               if (!US428Control(name, mode))
                        card = c;
        }
        if (card < 0) {
index d3486692cc1fe69d2badc2e25ef0f218be86191c..1063bae78d97556b861b3275a0fb8f69584a5100 100644 (file)
@@ -1,3 +1,4 @@
+/* -*- mode:C++; indent-tabs-mode:t; tab-width:8; c-basic-offset: 8 -*- */
 /*
  *
  * Copyright (c) 2003 by Karsten Wiese <annabellesgarden@yahoo.de>
@@ -64,7 +65,7 @@ struct us428_ctls{
        unsigned char   Select;
        unsigned char   Mute;
        unsigned char   UNKNOWN;
-       unsigned char   Switch;      
+       unsigned char   Switch;
        unsigned char   Wheel[5];
 };
 
@@ -82,15 +83,15 @@ enum {
 
 typedef struct usX2Y_volume {
        unsigned char   Channel,
-                       LH,
-                       LL,
-                       RH,
-                       RL;
+               LH,
+               LL,
+               RH,
+               RL;
        unsigned char   Slider;
        char            Pan,
-                       Mute;
+               Mute;
 #ifdef __cplusplus
-       public:
+public:
        void init(unsigned char _Channel) {
                memset(this, 0, sizeof(*this));
                Channel = _Channel;
@@ -119,7 +120,7 @@ typedef struct usX2Y_volume {
                if (Grob) {
                        static int GrobVals[] = {-128, -64, 0, 64, 127};
                        int i = 4;
-                       while (i >= 0 && GrobVals[i] > Pan) 
+                       while (i >= 0 && GrobVals[i] > Pan)
                                i--;
                        if (GrobVals[i] != Pan  &&  RawValue < 0)
                                i++;
@@ -145,7 +146,7 @@ typedef struct usX2Y_volume {
 struct us428_lights{
        us428_setByte_t Light[7];
 #ifdef __cplusplus
-       public:
+public:
        enum eLight{
                eL_Select0 = 0,
                eL_Rec0 = 8,
@@ -158,7 +159,12 @@ struct us428_lights{
                eL_FFwd = 29,
                eL_Play = 30,
                eL_Record = 31,
-               eL_Null
+               eL_AnalogDigital = 32,
+               eL_Null = 34,
+               eL_Low = 36,
+               eL_LowMid = 37,
+               eL_HiMid = 38,
+               eL_High = 39
        };
        bool LightIs(int L){
                return Light[L / 8].Value & (1 << (L % 8));