aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine/machina
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-02-10 07:30:56 +0000
committerDavid Robillard <d@drobilla.net>2007-02-10 07:30:56 +0000
commitcee33ba4c0859b117be94df6ccbf3eb756a850af (patch)
treee7e69de57c531538b2ded16bac31c2c705bc0fa6 /src/engine/machina
parent87c0a475bd76ca33883eeafc2a86bc89a84eec2f (diff)
downloadmachina-cee33ba4c0859b117be94df6ccbf3eb756a850af.tar.gz
machina-cee33ba4c0859b117be94df6ccbf3eb756a850af.tar.bz2
machina-cee33ba4c0859b117be94df6ccbf3eb756a850af.zip
Finished MIDI genericification.
Work on MIDI learn. git-svn-id: http://svn.drobilla.net/lad/machina@299 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/engine/machina')
-rw-r--r--src/engine/machina/Action.hpp4
-rw-r--r--src/engine/machina/JackDriver.hpp34
-rw-r--r--src/engine/machina/Machine.hpp5
-rw-r--r--src/engine/machina/MidiAction.hpp18
-rw-r--r--src/engine/machina/types.hpp1
5 files changed, 46 insertions, 16 deletions
diff --git a/src/engine/machina/Action.hpp b/src/engine/machina/Action.hpp
index ffee5b1..feb0e0b 100644
--- a/src/engine/machina/Action.hpp
+++ b/src/engine/machina/Action.hpp
@@ -25,6 +25,10 @@
namespace Machina {
+/** An Action, executed on entering or exiting of a state.
+ *
+ * Actions do not have time as a property.
+ */
struct Action {
virtual ~Action() {}
diff --git a/src/engine/machina/JackDriver.hpp b/src/engine/machina/JackDriver.hpp
index bae3ab2..9a72a62 100644
--- a/src/engine/machina/JackDriver.hpp
+++ b/src/engine/machina/JackDriver.hpp
@@ -23,16 +23,21 @@
#include <jack/midiport.h>
#include "Machine.hpp"
#include "MidiDriver.hpp"
+#include <boost/enable_shared_from_this.hpp>
namespace Machina {
+class MidiAction;
+class Node;
+
/** Realtime JACK Driver.
*
* "Ticks" are individual frames when running under this driver, and all code
* in the processing context must be realtime safe (non-blocking).
*/
-class JackDriver : public Raul::JackDriver, public Machina::MidiDriver {
+class JackDriver : public Raul::JackDriver, public Machina::MidiDriver,
+ public boost::enable_shared_from_this<JackDriver> {
public:
JackDriver();
@@ -45,18 +50,31 @@ public:
Timestamp cycle_start() { return _current_cycle_start; }
FrameCount cycle_length() { return _current_cycle_nframes; }
+ void learn(SharedPtr<Node> node);
+
+ void write_event(Timestamp time,
+ size_t size,
+ const unsigned char* event);
+
private:
// Audio context
- Timestamp subcycle_offset() { return _current_cycle_offset; }
- jack_port_t* output_port() { return _output_port; }
- virtual void on_process(jack_nframes_t nframes);
+ Timestamp subcycle_offset() { return _current_cycle_offset; }
Timestamp stamp_to_offset(Timestamp stamp);
+
+ void process_input(jack_nframes_t nframes);
+ virtual void on_process(jack_nframes_t nframes);
+
SharedPtr<Machine> _machine;
- jack_port_t* _output_port;
- Timestamp _current_cycle_start;
- Timestamp _current_cycle_offset; ///< for split cycles
- FrameCount _current_cycle_nframes;
+ SharedPtr<Node> _learn_node;
+ SharedPtr<MidiAction> _learn_enter_action;
+ SharedPtr<MidiAction> _learn_exit_action;
+
+ jack_port_t* _input_port;
+ jack_port_t* _output_port;
+ Timestamp _current_cycle_start;
+ Timestamp _current_cycle_offset; ///< for split cycles
+ FrameCount _current_cycle_nframes;
};
diff --git a/src/engine/machina/Machine.hpp b/src/engine/machina/Machine.hpp
index 5d16a4e..4036ef3 100644
--- a/src/engine/machina/Machine.hpp
+++ b/src/engine/machina/Machine.hpp
@@ -20,7 +20,8 @@
#include <vector>
#include <map>
-#include "raul/SharedPtr.h"
+#include <raul/SharedPtr.h>
+#include <raul/List.h>
#include "types.hpp"
#include "Node.hpp"
@@ -48,7 +49,7 @@ public:
FrameCount time() { return _time; }
private:
- typedef std::vector<SharedPtr<Node> > Nodes;
+ typedef Raul::List<SharedPtr<Node> > Nodes;
// Audio context
SharedPtr<Node> earliest_node() const;
diff --git a/src/engine/machina/MidiAction.hpp b/src/engine/machina/MidiAction.hpp
index 2e1d1fc..d362a63 100644
--- a/src/engine/machina/MidiAction.hpp
+++ b/src/engine/machina/MidiAction.hpp
@@ -19,6 +19,7 @@
#define MACHINA_MIDIACTION_HPP
#include <raul/WeakPtr.h>
+#include <raul/AtomicPtr.h>
#include "types.hpp"
#include "Action.hpp"
@@ -29,16 +30,21 @@ class MidiDriver;
class MidiAction : public Action {
public:
- JackNoteOnAction(WeakPtr<MidiDriver> driver,
- size_t size,
- unsigned char* event);
+ MidiAction(WeakPtr<MidiDriver> driver,
+ size_t size,
+ const unsigned char* event);
+
+ ~MidiAction();
+
+ bool set_event(size_t size, const byte* event);
void execute(Timestamp time);
private:
- WeakPtr<MidiDriver> _driver;
- size_t _size;
- unsigned char* _event;
+ WeakPtr<MidiDriver> _driver;
+ size_t _size;
+ const size_t _max_size;
+ Raul::AtomicPtr<byte> _event;
};
diff --git a/src/engine/machina/types.hpp b/src/engine/machina/types.hpp
index db36901..1236f65 100644
--- a/src/engine/machina/types.hpp
+++ b/src/engine/machina/types.hpp
@@ -26,6 +26,7 @@ namespace Machina {
typedef jack_nframes_t FrameCount;
typedef jack_nframes_t Timestamp;
+typedef unsigned char byte;
} // namespace Machina