summaryrefslogtreecommitdiff
path: root/libs/ardour/session_process.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2019-03-14 01:11:10 +0100
committerRobin Gareus <robin@gareus.org>2019-03-14 01:11:10 +0100
commit41e0255b974532f1eacbad7f4664ba9a12be3aba (patch)
tree81dea341d23881036c975b8a2257238c8f4c9d66 /libs/ardour/session_process.cc
parent871bd6e0f3df67c6a7248116776bd041fad1ca85 (diff)
Unused skeleton of the transport state-machine
Simple test/example code. Eventually this is to replace Session::process_event() and Session::realtime_*() methods are to become transition actions.
Diffstat (limited to 'libs/ardour/session_process.cc')
-rw-r--r--libs/ardour/session_process.cc87
1 files changed, 87 insertions, 0 deletions
diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc
index 1046218054..319634499b 100644
--- a/libs/ardour/session_process.cc
+++ b/libs/ardour/session_process.cc
@@ -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.
*/