From 5574b46de4ec67d680e8c5ceddaf5a4d8a554694 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 7 Nov 2009 23:48:19 +0000 Subject: [PATCH] clean up that godawful programming style in the last transport commit, and fix dynamic range playback git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6031 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour_ui.cc | 6 +- gtk2_ardour/editor_mouse.cc | 5 ++ gtk2_ardour/editor_ops.cc | 2 +- libs/ardour/ardour/session.h | 7 +- libs/ardour/session_events.cc | 2 +- libs/ardour/session_transport.cc | 93 +++++++++++----------- libs/surfaces/control_protocol/basic_ui.cc | 3 +- 7 files changed, 58 insertions(+), 60 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 32b2bc3794..ba20dbd56a 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1484,8 +1484,7 @@ ARDOUR_UI::transport_roll () return; } } else if (session->get_play_range ()) { - list empty; - session->request_play_range (empty, false, true); + session->request_play_range (0, true); } if (!rolling) { @@ -1536,8 +1535,7 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) session->request_play_loop (false, true); } else if (session->get_play_range ()) { affect_transport = false; - list empty; - session->request_play_range (empty, false, true); + session->request_play_range (0, true); } } diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index ffdf3de9e4..8275b50347 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -4657,6 +4657,11 @@ Editor::end_selection_op (ArdourCanvas::Item* item, GdkEvent* event) } } + /* XXX what if its a music time selection? */ + if (session->get_play_range() && session->transport_rolling()) { + session->request_play_range (&selection->time, true); + } + stop_canvas_autoscroll (); } diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 803c34b2c0..c3464033b3 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -2428,7 +2428,7 @@ Editor::play_selection () return; } - session->request_play_range (selection->time, true); + session->request_play_range (&selection->time, true); } void diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 312f0f3628..e46b96b594 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -926,14 +926,13 @@ class Session : public PBD::StatefulDestructible /* ranges */ - void request_play_range (list&, bool yn, bool leave_rolling = false); + void request_play_range (list*, bool leave_rolling = false); bool get_play_range () const { return _play_range; } /* favorite dirs */ typedef vector FavoriteDirs; static int read_favorite_dirs (FavoriteDirs&); - static int write_favorite_dirs (FavoriteDirs&); /* file suffixes */ @@ -1734,8 +1733,8 @@ class Session : public PBD::StatefulDestructible list current_audio_range; bool _play_range; - void set_play_range (list&, bool yn, bool leave_rolling); - void setup_auto_play (list&); + void set_play_range (list&, bool leave_rolling); + void unset_play_range (); /* main outs */ uint32_t main_outs; diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc index 58702c133b..10201cd638 100644 --- a/libs/ardour/session_events.cc +++ b/libs/ardour/session_events.cc @@ -427,7 +427,7 @@ Session::process_event (Event* ev) break; case Event::SetPlayAudioRange: - set_play_range (ev->audio_range, ev->yes_or_no, (ev->speed == 1.0f)); + set_play_range (ev->audio_range, (ev->speed == 1.0f)); break; default: diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 2ed8746c99..2f05d329de 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -140,10 +140,14 @@ Session::request_play_loop (bool yn, bool leave_rolling) } void -Session::request_play_range (list& range, bool yn, bool leave_rolling) +Session::request_play_range (list* range, bool leave_rolling) { - Event* ev = new Event (Event::SetPlayAudioRange, Event::Add, Event::Immediate, 0, (leave_rolling ? 1.0 : 0.0), yn); - ev->audio_range = range; + Event* ev = new Event (Event::SetPlayAudioRange, Event::Add, Event::Immediate, 0, (leave_rolling ? 1.0 : 0.0)); + if (range) { + ev->audio_range = *range; + } else { + ev->audio_range.clear (); + } queue_event (ev); } @@ -617,8 +621,7 @@ Session::set_play_loop (bool yn) if (loc) { - list empty; - set_play_range (empty, false, true); + unset_play_range (); if (Config->get_seamless_loop()) { // set all diskstreams to use internal looping @@ -1186,56 +1189,38 @@ Session::set_diskstream_speed (Diskstream* stream, float speed) } void -Session::set_play_range (list& range, bool yn, bool leave_rolling) +Session::unset_play_range () { - /* Called from event-processing context */ - - if (yn) { - if (range.empty()) { - /* make it a no-op */ - return; - } - /* cancel loop play */ - unset_play_loop (); - } - - _play_range = yn; - - setup_auto_play (range); - - if (!_play_range && !leave_rolling) { - /* stop transport */ - Event* ev = new Event (Event::SetTransportSpeed, Event::Add, Event::Immediate, 0, 0.0f, false); - merge_event (ev); - } - - TransportStateChange (); -} - -void -Session::request_bounded_roll (nframes_t start, nframes_t end) -{ - AudioRange ar (start, end, 0); - list lar; - - lar.push_back (ar); - request_play_range (lar, true, true); -} - -void -Session::setup_auto_play (list& range) -{ - /* Called from event-processing context */ - - Event* ev; - + _play_range = false; _clear_event_type (Event::RangeStop); _clear_event_type (Event::RangeLocate); +} - if (!_play_range) { +void +Session::set_play_range (list& range, bool leave_rolling) +{ + Event* ev; + + /* Called from event-processing context */ + + unset_play_range (); + + if (range.empty()) { + /* _play_range set to false in unset_play_range() + */ + if (!leave_rolling) { + /* stop transport */ + Event* ev = new Event (Event::SetTransportSpeed, Event::Add, Event::Immediate, 0, 0.0f, false); + merge_event (ev); + } return; } + _play_range = true; + + /* cancel loop play */ + unset_play_loop (); + list::size_type sz = range.size(); if (sz > 1) { @@ -1285,6 +1270,18 @@ Session::setup_auto_play (list& range) ev = new Event (Event::LocateRoll, Event::Add, Event::Immediate, range.front().start, 0.0f, false); merge_event (ev); + + TransportStateChange (); +} + +void +Session::request_bounded_roll (nframes_t start, nframes_t end) +{ + AudioRange ar (start, end, 0); + list lar; + + lar.push_back (ar); + request_play_range (&lar, true); } void diff --git a/libs/surfaces/control_protocol/basic_ui.cc b/libs/surfaces/control_protocol/basic_ui.cc index 8f7c0ed771..d8c1caa0c1 100644 --- a/libs/surfaces/control_protocol/basic_ui.cc +++ b/libs/surfaces/control_protocol/basic_ui.cc @@ -122,8 +122,7 @@ BasicUI::transport_play (bool from_last_start) } if (session->get_play_range ()) { - list empty; - session->request_play_range (empty, false); + session->request_play_range (0); } if (from_last_start && rolling) {