From ac0438352410a5af5d64d2268d3541b47e8a2669 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 13 Jan 2013 20:46:13 +0000 Subject: Fix step recording. git-svn-id: http://svn.drobilla.net/lad/trunk/machina@4965 a436a847-0d15-0410-975c-d299462d15a1 --- src/engine/JackDriver.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'src/engine/JackDriver.cpp') diff --git a/src/engine/JackDriver.cpp b/src/engine/JackDriver.cpp index e5601d8..840573e 100644 --- a/src/engine/JackDriver.cpp +++ b/src/engine/JackDriver.cpp @@ -24,6 +24,7 @@ #include "Edge.hpp" #include "JackDriver.hpp" #include "LearnRequest.hpp" +#include "MachineBuilder.hpp" #include "MidiAction.hpp" using namespace machina; @@ -340,6 +341,7 @@ JackDriver::on_process(jack_nframes_t nframes) read_input_playing(machine, _context.time()); break; case PlayState::RECORDING: + case PlayState::STEP_RECORDING: read_input_recording(machine, _context.time()); break; } @@ -399,6 +401,7 @@ JackDriver::set_play_state(PlayState state) case PlayState::STOPPED: break; case PlayState::RECORDING: + case PlayState::STEP_RECORDING: finish_record(); // nobreak case PlayState::PLAYING: @@ -407,10 +410,14 @@ JackDriver::set_play_state(PlayState state) } break; case PlayState::RECORDING: - start_record(false); // FIXME: step record? + start_record(false); + break; + case PlayState::STEP_RECORDING: + start_record(true); break; case PlayState::PLAYING: - if (_play_state == PlayState::RECORDING) { + if (_play_state == PlayState::RECORDING || + _play_state == PlayState::STEP_RECORDING) { finish_record(); } } @@ -420,14 +427,20 @@ JackDriver::set_play_state(PlayState state) void JackDriver::start_record(bool step) { - if (_play_state.load() != PlayState::RECORDING) { - // FIXME: Choose an appropriate maximum ringbuffer size + switch (_play_state) { + case PlayState::STOPPED: + case PlayState::PLAYING: _recorder = SPtr( new Recorder(_forge, 1024, _beats_unit, _quantization.get(), step)); _recorder->start(); _record_dur = 0; - _play_state = PlayState::RECORDING; + break; + case PlayState::RECORDING: + case PlayState::STEP_RECORDING: + _recorder->builder()->set_step(true); + break; } + _play_state = step ? PlayState::STEP_RECORDING : PlayState::RECORDING; } void -- cgit v1.2.1