From 4c6b2c7eb7fa4b8fffe8ea9cbc5eb775f6b12cd8 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 19 Feb 2007 17:30:47 +0000 Subject: [PATCH] remote control IDs follow editor/mixer view order; fix multiple display of disk over/under run errors; don't show automation editing cursor unless you actually edit it git-svn-id: svn://localhost/ardour2/trunk@1474 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour.menus | 8 +++- gtk2_ardour/ardour_ui.cc | 40 +++++++--------- gtk2_ardour/ardour_ui.h | 9 ++-- gtk2_ardour/ardour_ui_dialogs.cc | 7 +++ gtk2_ardour/ardour_ui_ed.cc | 9 ++++ gtk2_ardour/ardour_ui_options.cc | 62 +++++++++++++++++++++++++ gtk2_ardour/editor_mouse.cc | 50 +++++++++++--------- gtk2_ardour/editor_route_list.cc | 2 + gtk2_ardour/mixer_ui.cc | 2 + gtk2_ardour/route_ui.cc | 10 ++++ libs/ardour/ardour/configuration_vars.h | 1 + libs/ardour/ardour/session.h | 2 + libs/ardour/ardour/types.h | 7 +++ libs/ardour/enums.cc | 6 +++ libs/ardour/globals.cc | 1 + libs/ardour/session.cc | 21 +++++++++ libs/ardour/session_state.cc | 2 + 17 files changed, 186 insertions(+), 53 deletions(-) diff --git a/gtk2_ardour/ardour.menus b/gtk2_ardour/ardour.menus index ba007e5cae..c826b40bc3 100644 --- a/gtk2_ardour/ardour.menus +++ b/gtk2_ardour/ardour.menus @@ -291,8 +291,12 @@ - - + + + + + + diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index febdbab088..ecf60acaa1 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -180,8 +180,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) location_ui = 0; open_session_selector = 0; have_configure_timeout = false; - have_disk_overrun_displayed = false; - have_disk_underrun_displayed = false; + have_disk_speed_dialog_displayed = false; _will_create_new_session_automatically = false; session_loaded = false; last_speed_displayed = -1.0f; @@ -2366,18 +2365,18 @@ ARDOUR_UI::halt_on_xrun_message () void ARDOUR_UI::disk_overrun_handler () { - ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler)); + ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler)); - if (!have_disk_overrun_displayed) { - have_disk_overrun_displayed = true; - MessageDialog msg (*editor, X_("diskrate dialog"), _("\ + if (!have_disk_speed_dialog_displayed) { + have_disk_speed_dialog_displayed = true; + MessageDialog* msg = new MessageDialog (*editor, X_("diskrate dialog"), _("\ The disk system on your computer\n\ was not able to keep up with Ardour.\n\ \n\ Specifically, it failed to write data to disk\n\ quickly enough to keep up with recording.\n")); - msg.run (); - have_disk_overrun_displayed = false; + msg->signal_response().connect (bind (mem_fun (*this, &ARDOUR_UI::disk_speed_dialog_gone), msg)); + msg->show_all (); } } @@ -2386,29 +2385,24 @@ ARDOUR_UI::disk_underrun_handler () { ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler)); - if (!have_disk_underrun_displayed) { - have_disk_underrun_displayed = true; - MessageDialog msg (*editor, - (_("The disk system on your computer\n\ + if (!have_disk_speed_dialog_displayed) { + have_disk_speed_dialog_displayed = true; + MessageDialog* msg = new MessageDialog (*editor, + _("The disk system on your computer\n\ was not able to keep up with Ardour.\n\ \n\ Specifically, it failed to read data from disk\n\ -quickly enough to keep up with playback.\n"))); - msg.run (); - have_disk_underrun_displayed = false; +quickly enough to keep up with playback.\n")); + msg->signal_response().connect (bind (mem_fun (*this, &ARDOUR_UI::disk_speed_dialog_gone), msg)); + msg->show_all (); } } void -ARDOUR_UI::disk_underrun_message_gone () +ARDOUR_UI::disk_speed_dialog_gone (int ignored_response, MessageDialog* msg) { - have_disk_underrun_displayed = false; -} - -void -ARDOUR_UI::disk_overrun_message_gone () -{ - have_disk_underrun_displayed = false; + have_disk_speed_dialog_displayed = false; + delete msg; } int diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 4d8d82f31b..dfef964c67 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -645,11 +645,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI struct timeval last_peak_grab; struct timeval last_shuttle_request; - bool have_disk_overrun_displayed; - bool have_disk_underrun_displayed; - - void disk_overrun_message_gone (); - void disk_underrun_message_gone (); + bool have_disk_speed_dialog_displayed; + void disk_speed_dialog_gone (int ignored_response, Gtk::MessageDialog*); void disk_overrun_handler (); void disk_underrun_handler (); @@ -682,6 +679,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI void set_output_auto_connect (ARDOUR::AutoConnectOption); void set_solo_model (ARDOUR::SoloModel); void set_monitor_model (ARDOUR::MonitorModel); + void set_remote_model (ARDOUR::RemoteModel); void toggle_StopPluginsWithTransport(); void toggle_DoNotRunPluginsWhileRecording(); @@ -697,6 +695,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI void mtc_port_changed (); void map_solo_model (); void map_monitor_model (); + void map_remote_model (); void map_file_header_format (); void map_file_data_format (); void map_input_auto_connect (); diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 2f73e070ef..a0d772dbf1 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -62,6 +62,13 @@ ARDOUR_UI::connect_to_session (Session *s) ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false); } + if (!session->control_out()) { + Glib::RefPtr act = ActionManager::get_action (X_("options"), X_("SoloViaBus")); + if (act) { + act->set_sensitive (false); + } + } + /* allow wastebasket flush again */ Glib::RefPtr act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket")); diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index fa047d65d0..acd81c1ccf 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -470,6 +470,15 @@ ARDOUR_UI::install_actions () act = ActionManager::register_radio_action (option_actions, output_auto_connect_group, X_("OutputAutoConnectManual"), _("Manually connect outputs"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_output_auto_connect), (AutoConnectOption) 0))); ActionManager::session_sensitive_actions.push_back (act); + RadioAction::Group remote_group; + + act = ActionManager::register_radio_action (option_actions, remote_group, X_("RemoteUserDefined"), _("Remote ID assigned by User"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_remote_model), UserOrdered))); + ActionManager::session_sensitive_actions.push_back (act); + act = ActionManager::register_radio_action (option_actions, remote_group, X_("RemoteMixerDefined"), _("Remote ID follows order of Mixer"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_remote_model), MixerOrdered))); + ActionManager::session_sensitive_actions.push_back (act); + act = ActionManager::register_radio_action (option_actions, remote_group, X_("RemoteEditorDefined"), _("Remote ID follows order of Editor"), hide_return (bind (mem_fun (*this, &ARDOUR_UI::set_remote_model), EditorOrdered))); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::add_action_group (shuttle_actions); ActionManager::add_action_group (option_actions); ActionManager::add_action_group (jack_actions); diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index fec0f83752..b34825bff3 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -225,6 +225,39 @@ ARDOUR_UI::set_solo_model (SoloModel model) } +void +ARDOUR_UI::set_remote_model (RemoteModel model) +{ + const char* action = 0; + + switch (model) { + case UserOrdered: + action = X_("RemoteUserDefined"); + break; + case MixerOrdered: + action = X_("RemoteMixerDefined"); + break; + case EditorOrdered: + action = X_("RemoteEditorDefined"); + break; + + default: + fatal << string_compose (_("programming error: unknown remote model in ARDOUR_UI::set_remote_model: %1"), model) << endmsg; + /*NOTREACHED*/ + } + + Glib::RefPtr act = ActionManager::get_action ("options", action); + + if (act) { + Glib::RefPtr ract = Glib::RefPtr::cast_dynamic(act); + + if (ract && ract->get_active() && Config->get_remote_model() != model) { + Config->set_remote_model (model); + } + } + +} + void ARDOUR_UI::set_monitor_model (MonitorModel model) { @@ -477,6 +510,33 @@ ARDOUR_UI::map_monitor_model () } } +void +ARDOUR_UI::map_remote_model () +{ + const char* on = 0; + + switch (Config->get_remote_model()) { + case UserOrdered: + on = X_("RemoteUserDefined"); + break; + case MixerOrdered: + on = X_("RemoteMixerDefined"); + break; + case EditorOrdered: + on = X_("RemoteEditorDefined"); + break; + } + + Glib::RefPtr act = ActionManager::get_action ("options", on); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + + if (tact && !tact->get_active()) { + tact->set_active (true); + } + } +} + void ARDOUR_UI::map_file_header_format () { @@ -814,6 +874,8 @@ ARDOUR_UI::parameter_changed (const char* parameter_name) ActionManager::map_some_state ("options", "StopTransportAtEndOfSession", &Configuration::get_stop_at_session_end); } else if (PARAM_IS ("monitoring-model")) { map_monitor_model (); + } else if (PARAM_IS ("remote-model")) { + map_remote_model (); } else if (PARAM_IS ("use-video-sync")) { ActionManager::map_some_state ("Transport", "ToggleVideoSync", &Configuration::get_use_video_sync); } else if (PARAM_IS ("quieten-at-speed")) { diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 558d4b29da..8ed76b80ae 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1176,23 +1176,25 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ case GainAutomationControlPointItem: case PanAutomationControlPointItem: case RedirectAutomationControlPointItem: - cp = static_cast(item->get_data ("control_point")); - cp->set_visible (true); - - double at_x, at_y; - at_x = cp->get_x(); - at_y = cp->get_y (); - cp->item->i2w (at_x, at_y); - at_x += 20.0; - at_y += 20.0; + if (mouse_mode == MouseGain || mouse_mode == MouseObject) { + cp = static_cast(item->get_data ("control_point")); + cp->set_visible (true); - fraction = 1.0 - (cp->get_y() / cp->line.height()); - - set_verbose_canvas_cursor (cp->line.get_verbose_cursor_string (fraction), at_x, at_y); - show_verbose_canvas_cursor (); - - if (is_drawable()) { - track_canvas.get_window()->set_cursor (*fader_cursor); + double at_x, at_y; + at_x = cp->get_x(); + at_y = cp->get_y (); + cp->item->i2w (at_x, at_y); + at_x += 20.0; + at_y += 20.0; + + fraction = 1.0 - (cp->get_y() / cp->line.height()); + + set_verbose_canvas_cursor (cp->line.get_verbose_cursor_string (fraction), at_x, at_y); + show_verbose_canvas_cursor (); + + if (is_drawable()) { + track_canvas.get_window()->set_cursor (*fader_cursor); + } } break; @@ -1210,13 +1212,15 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ case GainAutomationLineItem: case RedirectAutomationLineItem: case PanAutomationLineItem: - { - ArdourCanvas::Line *line = dynamic_cast (item); - if (line) - line->property_fill_color_rgba() = color_map[cEnteredAutomationLine]; - } - if (is_drawable()) { - track_canvas.get_window()->set_cursor (*fader_cursor); + if (mouse_mode == MouseGain || mouse_mode == MouseObject) { + { + ArdourCanvas::Line *line = dynamic_cast (item); + if (line) + line->property_fill_color_rgba() = color_map[cEnteredAutomationLine]; + } + if (is_drawable()) { + track_canvas.get_window()->set_cursor (*fader_cursor); + } } break; diff --git a/gtk2_ardour/editor_route_list.cc b/gtk2_ardour/editor_route_list.cc index b0311d24a8..727d4a82f4 100644 --- a/gtk2_ardour/editor_route_list.cc +++ b/gtk2_ardour/editor_route_list.cc @@ -512,11 +512,13 @@ Editor::initial_route_list_display () void Editor::route_list_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter) { + session->set_remote_control_ids(); redisplay_route_list (); } void Editor::route_list_delete (const Gtk::TreeModel::Path& path) { + session->set_remote_control_ids(); redisplay_route_list (); } diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 4d13367cb6..2894456f9e 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -555,12 +555,14 @@ Mixer_UI::hide_all_audiotracks () void Mixer_UI::track_list_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter) { + session->set_remote_control_ids(); redisplay_track_list (); } void Mixer_UI::track_list_delete (const Gtk::TreeModel::Path& path) { + session->set_remote_control_ids(); redisplay_track_list (); } diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index cc8545ad61..c1e7e59afb 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -107,6 +107,8 @@ RouteUI::RouteUI (boost::shared_ptr rt, ARDOUR::Session& sess, co update_rec_display (); } + _route->RemoteControlIDChanged.connect (mem_fun(*this, &RouteUI::refresh_remote_control_menu)); + /* map the current state */ map_frozen (); @@ -478,6 +480,14 @@ RouteUI::build_remote_control_menu () void RouteUI::refresh_remote_control_menu () { + ENSURE_GUI_THREAD (mem_fun (*this, &RouteUI::refresh_remote_control_menu)); + + // only refresh the menu if it has been instantiated + + if (remote_control_menu == 0) { + return; + } + using namespace Menu_Helpers; RadioMenuItem::Group rc_group; diff --git a/libs/ardour/ardour/configuration_vars.h b/libs/ardour/ardour/configuration_vars.h index a779c77df7..c1e59baf35 100644 --- a/libs/ardour/ardour/configuration_vars.h +++ b/libs/ardour/ardour/configuration_vars.h @@ -24,6 +24,7 @@ CONFIG_VARIABLE (bool, midi_control, "midi-control", false) CONFIG_VARIABLE (uint32_t, feedback_interval_ms, "feedback-interval-ms", 100) CONFIG_VARIABLE (bool, use_tranzport, "use-tranzport", false) CONFIG_VARIABLE (std::string, mackie_emulation, "mackie-emulation", "mcu") +CONFIG_VARIABLE (RemoteModel, remote_model, "remote-model", MixerOrdered) /* disk operations */ diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index f4e5f3dedc..8341e94d82 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -476,6 +476,8 @@ class Session : public PBD::StatefulDestructible void resort_routes (); void resort_routes_using (boost::shared_ptr); + void set_remote_control_ids(); + AudioEngine &engine() { return _engine; }; int32_t max_level; diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 4fe8a54f71..d8c54df6bd 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -267,6 +267,12 @@ namespace ARDOUR { ExternalMonitoring, }; + enum RemoteModel { + UserOrdered, + MixerOrdered, + EditorOrdered, + }; + enum CrossfadeModel { FullCrossfade, ShortCrossfade @@ -349,6 +355,7 @@ std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf); std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf); std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf); std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf); +std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf); std::istream& operator>>(std::istream& o, ARDOUR::SoloModel& sf); std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf); std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeModel& sf); diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 0460df43d8..4220adf7eb 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -31,6 +31,7 @@ setup_enum_writer () RegionPoint _RegionPoint; Placement _Placement; MonitorModel _MonitorModel; + RemoteModel _RemoteModel; CrossfadeModel _CrossfadeModel; LayerModel _LayerModel; SoloModel _SoloModel; @@ -142,6 +143,11 @@ setup_enum_writer () REGISTER_ENUM (ExternalMonitoring); REGISTER (_MonitorModel); + REGISTER_ENUM (UserOrdered); + REGISTER_ENUM (MixerOrdered); + REGISTER_ENUM (EditorOrdered); + REGISTER (_RemoteModel); + REGISTER_ENUM (FullCrossfade); REGISTER_ENUM (ShortCrossfade); REGISTER (_CrossfadeModel); diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index c9e663e984..b000be377d 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -614,6 +614,7 @@ std::istream& operator>>(std::istream& o, HeaderFormat& var) { return int_to_typ std::istream& operator>>(std::istream& o, SampleFormat& var) { return int_to_type (o, var); } std::istream& operator>>(std::istream& o, AutoConnectOption& var) { return int_to_type (o, var); } std::istream& operator>>(std::istream& o, MonitorModel& var) { return int_to_type (o, var); } +std::istream& operator>>(std::istream& o, RemoteModel& var) { return int_to_type (o, var); } std::istream& operator>>(std::istream& o, EditMode& var) { return int_to_type (o, var); } std::istream& operator>>(std::istream& o, SoloModel& var) { return int_to_type (o, var); } std::istream& operator>>(std::istream& o, LayerModel& var) { return int_to_type (o, var); } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 2da80e28f7..e327d0eaa9 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -1770,6 +1770,27 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod return ret; } +void +Session::set_remote_control_ids () +{ + RemoteModel m = Config->get_remote_model(); + + shared_ptr r = routes.reader (); + + for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { + if ( MixerOrdered == m) { + long order = (*i)->order_key(N_("signal")); + (*i)->set_remote_control_id( order+1 ); + } else if ( EditorOrdered == m) { + long order = (*i)->order_key(N_("editor")); + (*i)->set_remote_control_id( order+1 ); + } else if ( UserOrdered == m) { + //do nothing ... only changes to remote id's are initiated by user + } + } +} + + Session::RouteList Session::new_audio_route (int input_channels, int output_channels, uint32_t how_many) { diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index b62f4f3896..861e03302f 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -3167,6 +3167,8 @@ Session::config_changed (const char* parameter_name) } else if (PARAM_IS ("slave-source")) { set_slave_source (Config->get_slave_source()); + } else if (PARAM_IS ("remote-model")) { + set_remote_control_ids (); } set_dirty ();