X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_track.cc;h=cdd4633448e7590138d83354a153b61319c88920;hb=ed72df29b79f9e2dc7482f07c39010b4523c4a8e;hp=780243f18bff19868638ac9c58fc5144d0a1dd30;hpb=5182f0770cca50cbb7c8fe419b2e64af02525553;p=ardour.git diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 780243f18b..cdd4633448 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -105,6 +105,10 @@ MidiTrack::set_diskstream (boost::shared_ptr ds) _diskstream->set_record_enabled (false); //_diskstream->monitor_input (false); + _diskstream_data_recorded_connection.disconnect (); + boost::shared_ptr mds = boost::dynamic_pointer_cast (ds); + mds->DataRecorded.connect_same_thread (_diskstream_data_recorded_connection, boost::bind (&MidiTrack::diskstream_data_recorded, this, _1, _2)); + DiskstreamChanged (); /* EMIT SIGNAL */ } @@ -152,14 +156,6 @@ MidiTrack::_set_state (const XMLNode& node, int version, bool call_base) XMLNode *child; nlist = node.children(); - for (niter = nlist.begin(); niter != nlist.end(); ++niter){ - child = *niter; - - if (child->name() == X_("recenable")) { - _rec_enable_control->set_state (*child, version); - _session.add_controllable (_rec_enable_control); - } - } if (version >= 3000) { if ((child = find_named_node (node, X_("Diskstream"))) != 0) { @@ -169,6 +165,20 @@ MidiTrack::_set_state (const XMLNode& node, int version, bool call_base) } } + /* set rec-enable control *AFTER* setting up diskstream, because it may want to operate + on the diskstream as it sets its own state + */ + + for (niter = nlist.begin(); niter != nlist.end(); ++niter){ + child = *niter; + + if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) { + if (prop->value() == X_("recenable")) { + _rec_enable_control->set_state (*child, version); + } + } + } + pending_state = const_cast (&node); if (_session.state_of_the_state() & Session::Loading) { @@ -288,7 +298,7 @@ MidiTrack::set_state_part_two () } int -MidiTrack::roll (nframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, +MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool can_record, bool rec_monitors_input, bool& needs_butler) { Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK); @@ -310,8 +320,7 @@ MidiTrack::roll (nframes_t nframes, framepos_t start_frame, framepos_t end_frame return 0; } - nframes_t transport_frame = _session.transport_frame(); - + framepos_t transport_frame = _session.transport_frame(); if ((nframes = check_initial_delay (nframes, transport_frame)) == 0) { /* need to do this so that the diskstream sets its @@ -370,18 +379,20 @@ MidiTrack::roll (nframes_t nframes, framepos_t start_frame, framepos_t end_frame write_out_of_band_data (bufs, start_frame, end_frame, nframes); - process_output_buffers (bufs, start_frame, end_frame, nframes, - (!_session.get_record_enabled() || !Config->get_do_not_record_plugins()), declick); + /* final argument: don't waste time with automation if we're recording or we've just stopped (yes it can happen) */ + process_output_buffers (bufs, start_frame, end_frame, nframes, + (!_session.get_record_enabled() || !Config->get_do_not_record_plugins()), declick, + (!diskstream->record_enabled() && !_session.transport_stopped())); } - _main_outs->flush (nframes, end_frame - start_frame - 1); + _main_outs->flush_buffers (nframes, end_frame - start_frame - 1); return 0; } int -MidiTrack::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, +MidiTrack::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool state_changing, bool can_record, bool rec_monitors_input) { int ret = Track::no_roll (nframes, start_frame, end_frame, state_changing, can_record, rec_monitors_input); @@ -394,16 +405,20 @@ MidiTrack::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_fram } void -MidiTrack::handle_transport_stopped (bool abort, bool did_locate, bool flush_processors) +MidiTrack::realtime_handle_transport_stopped () { + Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK); + if (!lm.locked ()) { + return; + } - _main_outs->transport_stopped (); - Route::handle_transport_stopped (abort, did_locate, flush_processors); + for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { + (*i)->realtime_handle_transport_stopped (); + } } - void -MidiTrack::push_midi_input_to_step_edit_ringbuffer (nframes_t nframes) +MidiTrack::push_midi_input_to_step_edit_ringbuffer (framecnt_t nframes) { PortSet& ports (_input->ports()); @@ -415,7 +430,7 @@ MidiTrack::push_midi_input_to_step_edit_ringbuffer (nframes_t nframes) for (MidiBuffer::const_iterator e = mb->begin(); e != mb->end(); ++e) { - const Evoral::MIDIEvent ev(*e, false); + const Evoral::MIDIEvent ev(*e, false); /* note on, since for step edit, note length is determined elsewhere @@ -430,7 +445,7 @@ MidiTrack::push_midi_input_to_step_edit_ringbuffer (nframes_t nframes) } void -MidiTrack::write_out_of_band_data (BufferSet& bufs, sframes_t /*start*/, sframes_t /*end*/, nframes_t nframes) +MidiTrack::write_out_of_band_data (BufferSet& bufs, framepos_t /*start*/, framepos_t /*end*/, framecnt_t nframes) { // Append immediate events MidiBuffer& buf (bufs.get_midi (0)); @@ -447,13 +462,13 @@ MidiTrack::write_out_of_band_data (BufferSet& bufs, sframes_t /*start*/, sframes } int -MidiTrack::export_stuff (BufferSet& /*bufs*/, nframes_t /*nframes*/, sframes_t /*end_frame*/) +MidiTrack::export_stuff (BufferSet& /*bufs*/, framecnt_t /*nframes*/, framepos_t /*end_frame*/) { return -1; } void -MidiTrack::set_latency_delay (nframes_t longest_session_latency) +MidiTrack::set_latency_delay (framecnt_t longest_session_latency) { Route::set_latency_delay (longest_session_latency); _diskstream->set_roll_delay (_roll_delay); @@ -470,7 +485,7 @@ MidiTrack::bounce (InterThreadInfo& /*itt*/) boost::shared_ptr -MidiTrack::bounce_range (nframes_t /*start*/, nframes_t /*end*/, InterThreadInfo& /*itt*/, bool /*enable_processing*/) +MidiTrack::bounce_range (framepos_t /*start*/, framepos_t /*end*/, InterThreadInfo& /*itt*/, bool /*enable_processing*/) { throw; //vector srcs; @@ -608,7 +623,7 @@ MidiTrack::set_midi_thru (bool yn) } boost::shared_ptr -MidiTrack::write_source (uint32_t n) +MidiTrack::write_source (uint32_t) { return midi_diskstream()->write_source (); } @@ -636,3 +651,10 @@ MidiTrack::midi_playlist () { return midi_diskstream()->midi_playlist (); } + +void +MidiTrack::diskstream_data_recorded (boost::shared_ptr buf, boost::weak_ptr src) +{ + DataRecorded (buf, src); /* EMIT SIGNAL */ +} +