summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2009-10-30 02:52:55 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2009-10-30 02:52:55 +0000
commit69ac5b3c33af095ef198ea0a726d56a6a3adea68 (patch)
tree7e03ddfd5e16287c4d8250664b4df77e1a0ab886 /gtk2_ardour
parent2442aa577ac4a717d9cdc88aaf2d14657906ecaf (diff)
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
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardour.menus.in1
-rw-r--r--gtk2_ardour/ardour_ui.cc160
-rw-r--r--gtk2_ardour/ardour_ui.h7
-rw-r--r--gtk2_ardour/ardour_ui2.cc60
-rw-r--r--gtk2_ardour/ardour_ui_dialogs.cc2
-rw-r--r--gtk2_ardour/ardour_ui_ed.cc6
-rw-r--r--gtk2_ardour/ardour_ui_options.cc25
-rw-r--r--gtk2_ardour/editor.h1
-rw-r--r--gtk2_ardour/editor_ops.cc28
-rw-r--r--gtk2_ardour/public_editor.h1
10 files changed, 150 insertions, 141 deletions
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 @@
</menu>
</menu>
<menu action='MiscOptions'>
+ <menuitem action='toggle-seamless-loop'/>
<menuitem action='UseOSC'/>
<menuitem action='NewPluginsActive'/>
<menuitem action='LatchedRecordEnable'/>
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
@@ -126,66 +126,6 @@ ARDOUR_UI::display_message (const char *prefix, gint prefix_len, RefPtr<TextBuff
}
void
-ARDOUR_UI::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);
-
- shuttle_fract = 0;
- shuttle_box.queue_draw ();
-
- update_disk_space ();
-}
-
-void
-ARDOUR_UI::transport_rolling ()
-{
- stop_button.set_visual_state (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);
- }
-
- /* 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 ()
{
transport_tearoff = manage (new TearOff (transport_tearoff_hbox));
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
@@ -71,6 +71,12 @@ ARDOUR_UI::toggle_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 ()
{
ActionManager::toggle_config_state ("options", "SendMIDIfeedback", &Configuration::set_midi_feedback, &Configuration::get_midi_feedback);
@@ -372,22 +378,6 @@ ARDOUR_UI::toggle_click ()
}
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 ()
{
Glib::RefPtr<Action> action = ActionManager::get_action ("Transport", "TogglePunch");
@@ -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
@@ -2386,34 +2386,6 @@ Editor::transition_to_rolling (bool fwd)
}
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 ()
{
session->request_locate (session->current_start_frame(), true);
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