X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor.cc;h=c5d99c69bf1e58fc32156d172105b93cfdf737e4;hb=baf8f379677d6fea53d665aaff1945ccd896a6fe;hp=0afc797dc1e7df317a313359e516bb0d0959ad2b;hpb=2532911b18ff8b1c92c053a542fbd1d7eeed31de;p=ardour.git diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 0afc797dc1..c5d99c69bf 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -65,6 +65,7 @@ #include "gtkmm2ext/choice.h" #include "gtkmm2ext/cell_renderer_pixbuf_toggle.h" +#include "ardour/analysis_graph.h" #include "ardour/audio_track.h" #include "ardour/audioengine.h" #include "ardour/audioregion.h" @@ -102,10 +103,12 @@ #include "editor_routes.h" #include "editor_snapshots.h" #include "editor_summary.h" +#include "export_report.h" #include "global_port_matrix.h" #include "gui_object.h" #include "gui_thread.h" #include "keyboard.h" +#include "keyeditor.h" #include "luainstance.h" #include "marker.h" #include "midi_region_view.h" @@ -121,6 +124,7 @@ #include "rgb_macros.h" #include "rhythm_ferret.h" #include "selection.h" +#include "simple_progress_dialog.h" #include "sfdb_ui.h" #include "tempo_lines.h" #include "time_axis_view.h" @@ -387,7 +391,8 @@ Editor::Editor () , tempo_lines (0) , global_rect_group (0) , time_line_group (0) - , tempo_or_meter_marker_menu (0) + , tempo_marker_menu (0) + , meter_marker_menu (0) , marker_menu (0) , range_marker_menu (0) , transport_marker_menu (0) @@ -432,6 +437,7 @@ Editor::Editor () , show_gain_after_trim (false) , selection_op_cmd_depth (0) , selection_op_history_it (0) + , no_save_instant (false) , current_timefx (0) , current_mixer_strip (0) , show_editor_mixer_when_tracks_arrive (false) @@ -503,6 +509,7 @@ Editor::Editor () TimeAxisView::setup_sizes (); ArdourMarker::setup_sizes (timebar_height); + TempoCurve::setup_sizes (timebar_height); bbt_label.set_name ("EditorRulerLabel"); bbt_label.set_size_request (-1, (int)timebar_height); @@ -945,7 +952,7 @@ Editor::set_entered_track (TimeAxisView* tav) void Editor::instant_save () { - if (!constructed || !ARDOUR_UI::instance()->session_loaded) { + if (!constructed || !ARDOUR_UI::instance()->session_loaded || no_save_instant) { return; } @@ -1175,7 +1182,7 @@ Editor::generic_event_handler (GdkEvent* ev) /* leaving window, so reset focus, thus ending any and all text entry operations. */ - reset_focus(); + reset_focus (&contents()); break; } break; @@ -1360,6 +1367,7 @@ Editor::set_session (Session *t) _session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Editor::add_routes, this, _1), gui_context()); _session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::update_title, this), gui_context()); _session->tempo_map().PropertyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::tempo_map_changed, this, _1), gui_context()); + _session->tempo_map().MetricPositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::marker_position_changed, this), gui_context()); _session->Located.connect (_session_connections, invalidator (*this), boost::bind (&Editor::located, this), gui_context()); _session->config.ParameterChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::parameter_changed, this, _1), gui_context()); _session->StateSaved.connect (_session_connections, invalidator (*this), boost::bind (&Editor::session_state_saved, this, _1), gui_context()); @@ -1714,7 +1722,103 @@ Editor::build_track_region_context_menu () } void -Editor::analyze_region_selection () +Editor::loudness_analyze_region_selection () +{ + if (!_session) { + return; + } + Selection& s (PublicEditor::instance ().get_selection ()); + RegionSelection ars = s.regions; + ARDOUR::AnalysisGraph ag (_session); + framecnt_t total_work = 0; + + for (RegionSelection::iterator j = ars.begin (); j != ars.end (); ++j) { + AudioRegionView* arv = dynamic_cast (*j); + if (!arv) { + continue; + } + if (!boost::dynamic_pointer_cast (arv->region ())) { + continue; + } + assert (dynamic_cast (&arv->get_time_axis_view ())); + total_work += arv->region ()->length (); + } + + SimpleProgressDialog spd (_("Region Loudness Analysis"), sigc::mem_fun (ag, &AnalysisGraph::cancel)); + ScopedConnection c; + ag.set_total_frames (total_work); + ag.Progress.connect_same_thread (c, boost::bind (&SimpleProgressDialog::update_progress, &spd, _1, _2)); + spd.show(); + + for (RegionSelection::iterator j = ars.begin (); j != ars.end (); ++j) { + AudioRegionView* arv = dynamic_cast (*j); + if (!arv) { + continue; + } + boost::shared_ptr ar = boost::dynamic_pointer_cast (arv->region ()); + if (!ar) { + continue; + } + ag.analyze_region (ar); + } + spd.hide(); + if (!ag.canceled ()) { + ExportReport er (_("Audio Report/Analysis"), ag.results ()); + er.run(); + } +} + +void +Editor::loudness_analyze_range_selection () +{ + if (!_session) { + return; + } + Selection& s (PublicEditor::instance ().get_selection ()); + TimeSelection ts = s.time; + ARDOUR::AnalysisGraph ag (_session); + framecnt_t total_work = 0; + + for (TrackSelection::iterator i = s.tracks.begin (); i != s.tracks.end (); ++i) { + boost::shared_ptr pl = boost::dynamic_pointer_cast ((*i)->playlist ()); + if (!pl) { + continue; + } + RouteUI *rui = dynamic_cast (*i); + if (!pl || !rui) { + continue; + } + for (std::list::iterator j = ts.begin (); j != ts.end (); ++j) { + total_work += j->length (); + } + } + + SimpleProgressDialog spd (_("Range Loudness Analysis"), sigc::mem_fun (ag, &AnalysisGraph::cancel)); + ScopedConnection c; + ag.set_total_frames (total_work); + ag.Progress.connect_same_thread (c, boost::bind (&SimpleProgressDialog::update_progress, &spd, _1, _2)); + spd.show(); + + for (TrackSelection::iterator i = s.tracks.begin (); i != s.tracks.end (); ++i) { + boost::shared_ptr pl = boost::dynamic_pointer_cast ((*i)->playlist ()); + if (!pl) { + continue; + } + RouteUI *rui = dynamic_cast (*i); + if (!pl || !rui) { + continue; + } + ag.analyze_range (rui->route (), pl, ts); + } + spd.hide(); + if (!ag.canceled ()) { + ExportReport er (_("Audio Report/Analysis"), ag.results ()); + er.run(); + } +} + +void +Editor::spectral_analyze_region_selection () { if (analysis_window == 0) { analysis_window = new AnalysisWindow(); @@ -1732,7 +1836,7 @@ Editor::analyze_region_selection () } void -Editor::analyze_range_selection() +Editor::spectral_analyze_range_selection() { if (analysis_window == 0) { analysis_window = new AnalysisWindow(); @@ -1826,7 +1930,8 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items) edit_items.push_back (MenuElem (_("Zoom to Range"), sigc::bind (sigc::mem_fun(*this, &Editor::temporal_zoom_selection), false))); edit_items.push_back (SeparatorElem()); - edit_items.push_back (MenuElem (_("Spectral Analysis"), sigc::mem_fun(*this, &Editor::analyze_range_selection))); + edit_items.push_back (MenuElem (_("Loudness Analysis"), sigc::mem_fun(*this, &Editor::loudness_analyze_range_selection))); + edit_items.push_back (MenuElem (_("Spectral Analysis"), sigc::mem_fun(*this, &Editor::spectral_analyze_range_selection))); edit_items.push_back (SeparatorElem()); @@ -2033,6 +2138,37 @@ Editor::snap_type() const return _snap_type; } +bool +Editor::snap_musical() const +{ + switch (_snap_type) { + case SnapToBeatDiv128: + case SnapToBeatDiv64: + case SnapToBeatDiv32: + case SnapToBeatDiv28: + case SnapToBeatDiv24: + case SnapToBeatDiv20: + case SnapToBeatDiv16: + case SnapToBeatDiv14: + case SnapToBeatDiv12: + case SnapToBeatDiv10: + case SnapToBeatDiv8: + case SnapToBeatDiv7: + case SnapToBeatDiv6: + case SnapToBeatDiv5: + case SnapToBeatDiv4: + case SnapToBeatDiv3: + case SnapToBeatDiv2: + case SnapToBeat: + case SnapToBar: + return true; + default: + break; + } + + return false; +} + SnapMode Editor::snap_mode() const { @@ -2083,14 +2219,10 @@ Editor::set_snap_to (SnapType st) case SnapToBeatDiv4: case SnapToBeatDiv3: case SnapToBeatDiv2: { - ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin; - ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end; - - compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), - current_bbt_points_begin, current_bbt_points_end); - compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples(), - current_bbt_points_begin, current_bbt_points_end); - update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end); + std::vector grid; + compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + compute_bbt_ruler_scale (grid, leftmost_frame, leftmost_frame + current_page_samples()); + update_tempo_based_rulers (grid); break; } @@ -2186,8 +2318,9 @@ Editor::set_edit_point_preference (EditPoint ep, bool force) int Editor::set_state (const XMLNode& node, int version) { - const XMLProperty* prop; + XMLProperty const * prop; set_id (node); + PBD::Unwinder nsi (no_save_instant, true); Tabbable::set_state (node, version); @@ -2226,10 +2359,16 @@ Editor::set_state (const XMLNode& node, int version) if ((prop = node.property ("snap-to"))) { snap_type_selection_done ((SnapType) string_2_enum (prop->value(), _snap_type)); + set_snap_to ((SnapType) string_2_enum (prop->value(), _snap_type)); } if ((prop = node.property ("snap-mode"))) { snap_mode_selection_done((SnapMode) string_2_enum (prop->value(), _snap_mode)); + /* set text of Dropdown. in case _snap_mode == SnapOff (default) + * snap_mode_selection_done() will only mark an already active item as active + * which does not trigger set_text(). + */ + set_snap_mode ((SnapMode) string_2_enum (prop->value(), _snap_mode)); } if ((prop = node.property ("internal-snap-to"))) { @@ -3704,7 +3843,7 @@ bool Editor::edit_controls_button_release (GdkEventButton* ev) { if (Keyboard::is_context_menu_event (ev)) { - ARDOUR_UI::instance()->add_route (current_toplevel()); + ARDOUR_UI::instance()->add_route (); } else if (ev->button == 1) { selection->clear_tracks (); } @@ -3772,7 +3911,7 @@ Editor::pane_allocation_handler (Allocation &alloc, Paned* which) */ int pos; - XMLProperty* prop; + XMLProperty const * prop; char buf[32]; XMLNode* node = ARDOUR_UI::instance()->editor_settings(); @@ -3843,11 +3982,9 @@ Editor::set_show_measures (bool yn) tempo_lines->show(); } - ARDOUR::TempoMap::BBTPointList::const_iterator begin; - ARDOUR::TempoMap::BBTPointList::const_iterator end; - - compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), begin, end); - draw_measures (begin, end); + std::vector grid; + compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + draw_measures (grid); } instant_save (); @@ -3968,7 +4105,7 @@ Editor::get_grid_type_as_beats (bool& success, framepos_t position) return Evoral::Beats(1.0); case SnapToBar: if (_session) { - return Evoral::Beats(_session->tempo_map().meter_at (position).divisions_per_bar()); + return Evoral::Beats(_session->tempo_map().meter_at_frame (position).divisions_per_bar()); } break; default: @@ -4473,14 +4610,10 @@ Editor::visual_changer (const VisualChange& vc) compute_fixed_ruler_scale (); - ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin; - ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end; - - compute_current_bbt_points (vc.time_origin, pending_visual_change.time_origin + current_page_samples(), - current_bbt_points_begin, current_bbt_points_end); - compute_bbt_ruler_scale (vc.time_origin, pending_visual_change.time_origin + current_page_samples(), - current_bbt_points_begin, current_bbt_points_end); - update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end); + std::vector grid; + compute_current_bbt_points (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples()); + compute_bbt_ruler_scale (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples()); + update_tempo_based_rulers (grid); update_video_timeline(); } @@ -4798,7 +4931,7 @@ Editor::get_regions_from_selection_and_mouse (framepos_t pos) */ RegionSelection -Editor::get_regions_from_selection_and_entered () +Editor::get_regions_from_selection_and_entered () const { RegionSelection regions = selection->regions; @@ -5625,12 +5758,6 @@ Editor::session_going_away () SessionHandlePtr::session_going_away (); } -void -Editor::manage_action_scripts () -{ - ARDOUR_UI::instance()->lua_script_manager(); -} - void Editor::trigger_script (int i) { @@ -5645,9 +5772,14 @@ Editor::set_script_action_name (int i, const std::string& n) assert (act); if (n.empty ()) { act->set_label (string_compose (_("Unset #%1"), i + 1)); + act->set_tooltip (_("no action bound")); + act->set_sensitive (false); } else { act->set_label (n); + act->set_tooltip (n); + act->set_sensitive (true); } + KeyEditor::UpdateBindings (); } void