diff options
author | David Robillard <d@drobilla.net> | 2010-12-17 01:43:22 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2010-12-17 01:43:22 +0000 |
commit | 02bb4118d6f056553daf383975e7a5e7eac4f38b (patch) | |
tree | 28f9c558335a2ca15bc3f1e17fd8f9ea4e8c1252 /src/engine/JackDriver.cpp | |
parent | 95b4da8350d77e28f2c37a58a18be5684c90a450 (diff) | |
download | machina-02bb4118d6f056553daf383975e7a5e7eac4f38b.tar.gz machina-02bb4118d6f056553daf383975e7a5e7eac4f38b.tar.bz2 machina-02bb4118d6f056553daf383975e7a5e7eac4f38b.zip |
Fix run duration handling and associated constant crashes (assertion failures).
Execution seemingly works for fractional note durations now...
git-svn-id: http://svn.drobilla.net/lad/trunk/machina@2730 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/engine/JackDriver.cpp')
-rw-r--r-- | src/engine/JackDriver.cpp | 37 |
1 files changed, 13 insertions, 24 deletions
diff --git a/src/engine/JackDriver.cpp b/src/engine/JackDriver.cpp index 6e6dd4d..134ca82 100644 --- a/src/engine/JackDriver.cpp +++ b/src/engine/JackDriver.cpp @@ -282,39 +282,28 @@ JackDriver::on_process(jack_nframes_t nframes) goto end; while (true) { - const TimeDuration run_dur = machine->run(_cycle_time); - const TimeDuration run_dur_frames = _cycle_time.beats_to_ticks(run_dur); + const uint32_t run_dur_frames = machine->run(_cycle_time); - // Machine didn't run at all (empty, or no initial states) - - if (run_dur.is_zero()) { + if (run_dur_frames == 0) { + // Machine didn't run at all (machine has no initial states) machine->reset(machine->time()); // Try again next cycle - _cycle_time.set_slice(TimeStamp(_cycle_time.ticks_unit(), 0, 0), run_dur_frames); - goto end; + _cycle_time.set_slice(TimeStamp(_frames_unit, 0, 0), + TimeStamp(_frames_unit, 0, 0)); + break; - // Machine ran for portion of cycle (finished) } else if (machine->is_finished()) { - const TimeStamp finish_offset = _cycle_time.offset_ticks() + run_dur_frames; - assert(finish_offset < length_ticks); - + // Machine ran for portion of cycle and is finished machine->reset(machine->time()); _cycle_time.set_slice(TimeStamp(_frames_unit, 0, 0), - TimeDuration(_frames_unit, nframes - finish_offset.ticks())); - _cycle_time.set_offset(finish_offset); + TimeStamp(_frames_unit, nframes - run_dur_frames, 0)); + _cycle_time.set_offset(TimeStamp(_frames_unit, run_dur_frames, 0)); - // Machine ran for entire cycle } else { - if (machine->is_finished()) { - machine->reset(machine->time()); - _cycle_time.set_slice(TimeStamp(_frames_unit, 0, 0), - TimeStamp(_frames_unit, 0, 0)); - } else { - _cycle_time.set_slice( - _cycle_time.start_ticks() + _cycle_time.length_ticks(), - TimeStamp(_frames_unit, 0, 0)); - } - + // Machine ran for entire cycle + _cycle_time.set_slice( + _cycle_time.start_ticks() + _cycle_time.length_ticks(), + TimeStamp(_frames_unit, 0, 0)); break; } } |