diff options
author | Jeremy Carter <Jeremy@JeremyCarter.ca> | 2014-11-14 13:34:15 -0500 |
---|---|---|
committer | Jeremy Carter <Jeremy@JeremyCarter.ca> | 2014-11-14 13:34:15 -0500 |
commit | 592bfdd3f4af9463e2e6a691d7240839ba50d61d (patch) | |
tree | 0c0e17acda42cf26c35b15cff67c1e0cb961e139 | |
parent | 32b86104aa7f814ab5930c206ffa18971313c79d (diff) | |
parent | 6b3a8915f3c50f7220121fcb9202ec20144389c4 (diff) |
Merge remote-tracking branch 'upstream/master'
82 files changed, 415 insertions, 227 deletions
diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc index 94e4369aae..57fd46be73 100644 --- a/gtk2_ardour/add_route_dialog.cc +++ b/gtk2_ardour/add_route_dialog.cc @@ -346,7 +346,7 @@ AddRouteDialog::mode () } else { fatal << string_compose (X_("programming error: unknown track mode in add route dialog combo = %1"), str) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } /* keep gcc happy */ return ARDOUR::Normal; diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 2e9d8b3247..03ca13745f 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -88,6 +88,9 @@ #ifdef WINDOWS_VST_SUPPORT #include <fst.h> #endif +#ifdef AUDIOUNIT_SUPPORT +#include "ardour/audio_unit.h" +#endif #include "timecode/time.h" @@ -483,6 +486,14 @@ ARDOUR_UI::post_engine () { /* Things to be done once (and once ONLY) after we have a backend running in the AudioEngine */ +#ifdef AUDIOUNIT_SUPPORT + std::string au_msg; + if (AUPluginInfo::au_get_crashlog(au_msg)) { + popup_error(_("Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. Please see the log window for further details.")); + error << _("Audio Unit Plugin Scan Failed:") << endmsg; + info << au_msg << endmsg; + } +#endif ARDOUR::init_post_engine (); diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index 68757c256b..df1820eeeb 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -113,7 +113,7 @@ AudioStreamView::create_region_view (boost::shared_ptr<Region> r, bool wait_for_ break; default: fatal << string_compose (_("programming error: %1"), "illegal track mode in ::create_region_view()") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } diff --git a/gtk2_ardour/automation_region_view.cc b/gtk2_ardour/automation_region_view.cc index 2da15c17c5..e088f7c59f 100644 --- a/gtk2_ardour/automation_region_view.cc +++ b/gtk2_ardour/automation_region_view.cc @@ -60,6 +60,7 @@ AutomationRegionView::AutomationRegionView (ArdourCanvas::Container* AutomationRegionView::~AutomationRegionView () { + RegionViewGoingAway (this); /* EMIT_SIGNAL */ } void diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index ba4eb09cd1..d5c9aa6fea 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -2631,7 +2631,7 @@ Editor::timecode_snap_to_internal (framepos_t& start, int32_t direction, bool /* break; default: fatal << "Editor::smpte_snap_to_internal() called with non-timecode snap type!" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } } diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index d16105987a..e8125ef593 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -1081,7 +1081,7 @@ Editor::snap_type_action (SnapType type) break; default: fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible snap-to type", (int) type) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } act = ActionManager::get_action (X_("Snap"), action); @@ -1477,7 +1477,7 @@ Editor::snap_mode_action (SnapMode mode) break; default: fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible snap mode type", (int) mode) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } act = ActionManager::get_action (X_("Editor"), action); @@ -1541,7 +1541,7 @@ Editor::edit_point_action (EditPoint ep) break; default: fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible edit point type", (int) ep) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } act = ActionManager::get_action (X_("Editor"), action); @@ -1599,7 +1599,7 @@ Editor::zoom_focus_action (ZoomFocus focus) break; default: fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible focus type", (int) focus) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } act = ActionManager::get_action (X_("Zoom"), action); diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index e5ac8c6c72..af1d41f91f 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -314,14 +314,14 @@ Editor::do_import (vector<string> paths, ImportDisposition disposition, ImportMo continue; case 0: fatal << "Updating existing sources should be disabled!" << endmsg; - /* NOTREACHED*/ + abort(); /* NOTREACHED*/ break; case 1: replace = false; break; default: fatal << "Illegal return " << check << " from check_whether_and_how_to_import()!" << endmsg; - /* NOTREACHED*/ + abort(); /* NOTREACHED*/ } /* have to reset this for every file we handle */ diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 7eeeba2ed0..482ada3cbc 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -1348,7 +1348,7 @@ Editor::choose_canvas_cursor_on_entry (GdkEventCrossing* /*event*/, ItemType typ } if (cursor) { - set_canvas_cursor (cursor, false); + set_canvas_cursor (cursor, true); } } diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index aa37467f2c..0aaec8d24d 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -1967,7 +1967,10 @@ NoteResizeDrag::start_grab (GdkEvent* event, Gdk::Cursor* /*ignored*/) MidiRegionSelection::iterator next; next = r; ++next; - (*r)->begin_resizing (at_front); + MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r); + if (mrv) { + mrv->begin_resizing (at_front); + } r = next; } } @@ -1979,7 +1982,10 @@ NoteResizeDrag::motion (GdkEvent* /*event*/, bool /*first_move*/) for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) { NoteBase* nb = reinterpret_cast<NoteBase*> (_item->get_data ("notebase")); assert (nb); - (*r)->update_resizing (nb, at_front, _drags->current_pointer_x() - grab_x(), relative); + MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r); + if (mrv) { + mrv->update_resizing (nb, at_front, _drags->current_pointer_x() - grab_x(), relative); + } } } @@ -1990,7 +1996,10 @@ NoteResizeDrag::finished (GdkEvent*, bool /*movement_occurred*/) for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) { NoteBase* nb = reinterpret_cast<NoteBase*> (_item->get_data ("notebase")); assert (nb); - (*r)->commit_resizing (nb, at_front, _drags->current_pointer_x() - grab_x(), relative); + MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r); + if (mrv) { + mrv->commit_resizing (nb, at_front, _drags->current_pointer_x() - grab_x(), relative); + } } } @@ -1999,7 +2008,10 @@ NoteResizeDrag::aborted (bool) { MidiRegionSelection& ms (_editor->get_selection().midi_regions); for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) { - (*r)->abort_resizing (); + MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r); + if (mrv) { + mrv->abort_resizing (); + } } } @@ -5268,12 +5280,10 @@ void NoteCreateDrag::motion (GdkEvent* event, bool) { _note[1] = max ((framepos_t)0, adjusted_current_frame (event) - _region_view->region()->position ()); - double const x = _editor->sample_to_pixel (_note[1]); - if (_note[1] > _note[0]) { - _drag_rect->set_x1 (x); - } else { - _drag_rect->set_x0 (x); - } + double const x0 = _editor->sample_to_pixel (_note[0]); + double const x1 = _editor->sample_to_pixel (_note[1]); + _drag_rect->set_x0 (std::min(x0, x1)); + _drag_rect->set_x1 (std::max(x0, x1)); } void diff --git a/gtk2_ardour/editor_export_audio.cc b/gtk2_ardour/editor_export_audio.cc index e40030d671..f92cf07150 100644 --- a/gtk2_ardour/editor_export_audio.cc +++ b/gtk2_ardour/editor_export_audio.cc @@ -90,7 +90,7 @@ Editor::export_range () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc index 0900c7fc18..6d07ecc357 100644 --- a/gtk2_ardour/editor_markers.cc +++ b/gtk2_ardour/editor_markers.cc @@ -704,7 +704,7 @@ Editor::remove_marker (ArdourCanvas::Item& item, GdkEvent*) if ((marker = static_cast<Marker*> (item.get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if (entered_marker == marker) { @@ -791,7 +791,7 @@ Editor::marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item) Marker * marker; if ((marker = reinterpret_cast<Marker *> (item->get_data("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } bool is_start; @@ -976,7 +976,7 @@ Editor::marker_menu_hide () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; @@ -994,7 +994,7 @@ Editor::marker_menu_select_using_range () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; @@ -1012,7 +1012,7 @@ Editor::marker_menu_select_all_selectables_using_range () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; @@ -1031,7 +1031,7 @@ Editor::marker_menu_separate_regions_using_location () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; @@ -1050,7 +1050,7 @@ Editor::marker_menu_play_from () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; @@ -1080,7 +1080,7 @@ Editor::marker_menu_set_playhead () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; @@ -1111,7 +1111,7 @@ Editor::marker_menu_range_to_next () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; @@ -1141,7 +1141,7 @@ Editor::marker_menu_set_from_playhead () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; @@ -1169,7 +1169,7 @@ Editor::marker_menu_set_from_selection (bool /*force_regions*/) if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; @@ -1200,7 +1200,7 @@ Editor::marker_menu_play_range () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; @@ -1225,7 +1225,7 @@ Editor::marker_menu_loop_range () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* l; @@ -1276,7 +1276,7 @@ Editor::dynamic_cast_marker_object (void* p, MeterMarker** m, TempoMarker** t) c Marker* marker = reinterpret_cast<Marker*> (p); if (!marker) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } *m = dynamic_cast<MeterMarker*> (marker); @@ -1320,7 +1320,7 @@ Editor::toggle_marker_menu_lock () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* loc; @@ -1346,7 +1346,7 @@ Editor::marker_menu_rename () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } @@ -1540,7 +1540,7 @@ Editor::toggle_marker_menu_glue () if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* loc; diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index c4e19b15a8..3ad9f0a54c 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1332,12 +1332,12 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) { fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if ((tempo_marker = dynamic_cast<TempoMarker*> (marker)) == 0) { fatal << _("programming error: marker for tempo is not a tempo marker!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } edit_tempo_marker (*tempo_marker); @@ -1350,12 +1350,12 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) { fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if ((meter_marker = dynamic_cast<MeterMarker*> (marker)) == 0) { fatal << _("programming error: marker for meter is not a meter marker!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } edit_meter_marker (*meter_marker); break; @@ -1813,6 +1813,8 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type) bool is_start; bool ret = true; + reset_canvas_cursor (); + switch (item_type) { case ControlPointItem: _verbose_cursor->hide (); @@ -1997,7 +1999,7 @@ Editor::can_remove_control_point (ArdourCanvas::Item* item) if ((control_point = reinterpret_cast<ControlPoint *> (item->get_data ("control_point"))) == 0) { fatal << _("programming error: control point canvas item has no control point object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } AutomationLine& line = control_point->line (); @@ -2022,7 +2024,7 @@ Editor::remove_control_point (ArdourCanvas::Item* item) if ((control_point = reinterpret_cast<ControlPoint *> (item->get_data ("control_point"))) == 0) { fatal << _("programming error: control point canvas item has no control point object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } control_point->line().remove_point (*control_point); @@ -2035,7 +2037,7 @@ Editor::edit_control_point (ArdourCanvas::Item* item) if (p == 0) { fatal << _("programming error: control point canvas item has no control point object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } ControlPointDialog d (p); @@ -2240,7 +2242,7 @@ Editor::hide_marker (ArdourCanvas::Item* item, GdkEvent* /*event*/) if ((marker = static_cast<Marker *> (item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } Location* location = find_location_from_marker (marker, is_start); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 1f23aa4319..b8e13bc196 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -646,7 +646,7 @@ Editor::build_region_boundary_cache () break; default: fatal << string_compose (_("build_region_boundary_cache called with snap_type = %1"), _snap_type) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return; } @@ -4000,8 +4000,10 @@ void Editor::cut_copy_midi (CutCopyOp op) { for (MidiRegionSelection::iterator i = selection->midi_regions.begin(); i != selection->midi_regions.end(); ++i) { - MidiRegionView* mrv = *i; - mrv->cut_copy_clear (op); + MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*i); + if (mrv) { + mrv->cut_copy_clear (op); + } } } diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc index 886d5e1209..78c45c7d8d 100644 --- a/gtk2_ardour/editor_regions.cc +++ b/gtk2_ardour/editor_regions.cc @@ -1560,7 +1560,7 @@ EditorRegions::sort_type_action (Editing::RegionListSortType t) const break; default: fatal << string_compose (_("programming error: %1: %2"), "EditorRegions: impossible sort type", (int) t) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } RefPtr<Action> act = ActionManager::get_action (X_("RegionList"), action); diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index fec380ee35..daf36d2d72 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -271,12 +271,12 @@ Editor::remove_tempo_marker (ArdourCanvas::Item* item) if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) { fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if ((tempo_marker = dynamic_cast<TempoMarker*> (marker)) == 0) { fatal << _("programming error: marker for tempo is not a tempo marker!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if (tempo_marker->tempo().movable()) { @@ -375,12 +375,12 @@ Editor::remove_meter_marker (ArdourCanvas::Item* item) if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) { fatal << _("programming error: meter marker canvas item has no marker object pointer!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if ((meter_marker = dynamic_cast<MeterMarker*> (marker)) == 0) { fatal << _("programming error: marker for meter is not a meter marker!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if (meter_marker->meter().movable()) { diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index daba2e77d4..7b7ad33f9a 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -610,7 +610,7 @@ next_meter_point (MeterPoint mp) break; } - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return MeterInput; } diff --git a/gtk2_ardour/latency_gui.cc b/gtk2_ardour/latency_gui.cc index 703e7dd4ab..d21a055d9e 100644 --- a/gtk2_ardour/latency_gui.cc +++ b/gtk2_ardour/latency_gui.cc @@ -148,7 +148,7 @@ LatencyGUI::change_latency_from_button (int dir) } else { fatal << string_compose (_("programming error: %1 (%2)"), X_("illegal string in latency GUI units combo"), unitstr) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if (dir > 0) { diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 08fab6ff86..81248c9585 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -112,6 +112,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container *parent, RouteTimeAxisVi , _last_event_y (0) , pre_enter_cursor (0) , pre_press_cursor (0) + , pre_note_enter_cursor (0) , _note_player (0) { CANVAS_DEBUG_NAME (_note_group, string_compose ("note group for %1", get_item_name())); @@ -149,6 +150,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container *parent, RouteTimeAxisVi , _last_event_y (0) , pre_enter_cursor (0) , pre_press_cursor (0) + , pre_note_enter_cursor (0) , _note_player (0) { CANVAS_DEBUG_NAME (_note_group, string_compose ("note group for %1", get_item_name())); @@ -195,6 +197,7 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other) , _last_event_y (0) , pre_enter_cursor (0) , pre_press_cursor (0) + , pre_note_enter_cursor (0) , _note_player (0) { init (false); @@ -223,6 +226,7 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr<M , _last_event_y (0) , pre_enter_cursor (0) , pre_press_cursor (0) + , pre_note_enter_cursor (0) , _note_player (0) { init (true); @@ -420,6 +424,7 @@ MidiRegionView::leave_notify (GdkEventCrossing*) if (pre_enter_cursor) { Editor* editor = dynamic_cast<Editor *> (&trackview.editor()); editor->set_canvas_cursor(pre_enter_cursor); + pre_enter_cursor = 0; } return false; @@ -456,7 +461,7 @@ MidiRegionView::button_press (GdkEventButton* ev) if (m == MouseObject && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier())) { pre_press_cursor = editor->get_canvas_cursor (); editor->set_canvas_cursor (editor->cursors()->midi_pencil); - } + } if (_mouse_state != SelectTouchDragging) { @@ -3116,7 +3121,7 @@ MidiRegionView::note_entered(NoteBase* ev) { Editor* editor = dynamic_cast<Editor*>(&trackview.editor()); - pre_enter_cursor = editor->get_canvas_cursor (); + pre_note_enter_cursor = editor->get_canvas_cursor (); if (_mouse_state == SelectTouchDragging) { note_selected (ev, true); @@ -3136,9 +3141,9 @@ MidiRegionView::note_left (NoteBase*) editor->verbose_cursor()->hide (); - if (pre_enter_cursor) { - editor->set_canvas_cursor (pre_enter_cursor); - pre_enter_cursor = 0; + if (pre_note_enter_cursor) { + editor->set_canvas_cursor (pre_note_enter_cursor); + pre_note_enter_cursor = 0; } } @@ -3190,13 +3195,13 @@ MidiRegionView::note_mouse_position (float x_fraction, float /*y_fraction*/, boo Editing::MouseMode mm = editor->current_mouse_mode(); bool trimmable = (mm == MouseObject || mm == MouseTimeFX || mm == MouseDraw); - if (trimmable && x_fraction > 0.0 && x_fraction < 0.2) { - editor->set_canvas_cursor (editor->cursors()->left_side_trim); - } else if (trimmable && x_fraction >= 0.8 && x_fraction < 1.0) { - editor->set_canvas_cursor (editor->cursors()->right_side_trim); - } else { - if (pre_enter_cursor && can_set_cursor) { - editor->set_canvas_cursor (pre_enter_cursor); + if (can_set_cursor) { + if (trimmable && x_fraction > 0.0 && x_fraction < 0.2) { + editor->set_canvas_cursor (editor->cursors()->left_side_trim); + } else if (trimmable && x_fraction >= 0.8 && x_fraction < 1.0) { + editor->set_canvas_cursor (editor->cursors()->right_side_trim); + } else if (pre_note_enter_cursor) { + editor->set_canvas_cursor (pre_note_enter_cursor); } } } @@ -3221,7 +3226,7 @@ MidiRegionView::set_frame_color() } if (!rect_visible) { - f = UINT_RGBA_CHANGE_A (f, 0); + f = UINT_RGBA_CHANGE_A (f, 80); } frame->set_fill_color (f); @@ -3520,7 +3525,8 @@ MidiRegionView::update_ghost_note (double x, double y) /* note that this sets the time of the ghost note in beats relative to the start of the source; that is how all note times are stored. */ - _ghost_note->note()->set_time (absolute_frames_to_source_beats (f + _region->position ())); + _ghost_note->note()->set_time ( + std::max(0.0, absolute_frames_to_source_beats (f + _region->position ()))); _ghost_note->note()->set_length (length); _ghost_note->note()->set_note (midi_stream_view()->y_to_note (y)); _ghost_note->note()->set_channel (mtv->get_channel_for_add ()); diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 3fd6625ce9..65ca7df7ab 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -473,6 +473,7 @@ private: Gdk::Cursor* pre_enter_cursor; Gdk::Cursor* pre_press_cursor; + Gdk::Cursor* pre_note_enter_cursor; NotePlayer* _note_player; diff --git a/gtk2_ardour/midi_selection.cc b/gtk2_ardour/midi_selection.cc index bf9b88899b..f98f696444 100644 --- a/gtk2_ardour/midi_selection.cc +++ b/gtk2_ardour/midi_selection.cc @@ -17,29 +17,19 @@ */ -#include "gtkmm2ext/gui_thread.h" -#include "midi_region_view.h" #include "midi_selection.h" -#include "region_view.h" MidiRegionSelection::MidiRegionSelection () -{ - RegionView::RegionViewGoingAway.connect (_death_connection, MISSING_INVALIDATOR, boost::bind (&MidiRegionSelection::remove_it, this, _1), gui_context()); -} + : RegionSelection () +{} -/** Copy constructor. - * @param other MidiRegionSelection to copy. - */ MidiRegionSelection::MidiRegionSelection (MidiRegionSelection const & other) - : std::list<MidiRegionView*> (other) -{ - RegionView::RegionViewGoingAway.connect (_death_connection, MISSING_INVALIDATOR, boost::bind (&MidiRegionSelection::remove_it, this, _1), gui_context()); -} - + : RegionSelection (other) +{} -void -MidiRegionSelection::remove_it (RegionView* rv) +MidiRegionSelection& +MidiRegionSelection::operator= (const MidiRegionSelection& other) { - MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (rv); - remove (mrv); + RegionSelection::operator=(other); + return *this; } diff --git a/gtk2_ardour/midi_selection.h b/gtk2_ardour/midi_selection.h index f2c2d3fc60..2aa04356d7 100644 --- a/gtk2_ardour/midi_selection.h +++ b/gtk2_ardour/midi_selection.h @@ -20,22 +20,19 @@ #ifndef __ardour_gtk_midi_selection_h__ #define __ardour_gtk_midi_selection_h__ -#include <list> -#include "pbd/signals.h" +#include "region_selection.h" class MidiRegionView; class MidiCutBuffer; class RegionView; -class MidiRegionSelection : public std::list<MidiRegionView*> +class MidiRegionSelection : public RegionSelection { public: MidiRegionSelection (); - MidiRegionSelection (MidiRegionSelection const &); + MidiRegionSelection (const MidiRegionSelection&); -private: - void remove_it (RegionView *); - PBD::ScopedConnection _death_connection; + MidiRegionSelection& operator= (const MidiRegionSelection&); }; struct MidiNoteSelection : std::list<MidiCutBuffer*> {}; diff --git a/gtk2_ardour/note_base.cc b/gtk2_ardour/note_base.cc index 7bc45a4b25..5e5d83e500 100644 --- a/gtk2_ardour/note_base.cc +++ b/gtk2_ardour/note_base.cc @@ -262,8 +262,8 @@ NoteBase::event_handler (GdkEvent* ev) switch (ev->type) { case GDK_ENTER_NOTIFY: - set_mouse_fractions (ev); _region.note_entered (this); + set_mouse_fractions (ev); break; case GDK_LEAVE_NOTIFY: diff --git a/gtk2_ardour/note_select_dialog.h b/gtk2_ardour/note_select_dialog.h index 607dbe1506..910728f2fb 100644 --- a/gtk2_ardour/note_select_dialog.h +++ b/gtk2_ardour/note_select_dialog.h @@ -20,6 +20,7 @@ #ifndef __gtk2_ardour_note_select_dialog_h__ #define __gtk2_ardour_note_select_dialog_h__ +#include <stdint.h> #include "ardour_dialog.h" #include "gtk_pianokeyboard.h" diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc index bf9da544e6..b3b5a91ed3 100644 --- a/gtk2_ardour/port_matrix.cc +++ b/gtk2_ardour/port_matrix.cc @@ -1139,7 +1139,7 @@ PortMatrix::get_association (PortMatrixNode node) const } - /* NOTREACHED */ + abort(); /* NOTREACHED */ return PortMatrixNode::NOT_ASSOCIATED; } diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index a4d2b5dee2..0cb8441fd9 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -996,7 +996,8 @@ public: PluginOptions (RCConfiguration* c) : _rc_config (c) , _display_plugin_scan_progress (_("Always Display Plugin Scan Progress")) - , _discover_vst_on_start (_("Scan for new VST Plugins on Application Start")) + , _discover_vst_on_start (_("Scan for [new] VST Plugins on Application Start")) + , _discover_au_on_start (_("Scan for AudioUnit Plugins on Application Start")) , _timeout_adjustment (0, 0, 3000, 50, 50) , _timeout_slider (_timeout_adjustment) { @@ -1022,6 +1023,7 @@ public: Gtkmm2ext::UI::instance()->set_tip (_display_plugin_scan_progress, _("<b>When enabled</b> a popup window showing plugin scan progress is displayed for indexing (cache load) and discovery (detect new plugins)")); +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT) _timeout_slider.set_digits (0); _timeout_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &PluginOptions::timeout_changed)); @@ -1069,6 +1071,14 @@ public: b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::edit_vst_path_clicked)); t->attach (*b, 1, 2, n, n+1, FILL); ++n; #endif +#endif // any VST + +#ifdef AUDIOUNIT_SUPPORT + t->attach (_discover_au_on_start, 0, 2, n, n+1); ++n; + _discover_au_on_start.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::discover_au_on_start_toggled)); + Gtkmm2ext::UI::instance()->set_tip (_discover_au_on_start, + _("<b>When enabled</b> Audio Unit Plugins are discovered on application start. When disabled AU plugins will only be available after triggering a 'Scan' manually. The first successful scan will enable AU auto-scan, Any crash during plugin discovery will disable it.")); +#endif _box->pack_start (*t,true,true); } @@ -1086,18 +1096,24 @@ public: int const x = _rc_config->get_vst_scan_timeout(); _timeout_adjustment.set_value (x); } + else if (p == "discover-audio-units") { + bool const x = _rc_config->get_discover_audio_units(); + _discover_au_on_start.set_active (x); + } } void set_state_from_config () { parameter_changed ("show-plugin-scan-window"); parameter_changed ("discover-vst-on-start"); parameter_changed ("vst-scan-timeout"); + parameter_changed ("discover-audio-units"); } private: RCConfiguration* _rc_config; CheckButton _display_plugin_scan_progress; CheckButton _discover_vst_on_start; + CheckButton _discover_au_on_start; Adjustment _timeout_adjustment; HScale _timeout_slider; @@ -1111,6 +1127,11 @@ private: _rc_config->set_discover_vst_on_start(x); } + void discover_au_on_start_toggled () { + bool const x = _discover_au_on_start.get_active(); + _rc_config->set_discover_audio_units(x); + } + void timeout_changed () { int x = floor(_timeout_adjustment.get_value()); _rc_config->set_vst_scan_timeout(x); @@ -2127,7 +2148,7 @@ RCOptionEditor::RCOptionEditor () /* VIDEO Timeline */ add_option (_("Video"), new VideoTimelineOptions (_rc_config)); -#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT) +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT) /* Plugin options (currrently VST only) */ add_option (_("Plugins"), new PluginOptions (_rc_config)); #endif diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc index d4604b265d..fcdde48487 100644 --- a/gtk2_ardour/region_view.cc +++ b/gtk2_ardour/region_view.cc @@ -225,7 +225,9 @@ RegionView::~RegionView () bool RegionView::canvas_group_event (GdkEvent* event) { - return trackview.editor().canvas_region_view_event (event, group, this); + if (!in_destructor) { + return trackview.editor().canvas_region_view_event (event, group, this); + } } void diff --git a/gtk2_ardour/rhythm_ferret.cc b/gtk2_ardour/rhythm_ferret.cc index ec5ebc93a1..f159331018 100644 --- a/gtk2_ardour/rhythm_ferret.cc +++ b/gtk2_ardour/rhythm_ferret.cc @@ -273,7 +273,7 @@ RhythmFerret::get_note_onset_function () fatal << string_compose (_("programming error: %1 (%2)"), X_("illegal note onset function string"), txt) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return -1; } diff --git a/gtk2_ardour/route_group_dialog.cc b/gtk2_ardour/route_group_dialog.cc index 3addc1c598..e7e48f777e 100644 --- a/gtk2_ardour/route_group_dialog.cc +++ b/gtk2_ardour/route_group_dialog.cc @@ -207,7 +207,7 @@ RouteGroupDialog::do_run () msg.run (); } - /* NOTREACHED */ + abort(); /* NOTREACHED */ return false; } diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 31c2eb1712..c4d49e40b9 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -2015,7 +2015,7 @@ RouteTimeAxisView::add_processor_automation_curve (boost::shared_ptr<Processor> << string_compose (X_("processor automation curve for %1:%2/%3/%4 not registered with track!"), processor->name(), what.type(), (int) what.channel(), what.id() ) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return; } @@ -2481,7 +2481,7 @@ RouteTimeAxisView::add_underlay (StreamView* v, bool /*update_xml*/) if (find(_underlay_streams.begin(), _underlay_streams.end(), v) == _underlay_streams.end()) { if (find(other._underlay_mirrors.begin(), other._underlay_mirrors.end(), this) != other._underlay_mirrors.end()) { fatal << _("programming error: underlay reference pointer pairs are inconsistent!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } _underlay_streams.push_back(v); @@ -2518,7 +2518,7 @@ RouteTimeAxisView::remove_underlay (StreamView* v) if (gm == other._underlay_mirrors.end()) { fatal << _("programming error: underlay reference pointer pairs are inconsistent!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } v->foreach_regionview(sigc::mem_fun(*this, &RouteTimeAxisView::remove_ghost)); diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc index 507245eb3d..1bdc0fe8b0 100644 --- a/gtk2_ardour/selection.cc +++ b/gtk2_ardour/selection.cc @@ -1002,7 +1002,7 @@ Selection::toggle (list<Selectable*> const & selectables) fatal << _("programming error: ") << X_("unknown selectable type passed to Selection::toggle()") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } } @@ -1056,7 +1056,7 @@ Selection::add (list<Selectable*> const & selectables) fatal << _("programming error: ") << X_("unknown selectable type passed to Selection::add()") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } } diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index da29eb75a8..80ee165a84 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -113,7 +113,7 @@ importmode2string (ImportMode mode) case ImportAsTapeTrack: return _("as new tape tracks"); } - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return _("as new tracks"); } @@ -1891,7 +1891,7 @@ SoundFileOmega::get_channel_disposition () const if (x == disposition_map.end()) { fatal << string_compose (_("programming error: %1 (%2)"), "unknown string for import disposition", str) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } return x->second; diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index ed759f3a7e..73e150549f 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -431,7 +431,7 @@ StreamView::update_rec_box () default: fatal << string_compose (_("programming error: %1"), "illegal track mode") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return; } @@ -575,7 +575,7 @@ StreamView::child_height () const return height / (_layers * 2 + 1); } - /* NOTREACHED */ + abort(); /* NOTREACHED */ return height; } diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index af8699c001..58969a97f5 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -1312,7 +1312,7 @@ TimeAxisView::preset_height (Height h) return button_height + extra_height; } - /* NOTREACHED */ + abort(); /* NOTREACHED */ return 0; } diff --git a/gtk2_ardour/time_axis_view_item.cc b/gtk2_ardour/time_axis_view_item.cc index c698263d57..5948cebddd 100644 --- a/gtk2_ardour/time_axis_view_item.cc +++ b/gtk2_ardour/time_axis_view_item.cc @@ -719,12 +719,10 @@ uint32_t TimeAxisViewItem::fill_opacity () const { if (!rect_visible) { - /* if the frame/rect is marked as invisible, then the - * fill should be transparent. simplest: set - - * alpha/opacity to zero. - */ - return 0; + /* if the frame/rect is marked as "invisible", then the + fill should be translucent.parent. + */ + return 64; } if (_dragging) { @@ -781,19 +779,19 @@ TimeAxisViewItem::set_frame_color() return; } - frame->set_fill_color (get_fill_color()); + frame->set_fill_color (get_fill_color()); set_frame_gradient (); - if (!_recregion) { + if (!_recregion) { uint32_t f = ARDOUR_UI::config()->get_TimeAxisFrame(); - if (!rect_visible) { + if (!rect_visible) { /* make the frame outline be visible but rather transparent */ - f = UINT_RGBA_CHANGE_A (f, 64); - } + f = UINT_RGBA_CHANGE_A (f, 64); + } - frame->set_outline_color (f); - } + frame->set_outline_color (f); + } } void diff --git a/gtk2_ardour/time_selection.cc b/gtk2_ardour/time_selection.cc index a0f33e8c99..8545a345eb 100644 --- a/gtk2_ardour/time_selection.cc +++ b/gtk2_ardour/time_selection.cc @@ -38,7 +38,7 @@ TimeSelection::operator[] (uint32_t which) } } fatal << string_compose (_("programming error: request for non-existent audio range (%1)!"), which) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return *(new AudioRange(0,0,0)); /* keep the compiler happy; never called */ } diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index 171fc631d5..0f61656033 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -708,7 +708,7 @@ ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set, bool is_imag if (!find_file (def, name, data_file_path)) { fatal << string_compose (_("cannot find icon image for %1 using %2"), name, spath.to_string()) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } } diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index d840c258e7..48ea614f8e 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -243,6 +243,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo { bool reconfigurable_io() const { return true; } static PluginInfoList* discover (); + static bool au_get_crashlog (std::string &msg); static void get_names (CAComponentDescription&, std::string& name, std::string& maker); static std::string stringify_descriptor (const CAComponentDescription&); @@ -251,6 +252,11 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo { private: boost::shared_ptr<CAComponentDescription> descriptor; UInt32 version; + static FILE * _crashlog_fd; + + static void au_start_crashlog (void); + static void au_remove_crashlog (void); + static void au_crashlog (std::string); static void discover_music (PluginInfoList&); static void discover_fx (PluginInfoList&); diff --git a/libs/ardour/ardour/plugin_manager.h b/libs/ardour/ardour/plugin_manager.h index 6239bd7cb0..31ab833508 100644 --- a/libs/ardour/ardour/plugin_manager.h +++ b/libs/ardour/ardour/plugin_manager.h @@ -127,7 +127,7 @@ class LIBARDOUR_API PluginManager : public boost::noncopyable { void add_lxvst_presets (); void add_presets (std::string domain); - void au_refresh (); + void au_refresh (bool cache_only = false); void lv2_refresh (); diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index 20c3857537..2ae2b562eb 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -211,6 +211,7 @@ CONFIG_VARIABLE (bool, use_lxvst, "use-lxvst", true) CONFIG_VARIABLE (bool, show_plugin_scan_window, "show-plugin-scan-window", false) CONFIG_VARIABLE (bool, discover_vst_on_start, "discover-vst-on-start", false) CONFIG_VARIABLE (int, vst_scan_timeout, "vst-scan-timeout", 600) /* deciseconds, per plugin, <= 0 no timeout */ +CONFIG_VARIABLE (bool, discover_audio_units, "discover-audio-units", false) /* custom user plugin paths */ CONFIG_VARIABLE (std::string, plugin_path_vst, "plugin-path-vst", "@default@") diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 7444a54a7c..165afd0dd9 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -267,8 +267,7 @@ namespace ARDOUR { return seconds != 0; } - /* NOTREACHED */ - assert (false); + abort(); /* NOTREACHED */ return false; } }; diff --git a/libs/ardour/audio_playlist_source.cc b/libs/ardour/audio_playlist_source.cc index 5e8dc09d45..5f71d6246f 100644 --- a/libs/ardour/audio_playlist_source.cc +++ b/libs/ardour/audio_playlist_source.cc @@ -169,7 +169,7 @@ framecnt_t AudioPlaylistSource::write_unlocked (Sample *, framecnt_t) { fatal << string_compose (_("programming error: %1"), "AudioPlaylistSource::write() called - should be impossible") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return 0; } diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index add2407f84..3024c55f43 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -19,6 +19,7 @@ */ #include <sstream> +#include <fstream> #include <errno.h> #include <string.h> #include <math.h> @@ -71,6 +72,7 @@ AUPluginInfo::CachedInfoMap AUPluginInfo::cached_info; static string preset_search_path = "/Library/Audio/Presets:/Network/Library/Audio/Presets"; static string preset_suffix = ".aupreset"; static bool preset_search_path_initialized = false; +FILE * AUPluginInfo::_crashlog_fd = NULL; static OSStatus _render_callback(void *userData, @@ -2156,6 +2158,8 @@ AUPluginInfo::discover () if (!Glib::file_test (au_cache_path(), Glib::FILE_TEST_EXISTS)) { ARDOUR::BootMessage (_("Discovering AudioUnit plugins (could take some time ...)")); } + // create crash log file + au_start_crashlog (); PluginInfoList* plugs = new PluginInfoList; @@ -2164,6 +2168,9 @@ AUPluginInfo::discover () discover_generators (*plugs); discover_instruments (*plugs); + // all fine if we get here + au_remove_crashlog (); + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("AU: discovered %1 plugins\n", plugs->size())); return plugs; @@ -2221,10 +2228,57 @@ AUPluginInfo::discover_instruments (PluginInfoList& plugs) discover_by_description (plugs, desc); } + +bool +AUPluginInfo::au_get_crashlog (std::string &msg) +{ + string fn = Glib::build_filename (ARDOUR::user_cache_directory(), "au_crashlog.txt"); + if (!Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) { + return false; + } + std::ifstream ifs(fn.c_str()); + msg.assign ((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>())); + au_remove_crashlog (); + return true; +} + +void +AUPluginInfo::au_start_crashlog () +{ + string fn = Glib::build_filename (ARDOUR::user_cache_directory(), "au_crashlog.txt"); + assert(!_crashlog_fd); + DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("Creating AU Log: %1\n", fn)); + if (!(_crashlog_fd = fopen(fn.c_str(), "w"))) { + PBD::error << "Cannot create AU error-log\n"; + } +} + +void +AUPluginInfo::au_remove_crashlog () +{ + if (_crashlog_fd) { + ::fclose(_crashlog_fd); + _crashlog_fd = NULL; + } + string fn = Glib::build_filename (ARDOUR::user_cache_directory(), "au_crashlog.txt"); + ::g_unlink(fn.c_str()); + DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("Remove AU Log: %1\n", fn)); +} + + +void +AUPluginInfo::au_crashlog (std::string msg) +{ + assert(_crashlog_fd); + fprintf(_crashlog_fd, "AU: %s\n", msg.c_str()); + ::fflush(_crashlog_fd); +} + void AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescription& desc) { Component comp = 0; + au_crashlog(string_compose("Start AU discovery for Type: %1", (int)desc.componentType)); comp = FindNextComponent (NULL, &desc); @@ -2232,6 +2286,21 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip CAComponentDescription temp; GetComponentInfo (comp, &temp, NULL, NULL, NULL); + { + CFStringRef compTypeString = UTCreateStringForOSType(temp.componentType); + CFStringRef compSubTypeString = UTCreateStringForOSType(temp.componentSubType); + CFStringRef compManufacturerString = UTCreateStringForOSType(temp.componentManufacturer); + CFStringRef itemName = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%@ - %@ - %@"), + compTypeString, compManufacturerString, compSubTypeString); + au_crashlog(string_compose("Scanning ID: %1", CFStringRefToStdString(itemName))); + if (compTypeString != NULL) + CFRelease(compTypeString); + if (compSubTypeString != NULL) + CFRelease(compSubTypeString); + if (compManufacturerString != NULL) + CFRelease(compManufacturerString); + } + AUPluginInfoPtr info (new AUPluginInfo (boost::shared_ptr<CAComponentDescription> (new CAComponentDescription(temp)))); @@ -2275,6 +2344,7 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip AUPluginInfo::get_names (temp, info->name, info->creator); ARDOUR::PluginScanMessage(_("AU"), info->name, false); + au_crashlog(string_compose("Plugin: %1", info->name)); info->type = ARDOUR::AudioUnit; info->unique_id = stringify_descriptor (*info->descriptor); @@ -2327,8 +2397,10 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip error << string_compose (_("Cannot get I/O configuration info for AU %1"), info->name) << endmsg; } + au_crashlog("Success."); comp = FindNextComponent (comp, &desc); } + au_crashlog(string_compose("End AU discovery for Type: %1", (int)desc.componentType)); } bool diff --git a/libs/ardour/bundle.cc b/libs/ardour/bundle.cc index 834a98d347..7e50807c6e 100644 --- a/libs/ardour/bundle.cc +++ b/libs/ardour/bundle.cc @@ -591,7 +591,7 @@ Bundle::type_channel_to_overall (DataType t, uint32_t c) const ++o; } - /* NOTREACHED */ + abort(); /* NOTREACHED */ return -1; } diff --git a/libs/ardour/butler.cc b/libs/ardour/butler.cc index 327665441e..9bc232007b 100644 --- a/libs/ardour/butler.cc +++ b/libs/ardour/butler.cc @@ -202,7 +202,7 @@ Butler::dequeue_request (Request::Type& r) return false; } else { fatal << _("Error reading from butler request pipe") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } #else r = (Request::Type) m_request_state.get(); @@ -242,7 +242,7 @@ Butler::thread_work () case Request::Quit: return 0; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ break; default: diff --git a/libs/ardour/cycle_timer.cc b/libs/ardour/cycle_timer.cc index bb4f3181e0..84dafd00cc 100644 --- a/libs/ardour/cycle_timer.cc +++ b/libs/ardour/cycle_timer.cc @@ -38,7 +38,7 @@ get_mhz() if ((f = fopen("/proc/cpuinfo", "r")) == 0) { fatal << _("CycleTimer::get_mhz(): can't open /proc/cpuinfo") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return 0.0f; } @@ -50,7 +50,7 @@ get_mhz() if (fgets (buf, sizeof(buf), f) == 0) { fatal << _("CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return 0.0f; } @@ -73,7 +73,7 @@ get_mhz() } fatal << _("cannot locate cpu MHz in /proc/cpuinfo") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return 0.0f; } diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 30f7ef63fa..f7d679d3ba 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -148,7 +148,7 @@ Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) } } else { fatal << "programming error: this should never be reached" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } @@ -169,7 +169,7 @@ Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) } } else { fatal << "programming error: this should never be reached" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } } else { @@ -210,7 +210,7 @@ Delivery::configure_io (ChanCount in, ChanCount out) if (_input->n_ports() != in) { if (_input->n_ports() != ChanCount::ZERO) { fatal << _name << " programming error: configure_io called with " << in << " and " << out << " with " << _input->n_ports() << " input ports" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } else { /* I/O not yet configured */ } diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc index ef9544589d..259a04bc0f 100644 --- a/libs/ardour/midi_model.cc +++ b/libs/ardour/midi_model.cc @@ -195,11 +195,11 @@ MidiModel::NoteDiffCommand::change (const NotePtr note, Property prop, case StartTime: fatal << "MidiModel::DiffCommand::change() with integer argument called for start time" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ break; case Length: fatal << "MidiModel::DiffCommand::change() with integer argument called for length" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ break; } @@ -627,7 +627,7 @@ MidiModel::NoteDiffCommand::unmarshal_change (XMLNode *xml_change) change.property = (Property) string_2_enum (prop->value(), change.property); } else { fatal << "!!!" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if ((prop = xml_change->property ("id")) == 0) { @@ -648,7 +648,7 @@ MidiModel::NoteDiffCommand::unmarshal_change (XMLNode *xml_change) } } else { fatal << "!!!" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if ((prop = xml_change->property ("new")) != 0) { @@ -662,7 +662,7 @@ MidiModel::NoteDiffCommand::unmarshal_change (XMLNode *xml_change) } } else { fatal << "!!!" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } /* we must point at the instance of the note that is actually in the model. @@ -899,7 +899,7 @@ MidiModel::SysExDiffCommand::unmarshal_change (XMLNode *xml_change) change.property = (Property) string_2_enum (prop->value(), change.property); } else { fatal << "!!!" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if ((prop = xml_change->property ("id")) == 0) { @@ -914,7 +914,7 @@ MidiModel::SysExDiffCommand::unmarshal_change (XMLNode *xml_change) old_str >> change.old_time; } else { fatal << "!!!" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if ((prop = xml_change->property ("new")) != 0) { @@ -922,7 +922,7 @@ MidiModel::SysExDiffCommand::unmarshal_change (XMLNode *xml_change) new_str >> change.new_time; } else { fatal << "!!!" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } /* we must point at the instance of the sysex that is actually in the model. @@ -1728,7 +1728,7 @@ MidiModel::resolve_overlaps_unlocked (const NotePtr note, void* arg) return -1; /* do not add the new note */ break; default: - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ /* stupid gcc */ break; } @@ -1764,7 +1764,7 @@ MidiModel::resolve_overlaps_unlocked (const NotePtr note, void* arg) note_length = min (note_length, (*i)->end_time() - note->time()); break; default: - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ /* stupid gcc */ break; } @@ -1783,7 +1783,7 @@ MidiModel::resolve_overlaps_unlocked (const NotePtr note, void* arg) /* cannot add in this case */ return -1; default: - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ /* stupid gcc */ break; } @@ -1801,14 +1801,14 @@ MidiModel::resolve_overlaps_unlocked (const NotePtr note, void* arg) to_be_deleted.insert (*i); break; default: - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ /* stupid gcc */ break; } break; default: - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ /* stupid gcc */ break; } diff --git a/libs/ardour/midi_playlist_source.cc b/libs/ardour/midi_playlist_source.cc index 68e0a478df..cd5362c3da 100644 --- a/libs/ardour/midi_playlist_source.cc +++ b/libs/ardour/midi_playlist_source.cc @@ -142,7 +142,7 @@ MidiPlaylistSource::write_unlocked (MidiRingBuffer<framepos_t>&, framecnt_t) { fatal << string_compose (_("programming error: %1"), "MidiPlaylistSource::write_unlocked() called - should be impossible") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return 0; } @@ -150,14 +150,14 @@ void MidiPlaylistSource::append_event_unlocked_beats(const Evoral::Event<Evoral::MusicalTime>& /*ev*/) { fatal << string_compose (_("programming error: %1"), "MidiPlaylistSource::append_event_unlocked_beats() called - should be impossible") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } void MidiPlaylistSource::append_event_unlocked_frames(const Evoral::Event<framepos_t>& /* ev */, framepos_t /*source_start*/) { fatal << string_compose (_("programming error: %1"), "MidiPlaylistSource::append_event_unlocked_frames() called - should be impossible") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } void diff --git a/libs/ardour/panner_shell.cc b/libs/ardour/panner_shell.cc index a4a9342816..de0780cdba 100644 --- a/libs/ardour/panner_shell.cc +++ b/libs/ardour/panner_shell.cc @@ -120,7 +120,7 @@ PannerShell::configure_io (ChanCount in, ChanCount out) PannerInfo* pi = PannerManager::instance().select_panner (in, out, _user_selected_panner_uri); if (!pi) { fatal << _("No panner found: check that panners are being discovered correctly during startup.") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } DEBUG_TRACE (DEBUG::Panning, string_compose (_("select panner: %1\n"), pi->descriptor.name.c_str())); diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 26b6aacd2a..0c76b65c84 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -600,7 +600,7 @@ PluginInsert::default_parameter_value (const Evoral::Parameter& param) if (_plugins.empty()) { fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } return _plugins[0]->default_value (param.id()); @@ -646,7 +646,7 @@ PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other) fatal << string_compose (_("programming error: %1"), X_("unknown plugin type in PluginInsert::plugin_factory")) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return boost::shared_ptr<Plugin> ((Plugin*) 0); } diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index 1791e2f10d..b6100f74b5 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -116,12 +116,17 @@ PluginManager::PluginManager () string lrdf_path; #if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT + // source-tree (ardev, etc) PBD::Searchpath vstsp(Glib::build_filename(ARDOUR::ardour_dll_directory(), "fst")); + #ifdef PLATFORM_WINDOWS + // on windows the .exe needs to be in the same folder with libardour.dll vstsp += Glib::build_filename(g_win32_get_package_installation_directory_of_module (0), "bin"); #else - vstsp += Glib::getenv("PATH"); + // on Unices additional internal-use binaries are deployed to $libdir + vstsp += ARDOUR::ardour_dll_directory(); #endif + if (!PBD::find_file (vstsp, #ifdef PLATFORM_WINDOWS #ifdef DEBUGGABLE_SCANNER_APP @@ -243,7 +248,7 @@ PluginManager::refresh (bool cache_only) #ifdef AUDIOUNIT_SUPPORT BootMessage (_("Scanning AU Plugins")); - au_refresh (); + au_refresh (cache_only); #endif BootMessage (_("Plugin Scan Complete...")); @@ -604,11 +609,23 @@ PluginManager::lv2_refresh () #ifdef AUDIOUNIT_SUPPORT void -PluginManager::au_refresh () +PluginManager::au_refresh (bool cache_only) { DEBUG_TRACE (DEBUG::PluginManager, "AU: refresh\n"); + if (cache_only && !Config->get_discover_audio_units ()) { + return; + } delete _au_plugin_info; + + // disable automatic scan in case we crash + Config->set_discover_audio_units (false); + Config->save_state(); + _au_plugin_info = AUPluginInfo::discover(); + + // successful scan re-enabled automatic discovery + Config->set_discover_audio_units (true); + Config->save_state(); } #endif @@ -1050,9 +1067,9 @@ ARDOUR::PluginInfoList& PluginManager::au_plugin_info () { #ifdef AUDIOUNIT_SUPPORT - assert(_au_plugin_info); - return *_au_plugin_info; -#else - return _empty_plugin_info; + if (_au_plugin_info) { + return *_au_plugin_info; + } #endif + return _empty_plugin_info; } diff --git a/libs/ardour/region_factory.cc b/libs/ardour/region_factory.cc index 44f8c34ddd..9654a4b3de 100644 --- a/libs/ardour/region_factory.cc +++ b/libs/ardour/region_factory.cc @@ -66,7 +66,7 @@ RegionFactory::create (boost::shared_ptr<const Region> region, bool announce) } else { fatal << _("programming error: RegionFactory::create() called with unknown Region type") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if (ret) { @@ -108,7 +108,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, const PropertyList& pli } else { fatal << _("programming error: RegionFactory::create() called with unknown Region type") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return boost::shared_ptr<Region>(); } @@ -149,7 +149,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, c } else { fatal << _("programming error: RegionFactory::create() called with unknown Region type") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return boost::shared_ptr<Region>(); } @@ -191,7 +191,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, const SourceList& srcs, } else { fatal << _("programming error: RegionFactory::create() called with unknown Region type") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } if (ret) { diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index f78cd1e2f1..d67c1bbd86 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -3730,7 +3730,7 @@ Route::set_active (bool yn, void* src) void Route::meter () { - Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock rm (_processor_lock); assert (_meter); @@ -3785,7 +3785,7 @@ Route::get_control (const Evoral::Parameter& param) /* maybe one of our processors does or ... */ - Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK); + Glib::Threads::RWLock::ReaderLock rm (_processor_lock); for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) { break; diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index 87aadf4193..9d5fd619c3 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -65,7 +65,7 @@ Send::name_and_id_new_send (Session& s, Role r, uint32_t& bitslot, bool ignore_b return string_compose (_("send %1"), (bitslot = s.next_send_id ()) + 1); default: fatal << string_compose (_("programming error: send created using role %1"), enum_2_string (r)) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return string(); } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 6807bed812..2878bb8014 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -2380,7 +2380,7 @@ Session::new_route_from_template (uint32_t how_many, const std::string& template /* generate a new name by adding a number to the end of the template name */ if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) { fatal << _("Session: UINT_MAX routes? impossible!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } } @@ -4041,7 +4041,7 @@ Session::available_capture_duration () fatal << string_compose (_("programming error: %1"), X_("illegal native file data format")) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } double scale = 4096.0 / sample_bytes_on_disk; diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 497fbd4d2e..260c6c319a 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -1169,7 +1169,7 @@ Session::process_event (SessionEvent* ev) default: fatal << string_compose(_("Programming error: illegal event type in process_event (%1)"), ev->type) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ break; }; diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index 58fbab233b..5f1b31c640 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -152,7 +152,7 @@ SndFileSource::SndFileSource (Session& s, const string& path, const string& orig default: fatal << string_compose (_("programming error: %1"), X_("unsupported audio header format requested")) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ break; } @@ -459,7 +459,7 @@ SndFileSource::nondestructive_write_unlocked (Sample *data, framecnt_t cnt) if (_info.channels != 1) { fatal << string_compose (_("programming error: %1 %2"), X_("SndFileSource::write called on non-mono file"), _path) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return 0; } diff --git a/libs/ardour/system_exec.cc b/libs/ardour/system_exec.cc index 75b20e4500..d83165252a 100644 --- a/libs/ardour/system_exec.cc +++ b/libs/ardour/system_exec.cc @@ -35,7 +35,10 @@ static char *vfork_exec_wrapper_path() { #else std::string vfork_exec_wrapper; if (!PBD::find_file ( - PBD::Searchpath(Glib::build_filename(ARDOUR::ardour_dll_directory(), "vfork")), + PBD::Searchpath( + ARDOUR::ardour_dll_directory() // deployed + + G_SEARCHPATH_SEPARATOR_S + Glib::build_filename(ARDOUR::ardour_dll_directory(), "vfork") // src, build (ardev, etc) + ), "ardour-exec-wrapper", vfork_exec_wrapper)) { PBD::fatal << "vfork exec wrapper 'ardour-exec-wrapper' was not found in $PATH." << endmsg; /* not reached */ diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 621d1e2c74..5e50e8e02b 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -677,7 +677,7 @@ TempoMap::first_meter () const } fatal << _("programming error: no tempo section in tempo map!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return *m; } @@ -693,7 +693,7 @@ TempoMap::first_tempo () const } fatal << _("programming error: no tempo section in tempo map!") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return *t; } @@ -807,7 +807,7 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) rmeter = ms; } else { fatal << _("programming error: unhandled MetricSection type") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } } } @@ -1489,8 +1489,7 @@ TempoMap::round_to_type (framepos_t frame, int dir, BBTPointType type) break; } - /* NOTREACHED */ - assert (false); + abort(); /* NOTREACHED */ return 0; } @@ -1532,6 +1531,7 @@ TempoMap::tempo_section_at (framepos_t frame) const if (prev == 0) { fatal << endmsg; + abort(); /*NOTREACHED*/ } return *prev; @@ -1785,7 +1785,7 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount) // cerr << "NEW METER, frame = " << (*i)->frame() << " start = " << (*i)->start() <<endl; } else { fatal << _("programming error: unhandled MetricSection type") << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } prev = (*i); diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 03d75d9d79..1426c3926c 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -951,7 +951,7 @@ Track::monitoring_state () const } } - /* NOTREACHED */ + abort(); /* NOTREACHED */ return MonitoringSilence; } diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc index 9c0aea885b..6d6511bb9f 100644 --- a/libs/ardour/utils.cc +++ b/libs/ardour/utils.cc @@ -429,7 +429,7 @@ ARDOUR::string_to_edit_mode (string str) return Lock; } fatal << string_compose (_("programming error: unknown edit mode string \"%1\""), str) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return Slide; } @@ -468,7 +468,7 @@ ARDOUR::string_to_sync_source (string str) } fatal << string_compose (_("programming error: unknown sync source string \"%1\""), str) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return Engine; } @@ -577,7 +577,7 @@ ARDOUR::string_to_auto_state (std::string str) } fatal << string_compose (_("programming error: %1 %2"), "illegal AutoState string: ", str) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return Touch; } @@ -601,7 +601,7 @@ ARDOUR::auto_state_to_string (AutoState as) } fatal << string_compose (_("programming error: %1 %2"), "illegal AutoState type: ", as) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return ""; } @@ -615,7 +615,7 @@ ARDOUR::string_to_auto_style (std::string str) } fatal << string_compose (_("programming error: %1 %2"), "illegal AutoStyle string: ", str) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return Trim; } @@ -634,7 +634,7 @@ ARDOUR::auto_style_to_string (AutoStyle as) } fatal << string_compose (_("programming error: %1 %2"), "illegal AutoStyle type: ", as) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return ""; } @@ -669,7 +669,7 @@ ARDOUR::native_header_format_extension (HeaderFormat hf, const DataType& type) } fatal << string_compose (_("programming error: unknown native header format: %1"), hf); - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return ".wav"; } diff --git a/libs/backends/jack/weak_libjack.c b/libs/backends/jack/weak_libjack.c index ebde208e42..775410287b 100644 --- a/libs/backends/jack/weak_libjack.c +++ b/libs/backends/jack/weak_libjack.c @@ -57,10 +57,19 @@ static void* lib_symbol(void* const lib, const char* const sym) { typedef void * pvoid_t; #define MAPSYM(SYM, FAIL) _j._ ## SYM = (func_t)lib_symbol(lib, "jack_" # SYM); \ if (!_j._ ## SYM) err |= FAIL; -#else +#elif defined NDEBUG typedef void * __attribute__ ((__may_alias__)) pvoid_t; #define MAPSYM(SYM, FAIL) *(pvoid_t *)(&_j._ ## SYM) = lib_symbol(lib, "jack_" # SYM); \ if (!_j._ ## SYM) err |= FAIL; +#else +typedef void * __attribute__ ((__may_alias__)) pvoid_t; +#define MAPSYM(SYM, FAIL) *(pvoid_t *)(&_j._ ## SYM) = lib_symbol(lib, "jack_" # SYM); \ + if (!_j._ ## SYM) { \ + if (FAIL) { \ + fprintf(stderr, "*** WEAK-JACK: required symbol 'jack_%s' was not found\n", "" # SYM); \ + } \ + err |= FAIL; \ + } #endif typedef void (* func_t) (void); @@ -182,6 +191,9 @@ int have_libjack (void) { /* dedicated support for jack_client_open(,..) variable arg function macro */ func_t WJACK_get_client_open(void) { + if (_status == -1) { + init_weak_jack(); + } return _j._client_open; } diff --git a/libs/backends/jack/weak_libjack.def b/libs/backends/jack/weak_libjack.def index eeab00e943..45b1dc94a5 100644 --- a/libs/backends/jack/weak_libjack.def +++ b/libs/backends/jack/weak_libjack.def @@ -113,9 +113,22 @@ JCFUN(0, int, client_real_time_priority, 0) JCFUN(0, int, client_max_real_time_priority, 0) JPFUN(0, int, acquire_real_time_scheduling, (jack_native_thread_t t, int p), (t,p), 0) JPFUN(0, int, drop_real_time_scheduling, (jack_native_thread_t t), (t), 0) -JPFUN(1, int, client_stop_thread, (jack_client_t* c, jack_native_thread_t t), (c,t), 0) -JPFUN(1, int, client_kill_thread, (jack_client_t* c, jack_native_thread_t t), (c,t), 0) +JPFUN(0, int, client_stop_thread, (jack_client_t* c, jack_native_thread_t t), (c,t), 0) +JPFUN(0, int, client_kill_thread, (jack_client_t* c, jack_native_thread_t t), (c,t), 0) JPFUN(1, int, client_create_thread, \ (jack_client_t* c, jack_native_thread_t *t, int p, int r, void *(*f)(void*), void *a), (c,t,p,r,f,a), 0) +#if 0 +/* <jack/metadata.h> */ +JPFUN(0, int, set_property, (jack_client_t* c, jack_uuid_t s, const char* k, const char* v, const char* t), (c,s,k,v,t), -1) +JXFUN(0, int, get_property, (jack_uuid_t s, const char* k, char** v, char** t), (s,k,v,t), if (v) *v=NULL; if (t) *t=NULL; return -1;) +JVFUN(0, free_description, (jack_description_t* d, int f), (d,f),) +JXFUN(0, int, get_properties, (jack_uuid_t s, jack_description_t* d), (s,d), if (d) {d->properties = NULL; d->property_cnt = 0;} return -1;) +JXFUN(0, int, get_all_properties, (jack_description_t** d), (d), if (d) *d=NULL; return -1;) +JPFUN(0, int, remove_property, (jack_client_t* c, jack_uuid_t s, const char* k), (c,s,k), -1) +JPFUN(0, int, remove_properties, (jack_client_t* c, jack_uuid_t s), (c,s), -1) +JPFUN(0, int, remove_all_properties, (jack_client_t* c), (c), -1) + (jack_client_t* c, jack_native_thread_t *t, int p, int r, void *(*f)(void*), void *a), (c,t,p,r,f,a), 0) +#endif + #endif // end USE_WEAK_JACK diff --git a/libs/backends/jack/weak_libjack.h b/libs/backends/jack/weak_libjack.h index 349861f6ab..63439f0763 100644 --- a/libs/backends/jack/weak_libjack.h +++ b/libs/backends/jack/weak_libjack.h @@ -154,6 +154,19 @@ int have_libjack(void); #define jack_client_open WJACK_client_client_openXXX +#if 0 +/* <jack/metadata.h> */ +#define jack_set_property WJACK_set_property +#define jack_get_property WJACK_get_property +#define jack_free_description WJACK_free_description +#define jack_get_properties WJACK_get_properties +#define jack_get_all_properties WJACK_get_all_properties +#define jack_remove_property WJACK_remove_property +#define jack_remove_properties WJACK_remove_properties +#define jack_remove_all_properties WJACK_remove_all_properties +#define jack_set_property_change_callback WJACK_set_property_change_callback +#endif + #endif // end USE_WEAK_JACK #include <jack/jack.h> @@ -162,6 +175,9 @@ int have_libjack(void); #include <jack/midiport.h> #include <jack/session.h> #include <jack/thread.h> +#if 0 +#include <jack/metadata.h> +#endif #ifdef USE_WEAK_JACK diff --git a/libs/backends/jack/wscript b/libs/backends/jack/wscript index 033024c710..5cf7e91f02 100644 --- a/libs/backends/jack/wscript +++ b/libs/backends/jack/wscript @@ -44,7 +44,7 @@ def configure(conf): def build(bld): - obj = bld(features = 'cxx cxxshlib') + obj = bld(features = 'c cxx cxxshlib') obj.source = [ 'jack_api.cc', 'jack_connection.cc', diff --git a/libs/canvas/canvas.cc b/libs/canvas/canvas.cc index aebc601620..35fe31041d 100644 --- a/libs/canvas/canvas.cc +++ b/libs/canvas/canvas.cc @@ -775,7 +775,7 @@ GtkCanvas::on_expose_event (GdkEventExpose* ev) render (Rect (ev->area.x, ev->area.y, ev->area.x + ev->area.width, ev->area.y + ev->area.height), draw_context); -#ifdef USE_CAIRO_IMAGE_SURFACE_FOR_GTK_CANVAS +#ifdef USE_CAIRO_IMAGE_SURFACE /* now blit our private surface back to the GDK one */ window_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height); diff --git a/libs/evoral/evoral/PatchChange.hpp b/libs/evoral/evoral/PatchChange.hpp index e05157aa92..48ed0f9c13 100644 --- a/libs/evoral/evoral/PatchChange.hpp +++ b/libs/evoral/evoral/PatchChange.hpp @@ -147,8 +147,7 @@ public: case 2: return _program_change; default: - abort (); - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return _program_change; } } diff --git a/libs/evoral/evoral/Sequence.hpp b/libs/evoral/evoral/Sequence.hpp index 280fc600de..484afa8459 100644 --- a/libs/evoral/evoral/Sequence.hpp +++ b/libs/evoral/evoral/Sequence.hpp @@ -136,7 +136,6 @@ public: inline bool operator()(const boost::shared_ptr< const Note<Time> > a, const boost::shared_ptr< const Note<Time> > b) const { return musical_time_greater_than (a->time(), b->time()); - return a->time() > b->time(); } }; diff --git a/libs/evoral/src/ControlList.cpp b/libs/evoral/src/ControlList.cpp index 3f70cde274..deabd9d1cc 100644 --- a/libs/evoral/src/ControlList.cpp +++ b/libs/evoral/src/ControlList.cpp @@ -1199,7 +1199,7 @@ ControlList::unlocked_eval (double x) const return multipoint_eval (x); } - /*NOTREACHED*/ /* stupid gcc */ + abort(); /*NOTREACHED*/ /* stupid gcc */ return _default_value; } diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp index 7084a90491..1cc8ff6e0f 100644 --- a/libs/evoral/src/Sequence.cpp +++ b/libs/evoral/src/Sequence.cpp @@ -905,7 +905,7 @@ Sequence<Time>::append(const Event<Time>& event, event_id_t evid) const MIDIEvent<Time>& ev = (const MIDIEvent<Time>&)event; - assert(_notes.empty() || ev.time() >= (*_notes.rbegin())->time()); + assert(_notes.empty() || musical_time_greater_or_equal_to(ev.time(), (*_notes.rbegin())->time())); assert(_writing); if (!midi_event_is_valid(ev.buffer(), ev.size())) { @@ -1052,7 +1052,7 @@ Sequence<Time>::append_note_off_unlocked (NotePtr note) NotePtr nn = *n; if (note->note() == nn->note() && nn->channel() == note->channel()) { - assert(note->time() >= nn->time()); + assert(musical_time_greater_or_equal_to(note->time(), nn->time())); nn->set_length (note->time() - nn->time()); nn->set_off_velocity (note->velocity()); @@ -1215,7 +1215,7 @@ Sequence<Time>::note_lower_bound (Time t) const { NotePtr search_note(new Note<Time>(0, t, 0, 0, 0)); typename Sequence<Time>::Notes::const_iterator i = _notes.lower_bound(search_note); - assert(i == _notes.end() || (*i)->time() >= t); + assert(i == _notes.end() || musical_time_greater_or_equal_to((*i)->time(), t)); return i; } @@ -1237,7 +1237,7 @@ Sequence<Time>::sysex_lower_bound (Time t) const { SysExPtr search (new Event<Time> (0, t)); typename Sequence<Time>::SysExes::const_iterator i = _sysexes.lower_bound (search); - assert (i == _sysexes.end() || (*i)->time() >= t); + assert (i == _sysexes.end() || musical_time_greater_or_equal_to((*i)->time(), t)); return i; } @@ -1250,7 +1250,7 @@ Sequence<Time>::note_lower_bound (Time t) { NotePtr search_note(new Note<Time>(0, t, 0, 0, 0)); typename Sequence<Time>::Notes::iterator i = _notes.lower_bound(search_note); - assert(i == _notes.end() || (*i)->time() >= t); + assert(i == _notes.end() || musical_time_greater_or_equal_to((*i)->time(), t)); return i; } @@ -1272,7 +1272,7 @@ Sequence<Time>::sysex_lower_bound (Time t) { SysExPtr search (new Event<Time> (0, t)); typename Sequence<Time>::SysExes::iterator i = _sysexes.lower_bound (search); - assert (i == _sysexes.end() || (*i)->time() >= t); + assert (i == _sysexes.end() || musical_time_greater_or_equal_to((*i)->time(), t)); return i; } @@ -1346,8 +1346,7 @@ Sequence<Time>::get_notes_by_pitch (Notes& n, NoteOperator op, uint8_t val, int default: //fatal << string_compose (_("programming error: %1 %2", X_("get_notes_by_pitch() called with illegal operator"), op)) << endmsg; - abort (); - /* NOTREACHED*/ + abort(); /* NOTREACHED*/ } } } @@ -1392,8 +1391,7 @@ Sequence<Time>::get_notes_by_velocity (Notes& n, NoteOperator op, uint8_t val, i break; default: // fatal << string_compose (_("programming error: %1 %2", X_("get_notes_by_velocity() called with illegal operator"), op)) << endmsg; - abort (); - /* NOTREACHED*/ + abort(); /* NOTREACHED*/ } } diff --git a/libs/fst/wscript b/libs/fst/wscript index 91273f3d79..5eb1d512df 100644 --- a/libs/fst/wscript +++ b/libs/fst/wscript @@ -51,7 +51,7 @@ def build(bld): obj.source = 'scanner.wine' obj.target = 'ardour-vst-scanner' obj.chmod = Utils.O755 - obj.install_path = os.path.join(bld.env['LIBDIR'], 'fst') + obj.install_path = os.path.join(bld.env['LIBDIR']) obj.dict = { 'VERSION' : bld.env['VERSION'], } @@ -83,4 +83,4 @@ def build(bld): 'VST_SCANNER_APP', 'PACKAGE="' + I18N_PACKAGE + '"', ] - obj.install_path = os.path.join(bld.env['LIBDIR'], 'fst') + obj.install_path = os.path.join(bld.env['LIBDIR']) diff --git a/libs/gtkmm2ext/actions.cc b/libs/gtkmm2ext/actions.cc index 5f853b0170..666ac29c5c 100644 --- a/libs/gtkmm2ext/actions.cc +++ b/libs/gtkmm2ext/actions.cc @@ -490,7 +490,7 @@ ActionManager::set_toggleaction_state (string n, bool s) if (last_slash == 0) { fatal << string_compose ("programmer error: %1 %2", "illegal toggle action name", name) << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return; } diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc index 6a490e1bb0..df7ec96324 100644 --- a/libs/gtkmm2ext/gtk_ui.cc +++ b/libs/gtkmm2ext/gtk_ui.cc @@ -81,7 +81,7 @@ UI::UI (string namestr, int *argc, char ***argv) theGtkUI = this; } else { fatal << "duplicate UI requested" << endmsg; - /* NOTREACHED */ + abort(); /* NOTREACHED */ } /* the GUI event loop runs in the main thread of the app, diff --git a/libs/midi++2/mtc.cc b/libs/midi++2/mtc.cc index 1a477c3b8c..e2a018ca51 100644 --- a/libs/midi++2/mtc.cc +++ b/libs/midi++2/mtc.cc @@ -285,7 +285,7 @@ Parser::process_mtc_quarter_frame (MIDI::byte *msg) break; default: - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ break; } diff --git a/libs/pbd/pool.cc b/libs/pbd/pool.cc index cdcd9abdd7..234dfaeb18 100644 --- a/libs/pbd/pool.cc +++ b/libs/pbd/pool.cc @@ -70,7 +70,7 @@ Pool::alloc () if (free_list.read (&ptr, 1) < 1) { fatal << "CRITICAL: " << _name << " POOL OUT OF MEMORY - RECOMPILE WITH LARGER SIZE!!" << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return 0; } else { return ptr; @@ -184,7 +184,7 @@ PerThreadPool::per_thread_pool () CrossThreadPool* p = _key.get(); if (!p) { fatal << "programming error: no per-thread pool \"" << _name << "\" for thread " << pthread_name() << endmsg; - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ } return p; } diff --git a/libs/vfork/wscript b/libs/vfork/wscript index 10f11149d8..8f4efbe0c7 100644 --- a/libs/vfork/wscript +++ b/libs/vfork/wscript @@ -21,7 +21,7 @@ def build(bld): obj = bld (features = 'c cprogram') obj.source = 'exec_wrapper.c' obj.target = 'ardour-exec-wrapper' - obj.install_path = os.path.join(bld.env['LIBDIR'], 'vfork') + obj.install_path = os.path.join(bld.env['LIBDIR']) obj.defines = [ '_POSIX_SOURCE', '_XOPEN_SOURCE=500', diff --git a/tools/linux_packaging/build b/tools/linux_packaging/build index 72b7bf3893..132d9449f3 100755 --- a/tools/linux_packaging/build +++ b/tools/linux_packaging/build @@ -391,7 +391,7 @@ done cp $BUILD_ROOT/libs/panners/*/lib*.so* $Panners # Backends -for backend in jack wavesaudio ; do +for backend in jack alsa dummy wavesaudio ; do cp $BUILD_ROOT/libs/backends/$backend/lib*.so* $Backends done @@ -418,7 +418,7 @@ fi # vfork wrapper if test -f $BUILD_ROOT/libs/vfork/ardour-exec-wrapper ; then - cp $BUILD_ROOT/libs/vfork/ardour-exec-wrapper $VFork + cp $BUILD_ROOT/libs/vfork/ardour-exec-wrapper $APPLIB fi # ALSA device reservation tool (if available) diff --git a/tools/linux_packaging/stage2.run b/tools/linux_packaging/stage2.run index e98810e820..6af5b34181 100755 --- a/tools/linux_packaging/stage2.run +++ b/tools/linux_packaging/stage2.run @@ -101,6 +101,7 @@ SystemInstall () ######################################################################## # Main ######################################################################## +umask 0022 # If you double click a script, some systems don't get the PWD correct. # Force it to be correct @@ -158,6 +159,8 @@ if [ "$(id -u)" != "0" ]; then exit 1 fi exit + else + sudo -k # make sudo forget about cached credentials fi if ! sudo date; diff --git a/tools/linux_packaging/uninstall.sh.in b/tools/linux_packaging/uninstall.sh.in index 795c5d317d..c1d6cf561e 100644 --- a/tools/linux_packaging/uninstall.sh.in +++ b/tools/linux_packaging/uninstall.sh.in @@ -67,6 +67,8 @@ if [ "$(id -u)" != "0" ]; then exit 1 fi exit + else + sudo -k # make sudo forget about cached credentials fi if ! sudo date; diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build index ba503d14c7..3e9f2945a9 100755 --- a/tools/osx_packaging/osx_build +++ b/tools/osx_packaging/osx_build @@ -110,7 +110,6 @@ ExportFormats=$Shared/export Templates=$Shared/templates PatchFiles=$Shared/patchfiles MackieControl=$Shared/mcp -VFork=$Frameworks/vfork if [ x$PRINT_SYSDEPS != x ] ; then # @@ -147,7 +146,6 @@ mkdir -p $Frameworks/modules mkdir -p $Etc mkdir -p $MackieControl mkdir -p $PatchFiles -mkdir -p $VFork # maybe set variables env="" @@ -393,13 +391,13 @@ fi # VST scanner app and wrapper script, if they exist if test -d $BUILD_ROOT/libs/fst ; then - cp $BUILD_ROOT/libs/fst/ardour-vst-scanner* $Frameworks/ || true + cp $BUILD_ROOT/libs/fst/ardour-vst-scanner* $Frameworks/ fi # vfork wrapper if test -f $BUILD_ROOT/libs/vfork/ardour-exec-wrapper ; then mkdir -p $Frameworks/vfork - cp $BUILD_ROOT/libs/vfork/ardour-exec-wrapper $VFork + cp $BUILD_ROOT/libs/vfork/ardour-exec-wrapper $Frameworks/ fi diff --git a/tools/sanity_check/systemtest.cpp b/tools/sanity_check/systemtest.cpp index 025eb0ef25..b7c04a2031 100644 --- a/tools/sanity_check/systemtest.cpp +++ b/tools/sanity_check/systemtest.cpp @@ -169,6 +169,7 @@ int system_user_in_group(const char *name) { gid = get_group_by_name(name); if (0==gid) { fprintf(stderr, "No %s group found\n", name); + free(list); return 0; } @@ -373,6 +373,10 @@ def set_compiler_flags (conf,opt): compiler_flags.extend(('-arch', 'i386')) linker_flags.extend(('-arch', 'i386')) + if opt.ppc: + compiler_flags.extend(('-arch', 'ppc')) + linker_flags.extend(('-arch', 'ppc')) + # # warnings flags # @@ -502,6 +506,8 @@ def options(opt): # help='Compile with support for Frontier Designs Tranzport (if libusb is available)') opt.add_option('--generic', action='store_true', default=False, dest='generic', help='Compile with -arch i386 (OS X ONLY)') + opt.add_option('--ppc', action='store_true', default=False, dest='ppc', + help='Compile with -arch ppc (OS X ONLY)') opt.add_option('--versioned', action='store_true', default=False, dest='versioned', help='Add revision information to executable name inside the build directory') opt.add_option('--windows-vst', action='store_true', default=False, dest='windows_vst', @@ -856,7 +862,8 @@ const char* const ardour_config_info = "\\n\\ write_config_text('Translation', opts.nls) # write_config_text('Tranzport', opts.tranzport) write_config_text('Unit tests', conf.env['BUILD_TESTS']) - write_config_text('Generic x86 CPU', opts.generic) + write_config_text('Mac i386 Architecture', opts.generic) + write_config_text('Mac ppc Architecture', opts.ppc) write_config_text('Waves Backend', opts.build_wavesbackend) write_config_text('Windows VST support', opts.windows_vst) write_config_text('Wiimote support', conf.is_defined('BUILD_WIIMOTE')) |