summaryrefslogtreecommitdiff
path: root/libs/surfaces/tranzport/wheel.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/surfaces/tranzport/wheel.cc')
-rw-r--r--libs/surfaces/tranzport/wheel.cc206
1 files changed, 206 insertions, 0 deletions
diff --git a/libs/surfaces/tranzport/wheel.cc b/libs/surfaces/tranzport/wheel.cc
new file mode 100644
index 0000000000..bc9683e6d7
--- /dev/null
+++ b/libs/surfaces/tranzport/wheel.cc
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2006 Paul Davis
+ * Copyright (C) 2007 Michael Taht
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * */
+
+#include <iostream>
+#include <algorithm>
+#include <cmath>
+
+#define __STDC_FORMAT_MACROS
+#include <inttypes.h>
+#include <float.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <ardour/route.h>
+#include <ardour/audio_track.h>
+#include <ardour/session.h>
+#include <ardour/location.h>
+#include <ardour/dB.h>
+
+using namespace ARDOUR;
+using namespace std;
+using namespace sigc;
+using namespace PBD;
+
+#include "i18n.h"
+
+#include <pbd/abstract_ui.cc>
+
+BaseUI::RequestType LEDChange = BaseUI::new_request_type ();
+BaseUI::RequestType Print = BaseUI::new_request_type ();
+BaseUI::RequestType SetCurrentTrack = BaseUI::new_request_type ();
+
+
+#include <tranzport_control_protocol.h>
+
+void
+TranzportControlProtocol::datawheel ()
+{
+ if ((buttonmask & ButtonTrackRight) || (buttonmask & ButtonTrackLeft)) {
+
+ /* track scrolling */
+
+ if (_datawheel < WheelDirectionThreshold) {
+ next_track ();
+ } else {
+ prev_track ();
+ }
+
+ timerclear (&last_wheel_motion);
+
+ } else if ((buttonmask & ButtonPrev) || (buttonmask & ButtonNext)) {
+
+ if (_datawheel < WheelDirectionThreshold) {
+ next_marker ();
+ } else {
+ prev_marker ();
+ }
+
+ timerclear (&last_wheel_motion);
+
+ } else if (buttonmask & ButtonShift) {
+
+ /* parameter control */
+
+ if (route_table[0]) {
+ switch (wheel_shift_mode) {
+ case WheelShiftGain:
+ if (_datawheel < WheelDirectionThreshold) {
+ step_gain_up ();
+ } else {
+ step_gain_down ();
+ }
+ break;
+ case WheelShiftPan:
+ if (_datawheel < WheelDirectionThreshold) {
+ step_pan_right ();
+ } else {
+ step_pan_left ();
+ }
+ break;
+
+ case WheelShiftMarker:
+ break;
+
+ case WheelShiftMaster:
+ break;
+
+ }
+ }
+
+ timerclear (&last_wheel_motion);
+
+ } else {
+
+ switch (wheel_mode) {
+ case WheelTimeline:
+ scroll ();
+ break;
+
+ case WheelScrub:
+ scrub ();
+ break;
+
+ case WheelShuttle:
+ shuttle ();
+ break;
+ }
+ }
+}
+
+void
+TranzportControlProtocol::scroll ()
+{
+ float m = 1.0;
+ if (_datawheel < WheelDirectionThreshold) {
+ m = 1.0;
+ } else {
+ m = -1.0;
+ }
+ switch(wheel_increment) {
+ case WheelIncrScreen: ScrollTimeline (0.2*m); break;
+ case WheelIncrSlave:
+ case WheelIncrSample:
+ case WheelIncrBeat:
+ case WheelIncrBar:
+ case WheelIncrSecond:
+ case WheelIncrMinute:
+ default: break; // other modes unimplemented as yet
+ }
+}
+
+void
+TranzportControlProtocol::scrub ()
+{
+ float speed;
+ struct timeval now;
+ struct timeval delta;
+ int dir;
+
+ gettimeofday (&now, 0);
+
+ if (_datawheel < WheelDirectionThreshold) {
+ dir = 1;
+ } else {
+ dir = -1;
+ }
+
+ if (dir != last_wheel_dir) {
+ /* changed direction, start over */
+ speed = 0.1f;
+ } else {
+ if (timerisset (&last_wheel_motion)) {
+
+ timersub (&now, &last_wheel_motion, &delta);
+
+ /* 10 clicks per second => speed == 1.0 */
+
+ speed = 100000.0f / (delta.tv_sec * 1000000 + delta.tv_usec);
+
+ } else {
+
+ /* start at half-speed and see where we go from there */
+
+ speed = 0.5f;
+ }
+ }
+
+ last_wheel_motion = now;
+ last_wheel_dir = dir;
+
+ set_transport_speed (speed * dir);
+}
+
+void
+TranzportControlProtocol::shuttle ()
+{
+ if (_datawheel < WheelDirectionThreshold) {
+ if (session->transport_speed() < 0) {
+ session->request_transport_speed (1.0);
+ } else {
+ session->request_transport_speed (session->transport_speed() + 0.1);
+ }
+ } else {
+ if (session->transport_speed() > 0) {
+ session->request_transport_speed (-1.0);
+ } else {
+ session->request_transport_speed (session->transport_speed() - 0.1);
+ }
+ }
+}