summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-11-08 20:55:43 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-11-08 20:55:43 +0000
commita8d2605f9a6f48f3afb09c212de9486c75856287 (patch)
tree29d014f11717fe70b0a69ec750d1ae7b827e84f5
parent62941af2cf8da4c5424afb9173fdb310c2c23eef (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.menus7
-rw-r--r--gtk2_ardour/ardour.menus7
-rw-r--r--gtk2_ardour/editor.cc43
-rw-r--r--gtk2_ardour/editor.h8
-rw-r--r--gtk2_ardour/editor_canvas_events.cc2
-rw-r--r--gtk2_ardour/editor_keyboard.cc104
-rw-r--r--gtk2_ardour/editor_markers.cc2
-rw-r--r--gtk2_ardour/editor_mouse.cc21
-rw-r--r--gtk2_ardour/editor_ops.cc40
-rw-r--r--gtk2_ardour/marker.cc8
-rw-r--r--gtk2_ardour/marker.h10
-rw-r--r--gtk2_ardour/public_editor.h2
-rw-r--r--libs/ardour/io.cc16
-rw-r--r--libs/ardour/session.cc5
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)) {