diff options
Diffstat (limited to 'src/engine/JackDriver.cpp')
-rw-r--r-- | src/engine/JackDriver.cpp | 77 |
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 |