+
+ if (!_session) {
+ return;
+ }
+
+ if (_session->is_auditioning()) {
+ _session->cancel_audition ();
+ return;
+ }
+
+ if (_session->config.get_external_sync()) {
+ switch (_session->config.get_sync_source()) {
+ case JACK:
+ break;
+ default:
+ /* transport controlled by the master */
+ return;
+ }
+ }
+
+ bool rolling = _session->transport_rolling();
+ bool affect_transport = true;
+
+ if (rolling && roll_out_of_bounded_mode) {
+ /* drop out of loop/range playback but leave transport rolling */
+ if (_session->get_play_loop()) {
+ if (Config->get_seamless_loop()) {
+ /* the disk buffers contain copies of the loop - we can't
+ just keep playing, so stop the transport. the user
+ can restart as they wish.
+ */
+ affect_transport = true;
+ } else {
+ /* disk buffers are normal, so we can keep playing */
+ affect_transport = false;
+ }
+ _session->request_play_loop (false, true);
+ } else if (_session->get_play_range ()) {
+ affect_transport = false;
+ _session->request_play_range (0, true);
+ }
+ }
+
+ if (affect_transport) {
+ if (rolling) {
+ _session->request_stop (with_abort, true);
+ } else {
+ if (join_play_range_button.get_active()) {
+ _session->request_play_range (&editor->get_selection().time, true);
+ }
+
+ _session->request_transport_speed (1.0f);
+ }
+ }
+}
+
+void
+ARDOUR_UI::toggle_session_auto_loop ()
+{
+ if (_session) {
+ if (_session->get_play_loop()) {
+ if (_session->transport_rolling()) {
+ Location * looploc = _session->locations()->auto_loop_location();