X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_ops.cc;h=ddcf02911ab4a0215e44a33bfdf6e1d79c8167d7;hb=b529cbc5dc0b92f01ff01d5f40786ff025fbb63b;hp=39b284375634eb7e587c74ffd1d980a0fc570a2c;hpb=b09ab546542040b1d468c9925c60bda2dfd80da8;p=ardour.git diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 39b2843756..ddcf02911a 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -43,6 +44,7 @@ #include #include #include +#include #include #include "ardour_ui.h" @@ -51,11 +53,10 @@ #include "audio_time_axis.h" #include "automation_time_axis.h" #include "streamview.h" -#include "regionview.h" +#include "audio_region_view.h" #include "rgb_macros.h" #include "selection_templates.h" #include "selection.h" -#include "sfdb_ui.h" #include "editing.h" #include "gtk-custom-hruler.h" #include "gui_thread.h" @@ -64,6 +65,7 @@ using namespace std; using namespace ARDOUR; +using namespace PBD; using namespace sigc; using namespace Gtk; using namespace Editing; @@ -88,89 +90,8 @@ Editor::redo (uint32_t n) } } -void -Editor::set_meter_hold (int32_t cnt) -{ - Config->set_meter_hold_off(false); - Config->set_meter_hold_short(false); - Config->set_meter_hold_medium(false); - Config->set_meter_hold_long(false); - - switch (cnt) - { - case 0: - Config->set_meter_hold_off(true); - break; - case 40: - Config->set_meter_hold_short(true); - break; - case 100: - Config->set_meter_hold_medium(true); - break; - case 200: - Config->set_meter_hold_long(true); - break; - } - - if (session) { - session->set_meter_hold (cnt); - } -} - -void -Editor::set_meter_falloff (int intval) -{ - float val = 0.0f; /* off */ - std::string str; - - Config->set_meter_falloff_off(false); - Config->set_meter_falloff_slowest(false); - Config->set_meter_falloff_slow(false); - Config->set_meter_falloff_medium(false); - Config->set_meter_falloff_fast(false); - Config->set_meter_falloff_faster(false); - Config->set_meter_falloff_fastest(false); - - switch (intval) - { - case 0: - val = 0.0f; - Config->set_meter_falloff_off(true); - break; - case 1: - val = 0.266f; - Config->set_meter_falloff_slowest(true); - break; - case 2: - val = 0.342f; - Config->set_meter_falloff_slow(true); - break; - case 3: - val = 0.7f; - Config->set_meter_falloff_medium(true); - break; - case 4: - val = 1.1f; - Config->set_meter_falloff_fast(true); - break; - case 5: - val = 1.5f; - Config->set_meter_falloff_faster(true); - break; - case 6: - val = 2.5f; - Config->set_meter_falloff_fastest(true); - break; - } - - if (session) { - session->set_meter_falloff (val); - } -} - - int -Editor::ensure_cursor (jack_nframes_t *pos) +Editor::ensure_cursor (nframes_t *pos) { *pos = edit_cursor->current_frame; return 0; @@ -183,32 +104,35 @@ Editor::split_region () } void -Editor::split_region_at (jack_nframes_t where) +Editor::split_region_at (nframes_t where) { - split_regions_at (where, selection->audio_regions); + split_regions_at (where, selection->regions); } void -Editor::split_regions_at (jack_nframes_t where, AudioRegionSelection& regions) +Editor::split_regions_at (nframes_t where, RegionSelection& regions) { begin_reversible_command (_("split")); snap_to (where); - for (AudioRegionSelection::iterator a = regions.begin(); a != regions.end(); ) { + for (RegionSelection::iterator a = regions.begin(); a != regions.end(); ) { - AudioRegionSelection::iterator tmp; + RegionSelection::iterator tmp; tmp = a; ++tmp; - Playlist* pl = (*a)->region.playlist(); + boost::shared_ptr pl = (*a)->region()->playlist(); - _new_regionviews_show_envelope = (*a)->envelope_visible(); + AudioRegionView* const arv = dynamic_cast(*a); + if (arv) + _new_regionviews_show_envelope = arv->envelope_visible(); if (pl) { - session->add_undo (pl->get_memento()); - pl->split_region ((*a)->region, where); - session->add_redo_no_execute (pl->get_memento()); + XMLNode &before = pl->get_state(); + pl->split_region ((*a)->region(), where); + XMLNode &after = pl->get_state(); + session->add_command(new MementoCommand(*pl, &before, &after)); } a = tmp; @@ -225,21 +149,22 @@ Editor::remove_clicked_region () return; } - Playlist* playlist = clicked_audio_trackview->playlist(); + boost::shared_ptr playlist = clicked_audio_trackview->playlist(); begin_reversible_command (_("remove region")); - session->add_undo (playlist->get_memento()); - playlist->remove_region (&clicked_regionview->region); - session->add_redo_no_execute (playlist->get_memento()); + XMLNode &before = playlist->get_state(); + playlist->remove_region (clicked_regionview->region()); + XMLNode &after = playlist->get_state(); + session->add_command(new MementoCommand(*playlist, &before, &after)); commit_reversible_command (); } void Editor::destroy_clicked_region () { - int32_t selected = selection->audio_regions.size(); + uint32_t selected = selection->regions.size(); - if (!session || clicked_regionview == 0 && selected == 0) { + if (!session || !selected) { return; } @@ -266,59 +191,54 @@ Do you really want to destroy %1 ?"), return; } - if (selected > 0) { - list r; + if (selected) { + list > r; - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - r.push_back (&(*i)->region); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + r.push_back ((*i)->region()); } session->destroy_regions (r); - - } else if (clicked_regionview) { - session->destroy_region (&clicked_regionview->region); } } -AudioRegion * +boost::shared_ptr Editor::select_region_for_operation (int dir, TimeAxisView **tv) { - AudioRegionView* rv; - AudioRegion *region; - jack_nframes_t start = 0; + RegionView* rv; + boost::shared_ptr region; + nframes_t start = 0; if (selection->time.start () == selection->time.end_frame ()) { /* no current selection-> is there a selected regionview? */ - if (selection->audio_regions.empty()) { - return 0; + if (selection->regions.empty()) { + return region; } } - region = 0; - - if (!selection->audio_regions.empty()) { + if (!selection->regions.empty()) { - rv = *(selection->audio_regions.begin()); + rv = *(selection->regions.begin()); (*tv) = &rv->get_time_axis_view(); - region = &rv->region; + region = rv->region(); } else if (!selection->tracks.empty()) { (*tv) = selection->tracks.front(); - AudioTimeAxisView* atv; + RouteTimeAxisView* rtv; - if ((atv = dynamic_cast (*tv)) != 0) { - Playlist *pl; + if ((rtv = dynamic_cast (*tv)) != 0) { + boost::shared_ptr pl; - if ((pl = atv->playlist()) == 0) { - return 0; + if ((pl = rtv->playlist()) == 0) { + return region; } - region = dynamic_cast (pl->top_region_at (start)); + region = pl->top_region_at (start); } } @@ -329,8 +249,8 @@ void Editor::extend_selection_to_end_of_region (bool next) { TimeAxisView *tv; - Region *region; - jack_nframes_t start; + boost::shared_ptr region; + nframes_t start; if ((region = select_region_for_operation (next ? 1 : 0, &tv)) == 0) { return; @@ -357,8 +277,8 @@ void Editor::extend_selection_to_start_of_region (bool previous) { TimeAxisView *tv; - Region *region; - jack_nframes_t end; + boost::shared_ptr region; + nframes_t end; if ((region = select_region_for_operation (previous ? -1 : 0, &tv)) == 0) { return; @@ -385,27 +305,28 @@ Editor::extend_selection_to_start_of_region (bool previous) void Editor::nudge_forward (bool next) { - jack_nframes_t distance; - jack_nframes_t next_distance; + nframes_t distance; + nframes_t next_distance; if (!session) return; - if (!selection->audio_regions.empty()) { + if (!selection->regions.empty()) { begin_reversible_command (_("nudge forward")); - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - AudioRegion& r ((*i)->region); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + boost::shared_ptr r ((*i)->region()); - distance = get_nudge_distance (r.position(), next_distance); + distance = get_nudge_distance (r->position(), next_distance); if (next) { distance = next_distance; } - session->add_undo (r.playlist()->get_memento()); - r.set_position (r.position() + distance, this); - session->add_redo_no_execute (r.playlist()->get_memento()); + XMLNode &before = r->playlist()->get_state(); + r->set_position (r->position() + distance, this); + XMLNode &after = r->playlist()->get_state(); + session->add_command (new MementoCommand(*(r->playlist()), &before, &after)); } commit_reversible_command (); @@ -419,32 +340,33 @@ Editor::nudge_forward (bool next) void Editor::nudge_backward (bool next) { - jack_nframes_t distance; - jack_nframes_t next_distance; + nframes_t distance; + nframes_t next_distance; if (!session) return; - if (!selection->audio_regions.empty()) { + if (!selection->regions.empty()) { begin_reversible_command (_("nudge forward")); - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - AudioRegion& r ((*i)->region); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + boost::shared_ptr r ((*i)->region()); - distance = get_nudge_distance (r.position(), next_distance); + distance = get_nudge_distance (r->position(), next_distance); if (next) { distance = next_distance; } - session->add_undo (r.playlist()->get_memento()); + XMLNode &before = r->playlist()->get_state(); - if (r.position() > distance) { - r.set_position (r.position() - distance, this); + if (r->position() > distance) { + r->set_position (r->position() - distance, this); } else { - r.set_position (0, this); + r->set_position (0, this); } - session->add_redo_no_execute (r.playlist()->get_memento()); + XMLNode &after = r->playlist()->get_state(); + session->add_command(new MementoCommand(*(r->playlist()), &before, &after)); } commit_reversible_command (); @@ -464,22 +386,23 @@ Editor::nudge_backward (bool next) void Editor::nudge_forward_capture_offset () { - jack_nframes_t distance; + nframes_t distance; if (!session) return; - if (!selection->audio_regions.empty()) { + if (!selection->regions.empty()) { begin_reversible_command (_("nudge forward")); distance = session->worst_output_latency(); - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - AudioRegion& r ((*i)->region); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + boost::shared_ptr r ((*i)->region()); - session->add_undo (r.playlist()->get_memento()); - r.set_position (r.position() + distance, this); - session->add_redo_no_execute (r.playlist()->get_memento()); + XMLNode &before = r->playlist()->get_state(); + r->set_position (r->position() + distance, this); + XMLNode &after = r->playlist()->get_state(); + session->add_command(new MementoCommand(*(r->playlist()), &before, &after)); } commit_reversible_command (); @@ -490,27 +413,28 @@ Editor::nudge_forward_capture_offset () void Editor::nudge_backward_capture_offset () { - jack_nframes_t distance; + nframes_t distance; if (!session) return; - if (!selection->audio_regions.empty()) { + if (!selection->regions.empty()) { begin_reversible_command (_("nudge forward")); distance = session->worst_output_latency(); - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - AudioRegion& r ((*i)->region); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + boost::shared_ptr r ((*i)->region()); - session->add_undo (r.playlist()->get_memento()); + XMLNode &before = r->playlist()->get_state(); - if (r.position() > distance) { - r.set_position (r.position() - distance, this); + if (r->position() > distance) { + r->set_position (r->position() - distance, this); } else { - r.set_position (0, this); + r->set_position (0, this); } - session->add_redo_no_execute (r.playlist()->get_memento()); + XMLNode &after = r->playlist()->get_state(); + session->add_command(new MementoCommand(*(r->playlist()), &before, &after)); } commit_reversible_command (); @@ -535,9 +459,9 @@ Editor::move_to_end () void Editor::build_region_boundary_cache () { - jack_nframes_t pos = 0; + nframes_t pos = 0; RegionPoint point; - Region *r; + boost::shared_ptr r; TrackViewList tracks; region_boundary_cache.clear (); @@ -591,7 +515,7 @@ Editor::build_region_boundary_cache () } } - jack_nframes_t rpos; + nframes_t rpos; switch (snap_type) { case SnapToRegionStart: @@ -633,23 +557,23 @@ Editor::build_region_boundary_cache () } } -Region* -Editor::find_next_region (jack_nframes_t frame, RegionPoint point, int32_t dir, TrackViewList& tracks, TimeAxisView **ontrack) +boost::shared_ptr +Editor::find_next_region (nframes_t frame, RegionPoint point, int32_t dir, TrackViewList& tracks, TimeAxisView **ontrack) { TrackViewList::iterator i; - jack_nframes_t closest = max_frames; - Region* ret = 0; - jack_nframes_t rpos = 0; + nframes_t closest = max_frames; + boost::shared_ptr ret; + nframes_t rpos = 0; float track_speed; - jack_nframes_t track_frame; + nframes_t track_frame; AudioTimeAxisView *atav; for (i = tracks.begin(); i != tracks.end(); ++i) { - jack_nframes_t distance; - Region* r; - + nframes_t distance; + boost::shared_ptr r; + track_speed = 1.0f; if ( (atav = dynamic_cast(*i)) != 0 ) { if (atav->get_diskstream()!=0) @@ -698,8 +622,8 @@ Editor::find_next_region (jack_nframes_t frame, RegionPoint point, int32_t dir, void Editor::cursor_to_region_point (Cursor* cursor, RegionPoint point, int32_t dir) { - Region* r; - jack_nframes_t pos = cursor->current_frame; + boost::shared_ptr r; + nframes_t pos = cursor->current_frame; if (!session) { return; @@ -778,11 +702,11 @@ Editor::cursor_to_previous_region_point (Cursor* cursor, RegionPoint point) void Editor::cursor_to_selection_start (Cursor *cursor) { - jack_nframes_t pos = 0; + nframes_t pos = 0; switch (mouse_mode) { case MouseObject: - if (!selection->audio_regions.empty()) { - pos = selection->audio_regions.start(); + if (!selection->regions.empty()) { + pos = selection->regions.start(); } break; @@ -806,12 +730,12 @@ Editor::cursor_to_selection_start (Cursor *cursor) void Editor::cursor_to_selection_end (Cursor *cursor) { - jack_nframes_t pos = 0; + nframes_t pos = 0; switch (mouse_mode) { case MouseObject: - if (!selection->audio_regions.empty()) { - pos = selection->audio_regions.end_frame(); + if (!selection->regions.empty()) { + pos = selection->regions.end_frame(); } break; @@ -835,8 +759,8 @@ Editor::cursor_to_selection_end (Cursor *cursor) void Editor::playhead_backward () { - jack_nframes_t pos; - jack_nframes_t cnt; + nframes_t pos; + nframes_t cnt; float prefix; bool was_floating; @@ -844,15 +768,15 @@ Editor::playhead_backward () cnt = 1; } else { if (was_floating) { - cnt = (jack_nframes_t) floor (prefix * session->frame_rate ()); + cnt = (nframes_t) floor (prefix * session->frame_rate ()); } else { - cnt = (jack_nframes_t) prefix; + cnt = (nframes_t) prefix; } } pos = playhead_cursor->current_frame; - if ((jack_nframes_t) pos < cnt) { + if ((nframes_t) pos < cnt) { pos = 0; } else { pos -= cnt; @@ -869,8 +793,8 @@ Editor::playhead_backward () void Editor::playhead_forward () { - jack_nframes_t pos; - jack_nframes_t cnt; + nframes_t pos; + nframes_t cnt; bool was_floating; float prefix; @@ -878,9 +802,9 @@ Editor::playhead_forward () cnt = 1; } else { if (was_floating) { - cnt = (jack_nframes_t) floor (prefix * session->frame_rate ()); + cnt = (nframes_t) floor (prefix * session->frame_rate ()); } else { - cnt = (jack_nframes_t) floor (prefix); + cnt = (nframes_t) floor (prefix); } } @@ -909,8 +833,8 @@ Editor::cursor_align (bool playhead_to_edit) void Editor::edit_cursor_backward () { - jack_nframes_t pos; - jack_nframes_t cnt; + nframes_t pos; + nframes_t cnt; float prefix; bool was_floating; @@ -918,15 +842,15 @@ Editor::edit_cursor_backward () cnt = 1; } else { if (was_floating) { - cnt = (jack_nframes_t) floor (prefix * session->frame_rate ()); + cnt = (nframes_t) floor (prefix * session->frame_rate ()); } else { - cnt = (jack_nframes_t) prefix; + cnt = (nframes_t) prefix; } } pos = edit_cursor->current_frame; - if ((jack_nframes_t) pos < cnt) { + if ((nframes_t) pos < cnt) { pos = 0; } else { pos -= cnt; @@ -938,8 +862,8 @@ Editor::edit_cursor_backward () void Editor::edit_cursor_forward () { - jack_nframes_t pos; - jack_nframes_t cnt; + nframes_t pos; + nframes_t cnt; bool was_floating; float prefix; @@ -947,9 +871,9 @@ Editor::edit_cursor_forward () cnt = 1; } else { if (was_floating) { - cnt = (jack_nframes_t) floor (prefix * session->frame_rate ()); + cnt = (nframes_t) floor (prefix * session->frame_rate ()); } else { - cnt = (jack_nframes_t) floor (prefix); + cnt = (nframes_t) floor (prefix); } } @@ -962,16 +886,16 @@ Editor::goto_frame () { float prefix; bool was_floating; - jack_nframes_t frame; + nframes_t frame; if (get_prefix (prefix, was_floating)) { return; } if (was_floating) { - frame = (jack_nframes_t) floor (prefix * session->frame_rate()); + frame = (nframes_t) floor (prefix * session->frame_rate()); } else { - frame = (jack_nframes_t) floor (prefix); + frame = (nframes_t) floor (prefix); } session->request_locate (frame); @@ -980,19 +904,19 @@ Editor::goto_frame () void Editor::scroll_backward (float pages) { - jack_nframes_t frame; - jack_nframes_t one_page = (jack_nframes_t) rint (canvas_width * frames_per_unit); + nframes_t frame; + nframes_t one_page = (nframes_t) rint (canvas_width * frames_per_unit); bool was_floating; float prefix; - jack_nframes_t cnt; + nframes_t cnt; if (get_prefix (prefix, was_floating)) { - cnt = (jack_nframes_t) floor (pages * one_page); + cnt = (nframes_t) floor (pages * one_page); } else { if (was_floating) { - cnt = (jack_nframes_t) floor (prefix * session->frame_rate()); + cnt = (nframes_t) floor (prefix * session->frame_rate()); } else { - cnt = (jack_nframes_t) floor (prefix * one_page); + cnt = (nframes_t) floor (prefix * one_page); } } @@ -1008,24 +932,24 @@ Editor::scroll_backward (float pages) void Editor::scroll_forward (float pages) { - jack_nframes_t frame; - jack_nframes_t one_page = (jack_nframes_t) rint (canvas_width * frames_per_unit); + nframes_t frame; + nframes_t one_page = (nframes_t) rint (canvas_width * frames_per_unit); bool was_floating; float prefix; - jack_nframes_t cnt; + nframes_t cnt; if (get_prefix (prefix, was_floating)) { - cnt = (jack_nframes_t) floor (pages * one_page); + cnt = (nframes_t) floor (pages * one_page); } else { if (was_floating) { - cnt = (jack_nframes_t) floor (prefix * session->frame_rate()); + cnt = (nframes_t) floor (prefix * session->frame_rate()); } else { - cnt = (jack_nframes_t) floor (prefix * one_page); + cnt = (nframes_t) floor (prefix * one_page); } } - if (ULONG_MAX - cnt < leftmost_frame) { - frame = ULONG_MAX - cnt; + if (max_frames - cnt < leftmost_frame) { + frame = max_frames - cnt; } else { frame = leftmost_frame + cnt; } @@ -1102,9 +1026,9 @@ Editor::temporal_zoom_step (bool coarser) nfpu = frames_per_unit; if (coarser) { - nfpu *= 2.0; + nfpu *= 1.61803399; } else { - nfpu = max(1.0,(nfpu/2.0)); + nfpu = max(1.0,(nfpu/1.61803399)); } temporal_zoom (nfpu); @@ -1115,17 +1039,17 @@ Editor::temporal_zoom (gdouble fpu) { if (!session) return; - jack_nframes_t current_page = current_page_frames(); - jack_nframes_t current_leftmost = leftmost_frame; - jack_nframes_t current_rightmost; - jack_nframes_t current_center; - jack_nframes_t new_page; - jack_nframes_t leftmost_after_zoom = 0; + nframes_t current_page = current_page_frames(); + nframes_t current_leftmost = leftmost_frame; + nframes_t current_rightmost; + nframes_t current_center; + nframes_t new_page; + nframes_t leftmost_after_zoom = 0; double nfpu; nfpu = fpu; - new_page = (jack_nframes_t) floor (canvas_width * nfpu); + new_page = (nframes_t) floor (canvas_width * nfpu); switch (zoom_focus) { case ZoomFocusLeft: @@ -1161,7 +1085,7 @@ Editor::temporal_zoom (gdouble fpu) case ZoomFocusEdit: /* try to keep the edit cursor in the center */ - if (edit_cursor->current_frame > leftmost_frame + (new_page/2)) { + if (edit_cursor->current_frame > new_page/2) { leftmost_after_zoom = edit_cursor->current_frame - (new_page/2); } else { leftmost_after_zoom = 0; @@ -1189,8 +1113,8 @@ Editor::temporal_zoom_selection () return; } - jack_nframes_t start = selection->time[clicked_selection].start; - jack_nframes_t end = selection->time[clicked_selection].end; + nframes_t start = selection->time[clicked_selection].start; + nframes_t end = selection->time[clicked_selection].end; temporal_zoom_by_frame (start, end, "zoom to selection"); } @@ -1206,7 +1130,7 @@ Editor::temporal_zoom_session () } void -Editor::temporal_zoom_by_frame (jack_nframes_t start, jack_nframes_t end, const string & op) +Editor::temporal_zoom_by_frame (nframes_t start, nframes_t end, const string & op) { if (!session) return; @@ -1214,7 +1138,7 @@ Editor::temporal_zoom_by_frame (jack_nframes_t start, jack_nframes_t end, const return; } - jack_nframes_t range = end - start; + nframes_t range = end - start; double new_fpu = (double)range / (double)canvas_width; // double p2 = 1.0; @@ -1224,9 +1148,9 @@ Editor::temporal_zoom_by_frame (jack_nframes_t start, jack_nframes_t end, const // } // new_fpu = p2; - jack_nframes_t new_page = (jack_nframes_t) floor (canvas_width * new_fpu); - jack_nframes_t middle = (jack_nframes_t) floor( (double)start + ((double)range / 2.0f )); - jack_nframes_t new_leftmost = (jack_nframes_t) floor( (double)middle - ((double)new_page/2.0f)); + nframes_t new_page = (nframes_t) floor (canvas_width * new_fpu); + nframes_t middle = (nframes_t) floor( (double)start + ((double)range / 2.0f )); + nframes_t new_leftmost = (nframes_t) floor( (double)middle - ((double)new_page/2.0f)); if (new_leftmost > middle) new_leftmost = 0; @@ -1239,26 +1163,26 @@ Editor::temporal_zoom_by_frame (jack_nframes_t start, jack_nframes_t end, const } void -Editor::temporal_zoom_to_frame (bool coarser, jack_nframes_t frame) +Editor::temporal_zoom_to_frame (bool coarser, nframes_t frame) { if (!session) return; - jack_nframes_t range_before = frame - leftmost_frame; + double range_before = frame - leftmost_frame; double new_fpu; new_fpu = frames_per_unit; if (coarser) { - new_fpu *= 2.0; - range_before *= 2; + new_fpu *= 1.61803399; + range_before *= 1.61803399; } else { - new_fpu = max(1.0,(new_fpu/2.0)); - range_before /= 2; + new_fpu = max(1.0,(new_fpu/1.61803399)); + range_before /= 1.61803399; } if (new_fpu == frames_per_unit) return; - jack_nframes_t new_leftmost = frame - range_before; + nframes_t new_leftmost = frame - (nframes_t)range_before; if (new_leftmost > frame) new_leftmost = 0; @@ -1281,46 +1205,49 @@ Editor::add_location_from_selection () return; } - jack_nframes_t start = selection->time[clicked_selection].start; - jack_nframes_t end = selection->time[clicked_selection].end; + nframes_t start = selection->time[clicked_selection].start; + nframes_t end = selection->time[clicked_selection].end; - Location *location = new Location (start, end, "selection"); + Location *location = new Location (start, end, "selection", Location::IsRangeMarker); session->begin_reversible_command (_("add marker")); - session->add_undo (session->locations()->get_memento()); + XMLNode &before = session->locations()->get_state(); session->locations()->add (location, true); - session->add_redo_no_execute (session->locations()->get_memento()); + XMLNode &after = session->locations()->get_state(); + session->add_command(new MementoCommand(*(session->locations()), &before, &after)); session->commit_reversible_command (); } void Editor::add_location_from_playhead_cursor () { - jack_nframes_t where = session->audible_frame(); + nframes_t where = session->audible_frame(); Location *location = new Location (where, where, "mark", Location::IsMark); session->begin_reversible_command (_("add marker")); - session->add_undo (session->locations()->get_memento()); + XMLNode &before = session->locations()->get_state(); session->locations()->add (location, true); - session->add_redo_no_execute (session->locations()->get_memento()); + XMLNode &after = session->locations()->get_state(); + session->add_command(new MementoCommand(*(session->locations()), &before, &after)); session->commit_reversible_command (); } void Editor::add_location_from_audio_region () { - if (selection->audio_regions.empty()) { + if (selection->regions.empty()) { return; } - AudioRegionView* rv = *(selection->audio_regions.begin()); - Region& region = rv->region; + RegionView* rv = *(selection->regions.begin()); + boost::shared_ptr region = rv->region(); - Location *location = new Location (region.position(), region.last_frame(), region.name()); + Location *location = new Location (region->position(), region->last_frame(), region->name(), Location::IsRangeMarker); session->begin_reversible_command (_("add marker")); - session->add_undo (session->locations()->get_memento()); + XMLNode &before = session->locations()->get_state(); session->locations()->add (location, true); - session->add_redo_no_execute (session->locations()->get_memento()); + XMLNode &after = session->locations()->get_state(); + session->add_command(new MementoCommand(*(session->locations()), &before, &after)); session->commit_reversible_command (); } @@ -1345,6 +1272,9 @@ Editor::select_all_in_track (Selection::Operation op) case Selection::Extend: /* not defined yet */ break; + case Selection::Add: + selection->add (touched); + break; } } @@ -1361,6 +1291,7 @@ Editor::select_all (Selection::Operation op) } begin_reversible_command (_("select all")); switch (op) { + case Selection::Add: case Selection::Toggle: selection->add (touched); break; @@ -1403,7 +1334,7 @@ Editor::invert_selection () } bool -Editor::select_all_within (jack_nframes_t start, jack_nframes_t end, double top, double bot, Selection::Operation op) +Editor::select_all_within (nframes_t start, nframes_t end, double top, double bot, Selection::Operation op) { list touched; @@ -1418,6 +1349,7 @@ Editor::select_all_within (jack_nframes_t start, jack_nframes_t end, double top, begin_reversible_command (_("select all within")); switch (op) { + case Selection::Add: case Selection::Toggle: cerr << "toggle\n"; selection->add (touched); @@ -1441,15 +1373,15 @@ Editor::select_all_within (jack_nframes_t start, jack_nframes_t end, double top, void Editor::set_selection_from_audio_region () { - if (selection->audio_regions.empty()) { + if (selection->regions.empty()) { return; } - AudioRegionView* rv = *(selection->audio_regions.begin()); - Region& region = rv->region; + RegionView* rv = *(selection->regions.begin()); + boost::shared_ptr region = rv->region(); begin_reversible_command (_("set selection from region")); - selection->set (0, region.position(), region.last_frame()); + selection->set (0, region->position(), region->last_frame()); commit_reversible_command (); set_mouse_mode (Editing::MouseRange, false); @@ -1497,8 +1429,8 @@ Editor::select_all_selectables_using_time_selection () return; } - jack_nframes_t start = selection->time[clicked_selection].start; - jack_nframes_t end = selection->time[clicked_selection].end; + nframes_t start = selection->time[clicked_selection].start; + nframes_t end = selection->time[clicked_selection].end; if (end - start < 1) { return; @@ -1564,8 +1496,8 @@ Editor::select_all_selectables_using_loop() void Editor::select_all_selectables_using_cursor (Cursor *cursor, bool after) { - jack_nframes_t start; - jack_nframes_t end; + nframes_t start; + nframes_t end; list touched; if (after) { @@ -1595,8 +1527,8 @@ Editor::select_all_selectables_using_cursor (Cursor *cursor, bool after) void Editor::select_all_selectables_between_cursors (Cursor *cursor, Cursor *other_cursor) { - jack_nframes_t start; - jack_nframes_t end; + nframes_t start; + nframes_t end; list touched; bool other_cursor_is_first = cursor->current_frame > other_cursor->current_frame; @@ -1714,7 +1646,7 @@ Editor::jump_backward_to_mark () void Editor::set_mark () { - jack_nframes_t pos; + nframes_t pos; float prefix; bool was_floating; @@ -1722,9 +1654,9 @@ Editor::set_mark () pos = session->audible_frame (); } else { if (was_floating) { - pos = (jack_nframes_t) floor (prefix * session->frame_rate ()); + pos = (nframes_t) floor (prefix * session->frame_rate ()); } else { - pos = (jack_nframes_t) floor (prefix); + pos = (nframes_t) floor (prefix); } } @@ -1736,9 +1668,10 @@ Editor::clear_markers () { if (session) { session->begin_reversible_command (_("clear markers")); - session->add_undo (session->locations()->get_memento()); + XMLNode &before = session->locations()->get_state(); session->locations()->clear_markers (); - session->add_redo_no_execute (session->locations()->get_memento()); + XMLNode &after = session->locations()->get_state(); + session->add_command(new MementoCommand(*(session->locations()), &before, &after)); session->commit_reversible_command (); } } @@ -1748,7 +1681,7 @@ Editor::clear_ranges () { if (session) { session->begin_reversible_command (_("clear ranges")); - session->add_undo (session->locations()->get_memento()); + XMLNode &before = session->locations()->get_state(); Location * looploc = session->locations()->auto_loop_location(); Location * punchloc = session->locations()->auto_punch_location(); @@ -1758,7 +1691,8 @@ Editor::clear_ranges () if (looploc) session->locations()->add (looploc); if (punchloc) session->locations()->add (punchloc); - session->add_redo_no_execute (session->locations()->get_memento()); + XMLNode &after = session->locations()->get_state(); + session->add_command(new MementoCommand(*(session->locations()), &before, &after)); session->commit_reversible_command (); } } @@ -1767,9 +1701,10 @@ void Editor::clear_locations () { session->begin_reversible_command (_("clear locations")); - session->add_undo (session->locations()->get_memento()); + XMLNode &before = session->locations()->get_state(); session->locations()->clear (); - session->add_redo_no_execute (session->locations()->get_memento()); + XMLNode &after = session->locations()->get_state(); + session->add_command(new MementoCommand(*(session->locations()), &before, &after)); session->commit_reversible_command (); session->locations()->clear (); } @@ -1777,14 +1712,14 @@ Editor::clear_locations () /* INSERT/REPLACE */ void -Editor::insert_region_list_drag (AudioRegion& region, int x, int y) +Editor::insert_region_list_drag (boost::shared_ptr region, int x, int y) { double wx, wy; double cx, cy; TimeAxisView *tv; - jack_nframes_t where; + nframes_t where; AudioTimeAxisView *atv = 0; - Playlist *playlist; + boost::shared_ptr playlist; track_canvas.window_to_world (x, y, wx, wy); wx += horizontal_adjustment.get_value(); @@ -1814,25 +1749,31 @@ Editor::insert_region_list_drag (AudioRegion& region, int x, int y) return; } + cerr << "drop target playlist, UC = " << playlist.use_count() << endl; + snap_to (where); begin_reversible_command (_("insert dragged region")); - session->add_undo (playlist->get_memento()); - playlist->add_region (*(new AudioRegion (region)), where, 1.0); - session->add_redo_no_execute (playlist->get_memento()); + XMLNode &before = playlist->get_state(); + cerr << "pre add target playlist, UC = " << playlist.use_count() << endl; + playlist->add_region (RegionFactory::create (region), where, 1.0); + cerr << "post add target playlist, UC = " << playlist.use_count() << endl; + session->add_command(new MementoCommand(*playlist, &before, &playlist->get_state())); commit_reversible_command (); + + cerr << "post drop target playlist, UC = " << playlist.use_count() << endl; } void Editor::insert_region_list_selection (float times) { - AudioTimeAxisView *tv = 0; - Playlist *playlist; + RouteTimeAxisView *tv = 0; + boost::shared_ptr playlist; if (clicked_audio_trackview != 0) { tv = clicked_audio_trackview; } else if (!selection->tracks.empty()) { - if ((tv = dynamic_cast(selection->tracks.front())) == 0) { + if ((tv = dynamic_cast(selection->tracks.front())) == 0) { return; } } else { @@ -1849,16 +1790,23 @@ Editor::insert_region_list_selection (float times) return; } - TreeModel::iterator i = region_list_display.get_selection()->get_selected(); - Region* region = (*i)[region_list_columns.region]; + TreeView::Selection::ListHandle_Path rows = selected->get_selected_rows (); - begin_reversible_command (_("insert region")); - session->add_undo (playlist->get_memento()); - playlist->add_region (*(createRegion (*region)), edit_cursor->current_frame, times); - session->add_redo_no_execute (playlist->get_memento()); - commit_reversible_command (); -} + /* only one row selected, so rows.begin() is it */ + + TreeIter iter; + if ((iter = region_list_model->get_iter (*rows.begin()))) { + + boost::shared_ptr region = (*iter)[region_list_columns.region]; + + begin_reversible_command (_("insert region")); + XMLNode &before = playlist->get_state(); + playlist->add_region ((RegionFactory::create (region)), edit_cursor->current_frame, times); + session->add_command(new MementoCommand(*playlist, &before, &playlist->get_state())); + commit_reversible_command (); + } +} /* BUILT-IN EFFECTS */ @@ -1884,9 +1832,9 @@ Editor::toggle_playback (bool with_abort) return; } - switch (session->slave_source()) { - case Session::None: - case Session::JACK: + switch (Config->get_slave_source()) { + case None: + case JACK: break; default: /* transport controlled by the master */ @@ -1900,8 +1848,8 @@ Editor::toggle_playback (bool with_abort) if (session->transport_rolling()) { session->request_stop (with_abort); - if (session->get_auto_loop()) { - session->request_auto_loop (false); + if (session->get_play_loop()) { + session->request_play_loop (false); } } else { session->request_transport_speed (1.0f); @@ -1914,6 +1862,12 @@ Editor::play_from_start () session->request_locate (session->current_start_frame(), true); } +void +Editor::play_from_edit_cursor () +{ + session->request_locate (edit_cursor->current_frame, true); +} + void Editor::play_selection () { @@ -1927,27 +1881,27 @@ Editor::play_selection () void Editor::play_selected_region () { - if (!selection->audio_regions.empty()) { - AudioRegionView *rv = *(selection->audio_regions.begin()); + if (!selection->regions.empty()) { + RegionView *rv = *(selection->regions.begin()); - session->request_bounded_roll (rv->region.position(), rv->region.last_frame()); + session->request_bounded_roll (rv->region()->position(), rv->region()->last_frame()); } } void Editor::loop_selected_region () { - if (!selection->audio_regions.empty()) { - AudioRegionView *rv = *(selection->audio_regions.begin()); + if (!selection->regions.empty()) { + RegionView *rv = *(selection->regions.begin()); Location* tll; if ((tll = transport_loop_location()) != 0) { - tll->set (rv->region.position(), rv->region.last_frame()); + tll->set (rv->region()->position(), rv->region()->last_frame()); // enable looping, reposition and start rolling - session->request_auto_loop (true); + session->request_play_loop (true); session->request_locate (tll->start(), false); session->request_transport_speed (1.0f); } @@ -1977,55 +1931,33 @@ Editor::loop_location (Location& location) tll->set (location.start(), location.end()); // enable looping, reposition and start rolling - session->request_auto_loop (true); + session->request_play_loop (true); session->request_locate (tll->start(), true); } } -void -Editor::toggle_region_mute () -{ - if (clicked_regionview) { - clicked_regionview->region.set_muted (!clicked_regionview->region.muted()); - } else if (!selection->audio_regions.empty()) { - bool yn = ! (*selection->audio_regions.begin())->region.muted(); - selection->foreach_audio_region (&AudioRegion::set_muted, yn); - } -} - -void -Editor::toggle_region_opaque () -{ - if (clicked_regionview) { - clicked_regionview->region.set_opaque (!clicked_regionview->region.opaque()); - } else if (!selection->audio_regions.empty()) { - bool yn = ! (*selection->audio_regions.begin())->region.opaque(); - selection->foreach_audio_region (&Region::set_opaque, yn); - } -} - void Editor::raise_region () { - selection->foreach_audio_region (&Region::raise); + selection->foreach_region (&Region::raise); } void Editor::raise_region_to_top () { - selection->foreach_audio_region (&Region::raise_to_top); + selection->foreach_region (&Region::raise_to_top); } void Editor::lower_region () { - selection->foreach_audio_region (&Region::lower); + selection->foreach_region (&Region::lower); } void Editor::lower_region_to_bottom () { - selection->foreach_audio_region (&Region::lower_to_bottom); + selection->foreach_region (&Region::lower_to_bottom); } void @@ -2046,7 +1978,7 @@ Editor::rename_region () Button ok_button (_("OK")); Button cancel_button (_("Cancel")); - if (selection->audio_regions.empty()) { + if (selection->regions.empty()) { return; } @@ -2077,7 +2009,7 @@ Editor::rename_region () Main::run (); if (region_renamed) { - (*selection->audio_regions.begin())->region.set_name (entry.get_text()); + (*selection->regions.begin())->region()->set_name (entry.get_text()); redisplay_regions (); } } @@ -2091,7 +2023,7 @@ Editor::rename_region_finished (bool status) } void -Editor::audition_playlist_region_via_route (AudioRegion& region, Route& route) +Editor::audition_playlist_region_via_route (boost::shared_ptr region, Route& route) { if (session->is_auditioning()) { session->cancel_audition (); @@ -2104,7 +2036,7 @@ Editor::audition_playlist_region_via_route (AudioRegion& region, Route& route) route.set_solo (true, this); - session->request_bounded_roll (region.position(), region.position() + region.length()); + session->request_bounded_roll (region->position(), region->position() + region->length()); /* XXX how to unset the solo state ? */ } @@ -2112,14 +2044,14 @@ Editor::audition_playlist_region_via_route (AudioRegion& region, Route& route) void Editor::audition_selected_region () { - if (!selection->audio_regions.empty()) { - AudioRegionView* rv = *(selection->audio_regions.begin()); - session->audition_region (rv->region); + if (!selection->regions.empty()) { + RegionView* rv = *(selection->regions.begin()); + session->audition_region (rv->region()); } } void -Editor::audition_playlist_region_standalone (AudioRegion& region) +Editor::audition_playlist_region_standalone (boost::shared_ptr region) { session->audition_region (region); } @@ -2163,19 +2095,17 @@ Editor::region_from_selection () return; } - jack_nframes_t start = selection->time[clicked_selection].start; - jack_nframes_t end = selection->time[clicked_selection].end; + nframes_t start = selection->time[clicked_selection].start; + nframes_t end = selection->time[clicked_selection].end; - jack_nframes_t selection_cnt = end - start + 1; + nframes_t selection_cnt = end - start + 1; for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { + boost::shared_ptr current; + boost::shared_ptr current_r; + boost::shared_ptr pl; - AudioRegion *region; - AudioRegion *current; - Region* current_r; - Playlist *pl; - - jack_nframes_t internal_start; + nframes_t internal_start; string new_name; if ((pl = (*i)->playlist()) == 0) { @@ -2186,30 +2116,32 @@ Editor::region_from_selection () continue; } - if ((current = dynamic_cast (current_r)) != 0) { + current = boost::dynamic_pointer_cast (current_r); + // FIXME: audio only + if (current != 0) { internal_start = start - current->position(); session->region_name (new_name, current->name(), true); - region = new AudioRegion (*current, internal_start, selection_cnt, new_name); + boost::shared_ptr region (RegionFactory::create (current, internal_start, selection_cnt, new_name)); } } } void -Editor::create_region_from_selection (vector& new_regions) +Editor::create_region_from_selection (vector >& new_regions) { if (selection->time.empty() || selection->tracks.empty()) { return; } - jack_nframes_t start = selection->time[clicked_selection].start; - jack_nframes_t end = selection->time[clicked_selection].end; + nframes_t start = selection->time[clicked_selection].start; + nframes_t end = selection->time[clicked_selection].end; for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { - AudioRegion* current; - Region* current_r; - Playlist* playlist; - jack_nframes_t internal_start; + boost::shared_ptr current; + boost::shared_ptr current_r; + boost::shared_ptr playlist; + nframes_t internal_start; string new_name; if ((playlist = (*i)->playlist()) == 0) { @@ -2220,14 +2152,14 @@ Editor::create_region_from_selection (vector& new_regions) continue; } - if ((current = dynamic_cast(current_r)) == 0) { + if ((current = boost::dynamic_pointer_cast(current_r)) == 0) { continue; } internal_start = start - current->position(); session->region_name (new_name, current->name(), true); - new_regions.push_back (new AudioRegion (*current, internal_start, end - start + 1, new_name)); + new_regions.push_back (boost::dynamic_pointer_cast (RegionFactory::create (current, internal_start, end - start + 1, new_name))); } } @@ -2236,11 +2168,13 @@ Editor::split_multichannel_region () { vector v; - if (!clicked_regionview || clicked_regionview->region.n_channels() < 2) { + AudioRegionView* clicked_arv = dynamic_cast(clicked_regionview); + + if (!clicked_arv || clicked_arv->audio_region()->n_channels() < 2) { return; } - clicked_regionview->region.separate_by_channel (*session, v); + clicked_arv->audio_region()->separate_by_channel (*session, v); /* nothing else to do, really */ } @@ -2261,7 +2195,7 @@ Editor::separate_region_from_selection () return; } - Playlist *playlist; + boost::shared_ptr playlist; for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { @@ -2276,17 +2210,20 @@ Editor::separate_region_from_selection () begin_reversible_command (_("separate")); doing_undo = true; } - if (doing_undo) session->add_undo ((playlist)->get_memento()); + XMLNode *before; + if (doing_undo) + before = &(playlist->get_state()); /* XXX need to consider musical time selections here at some point */ double speed = atv->get_diskstream()->speed(); for (list::iterator t = selection->time.begin(); t != selection->time.end(); ++t) { - playlist->partition ((jack_nframes_t)((*t).start * speed), (jack_nframes_t)((*t).end * speed), true); + playlist->partition ((nframes_t)((*t).start * speed), (nframes_t)((*t).end * speed), true); } - if (doing_undo) session->add_redo_no_execute (playlist->get_memento()); + if (doing_undo) + session->add_command(new MementoCommand(*playlist, before, &playlist->get_state())); } } } @@ -2304,7 +2241,7 @@ Editor::separate_regions_using_location (Location& loc) return; } - Playlist *playlist; + boost::shared_ptr playlist; /* XXX i'm unsure as to whether this should operate on selected tracks only or the entire enchillada. uncomment the below line to correct the behaviour @@ -2321,19 +2258,23 @@ Editor::separate_regions_using_location (Location& loc) if (atv->is_audio_track()) { if ((playlist = atv->playlist()) != 0) { + XMLNode *before; if (!doing_undo) { begin_reversible_command (_("separate")); doing_undo = true; } - if (doing_undo) session->add_undo ((playlist)->get_memento()); + if (doing_undo) + before = &(playlist->get_state()); + /* XXX need to consider musical time selections here at some point */ double speed = atv->get_diskstream()->speed(); - playlist->partition ((jack_nframes_t)(loc.start() * speed), (jack_nframes_t)(loc.end() * speed), true); - if (doing_undo) session->add_redo_no_execute (playlist->get_memento()); + playlist->partition ((nframes_t)(loc.start() * speed), (nframes_t)(loc.end() * speed), true); + if (doing_undo) + session->add_command(new MementoCommand(*playlist, before, &playlist->get_state())); } } } @@ -2349,8 +2290,8 @@ Editor::crop_region_to_selection () return; } - vector playlists; - Playlist *playlist; + vector > playlists; + boost::shared_ptr playlist; if (clicked_trackview != 0) { @@ -2380,15 +2321,15 @@ Editor::crop_region_to_selection () if (!playlists.empty()) { - jack_nframes_t start; - jack_nframes_t end; - jack_nframes_t cnt; + nframes_t start; + nframes_t end; + nframes_t cnt; begin_reversible_command (_("trim to selection")); - for (vector::iterator i = playlists.begin(); i != playlists.end(); ++i) { + for (vector >::iterator i = playlists.begin(); i != playlists.end(); ++i) { - Region *region; + boost::shared_ptr region; start = selection->time.start(); @@ -2404,9 +2345,10 @@ Editor::crop_region_to_selection () end = min (selection->time.end_frame(), start + region->length() - 1); cnt = end - start + 1; - session->add_undo ((*i)->get_memento()); + XMLNode &before = (*i)->get_state(); region->trim_to (start, cnt, this); - session->add_redo_no_execute ((*i)->get_memento()); + XMLNode &after = (*i)->get_state(); + session->add_command (new MementoCommand(*(*i), &before, &after)); } commit_reversible_command (); @@ -2416,9 +2358,9 @@ Editor::crop_region_to_selection () void Editor::region_fill_track () { - jack_nframes_t end; + nframes_t end; - if (!session || selection->audio_regions.empty()) { + if (!session || selection->regions.empty()) { return; } @@ -2426,24 +2368,30 @@ Editor::region_fill_track () begin_reversible_command (_("region fill")); - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + + boost::shared_ptr region ((*i)->region()); + + // FIXME + boost::shared_ptr ar = boost::dynamic_pointer_cast(region); + if (!ar) + continue; - AudioRegion& region ((*i)->region); - Playlist* pl = region.playlist(); + boost::shared_ptr pl = region->playlist(); - if (end <= region.last_frame()) { + if (end <= region->last_frame()) { return; } - double times = (double) (end - region.last_frame()) / (double) region.length(); + double times = (double) (end - region->last_frame()) / (double) region->length(); if (times == 0) { return; } - session->add_undo (pl->get_memento()); - pl->add_region (*(new AudioRegion (region)), region.last_frame(), times); - session->add_redo_no_execute (pl->get_memento()); + XMLNode &before = pl->get_state(); + pl->add_region (RegionFactory::create (ar), ar->last_frame(), times); + session->add_command (new MementoCommand(*pl, &before, &pl->get_state())); } commit_reversible_command (); @@ -2460,7 +2408,6 @@ Editor::region_fill_selection () return; } - Region *region; Glib::RefPtr selected = region_list_display.get_selection(); @@ -2469,18 +2416,18 @@ Editor::region_fill_selection () } TreeModel::iterator i = region_list_display.get_selection()->get_selected(); - region = (*i)[region_list_columns.region]; + boost::shared_ptr region = (*i)[region_list_columns.region]; - jack_nframes_t start = selection->time[clicked_selection].start; - jack_nframes_t end = selection->time[clicked_selection].end; + nframes_t start = selection->time[clicked_selection].start; + nframes_t end = selection->time[clicked_selection].end; - Playlist *playlist; + boost::shared_ptr playlist; if (selection->tracks.empty()) { return; } - jack_nframes_t selection_length = end - start; + nframes_t selection_length = end - start; float times = (float)selection_length / region->length(); begin_reversible_command (_("fill selection")); @@ -2491,26 +2438,27 @@ Editor::region_fill_selection () continue; } - session->add_undo (playlist->get_memento()); - playlist->add_region (*(createRegion (*region)), start, times); - session->add_redo_no_execute (playlist->get_memento()); + XMLNode &before = playlist->get_state(); + playlist->add_region (RegionFactory::create (region), start, times); + session->add_command (new MementoCommand(*playlist, &before, &playlist->get_state())); } commit_reversible_command (); } void -Editor::set_a_regions_sync_position (Region& region, jack_nframes_t position) +Editor::set_a_regions_sync_position (boost::shared_ptr region, nframes_t position) { - if (!region.covers (position)) { + if (!region->covers (position)) { error << _("Programming error. that region doesn't cover that position") << __FILE__ << " +" << __LINE__ << endmsg; return; } begin_reversible_command (_("set region sync position")); - session->add_undo (region.playlist()->get_memento()); - region.set_sync_position (position); - session->add_redo_no_execute (region.playlist()->get_memento()); + XMLNode &before = region->playlist()->get_state(); + region->set_sync_position (position); + XMLNode &after = region->playlist()->get_state(); + session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); commit_reversible_command (); } @@ -2521,16 +2469,17 @@ Editor::set_region_sync_from_edit_cursor () return; } - if (!clicked_regionview->region.covers (edit_cursor->current_frame)) { + if (!clicked_regionview->region()->covers (edit_cursor->current_frame)) { error << _("Place the edit cursor at the desired sync point") << endmsg; return; } - Region& region (clicked_regionview->region); + boost::shared_ptr region (clicked_regionview->region()); begin_reversible_command (_("set sync from edit cursor")); - session->add_undo (region.playlist()->get_memento()); - region.set_sync_position (edit_cursor->current_frame); - session->add_redo_no_execute (region.playlist()->get_memento()); + XMLNode &before = region->playlist()->get_state(); + region->set_sync_position (edit_cursor->current_frame); + XMLNode &after = region->playlist()->get_state(); + session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); commit_reversible_command (); } @@ -2538,11 +2487,12 @@ void Editor::remove_region_sync () { if (clicked_regionview) { - Region& region (clicked_regionview->region); + boost::shared_ptr region (clicked_regionview->region()); begin_reversible_command (_("remove sync")); - session->add_undo (region.playlist()->get_memento()); - region.clear_sync_position (); - session->add_redo_no_execute (region.playlist()->get_memento()); + XMLNode &before = region->playlist()->get_state(); + region->clear_sync_position (); + XMLNode &after = region->playlist()->get_state(); + session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); commit_reversible_command (); } } @@ -2550,14 +2500,15 @@ Editor::remove_region_sync () void Editor::naturalize () { - if (selection->audio_regions.empty()) { + if (selection->regions.empty()) { return; } begin_reversible_command (_("naturalize")); - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - session->add_undo ((*i)->region.get_memento()); - (*i)->region.move_to_natural_position (this); - session->add_redo_no_execute ((*i)->region.get_memento()); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + XMLNode &before = (*i)->region()->get_state(); + (*i)->region()->move_to_natural_position (this); + XMLNode &after = (*i)->region()->get_state(); + session->add_command (new MementoCommand(*((*i)->region().get()), &before, &after)); } commit_reversible_command (); } @@ -2576,36 +2527,36 @@ Editor::align_relative (RegionPoint what) struct RegionSortByTime { bool operator() (const AudioRegionView* a, const AudioRegionView* b) { - return a->region.position() < b->region.position(); + return a->region()->position() < b->region()->position(); } }; void -Editor::align_selection_relative (RegionPoint point, jack_nframes_t position) +Editor::align_selection_relative (RegionPoint point, nframes_t position) { - if (selection->audio_regions.empty()) { + if (selection->regions.empty()) { return; } - jack_nframes_t distance; - jack_nframes_t pos = 0; + nframes_t distance; + nframes_t pos = 0; int dir; - list sorted; - selection->audio_regions.by_position (sorted); - Region& r ((*sorted.begin())->region); + list sorted; + selection->regions.by_position (sorted); + boost::shared_ptr r ((*sorted.begin())->region()); switch (point) { case Start: - pos = r.first_frame (); + pos = r->first_frame (); break; case End: - pos = r.last_frame(); + pos = r->last_frame(); break; case SyncPoint: - pos = r.adjust_to_sync (r.first_frame()); + pos = r->adjust_to_sync (r->first_frame()); break; } @@ -2619,19 +2570,20 @@ Editor::align_selection_relative (RegionPoint point, jack_nframes_t position) begin_reversible_command (_("align selection (relative)")); - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { - Region& region ((*i)->region); + boost::shared_ptr region ((*i)->region()); - session->add_undo (region.playlist()->get_memento()); + XMLNode &before = region->playlist()->get_state(); if (dir > 0) { - region.set_position (region.position() + distance, this); + region->set_position (region->position() + distance, this); } else { - region.set_position (region.position() - distance, this); + region->set_position (region->position() - distance, this); } - session->add_redo_no_execute (region.playlist()->get_memento()); + XMLNode &after = region->playlist()->get_state(); + session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); } @@ -2639,23 +2591,23 @@ Editor::align_selection_relative (RegionPoint point, jack_nframes_t position) } void -Editor::align_selection (RegionPoint point, jack_nframes_t position) +Editor::align_selection (RegionPoint point, nframes_t position) { - if (selection->audio_regions.empty()) { + if (selection->regions.empty()) { return; } begin_reversible_command (_("align selection")); - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - align_region_internal ((*i)->region, point, position); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + align_region_internal ((*i)->region(), point, position); } commit_reversible_command (); } void -Editor::align_region (Region& region, RegionPoint point, jack_nframes_t position) +Editor::align_region (boost::shared_ptr region, RegionPoint point, nframes_t position) { begin_reversible_command (_("align region")); align_region_internal (region, point, position); @@ -2663,27 +2615,28 @@ Editor::align_region (Region& region, RegionPoint point, jack_nframes_t position } void -Editor::align_region_internal (Region& region, RegionPoint point, jack_nframes_t position) +Editor::align_region_internal (boost::shared_ptr region, RegionPoint point, nframes_t position) { - session->add_undo (region.playlist()->get_memento()); + XMLNode &before = region->playlist()->get_state(); switch (point) { case SyncPoint: - region.set_position (region.adjust_to_sync (position), this); + region->set_position (region->adjust_to_sync (position), this); break; case End: - if (position > region.length()) { - region.set_position (position - region.length(), this); + if (position > region->length()) { + region->set_position (position - region->length(), this); } break; case Start: - region.set_position (position, this); + region->set_position (position, this); break; } - session->add_redo_no_execute (region.playlist()->get_memento()); + XMLNode &after = region->playlist()->get_state(); + session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); } void @@ -2693,7 +2646,7 @@ Editor::trim_region_to_edit_cursor () return; } - Region& region (clicked_regionview->region); + boost::shared_ptr region (clicked_regionview->region()); float speed = 1.0f; AudioTimeAxisView *atav; @@ -2705,9 +2658,10 @@ Editor::trim_region_to_edit_cursor () } begin_reversible_command (_("trim to edit")); - session->add_undo (region.playlist()->get_memento()); - region.trim_end( session_frame_to_track_frame(edit_cursor->current_frame, speed), this); - session->add_redo_no_execute (region.playlist()->get_memento()); + XMLNode &before = region->playlist()->get_state(); + region->trim_end( session_frame_to_track_frame(edit_cursor->current_frame, speed), this); + XMLNode &after = region->playlist()->get_state(); + session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); commit_reversible_command (); } @@ -2718,7 +2672,7 @@ Editor::trim_region_from_edit_cursor () return; } - Region& region (clicked_regionview->region); + boost::shared_ptr region (clicked_regionview->region()); float speed = 1.0f; AudioTimeAxisView *atav; @@ -2730,9 +2684,10 @@ Editor::trim_region_from_edit_cursor () } begin_reversible_command (_("trim to edit")); - session->add_undo (region.playlist()->get_memento()); - region.trim_front ( session_frame_to_track_frame(edit_cursor->current_frame, speed), this); - session->add_redo_no_execute (region.playlist()->get_memento()); + XMLNode &before = region->playlist()->get_state(); + region->trim_front ( session_frame_to_track_frame(edit_cursor->current_frame, speed), this); + XMLNode &after = region->playlist()->get_state(); + session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); commit_reversible_command (); } @@ -2818,9 +2773,9 @@ Editor::bounce_range_selection () TrackViewList *views = get_valid_views (selection->time.track, selection->time.group); - jack_nframes_t start = selection->time[clicked_selection].start; - jack_nframes_t end = selection->time[clicked_selection].end; - jack_nframes_t cnt = end - start + 1; + nframes_t start = selection->time[clicked_selection].start; + nframes_t end = selection->time[clicked_selection].end; + nframes_t cnt = end - start + 1; begin_reversible_command (_("bounce range")); @@ -2832,7 +2787,7 @@ Editor::bounce_range_selection () continue; } - Playlist* playlist; + boost::shared_ptr playlist; if ((playlist = atv->playlist()) == 0) { return; @@ -2844,9 +2799,10 @@ Editor::bounce_range_selection () itt.cancel = false; itt.progress = false; - session->add_undo (playlist->get_memento()); + XMLNode &before = playlist->get_state(); atv->audio_track()->bounce_range (start, cnt, itt); - session->add_redo_no_execute (playlist->get_memento()); + XMLNode &after = playlist->get_state(); + session->add_command (new MementoCommand (*playlist, &before, &after)); } commit_reversible_command (); @@ -2889,16 +2845,16 @@ Editor::cut_copy (CutCopyOp op) switch (current_mouse_mode()) { case MouseObject: - if (!selection->audio_regions.empty() || !selection->points.empty()) { + if (!selection->regions.empty() || !selection->points.empty()) { begin_reversible_command (opname + _(" objects")); - if (!selection->audio_regions.empty()) { + if (!selection->regions.empty()) { cut_copy_regions (op); if (op == Cut) { - selection->clear_audio_regions (); + selection->clear_regions (); } } @@ -2946,35 +2902,53 @@ Editor::cut_copy_points (CutCopyOp op) } } +struct PlaylistState { + boost::shared_ptr playlist; + XMLNode* before; +}; + +struct lt_playlist { + bool operator () (const PlaylistState& a, const PlaylistState& b) { + return a.playlist < b.playlist; + } +}; + void Editor::cut_copy_regions (CutCopyOp op) { - typedef std::map PlaylistMapping; + typedef std::map,boost::shared_ptr > PlaylistMapping; PlaylistMapping pmap; - jack_nframes_t first_position = max_frames; - set freezelist; - pair::iterator,bool> insert_result; + nframes_t first_position = max_frames; - for (AudioRegionSelection::iterator x = selection->audio_regions.begin(); x != selection->audio_regions.end(); ++x) { - first_position = min ((*x)->region.position(), first_position); + set freezelist; + pair::iterator,bool> insert_result; + + for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) { + first_position = min ((*x)->region()->position(), first_position); if (op == Cut || op == Clear) { - AudioPlaylist *pl = dynamic_cast((*x)->region.playlist()); + boost::shared_ptr pl = boost::dynamic_pointer_cast((*x)->region()->playlist()); + if (pl) { - insert_result = freezelist.insert (pl); + + PlaylistState before; + before.playlist = pl; + before.before = &pl->get_state(); + + insert_result = freezelist.insert (before); + if (insert_result.second) { pl->freeze (); - session->add_undo (pl->get_memento()); } } } } - for (AudioRegionSelection::iterator x = selection->audio_regions.begin(); x != selection->audio_regions.end(); ) { + for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ) { - AudioPlaylist *pl = dynamic_cast((*x)->region.playlist()); - AudioPlaylist* npl; - AudioRegionSelection::iterator tmp; + boost::shared_ptr pl = boost::dynamic_pointer_cast((*x)->region()->playlist()); + boost::shared_ptr npl; + RegionSelection::iterator tmp; tmp = x; ++tmp; @@ -2984,25 +2958,31 @@ Editor::cut_copy_regions (CutCopyOp op) PlaylistMapping::iterator pi = pmap.find (pl); if (pi == pmap.end()) { - npl = new AudioPlaylist (*session, "cutlist", true); + npl = boost::dynamic_pointer_cast (PlaylistFactory::create (*session, "cutlist", true)); npl->freeze(); pmap[pl] = npl; } else { npl = pi->second; } + // FIXME + boost::shared_ptr ar = boost::dynamic_pointer_cast((*x)->region()); switch (op) { case Cut: - npl->add_region (*(new AudioRegion ((*x)->region)), (*x)->region.position() - first_position); - pl->remove_region (&((*x)->region)); + if (!ar) break; + + npl->add_region (RegionFactory::create (ar), (*x)->region()->position() - first_position); + pl->remove_region (((*x)->region())); break; case Copy: - npl->add_region (*(new AudioRegion ((*x)->region)), (*x)->region.position() - first_position); + if (!ar) break; + + npl->add_region (RegionFactory::create (ar), (*x)->region()->position() - first_position); break; case Clear: - pl->remove_region (&((*x)->region)); + pl->remove_region (((*x)->region())); break; } } @@ -3010,7 +2990,7 @@ Editor::cut_copy_regions (CutCopyOp op) x = tmp; } - list foo; + list > foo; for (PlaylistMapping::iterator i = pmap.begin(); i != pmap.end(); ++i) { foo.push_back (i->second); @@ -3020,9 +3000,9 @@ Editor::cut_copy_regions (CutCopyOp op) cut_buffer->set (foo); } - for (set::iterator pl = freezelist.begin(); pl != freezelist.end(); ++pl) { - (*pl)->thaw (); - session->add_redo_no_execute ((*pl)->get_memento()); + for (set::iterator pl = freezelist.begin(); pl != freezelist.end(); ++pl) { + (*pl).playlist->thaw (); + session->add_command (new MementoCommand(*(*pl).playlist, (*pl).before, &(*pl).playlist->get_state())); } } @@ -3056,13 +3036,13 @@ Editor::mouse_paste () event.button.x = wx; event.button.y = wy; - jack_nframes_t where = event_frame (&event, 0, 0); + nframes_t where = event_frame (&event, 0, 0); snap_to (where); paste_internal (where, 1); } void -Editor::paste_internal (jack_nframes_t position, float times) +Editor::paste_internal (nframes_t position, float times) { bool commit = false; @@ -3107,8 +3087,8 @@ Editor::paste_named_selection (float times) TreeModel::iterator i = selected->get_selected(); NamedSelection* ns = (*i)[named_selection_columns.selection]; - list::iterator chunk; - list::iterator tmp; + list >::iterator chunk; + list >::iterator tmp; chunk = ns->playlists.begin(); @@ -3117,8 +3097,8 @@ Editor::paste_named_selection (float times) for (t = selection->tracks.begin(); t != selection->tracks.end(); ++t) { AudioTimeAxisView* atv; - Playlist* pl; - AudioPlaylist* apl; + boost::shared_ptr pl; + boost::shared_ptr apl; if ((atv = dynamic_cast (*t)) == 0) { continue; @@ -3127,17 +3107,17 @@ Editor::paste_named_selection (float times) if ((pl = atv->playlist()) == 0) { continue; } - - if ((apl = dynamic_cast (pl)) == 0) { + + if ((apl = boost::dynamic_pointer_cast (pl)) == 0) { continue; } tmp = chunk; ++tmp; - session->add_undo (apl->get_memento()); - apl->paste (**chunk, edit_cursor->current_frame, times); - session->add_redo_no_execute (apl->get_memento()); + XMLNode &before = apl->get_state(); + apl->paste (*chunk, edit_cursor->current_frame, times); + session->add_command(new MementoCommand(*apl, &before, &apl->get_state())); if (tmp != ns->playlists.end()) { chunk = tmp; @@ -3148,27 +3128,27 @@ Editor::paste_named_selection (float times) } void -Editor::duplicate_some_regions (AudioRegionSelection& regions, float times) +Editor::duplicate_some_regions (RegionSelection& regions, float times) { - Playlist *playlist; - AudioRegionSelection sel = regions; // clear (below) will clear the argument list + boost::shared_ptr playlist; + RegionSelection sel = regions; // clear (below) will clear the argument list begin_reversible_command (_("duplicate region")); - selection->clear_audio_regions (); + selection->clear_regions (); - for (AudioRegionSelection::iterator i = sel.begin(); i != sel.end(); ++i) { + for (RegionSelection::iterator i = sel.begin(); i != sel.end(); ++i) { - Region& r ((*i)->region); + boost::shared_ptr r ((*i)->region()); TimeAxisView& tv = (*i)->get_time_axis_view(); AudioTimeAxisView* atv = dynamic_cast (&tv); - sigc::connection c = atv->view->AudioRegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view)); + sigc::connection c = atv->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view)); - playlist = (*i)->region.playlist(); - session->add_undo (playlist->get_memento()); - playlist->duplicate (r, r.last_frame(), times); - session->add_redo_no_execute (playlist->get_memento()); + playlist = (*i)->region()->playlist(); + XMLNode &before = playlist->get_state(); + playlist->duplicate (r, r->last_frame(), times); + session->add_command(new MementoCommand(*playlist, &before, &playlist->get_state())); c.disconnect (); @@ -3188,9 +3168,9 @@ Editor::duplicate_selection (float times) return; } - Playlist *playlist; - vector new_regions; - vector::iterator ri; + boost::shared_ptr playlist; + vector > new_regions; + vector >::iterator ri; create_region_from_selection (new_regions); @@ -3206,9 +3186,10 @@ Editor::duplicate_selection (float times) if ((playlist = (*i)->playlist()) == 0) { continue; } - session->add_undo (playlist->get_memento()); - playlist->duplicate (**ri, selection->time[clicked_selection].end, times); - session->add_redo_no_execute (playlist->get_memento()); + XMLNode &before = playlist->get_state(); + playlist->duplicate (*ri, selection->time[clicked_selection].end, times); + XMLNode &after = playlist->get_state(); + session->add_command (new MementoCommand(*playlist, &before, &after)); ++ri; if (ri == new_regions.end()) { @@ -3253,22 +3234,23 @@ Editor::center_edit_cursor () } void -Editor::clear_playlist (Playlist& playlist) +Editor::clear_playlist (boost::shared_ptr playlist) { begin_reversible_command (_("clear playlist")); - session->add_undo (playlist.get_memento()); - playlist.clear (); - session->add_redo_no_execute (playlist.get_memento()); + XMLNode &before = playlist->get_state(); + playlist->clear (); + XMLNode &after = playlist->get_state(); + session->add_command (new MementoCommand(*playlist.get(), &before, &after)); commit_reversible_command (); } void Editor::nudge_track (bool use_edit_cursor, bool forwards) { - Playlist *playlist; - jack_nframes_t distance; - jack_nframes_t next_distance; - jack_nframes_t start; + boost::shared_ptr playlist; + nframes_t distance; + nframes_t next_distance; + nframes_t start; if (use_edit_cursor) { start = edit_cursor->current_frame; @@ -3292,9 +3274,10 @@ Editor::nudge_track (bool use_edit_cursor, bool forwards) continue; } - session->add_undo (playlist->get_memento()); + XMLNode &before = playlist->get_state(); playlist->nudge_after (start, distance, forwards); - session->add_redo_no_execute (playlist->get_memento()); + XMLNode &after = playlist->get_state(); + session->add_command (new MementoCommand(*playlist, &before, &after)); } commit_reversible_command (); @@ -3335,7 +3318,7 @@ Editor::normalize_region () return; } - if (selection->audio_regions.empty()) { + if (selection->regions.empty()) { return; } @@ -3344,10 +3327,13 @@ Editor::normalize_region () track_canvas.get_window()->set_cursor (*wait_cursor); gdk_flush (); - for (AudioRegionSelection::iterator r = selection->audio_regions.begin(); r != selection->audio_regions.end(); ++r) { - session->add_undo ((*r)->region.get_memento()); - (*r)->region.normalize_to (0.0f); - session->add_redo_no_execute ((*r)->region.get_memento()); + for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ++r) { + AudioRegionView* const arv = dynamic_cast(*r); + if (!arv) + continue; + XMLNode &before = arv->region()->get_state(); + arv->audio_region()->normalize_to (0.0f); + session->add_command (new MementoCommand(*(arv->region().get()), &before, &arv->region()->get_state())); } commit_reversible_command (); @@ -3362,16 +3348,19 @@ Editor::denormalize_region () return; } - if (selection->audio_regions.empty()) { + if (selection->regions.empty()) { return; } begin_reversible_command ("denormalize"); - for (AudioRegionSelection::iterator r = selection->audio_regions.begin(); r != selection->audio_regions.end(); ++r) { - session->add_undo ((*r)->region.get_memento()); - (*r)->region.set_scale_amplitude (1.0f); - session->add_redo_no_execute ((*r)->region.get_memento()); + for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ++r) { + AudioRegionView* const arv = dynamic_cast(*r); + if (!arv) + continue; + XMLNode &before = arv->region()->get_state(); + arv->audio_region()->set_scale_amplitude (1.0f); + session->add_command (new MementoCommand(*(arv->region().get()), &before, &arv->region()->get_state())); } commit_reversible_command (); @@ -3392,7 +3381,7 @@ Editor::reverse_region () void Editor::apply_filter (AudioFilter& filter, string command) { - if (selection->audio_regions.empty()) { + if (selection->regions.empty()) { return; } @@ -3401,21 +3390,24 @@ Editor::apply_filter (AudioFilter& filter, string command) track_canvas.get_window()->set_cursor (*wait_cursor); gdk_flush (); - for (AudioRegionSelection::iterator r = selection->audio_regions.begin(); r != selection->audio_regions.end(); ) { + for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ) { + AudioRegionView* const arv = dynamic_cast(*r); + if (!arv) + continue; - AudioRegion& region ((*r)->region); - Playlist* playlist = region.playlist(); + boost::shared_ptr playlist = arv->region()->playlist(); - AudioRegionSelection::iterator tmp; + RegionSelection::iterator tmp; tmp = r; ++tmp; - if (region.apply (filter) == 0) { + if (arv->audio_region()->apply (filter) == 0) { - session->add_undo (playlist->get_memento()); - playlist->replace_region (region, *(filter.results.front()), region.position()); - session->add_redo_no_execute (playlist->get_memento()); + XMLNode &before = playlist->get_state(); + playlist->replace_region (arv->region(), filter.results.front(), arv->region()->position()); + XMLNode &after = playlist->get_state(); + session->add_command(new MementoCommand(*playlist, &before, &after)); } else { goto out; } @@ -3424,7 +3416,7 @@ Editor::apply_filter (AudioFilter& filter, string command) } commit_reversible_command (); - selection->audio_regions.clear (); + selection->regions.clear (); out: track_canvas.get_window()->set_cursor (*current_canvas_cursor); @@ -3433,8 +3425,9 @@ Editor::apply_filter (AudioFilter& filter, string command) void Editor::region_selection_op (void (Region::*pmf)(void)) { - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - ((*i)->region.*pmf)(); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + Region* region = (*i)->region().get(); + (region->*pmf)(); } } @@ -3442,16 +3435,18 @@ Editor::region_selection_op (void (Region::*pmf)(void)) void Editor::region_selection_op (void (Region::*pmf)(void*), void *arg) { - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - ((*i)->region.*pmf)(arg); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + Region* region = (*i)->region().get(); + (region->*pmf)(arg); } } void Editor::region_selection_op (void (Region::*pmf)(bool), bool yn) { - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - ((*i)->region.*pmf)(yn); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + Region* region = (*i)->region().get(); + (region->*pmf)(yn); } } @@ -3466,41 +3461,115 @@ Editor::external_edit_region () } void -Editor::brush (jack_nframes_t pos) +Editor::brush (nframes_t pos) { - AudioRegionSelection sel; + RegionSelection sel; snap_to (pos); - if (selection->audio_regions.empty()) { + if (selection->regions.empty()) { /* XXX get selection from region list */ } else { - sel = selection->audio_regions; + sel = selection->regions; } if (sel.empty()) { return; } - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { mouse_brush_insert_region ((*i), pos); } } +void +Editor::reset_region_gain_envelopes () +{ + if (!session || selection->regions.empty()) { + return; + } + + session->begin_reversible_command (_("reset region gain")); + + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + AudioRegionView* const arv = dynamic_cast(*i); + if (arv) { + AutomationList& alist (arv->audio_region()->envelope()); + XMLNode& before (alist.get_state()); + + arv->audio_region()->set_default_envelope (); + session->add_command (new MementoCommand(arv->audio_region()->envelope(), &before, &alist.get_state())); + } + } + + session->commit_reversible_command (); +} + void Editor::toggle_gain_envelope_visibility () { - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - (*i)->set_envelope_visible (!(*i)->envelope_visible()); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + AudioRegionView* const arv = dynamic_cast(*i); + if (arv) { + bool x = region_envelope_visible_item->get_active(); + if (x != arv->envelope_visible()) { + arv->set_envelope_visible (x); + } + } } } void Editor::toggle_gain_envelope_active () { - for (AudioRegionSelection::iterator i = selection->audio_regions.begin(); i != selection->audio_regions.end(); ++i) { - AudioRegion* ar = dynamic_cast(&(*i)->region); - if (ar) { - ar->set_envelope_active (true); + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + AudioRegionView* const arv = dynamic_cast(*i); + if (arv) { + bool x = region_envelope_active_item->get_active(); + if (x != arv->audio_region()->envelope_active()) { + arv->audio_region()->set_envelope_active (x); + } + } + } +} + +void +Editor::toggle_region_lock () +{ + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + AudioRegionView* const arv = dynamic_cast(*i); + if (arv) { + bool x = region_lock_item->get_active(); + if (x != arv->audio_region()->locked()) { + arv->audio_region()->set_locked (x); + } + } + } +} + +void +Editor::toggle_region_mute () +{ + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + AudioRegionView* const arv = dynamic_cast(*i); + if (arv) { + bool x = region_mute_item->get_active(); + if (x != arv->audio_region()->muted()) { + arv->audio_region()->set_muted (x); + } + } + } +} + +void +Editor::toggle_region_opaque () +{ + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + AudioRegionView* const arv = dynamic_cast(*i); + if (arv) { + bool x = region_opaque_item->get_active(); + if (x != arv->audio_region()->opaque()) { + arv->audio_region()->set_opaque (x); + } } } }