Remove unused method in RouteTimeAxisView. Fix bug with switching to layered region...
[ardour.git] / libs / ardour / session_events.cc
index a72a2e58d46c5890038aaa803b182d7c4dc18626..d631eda710a8a0bd34d49e0baf7f78e0c1f5bef0 100644 (file)
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <cmath>
 #include <unistd.h>
 
-#include <ardour/timestamps.h>
+#include "ardour/timestamps.h"
 
-#include <pbd/error.h>
+#include "pbd/error.h"
 #include <glibmm/thread.h>
 
-#include <ardour/ardour.h>
-#include <ardour/session.h>
-#include <ardour/audio_diskstream.h>
+#include "ardour/ardour.h"
+#include "ardour/session.h"
+#include "ardour/audio_diskstream.h"
 
 #include "i18n.h"
 
+using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
@@ -42,6 +42,7 @@ static const char* event_names[] = {
        "SetDiskstreamSpeed",
        "Locate",
        "LocateRoll",
+       "LocateRollLocate",
        "SetLoop",
        "PunchIn",
        "PunchOut",
@@ -59,21 +60,21 @@ static const char* event_names[] = {
 };
 
 void
-Session::add_event (jack_nframes_t frame, Event::Type type, jack_nframes_t target_frame)
+Session::add_event (nframes_t frame, Event::Type type, nframes_t target_frame)
 {
        Event* ev = new Event (type, Event::Add, frame, target_frame, 0);
        queue_event (ev);
 }
 
 void
-Session::remove_event (jack_nframes_t frame, Event::Type type)
+Session::remove_event (nframes_t frame, Event::Type type)
 {
        Event* ev = new Event (type, Event::Remove, frame, 0, 0);
        queue_event (ev);
 }
 
 void
-Session::replace_event (Event::Type type, jack_nframes_t frame, jack_nframes_t target)
+Session::replace_event (Event::Type type, nframes_t frame, nframes_t target)
 {
        Event* ev = new Event (type, Event::Replace, frame, target, 0);
        queue_event (ev);
@@ -171,10 +172,10 @@ Session::merge_event (Event* ev)
        set_next_event ();
 }
 
+/** @return true when @a ev is deleted. */
 bool
 Session::_replace_event (Event* ev)
 {
-       // returns true when we deleted the passed in event
        bool ret = false;
        Events::iterator i;
 
@@ -203,10 +204,10 @@ Session::_replace_event (Event* ev)
        return ret;
 }
 
+/** @return true when @a ev is deleted. */
 bool
 Session::_remove_event (Session::Event* ev)
 {
-       // returns true when we deleted the passed in event
        bool ret = false;
        Events::iterator i;
        
@@ -305,11 +306,18 @@ Session::process_event (Event* ev)
        */
 
        if (non_realtime_work_pending()) {
-               immediate_events.insert (immediate_events.end(), ev);
-               _remove_event (ev);
-               return;
+               
+               /* except locates, which we have the capability to handle */
+
+               if (ev->type != Event::Locate) {
+                       immediate_events.insert (immediate_events.end(), ev);
+                       _remove_event (ev);
+                       return;
+               }
        }
 
+       //printf("Processing event: %s\n", event_names[ev->type]);
+
        switch (ev->type) {
        case Event::SetLoop:
                set_play_loop (ev->yes_or_no);
@@ -331,6 +339,7 @@ Session::process_event (Event* ev)
                        // cerr << "soft locate to " << ev->target_frame << endl;
                        start_locate (ev->target_frame, false, true, false);
                }
+               _send_smpte_update = true;
                break;
 
        case Event::LocateRoll:
@@ -341,15 +350,23 @@ Session::process_event (Event* ev)
                        // cerr << "soft locate to+roll " << ev->target_frame << endl;
                        start_locate (ev->target_frame, true, true, false);
                }
+               _send_smpte_update = true;
+               break;
+
+       case Event::LocateRollLocate:
+               // locate is handled by ::request_roll_at_and_return()
+               _requested_return_frame = ev->target_frame;
+               request_locate (ev->target2_frame, true);
                break;
 
+
        case Event::SetTransportSpeed:
                set_transport_speed (ev->speed, ev->yes_or_no);
                break;
                
        case Event::PunchIn:
                // cerr << "PunchIN at " << transport_frame() << endl;
-               if (Config->get_punch_in() && record_status() == Enabled) {
+               if (config.get_punch_in() && record_status() == Enabled) {
                        enable_record ();
                }
                remove = false;
@@ -358,7 +375,7 @@ Session::process_event (Event* ev)
                
        case Event::PunchOut:
                // cerr << "PunchOUT at " << transport_frame() << endl;
-               if (Config->get_punch_out()) {
+               if (config.get_punch_out()) {
                        step_back_from_record ();
                }
                remove = false;
@@ -389,11 +406,11 @@ Session::process_event (Event* ev)
                break;
 
        case Event::Overwrite:
-               overwrite_some_buffers (static_cast<AudioDiskstream*>(ev->ptr));
+               overwrite_some_buffers (static_cast<Diskstream*>(ev->ptr));
                break;
 
        case Event::SetDiskstreamSpeed:
-               set_diskstream_speed (static_cast<AudioDiskstream*> (ev->ptr), ev->speed);
+               set_diskstream_speed (static_cast<Diskstream*> (ev->ptr), ev->speed);
                break;
 
        case Event::SetSlaveSource:
@@ -402,6 +419,8 @@ Session::process_event (Event* ev)
 
        case Event::Audition:
                set_audition (ev->region);
+               // drop reference to region
+               ev->region.reset ();
                break;
 
        case Event::InputConfigurationChange: