Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "pbd/error.h"
-#include <sigc++/retype.h>
-#include <sigc++/retype_return.h>
-#include <sigc++/bind.h>
#include "pbd/enumwriter.h"
#include "midi++/events.h"
#include "ardour/processor.h"
#include "ardour/route_group_specialized.h"
#include "ardour/session.h"
+#include "ardour/session_playlists.h"
#include "ardour/utils.h"
#include "i18n.h"
_mode = mode;
}
-MidiTrack::MidiTrack (Session& sess, const XMLNode& node)
- : Track (sess, node, DataType::MIDI )
+MidiTrack::MidiTrack (Session& sess, const XMLNode& node, int /*version*/)
+ : Track (sess, node, DataType::MIDI)
, _immediate_events(1024) // FIXME: size?
, _step_edit_ring_buffer(64) // FIXME: size?
, _note_mode(Sustained)
, _default_channel (0)
, _midi_thru (true)
{
- _set_state(node, false);
+ _set_state (node, Stateful::loading_state_version, false);
}
MidiTrack::~MidiTrack ()
_diskstream->set_record_enabled (false);
//_diskstream->monitor_input (false);
- ic_connection.disconnect();
- ic_connection = _input->changed.connect (mem_fun (*_diskstream, &MidiDiskstream::handle_input_change));
-
DiskstreamChanged (); /* EMIT SIGNAL */
return 0;
{
boost::shared_ptr<MidiDiskstream> dstream;
- cerr << "\n\n\nMIDI use diskstream\n";
-
if ((dstream = boost::dynamic_pointer_cast<MidiDiskstream>(_session.diskstream_by_name (name))) == 0) {
error << string_compose(_("MidiTrack: midi diskstream \"%1\" not known by session"), name) << endmsg;
return -1;
}
- cerr << "\n\n\nMIDI found DS\n";
return set_diskstream (dstream);
}
}
int
-MidiTrack::set_state (const XMLNode& node)
+MidiTrack::set_state (const XMLNode& node, int version)
{
- return _set_state (node, true);
+ return _set_state (node, version, true);
}
int
-MidiTrack::_set_state (const XMLNode& node, bool call_base)
+MidiTrack::_set_state (const XMLNode& node, int version, bool call_base)
{
const XMLProperty *prop;
XMLNodeConstIterator iter;
- if (Route::_set_state (node, call_base)) {
+ if (Route::_set_state (node, version, call_base)) {
return -1;
}
an old one.
*/
- cerr << "\n\n\n\n MIDI track " << name() << " found DS id " << id << endl;
-
if (id == zero) {
use_new_diskstream ();
} else if (use_diskstream (id)) {
child = *niter;
if (child->name() == X_("recenable")) {
- _rec_enable_control->set_state (*child);
+ _rec_enable_control->set_state (*child, version);
_session.add_controllable (_rec_enable_control);
}
}
pending_state = const_cast<XMLNode*> (&node);
if (_session.state_of_the_state() & Session::Loading) {
- _session.StateReady.connect (mem_fun (*this, &MidiTrack::set_state_part_two));
+ _session.StateReady.connect_same_thread (*this, boost::bind (&MidiTrack::set_state_part_two, this));
} else {
set_state_part_two ();
}
_freeze_record.processor_info.clear ();
if ((prop = fnode->property (X_("playlist"))) != 0) {
- boost::shared_ptr<Playlist> pl = _session.playlist_by_name (prop->value());
+ boost::shared_ptr<Playlist> pl = _session.playlists->by_name (prop->value());
if (pl) {
_freeze_record.playlist = boost::dynamic_pointer_cast<MidiPlaylist> (pl);
} else {
write_out_of_band_data (bufs, start_frame, end_frame, nframes);
- // Feed the data through the MidiStateTracker
- bool did_loop;
-
- _midi_state_tracker.track (mbuf.begin(), mbuf.end(), did_loop);
-
- if (did_loop) {
- /* add necessary note offs */
- cerr << "DID LOOP, RESOLVE NOTES\n";
- _midi_state_tracker.resolve_notes (mbuf, end_frame-start_frame - 1);
- }
-
process_output_buffers (bufs, start_frame, end_frame, nframes,
- (!_session.get_record_enabled() || !Config->get_do_not_record_plugins()), declick);
+ (!_session.get_record_enabled() || !Config->get_do_not_record_plugins()), declick);
}
- _main_outs->flush (nframes);
+ _main_outs->flush (nframes, end_frame - start_frame - 1);
return 0;
}
void
MidiTrack::handle_transport_stopped (bool abort, bool did_locate, bool flush_processors)
{
- /* turn off any notes that are on */
-
- MidiBuffer buf (1024); // XXX is this a reasonable size ?
-
- _midi_state_tracker.resolve_notes (buf, 0); // time is zero because notes are immediate
-
- for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
- write_immediate_event ((*i).size(), (*i).buffer());
- }
+ _main_outs->transport_stopped ();
Route::handle_transport_stopped (abort, did_locate, flush_processors);
}
MidiTrack::write_out_of_band_data (BufferSet& bufs, sframes_t /*start*/, sframes_t /*end*/, nframes_t nframes)
{
// Append immediate events
-
MidiBuffer& buf (bufs.get_midi (0));
_immediate_events.read (buf, 0, 0, nframes - 1); // all stamps = 0
- /* MIDI thru: send incoming data "through" output */
- if (_midi_thru && _input->n_ports().n_midi()) {
+ // MIDI thru: send incoming data "through" output
+ if (_midi_thru && _session.transport_speed() != 0.0f && _input->n_ports().n_midi()) {
buf.merge_in_place (_input->midi(0)->get_midi_buffer(nframes));
}
}
-
int
MidiTrack::export_stuff (BufferSet& /*bufs*/, nframes_t /*nframes*/, sframes_t /*end_frame*/)
{