From 43cca924857a2c9b8833d0f3e441a5d277ad42fe Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 3 Mar 2007 04:40:05 +0000 Subject: SMF writing work. git-svn-id: http://svn.drobilla.net/lad/machina@343 a436a847-0d15-0410-975c-d299462d15a1 --- src/engine/machina/Action.hpp | 9 ++++++--- src/engine/machina/Engine.hpp | 1 + src/engine/machina/JackDriver.hpp | 8 +++++--- src/engine/machina/Machine.hpp | 13 ++++++++----- src/engine/machina/MidiAction.hpp | 10 +++------- src/engine/machina/MidiDriver.hpp | 6 ++++-- src/engine/machina/Node.hpp | 6 +++--- 7 files changed, 30 insertions(+), 23 deletions(-) (limited to 'src/engine/machina') 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 #include -#include +#include #include #include +#include #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 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::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() { return _driver->machine(); } SharedPtr load_machine(const Glib::ustring& uri); + SharedPtr 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 #include #include +#include #include #include "Machine.hpp" #include "MidiDriver.hpp" @@ -45,12 +46,12 @@ public: void attach(const std::string& client_name); void detach(); - SharedPtr machine() { return _machine; } - void set_machine(SharedPtr machine) { _machine = machine; } + SharedPtr machine() { return _machine; } + void set_machine(SharedPtr 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; SharedPtr _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 > Nodes; const Nodes& nodes() { return _nodes; } + void set_sink(SharedPtr sink); + private: // Audio context SharedPtr earliest_node() const; - void exit_node(const SharedPtr); + void exit_node(const SharedPtr sink, const SharedPtr); - bool _is_activated; - bool _is_finished; - Raul::BeatTime _time; - Nodes _nodes; + WeakPtr _sink; + bool _is_activated; + bool _is_finished; + Raul::BeatTime _time; + Nodes _nodes; //Raul::List > _pending_learns; SharedPtr _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 driver); - bool set_event(size_t size, const byte* event); - void execute(Raul::BeatTime time); + void execute(SharedPtr 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 _driver; - size_t _size; const size_t _max_size; Raul::AtomicPtr _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 #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 #include #include -#include +#include #include "Action.hpp" namespace Machina { @@ -52,8 +52,8 @@ public: void add_exit_action(SharedPtr action); void remove_exit_action(SharedPtr action); - void enter(BeatTime time); - void exit(BeatTime time); + void enter(SharedPtr driver, BeatTime time); + void exit(SharedPtr driver, BeatTime time); void add_outgoing_edge(SharedPtr edge); void remove_outgoing_edge(SharedPtr edge); -- cgit v1.2.1