update surface when remote ids change
authorJohn Anderson <ardour@semiosix.com>
Tue, 20 Feb 2007 10:42:50 +0000 (10:42 +0000)
committerJohn Anderson <ardour@semiosix.com>
Tue, 20 Feb 2007 10:42:50 +0000 (10:42 +0000)
git-svn-id: svn://localhost/ardour2/trunk@1479 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/surfaces/mackie/TODO
libs/surfaces/mackie/mackie_control_protocol.cc
libs/surfaces/mackie/mackie_control_protocol.h
libs/surfaces/mackie/mackie_control_protocol_poll.cc

index a4e7316b18127b6a1d91070a9619f129014f5adf..a61b43f605abbd90e2cfff9769dae73deaf668d7 100644 (file)
@@ -1,21 +1,22 @@
 * 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.
-  
+
+* automation feedback not working
 * finish button mapping
 * discuss button mapping for Ardour
 * concurrency for bank switching? And make sure "old" events aren't sent to "new" faders
 * concurrency in write( bytes ). Queueing?
 * TODOs in code
-* handle remote_control_id changed signal from Route.
-* handle removal of route. Need another session signal?
+* removal of a route results in a strip that isn't dead, but doesn't have any effect on the session
+* bulk remote id changes cause too many surface updates
 * use i18n. see string_compose
 * MackieControlProtocol in namespace Mackie?
 * Generic surface code to common location
 * power-cycling of surface. fd_midiport doesn't close.
 * remove couts
 * jog with transport rolling doesn't work properly. My use of ScrollTimeline also doesn't work.
-* docs in manual
+* docs in manual, including button assignment diagram
 
 Later
 -----
index 2c487103f17dc8b6f9ddf729febcf66eb9bca3ec..476391585417e70e5e70e006ca981cc1611fcaaa 100644 (file)
@@ -260,7 +260,7 @@ void MackieControlProtocol::switch_banks( int initial )
                uint32_t end_pos = min( route_table.size(), sorted.size() );
                Sorted::iterator it = sorted.begin() + _current_initial_bank;
                Sorted::iterator end = sorted.begin() + _current_initial_bank + end_pos;
-               cout << "switch to " << _current_initial_bank << ", " << end_pos << endl;
+               //cout << "switch to " << _current_initial_bank << ", " << end_pos << endl;
                
                // link routes to strips
                uint32_t i = 0;
@@ -268,7 +268,7 @@ void MackieControlProtocol::switch_banks( int initial )
                {
                        boost::shared_ptr<Route> route = *it;
                        Strip & strip = *surface().strips[i];
-                       cout << "remote id " << route->remote_control_id() << " connecting " << route->name() << " to " << strip.name() << " with port " << port_for_id(i) << endl;
+                       //cout << "remote id " << route->remote_control_id() << " connecting " << route->name() << " to " << strip.name() << " with port " << port_for_id(i) << endl;
                        route_table[i] = route;
                        RouteSignal * rs = new RouteSignal( *route, *this, strip, port_for_id(i) );
                        route_signals.push_back( rs );
@@ -521,6 +521,14 @@ void MackieControlProtocol::connect_session_signals()
        connections_back = Config->ParameterChanged.connect( ( mem_fun (*this, &MackieControlProtocol::notify_parameter_changed) ) );
        // receive rude solo changed
        connections_back = session->SoloActive.connect( ( mem_fun (*this, &MackieControlProtocol::notify_solo_active_changed) ) );
+       
+       // make sure remote id changed signals reach here
+       // see also notify_route_added
+       Sorted sorted = get_sorted_routes();
+       for ( Sorted::iterator it = sorted.begin(); it != sorted.end(); ++it )
+       {
+               (*it)->RemoteControlIDChanged.connect( ( mem_fun (*this, &MackieControlProtocol::notify_remote_id_changed) ) );
+       }
 }
 
 void MackieControlProtocol::add_port( MIDI::Port & midi_port, int number )
@@ -1128,6 +1136,13 @@ void MackieControlProtocol::notify_route_added( ARDOUR::Session::RouteList & rl
                refresh_current_bank();
        }
        // otherwise route added, but current bank needs no updating
+       
+       // make sure remote id changes in the new route are handled
+       typedef ARDOUR::Session::RouteList ARS;
+       for ( ARS::iterator it = rl.begin(); it != rl.end(); ++it )
+       {
+               (*it)->RemoteControlIDChanged.connect( ( mem_fun (*this, &MackieControlProtocol::notify_remote_id_changed) ) );
+       }
 }
 
 void MackieControlProtocol::notify_solo_active_changed( bool active )
@@ -1136,6 +1151,24 @@ void MackieControlProtocol::notify_solo_active_changed( bool active )
        mcu_port().write( builder.build_led( *rude_solo, active ? flashing : off ) );
 }
 
+void MackieControlProtocol::notify_remote_id_changed()
+{
+       Sorted sorted = get_sorted_routes();
+       
+       // if a remote id has been moved off the end, we need to shift
+       // the current bank backwards.
+       if ( sorted.size() - _current_initial_bank < route_signals.size() )
+       {
+               // but don't shift backwards past the zeroth channel
+               switch_banks( max( (unsigned int)0, sorted.size() - route_signals.size() ) );
+       }
+       // Otherwise just refresh the current bank
+       else
+       {
+               refresh_current_bank();
+       }
+}
+
 ///////////////////////////////////////////
 // Transport signals
 ///////////////////////////////////////////
index 4116264c56ddde7025d479e0c66da8c4e0131620..9f78c83cbaf989d468c32455a9e7153e770acfdd 100644 (file)
@@ -101,7 +101,9 @@ class MackieControlProtocol
        /// Signal handler for new routes added
        void notify_route_added( ARDOUR::Session::RouteList & );
 
-   /// rebuild the current bank. Called on route added/removed and
+       void notify_remote_id_changed();
+
+       /// rebuild the current bank. Called on route added/removed and
    /// remote id changed.
        void refresh_current_bank();
 
index 047620ca41bf4bc68305a0c0362d2c3305c39cbd..859b67c17dd91966df56ddc3f21488e943b7497c 100644 (file)
@@ -65,6 +65,8 @@ void * MackieControlProtocol::monitor_work()
                        try { read_ports(); }
                        catch ( exception & e ) {
                                cout << "MackieControlProtocol::poll_ports caught exception: " << e.what() << endl;
+                               _ports_changed = true;
+                               update_ports();
                        }
                }
                // provide a cancellation point
@@ -129,7 +131,7 @@ void MackieControlProtocol::read_ports()
 bool MackieControlProtocol::poll_ports()
 {
        int timeout = 10; // milliseconds
-       int no_ports_sleep = 10; // milliseconds
+       int no_ports_sleep = 1000; // milliseconds
 
        Glib::Mutex::Lock lock( update_mutex );
        // if there are no ports