diff options
author | David Robillard <d@drobilla.net> | 2007-02-10 01:44:16 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-02-10 01:44:16 +0000 |
commit | 9f2a520a8f20661385bf6c9f7447aef1227d8696 (patch) | |
tree | 1390784d2025a183715319c5ef78b4e2f729547d /src/engine/JackDriver.cpp | |
parent | 374f7e8f35e0205b056184c889b2caf5cdac08ec (diff) | |
download | machina-9f2a520a8f20661385bf6c9f7447aef1227d8696.tar.gz machina-9f2a520a8f20661385bf6c9f7447aef1227d8696.tar.bz2 machina-9f2a520a8f20661385bf6c9f7447aef1227d8696.zip |
Fix previous (broken) commit.
git-svn-id: http://svn.drobilla.net/lad/machina@296 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/engine/JackDriver.cpp')
-rw-r--r-- | src/engine/JackDriver.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/engine/JackDriver.cpp b/src/engine/JackDriver.cpp new file mode 100644 index 0000000..848c3d7 --- /dev/null +++ b/src/engine/JackDriver.cpp @@ -0,0 +1,102 @@ +/* This file is part of Machina. + * Copyright (C) 2007 Dave Robillard <http://drobilla.net> + * + * Machina is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * Machina is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * 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 + */ + +#include "machina/JackDriver.hpp" + +#include <iostream> + +namespace Machina { + + +JackDriver::JackDriver() + : _output_port(NULL) + , _current_cycle_start(0) + , _current_cycle_nframes(0) +{ +} + + +void +JackDriver::attach(const std::string& client_name) +{ + Raul::JackDriver::attach(client_name); + + if (jack_client()) { + _output_port = jack_port_register(jack_client(), + "out", + JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, + 0); + } +} + + +void +JackDriver::detach() +{ + jack_port_unregister(jack_client(), _output_port); + _output_port = NULL; + + Raul::JackDriver::detach(); +} + + +Timestamp +JackDriver::stamp_to_offset(Timestamp stamp) +{ + Timestamp ret = stamp - _current_cycle_start + _current_cycle_offset; + assert(ret < _current_cycle_offset + _current_cycle_nframes); + return ret; +} + + +void +JackDriver::on_process(jack_nframes_t nframes) +{ + //std::cerr << "======================================================\n"; + + _current_cycle_offset = 0; + _current_cycle_nframes = nframes; + + jack_midi_clear_buffer(jack_port_get_buffer(_output_port, nframes), nframes); + + while (true) { + + bool machine_done = ! _machine->run(_current_cycle_nframes); + + if (!machine_done) { + _current_cycle_start += _current_cycle_nframes; + break; + + } else { + const Timestamp finish_time = _machine->time(); + const FrameCount finish_offset = stamp_to_offset(finish_time); + + if (finish_offset >= _current_cycle_nframes) + break; + + _current_cycle_offset = stamp_to_offset(finish_time); + _current_cycle_nframes -= _current_cycle_offset; + _current_cycle_start = 0; + _machine->reset(); + } + } + + //std::cerr << "======================================================\n"; +} + + +} // namespace Machina |