From 69ac5b3c33af095ef198ea0a726d56a6a3adea68 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 30 Oct 2009 02:52:55 +0000 Subject: lots of deep but hard to spot changes to transport control, primarily relating to looping and transitions between loop, play-range and regular roll/stop ; add GUI option for seamless looping control (under Options). Needs to be forward ported to 3.0. Please TEST THE HELL out of this one - changes were deeper and wider than i would like, but did consolidate some of the GUI transport control code in a good way git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@5976 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour.menus.in | 1 + gtk2_ardour/ardour_ui.cc | 160 ++++++++++++++++++++++++++++++++------- gtk2_ardour/ardour_ui.h | 7 +- gtk2_ardour/ardour_ui2.cc | 60 --------------- gtk2_ardour/ardour_ui_dialogs.cc | 2 +- gtk2_ardour/ardour_ui_ed.cc | 6 +- gtk2_ardour/ardour_ui_options.cc | 25 +++--- gtk2_ardour/editor.h | 1 - gtk2_ardour/editor_ops.cc | 28 ------- gtk2_ardour/public_editor.h | 1 - 10 files changed, 150 insertions(+), 141 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 606b79f26e..eb87c2c92e 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -549,6 +549,7 @@ + diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index eaa1e1d0c8..41f4fbcec2 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1449,35 +1449,102 @@ ARDOUR_UI::transport_record (bool roll) //cerr << "ARDOUR_UI::transport_record () called roll = " << roll << " session->record_status() = " << session->record_status() << endl; } -void +void ARDOUR_UI::transport_roll () { - bool rolling; - if (!session) { return; } - rolling = session->transport_rolling (); + if (session->is_auditioning()) { + return; + } + + switch (Config->get_slave_source()) { + case None: + case JACK: + break; + default: + /* transport controlled by the master */ + return; + } - //cerr << "ARDOUR_UI::transport_roll () called session->record_status() = " << session->record_status() << endl; + bool rolling = session->transport_rolling(); + bool relocate = true; if (session->get_play_loop()) { - // session->request_play_loop (false); - auto_loop_button.set_visual_state (1); - roll_button.set_visual_state (1); + session->request_play_loop (false, true); + relocate = false; } else if (session->get_play_range ()) { - session->request_play_range (false); - play_selection_button.set_visual_state (0); - } else if (rolling) { - session->request_locate (session->last_transport_start(), true); + session->request_play_range (false, true); + relocate = false; + } + + if (rolling) { + if (relocate) { + session->request_locate (session->last_transport_start(), true); + } + } else { + session->request_transport_speed (1.0f); + } + + map_transport_state (); +} + +void +ARDOUR_UI::toggle_roll (bool with_abort) +{ + + if (!session) { + return; + } + + if (session->is_auditioning()) { + session->cancel_audition (); + return; + } + + switch (Config->get_slave_source()) { + case None: + case JACK: + break; + default: + /* transport controlled by the master */ + return; + } + + bool rolling = session->transport_rolling(); + bool affect_transport = true; + + if (rolling) { + /* drop out of loop/range playback but leave transport rolling */ + if (session->get_play_loop()) { + affect_transport = false; + session->request_play_loop (false, true); + } else if (session->get_play_range ()) { + affect_transport = false; + session->request_play_range (false, true); + } + } + + if (affect_transport) { + + if (rolling) { + session->request_locate (session->last_transport_start(), true); + } + + if (rolling) { + session->request_stop (with_abort); + } else { + session->request_transport_speed (1.0f); + } } - session->request_transport_speed (1.0f); + map_transport_state (); } void -ARDOUR_UI::transport_loop() +ARDOUR_UI::toggle_session_auto_loop () { if (session) { if (session->get_play_loop()) { @@ -1486,10 +1553,14 @@ ARDOUR_UI::transport_loop() if (looploc) { session->request_locate (looploc->start(), true); } + } else { + session->request_play_loop (false); + } + } else { + Location * looploc = session->locations()->auto_loop_location(); + if (looploc) { + session->request_play_loop (true); } - } - else { - session->request_play_loop (true); } } } @@ -1501,10 +1572,6 @@ ARDOUR_UI::transport_play_selection () return; } - if (!session->get_play_range()) { - session->request_stop (); - } - editor->play_selection (); } @@ -1593,17 +1660,56 @@ ARDOUR_UI::queue_transport_change () void ARDOUR_UI::map_transport_state () { + if (!session) { + auto_loop_button.set_visual_state (0); + play_selection_button.set_visual_state (0); + roll_button.set_visual_state (0); + stop_button.set_visual_state (1); + return; + } + float sp = session->transport_speed(); if (sp == 1.0f) { - transport_rolling (); - } else if (sp < 0.0f) { - transport_rewinding (); - } else if (sp > 0.0f) { - transport_forwarding (); + shuttle_fract = SHUTTLE_FRACT_SPEED1; /* speed = 1.0, believe it or not */ + shuttle_box.queue_draw (); + } else if (sp == 0.0f) { + shuttle_fract = 0; + shuttle_box.queue_draw (); + update_disk_space (); + } + + if (sp != 0.0) { + + if (session->get_play_range()) { + + play_selection_button.set_visual_state (1); + roll_button.set_visual_state (0); + auto_loop_button.set_visual_state (0); + + } else if (session->get_play_loop ()) { + + auto_loop_button.set_visual_state (1); + play_selection_button.set_visual_state (0); + roll_button.set_visual_state (0); + + } else { + + roll_button.set_visual_state (1); + play_selection_button.set_visual_state (0); + auto_loop_button.set_visual_state (0); + } + + stop_button.set_visual_state (0); + } else { - transport_stopped (); + + stop_button.set_visual_state (1); + roll_button.set_visual_state (0); + play_selection_button.set_visual_state (0); + auto_loop_button.set_visual_state (0); } + } void diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 6da33722f6..03d433351a 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -578,11 +578,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI void transport_forward (int option); void transport_rewind (int option); void transport_loop (); - - void transport_rolling (); - void transport_rewinding (); - void transport_forwarding (); - void transport_stopped (); + void toggle_roll (bool with_abort); bool _session_is_new; void connect_to_session (ARDOUR::Session *); @@ -714,6 +710,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI void set_remote_model (ARDOUR::RemoteModel); void set_denormal_model (ARDOUR::DenormalModel); + void toggle_seamless_loop (); void toggle_sync_order_keys (); void toggle_new_plugins_active(); void toggle_StopPluginsWithTransport(); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 374de94048..06efb00c62 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -125,66 +125,6 @@ ARDOUR_UI::display_message (const char *prefix, gint prefix_len, RefPtrget_play_range()) { - play_selection_button.set_visual_state (1); - roll_button.set_visual_state (0); - auto_loop_button.set_visual_state (0); - - } else if (session->get_play_loop ()) { - auto_loop_button.set_visual_state (1); - play_selection_button.set_visual_state (0); - roll_button.set_visual_state (0); - - } else { - - roll_button.set_visual_state (1); - play_selection_button.set_visual_state (0); - auto_loop_button.set_visual_state (0); - } - - /* reset shuttle controller */ - - shuttle_fract = SHUTTLE_FRACT_SPEED1; /* speed = 1.0, believe it or not */ - shuttle_box.queue_draw (); -} - -void -ARDOUR_UI::transport_rewinding () -{ - stop_button.set_visual_state (0); - roll_button.set_visual_state (1); - play_selection_button.set_visual_state (0); - auto_loop_button.set_visual_state (0); -} - -void -ARDOUR_UI::transport_forwarding () -{ - stop_button.set_visual_state (0); - roll_button.set_visual_state (1); - play_selection_button.set_visual_state (0); - auto_loop_button.set_visual_state (0); -} - void ARDOUR_UI::setup_transport () { diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index b96e832a0e..d4c4ce8113 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -156,7 +156,7 @@ ARDOUR_UI::connect_to_session (Session *s) start_clocking (); start_blinking (); - transport_stopped (); + map_transport_state (); second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_second), 1000); point_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100); diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 929f87ffc2..ad1dda3de5 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -249,10 +249,10 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), bind (mem_fun (*editor, &PublicEditor::toggle_playback), false)); + ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), bind (mem_fun (*this, &ARDOUR_UI::toggle_roll), false)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop + Forget Capture"), bind (mem_fun(*editor, &PublicEditor::toggle_playback), true)); + ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop + Forget Capture"), bind (mem_fun(*this, &ARDOUR_UI::toggle_roll), true)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); @@ -445,6 +445,8 @@ ARDOUR_UI::install_actions () act = ActionManager::register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI feedback"), mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback)); ActionManager::session_sensitive_actions.push_back (act); + act = ActionManager::register_toggle_action (option_actions, X_("toggle-seamless-loop"), _("Seamless Looping"), mem_fun (*this, &ARDOUR_UI::toggle_seamless_loop)); + act = ActionManager::register_toggle_action (option_actions, X_("UseOSC"), _("Use OSC"), mem_fun (*this, &ARDOUR_UI::toggle_use_osc)); #ifndef HAVE_LIBLO act->set_sensitive (false); diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 92454c3253..2ce5eb9bdc 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -70,6 +70,12 @@ ARDOUR_UI::toggle_use_osc () ActionManager::toggle_config_state ("options", "UseOSC", &Configuration::set_use_osc, &Configuration::get_use_osc); } +void +ARDOUR_UI::toggle_seamless_loop () +{ + ActionManager::toggle_config_state ("options", "toggle-seamless-loop", &Configuration::set_seamless_loop, &Configuration::get_seamless_loop); +} + void ARDOUR_UI::toggle_send_midi_feedback () { @@ -371,22 +377,6 @@ ARDOUR_UI::toggle_click () ActionManager::toggle_config_state ("Transport", "ToggleClick", &Configuration::set_clicking, &Configuration::get_clicking); } -void -ARDOUR_UI::toggle_session_auto_loop () -{ - if (session) { - if (session->get_play_loop()) { - if (session->transport_rolling()) { - transport_roll(); - } else { - session->request_play_loop (false); - } - } else { - session->request_play_loop (true); - } - } -} - void ARDOUR_UI::unset_dual_punch () { @@ -1170,6 +1160,9 @@ ARDOUR_UI::parameter_changed (const char* parameter_name) ActionManager::map_some_state ("options", "UseOSC", &Configuration::get_use_osc); + } else if (PARAM_IS ("seamless-loop")) { + ActionManager::map_some_state ("options", "toggle-seamless-loop", &Configuration::get_seamless_loop); + } else if (PARAM_IS ("mmc-control")) { ActionManager::map_some_state ("options", "UseMMC", &Configuration::get_mmc_control); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index c1077b4f1b..3a246e2f2d 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -194,7 +194,6 @@ class Editor : public PublicEditor void separate_region_from_punch (); void separate_region_from_loop (); void separate_regions_using_location (ARDOUR::Location&); - void toggle_playback (bool with_abort); void transition_to_rolling (bool forward); /* undo related */ diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index d5fac43bc6..8669b44a7a 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -2385,34 +2385,6 @@ Editor::transition_to_rolling (bool fwd) session->request_transport_speed (fwd ? 1.0f : -1.0f); } -void -Editor::toggle_playback (bool with_abort) -{ - if (!session) { - return; - } - - switch (Config->get_slave_source()) { - case None: - case JACK: - break; - default: - /* transport controlled by the master */ - return; - } - - if (session->is_auditioning()) { - session->cancel_audition (); - return; - } - - if (session->transport_rolling()) { - session->request_stop (with_abort); - } else { - session->request_transport_speed (1.0f); - } -} - void Editor::play_from_start () { diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index d876a605bc..737ae75f6f 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -109,7 +109,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway virtual bool show_waveforms_recording() const = 0; virtual void new_region_from_selection () = 0; virtual void separate_region_from_selection () = 0; - virtual void toggle_playback (bool with_abort) = 0; virtual void transition_to_rolling (bool fwd) = 0; virtual nframes64_t unit_to_frame (double unit) const = 0; // XXX remove me when libardour goes nframes64_t -- cgit v1.2.3