Add reset region gain action for selected regions
[ardour.git] / gtk2_ardour / editor_ops.cc
index ed83da2d80d9855bea3c505ef7f64f3afa35eeea..2b8a5fd018d0ddeac39d5abc9fd0cee4098e1ca1 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);
@@ -2636,7 +2635,7 @@ Editor::play_with_preroll ()
                const framepos_t preroll = _session->preroll_samples (start);
 
                framepos_t ret = start;
-               
+
                if (start > preroll) {
                        start = start - preroll;
                }
@@ -2654,7 +2653,7 @@ Editor::play_with_preroll ()
                const framepos_t preroll = _session->preroll_samples (ph);
                framepos_t start;
                if (ph > preroll) {
-                       start = ph - preroll; 
+                       start = ph - preroll;
                } else {
                        start = 0;
                }
@@ -2671,6 +2670,11 @@ Editor::rec_with_preroll ()
        _session->request_preroll_record_trim (ph, preroll);
 }
 
+void
+Editor::rec_with_count_in ()
+{
+       _session->request_count_in_record ();
+}
 
 void
 Editor::play_location (Location& location)
@@ -4238,7 +4242,7 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
 
        /* user could select points in any order */
        selection->points.sort(PointsSelectionPositionSorter ());
-       
+
        /* Go through all selected points, making an AutomationRecord for each distinct AutomationList */
        for (PointSelection::iterator sel_point = selection->points.begin(); sel_point != selection->points.end(); ++sel_point) {
                const AutomationLine&                   line = (*sel_point)->line();
@@ -4260,7 +4264,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 ();
@@ -4271,7 +4275,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));
                        }
                }
 
@@ -4282,13 +4286,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
@@ -4317,7 +4321,7 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
                        boost::shared_ptr<AutomationList> al = line.the_list();
 
                        bool erase = true;
-                       
+
                        if (dynamic_cast<AudioRegionGainLine*> (&line)) {
                                /* removing of first and last gain point in region gain lines is prohibited*/
                                if (line.is_last_point (*(*sel_point)) || line.is_first_point (*(*sel_point))) {
@@ -4691,22 +4695,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
@@ -5214,6 +5217,38 @@ Editor::adjust_region_gain (bool up)
        }
 }
 
+void
+Editor::reset_region_gain ()
+{
+       RegionSelection rs = get_regions_from_selection_and_entered ();
+
+       if (!_session || rs.empty()) {
+               return;
+       }
+
+       bool in_command = false;
+
+       for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
+               if (!arv) {
+                       continue;
+               }
+
+               arv->region()->clear_changes ();
+
+               arv->audio_region()->set_scale_amplitude (1.0f);
+
+               if (!in_command) {
+                               begin_reversible_command ("reset region gain");
+                               in_command = true;
+               }
+               _session->add_command (new StatefulDiffCommand (arv->region()));
+       }
+
+       if (in_command) {
+               commit_reversible_command ();
+       }
+}
 
 void
 Editor::reverse_region ()
@@ -5745,11 +5780,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();
+       Gtk::CheckMenuItem* cmi = dynamic_cast<Gtk::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()));
        }
@@ -6171,10 +6212,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;
        }
 
@@ -6182,7 +6223,7 @@ Editor::set_edit_point ()
 
        if (selection->markers.empty()) {
 
-               mouse_add_new_marker (where);
+               mouse_add_new_marker (where.frame);
 
        } else {
                bool ignored;
@@ -6190,7 +6231,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);
                }
        }
 }
@@ -6201,17 +6242,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());
                }
        }
 
@@ -6239,18 +6280,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);
+
        }
 }
 
@@ -6404,7 +6443,7 @@ Editor::set_auto_punch_range ()
                        set_punch_range (tpl->start(), now, _("Auto Punch In/Out"));
                        _session->config.set_punch_out(true);
                }
-       } else  {
+       } else  {
                if (_session->config.get_punch_out()) {
                        _session->config.set_punch_out(false);
                }
@@ -6458,7 +6497,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
@@ -6468,20 +6507,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"));
        }
 
 }
@@ -6492,7 +6531,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();
@@ -6501,15 +6540,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"));
 
        }
 }
@@ -6519,7 +6558,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
@@ -6529,20 +6568,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"));
        }
 
 }
@@ -6553,7 +6592,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();
@@ -6562,15 +6601,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"));
        }
 }
 
@@ -6703,12 +6742,13 @@ Editor::define_one_bar (framepos_t start, framepos_t end)
        XMLNode& before (_session->tempo_map().get_state());
 
        if (do_global) {
-               _session->tempo_map().change_initial_tempo (beats_per_minute, t.note_type());
+               _session->tempo_map().change_initial_tempo (beats_per_minute, t.note_type(), t.end_note_types_per_minute());
        } else if (t.frame() == start) {
-               _session->tempo_map().change_existing_tempo_at (start, beats_per_minute, t.note_type());
+               _session->tempo_map().change_existing_tempo_at (start, beats_per_minute, t.note_type(), t.end_note_types_per_minute());
        } else {
+               /* constant tempo */
                const Tempo tempo (beats_per_minute, t.note_type());
-               _session->tempo_map().add_tempo (tempo, 0.0, start, TempoSection::Constant, AudioTime);
+               _session->tempo_map().add_tempo (tempo, 0.0, start, AudioTime);
        }
 
        XMLNode& after (_session->tempo_map().get_state());
@@ -6984,10 +7024,12 @@ Editor::snap_regions_to_grid ()
                        used_playlists.push_back(pl);
                        pl->freeze();
                }
+               (*r)->region()->clear_changes ();
 
-               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);
+               _session->add_command(new StatefulDiffCommand ((*r)->region()));
        }
 
        while (used_playlists.size() > 0) {
@@ -7083,11 +7125,14 @@ Editor::close_region_gaps ()
 
                (*r)->region()->clear_changes ();
                (*r)->region()->trim_front( (position - pull_back_frames));
+
+               last_region->clear_changes ();
                last_region->trim_end( (position - pull_back_frames + crossfade_len));
 
                _session->add_command (new StatefulDiffCommand ((*r)->region()));
-               last_region = (*r)->region();
+               _session->add_command (new StatefulDiffCommand (last_region));
 
+               last_region = (*r)->region();
                idx++;
        }
 
@@ -7187,11 +7232,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);
        }
 }
 
@@ -7203,11 +7249,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);
        }
 }
 
@@ -7379,10 +7426,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);
@@ -7393,9 +7440,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
@@ -7473,17 +7517,18 @@ Editor::insert_time (
                        (*i)->clear_changes ();
                        (*i)->clear_owned_changes ();
 
+                       if (!in_command) {
+                               begin_reversible_command (_("insert time"));
+                               in_command = true;
+                       }
+
                        if (opt == SplitIntersected) {
                                /* non musical split */
-                               (*i)->split (pos, 0);
+                               (*i)->split (MusicFrame (pos, 0));
                        }
 
                        (*i)->shift (pos, frames, (opt == MoveIntersected), ignore_music_glue);
 
-                       if (!in_command) {
-                               begin_reversible_command (_("insert time"));
-                               in_command = true;
-                       }
                        vector<Command*> cmds;
                        (*i)->rdiff (cmds);
                        _session->add_commands (cmds);