Some paths weren't getting set up correctly for the MSVC build
[ardour.git] / gtk2_ardour / editor_ops.cc
index 00234670ea1d0c073ad552bd270c6160d08bad24..251233a433b8f9f8ac5c40cb506c78e0d92fba1a 100644 (file)
@@ -166,8 +166,7 @@ Editor::redo (uint32_t n)
 }
 
 void
-Editor::split_regions_at (framepos_t where, RegionSelection& regions, const int32_t sub_num,
-                          bool snap_frame)
+Editor::split_regions_at (MusicFrame where, RegionSelection& regions, bool snap_frame)
 {
        bool frozen = false;
 
@@ -214,7 +213,7 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions, const int3
                   have something to split.
                */
 
-               if (!(*a)->region()->covers (where)) {
+               if (!(*a)->region()->covers (where.frame)) {
                        ++a;
                        continue;
                }
@@ -246,7 +245,7 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions, const int3
 
                if (pl) {
                        pl->clear_changes ();
-                       pl->split_region ((*a)->region(), where, sub_num);
+                       pl->split_region ((*a)->region(), where);
                        _session->add_command (new StatefulDiffCommand (pl));
                }
 
@@ -292,7 +291,7 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions, const int3
                }
 
                for (RegionSelection::iterator ri = latest_regionviews.begin(); ri != latest_regionviews.end(); ri++) {
-                       if ((*ri)->region()->position() < where) {
+                       if ((*ri)->region()->position() < where.frame) {
                                // new regions created before the split
                                if (rsas & NewlyCreatedLeft) {
                                        selection->add (*ri);
@@ -2606,22 +2605,6 @@ Editor::play_selection ()
        _session->request_play_range (&lar, true);
 }
 
-framepos_t
-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)
@@ -2629,7 +2612,7 @@ 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);
+       location -= _session->preroll_samples (location);
 
        //don't try to locate before the beginning of time
        if (location < 0) {
@@ -2649,7 +2632,7 @@ Editor::play_with_preroll ()
 {
        framepos_t start, end;
        if ( UIConfiguration::instance().get_follow_edits() && get_selection_extents ( start, end) ) {
-               const framepos_t preroll = get_preroll (start);
+               const framepos_t preroll = _session->preroll_samples (start);
 
                framepos_t ret = start;
                
@@ -2667,7 +2650,7 @@ Editor::play_with_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);
+               const framepos_t preroll = _session->preroll_samples (ph);
                framepos_t start;
                if (ph > preroll) {
                        start = ph - preroll; 
@@ -2683,13 +2666,8 @@ void
 Editor::rec_with_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);
-       _session->maybe_enable_record ();
-       _session->request_locate (start, true);
-       _session->set_requested_return_frame (ph);
+       framepos_t preroll = _session->preroll_samples (ph);
+       _session->request_preroll_record_trim (ph, preroll);
 }
 
 
@@ -4281,7 +4259,7 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
                }
 
                /* Add all selected points to the relevant copy ControlLists */
-               framepos_t start = std::numeric_limits<framepos_t>::max();
+               MusicFrame start (std::numeric_limits<framepos_t>::max(), 0);
                for (PointSelection::iterator sel_point = selection->points.begin(); sel_point != selection->points.end(); ++sel_point) {
                        boost::shared_ptr<AutomationList>    al = (*sel_point)->line().the_list();
                        AutomationList::const_iterator ctrl_evt = (*sel_point)->model ();
@@ -4292,7 +4270,7 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
                                earliest = std::min(earliest, Evoral::Beats((*ctrl_evt)->when));
                        } else {
                                /* Update earliest session start time in frames */
-                               start = std::min(start, (*sel_point)->line().session_position(ctrl_evt));
+                               start.frame = std::min(start.frame, (*sel_point)->line().session_position(ctrl_evt));
                        }
                }
 
@@ -4303,13 +4281,13 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
                        }
                        earliest.round_down_to_beat();
                } else {
-                       if (start == std::numeric_limits<double>::max()) {
-                               start = 0;  // Weird... don't offset
+                       if (start.frame == std::numeric_limits<double>::max()) {
+                               start.frame = 0;  // Weird... don't offset
                        }
                        snap_to(start, RoundDownMaybe);
                }
 
-               const double line_offset = midi ? earliest.to_double() : start;
+               const double line_offset = midi ? earliest.to_double() : start.frame;
                for (Lists::iterator i = lists.begin(); i != lists.end(); ++i) {
                        /* Correct this copy list so that it is relative to the earliest
                           start time, so relative ordering between points is preserved
@@ -4712,22 +4690,21 @@ void
 Editor::paste (float times, bool from_context)
 {
         DEBUG_TRACE (DEBUG::CutNPaste, "paste to preferred edit pos\n");
-
-       paste_internal (get_preferred_edit_position (EDIT_IGNORE_NONE, from_context), times, get_grid_music_divisions (0));
+       MusicFrame where (get_preferred_edit_position (EDIT_IGNORE_NONE, from_context), 0);
+       paste_internal (where.frame, times, 0);
 }
 
 void
 Editor::mouse_paste ()
 {
-       framepos_t where;
+       MusicFrame where (0, 0);
        bool ignored;
-
-       if (!mouse_frame (where, ignored)) {
+       if (!mouse_frame (where.frame, ignored)) {
                return;
        }
 
        snap_to (where);
-       paste_internal (where, 1, get_grid_music_divisions (0));
+       paste_internal (where.frame, 1, where.division);
 }
 
 void
@@ -5766,11 +5743,17 @@ Editor::toggle_region_lock_style ()
                return;
        }
 
-       begin_reversible_command (_("region lock style"));
+       Glib::RefPtr<ToggleAction> a = Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-lock-style"));
+       vector<Widget*> proxies = a->get_proxies();
+       CheckMenuItem* cmi = dynamic_cast<CheckMenuItem*> (proxies.front());
+
+       assert (cmi);
+
+       begin_reversible_command (_("toggle region lock style"));
 
        for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
                (*i)->region()->clear_changes ();
-               PositionLockStyle const ns = (*i)->region()->position_lock_style() == AudioTime ? MusicTime : AudioTime;
+               PositionLockStyle const ns = ((*i)->region()->position_lock_style() == AudioTime && !cmi->get_inconsistent()) ? MusicTime : AudioTime;
                (*i)->region()->set_position_lock_style (ns);
                _session->add_command (new StatefulDiffCommand ((*i)->region()));
        }
@@ -6192,10 +6175,10 @@ Editor::update_region_fade_visibility ()
 void
 Editor::set_edit_point ()
 {
-       framepos_t where;
        bool ignored;
+       MusicFrame where (0, 0);
 
-       if (!mouse_frame (where, ignored)) {
+       if (!mouse_frame (where.frame, ignored)) {
                return;
        }
 
@@ -6203,7 +6186,7 @@ Editor::set_edit_point ()
 
        if (selection->markers.empty()) {
 
-               mouse_add_new_marker (where);
+               mouse_add_new_marker (where.frame);
 
        } else {
                bool ignored;
@@ -6211,7 +6194,7 @@ Editor::set_edit_point ()
                Location* loc = find_location_from_marker (selection->markers.front(), ignored);
 
                if (loc) {
-                       loc->move_to (where, get_grid_music_divisions(0));
+                       loc->move_to (where.frame, where.division);
                }
        }
 }
@@ -6222,17 +6205,17 @@ Editor::set_playhead_cursor ()
        if (entered_marker) {
                _session->request_locate (entered_marker->position(), _session->transport_rolling());
        } else {
-               framepos_t where;
+               MusicFrame where (0, 0);
                bool ignored;
 
-               if (!mouse_frame (where, ignored)) {
+               if (!mouse_frame (where.frame, ignored)) {
                        return;
                }
 
                snap_to (where);
 
                if (_session) {
-                       _session->request_locate (where, _session->transport_rolling());
+                       _session->request_locate (where.frame, _session->transport_rolling());
                }
        }
 
@@ -6260,18 +6243,16 @@ Editor::split_region ()
        if (current_mouse_mode() == MouseObject) {  //don't try this for Internal Edit, Stretch, Draw, etc.
 
                RegionSelection rs = get_regions_from_selection_and_edit_point ();
-
-               framepos_t where = get_preferred_edit_position ();
+               const framepos_t pos = get_preferred_edit_position();
+               const int32_t division = get_grid_music_divisions (0);
+               MusicFrame where (pos, division);
 
                if (rs.empty()) {
                        return;
                }
 
-               if (snap_musical()) {
-                       split_regions_at (where, rs, get_grid_music_divisions (0));
-               } else {
-                       split_regions_at (where, rs, 0);
-               }
+               split_regions_at (where, rs);
+
        }
 }
 
@@ -6479,7 +6460,7 @@ Editor::set_punch_start_from_edit_point ()
 {
        if (_session) {
 
-               framepos_t start = 0;
+               MusicFrame start (0, 0);
                framepos_t end = max_framepos;
 
                //use the existing punch end, if any
@@ -6489,20 +6470,20 @@ Editor::set_punch_start_from_edit_point ()
                }
 
                if ((_edit_point == EditAtPlayhead) && _session->transport_rolling()) {
-                       start = _session->audible_frame();
+                       start.frame = _session->audible_frame();
                } else {
-                       start = get_preferred_edit_position();
+                       start.frame = get_preferred_edit_position();
                }
 
                //snap the selection start/end
                snap_to(start);
 
                //if there's not already a sensible selection endpoint, go "forever"
-               if ( start > end ) {
+               if (start.frame > end ) {
                        end = max_framepos;
                }
 
-               set_punch_range (start, end, _("set punch start from EP"));
+               set_punch_range (start.frame, end, _("set punch start from EP"));
        }
 
 }
@@ -6513,7 +6494,7 @@ Editor::set_punch_end_from_edit_point ()
        if (_session) {
 
                framepos_t start = 0;
-               framepos_t end = max_framepos;
+               MusicFrame end (max_framepos, 0);
 
                //use the existing punch start, if any
                Location* tpl = transport_punch_location();
@@ -6522,15 +6503,15 @@ Editor::set_punch_end_from_edit_point ()
                }
 
                if ((_edit_point == EditAtPlayhead) && _session->transport_rolling()) {
-                       end = _session->audible_frame();
+                       end.frame = _session->audible_frame();
                } else {
-                       end = get_preferred_edit_position();
+                       end.frame = get_preferred_edit_position();
                }
 
                //snap the selection start/end
-               snap_to(end);
+               snap_to (end);
 
-               set_punch_range (start, end, _("set punch end from EP"));
+               set_punch_range (start, end.frame, _("set punch end from EP"));
 
        }
 }
@@ -6540,7 +6521,7 @@ Editor::set_loop_start_from_edit_point ()
 {
        if (_session) {
 
-               framepos_t start = 0;
+               MusicFrame start (0, 0);
                framepos_t end = max_framepos;
 
                //use the existing loop end, if any
@@ -6550,20 +6531,20 @@ Editor::set_loop_start_from_edit_point ()
                }
 
                if ((_edit_point == EditAtPlayhead) && _session->transport_rolling()) {
-                       start = _session->audible_frame();
+                       start.frame = _session->audible_frame();
                } else {
-                       start = get_preferred_edit_position();
+                       start.frame = get_preferred_edit_position();
                }
 
                //snap the selection start/end
-               snap_to(start);
+               snap_to (start);
 
                //if there's not already a sensible selection endpoint, go "forever"
-               if ( start > end ) {
+               if (start.frame > end ) {
                        end = max_framepos;
                }
 
-               set_loop_range (start, end, _("set loop start from EP"));
+               set_loop_range (start.frame, end, _("set loop start from EP"));
        }
 
 }
@@ -6574,7 +6555,7 @@ Editor::set_loop_end_from_edit_point ()
        if (_session) {
 
                framepos_t start = 0;
-               framepos_t end = max_framepos;
+               MusicFrame end (max_framepos, 0);
 
                //use the existing loop start, if any
                Location* tpl = transport_loop_location();
@@ -6583,15 +6564,15 @@ Editor::set_loop_end_from_edit_point ()
                }
 
                if ((_edit_point == EditAtPlayhead) && _session->transport_rolling()) {
-                       end = _session->audible_frame();
+                       end.frame = _session->audible_frame();
                } else {
-                       end = get_preferred_edit_position();
+                       end.frame = get_preferred_edit_position();
                }
 
                //snap the selection start/end
                snap_to(end);
 
-               set_loop_range (start, end, _("set loop end from EP"));
+               set_loop_range (start, end.frame, _("set loop end from EP"));
        }
 }
 
@@ -7006,9 +6987,9 @@ Editor::snap_regions_to_grid ()
                        pl->freeze();
                }
 
-               framepos_t start_frame = (*r)->region()->first_frame ();
-               snap_to (start_frame);
-               (*r)->region()->set_position (start_frame);
+               MusicFrame start ((*r)->region()->first_frame (), 0);
+               snap_to (start);
+               (*r)->region()->set_position (start.frame, start.division);
        }
 
        while (used_playlists.size() > 0) {
@@ -7102,9 +7083,11 @@ Editor::close_region_gaps ()
                        continue;
                }
 
+               (*r)->region()->clear_changes ();
                (*r)->region()->trim_front( (position - pull_back_frames));
                last_region->trim_end( (position - pull_back_frames + crossfade_len));
 
+               _session->add_command (new StatefulDiffCommand ((*r)->region()));
                last_region = (*r)->region();
 
                idx++;
@@ -7206,11 +7189,12 @@ Editor::playhead_forward_to_grid ()
                return;
        }
 
-       framepos_t pos = playhead_cursor->current_frame ();
-       if (pos < max_framepos - 1) {
-               pos += 2;
+       MusicFrame pos (playhead_cursor->current_frame (), 0);
+
+       if (pos.frame < max_framepos - 1) {
+               pos.frame += 2;
                snap_to_internal (pos, RoundUpAlways, false);
-               _session->request_locate (pos);
+               _session->request_locate (pos.frame);
        }
 }
 
@@ -7222,11 +7206,12 @@ Editor::playhead_backward_to_grid ()
                return;
        }
 
-       framepos_t pos = playhead_cursor->current_frame ();
-       if (pos > 2) {
-               pos -= 2;
+       MusicFrame pos  (playhead_cursor->current_frame (), 0);
+
+       if (pos.frame > 2) {
+               pos.frame -= 2;
                snap_to_internal (pos, RoundDownAlways, false);
-               _session->request_locate (pos);
+               _session->request_locate (pos.frame);
        }
 }
 
@@ -7398,10 +7383,10 @@ edit your ardour.rc file to set the\n\
                }
        }
 
-       Mixer_UI::instance()->selection().block_routes_changed (true);
-       selection->block_tracks_changed (true);
        {
+               PresentationInfo::ChangeSuspender cs;
                DisplaySuspender ds;
+
                boost::shared_ptr<RouteList> rl (new RouteList);
                for (vector<boost::shared_ptr<Route> >::iterator x = routes.begin(); x != routes.end(); ++x) {
                        rl->push_back (*x);
@@ -7412,9 +7397,6 @@ edit your ardour.rc file to set the\n\
         * destructors are called,
         * diskstream drops references, save_state is called (again for every track)
         */
-       selection->block_tracks_changed (false);
-       Mixer_UI::instance()->selection().block_routes_changed (false);
-       selection->TracksChanged (); /* EMIT SIGNAL */
 }
 
 void
@@ -7494,7 +7476,7 @@ Editor::insert_time (
 
                        if (opt == SplitIntersected) {
                                /* non musical split */
-                               (*i)->split (pos, 0);
+                               (*i)->split (MusicFrame (pos, 0));
                        }
 
                        (*i)->shift (pos, frames, (opt == MoveIntersected), ignore_music_glue);