decrement_transport_position (_worst_output_latency);
#endif
- if (_transport_frame > current_end_frame()) {
-
- /* first capture resets end location; later captures can only extend the length */
-
- if (_end_location_is_free) {
- end_location->set_end (_transport_frame);
- _end_location_is_free = false;
- } else if (_transport_frame > end_location->start()) {
- end_location->set_end (_transport_frame);
- }
+ /* the duration change is not guaranteed to have happened, but is likely */
- post_transport_work = PostTransportWork (post_transport_work | PostTransportDuration);
- }
+ post_transport_work = PostTransportWork (post_transport_work | PostTransportDuration);
}
-
if (abort) {
post_transport_work = PostTransportWork (post_transport_work | PostTransportAbort);
}
_clear_event_type (Event::RangeStop);
_clear_event_type (Event::RangeLocate);
- disable_record ();
+ disable_record (true);
reset_slave_state ();
struct tm* now;
time_t xnow;
bool did_record;
-
+
did_record = false;
-
+
for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
if ((*i)->get_captured_frames () != 0) {
did_record = true;
if (did_record) {
begin_reversible_command ("capture");
-
+
Location* loc = _locations.end_location();
+ bool change_end = false;
- if (loc && !_have_captured) {
-
- /* first capture.
-
- note: later captures that extend the session length get
- handled because of playlist length changes.
- */
+ if (_transport_frame < loc->end()) {
+
+ /* stopped recording before current end */
+
+ if (_end_location_is_free) {
+
+ /* first capture for this session, move end back to where we are */
+
+ change_end = true;
+ }
+
+ } else if (_transport_frame > loc->end()) {
- add_undo (sigc::retype_return<void>(sigc::bind (mem_fun (*loc, &Location::set_end), loc->end())));
- add_redo (sigc::retype_return<void>(sigc::bind (mem_fun (*loc, &Location::set_end), _transport_frame)));
+ /* stopped recording after the current end, extend it */
+
+ change_end = true;
+ }
+
+ if (change_end) {
+ add_undo (sigc::retype_return<void>(sigc::bind (mem_fun (*loc, &Location::set_end), loc->end())));
+ add_redo (sigc::retype_return<void>(sigc::bind (mem_fun (*loc, &Location::set_end), _transport_frame)));
}
+ _end_location_is_free = false;
_have_captured = true;
}
deliver_mmc (MIDI::MachineControl::cmdLocate, _transport_frame);
if (did_record) {
- atomic_set (&_record_status, Disabled);
- RecordDisabled (); /* EMIT SIGNAL */
+
+ /* XXX its a little odd that we're doing this here
+ when realtime_stop(), which has already executed,
+ will have done this.
+ */
+
+ if (!Config->get_latched_record_enable()) {
+ atomic_set (&_record_status, Disabled);
+ } else {
+ atomic_set (&_record_status, Enabled);
+ }
+ RecordStateChanged (); /* emit signal */
}
if ((post_transport_work & PostTransportLocate) && get_record_enabled()) {
save_state ("", true);
}
- /* save the current state of things if appropriate */
+ /* always try to get rid of this */
+
+ remove_pending_capture_state ();
+ /* save the current state of things if appropriate */
+
if (did_record) {
save_state (_current_snapshot_name);
}
} else if (transport_stopped() && speed == 1.0) {
+ if (!get_record_enabled() && Config->get_stop_at_session_end() && _transport_frame >= current_end_frame()) {
+ return;
+ }
+
if (Config->get_use_hardware_monitoring()) {
/* Even though this is called from RT context we are using
a non-tentative rwlock here, because the action must occur.
} else {
+ if (!get_record_enabled() && Config->get_stop_at_session_end() && _transport_frame >= current_end_frame()) {
+ return;
+ }
+
if ((synced_to_jack()) && speed != 0.0 && speed != 1.0) {
warning << _("Global varispeed cannot be supported while Ardour is connected to JACK transport control")
<< endmsg;
break;
case Recording:
- disable_record ();
+ disable_record (false);
break;
default:
bool reverse = false;
bool non_rt_required = false;
+ if (src == _slave_type) {
+ return 0;
+ }
+
if (_transport_speed) {
error << _("please stop the transport before adjusting slave settings") << endmsg;
/* help out non-MVC friendly UI's by telling them the slave type changed */
- ControlChanged (SlaveType); /* EMIT SIGNAL */
+ ControlChanged (SlaveType); /* EMIT SIGNAL */
return 0;
}
- if (src == _slave_type) {
- return 0;
- }
-
// if (src == JACK && Config->get_jack_time_master()) {
// return -1;
// }