diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-11-08 20:55:43 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-11-08 20:55:43 +0000 |
commit | a8d2605f9a6f48f3afb09c212de9486c75856287 (patch) | |
tree | 29d014f11717fe70b0a69ec750d1ae7b827e84f5 | |
parent | 62941af2cf8da4c5424afb9173fdb310c2c23eef (diff) |
substantial changes that start to use the edit point and the selected marker for operations
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2609 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/ardour-sae.menus | 7 | ||||
-rw-r--r-- | gtk2_ardour/ardour.menus | 7 | ||||
-rw-r--r-- | gtk2_ardour/editor.cc | 43 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 8 | ||||
-rw-r--r-- | gtk2_ardour/editor_canvas_events.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/editor_keyboard.cc | 104 | ||||
-rw-r--r-- | gtk2_ardour/editor_markers.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 21 | ||||
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 40 | ||||
-rw-r--r-- | gtk2_ardour/marker.cc | 8 | ||||
-rw-r--r-- | gtk2_ardour/marker.h | 10 | ||||
-rw-r--r-- | gtk2_ardour/public_editor.h | 2 | ||||
-rw-r--r-- | libs/ardour/io.cc | 16 | ||||
-rw-r--r-- | libs/ardour/session.cc | 5 |
14 files changed, 212 insertions, 63 deletions
diff --git a/gtk2_ardour/ardour-sae.menus b/gtk2_ardour/ardour-sae.menus index b2f0db8610..d03f4ea1ab 100644 --- a/gtk2_ardour/ardour-sae.menus +++ b/gtk2_ardour/ardour-sae.menus @@ -134,6 +134,13 @@ <menuitem action="nudge-next-backward"/> <menuitem action='split-region'/> <menuitem action='set-region-sync-position'/> + <separator/> + <menuitem action='align-regions-start'/> + <menuitem action='align-regions-start-relative'/> + <menuitem action='align-regions-end'/> + <menuitem action='align-regions-end-relative'/> + <menuitem action='align-regions-sync'/> + <menuitem action='align-regions-sync-relative'/> </menu> <menu name='View' action = 'View'> <menu name='ZoomFocus' action='ZoomFocus'> diff --git a/gtk2_ardour/ardour.menus b/gtk2_ardour/ardour.menus index 589619dcf5..9c15a092c0 100644 --- a/gtk2_ardour/ardour.menus +++ b/gtk2_ardour/ardour.menus @@ -119,6 +119,13 @@ <menuitem action="nudge-next-forward"/> <menuitem action="nudge-backward"/> <menuitem action="nudge-next-backward"/> + <separator/> + <menuitem action='align-regions-start'/> + <menuitem action='align-regions-start-relative'/> + <menuitem action='align-regions-end'/> + <menuitem action='align-regions-end-relative'/> + <menuitem action='align-regions-sync'/> + <menuitem action='align-regions-sync-relative'/> </menu> <menu name='KeyMouse Actions' action='KeyMouse Actions'> <menuitem action='audition-at-mouse'/> diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 335e7e2f05..27720b5411 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -239,7 +239,7 @@ Editor::Editor () drag_info.item = 0; current_mixer_strip = 0; current_bbt_points = 0; - + snap_type_strings = I18N (_snap_type_strings); snap_mode_strings = I18N (_snap_mode_strings); zoom_focus_strings = I18N (_zoom_focus_strings); @@ -306,6 +306,7 @@ Editor::Editor () current_stepping_trackview = 0; entered_track = 0; entered_regionview = 0; + entered_marker = 0; clear_entered_track = false; _new_regionviews_show_envelope = false; current_timestretch = 0; @@ -4067,3 +4068,43 @@ Editor::set_punch_range (nframes_t start, nframes_t end, string cmd) commit_reversible_command (); } +RegionSelection +Editor::get_regions_at (nframes64_t where, const TrackSelection& ts) const +{ + RegionSelection rs; + const TrackSelection* tracks; + + if (ts.empty()) { + tracks = &track_views; + } else { + tracks = &ts; + } + + for (TrackSelection::const_iterator t = tracks->begin(); t != tracks->end(); ++t) { + + AudioTimeAxisView* atv = dynamic_cast<AudioTimeAxisView*>(*t); + + if (atv) { + boost::shared_ptr<Diskstream> ds; + boost::shared_ptr<Playlist> pl; + + if ((ds = atv->get_diskstream()) && ((pl = ds->playlist()))) { + + Playlist::RegionList* regions = pl->regions_at ((nframes_t) floor ( (double)where * ds->speed())); + + for (Playlist::RegionList::iterator i = regions->begin(); i != regions->end(); ++i) { + + RegionView* rv = atv->audio_view()->find_view (*i); + + if (rv) { + rs.push_back (rv); + } + } + + delete regions; + } + } + } + + return rs; +} diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index e68d425397..43f3f19ebf 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -416,6 +416,7 @@ class Editor : public PublicEditor LocationMarkers *find_location_markers (ARDOUR::Location *) const; ARDOUR::Location* find_location_from_marker (Marker *, bool& is_start) const; + Marker* entered_marker; typedef std::map<ARDOUR::Location*,LocationMarkers *> LocationMarkerMap; LocationMarkerMap location_markers; @@ -901,8 +902,8 @@ class Editor : public PublicEditor void set_a_regions_sync_position (boost::shared_ptr<ARDOUR::Region>, nframes_t); void set_region_sync_from_edit_cursor (); void remove_region_sync(); - void align_selection (ARDOUR::RegionPoint, nframes_t position); - void align_selection_relative (ARDOUR::RegionPoint point, nframes_t position); + void align_selection (ARDOUR::RegionPoint, nframes_t position, const RegionSelection&); + void align_selection_relative (ARDOUR::RegionPoint point, nframes_t position, const RegionSelection&); void align_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position); void align_region_internal (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position); void remove_clicked_region (); @@ -1913,6 +1914,9 @@ class Editor : public PublicEditor void edit_point_chosen (Editing::EditPoint); Glib::RefPtr<Gtk::RadioAction> edit_point_action (Editing::EditPoint); std::vector<std::string> edit_point_strings; + + RegionSelection get_regions_at (nframes64_t where, const TrackSelection& ts) const; + }; #endif /* __ardour_editor_h__ */ diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index a69257ec25..0187959c24 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -550,6 +550,8 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, return canvas_region_view_event (event, rv->get_canvas_group(), rv); } + + delete rl; } } } diff --git a/gtk2_ardour/editor_keyboard.cc b/gtk2_ardour/editor_keyboard.cc index a8a4694b90..18897259d8 100644 --- a/gtk2_ardour/editor_keyboard.cc +++ b/gtk2_ardour/editor_keyboard.cc @@ -24,6 +24,7 @@ #include "editor.h" #include "region_view.h" #include "selection.h" +#include "keyboard.h" #include "i18n.h" @@ -71,6 +72,24 @@ Editor::kbd_driver (sigc::slot<void,GdkEvent*> theslot, bool use_track_canvas, b } void +Editor::set_playhead_cursor (GdkEvent* event) +{ + if (entered_marker) { + session->request_locate (entered_marker->position(), session->transport_rolling()); + } else { + nframes_t pointer_frame = event_frame (event); + + if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) { + snap_to (pointer_frame); + } + + if (session) { + session->request_locate (pointer_frame, session->transport_rolling()); + } + } +} + +void Editor::kbd_set_playhead_cursor () { kbd_driver (mem_fun(*this, &Editor::set_playhead_cursor), true, true, false); @@ -82,13 +101,14 @@ Editor::kbd_set_edit_cursor () kbd_driver (mem_fun(*this, &Editor::set_edit_cursor), true, true, false); } - void Editor::kbd_do_split (GdkEvent* ev) { - nframes_t where = event_frame (ev); - if (entered_regionview) { + + nframes_t where = event_frame (ev); + snap_to (where); + if (selection->regions.contains (entered_regionview)) { split_regions_at (where, selection->regions); } else { @@ -96,6 +116,16 @@ Editor::kbd_do_split (GdkEvent* ev) s.add (entered_regionview); split_regions_at (where, s); } + + } else if (entered_marker) { + + if (!selection->regions.empty()) { + split_regions_at (entered_marker->position(), selection->regions); + } else { + RegionSelection rs; + rs = get_regions_at (entered_marker->position(), selection->tracks); + split_regions_at (entered_marker->position(), rs); + } } } @@ -129,30 +159,80 @@ Editor::kbd_set_sync_position () void Editor::kbd_do_set_sync_position (GdkEvent* ev) { - nframes_t where = event_frame (ev); - snap_to (where); - if (entered_regionview) { - set_a_regions_sync_position (entered_regionview->region(), where); + nframes64_t where = event_frame (ev); + snap_to (where); + + set_a_regions_sync_position (entered_regionview->region(), where); + + } else if (entered_marker) { + + if (!selection->regions.empty()) { + set_a_regions_sync_position (selection->regions.front()->region(), entered_marker->position()); + } } } void Editor::kbd_do_align (GdkEvent* ev, ARDOUR::RegionPoint what) { - align (what); + if (entered_regionview) { + + nframes_t where = event_frame (ev); + snap_to (where); + + if (selection->regions.contains (entered_regionview)) { + align_selection (what, where, selection->regions); + } else { + RegionSelection s; + s.add (entered_regionview); + align_selection (what, where, s); + } + + } else if (entered_marker) { + + if (!selection->regions.empty()) { + align_selection (what, entered_marker->position(), selection->regions); + } else { + RegionSelection rs; + rs = get_regions_at (entered_marker->position(), selection->tracks); + align_selection (what, entered_marker->position(), rs); + } + } } void -Editor::kbd_align (ARDOUR::RegionPoint what) +Editor::kbd_do_align_relative (GdkEvent* ev, ARDOUR::RegionPoint what) { - kbd_driver (bind (mem_fun(*this, &Editor::kbd_do_align), what)); + if (entered_regionview) { + + nframes_t where = event_frame (ev); + snap_to (where); + + if (selection->regions.contains (entered_regionview)) { + align_selection_relative (what, where, selection->regions); + } else { + RegionSelection s; + s.add (entered_regionview); + align_selection_relative (what, where, s); + } + + } else if (entered_marker) { + + if (!selection->regions.empty()) { + align_selection_relative (what, entered_marker->position(), selection->regions); + } else { + RegionSelection rs; + rs = get_regions_at (entered_marker->position(), selection->tracks); + align_selection_relative (what, entered_marker->position(), rs); + } + } } void -Editor::kbd_do_align_relative (GdkEvent* ev, ARDOUR::RegionPoint what) +Editor::kbd_align (ARDOUR::RegionPoint what) { - align (what); + kbd_driver (bind (mem_fun(*this, &Editor::kbd_do_align), what)); } void diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc index c7da177efd..6d09dc6135 100644 --- a/gtk2_ardour/editor_markers.cc +++ b/gtk2_ardour/editor_markers.cc @@ -1011,7 +1011,7 @@ Editor::marker_selection_changed () } for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) { - (*x)->add_line (track_canvas.root(), canvas_height); + (*x)->add_line (cursor_group, canvas_height); (*x)->show_line (); } } diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 6436b19684..67c0a8e50d 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1280,6 +1280,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ if ((marker = static_cast<Marker *> (item->get_data ("marker"))) == 0) { break; } + entered_marker = marker; marker->set_color_rgba (ARDOUR_UI::config()->canvasvar_EnteredMarker.get()); // fall through case MeterMarkerItem: @@ -1414,8 +1415,10 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ if ((marker = static_cast<Marker *> (item->get_data ("marker"))) == 0) { break; } - loc = find_location_from_marker (marker, is_start); - if (loc) location_flags_changed (loc, this); + entered_marker = 0; + if ((loc = find_location_from_marker (marker, is_start)) != 0) { + location_flags_changed (loc, this); + } // fall through case MeterMarkerItem: case TempoMarkerItem: @@ -1780,20 +1783,6 @@ Editor::set_edit_cursor (GdkEvent* event) } void -Editor::set_playhead_cursor (GdkEvent* event) -{ - nframes_t pointer_frame = event_frame (event); - - if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) { - snap_to (pointer_frame); - } - - if (session) { - session->request_locate (pointer_frame, session->transport_rolling()); - } -} - -void Editor::start_fade_in_grab (ArdourCanvas::Item* item, GdkEvent* event) { drag_info.item = item; diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 1584388508..1e9b198f92 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -144,8 +144,10 @@ Editor::split_regions_at (nframes_t where, RegionSelection& regions) boost::shared_ptr<Playlist> pl = (*a)->region()->playlist(); AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*a); - if (arv) + + if (arv) { _new_regionviews_show_envelope = arv->envelope_visible(); + } if (pl) { XMLNode &before = pl->get_state(); @@ -890,7 +892,23 @@ Editor::cursor_align (bool playhead_to_edit) session->request_locate (get_preferred_edit_position()); } } else { - edit_cursor->set_position (playhead_cursor->current_frame); + if (_edit_point == EditAtSelectedMarker) { + + /* move selected markers to playhead */ + + for (MarkerSelection::iterator i = selection->markers.begin(); i != selection->markers.end(); ++i) { + bool ignored; + + Location* loc = find_location_from_marker (*i, ignored); + + if (loc->is_mark()) { + loc->set_start (playhead_cursor->current_frame); + } else { + loc->set (playhead_cursor->current_frame, + playhead_cursor->current_frame + loc->length()); + } + } + } } } @@ -2384,13 +2402,13 @@ Editor::naturalize () void Editor::align (RegionPoint what) { - align_selection (what, get_preferred_edit_position()); + align_selection (what, get_preferred_edit_position(), selection->regions); } void Editor::align_relative (RegionPoint what) { - align_selection_relative (what, get_preferred_edit_position()); + align_selection_relative (what, get_preferred_edit_position(), selection->regions); } struct RegionSortByTime { @@ -2400,9 +2418,9 @@ struct RegionSortByTime { }; void -Editor::align_selection_relative (RegionPoint point, nframes_t position) +Editor::align_selection_relative (RegionPoint point, nframes_t position, const RegionSelection& rs) { - if (selection->regions.empty()) { + if (rs.empty()) { return; } @@ -2411,7 +2429,7 @@ Editor::align_selection_relative (RegionPoint point, nframes_t position) int dir; list<RegionView*> sorted; - selection->regions.by_position (sorted); + rs.by_position (sorted); boost::shared_ptr<Region> r ((*sorted.begin())->region()); switch (point) { @@ -2438,7 +2456,7 @@ Editor::align_selection_relative (RegionPoint point, nframes_t position) begin_reversible_command (_("align selection (relative)")); - for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + for (RegionSelection::const_iterator i = rs.begin(); i != rs.end(); ++i) { boost::shared_ptr<Region> region ((*i)->region()); @@ -2459,15 +2477,15 @@ Editor::align_selection_relative (RegionPoint point, nframes_t position) } void -Editor::align_selection (RegionPoint point, nframes_t position) +Editor::align_selection (RegionPoint point, nframes_t position, const RegionSelection& rs) { - if (selection->regions.empty()) { + if (rs.empty()) { return; } begin_reversible_command (_("align selection")); - for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + for (RegionSelection::const_iterator i = rs.begin(); i != rs.end(); ++i) { align_region_internal ((*i)->region(), point, position); } diff --git a/gtk2_ardour/marker.cc b/gtk2_ardour/marker.cc index 880e02b5e9..a61f4ef0c3 100644 --- a/gtk2_ardour/marker.cc +++ b/gtk2_ardour/marker.cc @@ -290,8 +290,8 @@ Marker::add_line (ArdourCanvas::Group* group, double initial_height) if (!line) { line_points = new ArdourCanvas::Points (); - line_points->push_back (Gnome::Art::Point (unit_position, 0.0)); - line_points->push_back (Gnome::Art::Point (unit_position, initial_height)); + line_points->push_back (Gnome::Art::Point (unit_position + shift, 0.0)); + line_points->push_back (Gnome::Art::Point (unit_position + shift, initial_height)); line = new ArdourCanvas::Line (*group); line->property_width_pixels() = 1; @@ -344,8 +344,8 @@ Marker::set_position (nframes_t frame) unit_position = new_unit_position; if (line) { - (*line_points)[0].set_x (unit_position); - (*line_points)[1].set_x (unit_position); + (*line_points)[0].set_x (unit_position + shift); + (*line_points)[1].set_x (unit_position + shift); line->property_points() = *line_points; } } diff --git a/gtk2_ardour/marker.h b/gtk2_ardour/marker.h index 5090990c3c..fd29f5411f 100644 --- a/gtk2_ardour/marker.h +++ b/gtk2_ardour/marker.h @@ -64,6 +64,8 @@ class Marker : public sigc::trackable void set_position (nframes_t); void set_name (const string&); void set_color_rgba (uint32_t rgba); + + nframes64_t position() const { return frame_position; } void hide (); void show (); @@ -80,10 +82,10 @@ class Marker : public sigc::trackable ArdourCanvas::Line *line; ArdourCanvas::Points *line_points; - double unit_position; - nframes_t frame_position; - unsigned char shift; /* should be double, but its always small and integral */ - Type _type; + double unit_position; + nframes64_t frame_position; + unsigned char shift; /* should be double, but its always small and integral */ + Type _type; void reposition (); }; diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 290b2824ec..b1aa7b8032 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -78,7 +78,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway PublicEditor(); virtual ~PublicEditor(); - typedef list<TimeAxisView *> TrackViewList; + typedef TrackSelection TrackViewList; static PublicEditor& instance() { return *_instance; } diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index 72d6ebe1ca..4f207172ca 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -179,12 +179,16 @@ IO::~IO () Glib::Mutex::Lock lm (io_lock); vector<Port *>::iterator i; - for (i = _inputs.begin(); i != _inputs.end(); ++i) { - _session.engine().unregister_port (*i); - } - - for (i = _outputs.begin(); i != _outputs.end(); ++i) { - _session.engine().unregister_port (*i); + { + BLOCK_PROCESS_CALLBACK (); + + for (i = _inputs.begin(); i != _inputs.end(); ++i) { + _session.engine().unregister_port (*i); + } + + for (i = _outputs.begin(); i != _outputs.end(); ++i) { + _session.engine().unregister_port (*i); + } } m_meter_connection.disconnect(); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 1dc682d4e9..d867041f90 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -2113,13 +2113,8 @@ Session::remove_route (shared_ptr<Route> route) /* try to cause everyone to drop their references */ - cerr << "pre drop, Route now has " << route.use_count() << " refs\n"; - cerr << "sig has " << route->GoingAway.size() << endl; - route->drop_references (); - cerr << "route dangling refs = " << route.use_count() << endl; - /* save the new state of the world */ if (save_state (_current_snapshot_name)) { |