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.cpp30
1 files changed, 14 insertions, 16 deletions
diff --git a/src/engine/JackDriver.cpp b/src/engine/JackDriver.cpp
index 25ff496..d2c131d 100644
--- a/src/engine/JackDriver.cpp
+++ b/src/engine/JackDriver.cpp
@@ -12,7 +12,7 @@
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <iostream>
@@ -118,6 +118,7 @@ JackDriver::process_input(SharedPtr<Machine> machine, const TimeSlice& time)
using namespace std;
if (_recording.get()) {
+
const jack_nframes_t nframes = time.length_ticks();
void* jack_buffer = jack_port_get_buffer(_input_port, nframes);
const jack_nframes_t event_count = jack_midi_get_event_count(jack_buffer, nframes);
@@ -133,6 +134,7 @@ JackDriver::process_input(SharedPtr<Machine> machine, const TimeSlice& time)
_recorder->whip();
} else {
+
const jack_nframes_t nframes = time.length_ticks();
void* jack_buffer = jack_port_get_buffer(_input_port, nframes);
const jack_nframes_t event_count = jack_midi_get_event_count(jack_buffer, nframes);
@@ -146,10 +148,8 @@ JackDriver::process_input(SharedPtr<Machine> machine, const TimeSlice& time)
const SharedPtr<LearnRequest> learn = machine->pending_learn();
if (learn) {
learn->enter_action()->set_event(ev.size, ev.buffer);
- cerr << "LEARN START\n";
learn->start(_quantization.get(),
time.ticks_to_beats(jack_last_frame_time(_client) + ev.time));
- //LearnRecord learn = machine->pop_learn();
}
} else if (ev.buffer[0] == 0x80) {
@@ -162,14 +162,11 @@ JackDriver::process_input(SharedPtr<Machine> machine, const TimeSlice& time)
learn->finish(
time.ticks_to_beats(jack_last_frame_time(_client) + ev.time));
machine->clear_pending_learn();
- cerr << "LEARNED!\n";
}
}
}
-
- //std::cerr << "EVENT: " << std::hex << (int)ev.buffer[0] << "\n";
-
}
+
}
}
@@ -179,9 +176,13 @@ JackDriver::write_event(Raul::BeatTime time,
size_t size,
const byte* event) throw (std::logic_error)
{
+ if (!_output_port)
+ return;
+
if (_cycle_time.beats_to_ticks(time) + _cycle_time.offset_ticks() < _cycle_time.start_ticks()) {
std::cerr << "ERROR: Missed event by "
- << _cycle_time.start_ticks() - (_cycle_time.beats_to_ticks(time) + _cycle_time.offset_ticks())
+ << _cycle_time.start_ticks()
+ - (_cycle_time.beats_to_ticks(time) + _cycle_time.offset_ticks())
<< " ticks"
<< "\n\tbpm: " << _cycle_time.bpm()
<< "\n\tev time: " << _cycle_time.beats_to_ticks(time)
@@ -195,8 +196,6 @@ JackDriver::write_event(Raul::BeatTime time,
const TickCount offset = _cycle_time.beats_to_ticks(time)
+ _cycle_time.offset_ticks() - _cycle_time.start_ticks();
- assert(_output_port);
-
if ( ! (offset < _cycle_time.offset_ticks() + nframes)) {
std::cerr << "ERROR: Event offset " << offset << " outside cycle "
<< "\n\tbpm: " << _cycle_time.bpm()
@@ -297,7 +296,8 @@ JackDriver::on_process(jack_nframes_t nframes)
void
JackDriver::reset()
{
- // FIXME: Flag audio thread and end active notes, etc
+ /* FIXME: This should signal the audio thread and wait for it
+ * to exit all active states to resolve stuck notes, then reset. */
_machine->deactivate();
_machine->reset();
_cycle_time.set_start(0);
@@ -307,9 +307,9 @@ JackDriver::reset()
void
JackDriver::start_record()
{
- std::cerr << "START RECORD" << std::endl;
- // FIXME: hardcoded size
- _recorder = SharedPtr<Recorder>(new Recorder(1024, (1.0/(double)sample_rate()) * (_bpm.get() / 60.0), _quantization.get()));
+ // FIXME: Choose an appropriate maximum ringbuffer size
+ _recorder = SharedPtr<Recorder>(new Recorder(
+ 1024, (1.0/(double)sample_rate()) * (_bpm.get() / 60.0), _quantization.get()));
_recorder->start();
_record_time = 0;
_recording = 1;
@@ -321,10 +321,8 @@ JackDriver::finish_record()
{
_recording = 0;
SharedPtr<Machine> machine = _recorder->finish();
- std::cout << "Learned machine! " << machine->nodes().size() << " nodes." << std::endl;
_recorder.reset();
machine->activate();
- //set_machine(machine);
_machine->nodes().append(machine->nodes());
}