alsa-tools/us428control/Cus428State.h
Takashi Iwai aa16536cb3 From Rui Nuno Capela <rncbc@rncbc.org>:
Tascam US-224/428 MMC Implementation

This is my latest patch against the alsa-tools tree (as of todays CVS
HEAD), regarding the us428control MMC implementation as for the Tascam
US-224/428 audio/midi USB control surfaces:

    us428control now bumps to version 0.4.4.

Interesting points are: jog wheel dialing is now alternating between
spitting out some MMC-Step or MMC-Shuttle messages, depending on transport
state, instead of those MMC-Locate(s) which was an early implementation
mistake of mine.

Controlling ardour with (my) US-224 is getting much more fun now :)

However, there's still some little annoyances due to my lack of advice
regarding ardour's Play/Record control behaviour:

1) Ardour doesn't seem to send out MMC-Play messages when one starts
transport within it (e.g. by clicking the playback button widget).

2) Ardour doesn't seem to react against MMC-RecordPause, which I assume
(probably erroneously) it would be equivalent to clicking on its record
widget button.

3) Sending a MMC-RecordStrobe message to ardour has the strange effect to
start playback while toggling recording off instantaneously.

AFAICT these issues seems to be specific to ardour (0.9beta18.4), not to
us428control which is just sending out the proper MMC messages. Or that I
think.

I would like to settle all this before I'm going off on holidays. Hope
it's welcome and on time for the imminent alsa dot-6 release :)
2004-08-02 11:53:45 +00:00

145 lines
3.4 KiB
C++

/*
* Controller for Tascam US-X2Y
*
* Copyright (c) 2003 by Karsten Wiese <annabellesgarden@yahoo.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef Cus428State_h
#define Cus428State_h
#include "Cus428_ctls.h"
class Cus428State: public us428_lights{
public:
Cus428State(struct us428ctls_sharedmem* Pus428ctls_sharedmem)
:us428ctls_sharedmem(Pus428ctls_sharedmem)
,MuteInputMonitor(0)
,Mute(0)
,SelectInputMonitor(0)
,Select(0)
,us428_ctls(0)
,W0(0)
,aWheel(0)
,aWheel_L(0)
,aWheel_R(0)
,bSetLocate(false)
,uTransport(0)
,aWheelSpeed(0)
{
init_us428_lights();
for (int v = 0; v < 5; ++v) {
Volume[v].init(v);
}
}
enum eKnobs{
eK_RECORD = 72,
eK_PLAY,
eK_STOP,
eK_FFWD,
eK_REW,
eK_SOLO,
eK_REC,
eK_NULL,
eK_InputMonitor, // = 80
eK_BANK_L,
eK_BANK_R,
eK_LOCATE_L,
eK_LOCATE_R,
eK_SET = 85,
eK_INPUTCD = 87,
eK_HIGH = 90,
eK_HIMID,
eK_LOWMID,
eK_LOW,
eK_Select0 = 96,
eK_Mute0 = 104,
eK_Mute1,
eK_Mute2,
eK_Mute3,
eK_Mute4,
eK_Mute5,
eK_Mute6,
eK_Mute7,
eK_AUX1 = 120,
eK_AUX2,
eK_AUX3,
eK_AUX4,
eK_ASGN,
eK_F1,
eK_F2,
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);
Cus428_ctls *Set_us428_ctls(Cus428_ctls *New) {
Cus428_ctls *Old = us428_ctls;
us428_ctls = New;
return Old;
}
// Update the LED lights state.
int LightSend();
// Time-code (hh:mm:ss:ff:fr) to/from absolute wheel position converters.
void LocateWheel(unsigned char *tc);
void LocateSend();
// Set basic application transport state.
void TransportToggle(unsigned char T);
void TransportSet(unsigned char T, bool V);
void TransportSend();
// Reset internal MMC state.
void MmcReset();
private:
void SendVolume(usX2Y_volume &V);
struct us428ctls_sharedmem* us428ctls_sharedmem;
bool StateInputMonitor() {
return LightIs(eL_InputMonitor);
}
// Set the wheel differential.
void WheelDelta(int W);
// Set the wheel differential.
void WheelStep(int dW);
// Set the wheel shuttle speed.
void WheelShuttle(int dW);
// Get the curent wheel timecode.
void LocateTimecode(unsigned char *tc);
usX2Y_volume_t Volume[5];
char MuteInputMonitor,
Mute,
SelectInputMonitor,
Select;
Cus428_ctls *us428_ctls;
// Differential wheel tracking.
int W0;
// Some way to convert wheel (absolute) position into hh:mm:ss:ff:fr
int aWheel;
// SET L/R points.
int aWheel_L;
int aWheel_R;
// SET knob state.
bool bSetLocate;
// Last/current transport state.
unsigned char uTransport;
// Shuttle wheel absolute speed.
int aWheelSpeed;
};
extern Cus428State* OneState;
#endif