aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine/MachineBuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/MachineBuilder.cpp')
-rw-r--r--src/engine/MachineBuilder.cpp64
1 files changed, 31 insertions, 33 deletions
diff --git a/src/engine/MachineBuilder.cpp b/src/engine/MachineBuilder.cpp
index 0a6dbfc..57d6c2f 100644
--- a/src/engine/MachineBuilder.cpp
+++ b/src/engine/MachineBuilder.cpp
@@ -19,9 +19,8 @@
#include "lv2/lv2plug.in/ns/ext/midi/midi.h"
-#include "raul/SharedPtr.hpp"
-
#include "machina/Machine.hpp"
+#include "machina/types.hpp"
#include "Edge.hpp"
#include "MachineBuilder.hpp"
@@ -34,7 +33,7 @@ using namespace Raul;
namespace Machina {
-MachineBuilder::MachineBuilder(SharedPtr<Machine> machine, double q, bool step)
+MachineBuilder::MachineBuilder(SPtr<Machine> machine, double q, bool step)
: _quantization(q)
, _time(machine->time().unit()) // = 0
, _machine(machine)
@@ -48,13 +47,13 @@ void
MachineBuilder::reset()
{
_time = TimeStamp(_machine->time().unit()); // = 0
- _initial_node = SharedPtr<Node>(new Node(_time, true)); // duration 0
+ _initial_node = SPtr<Node>(new Node(_time, true)); // duration 0
_connect_node = _initial_node;
_connect_node_end_time = _time; // = 0
}
bool
-MachineBuilder::is_delay_node(SharedPtr<Node> node) const
+MachineBuilder::is_delay_node(SPtr<Node> node) const
{
return !node->enter_action() && !node->exit_action();
}
@@ -62,7 +61,7 @@ MachineBuilder::is_delay_node(SharedPtr<Node> node) const
/** Set the duration of a node, with quantization.
*/
void
-MachineBuilder::set_node_duration(SharedPtr<Node> node,
+MachineBuilder::set_node_duration(SPtr<Node> node,
Raul::TimeDuration d) const
{
if (_step) {
@@ -83,31 +82,31 @@ MachineBuilder::set_node_duration(SharedPtr<Node> node,
*
* If a delay node is added to the machine, it is returned.
*/
-SharedPtr<Node>
-MachineBuilder::connect_nodes(SharedPtr<Machine> m,
- SharedPtr<Node> tail,
- Raul::TimeStamp tail_end_time,
- SharedPtr<Node> head,
- Raul::TimeStamp head_start_time)
+SPtr<Node>
+MachineBuilder::connect_nodes(SPtr<Machine> m,
+ SPtr<Node> tail,
+ Raul::TimeStamp tail_end_time,
+ SPtr<Node> head,
+ Raul::TimeStamp head_start_time)
{
assert(tail != head);
assert(head_start_time >= tail_end_time);
- SharedPtr<Node> delay_node;
+ SPtr<Node> delay_node;
if (is_delay_node(tail) && tail->edges().size() == 0) {
// Tail is a delay node, just accumulate the time difference into it
set_node_duration(tail,
tail->duration() + head_start_time - tail_end_time);
- tail->add_edge(SharedPtr<Edge>(new Edge(tail, head)));
+ tail->add_edge(SPtr<Edge>(new Edge(tail, head)));
} else if (_step || (head_start_time == tail_end_time)) {
// Connect directly
- tail->add_edge(SharedPtr<Edge>(new Edge(tail, head)));
+ tail->add_edge(SPtr<Edge>(new Edge(tail, head)));
} else {
// Need to actually create a delay node
- delay_node = SharedPtr<Node>(new Node(head_start_time - tail_end_time));
- tail->add_edge(SharedPtr<Edge>(new Edge(tail, delay_node)));
- delay_node->add_edge(SharedPtr<Edge>(new Edge(delay_node, head)));
+ delay_node = SPtr<Node>(new Node(head_start_time - tail_end_time));
+ tail->add_edge(SPtr<Edge>(new Edge(tail, delay_node)));
+ delay_node->add_edge(SPtr<Edge>(new Edge(delay_node, head)));
m->add_node(delay_node);
}
@@ -117,10 +116,10 @@ MachineBuilder::connect_nodes(SharedPtr<Machine> m,
void
MachineBuilder::note_on(Raul::TimeStamp t, size_t ev_size, uint8_t* buf)
{
- SharedPtr<Node> node(new Node(TimeStamp(t.unit())));
- node->set_enter_action(SharedPtr<Action>(new MidiAction(ev_size, buf)));
+ SPtr<Node> node(new Node(TimeStamp(t.unit())));
+ node->set_enter_action(SPtr<Action>(new MidiAction(ev_size, buf)));
- SharedPtr<Node> this_connect_node;
+ SPtr<Node> this_connect_node;
Raul::TimeStamp this_connect_node_end_time(t.unit());
/* If currently polyphonic, use a poly node with no successors as connect
@@ -143,7 +142,7 @@ MachineBuilder::note_on(Raul::TimeStamp t, size_t ev_size, uint8_t* buf)
this_connect_node_end_time = _connect_node_end_time;
}
- SharedPtr<Node> delay_node = connect_nodes(
+ SPtr<Node> delay_node = connect_nodes(
_machine, this_connect_node, this_connect_node_end_time, node, t);
if (delay_node) {
@@ -159,10 +158,10 @@ void
MachineBuilder::resolve_note(Raul::TimeStamp t,
size_t ev_size,
uint8_t* buf,
- SharedPtr<Node> resolved)
+ SPtr<Node> resolved)
{
resolved->set_exit_action(
- SharedPtr<Action>(new MidiAction(ev_size, buf)));
+ SPtr<Action>(new MidiAction(ev_size, buf)));
set_node_duration(resolved, t - resolved->enter_time());
if (_active_nodes.size() == 1) {
@@ -171,7 +170,7 @@ MachineBuilder::resolve_note(Raul::TimeStamp t,
if (!_poly_nodes.empty()) {
// Finish a polyphonic section
- _connect_node = SharedPtr<Node>(new Node(TimeStamp(t.unit())));
+ _connect_node = SPtr<Node>(new Node(TimeStamp(t.unit())));
_machine->add_node(_connect_node);
connect_nodes(_machine, resolved, t, _connect_node, t);
@@ -201,8 +200,8 @@ MachineBuilder::resolve_note(Raul::TimeStamp t,
assert(_connect_node->edges().empty());
_connect_node->set_enter_action(resolved->enter_action());
_connect_node->set_exit_action(resolved->exit_action());
- resolved->set_enter_action(SharedPtr<Action>());
- resolved->set_exit_action(SharedPtr<Action>());
+ resolved->set_enter_action(SPtr<Action>());
+ resolved->set_exit_action(SPtr<Action>());
set_node_duration(_connect_node, resolved->duration());
resolved = _connect_node;
if (std::find(_machine->nodes().begin(),
@@ -246,8 +245,7 @@ MachineBuilder::event(Raul::TimeStamp time_offset,
} else if ((buf[0] & 0xF0) == LV2_MIDI_MSG_NOTE_OFF) {
for (ActiveList::iterator i = _active_nodes.begin();
i != _active_nodes.end(); ++i) {
- SharedPtr<MidiAction> action = PtrCast<MidiAction>(
- (*i)->enter_action());
+ SPtr<MidiAction> action = dynamic_ptr_cast<MidiAction>((*i)->enter_action());
if (!action) {
continue;
}
@@ -275,10 +273,10 @@ MachineBuilder::resolve()
{
// Resolve stuck notes
if (!_active_nodes.empty()) {
- for (list<SharedPtr<Node> >::iterator i = _active_nodes.begin();
+ for (list<SPtr<Node> >::iterator i = _active_nodes.begin();
i != _active_nodes.end(); ++i) {
cerr << "WARNING: Resolving stuck note." << endl;
- SharedPtr<MidiAction> action = PtrCast<MidiAction>(
+ SPtr<MidiAction> action = dynamic_ptr_cast<MidiAction>(
(*i)->enter_action());
if (!action) {
continue;
@@ -293,7 +291,7 @@ MachineBuilder::resolve()
0x40
};
(*i)->set_exit_action(
- SharedPtr<Action>(new MidiAction(3, note_off)));
+ SPtr<Action>(new MidiAction(3, note_off)));
set_node_duration((*i), _time - (*i)->enter_time());
(*i)->exit(NULL, _time);
_machine->add_node((*i));
@@ -312,7 +310,7 @@ MachineBuilder::resolve()
}
-SharedPtr<Machine>
+SPtr<Machine>
MachineBuilder::finish()
{
resolve();