better design for range plays that leaves the range play button able to play the...
authorPaul Davis <paul@linuxaudiosystems.com>
Sat, 7 Nov 2009 17:15:54 +0000 (17:15 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Sat, 7 Nov 2009 17:15:54 +0000 (17:15 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6029 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour_ui.cc
gtk2_ardour/editor_mouse.cc
gtk2_ardour/editor_ops.cc
libs/ardour/ardour/session.h
libs/ardour/enums.cc
libs/ardour/session_events.cc
libs/ardour/session_transport.cc
libs/surfaces/control_protocol/basic_ui.cc

index 834c329793a16b8105c8687c0f42d76e0f9b6fba..32b2bc3794286e6de9b04f626bc26b589af4f068 100644 (file)
@@ -1484,7 +1484,8 @@ ARDOUR_UI::transport_roll ()
                        return;
                }
        } else if (session->get_play_range ()) {
-               session->request_play_range (false, true);
+               list<AudioRange> empty;
+               session->request_play_range (empty, false, true);
        } 
 
        if (!rolling) {
@@ -1535,7 +1536,8 @@ 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;
-                       session->request_play_range (false, true);
+                       list<AudioRange> empty;
+                       session->request_play_range (empty, false, true);
                } 
        } 
 
index 3fd7e09afc96702e3d39139996a266c3d40b1470..ffdf3de9e4e226aa9503d5c0d9115247c538e486 100644 (file)
@@ -4657,8 +4657,6 @@ Editor::end_selection_op (ArdourCanvas::Item* item, GdkEvent* event)
                } 
        }
 
-       /* XXX what happens if its a music selection? */
-       session->set_audio_range (selection->time);
        stop_canvas_autoscroll ();
 }
 
index 63533991f7deeb0d3dabb8928564ec03c36f3569..803c34b2c0a17ef8a765d3cf97b1877f5d545b45 100644 (file)
@@ -2428,7 +2428,7 @@ Editor::play_selection ()
                return;
        }
 
-       session->request_play_range (true);
+       session->request_play_range (selection->time, true);
 }
 
 void
index 50ca7a91fef6a6c0448d04b2341856ea5283ae67..312f0f362892a2f6a6890ebea218fc9786bfb23f 100644 (file)
@@ -135,8 +135,7 @@ class Session : public PBD::StatefulDestructible
                    SetSlaveSource,
                    Audition,
                    InputConfigurationChange,
-                   SetAudioRange,
-                   SetPlayRange,
+                   SetPlayAudioRange,
                    
                    /* only one of each of these events
                       can be queued at any one time
@@ -927,10 +926,7 @@ class Session : public PBD::StatefulDestructible
 
        /* ranges */
 
-       void set_audio_range (list<AudioRange>&);
-       void set_music_range (list<MusicRange>&);
-
-       void request_play_range (bool yn, bool leave_rolling = false);
+       void request_play_range (list<AudioRange>&, bool yn, bool leave_rolling = false);
        bool get_play_range () const { return _play_range; }
 
        /* favorite dirs */
@@ -1738,8 +1734,8 @@ class Session : public PBD::StatefulDestructible
 
        list<AudioRange> current_audio_range;
        bool _play_range;
-       void set_play_range (bool yn, bool leave_rolling);
-       void setup_auto_play ();
+       void set_play_range (list<AudioRange>&, bool yn, bool leave_rolling);
+       void setup_auto_play (list<AudioRange>&);
 
        /* main outs */
        uint32_t main_outs;
index 78583c8ddfc51ff5a19dd3f6213c85a9e875bf08..25f3eccf61b85d6486464944303bc971508fe54a 100644 (file)
@@ -242,8 +242,7 @@ setup_enum_writer ()
        REGISTER_CLASS_ENUM (Session::Event, SetSlaveSource);
        REGISTER_CLASS_ENUM (Session::Event, Audition);
        REGISTER_CLASS_ENUM (Session::Event, InputConfigurationChange);
-       REGISTER_CLASS_ENUM (Session::Event, SetAudioRange);
-       REGISTER_CLASS_ENUM (Session::Event, SetPlayRange);
+       REGISTER_CLASS_ENUM (Session::Event, SetPlayAudioRange);
        REGISTER_CLASS_ENUM (Session::Event, StopOnce);
        REGISTER_CLASS_ENUM (Session::Event, AutoLoop);
        REGISTER (_Session_Event_Type);
index fe5f08fa03984be4cb35e7920b826f801f2b7a54..58702c133b9aedf37f7e9baed4307d614850b0ef 100644 (file)
@@ -426,13 +426,8 @@ Session::process_event (Event* ev)
                schedule_butler_transport_work ();
                break;
 
-       case Event::SetAudioRange:
-               current_audio_range = ev->audio_range;
-               setup_auto_play ();
-               break;
-
-       case Event::SetPlayRange:
-               set_play_range (ev->yes_or_no, (ev->speed == 1.0f));
+       case Event::SetPlayAudioRange:
+               set_play_range (ev->audio_range, ev->yes_or_no, (ev->speed == 1.0f));
                break;
 
        default:
index c4cfbb802f6ee481055a69c1cfa264f2a36311da..2ed8746c99e090b14435122feeabe0187cf0895a 100644 (file)
@@ -140,9 +140,10 @@ Session::request_play_loop (bool yn, bool leave_rolling)
 }
 
 void
-Session::request_play_range (bool yn, bool leave_rolling)
+Session::request_play_range (list<AudioRange>& range, bool yn, bool leave_rolling)
 {
-       Event* ev = new Event (Event::SetPlayRange, Event::Add, Event::Immediate, 0, (leave_rolling ? 1.0 : 0.0), yn);
+       Event* ev = new Event (Event::SetPlayAudioRange, Event::Add, Event::Immediate, 0, (leave_rolling ? 1.0 : 0.0), yn);
+       ev->audio_range = range;
        queue_event (ev);
 }
 
@@ -616,7 +617,8 @@ Session::set_play_loop (bool yn)
 
                if (loc) {
 
-                       set_play_range (false, true);
+                       list<AudioRange> empty;
+                       set_play_range (empty, false, true);
 
                        if (Config->get_seamless_loop()) {
                                // set all diskstreams to use internal looping
@@ -1184,26 +1186,22 @@ Session::set_diskstream_speed (Diskstream* stream, float speed)
 }
 
 void
-Session::set_audio_range (list<AudioRange>& range)
-{
-       Event *ev = new Event (Event::SetAudioRange, Event::Add, Event::Immediate, 0, 0.0f);
-       ev->audio_range = range;
-       queue_event (ev);
-}
-
-void
-Session::set_play_range (bool yn, bool leave_rolling)
+Session::set_play_range (list<AudioRange>& range, bool yn, bool leave_rolling)
 {
        /* 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 ();
+       setup_auto_play (range);
        
        if (!_play_range && !leave_rolling) {
                /* stop transport */
@@ -1219,13 +1217,13 @@ Session::request_bounded_roll (nframes_t start, nframes_t end)
 {
        AudioRange ar (start, end, 0);
        list<AudioRange> lar;
+
        lar.push_back (ar);
-       set_audio_range (lar);
-       request_play_range (true, true);
+       request_play_range (lar, true, true);
 }
 
 void
-Session::setup_auto_play ()
+Session::setup_auto_play (list<AudioRange>& range)
 {
        /* Called from event-processing context */
 
@@ -1238,14 +1236,14 @@ Session::setup_auto_play ()
                return;
        }
 
-       list<AudioRange>::size_type sz = current_audio_range.size();
+       list<AudioRange>::size_type sz = range.size();
        
        if (sz > 1) {
                
-               list<AudioRange>::iterator i = current_audio_range.begin(); 
+               list<AudioRange>::iterator i = range.begin(); 
                list<AudioRange>::iterator next;
                
-               while (i != current_audio_range.end()) {
+               while (i != range.end()) {
                        
                        next = i;
                        ++next;
@@ -1261,7 +1259,7 @@ Session::setup_auto_play ()
                                requested_frame = 0;
                        }
                        
-                       if (next == current_audio_range.end()) {
+                       if (next == range.end()) {
                                ev = new Event (Event::RangeStop, Event::Add, requested_frame, 0, 0.0f);
                        } else {
                                ev = new Event (Event::RangeLocate, Event::Add, requested_frame, (*next).start, 0.0f);
@@ -1274,14 +1272,18 @@ Session::setup_auto_play ()
                
        } else if (sz == 1) {
 
-               ev = new Event (Event::RangeStop, Event::Add, current_audio_range.front().end, 0, 0.0f);
+               ev = new Event (Event::RangeStop, Event::Add, range.front().end, 0, 0.0f);
                merge_event (ev);
                
        } 
 
+       /* save range so we can do auto-return etc. */
+
+       current_audio_range = range;
+
        /* now start rolling at the right place */
 
-       ev = new Event (Event::LocateRoll, Event::Add, Event::Immediate, current_audio_range.front().start, 0.0f, false);
+       ev = new Event (Event::LocateRoll, Event::Add, Event::Immediate, range.front().start, 0.0f, false);
        merge_event (ev);
 }
 
index cda5497700fd14ef51a82dfccee74b216d9d2938..8f7c0ed771a24790f596ea02cf16a9c415ce78df 100644 (file)
@@ -122,7 +122,8 @@ BasicUI::transport_play (bool from_last_start)
        } 
 
        if (session->get_play_range ()) {
-               session->request_play_range (false);
+               list<AudioRange> empty;
+               session->request_play_range (empty, false);
        }
        
        if (from_last_start && rolling) {