Update auto loop range to match session range until it is changed by the user. Fixes...
authorCarl Hetherington <carl@carlh.net>
Thu, 7 Oct 2010 18:33:20 +0000 (18:33 +0000)
committerCarl Hetherington <carl@carlh.net>
Thu, 7 Oct 2010 18:33:20 +0000 (18:33 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7883 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/session.h
libs/ardour/location.cc
libs/ardour/session.cc

index d10e01d18fec6f59e692afb51c878a2ec847b5a4..82b5d1360dc1a141f4713e8c30b2fa8d7cc728e9 100644 (file)
@@ -463,8 +463,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
 
        nframes_t convert_to_frames_at (nframes_t position, AnyTime const &);
 
-       static PBD::Signal0<void> StartTimeChanged;
-       static PBD::Signal0<void> EndTimeChanged;
+       static PBD::Signal1<void, framepos_t> StartTimeChanged;
+       static PBD::Signal1<void, framepos_t> EndTimeChanged;
        static PBD::Signal0<void> TimecodeOffsetChanged;
 
         std::vector<SyncSource> get_available_sync_options() const;
@@ -1442,6 +1442,9 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
        mutable gint _suspend_timecode_transmission;
 
        void update_locations_after_tempo_map_change (Locations::LocationList &);
+
+       void start_time_changed (framepos_t);
+       void end_time_changed (framepos_t);
 };
 
 } // namespace ARDOUR
index 5f6f14ce1406e1f6dac7d03f64831c0511b18057..7dce787b6099d5026fb1d7eb0478994ccf999e25 100644 (file)
@@ -150,13 +150,16 @@ Location::set_start (framepos_t s, bool force, bool allow_bbt_recompute)
        }
        
        if (s != _start) {
+
+               framepos_t const old = _start;
+               
                _start = s;
                if (allow_bbt_recompute) {
                        recompute_bbt_from_frames ();
                }
                start_changed (this); /* EMIT SIGNAL */
                if (is_session_range ()) {
-                       Session::StartTimeChanged (); /* EMIT SIGNAL */
+                       Session::StartTimeChanged (old); /* EMIT SIGNAL */
                        AudioFileSource::set_header_position_offset (s);
                }
        }
@@ -196,6 +199,8 @@ Location::set_end (framepos_t e, bool force, bool allow_bbt_recompute)
        }
 
        if (e != _end) {
+               framepos_t const old = _end;
+               
                _end = e;
                if (allow_bbt_recompute) {
                        recompute_bbt_from_frames ();
@@ -203,7 +208,7 @@ Location::set_end (framepos_t e, bool force, bool allow_bbt_recompute)
                end_changed(this); /* EMIT SIGNAL */
 
                if (is_session_range()) {
-                       Session::EndTimeChanged (); /* EMIT SIGNAL */
+                       Session::EndTimeChanged (old); /* EMIT SIGNAL */
                }
        }
 
@@ -688,6 +693,11 @@ Locations::add (Location *loc, bool make_current)
        if (make_current) {
                 current_changed (current_location); /* EMIT SIGNAL */
        }
+
+       if (loc->is_session_range()) {
+               Session::StartTimeChanged (0);
+               Session::EndTimeChanged (1);
+       }
 }
 
 void
index 8a3eb6a6c68c164a5932ac5ab4f3eecf6269d308..54fb4c20bd03fc371e3d6efe743ecc5267b3a8ac 100644 (file)
@@ -119,8 +119,8 @@ PBD::Signal2<int,nframes_t,nframes_t> Session::AskAboutSampleRateMismatch;
 PBD::Signal0<void> Session::SendFeedback;
 
 PBD::Signal0<void> Session::TimecodeOffsetChanged;
-PBD::Signal0<void> Session::StartTimeChanged;
-PBD::Signal0<void> Session::EndTimeChanged;
+PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
+PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
 PBD::Signal0<void> Session::AutoBindingOn;
 PBD::Signal0<void> Session::AutoBindingOff;
 PBD::Signal2<void,std::string, std::string> Session::Exported;
@@ -203,6 +203,9 @@ Session::Session (AudioEngine &eng,
                DirtyChanged (); /* EMIT SIGNAL */
        }
 
+       StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
+       EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
+
         _is_new = false;
 }
 
@@ -4028,3 +4031,33 @@ Session::step_edit_status_change (bool yn)
 }
 
         
+void
+Session::start_time_changed (framepos_t old)
+{
+       /* Update the auto loop range to match the session range
+          (unless the auto loop range has been changed by the user)
+       */
+       
+       Location* s = _locations->session_range_location ();
+       Location* l = _locations->auto_loop_location ();
+
+       if (l->start() == old) {
+               l->set_start (s->start(), true);
+       }
+}
+
+void
+Session::end_time_changed (framepos_t old)
+{
+       /* Update the auto loop range to match the session range
+          (unless the auto loop range has been changed by the user)
+       */
+
+       Location* s = _locations->session_range_location ();
+       Location* l = _locations->auto_loop_location ();
+
+       if (l->end() == old) {
+               cout << "set end to " << s->end() << "\n";
+               l->set_end (s->end(), true);
+       }
+}