remove messages when tempo map is not available in RT context
[ardour.git] / libs / ardour / session_process.cc
index f0d2bcaa84e98cbb84d8c01ed053bd4487a4b92e..4876dc7931249953db79fe9b2c5047a3ae642da0 100644 (file)
@@ -38,6 +38,7 @@
 #include "ardour/timestamps.h"
 #include "ardour/graph.h"
 #include "ardour/audio_port.h"
+#include "ardour/tempo.h"
 
 #include "midi++/manager.h"
 #include "midi++/mmc.h"
@@ -79,10 +80,14 @@ Session::process (pframes_t nframes)
        // the ticker is for sending time information like MidiClock
        framepos_t transport_frames = transport_frame();
        Timecode::BBT_Time transport_bbt;
-       bbt_time(transport_frames, transport_bbt);
-       Timecode::Time transport_timecode;
-       timecode_time(transport_frames, transport_timecode);
-       tick (transport_frames, transport_bbt, transport_timecode); /* EMIT SIGNAL */
+       try {
+               _tempo_map->bbt_time_rt (transport_frames, transport_bbt);
+               Timecode::Time transport_timecode;
+               timecode_time(transport_frames, transport_timecode);
+               tick (transport_frames, transport_bbt, transport_timecode); /* EMIT SIGNAL */
+       } catch (...) {
+               /* don't bother with a message */
+       }
 
        SendFeedback (); /* EMIT SIGNAL */
 
@@ -107,9 +112,9 @@ Session::no_roll (pframes_t nframes)
                _click_io->silence (nframes);
        }
 
-       if (route_graph->threads_in_use() > 0) {
+       if (_process_graph->threads_in_use() > 0) {
                DEBUG_TRACE(DEBUG::ProcessThreads,"calling graph/no-roll\n");
-               route_graph->routes_no_roll( nframes, _transport_frame, end_frame, non_realtime_work_pending(), actively_recording(), declick);
+               _process_graph->routes_no_roll( nframes, _transport_frame, end_frame, non_realtime_work_pending(), declick);
        } else {
                for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
 
@@ -119,8 +124,7 @@ Session::no_roll (pframes_t nframes)
 
                        (*i)->set_pending_declick (declick);
 
-                       if ((*i)->no_roll (nframes, _transport_frame, end_frame, non_realtime_work_pending(),
-                                          actively_recording())) {
+                       if ((*i)->no_roll (nframes, _transport_frame, end_frame, non_realtime_work_pending())) {
                                error << string_compose(_("Session: error in no roll for %1"), (*i)->name()) << endmsg;
                                ret = -1;
                                break;
@@ -134,9 +138,7 @@ Session::no_roll (pframes_t nframes)
 int
 Session::process_routes (pframes_t nframes, bool& need_butler)
 {
-       bool record_active;
        int  declick = get_transport_declick_required();
-       bool rec_monitors = get_rec_monitors_input();
        boost::shared_ptr<RouteList> r = routes.reader ();
 
        if (transport_sub_state & StopPendingCapture) {
@@ -144,8 +146,6 @@ Session::process_routes (pframes_t nframes, bool& need_butler)
                declick = -1;
        }
 
-       record_active = actively_recording(); // || (get_record_enabled() && get_punch_in());
-
        const framepos_t start_frame = _transport_frame;
        const framepos_t end_frame = _transport_frame + floor (nframes * _transport_speed);
 
@@ -153,9 +153,9 @@ Session::process_routes (pframes_t nframes, bool& need_butler)
           using 1 thread. its needed because otherwise when we remove
           tracks, the graph never gets updated.
        */
-       if (1 || route_graph->threads_in_use() > 0) {
+       if (1 || _process_graph->threads_in_use() > 0) {
                DEBUG_TRACE(DEBUG::ProcessThreads,"calling graph/process-routes\n");
-               route_graph->process_routes( nframes, start_frame, end_frame, declick, record_active, rec_monitors, need_butler);
+               _process_graph->process_routes (nframes, start_frame, end_frame, declick, need_butler);
        } else {
 
                for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
@@ -168,7 +168,7 @@ Session::process_routes (pframes_t nframes, bool& need_butler)
 
                        (*i)->set_pending_declick (declick);
 
-                       if ((ret = (*i)->roll (nframes, start_frame, end_frame, declick, record_active, rec_monitors, need_butler)) < 0) {
+                       if ((ret = (*i)->roll (nframes, start_frame, end_frame, declick, need_butler)) < 0) {
                                stop_transport ();
                                return -1;
                        }
@@ -181,8 +181,6 @@ Session::process_routes (pframes_t nframes, bool& need_butler)
 int
 Session::silent_process_routes (pframes_t nframes, bool& need_butler)
 {
-       bool record_active = actively_recording();
-       bool rec_monitors = get_rec_monitors_input();
        boost::shared_ptr<RouteList> r = routes.reader ();
 
        const framepos_t start_frame = _transport_frame;
@@ -192,8 +190,8 @@ Session::silent_process_routes (pframes_t nframes, bool& need_butler)
           using 1 thread. its needed because otherwise when we remove
           tracks, the graph never gets updated.
        */
-       if (1 || route_graph->threads_in_use() > 0) {
-               route_graph->silent_process_routes( nframes, start_frame, end_frame, record_active, rec_monitors, need_butler);
+       if (1 || _process_graph->threads_in_use() > 0) {
+               _process_graph->silent_process_routes (nframes, start_frame, end_frame, need_butler);
        } else {
                for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
 
@@ -203,7 +201,7 @@ Session::silent_process_routes (pframes_t nframes, bool& need_butler)
                                continue;
                        }
 
-                       if ((ret = (*i)->silent_roll (nframes, start_frame, end_frame, record_active, rec_monitors, need_butler)) < 0) {
+                       if ((ret = (*i)->silent_roll (nframes, start_frame, end_frame, need_butler)) < 0) {
                                stop_transport ();
                                return -1;
                        }
@@ -619,7 +617,7 @@ Session::calculate_moving_average_of_slave_delta (int dir, framecnt_t this_delta
 }
 
 void
-Session::track_slave_state (float slave_speed, framepos_t slave_transport_frame, framecnt_t this_delta)
+Session::track_slave_state (float slave_speed, framepos_t slave_transport_frame, framecnt_t /*this_delta*/)
 {
        if (slave_speed != 0.0f) {
 
@@ -1140,11 +1138,23 @@ Session::process_event (SessionEvent* ev)
 framepos_t
 Session::compute_stop_limit () const
 {
-       bool const punching = (config.get_punch_in () && _locations->auto_punch_location());
-
-       if (!actively_recording() && !punching && Config->get_stop_at_session_end()) {
-               return current_end_frame ();
+       if (!Config->get_stop_at_session_end ()) {
+               return max_framepos;
+       }
+       
+       bool const punching_in = (config.get_punch_in () && _locations->auto_punch_location());
+       bool const punching_out = (config.get_punch_out () && _locations->auto_punch_location());
+
+       if (actively_recording ()) {
+               /* permanently recording */
+               return max_framepos;
+       } else if (punching_in && !punching_out) {
+               /* punching in but never out */
+               return max_framepos;
+       } else if (punching_in && punching_out && _locations->auto_punch_location()->end() > current_end_frame()) {
+               /* punching in and punching out after session end */
+               return max_framepos;
        }
 
-       return max_framepos;
+       return current_end_frame ();
 }