prepare for musical-time preroll
authorRobin Gareus <robin@gareus.org>
Wed, 18 Jan 2017 16:30:55 +0000 (17:30 +0100)
committerRobin Gareus <robin@gareus.org>
Wed, 18 Jan 2017 16:31:42 +0000 (17:31 +0100)
gtk2_ardour/editor.h
gtk2_ardour/editor_ops.cc

index d34a40cda86cb134dd2cc5eaa319f52198e4ddf8..14151b95ff67db0b019cf57a416ccf0295d869bb 100644 (file)
@@ -261,7 +261,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        bool extend_selection_to_track (TimeAxisView&);
 
        void play_selection ();
-       framepos_t get_preroll ();
+       framepos_t get_preroll (framepos_t);
        void maybe_locate_with_edit_preroll (framepos_t);
        void play_with_preroll ();
        void rec_with_preroll ();
index 95be0ed972d58544ff50e194aef7db0797cebed5..00234670ea1d0c073ad552bd270c6160d08bad24 100644 (file)
@@ -2607,23 +2607,34 @@ Editor::play_selection ()
 }
 
 framepos_t
-Editor::get_preroll ()
+Editor::get_preroll (framepos_t pos)
 {
+#if 0 // TODO: this needs a config option, or special case (e.g. negative get_preroll_seconds ())
+       if (pos >= 0) {
+               /* currently 1 bar's worth of pre-roll, not aligned to bar/beat
+                * to align to a bar before pos, see count_in, session_transport.cc
+                */
+               const Tempo& tempo = _session->tempo_map().tempo_at_frame (pos);
+               const Meter& meter = _session->tempo_map().meter_at_frame (pos);
+               return meter.frames_per_bar (tempo, _session->frame_rate());
+       }
+#endif
        return Config->get_preroll_seconds() * _session->frame_rate();
 }
 
 
 void
-Editor::maybe_locate_with_edit_preroll ( framepos_t location )
+Editor::maybe_locate_with_edit_preroll (framepos_t location)
 {
        if ( _session->transport_rolling() || !UIConfiguration::instance().get_follow_edits() || _session->config.get_external_sync() )
                return;
 
-       location -= get_preroll();
+       location -= get_preroll (location);
 
        //don't try to locate before the beginning of time
-       if ( location < 0 )
+       if (location < 0) {
                location = 0;
+       }
 
        //if follow_playhead is on, keep the playhead on the screen
        if ( _follow_playhead )
@@ -2636,14 +2647,15 @@ Editor::maybe_locate_with_edit_preroll ( framepos_t location )
 void
 Editor::play_with_preroll ()
 {
-       framepos_t preroll = get_preroll();
        framepos_t start, end;
        if ( UIConfiguration::instance().get_follow_edits() && get_selection_extents ( start, end) ) {
+               const framepos_t preroll = get_preroll (start);
 
                framepos_t ret = start;
                
-               if (start > preroll)
+               if (start > preroll) {
                        start = start - preroll;
+               }
 
                end = end + preroll;  //"post-roll"
 
@@ -2652,24 +2664,26 @@ Editor::play_with_preroll ()
                lar.push_back (ar);
 
                _session->request_play_range (&lar, true);
-               _session->set_requested_return_frame( ret );  //force auto-return to return to range start, without the preroll
+               _session->set_requested_return_frame (ret);  //force auto-return to return to range start, without the preroll
        } else {
                framepos_t ph = playhead_cursor->current_frame ();
+               const framepos_t preroll = get_preroll (ph);
                framepos_t start;
-               if (ph > preroll)
+               if (ph > preroll) {
                        start = ph - preroll; 
-               else
+               } else {
                        start = 0;
-               _session->request_locate ( start, true);
-               _session->set_requested_return_frame( ph );  //force auto-return to return to playhead location, without the preroll
+               }
+               _session->request_locate (start, true);
+               _session->set_requested_return_frame (ph);  //force auto-return to return to playhead location, without the preroll
        }
 }
 
 void
 Editor::rec_with_preroll ()
 {
-       framepos_t preroll = get_preroll();
        framepos_t ph = playhead_cursor->current_frame ();
+       framepos_t preroll = get_preroll (ph);
        framepos_t start = std::max ((framepos_t)0, ph - preroll);
 
        _session->request_preroll_record (ph);