aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine/JackDriver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/JackDriver.cpp')
-rw-r--r--src/engine/JackDriver.cpp77
1 files changed, 51 insertions, 26 deletions
diff --git a/src/engine/JackDriver.cpp b/src/engine/JackDriver.cpp
index 72b1cb1..0276cc5 100644
--- a/src/engine/JackDriver.cpp
+++ b/src/engine/JackDriver.cpp
@@ -16,13 +16,13 @@
*/
#include <iostream>
-#include <iomanip>
#include "machina/Context.hpp"
#include "machina/URIs.hpp"
#include "machina/Updates.hpp"
#include "machina_config.h"
+#include "Edge.hpp"
#include "JackDriver.hpp"
#include "LearnRequest.hpp"
#include "MidiAction.hpp"
@@ -46,7 +46,6 @@ JackDriver::JackDriver(Raul::Forge& forge, SPtr<Machine> machine)
, _stop(0)
, _stop_flag(false)
, _record_dur(_frames_unit) // = 0
- , _recording(false)
, _is_activated(false)
{
_context.set_sink(this);
@@ -108,16 +107,12 @@ JackDriver::attach(const std::string& client_name)
new Machine(TimeUnit::frames(
jack_get_sample_rate(jack_client()))));
}
-
- _machine->activate();
}
}
void
JackDriver::detach()
{
- _machine->deactivate();
-
if (_input_port) {
jack_port_unregister(jack_client(), _input_port);
_input_port = NULL;
@@ -339,13 +334,18 @@ JackDriver::on_process(jack_nframes_t nframes)
machine->reset(_context.sink(), _context.time().start_beats());
}
- if (_recording) {
- read_input_recording(machine, _context.time());
- } else {
+ switch (_play_state) {
+ case PlayState::STOPPED:
+ break;
+ case PlayState::PLAYING:
read_input_playing(machine, _context.time());
+ break;
+ case PlayState::RECORDING:
+ read_input_recording(machine, _context.time());
+ break;
}
- if (machine->is_empty() || !machine->is_activated()) {
+ if (machine->is_empty()) {
goto end;
}
@@ -392,36 +392,61 @@ end:
}
void
-JackDriver::stop()
+JackDriver::set_play_state(PlayState state)
{
- if (recording()) {
- finish_record();
+ switch (state) {
+ case PlayState::STOPPED:
+ switch (_play_state) {
+ case PlayState::STOPPED:
+ break;
+ case PlayState::RECORDING:
+ finish_record();
+ // nobreak
+ case PlayState::PLAYING:
+ _stop_flag = true;
+ _stop.wait();
+ }
+ break;
+ case PlayState::RECORDING:
+ start_record(false); // FIXME: step record?
+ break;
+ case PlayState::PLAYING:
+ if (_play_state == PlayState::RECORDING) {
+ finish_record();
+ }
}
-
- _stop_flag = true;
- _stop.wait();
- _machine->deactivate();
+ _play_state = state;
}
void
JackDriver::start_record(bool step)
{
- // FIXME: Choose an appropriate maximum ringbuffer size
- _recorder = SPtr<Recorder>(
- new Recorder(_forge, 1024, _beats_unit, _quantization.get(), step));
- _recorder->start();
- _record_dur = 0;
- _recording = true;
+ if (_play_state.load() != PlayState::RECORDING) {
+ // FIXME: Choose an appropriate maximum ringbuffer size
+ _recorder = SPtr<Recorder>(
+ new Recorder(_forge, 1024, _beats_unit, _quantization.get(), step));
+ _recorder->start();
+ _record_dur = 0;
+ _play_state = PlayState::RECORDING;
+ }
}
void
JackDriver::finish_record()
{
- _recording = false;
+ _play_state = PlayState::PLAYING;
SPtr<Machine> machine = _recorder->finish();
_recorder.reset();
- machine->activate();
- _machine->nodes().insert(machine->nodes().begin(), machine->nodes().end());
+ for (const auto& m : machine->nodes()) {
+ if (m->is_initial()) {
+ for (const auto& e : m->edges()) {
+ e->set_tail(_machine->initial_node());
+ _machine->initial_node()->edges().insert(e);
+ }
+ } else {
+ _machine->nodes().insert(m);
+ }
+ }
}
int