summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Anderson <ardour@semiosix.com>2007-07-18 20:47:59 +0000
committerJohn Anderson <ardour@semiosix.com>2007-07-18 20:47:59 +0000
commit9d4e01efc823c564b287ab7d7cc275760d4ac1fa (patch)
tree0b9a7634c562afa9908867aa08ad12b6cdc180f0
parentbfb5ddedab95238a67964310f44290ba301471d0 (diff)
make sure marker_previous button can go past the previous marker if pressed twice, relatively quickly.
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2145 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--libs/surfaces/mackie/TODO2
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.cc20
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.h4
-rw-r--r--libs/surfaces/mackie/mackie_midi_builder.cc5
-rw-r--r--libs/surfaces/mackie/timer.h136
5 files changed, 164 insertions, 3 deletions
diff --git a/libs/surfaces/mackie/TODO b/libs/surfaces/mackie/TODO
index f552c4a74c..5e9f85225a 100644
--- a/libs/surfaces/mackie/TODO
+++ b/libs/surfaces/mackie/TODO
@@ -1,12 +1,12 @@
* alsa/sequencer ports unstable
* crash when mmc port set to mcu
+* remappable buttons
* how long can UI signal callbacks take to execute? What happens if they block?
where ENSURE_CORRECT_THREAD is a macro that is modelled on ENSURE_GUI_THREAD
if the handler is not called in the "correct thread", it will use a pseudo-RT-safe-enough technique to get the correct thread to recall "handler" later on, and return.
* jog with transport rolling doesn't work properly. My use of ScrollTimeline also doesn't work.
* make loop button sensitive to current transport state
-* make sure rew button can go past the previous if pressed twice, relatively quickly.
* finish button mapping. Only shifted buttons left for bcf.
* concurrency for bank switching? And make sure "old" events aren't sent to "new" faders
* TODOs in code
diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc
index 4a9121bb71..1ed4dac038 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.cc
+++ b/libs/surfaces/mackie/mackie_control_protocol.cc
@@ -1095,10 +1095,28 @@ void MackieControlProtocol::poll_automation()
LedState MackieControlProtocol::frm_left_press( Button & button )
{
// can use first_mark_before/after as well
+ unsigned long elapsed = _frm_left_last.restart();
+
Location * loc = session->locations()->first_location_before (
session->transport_frame()
);
- if ( loc != 0 ) session->request_locate( loc->start(), session->transport_rolling() );
+
+ // allow a quick double to go past a previous mark
+ if ( elapsed < 500 && loc != 0)
+ {
+ Location * loc_two_back = session->locations()->first_location_before ( loc->start() );
+ if ( loc_two_back != 0 )
+ {
+ loc = loc_two_back;
+ }
+ }
+
+ // move to the location, if it's valid
+ if ( loc != 0 )
+ {
+ session->request_locate( loc->start(), session->transport_rolling() );
+ }
+
return on;
}
diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h
index de44075262..e1b3fb5b4e 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.h
+++ b/libs/surfaces/mackie/mackie_control_protocol.h
@@ -35,6 +35,7 @@
#include "route_signal.h"
#include "mackie_button_handler.h"
#include "mackie_port.h"
+#include "timer.h"
namespace MIDI {
class Port;
@@ -314,6 +315,9 @@ class MackieControlProtocol
int nfds;
bool _transport_previously_rolling;
+
+ // timer for two quick marker left presses
+ Mackie::Timer _frm_left_last;
};
#endif // ardour_mackie_control_protocol_h
diff --git a/libs/surfaces/mackie/mackie_midi_builder.cc b/libs/surfaces/mackie/mackie_midi_builder.cc
index a02126d059..801e0cfc7c 100644
--- a/libs/surfaces/mackie/mackie_midi_builder.cc
+++ b/libs/surfaces/mackie/mackie_midi_builder.cc
@@ -191,8 +191,11 @@ MidiByteArray MackieMidiBuilder::strip_display( unsigned int strip_index, unsign
retval << 0x12;
// offset (0 to 0x37 first line, 0x38 to 0x6f for second line )
retval << ( strip_index * 7 + ( line_number * 0x38 ) );
+ // ascii data to display
retval << line;
- if ( strip_index != 7 )
+
+ // column spacer, unless it's the right-hand column
+ if ( strip_index < 7 )
{
retval << ' ';
}
diff --git a/libs/surfaces/mackie/timer.h b/libs/surfaces/mackie/timer.h
new file mode 100644
index 0000000000..736e81baef
--- /dev/null
+++ b/libs/surfaces/mackie/timer.h
@@ -0,0 +1,136 @@
+/*
+Copyright (C) 1998, 1999, 2000, 2007 John Anderson
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library 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 Library 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 timer_h
+#define timer_h
+
+#ifdef _WIN32
+#include "windows.h"
+#else
+#include <sys/time.h>
+#endif
+
+namespace Mackie
+{
+
+/**
+ millisecond timer class.
+*/
+class Timer
+{
+public:
+
+ /**
+ start the timer running if true, or just create the
+ object if false.
+ */
+ Timer( bool shouldStart = true )
+ {
+ if ( shouldStart )
+ start();
+ }
+
+ /**
+ Start the timer running. Return the current timestamp, in milliseconds
+ */
+ unsigned long start()
+ {
+#ifdef _WIN32
+ _start = (unsigned long)::GetTickCount();
+#else
+ gettimeofday ( &_start, 0 );
+#endif
+ running = true;
+#ifdef _WIN32
+ return _start;
+#else
+ return ( _start.tv_sec * 1000000 + _start.tv_usec ) / 1000;
+#endif
+ }
+
+ /**
+ returns the number of milliseconds since start
+ also stops the timer running
+ */
+ unsigned long stop()
+ {
+#ifdef _WIN32
+ _stop = (unsigned long)::GetTickCount();
+#else
+ gettimeofday ( &_stop, 0 );
+#endif
+ running = false;
+ return elapsed();
+ }
+
+ /**
+ returns the number of milliseconds since start
+ */
+ unsigned long elapsed() const
+ {
+ if ( running )
+ {
+#ifdef _WIN32
+ DWORD current = ::GetTickCount();
+ return current - _start;
+#else
+ struct timeval current;
+ gettimeofday ( &current, 0 );
+ return (
+ ( current.tv_sec * 1000000 + current.tv_usec ) - ( _start.tv_sec * 1000000 + _start.tv_usec )
+ ) / 1000
+ ;
+#endif
+ }
+ else
+ {
+#ifdef _WIN32
+ return _stop - _start;
+#else
+ return (
+ ( _stop.tv_sec * 1000000 + _stop.tv_usec ) - ( _start.tv_sec * 1000000 + _start.tv_usec )
+ ) / 1000
+ ;
+#endif
+ }
+ }
+
+ /**
+ Call stop and then start. Return the value from stop.
+ */
+ unsigned long restart()
+ {
+ unsigned long retval = stop();
+ start();
+ return retval;
+ }
+
+private:
+#ifdef _WIN32
+ unsigned long _start;
+ unsigned long _stop;
+#else
+ struct timeval _start;
+ struct timeval _stop;
+#endif
+ bool running;
+};
+
+}
+
+#endif