Amend 883ee9c2, setup required invisible processor
[ardour.git] / libs / ardour / session_process.cc
index af86e2163260edf45ad43d7d0fcce9f2967aa3cf..319634499b274f631b71b4777d47261bf6839afb 100644 (file)
@@ -22,6 +22,9 @@
 #include <algorithm>
 #include <unistd.h>
 
+#include <boost/msm/back/state_machine.hpp>
+#include <boost/msm/front/state_machine_def.hpp>
+
 #include "pbd/error.h"
 #include "pbd/enumwriter.h"
 
@@ -53,6 +56,90 @@ using namespace ARDOUR;
 using namespace PBD;
 using namespace std;
 
+/* state machine */
+namespace msm = boost::msm;
+namespace mpl = boost::mpl;
+
+namespace TransportState
+{
+       /* events */
+       struct play {};
+       struct stop {};
+
+       /* front-end: define the FSM structure  */
+       struct TransportFSM : public msm::front::state_machine_def<TransportFSM>
+       {
+
+               /* FSM states */
+               struct Stopped : public msm::front::state<>
+               {
+                       template <class Event,class FSM> void
+                               on_entry (Event const&, FSM&)
+                               {
+                                       std::cout << "entering: Stopped" << std::endl;
+                               }
+                       template <class Event,class FSM> void
+                               on_exit (Event const&, FSM&)
+                               {
+                                       std::cout << "leaving: Stopped" << std::endl;
+                               }
+               };
+
+               struct Playing : public msm::front::state<>
+               {
+                       template <class Event,class FSM> void
+                               on_entry (Event const&, FSM&)
+                               {
+                                       std::cout << "entering: Playing" << std::endl;
+                               }
+
+                       template <class Event,class FSM> void
+                               on_exit (Event const&, FSM&)
+                               {
+                                       std::cout << "leaving: Playing" << std::endl;
+                               }
+               };
+
+               /* the initial state */
+               typedef Stopped initial_state;
+
+               /* transition actions */
+               void start_playback (play const&)
+               {
+                       std::cout << "player::start_playback\n";
+               }
+
+               void stop_playback (stop const&)
+               {
+                       std::cout << "player::stop_playback\n";
+               }
+
+               typedef TransportFSM _t; // makes transition table cleaner
+
+               struct transition_table : mpl::vector<
+                       //      Start     Event         Next      Action                                 Guard
+                       //    +---------+-------------+---------+---------------------+----------------------+
+                       a_row < Stopped , play        , Playing , &_t::start_playback                        >,
+                        _row < Stopped , stop        , Stopped                                              >,
+                       //    +---------+-------------+---------+---------------------+----------------------+
+                       a_row < Playing , stop        , Stopped , &_t::stop_playback                         >
+                       //    +---------+-------------+---------+---------------------+----------------------+
+                       > {};
+       };
+
+       typedef msm::back::state_machine<TransportFSM> transport_fsm;
+
+       void test()
+       {
+               transport_fsm t;
+               t.start ();
+               t.process_event (play());
+               t.process_event (stop());
+               t.stop();
+       }
+
+};
+
 /** Called by the audio engine when there is work to be done with JACK.
  * @param nframes Number of samples to process.
  */
@@ -447,6 +534,7 @@ Session::process_with_events (pframes_t nframes)
        assert (_transport_speed == 0 || _transport_speed == 1.0 || _transport_speed == -1.0);
 
        samples_moved = (samplecnt_t) nframes * _transport_speed;
+       DEBUG_TRACE (DEBUG::Transport, string_compose ("plan to move transport by %1 (%2 @ %3)\n", samples_moved, nframes, _transport_speed));
 
        end_sample = _transport_sample + samples_moved;
 
@@ -496,11 +584,13 @@ Session::process_with_events (pframes_t nframes)
 
                        this_nframes = nframes; /* real (jack) time relative */
                        samples_moved = (samplecnt_t) floor (_transport_speed * nframes); /* transport relative */
+                       DEBUG_TRACE (DEBUG::Transport, string_compose ("sub-loop plan to move transport by %1 (%2 @ %3)\n", samples_moved, nframes, _transport_speed));
 
                        /* running an event, position transport precisely to its time */
                        if (this_event && this_event->action_sample <= end_sample && this_event->action_sample >= _transport_sample) {
                                /* this isn't quite right for reverse play */
                                samples_moved = (samplecnt_t) (this_event->action_sample - _transport_sample);
+                               DEBUG_TRACE (DEBUG::Transport, string_compose ("sub-loop2 plan to move transport by %1 (%2 @ %3)\n", samples_moved, nframes, _transport_speed));
                                this_nframes = abs (floor(samples_moved / _transport_speed));
                        }
 
@@ -521,8 +611,12 @@ Session::process_with_events (pframes_t nframes)
 
                                if (samples_moved < 0) {
                                        decrement_transport_position (-samples_moved);
+                                       DEBUG_TRACE (DEBUG::Transport, string_compose ("DEcrement transport by %1 to %2\n", samples_moved, _transport_sample));
                                } else if (samples_moved) {
                                        increment_transport_position (samples_moved);
+                                       DEBUG_TRACE (DEBUG::Transport, string_compose ("INcrement transport by %1 to %2\n", samples_moved, _transport_sample));
+                               } else {
+                                       DEBUG_TRACE (DEBUG::Transport, "no transport motion\n");
                                }
 
                                maybe_stop (stop_limit);
@@ -601,6 +695,7 @@ Session::process_without_events (pframes_t nframes)
                return;
        } else {
                samples_moved = (samplecnt_t) nframes * _transport_speed;
+               DEBUG_TRACE (DEBUG::Transport, string_compose ("no-events, plan to move transport by %1 (%2 @ %3)\n", samples_moved, nframes, _transport_speed));
        }
 
        if (!_exporting && !timecode_transmission_suspended()) {
@@ -631,8 +726,12 @@ Session::process_without_events (pframes_t nframes)
 
        if (samples_moved < 0) {
                decrement_transport_position (-samples_moved);
+               DEBUG_TRACE (DEBUG::Transport, string_compose ("DEcrement transport by %1 to %2\n", samples_moved, _transport_sample));
        } else if (samples_moved) {
                increment_transport_position (samples_moved);
+               DEBUG_TRACE (DEBUG::Transport, string_compose ("INcrement transport by %1 to %2\n", samples_moved, _transport_sample));
+       } else {
+               DEBUG_TRACE (DEBUG::Transport, "no transport motion\n");
        }
 
        maybe_stop (stop_limit);
@@ -1142,7 +1241,7 @@ Session::track_transport_master (float slave_speed, samplepos_t slave_transport_
 
                if (transport_master_tracking_state == Waiting) {
 
-                       DEBUG_TRACE (DEBUG::Slave, string_compose ("slave waiting at %1\n", slave_transport_sample));
+                       DEBUG_TRACE (DEBUG::Slave, string_compose ("master currently at %1, waiting to pass %2\n", slave_transport_sample, master_wait_end));
 
                        if (slave_transport_sample >= master_wait_end) {