monster commit: transport mgmt changes from 2.X (omnibus edition); make slave use...
[ardour.git] / libs / ardour / session_events.cc
index aa5a1b87d4e5f6fab7302cdb800539715ddbc8a7..fb993faa68ff6032635e2ae53c86d95e070aa7dc 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 1999-2004 Paul Davis 
+    Copyright (C) 1999-2004 Paul Davis
 
     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
 #include <cmath>
 #include <unistd.h>
 
-#include <ardour/timestamps.h>
+#include "ardour/timestamps.h"
 
-#include <pbd/error.h>
+#include "pbd/error.h"
+#include "pbd/enumwriter.h"
 #include <glibmm/thread.h>
 
-#include <ardour/ardour.h>
-#include <ardour/session.h>
-#include <ardour/audio_diskstream.h>
+#include "ardour/ardour.h"
+#include "ardour/audio_diskstream.h"
+#include "ardour/butler.h"
+#include "ardour/session.h"
 
 #include "i18n.h"
 
+using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
 MultiAllocSingleReleasePool Session::Event::pool ("event", sizeof (Session::Event), 512);
 
-static const char* event_names[] = {
-       "SetTransportSpeed",
-       "SetDiskstreamSpeed",
-       "Locate",
-       "LocateRoll",
-       "SetLoop",
-       "PunchIn",
-       "PunchOut",
-       "RangeStop",
-       "RangeLocate",
-       "Overwrite",
-       "SetSlaveSource",
-       "Audition",
-       "InputConfigurationChange",
-       "SetAudioRange",
-       "SetMusicRange",
-       "SetPlayRange",
-       "StopOnce",
-       "AutoLoop"
-};
-
 void
 Session::add_event (nframes_t frame, Event::Type type, nframes_t target_frame)
 {
@@ -98,8 +80,8 @@ Session::dump_events () const
         if ((Events::const_iterator) next_event == events.end()) {
                cerr << "none" << endl;
        } else {
-               cerr << "at " << (*next_event)->action_frame << ' ' 
-                    << (*next_event)->type << " target = " 
+               cerr << "at " << (*next_event)->action_frame << ' '
+                    << (*next_event)->type << " target = "
                     << (*next_event)->target_frame << endl;
        }
        cerr << "Immediate events pending:\n";
@@ -136,7 +118,7 @@ Session::merge_event (Event* ev)
                _clear_event_type (ev->type);
                delete ev;
                return;
-               
+
        case Event::Add:
                break;
        }
@@ -147,7 +129,7 @@ Session::merge_event (Event* ev)
                process_event (ev);
                return;
        }
-       
+
        switch (ev->type) {
        case Event::AutoLoop:
        case Event::StopOnce:
@@ -157,8 +139,8 @@ Session::merge_event (Event* ev)
        default:
                for (Events::iterator i = events.begin(); i != events.end(); ++i) {
                        if ((*i)->type == ev->type && (*i)->action_frame == ev->action_frame) {
-                         error << string_compose(_("Session: cannot have two events of type %1 at the same frame (%2)."), 
-                                                event_names[ev->type], ev->action_frame) << endmsg;
+                         error << string_compose(_("Session: cannot have two events of type %1 at the same frame (%2)."),
+                                                 enum_2_string (ev->type), ev->action_frame) << endmsg;
                                return;
                        }
                }
@@ -208,7 +190,7 @@ Session::_remove_event (Session::Event* ev)
 {
        bool ret = false;
        Events::iterator i;
-       
+
        for (i = events.begin(); i != events.end(); ++i) {
                if ((*i)->type == ev->type && (*i)->action_frame == ev->action_frame) {
                        if ((*i) == ev) {
@@ -235,7 +217,7 @@ void
 Session::_clear_event_type (Event::Type type)
 {
        Events::iterator i, tmp;
-       
+
        for (i = events.begin(); i != events.end(); ) {
 
                tmp = i;
@@ -274,7 +256,7 @@ Session::set_next_event ()
        if (events.empty()) {
                next_event = events.end();
                return;
-       } 
+       }
 
        if (next_event == events.end()) {
                next_event = events.begin();
@@ -304,7 +286,7 @@ Session::process_event (Event* ev)
        */
 
        if (non_realtime_work_pending()) {
-               
+
                /* except locates, which we have the capability to handle */
 
                if (ev->type != Event::Locate) {
@@ -337,7 +319,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;
+               _send_timecode_update = true;
                break;
 
        case Event::LocateRoll:
@@ -348,25 +330,32 @@ 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;
+               _send_timecode_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);
+               set_transport_speed (ev->speed, ev->yes_or_no, ev->second_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;
                del = false;
                break;
-               
+
        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,7 +378,7 @@ Session::process_event (Event* ev)
                remove = false;
                del = false;
                break;
-               
+
        case Event::RangeLocate:
                start_locate (ev->target_frame, true, true, false);
                remove = false;
@@ -397,7 +386,7 @@ 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:
@@ -415,17 +404,12 @@ Session::process_event (Event* ev)
                break;
 
        case Event::InputConfigurationChange:
-               post_transport_work = PostTransportWork (post_transport_work | PostTransportInputChange);
-               schedule_butler_transport_work ();
-               break;
-
-       case Event::SetAudioRange:
-               current_audio_range = ev->audio_range;
-               setup_auto_play ();
+               add_post_transport_work (PostTransportInputChange);
+               _butler->schedule_transport_work ();
                break;
 
-       case Event::SetPlayRange:
-               set_play_range (ev->yes_or_no);
+       case Event::SetPlayAudioRange:
+               set_play_range (ev->audio_range, (ev->speed == 1.0f));
                break;
 
        default: