diff options
Diffstat (limited to 'src/engine/machina')
-rw-r--r-- | src/engine/machina/Action.hpp | 9 | ||||
-rw-r--r-- | src/engine/machina/Engine.hpp | 1 | ||||
-rw-r--r-- | src/engine/machina/JackDriver.hpp | 8 | ||||
-rw-r--r-- | src/engine/machina/Machine.hpp | 13 | ||||
-rw-r--r-- | src/engine/machina/MidiAction.hpp | 10 | ||||
-rw-r--r-- | src/engine/machina/MidiDriver.hpp | 6 | ||||
-rw-r--r-- | src/engine/machina/Node.hpp | 6 |
7 files changed, 30 insertions, 23 deletions
diff --git a/src/engine/machina/Action.hpp b/src/engine/machina/Action.hpp index 16c9b58..9ea106a 100644 --- a/src/engine/machina/Action.hpp +++ b/src/engine/machina/Action.hpp @@ -20,18 +20,21 @@ #include <string> #include <iostream> -#include <raul/Deletable.h> +#include <raul/MIDISink.h> #include <raul/TimeSlice.h> #include <raul/Stateful.h> +#include <raul/SharedPtr.h> #include "types.hpp" namespace Machina { +class MidiDriver; + /** An Action, executed on entering or exiting of a state. */ struct Action : public Raul::Deletable, public Raul::Stateful { - virtual void execute(Raul::BeatTime /*time*/) {} + virtual void execute(SharedPtr<Raul::MIDISink> sink, Raul::BeatTime time) = 0; virtual void write_state(Raul::RDFWriter& writer); }; @@ -41,7 +44,7 @@ class PrintAction : public Action { public: PrintAction(const std::string& msg) : _msg(msg) {} - void execute(Raul::BeatTime time) + void execute(SharedPtr<Raul::MIDISink>, Raul::BeatTime time) { std::cout << "t=" << time << ": " << _msg << std::endl; } private: diff --git a/src/engine/machina/Engine.hpp b/src/engine/machina/Engine.hpp index 37aa2db..32fab23 100644 --- a/src/engine/machina/Engine.hpp +++ b/src/engine/machina/Engine.hpp @@ -38,6 +38,7 @@ public: SharedPtr<Machine> machine() { return _driver->machine(); } SharedPtr<Machine> load_machine(const Glib::ustring& uri); + SharedPtr<Machine> learn_midi(const Glib::ustring& uri); void set_bpm(double bpm); void set_quantization(double beat_fraction); diff --git a/src/engine/machina/JackDriver.hpp b/src/engine/machina/JackDriver.hpp index 91f4106..0754741 100644 --- a/src/engine/machina/JackDriver.hpp +++ b/src/engine/machina/JackDriver.hpp @@ -21,6 +21,7 @@ #include <raul/JackDriver.h> #include <raul/SharedPtr.h> #include <raul/DoubleBuffer.h> +#include <raul/Semaphore.h> #include <jack/midiport.h> #include "Machine.hpp" #include "MidiDriver.hpp" @@ -45,12 +46,12 @@ public: void attach(const std::string& client_name); void detach(); - SharedPtr<Machine> machine() { return _machine; } - void set_machine(SharedPtr<Machine> machine) { _machine = machine; } + SharedPtr<Machine> machine() { return _machine; } + void set_machine(SharedPtr<Machine> machine); void write_event(Raul::BeatTime time, size_t size, - const unsigned char* event); + const unsigned char* event) throw (std::logic_error); void set_bpm(double bpm) { _bpm.set(bpm); } void set_quantization(double quantization) { _quantization.set(quantization); } @@ -60,6 +61,7 @@ private: const Raul::TimeSlice& time); virtual void on_process(jack_nframes_t nframes); + Raul::Semaphore _machine_changed; SharedPtr<Machine> _machine; SharedPtr<Machine> _last_machine; diff --git a/src/engine/machina/Machine.hpp b/src/engine/machina/Machine.hpp index 7b71d01..12b601d 100644 --- a/src/engine/machina/Machine.hpp +++ b/src/engine/machina/Machine.hpp @@ -61,16 +61,19 @@ public: typedef Raul::List<SharedPtr<Node> > Nodes; const Nodes& nodes() { return _nodes; } + void set_sink(SharedPtr<Raul::MIDISink> sink); + private: // Audio context SharedPtr<Node> earliest_node() const; - void exit_node(const SharedPtr<Node>); + void exit_node(const SharedPtr<Raul::MIDISink> sink, const SharedPtr<Node>); - bool _is_activated; - bool _is_finished; - Raul::BeatTime _time; - Nodes _nodes; + WeakPtr<Raul::MIDISink> _sink; + bool _is_activated; + bool _is_finished; + Raul::BeatTime _time; + Nodes _nodes; //Raul::List<SharedPtr<LearnRequest> > _pending_learns; SharedPtr<LearnRequest> _pending_learn; diff --git a/src/engine/machina/MidiAction.hpp b/src/engine/machina/MidiAction.hpp index b62d841..2a9f91d 100644 --- a/src/engine/machina/MidiAction.hpp +++ b/src/engine/machina/MidiAction.hpp @@ -25,9 +25,9 @@ #include "types.hpp" #include "Action.hpp" -namespace Machina { +namespace Raul { class MIDISink; } -class MidiDriver; +namespace Machina { class MidiAction : public Action { @@ -43,11 +43,9 @@ public: return ret; } - static void set_driver(SharedPtr<MidiDriver> driver); - bool set_event(size_t size, const byte* event); - void execute(Raul::BeatTime time); + void execute(SharedPtr<Raul::MIDISink> driver, Raul::BeatTime time); virtual void write_state(Raul::RDFWriter& writer); @@ -55,8 +53,6 @@ private: MidiAction(size_t size, const unsigned char* event); - static WeakPtr<MidiDriver> _driver; - size_t _size; const size_t _max_size; Raul::AtomicPtr<byte> _event; diff --git a/src/engine/machina/MidiDriver.hpp b/src/engine/machina/MidiDriver.hpp index a4d9f51..a4d712c 100644 --- a/src/engine/machina/MidiDriver.hpp +++ b/src/engine/machina/MidiDriver.hpp @@ -18,6 +18,7 @@ #ifndef MACHINA_MIDIDRIVER_HPP #define MACHINA_MIDIDRIVER_HPP +#include <raul/TimeSlice.h> #include "machina/types.hpp" namespace Machina { @@ -25,14 +26,15 @@ namespace Machina { class Node; -class MidiDriver { +class MidiDriver : public Raul::MIDISink { public: virtual ~MidiDriver() {} /** Emit a MIDI event at the given time */ - virtual void write_event(Raul::BeatTime time, + /*virtual void write_event(Raul::BeatTime time, size_t size, const unsigned char* event) = 0; + */ /** Beginning of current cycle in absolute time. */ diff --git a/src/engine/machina/Node.hpp b/src/engine/machina/Node.hpp index 569a54e..bd1a66e 100644 --- a/src/engine/machina/Node.hpp +++ b/src/engine/machina/Node.hpp @@ -22,7 +22,7 @@ #include <raul/SharedPtr.h> #include <raul/List.h> #include <raul/Stateful.h> -#include <raul/TimeSlice.h> +#include <raul/MIDISink.h> #include "Action.hpp" namespace Machina { @@ -52,8 +52,8 @@ public: void add_exit_action(SharedPtr<Action> action); void remove_exit_action(SharedPtr<Action> action); - void enter(BeatTime time); - void exit(BeatTime time); + void enter(SharedPtr<Raul::MIDISink> driver, BeatTime time); + void exit(SharedPtr<Raul::MIDISink> driver, BeatTime time); void add_outgoing_edge(SharedPtr<Edge> edge); void remove_outgoing_edge(SharedPtr<Edge> edge); |