diff --git a/SConstruct b/SConstruct index 079d668d53..46cbfc7485 100644 --- a/SConstruct +++ b/SConstruct @@ -399,8 +399,8 @@ deps = \ 'gthread-2.0' : '2.10.1', 'gtk+-2.0' : '2.8.1', 'libxml-2.0' : '2.6.0', - 'samplerate' : '0.1.2', - 'raptor' : '1.4.8', + 'samplerate' : '0.1.0', + 'raptor' : '1.4.2', 'lrdf' : '0.4.0', 'jack' : '0.101.1', 'libgnomecanvas-2.0' : '2.0' diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index ed059efbb7..96a83bfdeb 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -597,7 +597,7 @@ Editor::Editor (AudioEngine& eng) named_selection_display.get_selection()->set_mode (SELECTION_SINGLE); named_selection_display.set_size_request (100, -1); - named_selection_display.signal_button_press_event().connect (mem_fun(*this, &Editor::named_selection_display_button_press), false); + named_selection_display.signal_button_release_event().connect (mem_fun(*this, &Editor::named_selection_display_button_press), false); named_selection_display.get_selection()->signal_changed().connect (mem_fun (*this, &Editor::named_selection_display_selection_changed)); /* SNAPSHOTS */ @@ -1537,7 +1537,7 @@ Editor::build_track_region_context_menu (nframes_t frame) if (atv) { boost::shared_ptr ds; - Playlist* pl; + Playlist* pl = 0; if ((ds = atv->get_diskstream()) && ((pl = ds->playlist()))) { Playlist::RegionList* regions = pl->regions_at ((nframes_t) floor ( (double)frame * ds->speed())); @@ -1564,8 +1564,8 @@ Editor::build_track_crossfade_context_menu (nframes_t frame) if (atv) { boost::shared_ptr ds; - Playlist* pl; - AudioPlaylist* apl; + Playlist* pl = 0; + AudioPlaylist* apl = 0; if ((ds = atv->get_diskstream()) && ((pl = ds->playlist()) != 0) && ((apl = dynamic_cast (pl)) != 0)) { diff --git a/gtk2_ardour/editor_region_list.cc b/gtk2_ardour/editor_region_list.cc index 1ebf59fecd..fdb8ca9dd3 100644 --- a/gtk2_ardour/editor_region_list.cc +++ b/gtk2_ardour/editor_region_list.cc @@ -342,20 +342,15 @@ Editor::region_list_display_button_press (GdkEventButton *ev) } } - if (region == 0) { - return false; - } - - if (Keyboard::is_delete_event (ev)) { - session->remove_region_from_region_list (region); - return true; - } - if (Keyboard::is_context_menu_event (ev)) { show_region_list_display_context_menu (ev->button, ev->time); return true; } + if (region == 0) { + return false; + } + switch (ev->button) { case 1: /* audition on double click */ diff --git a/gtk2_ardour/editor_selection_list.cc b/gtk2_ardour/editor_selection_list.cc index 959da1ad2d..469e7a472e 100644 --- a/gtk2_ardour/editor_selection_list.cc +++ b/gtk2_ardour/editor_selection_list.cc @@ -79,7 +79,7 @@ Editor::named_selection_display_button_press (GdkEventButton *ev) case 1: if (Keyboard::is_delete_event (ev)) { session->remove_named_selection ((*i)[named_selection_columns.selection]); - return stop_signal (named_selection_display, "button_press_event"); + return true; } break; case 2: diff --git a/gtk2_ardour/redirect_box.cc b/gtk2_ardour/redirect_box.cc index 12be8a9d80..222d1b63cf 100644 --- a/gtk2_ardour/redirect_box.cc +++ b/gtk2_ardour/redirect_box.cc @@ -137,11 +137,12 @@ RedirectBox::RedirectBox (Placement pcmnt, Session& sess, boost::shared_ptrredirects_changed.connect (mem_fun(*this, &RedirectBox::redisplay_redirects)); + _route->GoingAway.connect (mem_fun (*this, &RedirectBox::route_going_away)); redirect_eventbox.signal_enter_notify_event().connect (bind (sigc::ptr_fun (RedirectBox::enter_box), this)); redirect_display.signal_button_press_event().connect (mem_fun(*this, &RedirectBox::redirect_button_press_event), false); - redirect_display.signal_button_release_event().connect (mem_fun(*this, &RedirectBox::redirect_button_press_event)); + redirect_display.signal_button_release_event().connect (mem_fun(*this, &RedirectBox::redirect_button_release_event)); /* start off as a passthru strip. we'll correct this, if necessary, in update_diskstream_display(). @@ -156,6 +157,13 @@ RedirectBox::~RedirectBox () { } +void +RedirectBox::route_going_away () +{ + /* don't keep updating display as redirects are deleted */ + no_redirect_redisplay = true; +} + void RedirectBox::object_drop (string type, uint32_t cnt, const boost::shared_ptr* ptr) { @@ -283,13 +291,8 @@ RedirectBox::redirect_button_press_event (GdkEventButton *ev) } } - - if (redirect && Keyboard::is_delete_event (ev)) { - - Glib::signal_idle().connect (bind (mem_fun(*this, &RedirectBox::idle_delete_redirect), boost::weak_ptr(redirect))); - ret = true; - - } else if (redirect && (Keyboard::is_edit_event (ev) || (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS && ev->state == 0))) { + + if (redirect && (Keyboard::is_edit_event (ev) || (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS && ev->state == 0))) { if (_session.engine().connected()) { /* XXX giving an error message here is hard, because we may be in the midst of a button press */ @@ -297,6 +300,42 @@ RedirectBox::redirect_button_press_event (GdkEventButton *ev) } ret = true; + } else if (redirect && ev->button == 1 && selected) { + + // this is purely informational but necessary + RedirectSelected (redirect); // emit + } + + return ret; +} + +bool +RedirectBox::redirect_button_release_event (GdkEventButton *ev) +{ + TreeIter iter; + TreeModel::Path path; + TreeViewColumn* column; + int cellx; + int celly; + boost::shared_ptr redirect; + int ret = false; + bool selected = false; + + if (redirect_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) { + if ((iter = model->get_iter (path))) { + redirect = (*iter)[columns.redirect]; + selected = redirect_display.get_selection()->is_selected (iter); + } + + } + + if (redirect && Keyboard::is_delete_event (ev)) { + + cerr << " redirect clicked was " << redirect->name() << endl; + + Glib::signal_idle().connect (bind (mem_fun(*this, &RedirectBox::idle_delete_redirect), boost::weak_ptr(redirect))); + ret = true; + } else if (Keyboard::is_context_menu_event (ev)) { show_redirect_menu(ev->time); @@ -308,12 +347,7 @@ RedirectBox::redirect_button_press_event (GdkEventButton *ev) ret = true; } - else if (redirect && ev->button == 1 && selected) { - // this is purely informational but necessary - RedirectSelected (redirect); // emit - } - return ret; } @@ -363,7 +397,7 @@ RedirectBox::insert_plugin_chosen (boost::shared_ptr plugin) boost::shared_ptr redirect (new PluginInsert (_session, plugin, _placement)); - redirect->active_changed.connect (bind (mem_fun (*this, &RedirectBox::show_redirect_active), boost::weak_ptr(redirect), (void*) 0)); + redirect->active_changed.connect (bind (mem_fun (*this, &RedirectBox::show_redirect_active_r), boost::weak_ptr(redirect))); uint32_t err_streams; @@ -441,7 +475,7 @@ void RedirectBox::choose_insert () { boost::shared_ptr redirect (new PortInsert (_session, _placement)); - redirect->active_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_active), boost::weak_ptr(redirect))); + redirect->active_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_active_r), boost::weak_ptr(redirect))); _route->add_redirect (redirect, this); } @@ -491,7 +525,6 @@ RedirectBox::redisplay_redirects (void *src) ENSURE_GUI_THREAD(bind (mem_fun(*this, &RedirectBox::redisplay_redirects), src)); if (no_redirect_redisplay) { - cerr << "redisplay redirects skipped, no redisplay set\n"; return; } @@ -526,9 +559,9 @@ RedirectBox::add_redirect_to_display (boost::shared_ptr redirect) row[columns.text] = redirect_name (redirect); row[columns.redirect] = redirect; - show_redirect_active (redirect, this); + show_redirect_active (redirect); - redirect_active_connections.push_back (redirect->active_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_active), boost::weak_ptr(redirect)))); + redirect_active_connections.push_back (redirect->active_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_active_r), boost::weak_ptr(redirect)))); redirect_name_connections.push_back (redirect->name_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_name), boost::weak_ptr(redirect)))); } @@ -605,13 +638,19 @@ void RedirectBox::show_redirect_name (void* src, boost::weak_ptr redirect) { ENSURE_GUI_THREAD(bind (mem_fun(*this, &RedirectBox::show_redirect_name), src, redirect)); - show_redirect_active (redirect, src); + show_redirect_active (redirect); } void -RedirectBox::show_redirect_active (void *src, boost::weak_ptr weak_redirect) +RedirectBox::show_redirect_active_r (Redirect* r, void *src, boost::weak_ptr weak_redirect) { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &RedirectBox::show_redirect_active), weak_redirect, src)); + show_redirect_active (weak_redirect); +} + +void +RedirectBox::show_redirect_active (boost::weak_ptr weak_redirect) +{ + ENSURE_GUI_THREAD(bind (mem_fun(*this, &RedirectBox::show_redirect_active), weak_redirect)); boost::shared_ptr redirect (weak_redirect.lock()); diff --git a/gtk2_ardour/redirect_box.h b/gtk2_ardour/redirect_box.h index 4b872ed0bf..7ab7d03cac 100644 --- a/gtk2_ardour/redirect_box.h +++ b/gtk2_ardour/redirect_box.h @@ -151,17 +151,13 @@ class RedirectBox : public Gtk::HBox bool ignore_delete; bool redirect_button_press_event (GdkEventButton *); + bool redirect_button_release_event (GdkEventButton *); void redisplay_redirects (void* src); void add_redirect_to_display (boost::shared_ptr); void row_deleted (const Gtk::TreeModel::Path& path); - void show_redirect_name (void*, boost::weak_ptr); - - /* these are handlers for Redirect signals, so they take Redirect* - directly, rather than shared_ptr - */ - - void show_redirect_active (boost::weak_ptr, void *); - + void show_redirect_active_r (ARDOUR::Redirect*, void *, boost::weak_ptr); + void show_redirect_active (boost::weak_ptr); + void show_redirect_name (void* src, boost::weak_ptr); string redirect_name (boost::weak_ptr); void remove_redirect_gui (boost::shared_ptr); diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 371f055c46..92af31b19a 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -1146,7 +1146,7 @@ boost::shared_ptr RouteTimeAxisView::find_next_region (nframes_t pos, RegionPoint point, int32_t dir) { boost::shared_ptr stream; - Playlist *playlist; + Playlist *playlist = 0; if ((stream = get_diskstream()) != 0 && (playlist = stream->playlist()) != 0) { return playlist->find_next_region (pos, point, dir); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 4169361c14..14c5bde996 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -3313,21 +3314,19 @@ Session::remove_redirect (Redirect* redirect) PortInsert* port_insert; PluginInsert* plugin_insert; - cerr << "Removing a redirect!\n"; - if ((insert = dynamic_cast (redirect)) != 0) { if ((port_insert = dynamic_cast (insert)) != 0) { _port_inserts.remove (port_insert); } else if ((plugin_insert = dynamic_cast (insert)) != 0) { _plugin_inserts.remove (plugin_insert); } else { - fatal << _("programming error: unknown type of Insert deleted!") << endmsg; + fatal << string_compose (_("programming error: %1"), + X_("unknown type of Insert deleted!")) + << endmsg; /*NOTREACHED*/ } } else if ((send = dynamic_cast (redirect)) != 0) { - cerr << "Remove send, used to have " << _sends.size() << endl; _sends.remove (send); - cerr << "post removal, have " << _sends.size() << endl; } else { fatal << _("programming error: unknown type of Redirect deleted!") << endmsg; /*NOTREACHED*/ @@ -3349,6 +3348,13 @@ Session::available_capture_duration () case FormatInt24: sample_bytes_on_disk = 3; break; + + default: + /* impossible, but keep some gcc versions happy */ + fatal << string_compose (_("programming error: %1"), + X_("illegal native file data format")) + << endmsg; + /*NOTREACHED*/ } double scale = 4096.0 / sample_bytes_on_disk;