From 9d4e01efc823c564b287ab7d7cc275760d4ac1fa Mon Sep 17 00:00:00 2001 From: John Anderson Date: Wed, 18 Jul 2007 20:47:59 +0000 Subject: 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 --- libs/surfaces/mackie/TODO | 2 +- libs/surfaces/mackie/mackie_control_protocol.cc | 20 +++- libs/surfaces/mackie/mackie_control_protocol.h | 4 + libs/surfaces/mackie/mackie_midi_builder.cc | 5 +- libs/surfaces/mackie/timer.h | 136 ++++++++++++++++++++++++ 5 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 libs/surfaces/mackie/timer.h 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 +#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 ( ¤t, 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 -- cgit v1.2.3