summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-01-08 02:56:49 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-01-08 02:56:49 +0000
commita20f41ab39cc034740ccd564c1057d8737d763d5 (patch)
tree6f713470d72ec04ad03efb1ad6380717476c29fd
parent1186b1d881fac3d1d1b55954b84b958c988501c4 (diff)
a metric ton of changes
git-svn-id: svn://localhost/trunk/ardour2@246 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/ardour-menus.xml63
-rw-r--r--gtk2_ardour/ardour.bindings13
-rw-r--r--gtk2_ardour/ardour_ui.cc98
-rw-r--r--gtk2_ardour/ardour_ui.h20
-rw-r--r--gtk2_ardour/ardour_ui2.cc16
-rw-r--r--gtk2_ardour/ardour_ui_dialogs.cc3
-rw-r--r--gtk2_ardour/ardour_ui_ed.cc2
-rw-r--r--gtk2_ardour/ardour_ui_options.cc312
-rw-r--r--gtk2_ardour/editor.cc51
-rw-r--r--gtk2_ardour/editor.h7
-rw-r--r--gtk2_ardour/editor_actions.cc69
-rw-r--r--gtk2_ardour/editor_mouse.cc3
-rw-r--r--gtk2_ardour/editor_ops.cc18
-rw-r--r--gtk2_ardour/mixer_strip.cc9
-rw-r--r--gtk2_ardour/mixer_strip.h3
-rw-r--r--gtk2_ardour/option_editor.cc819
-rw-r--r--gtk2_ardour/option_editor.h110
-rw-r--r--gtk2_ardour/route_ui.cc54
-rw-r--r--gtk2_ardour/route_ui.h7
-rw-r--r--gtk2_ardour/streamview.cc2
-rw-r--r--libs/ardour/ardour/configuration.h14
-rw-r--r--libs/ardour/ardour/route.h5
-rw-r--r--libs/ardour/ardour/session.h15
-rw-r--r--libs/ardour/ardour/state_manager.h8
-rw-r--r--libs/ardour/audio_playlist.cc7
-rw-r--r--libs/ardour/audio_track.cc36
-rw-r--r--libs/ardour/audioregion.cc2
-rw-r--r--libs/ardour/configuration.cc24
-rw-r--r--libs/ardour/playlist.cc2
-rw-r--r--libs/ardour/route.cc20
-rw-r--r--libs/ardour/session.cc48
-rw-r--r--libs/ardour/session_feedback.cc2
-rw-r--r--libs/ardour/session_midi.cc15
-rw-r--r--libs/ardour/session_state.cc73
-rw-r--r--libs/ardour/state_manager.cc27
-rw-r--r--libs/pbd3/undo.cc3
36 files changed, 767 insertions, 1213 deletions
diff --git a/gtk2_ardour/ardour-menus.xml b/gtk2_ardour/ardour-menus.xml
index efceee22b2..6521753bea 100644
--- a/gtk2_ardour/ardour-menus.xml
+++ b/gtk2_ardour/ardour-menus.xml
@@ -81,11 +81,13 @@
<separator/>
<menuitem action='edit-cursor-to-range-start'/>
<menuitem action='edit-cursor-to-range-end'/>
+ <separator/>
+ <menuitem action='crop'/>
+ <menuitem action='duplicate-region'/>
+ <menuitem action='insert-region'/>
+ <menuitem action='normalize-region'/>
</menu>
<menu name='View' action = 'View'>
- <menuitem action='temporal-zoom-in'/>
- <menuitem action='temporal-zoom-out'/>
- <menuitem action='zoom-to-session'/>
<menu name='ZoomFocus' action='ZoomFocus'>
<menuitem action='zoom-focus-left'/>
<menuitem action='zoom-focus-right'/>
@@ -97,11 +99,36 @@
<menuitem action='snap-to-beat'/>
<menuitem action='snap-to-bar'/>
</menu>
+ <menu name='MeterFalloff' action='MeterFalloff'>
+ <menuitem action='MeterFalloffOff'/>
+ <menuitem action='MeterFalloffSlowest'/>
+ <menuitem action='MeterFalloffSlow'/>
+ <menuitem action='MeterFalloffMedium'/>
+ <menuitem action='MeterFalloffFast'/>
+ <menuitem action='MeterFalloffFaster'/>
+ <menuitem action='MeterFalloffFastest'/>
+ </menu>
+ <menu name='MeterHold' action='MeterHold'>
+ <menuitem action='MeterHoldOff'/>
+ <menuitem action='MeterHoldShort'/>
+ <menuitem action='MeterHoldMedium'/>
+ <menuitem action='MeterHoldLong'/>
+ </menu>
+
+ <separator/>
+
+ <menuitem action='temporal-zoom-in'/>
+ <menuitem action='temporal-zoom-out'/>
+ <menuitem action='zoom-to-session'/>
<menuitem action='scroll-tracks-down'/>
<menuitem action='scroll-tracks-up'/>
<menuitem action='scroll-tracks-down'/>
<menuitem action='step-tracks-up'/>
<menuitem action='step-tracks-down'/>
+ <separator/>
+ <menuitem action='ToggleWaveformVisibility'/>
+ <menuitem action='ToggleWaveformsWhileRecording'/>
+ <menuitem action='ToggleMeasureVisibility'/>
</menu>
<menu name='JACK' action='JACK'>
<menuitem action='JACKDisconnect'/>
@@ -130,21 +157,29 @@
<menuitem action='About'/>
</menu>
<menu name='Options' action='Options'>
+ <menu action='Autoconnect'>
+ <menuitem action='AutoConnectNewTrackInputsToHardware'/>
+ <menuitem action='AutoConnectNewTrackOutputsToHardware'/>
+ <menuitem action='AutoConnectNewTrackOutputsToHardware'/>
+ <menuitem action='ManuallyConnectNewTrackOutputs'/>
+ </menu>
+ <menu action='Monitoring'>
+ <menuitem action='UseHardwareMonitoring'/>
+ <menuitem action='UseSoftwareMonitoring'/>
+ <menuitem action='UseExternalMonitoring'/>
+ </menu>
+ <menu action='Solo'>
+ <menuitem action='LatchedSolo'/>
+ <menuitem action='SoloInPlace'/>
+ <menuitem action='SoloViaBus'/>
+ </menu>
+ <separator/>
<menuitem action='SendMTC'/>
<menuitem action='SendMMC'/>
<menuitem action='UseMMC'/>
<menuitem action='SendMIDIfeedback'/>
<menuitem action='UseMIDIcontrol'/>
<separator/>
- <menuitem action='AutoConnectNewTrackInputsToHardware'/>
- <menuitem action='AutoConnectNewTrackOutputsToHardware'/>
- <menuitem action='AutoConnectNewTrackOutputsToHardware'/>
- <menuitem action='ManuallyConnectNewTrackOutputs'/>
- <separator/>
- <menuitem action='UseHardwareMonitoring'/>
- <menuitem action='UseSoftwareMonitoring'/>
- <menuitem action='UseExternalMonitoring'/>
- <separator/>
<menuitem action='StopPluginsWithTransport'/>
<menuitem action='RunPluginsWhileRecording'/>
<separator/>
@@ -153,10 +188,6 @@
<menuitem action='StopTransportAtEndOfSession'/>
<menuitem action='GainReduceFastTransport'/>
<separator/>
- <menuitem action='LatchedSolo'/>
- <menuitem action='SoloInPlace'/>
- <menuitem action='SoloViaBus'/>
- <separator/>
<menuitem action='AutomaticallyCreateCrossfades'/>
<menuitem action='UnmuteNewFullCrossfades'/>
</menu>
diff --git a/gtk2_ardour/ardour.bindings b/gtk2_ardour/ardour.bindings
index 089baa9f1d..58b923fd7a 100644
--- a/gtk2_ardour/ardour.bindings
+++ b/gtk2_ardour/ardour.bindings
@@ -8,19 +8,24 @@
(gtk_accel_path "<Actions>/Transport/GotoEnd" "End")
(gtk_accel_path "<Actions>/Editor/align-regions-sync-relative" "a")
+(gtk_accel_path "<Actions>/Editor/crop" "c")
+(gtk_accel_path "<Actions>/Editor/duplicate-region" "d")
(gtk_accel_path "<Actions>/Editor/set-edit-cursor" "e")
+(gtk_accel_path "<Actions>/Editor/insert-region" "i")
+(gtk_accel_path "<Actions>/Editor/normalize-region" "n")
(gtk_accel_path "<Actions>/Transport/loop" "l")
(gtk_accel_path "<Actions>/Editor/set-playhead" "p")
-(gtk_accel_path "<Actions>/Transport/Record" "R")
+(gtk_accel_path "<Actions>/Transport/Record" "<shift>r")
-(gtk_accel_path "<Actions>/Editor/copy" "<Control>c")
+(gtk_accel_path "<Actions>/Editor/editor-copy" "<Control>c")
(gtk_accel_path "<Actions>/Common/Quit" "<Control>q")
(gtk_accel_path "<Actions>/Editor/redo" "<Control>r")
(gtk_accel_path "<Actions>/Common/Save" "<Control>s")
-(gtk_accel_path "<Actions>/Editor/paste" "<Control>v")
-(gtk_accel_path "<Actions>/Editor/cut" "<Control>x")
+(gtk_accel_path "<Actions>/Editor/editor-paste" "<Control>v")
+(gtk_accel_path "<Actions>/Editor/editor-cut" "<Control>x")
(gtk_accel_path "<Actions>/Editor/undo" "<Control>z")
+
(gtk_accel_path "<Actions>/Editor/scroll-tracks-down" "Page_Down")
(gtk_accel_path "<Actions>/Editor/scroll-tracks-up" "Page_Up")
(gtk_accel_path "<Actions>/Editor/step-tracks-down" "Down")
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 67323ac07b..30f57a9d13 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -654,18 +654,6 @@ ARDOUR_UI::update_wall_clock ()
}
void
-ARDOUR_UI::toggle_recording_plugins ()
-{
- /* XXX use toggle_some_session_state */
-
- if (session == 0) {
- return;
- }
-
- session->set_recording_plugins (!session->get_recording_plugins());
-}
-
-void
ARDOUR_UI::toggle_auto_play ()
{
@@ -735,7 +723,6 @@ ARDOUR_UI::toggle_punch_in ()
void
ARDOUR_UI::map_button_state ()
-
{
map_some_session_state (auto_return_button,
&Session::get_auto_return);
@@ -752,91 +739,6 @@ ARDOUR_UI::map_button_state ()
}
void
-ARDOUR_UI::queue_map_control_change (Session::ControlType t)
-{
- ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::map_control_change), t));
-}
-
-void
-ARDOUR_UI::map_control_change (Session::ControlType t)
-{
- switch (t) {
- case Session::AutoPlay:
- map_some_session_state (auto_play_button, &Session::get_auto_play);
- break;
-
- case Session::AutoLoop:
- break;
-
- case Session::AutoReturn:
- map_some_session_state (auto_return_button, &Session::get_auto_return);
- break;
-
- case Session::AutoInput:
- map_some_session_state (auto_input_button, &Session::get_auto_input);
- break;
-
- case Session::PunchOut:
- map_some_session_state (punch_in_button, &Session::get_punch_out);
- break;
-
- case Session::PunchIn:
- map_some_session_state (punch_in_button, &Session::get_punch_in);
- break;
-
- case Session::Clicking:
- map_some_session_state (click_button, &Session::get_clicking);
- break;
-
- case Session::SlaveType:
-// map_some_session_state (mtc_slave_button, &Session::get_mtc_slave);
- break;
-
- case Session::SendMTC:
-// map_some_session_state (send_mtc_button, &Session::get_send_mtc);
- break;
-
- case Session::SendMMC:
-// map_some_session_state (send_mmc_button, &Session::get_send_mmc);
- break;
-
- case Session::MMCControl:
-// map_some_session_state (mmc_control_button, &Session::get_mmc_control);
- break;
-
- case Session::MidiFeedback:
-// map_some_session_state (mmc_control_button, &Session::get_mmc_control);
- break;
- case Session::MidiControl:
-// map_some_session_state (mmc_control_button, &Session::get_mmc_control);
- break;
-
- case Session::Live:
- break;
-
- case Session::RecordingPlugins:
- break;
-
- case Session::CrossFadesActive:
- break;
-
- case Session::EditingMode:
- break;
-
- case Session::PlayRange:
- break;
-
- case Session::AlignChoice:
- /* don't care, this is handled by the options editor */
- break;
- case Session::SeamlessLoop:
- /* don't care, this is handled by the options editor */
- break;
-
- }
-}
-
-void
ARDOUR_UI::control_methods_adjusted ()
{
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 907307bd3f..284a89ab21 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -566,13 +566,12 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void connect_dependents_to_session (ARDOUR::Session *);
void we_have_dependents ();
void setup_keybindings ();
-
+ void setup_options ();
+
guint32 last_key_press_time;
void snapshot_session ();
- void map_control_change (ARDOUR::Session::ControlType);
- void queue_map_control_change (ARDOUR::Session::ControlType);
void map_record_state ();
void queue_map_record_state ();
@@ -591,10 +590,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
LocationUI *location_ui;
int create_location_ui ();
- /* Various options */
-
- void toggle_recording_plugins ();
-
/* Options window */
OptionEditor *option_editor;
@@ -675,7 +670,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void editor_realized ();
- void toggle_session_state (const char* group, const char* action, void (ARDOUR::Session::*set)(bool));
+ std::vector<std::string> positional_sync_strings;
+
+ void toggle_config_state (const char* group, const char* action, void (ARDOUR::Configuration::*set)(bool));
+ void toggle_session_state (const char* group, const char* action, void (ARDOUR::Session::*set)(bool), bool (ARDOUR::Session::*get)(void) const);
+ void toggle_session_state (const char* group, const char* action, sigc::slot<void> theSlot);
void toggle_send_midi_feedback ();
void toggle_use_mmc ();
void toggle_send_mmc ();
@@ -699,6 +698,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void toggle_SoloViaBus();
void toggle_AutomaticallyCreateCrossfades();
void toggle_UnmuteNewFullCrossfades();
+
+ void mtc_port_changed ();
+ void map_some_session_state (const char* group, const char* action, bool (ARDOUR::Session::*get)() const);
+ void queue_session_control_changed (ARDOUR::Session::ControlType t);
+ void session_control_changed (ARDOUR::Session::ControlType t);
};
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index 173f6c30a3..ab4a0e9b53 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -53,16 +53,6 @@ using namespace Gtk;
using namespace Glib;
using namespace sigc;
-
-static const gchar *psync_strings[] = {
- N_("Internal"),
- N_("Slave to MTC"),
- N_("Sync with JACK"),
- 0
-};
-
-static vector<string> positional_sync_strings;
-
int
ARDOUR_UI::setup_windows ()
{
@@ -391,7 +381,7 @@ ARDOUR_UI::setup_transport ()
ARDOUR_UI::instance()->tooltips().set_tip (primary_clock, _("Primary clock"));
ARDOUR_UI::instance()->tooltips().set_tip (secondary_clock, _("secondary clock"));
- /* options */
+ /* options: XXX these should all be actions with the buttons as proxies */
auto_return_button.signal_toggled().connect (mem_fun(*this,&ARDOUR_UI::toggle_auto_return));
auto_play_button.signal_toggled().connect (mem_fun(*this,&ARDOUR_UI::toggle_auto_play));
@@ -458,9 +448,7 @@ ARDOUR_UI::setup_transport ()
sdframe->set_shadow_type (SHADOW_IN);
sdframe->add (speed_display_box);
- positional_sync_strings = internationalize (psync_strings);
-
- set_popdown_strings (sync_option_combo, positional_sync_strings);
+ mtc_port_changed ();
sync_option_combo.set_active_text (positional_sync_strings.front());
sync_option_combo.signal_changed().connect (mem_fun (*this, &ARDOUR_UI::sync_option_changed));
diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc
index 22fa1d384f..6c8b5b540e 100644
--- a/gtk2_ardour/ardour_ui_dialogs.cc
+++ b/gtk2_ardour/ardour_ui_dialogs.cc
@@ -80,6 +80,8 @@ ARDOUR_UI::connect_to_session (Session *s)
sfdb->set_session (s);
}
+ setup_options ();
+
Blink.connect (mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
Blink.connect (mem_fun(*this, &ARDOUR_UI::solo_blink));
Blink.connect (mem_fun(*this, &ARDOUR_UI::audition_blink));
@@ -89,7 +91,6 @@ ARDOUR_UI::connect_to_session (Session *s)
*/
session->TransportStateChange.connect (mem_fun(*this, &ARDOUR_UI::queue_transport_change));
- session->ControlChanged.connect (mem_fun(*this, &ARDOUR_UI::queue_map_control_change));
/* alert the user to these things happening */
diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc
index 669eb3a65d..753aa6a667 100644
--- a/gtk2_ardour/ardour_ui_ed.cc
+++ b/gtk2_ardour/ardour_ui_ed.cc
@@ -335,7 +335,7 @@ ARDOUR_UI::install_actions ()
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_toggle_action (option_actions, X_("SendMMC"), _("Send MMC"), mem_fun (*this, &ARDOUR_UI::toggle_send_mtc));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_toggle_action (option_actions, X_("UseMMC"), _("Send MMC"), mem_fun (*this, &ARDOUR_UI::toggle_use_mmc));
+ act = ActionManager::register_toggle_action (option_actions, X_("UseMMC"), _("Use MMC"), mem_fun (*this, &ARDOUR_UI::toggle_use_mmc));
ActionManager::session_sensitive_actions.push_back (act);
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);
diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc
index 7bcd9e2dcb..2fbec5d9a1 100644
--- a/gtk2_ardour/ardour_ui_options.cc
+++ b/gtk2_ardour/ardour_ui_options.cc
@@ -18,36 +18,67 @@
$Id$
*/
+#include <gtkmm2ext/utils.h>
+
#include <ardour/configuration.h>
#include <ardour/session.h>
#include <ardour/audioengine.h>
#include "ardour_ui.h"
#include "actions.h"
+#include "gui_thread.h"
+
+#include "i18n.h"
using namespace Gtk;
+using namespace Gtkmm2ext;
using namespace ARDOUR;
void
ARDOUR_UI::toggle_time_master ()
{
- bool yn = time_master_button.get_active();
+ toggle_config_state ("Transport", "ToggleTimeMaster", &Configuration::set_jack_time_master);
+ if (session) {
+ session->engine().reset_timebase ();
+ }
+}
- Config->set_jack_time_master (yn);
+void
+ARDOUR_UI::toggle_config_state (const char* group, const char* action, void (Configuration::*set)(bool))
+{
+ Glib::RefPtr<Action> act = ActionManager::get_action (group, action);
+ if (act) {
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+ (Config->*set) (tact->get_active());
+ }
+}
+void
+ARDOUR_UI::toggle_session_state (const char* group, const char* action, void (Session::*set)(bool), bool (Session::*get)(void) const)
+{
if (session) {
- session->engine().reset_timebase ();
+ Glib::RefPtr<Action> act = ActionManager::get_action (group, action);
+ if (act) {
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+ bool x = (session->*get)();
+
+ if (x != tact->get_active()) {
+ (session->*set) (!x);
+ }
+ }
}
}
void
-ARDOUR_UI::toggle_session_state (const char* group, const char* action, void (Session::*set)(bool))
+ARDOUR_UI::toggle_session_state (const char* group, const char* action, sigc::slot<void> theSlot)
{
if (session) {
Glib::RefPtr<Action> act = ActionManager::get_action (group, action);
if (act) {
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
- (session->*set) (tact->get_active());
+ if (tact->get_active()) {
+ theSlot ();
+ }
}
}
}
@@ -55,93 +86,170 @@ ARDOUR_UI::toggle_session_state (const char* group, const char* action, void (Se
void
ARDOUR_UI::toggle_send_mtc ()
{
- toggle_session_state ("options", "SendMTC", &Session::set_send_mtc);
+ toggle_session_state ("options", "SendMTC", &Session::set_send_mtc, &Session::get_send_mtc);
}
void
ARDOUR_UI::toggle_send_mmc ()
{
- toggle_session_state ("options", "SendMMC", &Session::set_send_mmc);
+ toggle_session_state ("options", "SendMMC", &Session::set_send_mmc, &Session::get_send_mmc);
}
void
ARDOUR_UI::toggle_use_mmc ()
{
- toggle_session_state ("options", "UseMMC", &Session::set_mmc_control);
+ toggle_session_state ("options", "UseMMC", &Session::set_mmc_control, &Session::get_mmc_control);
}
void
ARDOUR_UI::toggle_use_midi_control ()
{
- toggle_session_state ("options", "UseMIDIcontrol", &Session::set_midi_control);
+ toggle_session_state ("options", "UseMIDIcontrol", &Session::set_midi_control, &Session::get_midi_control);
}
void
ARDOUR_UI::toggle_send_midi_feedback ()
{
- toggle_session_state ("options", "SendMIDIfeedback", &Session::set_midi_feedback);
+ toggle_session_state ("options", "SendMIDIfeedback", &Session::set_midi_feedback, &Session::get_midi_feedback);
}
void
ARDOUR_UI::toggle_AutoConnectNewTrackInputsToHardware()
{
+ toggle_session_state ("options", "AutoConnectNewTrackInputsToHardware", &Session::set_input_auto_connect, &Session::get_input_auto_connect);
}
void
ARDOUR_UI::toggle_AutoConnectNewTrackOutputsToHardware()
{
+ toggle_session_state ("options", "AutoConnectNewTrackOutputsToHardware", bind (mem_fun (session, &Session::set_output_auto_connect), Session::AutoConnectPhysical));
}
void
ARDOUR_UI::toggle_AutoConnectNewTrackOutputsToMaster()
{
+ toggle_session_state ("options", "AutoConnectNewTrackOutputsToHardware", bind (mem_fun (session, &Session::set_output_auto_connect), Session::AutoConnectMaster));
}
void
ARDOUR_UI::toggle_ManuallyConnectNewTrackOutputs()
{
+ toggle_session_state ("options", "AutoConnectNewTrackOutputsToHardware", bind (mem_fun (session, &Session::set_output_auto_connect), Session::AutoConnectOption (0)));
}
+
void
ARDOUR_UI::toggle_UseHardwareMonitoring()
{
+ Glib::RefPtr<Action> act = ActionManager::get_action ("options", "UseSoftwareMonitoring");
+ if (act) {
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+ if (tact->get_active()) {
+ Config->set_use_hardware_monitoring (true);
+ Config->set_use_sw_monitoring (false);
+ if (session) {
+ session->reset_input_monitor_state();
+ }
+ }
+ }
}
+
void
ARDOUR_UI::toggle_UseSoftwareMonitoring()
{
+ Glib::RefPtr<Action> act = ActionManager::get_action ("options", "UseSoftwareMonitoring");
+ if (act) {
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+ if (tact->get_active()) {
+ Config->set_use_hardware_monitoring (false);
+ Config->set_use_sw_monitoring (true);
+ if (session) {
+ session->reset_input_monitor_state();
+ }
+ }
+ }
}
+
void
ARDOUR_UI::toggle_UseExternalMonitoring()
{
+ Glib::RefPtr<Action> act = ActionManager::get_action ("options", "UseExternalMonitoring");
+ if (act) {
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+ if (tact->get_active()) {
+ Config->set_use_hardware_monitoring (false);
+ Config->set_use_sw_monitoring (false);
+ if (session) {
+ session->reset_input_monitor_state();
+ }
+ }
+ }
}
+
void
ARDOUR_UI::toggle_StopPluginsWithTransport()
{
+ toggle_config_state ("options", "StopPluginsWithTransport", &Configuration::set_plugins_stop_with_transport);
}
void
ARDOUR_UI::toggle_RunPluginsWhileRecording()
{
+ toggle_session_state ("options", "RunPluginsWhileRecording", &Session::set_recording_plugins, &Session::get_recording_plugins);
}
+
void
ARDOUR_UI::toggle_VerifyRemoveLastCapture()
{
+ toggle_config_state ("options", "VerifyRemoveLastCapture", &Configuration::set_verify_remove_last_capture);
}
+
void
ARDOUR_UI::toggle_StopRecordingOnXrun()
{
+ toggle_config_state ("options", "StopRecordingOnXrun", &Configuration::set_stop_recording_on_xrun);
}
+
void
ARDOUR_UI::toggle_StopTransportAtEndOfSession()
{
+ toggle_config_state ("options", "StopTransportAtEndOfSession", &Configuration::set_stop_at_session_end);
}
+
void
ARDOUR_UI::toggle_GainReduceFastTransport()
{
+ Glib::RefPtr<Action> act = ActionManager::get_action ("options", "GainReduceFastTransport");
+ if (act) {
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+ if (tact->get_active()) {
+ Config->set_quieten_at_speed (0.251189); // -12dB reduction for ffwd or rewind
+ } else {
+ Config->set_quieten_at_speed (1.0); /* no change */
+ }
+ }
}
+
void
ARDOUR_UI::toggle_LatchedSolo()
{
+ toggle_session_state ("options", "LatchedSolo", &Session::set_solo_latched, &Session::solo_latched);
}
+
void
ARDOUR_UI::toggle_SoloViaBus()
{
+ if (!session) {
+ return;
+ }
+
+ Glib::RefPtr<Action> act = ActionManager::get_action ("options", "SoloViaBus");
+ if (act) {
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+
+ if (tact->get_active()) {
+ session->set_solo_model (Session::SoloBus);
+ } else {
+ session->set_solo_model (Session::InverseMute);
+ }
+ }
}
+
void
ARDOUR_UI::toggle_AutomaticallyCreateCrossfades()
{
@@ -150,3 +258,187 @@ void
ARDOUR_UI::toggle_UnmuteNewFullCrossfades()
{
}
+
+void
+ARDOUR_UI::mtc_port_changed ()
+{
+ bool have_mtc;
+
+ if (session) {
+ if (session->mtc_port()) {
+ have_mtc = true;
+ } else {
+ have_mtc = false;
+ }
+ } else {
+ have_mtc = false;
+ }
+
+ if (have_mtc) {
+ const gchar *psync_strings[] = {
+ N_("Internal"),
+ N_("MTC"),
+ N_("JACK"),
+ 0
+ };
+
+ positional_sync_strings = internationalize (psync_strings);
+
+ } else {
+ const gchar *psync_strings[] = {
+ N_("Internal"),
+ N_("JACK"),
+ 0
+ };
+ positional_sync_strings = internationalize (psync_strings);
+ }
+
+ set_popdown_strings (sync_option_combo, positional_sync_strings);
+}
+
+void
+ARDOUR_UI::setup_options ()
+{
+ mtc_port_changed ();
+
+ session_control_changed (Session::SlaveType);
+ session_control_changed (Session::SendMTC);
+ session_control_changed (Session::SendMMC);
+ session_control_changed (Session::MMCControl);
+ session_control_changed (Session::MidiFeedback);
+ session_control_changed (Session::MidiControl);
+ session_control_changed (Session::RecordingPlugins);
+ session_control_changed (Session::CrossFadesActive);
+ session_control_changed (Session::SoloLatch);
+ session_control_changed (Session::SoloingModel);
+ session_control_changed (Session::LayeringModel);
+ session_control_changed (Session::CrossfadingModel);
+
+ session->ControlChanged.connect (mem_fun (*this, &ARDOUR_UI::queue_session_control_changed));
+}
+
+void
+ARDOUR_UI::map_some_session_state (const char* group, const char* action, bool (Session::*get)() const)
+{
+ if (!session) {
+ return;
+ }
+
+ Glib::RefPtr<Action> act = ActionManager::get_action (group, action);
+ if (act) {
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+ bool x = (session->*get)();
+ if (tact->get_active() != x) {
+ tact->set_active (x);
+ }
+ }
+}
+
+void
+ARDOUR_UI::queue_session_control_changed (Session::ControlType t)
+{
+ ENSURE_GUI_THREAD (bind (mem_fun (*this, &ARDOUR_UI::session_control_changed), t));
+}
+
+void
+ARDOUR_UI::session_control_changed (Session::ControlType t)
+{
+ switch (t) {
+ case Session::SlaveType:
+ switch (session->slave_source()) {
+ case Session::None:
+ sync_option_combo.set_active_text (_("Internal"));
+ break;
+ case Session::MTC:
+ sync_option_combo.set_active_text (_("MTC"));
+ break;
+ case Session::JACK:
+ sync_option_combo.set_active_text (_("JACK"));
+ break;
+ }
+
+ break;
+
+ case Session::SendMTC:
+ map_some_session_state ("options", "SendMTC", &Session::get_send_mtc);
+ break;
+
+ case Session::SendMMC:
+ map_some_session_state ("options", "SendMMC", &Session::get_send_mmc);
+ break;
+
+ case Session::MMCControl:
+ map_some_session_state ("options", "UseMMC", &Session::get_mmc_control);
+ break;
+
+ case Session::MidiFeedback:
+ map_some_session_state ("options", "SendMIDIfeedback", &Session::get_midi_feedback);
+ break;
+
+ case Session::MidiControl:
+ map_some_session_state ("options", "UseMIDIcontrol", &Session::get_midi_control);
+ break;
+
+ case Session::RecordingPlugins:
+ map_some_session_state ("options", "RunPluginsWhileRecording", &Session::get_recording_plugins);
+ break;
+
+ case Session::CrossFadesActive:
+ map_some_session_state ("options", "CrossfadesActive", &Session::get_crossfades_active);
+ break;
+
+ case Session::SoloLatch:
+ break;
+
+ case Session::SoloingModel:
+ switch (session->solo_model()) {
+ case Session::InverseMute:
+ break;
+ case Session::SoloBus:
+ break;
+ }
+ break;
+
+ case Session::LayeringModel:
+ break;
+
+ case Session::CrossfadingModel:
+ break;
+
+
+ // BUTTON STATE: fix me in the future to use actions
+
+
+ case Session::AutoPlay:
+ map_some_session_state (auto_play_button, &Session::get_auto_play);
+ break;
+
+ case Session::AutoLoop:
+ break;
+
+ case Session::AutoReturn:
+ map_some_session_state (auto_return_button, &Session::get_auto_return);
+ break;
+
+ case Session::AutoInput:
+ map_some_session_state (auto_input_button, &Session::get_auto_input);
+ break;
+
+ case Session::PunchOut:
+ map_some_session_state (punch_in_button, &Session::get_punch_out);
+ break;
+
+ case Session::PunchIn:
+ map_some_session_state (punch_in_button, &Session::get_punch_in);
+ break;
+
+ case Session::Clicking:
+ map_some_session_state (click_button, &Session::get_clicking);
+ break;
+
+ default:
+ // somebody else handles this
+ break;
+
+ }
+}
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 5bc2590446..a44eba3754 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -669,7 +669,7 @@ Editor::Editor (AudioEngine& eng)
edit_pane.pack1 (edit_frame, true, true);
edit_pane.pack2 (*notebook_tearoff, true, true);
-
+
edit_pane.signal_size_allocate().connect_notify (bind (mem_fun(*this, &Editor::pane_allocation_handler), static_cast<Paned*> (&edit_pane)));
top_hbox.pack_start (toolbar_frame, true, true);
@@ -2605,23 +2605,35 @@ Editor::setup_toolbar ()
selection_start_clock_label.set_text (_("Start:"));
selection_end_clock_label.set_text (_("End:"));
- edit_cursor_clock_label.set_text (_("Edit:"));
+ edit_cursor_clock_label.set_text (_("Edit"));
- toolbar_selection_clock_table.set_border_width (5);
- toolbar_selection_clock_table.set_col_spacings (2);
- toolbar_selection_clock_table.set_homogeneous (false);
+ /* the zoom in/out buttons are generally taller than the clocks, so
+ put all the toolbar clocks into a size group with one of the
+ buttons to make them all equal height.
+
+ this also applies to the various toolbar combos
+ */
-// toolbar_selection_clock_table.attach (selection_start_clock_label, 0, 1, 0, 1, 0, 0, 0, 0);
-// toolbar_selection_clock_table.attach (selection_end_clock_label, 1, 2, 0, 1, 0, 0, 0, 0);
- toolbar_selection_clock_table.attach (edit_cursor_clock_label, 2, 3, 0, 1, FILL, FILL, 0, 0);
+ RefPtr<SizeGroup> toolbar_clock_size_group = SizeGroup::create (SIZE_GROUP_VERTICAL);
+ toolbar_clock_size_group->add_widget (zoom_out_button);
+ toolbar_clock_size_group->add_widget (edit_cursor_clock);
+ toolbar_clock_size_group->add_widget (zoom_range_clock);
+ toolbar_clock_size_group->add_widget (nudge_clock);
+ toolbar_clock_size_group->add_widget (edit_mode_selector);
+ toolbar_clock_size_group->add_widget (snap_type_selector);
+ toolbar_clock_size_group->add_widget (snap_mode_selector);
+ toolbar_clock_size_group->add_widget (zoom_focus_selector);
-// toolbar_selection_clock_table.attach (selection_start_clock, 0, 1, 1, 2, 0, 0);
-// toolbar_selection_clock_table.attach (selection_end_clock, 1, 2, 1, 2, 0, 0);
- toolbar_selection_clock_table.attach (edit_cursor_clock, 2, 3, 1, 2, FILL, FILL);
+ HBox* edit_clock_hbox = manage (new HBox());
+ VBox* edit_clock_vbox = manage (new VBox());
+ edit_clock_hbox->pack_start (edit_cursor_clock, false, false);
+
+ edit_clock_vbox->set_spacing (3);
+ edit_clock_vbox->set_border_width (3);
+ edit_clock_vbox->pack_start (edit_cursor_clock_label, false, false);
+ edit_clock_vbox->pack_start (*edit_clock_hbox, false, false);
-// toolbar_clock_vbox.set_spacing (2);
-// toolbar_clock_vbox.set_border_width (10);
/* the editor/mixer button will be enabled at session connect */
editor_mixer_button.set_active(false);
@@ -2630,7 +2642,7 @@ Editor::setup_toolbar ()
HBox* hbox = new HBox;
hbox->pack_start (editor_mixer_button, false, false);
- hbox->pack_start (toolbar_selection_clock_table, false, false);
+ hbox->pack_start (*edit_clock_vbox, false, false);
hbox->pack_start (zoom_indicator_vbox, false, false);
hbox->pack_start (zoom_focus_box, false, false);
hbox->pack_start (snap_type_box, false, false);
@@ -3643,7 +3655,7 @@ Editor::pane_allocation_handler (Allocation &alloc, Paned* which)
char buf[32];
XMLNode* node = ARDOUR_UI::instance()->editor_settings();
int width, height;
- static int32_t done[4] = { 0, 0, 0, 0 };
+ static int32_t done;
XMLNode* geometry;
if ((geometry = find_named_node (*node, "geometry")) == 0) {
@@ -3656,18 +3668,19 @@ Editor::pane_allocation_handler (Allocation &alloc, Paned* which)
if (which == static_cast<Paned*> (&edit_pane)) {
- if (done[0]) {
+ if (done) {
return;
}
if (!geometry || (prop = geometry->property ("edit_pane_pos")) == 0) {
- pos = 75;
+ /* initial allocation is 90% to canvas, 10% to notebook */
+ pos = (int) floor (alloc.get_width() * 0.90f);
snprintf (buf, sizeof(buf), "%d", pos);
} else {
pos = atoi (prop->value());
}
-
- if ((done[0] = GTK_WIDGET(edit_pane.gobj())->allocation.width > pos)) {
+
+ if ((done = GTK_WIDGET(edit_pane.gobj())->allocation.width > pos)) {
edit_pane.set_position (pos);
}
}
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 74a565cd91..349781c406 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -278,6 +278,13 @@ class Editor : public PublicEditor
void toggle_follow_playhead ();
bool follow_playhead() const { return _follow_playhead; }
+ void toggle_waveform_visibility ();
+ void toggle_waveforms_while_recording ();
+ void toggle_measure_visibility ();
+
+ void set_meter_falloff (float);
+ void set_meter_hold (int32_t);
+
/* xfades */
void toggle_xfades_active();
diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc
index 35a9ac6d54..dbf7bc1c89 100644
--- a/gtk2_ardour/editor_actions.cc
+++ b/gtk2_ardour/editor_actions.cc
@@ -21,10 +21,15 @@ Editor::register_actions ()
RefPtr<ActionGroup> editor_actions = ActionGroup::create (X_("Editor"));
/* non-operative menu items for menu bar */
--
+
ActionManager::register_action (editor_actions, X_("Edit"), _("Edit"));
ActionManager::register_action (editor_actions, X_("View"), _("View"));
ActionManager::register_action (editor_actions, X_("ZoomFocus"), _("ZoomFocus"));
+ ActionManager::register_action (editor_actions, X_("MeterHold"), _("Meter hold"));
+ ActionManager::register_action (editor_actions, X_("MeterFalloff"), _("Meter falloff"));
+ ActionManager::register_action (editor_actions, X_("Solo"), _("Solo"));
+ ActionManager::register_action (editor_actions, X_("Monitoring"), _("Monitoring"));
+ ActionManager::register_action (editor_actions, X_("Autoconnect"), _("Autoconnect"));
/* add named actions for the editor */
@@ -165,7 +170,7 @@ Editor::register_actions ()
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "normalize-region", _("normalize region"), mem_fun(*this, &Editor::normalize_region));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (editor_actions, "editor-crop", _("editor crop"), mem_fun(*this, &Editor::crop_region_to_selection));
+ act = ActionManager::register_action (editor_actions, "crop", _("crop"), mem_fun(*this, &Editor::crop_region_to_selection));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "insert-chunk", _("insert chunk"), bind (mem_fun(*this, &Editor::paste_named_selection), 1.0f));
ActionManager::session_sensitive_actions.push_back (act);
@@ -200,8 +205,6 @@ Editor::register_actions ()
Glib::RefPtr<ActionGroup> zoom_actions = ActionGroup::create (X_("Zoom"));
RadioAction::Group zoom_group;
- ActionManager::register_action (editor_actions, X_("ZoomFocus"), _("Zoom focus"));
-
ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-left", _("zoom focus left"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusLeft));
ActionManager::session_sensitive_actions.push_back (act);
ActionManager::register_radio_action (zoom_actions, zoom_group, "zoom-focus-right", _("zoom focus right"), bind (mem_fun(*this, &Editor::set_zoom_focus), Editing::ZoomFocusRight));
@@ -297,13 +300,30 @@ Editor::register_actions ()
act = ActionManager::register_action (rl_actions, X_("rlImportAudio"), _("Embed audio (link)"), bind (mem_fun(*this, &Editor::import_audio), false));
ActionManager::session_sensitive_actions.push_back (act);
-#ifdef NEW_ACTIONS
+ ActionManager::register_toggle_action (editor_actions, X_("ToggleWaveformVisibility"), _("show waveforms"), mem_fun (*this, &Editor::toggle_waveform_visibility));
+ ActionManager::register_toggle_action (editor_actions, X_("ToggleWaveformsWhileRecording"), _("show waveforms while recording"), mem_fun (*this, &Editor::toggle_waveforms_while_recording));
+ ActionManager::register_toggle_action (editor_actions, X_("ToggleMeasureVisibility"), _("show measures"), mem_fun (*this, &Editor::toggle_measure_visibility));
+
+ RadioAction::Group meter_falloff_group;
+ RadioAction::Group meter_hold_group;
- ToggleWaveformVisibility;
- ToggleWaveformsWhileRecording;
- ToggleMeasureVisibility;
+ /*
+ Slowest = 6.6dB/sec falloff at update rate of 40ms
+ Slow = 6.8dB/sec falloff at update rate of 40ms
+ */
-#endif
+ ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffOff"), _("off"), bind (mem_fun (*this, &Editor::set_meter_falloff), 0.0f));
+ ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffSlowest"), _("slowest"), bind (mem_fun (*this, &Editor::set_meter_falloff), 0.266f));
+ ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffSlow"), _("slow"), bind (mem_fun (*this, &Editor::set_meter_falloff), 0.342f));
+ ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffMedium"), _("medium"), bind (mem_fun (*this, &Editor::set_meter_falloff), 0.7f));
+ ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffFast"), _("fast"), bind (mem_fun (*this, &Editor::set_meter_falloff), 1.1f));
+ ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffFaster"), _("faster"), bind (mem_fun (*this, &Editor::set_meter_falloff), 1.5f));
+ ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffFastest"), _("fastest"), bind (mem_fun (*this, &Editor::set_meter_falloff), 2.5f));
+
+ ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldOff"), _("off"), bind (mem_fun (*this, &Editor::set_meter_hold), 0));
+ ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldShort"), _("short"), bind (mem_fun (*this, &Editor::set_meter_hold), 40));
+ ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldMedium"), _("medium"), bind (mem_fun (*this, &Editor::set_meter_hold), 100));
+ ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldLong"), _("long"), bind (mem_fun (*this, &Editor::set_meter_hold), 200));
ActionManager::add_action_group (rl_actions);
ActionManager::add_action_group (zoom_actions);
@@ -311,3 +331,34 @@ Editor::register_actions ()
ActionManager::add_action_group (snap_actions);
ActionManager::add_action_group (editor_actions);
}
+
+void
+Editor::toggle_waveform_visibility ()
+{
+ Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("ToggleWaveformVisibility"));
+ if (act) {
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+ set_show_waveforms (tact->get_active());
+ }
+}
+
+void
+Editor::toggle_waveforms_while_recording ()
+{
+ Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("ToggleWaveformVisibility"));
+ if (act) {
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+ set_show_waveforms_recording (tact->get_active());
+ }
+}
+
+void
+Editor::toggle_measure_visibility ()
+{
+ Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("ToggleWaveformVisibility"));
+ if (act) {
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+ set_show_measures (tact->get_active());
+ }
+}
+
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index fa0649faf1..64d00f56ab 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -3244,8 +3244,9 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
}
rv->get_time_axis_view().reveal_dependent_views (*rv);
+
+ /* no need to add an undo here, we did that when we added this playlist to motion_frozen playlists */
- session->add_undo (rv->region.playlist()->get_memento());
rv->region.set_position (where, (void *) this);
}
}
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index aa8eec8df3..7bc088e2df 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -79,6 +79,7 @@ void
Editor::undo (uint32_t n)
{
if (session) {
+ cerr << "Undo " << n << " operations\n";
session->undo (n);
}
}
@@ -91,6 +92,23 @@ Editor::redo (uint32_t n)
}
}
+void
+Editor::set_meter_hold (int32_t cnt)
+{
+ if (session) {
+ session->set_meter_hold (cnt);
+ }
+}
+
+void
+Editor::set_meter_falloff (float val)
+{
+ if (session) {
+ session->set_meter_falloff (val);
+ }
+}
+
+
int
Editor::ensure_cursor (jack_nframes_t *pos)
{
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 771a3eda9f..346f9ec2dd 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -1244,7 +1244,7 @@ MixerStrip::build_route_ops_menu ()
{
using namespace Menu_Helpers;
- route_ops_menu = new Menu;
+ route_ops_menu = manage (new Menu);
route_ops_menu->set_name ("ArdourContextMenu");
MenuList& items = route_ops_menu->items();
@@ -1255,6 +1255,11 @@ MixerStrip::build_route_ops_menu ()
route_active_menu_item = dynamic_cast<CheckMenuItem *> (&items.back());
route_active_menu_item->set_active (_route.active());
+ build_remote_control_menu ();
+
+ items.push_back (SeparatorElem());
+ items.push_back (MenuElem (_("Remote Control ID"), *remote_control_menu));
+
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Remove"), mem_fun(*this, &RouteUI::remove_this_route)));
}
@@ -1274,6 +1279,8 @@ MixerStrip::list_route_operations ()
if (route_ops_menu == 0) {
build_route_ops_menu ();
}
+
+ refresh_remote_control_menu();
route_ops_menu->popup (1, 0);
}
diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h
index 8b69e26379..f348b96803 100644
--- a/gtk2_ardour/mixer_strip.h
+++ b/gtk2_ardour/mixer_strip.h
@@ -220,7 +220,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
void set_automated_controls_sensitivity (bool yn);
- Gtk::Menu *route_ops_menu;
+ Gtk::Menu* route_ops_menu;
void build_route_ops_menu ();
gint name_button_button_release (GdkEventButton*);
void list_route_operations ();
@@ -268,6 +268,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
string solo_button_name () const { return "MixerSoloButton"; }
string safe_solo_button_name () const { return "MixerSafeSoloButton"; }
+
};
#endif /* __ardour_mixer_strip__ */
diff --git a/gtk2_ardour/option_editor.cc b/gtk2_ardour/option_editor.cc
index 049bf5331b..c31fdb98f5 100644
--- a/gtk2_ardour/option_editor.cc
+++ b/gtk2_ardour/option_editor.cc
@@ -45,14 +45,6 @@ using namespace Editing;
using namespace Gtkmm2ext;
using namespace std;
-static const gchar *psync_strings[] = {
- N_("Internal"),
- N_("Slave to MTC"),
- N_("Sync with JACK"),
- N_("never used but stops crashes"),
- 0
-};
-
static const gchar *lmode_strings[] = {
N_("Later regions are higher"),
N_("Most recently added/moved/trimmed regions are higher"),
@@ -91,32 +83,13 @@ OptionEditor::OptionEditor (ARDOUR_UI& uip, PublicEditor& ed, Mixer_UI& mixui)
short_xfade_adjustment (0, 1.0, 500.0, 5.0, 100.0),
short_xfade_slider (short_xfade_adjustment),
- /* solo */
- solo_latched_button (_("Latched solo")),
- solo_via_bus_button (_("Solo via bus")),
-
- /* display */
-
- show_waveforms_button (_("Show waveforms")),
- show_waveforms_recording_button (_("Show waveforms while recording")),
- mixer_strip_width_button (_("Narrow mixer strips")),
- show_measures_button (_("Show measure lines")),
- follow_playhead_button (_("Follow playhead")),
-
/* Sync */
- send_mtc_button (_("Send MTC")),
- send_mmc_button (_("Send MMC")),
- jack_time_master_button (_("JACK time master")),
smpte_offset_clock (X_("SMPTEOffsetClock"), true, true),
smpte_offset_negative_button (_("SMPTE offset is negative")),
/* MIDI */
- midi_feedback_button (_("Send MIDI parameter feedback")),
- midi_control_button (_("MIDI parameter control")),
- mmc_control_button (_("MMC control")),
-
/* Click */
click_table (2, 3),
@@ -129,23 +102,7 @@ OptionEditor::OptionEditor (ARDOUR_UI& uip, PublicEditor& ed, Mixer_UI& mixui)
delete_button_adjustment (3, 1, 5),
delete_button_spin (delete_button_adjustment),
edit_button_adjustment (3, 1, 5),
- edit_button_spin (edit_button_adjustment),
-
- /* Misc */
-
- auto_connect_inputs_button (_("Auto-connect new track inputs to hardware")),
- auto_connect_output_physical_button (_("Auto-connect new track outputs to hardware")),
- auto_connect_output_master_button (_("Auto-connect new track outputs to master bus")),
- auto_connect_output_manual_button (_("Manually connect new track outputs")),
- hw_monitor_button(_("Use Hardware Monitoring")),
- sw_monitor_button(_("Use Software Monitoring")),
- plugins_stop_button (_("Stop plugins with transport")),
- plugins_on_rec_button (_("Run plugins while recording")),
- verify_remove_last_capture_button (_("Verify remove last capture")),
- stop_rec_on_xrun_button (_("Stop recording on xrun")),
- stop_at_end_button (_("Stop transport at end of session")),
- debug_keyboard_button (_("Debug keyboard events")),
- speed_quieten_button (_("-12dB gain reduction for ffwd/rew"))
+ edit_button_spin (edit_button_adjustment)
{
using namespace Notebook_Helpers;
@@ -178,21 +135,15 @@ OptionEditor::OptionEditor (ARDOUR_UI& uip, PublicEditor& ed, Mixer_UI& mixui)
setup_sync_options();
setup_path_options();
setup_fade_options ();
- setup_solo_options ();
- setup_display_options ();
- setup_misc_options ();
setup_keyboard_options ();
setup_auditioner_editor ();
- notebook.pages().push_back (TabElem (misc_packer, _("Misc")));
notebook.pages().push_back (TabElem (sync_packer, _("Sync")));
notebook.pages().push_back (TabElem (path_table, _("Paths/Files")));
- notebook.pages().push_back (TabElem (display_packer, _("Display")));
notebook.pages().push_back (TabElem (keyboard_mouse_table, _("Kbd/Mouse")));
notebook.pages().push_back (TabElem (click_packer, _("Click")));
notebook.pages().push_back (TabElem (audition_packer, _("Audition")));
notebook.pages().push_back (TabElem (fade_packer, _("Layers & Fades")));
- notebook.pages().push_back (TabElem (solo_packer, _("Solo")));
if (!MIDI::Manager::instance()->get_midi_ports().empty()) {
setup_midi_options ();
@@ -213,26 +164,11 @@ OptionEditor::set_session (Session *s)
click_emphasis_path_entry.set_text ("");
session_raid_entry.set_text ("");
- send_mtc_button.set_sensitive (false);
- send_mmc_button.set_sensitive (false);
- midi_feedback_button.set_sensitive (false);
- midi_control_button.set_sensitive (false);
- mmc_control_button.set_sensitive (false);
click_path_entry.set_sensitive (false);
click_emphasis_path_entry.set_sensitive (false);
session_raid_entry.set_sensitive (false);
- plugins_on_rec_button.set_sensitive (false);
- verify_remove_last_capture_button.set_sensitive (false);
- slave_type_combo.set_sensitive (false);
- solo_latched_button.set_sensitive (false);
- solo_via_bus_button.set_sensitive (false);
+
smpte_fps_combo.set_sensitive (false);
- meter_hold_combo.set_sensitive (false);
- meter_falloff_combo.set_sensitive (false);
- auto_connect_inputs_button.set_sensitive (false);
- auto_connect_output_physical_button.set_sensitive (false);
- auto_connect_output_master_button.set_sensitive (false);
- auto_connect_output_manual_button.set_sensitive (false);
layer_mode_combo.set_sensitive (false);
short_xfade_slider.set_sensitive (false);
smpte_offset_negative_button.set_sensitive (false);
@@ -243,26 +179,11 @@ OptionEditor::set_session (Session *s)
return;
}
- send_mtc_button.set_sensitive (true);
- send_mmc_button.set_sensitive (true);
- midi_feedback_button.set_sensitive (true);
- midi_control_button.set_sensitive (true);
- mmc_control_button.set_sensitive (true);
+
click_path_entry.set_sensitive (true);
click_emphasis_path_entry.set_sensitive (true);
session_raid_entry.set_sensitive (true);
- plugins_on_rec_button.set_sensitive (true);
- verify_remove_last_capture_button.set_sensitive (true);
- slave_type_combo.set_sensitive (true);
- solo_latched_button.set_sensitive (true);
- solo_via_bus_button.set_sensitive (true);
smpte_fps_combo.set_sensitive (true);
- meter_hold_combo.set_sensitive (true);
- meter_falloff_combo.set_sensitive (true);
- auto_connect_inputs_button.set_sensitive (true);
- auto_connect_output_physical_button.set_sensitive (true);
- auto_connect_output_master_button.set_sensitive (true);
- auto_connect_output_manual_button.set_sensitive (true);
layer_mode_combo.set_sensitive (true);
short_xfade_slider.set_sensitive (true);
smpte_offset_negative_button.set_sensitive (true);
@@ -289,14 +210,6 @@ OptionEditor::set_session (Session *s)
smpte_offset_clock.set (s->smpte_offset (), true);
smpte_offset_negative_button.set_active (session->smpte_offset_negative());
- send_mtc_button.set_active (session->get_send_mtc());
-
- /* MIDI I/O */
-
- send_mmc_button.set_active (session->get_send_mmc());
- midi_control_button.set_active (session->get_midi_control());
- midi_feedback_button.set_active (session->get_midi_feedback());
- mmc_control_button.set_active (session->get_mmc_control());
/* set up port assignments */
@@ -320,77 +233,15 @@ OptionEditor::set_session (Session *s)
}
}
- auto_connect_inputs_button.set_active (session->get_input_auto_connect());
-
- Session::AutoConnectOption oac = session->get_output_auto_connect();
- if (oac & Session::AutoConnectPhysical) {
- auto_connect_output_physical_button.set_active (true);
- } else if (oac & Session::AutoConnectMaster) {
- auto_connect_output_master_button.set_active (true);
- } else {
- auto_connect_output_manual_button.set_active (true);
- }
-
setup_click_editor ();
connect_audition_editor ();
- plugins_on_rec_button.set_active (session->get_recording_plugins ());
- verify_remove_last_capture_button.set_active (Config->get_verify_remove_last_capture());
-
layer_mode_combo.set_active_text (layer_mode_strings[session->get_layer_model()]);
xfade_model_combo.set_active_text (xfade_model_strings[session->get_xfade_model()]);
short_xfade_adjustment.set_value ((Crossfade::short_xfade_length() / (float) session->frame_rate()) * 1000.0);
- xfade_active_button.set_active (session->get_crossfades_active());
- solo_latched_button.set_active (session->solo_latched());
- solo_via_bus_button.set_active (session->solo_model() == Session::SoloBus);
-
add_session_paths ();
-
- vector<string> dumb;
- dumb.push_back (positional_sync_strings[Session::None]);
- dumb.push_back (positional_sync_strings[Session::JACK]);
- if (session->mtc_port()) {
- dumb.push_back (positional_sync_strings[Session::MTC]);
- }
- set_popdown_strings (slave_type_combo, dumb);
-
- // meter stuff
- if (session->meter_falloff() == 0.0f) {
- meter_falloff_combo.set_active_text (_("Off"));
- } else if (session->meter_falloff() <= 0.3f) {
- meter_falloff_combo.set_active_text (_("Slowest"));
- } else if (session->meter_falloff() <= 0.4f) {
- meter_falloff_combo.set_active_text (_("Slow"));
- } else if (session->meter_falloff() <= 0.8f) {
- meter_falloff_combo.set_active_text (_("Medium"));
- } else if (session->meter_falloff() <= 1.4f) {
- meter_falloff_combo.set_active_text (_("Fast"));
- } else if (session->meter_falloff() <= 2.0f) {
- meter_falloff_combo.set_active_text (_("Faster"));
- } else {
- meter_falloff_combo.set_active_text (_("Fastest"));
- }
-
- switch ((int) floor (session->meter_hold())) {
- case 0:
- meter_hold_combo.set_active_text (_("Off"));
- break;
- case 40:
- meter_hold_combo.set_active_text (_("Short"));
- break;
- case 100:
- meter_hold_combo.set_active_text (_("Medium"));
- break;
- case 200:
- meter_hold_combo.set_active_text (_("Long"));
- break;
- }
-
- session_control_changed (Session::SlaveType);
- session_control_changed (Session::AlignChoice);
- session->ControlChanged.connect (mem_fun(*this, &OptionEditor::queue_session_control_changed));
}
OptionEditor::~OptionEditor ()
@@ -609,236 +460,11 @@ OptionEditor::xfade_active_clicked ()
}
void
-OptionEditor::setup_solo_options ()
-{
- Gtk::HBox* hbox;
-
- solo_via_bus_button.set_name ("OptionEditorToggleButton");
- solo_latched_button.set_name ("OptionEditorToggleButton");
-
- hbox = manage (new HBox);
- hbox->set_border_width (12);
- hbox->pack_start (solo_via_bus_button, false, false);
- solo_packer.pack_start (*hbox, false, false);
-
- hbox = manage (new HBox);
- hbox->set_border_width (12);
- hbox->pack_start (solo_latched_button, false, false);
- solo_packer.pack_start (*hbox, false, false);
-
- solo_via_bus_button.signal_clicked().connect
- (mem_fun(*this, &OptionEditor::solo_via_bus_clicked));
- solo_latched_button.signal_clicked().connect
- (mem_fun(*this, &OptionEditor::solo_latched_clicked));
-
- solo_packer.show_all ();
-}
-
-void
-OptionEditor::solo_via_bus_clicked ()
-{
- if (!session) {
- return;
- }
-
- if (solo_via_bus_button.get_active()) {
- session->set_solo_model (Session::SoloBus);
- } else {
- session->set_solo_model (Session::InverseMute);
- }
-}
-
-void
-OptionEditor::solo_latched_clicked ()
-{
- if (!session) {
- return;
- }
-
- bool x = solo_latched_button.get_active();
-
- if (x != session->solo_latched()) {
- session->set_solo_latched (x);
- }
-}
-
-void
-OptionEditor::setup_display_options ()
-{
- HBox* hbox;
- vector<string> dumb;
-
- display_packer.set_border_width (12);
- display_packer.set_spacing (5);
-
- show_waveforms_button.set_name ("OptionEditorToggleButton");
- show_waveforms_recording_button.set_name ("OptionEditorToggleButton");
- show_measures_button.set_name ("OptionEditorToggleButton");
- follow_playhead_button.set_name ("OptionEditorToggleButton");
- mixer_strip_width_button.set_name ("OptionEditorToggleButton");
-
- mixer_strip_width_button.set_active (mixer.get_strip_width() == Narrow);
-
- hbox = manage (new HBox);
- hbox->set_border_width (8);
- hbox->pack_start (show_waveforms_button, false, false);
- display_packer.pack_start (*hbox, false, false);
-
- hbox = manage (new HBox);
- hbox->set_border_width (8);
- hbox->pack_start (show_waveforms_recording_button, false, false);
- display_packer.pack_start (*hbox, false, false);
-
- hbox = manage (new HBox);
- hbox->set_border_width (8);
- hbox->pack_start (show_measures_button, false, false);
- display_packer.pack_start (*hbox, false, false);
-
- hbox = manage (new HBox);
- hbox->set_border_width (8);
- hbox->pack_start (mixer_strip_width_button, false, false);
- display_packer.pack_start (*hbox, false, false);
-
- hbox = manage (new HBox);
- hbox->set_border_width (8);
- hbox->pack_start (follow_playhead_button, false, false);
- display_packer.pack_start (*hbox, false, false);
-
- Label *meter_hold_label = manage (new Label (_("Meter Peak Hold")));
- meter_hold_label->set_name ("OptionsLabel");
- dumb.clear ();
- dumb.push_back (_("Off"));
- dumb.push_back (_("Short"));
- dumb.push_back (_("Medium"));
- dumb.push_back (_("Long"));
- set_popdown_strings (meter_hold_combo, dumb);
- meter_hold_combo.signal_changed().connect (mem_fun(*this, &OptionEditor::meter_hold_chosen));
- hbox = manage (new HBox);
- hbox->set_border_width (8);
- hbox->set_spacing (8);
- hbox->pack_start (*meter_hold_label, false, false);
- hbox->pack_start (meter_hold_combo, false, false);
- display_packer.pack_start (*hbox, false, false);
-
- Label *meter_falloff_label = manage (new Label (_("Meter Falloff")));
- meter_falloff_label->set_name ("OptionsLabel");
- dumb.clear ();
- dumb.push_back (_("Off"));
- dumb.push_back (_("Slowest"));
- dumb.push_back (_("Slow"));
- dumb.push_back (_("Medium"));
- dumb.push_back (_("Fast"));
- dumb.push_back (_("Faster"));
- dumb.push_back (_("Fastest"));
- set_popdown_strings (meter_falloff_combo, dumb);
- meter_falloff_combo.signal_changed().connect (mem_fun(*this, &OptionEditor::meter_falloff_chosen));
- hbox = manage (new HBox);
- hbox->set_border_width (8);
- hbox->set_spacing (8);
- hbox->pack_start (*meter_falloff_label, false, false);
- hbox->pack_start (meter_falloff_combo, false, false);
- display_packer.pack_start (*hbox, false, false);
-
-
- show_waveforms_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::show_waveforms_clicked));
- show_waveforms_recording_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::show_waveforms_recording_clicked));
- show_measures_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::show_measures_clicked));
- mixer_strip_width_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::strip_width_clicked));
- follow_playhead_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::follow_playhead_clicked));
-
- editor.DisplayControlChanged.connect (mem_fun(*this, &OptionEditor::display_control_changed));
-
- show_measures_button.set_active (editor.show_measures());
- show_waveforms_button.set_active (editor.show_waveforms());
- show_waveforms_recording_button.set_active (editor.show_waveforms_recording());
- follow_playhead_button.set_active (editor.follow_playhead());
-}
-
-void
-OptionEditor::meter_hold_chosen ()
-{
- if (session) {
- string str = meter_hold_combo.get_active_text();
-
- if (str == _("Off")) {
- session->set_meter_hold (0);
- } else if (str == _("Short")) {
- session->set_meter_hold (40);
- } else if (str == _("Medium")) {
- session->set_meter_hold (100);
- } else if (str == _("Long")) {
- session->set_meter_hold (200);
- }
- }
-}
-
-void
-OptionEditor::meter_falloff_chosen ()
-{
- if (session) {
- string str = meter_falloff_combo.get_active_text();
-
- if (str == _("Off")) {
- session->set_meter_falloff (0.0f);
- } else if (str == _("Slowest")) {
- session->set_meter_falloff (0.266f); // 6.6 dB/sec falloff at update rate of 40 ms
- } else if (str == _("Slow")) {
- session->set_meter_falloff (0.342f); // 8.6 dB/sec falloff at update rate of 40 ms
- } else if (str == _("Medium")) {
- session->set_meter_falloff (0.7f);
- } else if (str == _("Fast")) {
- session->set_meter_falloff (1.1f);
- } else if (str == _("Faster")) {
- session->set_meter_falloff (1.5f);
- } else if (str == _("Fastest")) {
- session->set_meter_falloff (2.5f);
- }
- }
-}
-
-void
-OptionEditor::display_control_changed (Editing::DisplayControl dc)
-{
- ToggleButton* button = 0;
- bool val = true;
-
- switch (dc) {
- case ShowMeasures:
- val = editor.show_measures ();
- button = &show_measures_button;
- break;
- case ShowWaveforms:
- val = editor.show_waveforms ();
- button = &show_waveforms_button;
- break;
- case ShowWaveformsRecording:
- val = editor.show_waveforms_recording ();
- button = &show_waveforms_recording_button;
- break;
- case FollowPlayhead:
- val = editor.follow_playhead ();
- button = &follow_playhead_button;
- break;
- }
-
- if (button->get_active() != val) {
- button->set_active (val);
- }
-}
-
-void
OptionEditor::setup_sync_options ()
{
- Label *slave_type_label = manage (new Label (_("Positional Sync")));
HBox* hbox;
vector<string> dumb;
- slave_type_label->set_name("OptionsLabel");
- positional_sync_strings = internationalize (psync_strings);
-
- slave_type_combo.set_name ("OptionsEntry");
- slave_type_combo.signal_changed().connect (mem_fun(*this, &OptionEditor::slave_type_chosen));
-
dumb.clear ();
dumb.push_back (X_("24 FPS"));
dumb.push_back (X_("25 FPS"));
@@ -851,32 +477,10 @@ OptionEditor::setup_sync_options ()
smpte_offset_clock.set_mode (AudioClock::SMPTE);
smpte_offset_clock.ValueChanged.connect (mem_fun(*this, &OptionEditor::smpte_offset_chosen));
- send_mtc_button.set_name ("OptionEditorToggleButton");
- jack_time_master_button.set_name ("OptionEditorToggleButton");
smpte_offset_negative_button.set_name ("OptionEditorToggleButton");
- send_mtc_button.unset_flags (Gtk::CAN_FOCUS);
- jack_time_master_button.unset_flags (Gtk::CAN_FOCUS);
smpte_offset_negative_button.unset_flags (Gtk::CAN_FOCUS);
- hbox = manage (new HBox);
- hbox->set_border_width (5);
- hbox->set_spacing (10);
- hbox->pack_start (*slave_type_label, false, false);
- hbox->pack_start (slave_type_combo, false, false);
-
- sync_packer.pack_start (*hbox, false, false);
-
- hbox = manage (new HBox);
- hbox->set_border_width (5);
- hbox->pack_start (send_mtc_button, false, false);
- sync_packer.pack_start (*hbox, false, false);
-
- hbox = manage (new HBox);
- hbox->set_border_width (5);
- hbox->pack_start (jack_time_master_button, false, false);
- sync_packer.pack_start (*hbox, false, false);
-
Label *smpte_fps_label = manage (new Label (_("SMPTE Frames/second")));
Label *smpte_offset_label = manage (new Label (_("SMPTE Offset")));
smpte_fps_label->set_name("OptionsLabel");
@@ -899,10 +503,6 @@ OptionEditor::setup_sync_options ()
sync_packer.pack_start (*hbox, false, false);
- jack_time_master_button.set_active (Config->get_jack_time_master());
-
- send_mtc_button.signal_button_press_event().connect (bind (mem_fun(*this, &OptionEditor::send_mtc_toggled), &send_mtc_button));
- jack_time_master_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::jack_time_master_clicked));
smpte_offset_negative_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::smpte_offset_negative_clicked));
}
@@ -1061,46 +661,9 @@ OptionEditor::setup_midi_options ()
hbox->set_border_width (6);
hbox->pack_start (*table, true, false);
midi_packer.pack_start (*hbox, false, false);
-
- VBox* mmcbuttonbox = manage (new VBox);
-
- mmc_control_button.set_name ("OptionEditorToggleButton");
-
- hbox = manage (new HBox);
- hbox->set_border_width (6);
- hbox->pack_start (mmc_control_button, false, false, 36);
- mmcbuttonbox->pack_start (*hbox, false, false);
-
- midi_control_button.set_name ("OptionEditorToggleButton");
-
- hbox = manage (new HBox);
- hbox->set_border_width (6);
- hbox->pack_start (midi_control_button, false, false, 36);
- mmcbuttonbox->pack_start (*hbox, false, false);
-
- send_mmc_button.set_name ("OptionEditorToggleButton");
-
- hbox = manage (new HBox);
- hbox->set_border_width (6);
- hbox->pack_start (send_mmc_button, false, false, 36);
- mmcbuttonbox->pack_start (*hbox, false, false);
-
- midi_feedback_button.set_name ("OptionEditorToggleButton");
-
- hbox = manage (new HBox);
- hbox->set_border_width (6);
- hbox->pack_start (midi_feedback_button, false, false, 36);
- mmcbuttonbox->pack_start (*hbox, false, false);
-
- midi_packer.pack_start (*mmcbuttonbox, false, false);
-
- mmc_control_button.signal_toggled().connect (bind (mem_fun(*this, &OptionEditor::mmc_control_toggled), &mmc_control_button));
- midi_control_button.signal_toggled().connect (bind (mem_fun(*this, &OptionEditor::midi_control_toggled), &midi_control_button));
- send_mmc_button.signal_toggled().connect (bind (mem_fun(*this, &OptionEditor::send_mmc_toggled), &send_mmc_button));
- midi_feedback_button.signal_toggled().connect (bind (mem_fun(*this, &OptionEditor::midi_feedback_toggled), &midi_feedback_button));
}
-gint
+bool
OptionEditor::mtc_port_chosen (GdkEventButton* ev, MIDI::Port *port, Gtk::RadioButton* rb)
{
if (session) {
@@ -1111,26 +674,14 @@ OptionEditor::mtc_port_chosen (GdkEventButton* ev, MIDI::Port *port, Gtk::RadioB
} else {
session->set_mtc_port ("");
}
-
- /* update sync options to reflect MTC port availability */
-
- vector<string> dumb;
- dumb.push_back (positional_sync_strings[Session::None]);
- dumb.push_back (positional_sync_strings[Session::JACK]);
-
- if (session->mtc_port()) {
- dumb.push_back (positional_sync_strings[Session::MTC]);
- }
- set_popdown_strings (slave_type_combo, dumb);
-
rb->set_active (true);
}
}
-
- return stop_signal (*rb, "button_press_event");
+
+ return false;
}
-gint
+bool
OptionEditor::mmc_port_chosen (GdkEventButton* ev, MIDI::Port* port, Gtk::RadioButton* rb)
{
if (session) {
@@ -1144,10 +695,10 @@ OptionEditor::mmc_port_chosen (GdkEventButton* ev, MIDI::Port* port, Gtk::RadioB
rb->set_active (true);
}
}
- return stop_signal (*rb, "button_press_event");
+ return false;
}
-gint
+bool
OptionEditor::midi_port_chosen (GdkEventButton* ev, MIDI::Port* port, Gtk::RadioButton* rb)
{
if (session) {
@@ -1161,7 +712,7 @@ OptionEditor::midi_port_chosen (GdkEventButton* ev, MIDI::Port* port, Gtk::Radio
rb->set_active (true);
}
}
- return stop_signal (*rb, "button_press_event");
+ return false;
}
gint
@@ -1207,47 +758,6 @@ OptionEditor::port_trace_out_toggled (GdkEventButton* ev,MIDI::Port* port, Toggl
return stop_signal (*tb, "button_press_event");
}
-gint
-OptionEditor::send_mtc_toggled (GdkEventButton *ev, CheckButton *button)
-{
- if (session) {
- session->set_send_mtc (!button->get_active());
- }
- return stop_signal (*button, "button_press_event");
-}
-
-void
-OptionEditor::send_mmc_toggled (CheckButton *button)
-{
- if (session) {
- session->set_send_mmc (button->get_active());
- }
-}
-
-void
-OptionEditor::mmc_control_toggled (CheckButton *button)
-{
- if (session) {
- session->set_mmc_control (button->get_active());
- }
-}
-
-void
-OptionEditor::midi_control_toggled (CheckButton *button)
-{
- if (session) {
- session->set_midi_control (button->get_active());
- }
-}
-
-void
-OptionEditor::midi_feedback_toggled (CheckButton *button)
-{
- if (session) {
- session->set_midi_feedback (button->get_active());
- }
-}
-
void
OptionEditor::save ()
{
@@ -1260,23 +770,11 @@ gint
OptionEditor::wm_close (GdkEventAny *ev)
{
save ();
- just_close_win();
+ hide ();
return TRUE;
}
void
-OptionEditor::jack_time_master_clicked ()
-{
- bool yn = jack_time_master_button.get_active();
-
- Config->set_jack_time_master (yn);
-
- if (session) {
- session->engine().reset_timebase ();
- }
-}
-
-void
OptionEditor::raid_path_changed ()
{
if (session) {
@@ -1377,96 +875,6 @@ OptionEditor::click_emphasis_sound_changed ()
}
void
-OptionEditor::show_waveforms_clicked ()
-{
- editor.set_show_waveforms (show_waveforms_button.get_active());
-}
-
-void
-OptionEditor::show_waveforms_recording_clicked ()
-{
- editor.set_show_waveforms_recording (show_waveforms_recording_button.get_active());
-}
-
-void
-OptionEditor::show_measures_clicked ()
-{
- editor.set_show_measures (show_measures_button.get_active());
-}
-
-void
-OptionEditor::follow_playhead_clicked ()
-{
- editor.set_follow_playhead (follow_playhead_button.get_active());
-}
-
-void
-OptionEditor::strip_width_clicked ()
-{
- mixer.set_strip_width (mixer_strip_width_button.get_active() ? Narrow : Wide);
-}
-
-
-void
-OptionEditor::just_close_win()
-{
- hide();
-}
-
-void
-OptionEditor::queue_session_control_changed (Session::ControlType t)
-{
- ui.call_slot (bind (mem_fun(*this, &OptionEditor::session_control_changed), t));
-}
-
-void
-OptionEditor::session_control_changed (Session::ControlType t)
-{
- switch (t) {
- case Session::SlaveType:
- switch (session->slave_source()) {
- case Session::None:
- slave_type_combo.set_active_text (positional_sync_strings[Session::None]);
- break;
- case Session::MTC:
- slave_type_combo.set_active_text (positional_sync_strings[Session::MTC]);
- break;
- case Session::JACK:
- slave_type_combo.set_active_text (positional_sync_strings[Session::JACK]);
- break;
- default:
- slave_type_combo.set_active_text (_("--unknown--"));
- break;
- }
-
- break;
-
- case Session::SendMTC:
- map_some_session_state (send_mtc_button, &Session::get_send_mtc);
- break;
-
- case Session::SendMMC:
- map_some_session_state (send_mmc_button, &Session::get_send_mmc);
- break;
-
- case Session::MMCControl:
- map_some_session_state (mmc_control_button, &Session::get_mmc_control);
- break;
-
- case Session::MidiFeedback:
- map_some_session_state (midi_feedback_button, &Session::get_midi_feedback);
- break;
-
- case Session::MidiControl:
- map_some_session_state (midi_control_button, &Session::get_midi_control);
- break;
-
- default:
- break;
- }
-}
-
-void
OptionEditor::native_format_chosen ()
{
string which;
@@ -1484,26 +892,6 @@ OptionEditor::native_format_chosen ()
}
void
-OptionEditor::slave_type_chosen ()
-{
- string which;
-
- if (session == 0) {
- return;
- }
-
- which = slave_type_combo.get_active_text();
-
- if (which == positional_sync_strings[Session::None]) {
- session->request_slave_source (Session::None);
- } else if (which == positional_sync_strings[Session::MTC]) {
- session->request_slave_source (Session::MTC);
- } else if (which == positional_sync_strings[Session::JACK]) {
- session->request_slave_source (Session::JACK);
- }
-}
-
-void
OptionEditor::clear_click_editor ()
{
if (click_io_selector) {
@@ -1619,183 +1007,6 @@ OptionEditor::focus_out_event_handler (GdkEventFocus* ev, void (OptionEditor::*p
return false;
}
-void
-OptionEditor::setup_misc_options()
-{
- Gtk::Table* table = manage (new Table (4, 2));
- table->set_homogeneous (true);
-
- misc_packer.set_border_width (8);
- misc_packer.set_spacing (3);
- misc_packer.pack_start (*table, true, true);
-
- table->attach (hw_monitor_button, 0, 1, 0, 1, Gtk::FILL, FILL, 8, 0);
- table->attach (sw_monitor_button, 0, 1, 1, 2, Gtk::FILL, FILL, 8, 0);
- table->attach (plugins_stop_button, 0, 1, 2, 3, Gtk::FILL, FILL, 8, 0);
- table->attach (plugins_on_rec_button, 0, 1, 3, 4, Gtk::FILL, FILL, 8, 0);
- table->attach (verify_remove_last_capture_button, 0, 1, 4, 5, Gtk::FILL, FILL, 8, 0);
-
- table->attach (stop_rec_on_xrun_button, 1, 2, 0, 1, Gtk::FILL, FILL, 8, 0);
- table->attach (stop_at_end_button, 1, 2, 1, 2, Gtk::FILL, FILL, 8, 0);
- table->attach (debug_keyboard_button, 1, 2, 2, 3, Gtk::FILL, FILL, 8, 0);
- table->attach (speed_quieten_button, 1, 2, 3, 4, Gtk::FILL, FILL, 8, 0);
-
- Gtk::VBox* connect_box = manage (new VBox);
- connect_box->set_spacing (3);
- connect_box->set_border_width (8);
-
- auto_connect_output_button_group = auto_connect_output_master_button.get_group();
- auto_connect_output_manual_button.set_group (auto_connect_output_button_group);
- auto_connect_output_physical_button.set_group (auto_connect_output_button_group);
-
- Gtk::HBox* useless_box = manage (new HBox);
- useless_box->pack_start (auto_connect_inputs_button, false, false);
- connect_box->pack_start (*useless_box, false, false);
- connect_box->pack_start (auto_connect_output_master_button, false, false);
- connect_box->pack_start (auto_connect_output_physical_button, false, false);
- connect_box->pack_start (auto_connect_output_manual_button, false, false);
-
- misc_packer.pack_start (*connect_box, false, false);
-
- hw_monitor_button.set_name ("OptionEditorToggleButton");
- sw_monitor_button.set_name ("OptionEditorToggleButton");
- plugins_stop_button.set_name ("OptionEditorToggleButton");
- plugins_on_rec_button.set_name ("OptionEditorToggleButton");
- verify_remove_last_capture_button.set_name ("OptionEditorToggleButton");
- auto_connect_inputs_button.set_name ("OptionEditorToggleButton");
- auto_connect_output_physical_button.set_name ("OptionEditorToggleButton");
- auto_connect_output_master_button.set_name ("OptionEditorToggleButton");
- auto_connect_output_manual_button.set_name ("OptionEditorToggleButton");
- stop_rec_on_xrun_button.set_name ("OptionEditorToggleButton");
- stop_at_end_button.set_name ("OptionEditorToggleButton");
- debug_keyboard_button.set_name ("OptionEditorToggleButton");
- speed_quieten_button.set_name ("OptionEditorToggleButton");
-
- hw_monitor_button.set_active (Config->get_use_hardware_monitoring());
- sw_monitor_button.set_active (!Config->get_no_sw_monitoring());
- plugins_stop_button.set_active (Config->get_plugins_stop_with_transport());
- stop_rec_on_xrun_button.set_active (Config->get_stop_recording_on_xrun());
- stop_at_end_button.set_active (Config->get_stop_at_session_end());
- debug_keyboard_button.set_active (false);
- speed_quieten_button.set_active (Config->get_quieten_at_speed() != 1.0f);
-
- hw_monitor_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::hw_monitor_clicked));
- sw_monitor_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::sw_monitor_clicked));
- plugins_stop_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::plugins_stop_with_transport_clicked));
- plugins_on_rec_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::plugins_on_while_recording_clicked));
- verify_remove_last_capture_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::verify_remove_last_capture_clicked));
- auto_connect_inputs_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::auto_connect_inputs_clicked));
- auto_connect_output_physical_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::auto_connect_output_physical_clicked));
- auto_connect_output_master_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::auto_connect_output_master_clicked));
- auto_connect_output_manual_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::auto_connect_output_manual_clicked));
- stop_rec_on_xrun_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::stop_rec_on_xrun_clicked));
- stop_at_end_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::stop_at_end_clicked));
- debug_keyboard_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::debug_keyboard_clicked));
- speed_quieten_button.signal_clicked().connect (mem_fun(*this, &OptionEditor::speed_quieten_clicked));
-}
-
-void
-OptionEditor::speed_quieten_clicked ()
-{
- if (speed_quieten_button.get_active()) {
- Config->set_quieten_at_speed (0.251189); // -12dB reduction for ffwd or rewind
- } else {
- Config->set_quieten_at_speed (1.0); /* no change */
- }
-}
-
-void
-OptionEditor::debug_keyboard_clicked ()
-{
- extern bool debug_keyboard;
- debug_keyboard = debug_keyboard_button.get_active ();
-}
-
-void
-OptionEditor::auto_connect_inputs_clicked ()
-{
- if (session) {
- session->set_input_auto_connect (auto_connect_inputs_button.get_active());
- }
-}
-
-void
-OptionEditor::auto_connect_output_master_clicked ()
-{
- if (session) {
- if (auto_connect_output_master_button.get_active()) {
- session->set_output_auto_connect (Session::AutoConnectMaster);
- }
- }
-}
-
-void
-OptionEditor::auto_connect_output_physical_clicked ()
-{
- if (session) {
- if (auto_connect_output_physical_button.get_active()) {
- session->set_output_auto_connect (Session::AutoConnectPhysical);
- }
- }
-}
-
-void
-OptionEditor::auto_connect_output_manual_clicked ()
-{
- if (session) {
- if (auto_connect_output_manual_button.get_active()) {
- session->set_output_auto_connect (Session::AutoConnectOption (0));
- }
- }
-}
-
-void
-OptionEditor::hw_monitor_clicked ()
-{
- Config->set_use_hardware_monitoring (hw_monitor_button.get_active());
- if (session) {
- session->reset_input_monitor_state ();
- }
-}
-
-void
-OptionEditor::sw_monitor_clicked ()
-{
- Config->set_no_sw_monitoring (!sw_monitor_button.get_active());
-}
-
-void
-OptionEditor::plugins_stop_with_transport_clicked ()
-{
- Config->set_plugins_stop_with_transport (plugins_stop_button.get_active());
-}
-
-void
-OptionEditor::plugins_on_while_recording_clicked ()
-{
- if (session) {
- session->set_recording_plugins (plugins_on_rec_button.get_active());
- }
-}
-
-void
-OptionEditor::verify_remove_last_capture_clicked ()
-{
- Config->set_verify_remove_last_capture(verify_remove_last_capture_button.get_active());
-}
-
-void
-OptionEditor::stop_rec_on_xrun_clicked ()
-{
- Config->set_stop_recording_on_xrun (stop_rec_on_xrun_button.get_active());
-}
-
-void
-OptionEditor::stop_at_end_clicked ()
-{
- Config->set_stop_at_session_end (stop_at_end_button.get_active());
-}
-
static const struct {
const char *name;
guint modifier;
@@ -1988,11 +1199,3 @@ OptionEditor::fixup_combo_size (Gtk::ComboBoxText& combo, vector<string>& string
set_size_request_to_display_given_text (combo, maxstring.c_str(), 10 + FUDGE, 10);
}
-void
-OptionEditor::map_some_session_state (CheckButton& button, bool (Session::*get)() const)
-{
- if (session) {
- button.set_active ((session->*get)());
- }
-}
-
diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h
index d1513f4661..cf70e65a36 100644
--- a/gtk2_ardour/option_editor.h
+++ b/gtk2_ardour/option_editor.h
@@ -65,28 +65,22 @@ class OptionEditor : public Gtk::Dialog
/* Generic */
- void session_control_changed (ARDOUR::Session::ControlType);
- void queue_session_control_changed (ARDOUR::Session::ControlType);
- void map_some_session_state (Gtk::CheckButton& button, bool (ARDOUR::Session::*get)() const);
gint wm_close (GdkEventAny *);
- void just_close_win();
bool focus_out_event_handler (GdkEventFocus*, void (OptionEditor::*pmf)());
/* paths */
Gtk::Table path_table;
-
Gtk::Entry session_raid_entry;
-
Gtk::ComboBoxText native_format_combo;
- struct SoundFilePathColumns : public Gtk::TreeModel::ColumnRecord
- {
- public:
- Gtk::TreeModelColumn<std::string> paths;
-
- SoundFilePathColumns() { add (paths); }
+ struct SoundFilePathColumns : public Gtk::TreeModel::ColumnRecord {
+ public:
+ SoundFilePathColumns() { add (paths); }
+ Gtk::TreeModelColumn<std::string> paths;
+
};
+
SoundFilePathColumns sfdb_path_columns;
Glib::RefPtr<Gtk::ListStore> sfdb_paths;
Gtk::TreeView sfdb_path_view;
@@ -99,8 +93,6 @@ class OptionEditor : public Gtk::Dialog
/* fades */
- // Gtk::Table fade_table;
-
Gtk::VBox fade_packer;
Gtk::CheckButton auto_xfade_button;
Gtk::CheckButton xfade_active_button;
@@ -118,57 +110,17 @@ class OptionEditor : public Gtk::Dialog
void setup_fade_options();
void short_xfade_adjustment_changed ();
- /* solo */
-
- Gtk::VBox solo_packer;
- Gtk::CheckButton solo_latched_button;
- Gtk::CheckButton solo_via_bus_button;
-
- void solo_latched_clicked();
- void solo_via_bus_clicked ();
-
- void setup_solo_options();
-
- /* display */
-
- Gtk::VBox display_packer;
- Gtk::CheckButton show_waveforms_button;
- Gtk::CheckButton show_waveforms_recording_button;
- Gtk::CheckButton mixer_strip_width_button;
- Gtk::CheckButton show_measures_button;
- Gtk::CheckButton follow_playhead_button;
- Gtk::ComboBoxText meter_hold_combo;
- Gtk::ComboBoxText meter_falloff_combo;
-
- void setup_display_options();
- void show_waveforms_clicked ();
- void show_waveforms_recording_clicked ();
- void show_measures_clicked ();
- void strip_width_clicked ();
- void follow_playhead_clicked ();
- void meter_hold_chosen ();
- void meter_falloff_chosen ();
-
- void display_control_changed (Editing::DisplayControl);
-
/* Sync */
Gtk::VBox sync_packer;
- Gtk::CheckButton send_mtc_button;
- Gtk::CheckButton send_mmc_button;
- Gtk::CheckButton jack_time_master_button;
Gtk::ComboBoxText slave_type_combo;
Gtk::ComboBoxText smpte_fps_combo;
AudioClock smpte_offset_clock;
Gtk::CheckButton smpte_offset_negative_button;
void setup_sync_options ();
- gint send_mtc_toggled (GdkEventButton*, Gtk::CheckButton*);
- void slave_type_chosen ();
- void jack_time_master_clicked ();
- void jack_transport_master_clicked ();
void smpte_fps_chosen ();
void smpte_offset_chosen ();
void smpte_offset_negative_clicked ();
@@ -176,26 +128,18 @@ class OptionEditor : public Gtk::Dialog
/* MIDI */
Gtk::VBox midi_packer;
- Gtk::CheckButton midi_feedback_button;
- Gtk::CheckButton midi_control_button;
- Gtk::CheckButton mmc_control_button;
Gtk::RadioButton::Group mtc_button_group;
Gtk::RadioButton::Group mmc_button_group;
Gtk::RadioButton::Group midi_button_group;
- void send_mmc_toggled (Gtk::CheckButton*);
- void mmc_control_toggled (Gtk::CheckButton*);
- void midi_control_toggled (Gtk::CheckButton*);
- void midi_feedback_toggled (Gtk::CheckButton*);
-
gint port_online_toggled (GdkEventButton*,MIDI::Port*,Gtk::ToggleButton*);
gint port_trace_in_toggled (GdkEventButton*,MIDI::Port*,Gtk::ToggleButton*);
gint port_trace_out_toggled (GdkEventButton*,MIDI::Port*,Gtk::ToggleButton*);
- gint mmc_port_chosen (GdkEventButton*,MIDI::Port*,Gtk::RadioButton*);
- gint mtc_port_chosen (GdkEventButton*,MIDI::Port*,Gtk::RadioButton*);
- gint midi_port_chosen (GdkEventButton*,MIDI::Port*,Gtk::RadioButton*);
+ bool mmc_port_chosen (GdkEventButton*,MIDI::Port*,Gtk::RadioButton*);
+ bool mtc_port_chosen (GdkEventButton*,MIDI::Port*,Gtk::RadioButton*);
+ bool midi_port_chosen (GdkEventButton*,MIDI::Port*,Gtk::RadioButton*);
void map_port_online (MIDI::Port*, Gtk::ToggleButton*);
@@ -264,42 +208,6 @@ class OptionEditor : public Gtk::Dialog
void edit_button_changed ();
void delete_button_changed ();
- /* Miscellany */
-
- Gtk::VBox misc_packer;
-
- Gtk::CheckButton auto_connect_inputs_button;
-
- Gtk::RadioButton auto_connect_output_physical_button;
- Gtk::RadioButton auto_connect_output_master_button;
- Gtk::RadioButton auto_connect_output_manual_button;
- Gtk::RadioButton::Group auto_connect_output_button_group;
-
- Gtk::CheckButton hw_monitor_button;
- Gtk::CheckButton sw_monitor_button;
- Gtk::CheckButton plugins_stop_button;
- Gtk::CheckButton plugins_on_rec_button;
- Gtk::CheckButton verify_remove_last_capture_button;
- Gtk::CheckButton stop_rec_on_xrun_button;
- Gtk::CheckButton stop_at_end_button;
- Gtk::CheckButton debug_keyboard_button;
- Gtk::CheckButton speed_quieten_button;
-
- void setup_misc_options ();
- void plugins_stop_with_transport_clicked ();
- void verify_remove_last_capture_clicked ();
- void plugins_on_while_recording_clicked ();
- void auto_connect_inputs_clicked ();
- void auto_connect_output_physical_clicked ();
- void auto_connect_output_master_clicked ();
- void auto_connect_output_manual_clicked ();
- void hw_monitor_clicked ();
- void sw_monitor_clicked ();
- void stop_rec_on_xrun_clicked ();
- void stop_at_end_clicked ();
- void debug_keyboard_clicked ();
- void speed_quieten_clicked ();
-
void fixup_combo_size (Gtk::ComboBoxText&, std::vector<std::string>& strings);
};
diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc
index 1780204321..82b6cac3bd 100644
--- a/gtk2_ardour/route_ui.cc
+++ b/gtk2_ardour/route_ui.cc
@@ -54,6 +54,7 @@ RouteUI::RouteUI (ARDOUR::Route& rt, ARDOUR::Session& sess, const char* m_name,
xml_node = 0;
mute_menu = 0;
solo_menu = 0;
+ remote_control_menu = 0;
ignore_toggle = false;
wait_for_release = false;
route_active_menu_item = 0;
@@ -409,6 +410,58 @@ RouteUI::update_rec_display ()
}
void
+RouteUI::build_remote_control_menu ()
+{
+ remote_control_menu = manage (new Menu);
+ refresh_remote_control_menu ();
+}
+
+void
+RouteUI::refresh_remote_control_menu ()
+{
+ using namespace Menu_Helpers;
+
+ RadioMenuItem::Group rc_group;
+ CheckMenuItem* rc_active;
+ uint32_t limit = _session.ntracks();
+ char buf[32];
+
+ MenuList& rc_items = remote_control_menu->items();
+ rc_items.clear ();
+
+ /* note that this menu list starts at zero, not 1, because zero
+ is a valid, if useless, ID.
+ */
+
+ limit += 4; /* leave some breathing room */
+
+ for (uint32_t i = 0; i < limit; ++i) {
+ snprintf (buf, sizeof (buf), "%u", i);
+ rc_items.push_back (RadioMenuElem (rc_group, buf));
+ rc_active = dynamic_cast<RadioMenuItem*>(&rc_items.back());
+ if (_route.remote_control_id() == i) {
+ rc_active = dynamic_cast<CheckMenuItem*> (&rc_items.back());
+ rc_active->set_active ();
+ }
+ rc_active->signal_activate().connect (bind (mem_fun (*this, &RouteUI::set_remote_control_id), i, rc_active));
+ }
+}
+
+void
+RouteUI::set_remote_control_id (uint32_t id, CheckMenuItem* item)
+{
+ /* this is called when the radio menu item is toggled, and so
+ is actually invoked twice per menu selection. we only
+ care about the invocation for the item that was being
+ marked active.
+ */
+
+ if (item->get_active()) {
+ _route.set_remote_control_id (id);
+ }
+}
+
+void
RouteUI::build_solo_menu (void)
{
using namespace Menu_Helpers;
@@ -840,3 +893,4 @@ RouteUI::map_frozen ()
}
}
}
+
diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h
index c49583ab45..990bcd99ed 100644
--- a/gtk2_ardour/route_ui.h
+++ b/gtk2_ardour/route_ui.h
@@ -74,6 +74,7 @@ class RouteUI : public virtual AxisView
Gtk::Menu* mute_menu;
Gtk::Menu* solo_menu;
+ Gtk::Menu* remote_control_menu;
XMLNode *xml_node;
void ensure_xml_node ();
@@ -92,6 +93,8 @@ class RouteUI : public virtual AxisView
void session_rec_enable_changed();
void build_solo_menu (void);
+ void build_remote_control_menu (void);
+ void refresh_remote_control_menu ();
void solo_safe_toggle (void*, Gtk::CheckMenuItem*);
void toggle_solo_safe (Gtk::CheckMenuItem*);
@@ -123,8 +126,6 @@ class RouteUI : public virtual AxisView
virtual void name_changed (void *src);
void route_removed ();
- static gint okay_gplusplus_cannot_do_complex_templates (RouteUI *rui);
-
Gtk::CheckMenuItem *route_active_menu_item;
void toggle_route_active ();
virtual void route_active_changed ();
@@ -137,6 +138,8 @@ class RouteUI : public virtual AxisView
void update_solo_display ();
virtual void map_frozen ();
+ void set_remote_control_id (uint32_t id, Gtk::CheckMenuItem* item);
+
void reversibly_apply_route_boolean (string name, void (ARDOUR::Route::*func)(bool, void*), bool, void *);
void reversibly_apply_audio_track_boolean (string name, void (ARDOUR::AudioTrack::*func)(bool, void*), bool, void *);
};
diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc
index 4213bc8431..a8b7499644 100644
--- a/gtk2_ardour/streamview.cc
+++ b/gtk2_ardour/streamview.cc
@@ -470,7 +470,7 @@ StreamView::redisplay_diskstream ()
if (!(*i)->is_valid()) {
delete *i;
region_views.erase (i);
- }
+ }
i = tmp;
}
diff --git a/libs/ardour/ardour/configuration.h b/libs/ardour/ardour/configuration.h
index 140490d46d..fd44d27329 100644
--- a/libs/ardour/ardour/configuration.h
+++ b/libs/ardour/ardour/configuration.h
@@ -124,6 +124,9 @@ class Configuration : public Stateful
bool get_use_hardware_monitoring();
void set_use_hardware_monitoring(bool);
+ bool get_use_sw_monitoring();
+ void set_use_sw_monitoring(bool);
+
bool get_jack_time_master();
void set_jack_time_master(bool);
@@ -133,9 +136,6 @@ class Configuration : public Stateful
bool get_plugins_stop_with_transport();
void set_plugins_stop_with_transport(bool);
- bool get_no_sw_monitoring();
- void set_no_sw_monitoring(bool);
-
bool get_stop_recording_on_xrun();
void set_stop_recording_on_xrun(bool);
@@ -220,12 +220,12 @@ class Configuration : public Stateful
bool trace_midi_output_is_user;
bool plugins_stop_with_transport;
bool plugins_stop_with_transport_is_user;
- bool no_sw_monitoring;
- bool no_sw_monitoring_is_user;
+ bool use_sw_monitoring;
+ bool use_sw_monitoring_is_user;
bool stop_recording_on_xrun;
bool stop_recording_on_xrun_is_user;
- bool verify_remove_last_capture;
- bool verify_remove_last_capture_is_user;
+ bool verify_remove_last_capture;
+ bool verify_remove_last_capture_is_user;
bool stop_at_session_end;
bool stop_at_session_end_is_user;
bool seamless_looping;
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 9c0edcdad4..ed4b695bff 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -245,6 +245,10 @@ class Route : public IO
void protect_automation ();
+ void set_remote_control_id (uint32_t id);
+ uint32_t remote_control_id () const;
+ sigc::signal<void> RemoteControlIDChanged;
+
protected:
friend class Session;
@@ -317,6 +321,7 @@ class Route : public IO
state_id_t _current_state_id;
uint32_t redirect_max_outs;
+ uint32_t _remote_control_id;
uint32_t pans_required() const;
uint32_t n_process_buffers ();
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 88f629e516..0b13cf5f30 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -391,7 +391,8 @@ class Session : public sigc::trackable, public Stateful
PunchOut,
SendMTC,
MMCControl,
- Live,
+ SoloLatch,
+ SoloingModel,
RecordingPlugins,
CrossFadesActive,
SendMMC,
@@ -399,7 +400,8 @@ class Session : public sigc::trackable, public Stateful
Clicking,
EditingMode,
PlayRange,
- AlignChoice,
+ LayeringModel,
+ CrossfadingModel,
SeamlessLoop,
MidiFeedback,
MidiControl
@@ -440,7 +442,7 @@ class Session : public sigc::trackable, public Stateful
bool get_recording_plugins () const { return recording_plugins; }
bool get_crossfades_active () const { return crossfades_active; }
- AutoConnectOption get_input_auto_connect () const { return input_auto_connect; }
+ bool get_input_auto_connect () const;
AutoConnectOption get_output_auto_connect () const { return output_auto_connect; }
enum LayerModel {
@@ -452,14 +454,9 @@ class Session : public sigc::trackable, public Stateful
void set_layer_model (LayerModel);
LayerModel get_layer_model () const { return layer_model; }
- sigc::signal<void> LayerModelChanged;
-
void set_xfade_model (CrossfadeModel);
CrossfadeModel get_xfade_model () const { return xfade_model; }
- void set_align_style (AlignStyle);
- AlignStyle get_align_style () const { return align_style; }
-
void add_event (jack_nframes_t action_frame, Event::Type type, jack_nframes_t target_frame = 0);
void remove_event (jack_nframes_t frame, Event::Type type);
void clear_events (Event::Type type);
@@ -1719,8 +1716,6 @@ class Session : public sigc::trackable, public Stateful
AutoConnectOption input_auto_connect;
AutoConnectOption output_auto_connect;
- AlignStyle align_style;
-
gain_t* _gain_automation_buffer;
pan_t** _pan_automation_buffer;
void allocate_pan_automation_buffers (jack_nframes_t nframes, uint32_t howmany, bool force);
diff --git a/libs/ardour/ardour/state_manager.h b/libs/ardour/ardour/state_manager.h
index faedc120ee..105ca38dcc 100644
--- a/libs/ardour/ardour/state_manager.h
+++ b/libs/ardour/ardour/state_manager.h
@@ -3,6 +3,7 @@
#include <list>
#include <string>
+#include <vector>
#include <sigc++/signal.h>
@@ -35,7 +36,14 @@ class StateManager : public sigc::trackable
state_id_t _current_state_id;
+ static void set_allow_save (bool);
+ static bool allow_save ();
+
protected:
+ static bool _allow_save;
+ typedef std::pair<StateManager*,std::string> DeferredSave;
+ static std::vector<DeferredSave> deferred;
+
StateMap states;
virtual Change restore_state (State&) = 0;
diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc
index 73e0a91164..9c68c61114 100644
--- a/libs/ardour/audio_playlist.cc
+++ b/libs/ardour/audio_playlist.cc
@@ -576,7 +576,6 @@ AudioPlaylist::state_factory (std::string why) const
for (Crossfades::const_iterator i = _crossfades.begin(); i != _crossfades.end(); ++i) {
state->crossfade_states.push_back ((*i)->get_memento());
}
-
return state;
}
@@ -592,13 +591,13 @@ AudioPlaylist::restore_state (StateManager::State& state)
regions = apstate->regions;
for (list<UndoAction>::iterator s = apstate->region_states.begin(); s != apstate->region_states.end(); ++s) {
- *s;
+ (*s) ();
}
_crossfades = apstate->crossfades;
for (list<UndoAction>::iterator s = apstate->crossfade_states.begin(); s != apstate->crossfade_states.end(); ++s) {
- *s;
+ (*s) ();
}
in_set_state = false;
@@ -611,7 +610,7 @@ AudioPlaylist::restore_state (StateManager::State& state)
UndoAction
AudioPlaylist::get_memento () const
{
- return sigc::bind (mem_fun (*(const_cast<AudioPlaylist*> (this)), &StateManager::use_state), _current_state_id);
+ return sigc::bind (mem_fun (*(const_cast<AudioPlaylist*> (this)), &StateManager::use_state), _current_state_id);
}
void
diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc
index 1d3f32ae6b..4a922d631d 100644
--- a/libs/ardour/audio_track.cc
+++ b/libs/ardour/audio_track.cc
@@ -322,6 +322,24 @@ AudioTrack::set_state (const XMLNode& node)
}
}
+
+ XMLNodeList nlist;
+ XMLNodeConstIterator niter;
+ XMLNode *child;
+
+ nlist = node.children();
+ for (niter = nlist.begin(); niter != nlist.end(); ++niter){
+ child = *niter;
+
+ if (child->name() == X_("remote_control")) {
+ if ((prop = child->property (X_("id"))) != 0) {
+ int32_t x;
+ sscanf (prop->value().c_str(), "%d", &x);
+ set_remote_control_id (x);
+ }
+ }
+ }
+
pending_state = const_cast<XMLNode*> (&node);
_session.StateReady.connect (mem_fun (*this, &AudioTrack::set_state_part_two));
@@ -393,7 +411,11 @@ AudioTrack::get_state()
set_midi_node_info (child, ev, chn, additional);
}
-
+ XMLNode* remote_control_node = new XMLNode (X_("remote_control"));
+ snprintf (buf, sizeof (buf), "%d", _remote_control_id);
+ remote_control_node->add_property (X_("id"), buf);
+ root.add_child_nocopy (*remote_control_node);
+
return root;
}
@@ -519,17 +541,17 @@ AudioTrack::no_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nf
} else {
if (_session.get_auto_input()) {
- if (Config->get_no_sw_monitoring()) {
- send_silence = true;
- } else {
+ if (Config->get_use_sw_monitoring()) {
send_silence = false;
+ } else {
+ send_silence = true;
}
} else {
if (diskstream->record_enabled()) {
- if (Config->get_no_sw_monitoring()) {
- send_silence = true;
- } else {
+ if (Config->get_use_sw_monitoring()) {
send_silence = false;
+ } else {
+ send_silence = true;
}
} else {
send_silence = true;
diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc
index 8d4a5f0177..bc14968fa7 100644
--- a/libs/ardour/audioregion.cc
+++ b/libs/ardour/audioregion.cc
@@ -376,7 +376,7 @@ AudioRegion::restore_state (StateManager::State& sstate)
UndoAction
AudioRegion::get_memento() const
{
- return sigc::bind (mem_fun (*(const_cast<AudioRegion *> (this)), &StateManager::use_state), _current_state_id);
+ return sigc::bind (mem_fun (*(const_cast<AudioRegion *> (this)), &StateManager::use_state), _current_state_id);
}
bool
diff --git a/libs/ardour/configuration.cc b/libs/ardour/configuration.cc
index 0de30a3538..28f13aabb8 100644
--- a/libs/ardour/configuration.cc
+++ b/libs/ardour/configuration.cc
@@ -257,8 +257,8 @@ Configuration::state (bool user_only)
if (!user_only || plugins_stop_with_transport_is_user) {
node->add_child_nocopy(option_node("plugins-stop-with-transport", plugins_stop_with_transport?"yes":"no"));
}
- if (!user_only || no_sw_monitoring_is_user) {
- node->add_child_nocopy(option_node("no-sw-monitoring", no_sw_monitoring?"yes":"no"));
+ if (!user_only || use_sw_monitoring_is_user) {
+ node->add_child_nocopy(option_node("use-sw-monitoring", use_sw_monitoring?"yes":"no"));
}
if (!user_only || stop_recording_on_xrun_is_user) {
node->add_child_nocopy(option_node("stop-recording-on-xrun", stop_recording_on_xrun?"yes":"no"));
@@ -400,8 +400,10 @@ Configuration::set_state (const XMLNode& root)
set_trace_midi_output (option_value == "yes");
} else if (option_name == "plugins-stop-with-transport") {
set_plugins_stop_with_transport (option_value == "yes");
- } else if (option_name == "no-sw-monitoring") {
- set_no_sw_monitoring (option_value == "yes");
+ } else if (option_name == "use-sw-monitoring") {
+ set_use_sw_monitoring (option_value == "yes");
+ } else if (option_name == "no-sw-monitoring") { /* DEPRECATED */
+ set_use_sw_monitoring (option_value != "yes");
} else if (option_name == "stop-recording-on-xrun") {
set_stop_recording_on_xrun (option_value == "yes");
} else if (option_name == "verify-remove-last-capture") {
@@ -475,7 +477,7 @@ Configuration::set_defaults ()
trace_midi_input = false;
trace_midi_output = false;
plugins_stop_with_transport = false;
- no_sw_monitoring = false;
+ use_sw_monitoring = true;
stop_recording_on_xrun = false;
verify_remove_last_capture = true;
stop_at_session_end = true;
@@ -514,7 +516,7 @@ Configuration::set_defaults ()
trace_midi_input_is_user = false;
trace_midi_output_is_user = false;
plugins_stop_with_transport_is_user = false;
- no_sw_monitoring_is_user = false;
+ use_sw_monitoring_is_user = false;
stop_recording_on_xrun_is_user = false;
verify_remove_last_capture_is_user = false;
stop_at_session_end_is_user = false;
@@ -948,17 +950,17 @@ Configuration::set_plugins_stop_with_transport (bool yn)
}
bool
-Configuration::get_no_sw_monitoring ()
+Configuration::get_use_sw_monitoring ()
{
- return no_sw_monitoring;
+ return use_sw_monitoring;
}
void
-Configuration::set_no_sw_monitoring (bool yn)
+Configuration::set_use_sw_monitoring (bool yn)
{
- no_sw_monitoring = yn;
+ use_sw_monitoring = yn;
if (user_configuration) {
- no_sw_monitoring_is_user = true;
+ use_sw_monitoring_is_user = true;
}
}
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index 8977135ba7..7772fcbf82 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -223,8 +223,6 @@ Playlist::init (bool hide)
layer_op_counter = 0;
freeze_length = 0;
- // _session.LayerModelChanged.connect (slot (*this, &Playlist::relayer));
-
Modified.connect (mem_fun (*this, &Playlist::mark_session_dirty));
}
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 6e07ef90f2..5fcbd53bb6 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -86,6 +86,7 @@ Route::init ()
_have_internal_generator = false;
_declickable = false;
_pending_declick = true;
+ _remote_control_id = 0;
_edit_group = 0;
_mix_group = 0;
@@ -118,6 +119,21 @@ Route::~Route ()
}
}
+void
+Route::set_remote_control_id (uint32_t id)
+{
+ if (id != _remote_control_id) {
+ _remote_control_id = id;
+ RemoteControlIDChanged ();
+ }
+}
+
+uint32_t
+Route::remote_control_id() const
+{
+ return _remote_control_id;
+}
+
long
Route::order_key (string name) const
{
@@ -213,7 +229,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
IO *co;
bool mute_audible;
bool solo_audible;
- bool no_monitor = (Config->get_use_hardware_monitoring() || Config->get_no_sw_monitoring ());
+ bool no_monitor = (Config->get_use_hardware_monitoring() || !Config->get_use_sw_monitoring ());
gain_t* gab = _session.gain_automation_buffer();
declick = _pending_declick;
@@ -406,7 +422,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
// AND software monitoring required
- !Config->get_no_sw_monitoring())) {
+ Config->get_use_sw_monitoring())) {
if (apply_gain_automation) {
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index f811fbd0af..726d3070bb 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -989,6 +989,12 @@ Session::set_input_auto_connect (bool yn)
set_dirty ();
}
+bool
+Session::get_input_auto_connect () const
+{
+ return (input_auto_connect & AutoConnectPhysical);
+}
+
void
Session::set_output_auto_connect (AutoConnectOption aco)
{
@@ -1715,6 +1721,8 @@ Session::new_audio_track (int input_channels, int output_channels)
track->diskstream_changed.connect (mem_fun (this, &Session::resort_routes));
add_route (track);
+
+ track->set_remote_control_id (ntracks());
}
catch (failed_constructor &err) {
@@ -2031,8 +2039,11 @@ Session::route_solo_changed (void* src, Route* route)
void
Session::set_solo_latched (bool yn)
{
- _solo_latched = yn;
- set_dirty ();
+ if (yn != _solo_latched) {
+ _solo_latched = yn;
+ set_dirty ();
+ ControlChanged (SoloLatch);
+ }
}
void
@@ -3305,21 +3316,13 @@ Session::n_playlists () const
}
void
-Session::set_align_style (AlignStyle style)
-{
- align_style = style;
-
- foreach_diskstream (&DiskStream::set_capture_offset);
-
- set_dirty ();
- ControlChanged (AlignChoice);
-}
-
-void
Session::set_solo_model (SoloModel sm)
{
- _solo_model = sm;
- set_dirty ();
+ if (sm != _solo_model) {
+ _solo_model = sm;
+ ControlChanged (SoloingModel);
+ set_dirty ();
+ }
}
void
@@ -3555,15 +3558,20 @@ Session::nbusses () const
void
Session::set_layer_model (LayerModel lm)
{
- layer_model = lm;
- LayerModelChanged (); /* EMIT SIGNAL */
- set_dirty ();
+ if (lm != layer_model) {
+ layer_model = lm;
+ set_dirty ();
+ ControlChanged (LayeringModel);
+ }
}
void
Session::set_xfade_model (CrossfadeModel xm)
{
- xfade_model = xm;
- set_dirty ();
+ if (xm != xfade_model) {
+ xfade_model = xm;
+ set_dirty ();
+ ControlChanged (CrossfadingModel);
+ }
}
diff --git a/libs/ardour/session_feedback.cc b/libs/ardour/session_feedback.cc
index 2e6d0cd80b..840cb6a97d 100644
--- a/libs/ardour/session_feedback.cc
+++ b/libs/ardour/session_feedback.cc
@@ -204,7 +204,7 @@ Session::feedback_thread_work ()
tmp = i;
++tmp;
- if ((*i)) {
+ if ((*i) ()) {
feedback_functions.erase (i);
}
diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc
index 18d8b3672b..56e593086a 100644
--- a/libs/ardour/session_midi.cc
+++ b/libs/ardour/session_midi.cc
@@ -803,19 +803,14 @@ Session::mmc_record_enable (MIDI::MachineControl &mmc, size_t trk, bool enabled)
{
if (mmc_control) {
- /* don't take route or diskstream lock: if using dynamic punch,
- this could cause a dropout. XXX is that really OK?
- or should we queue a rec-enable request?
- */
-
- size_t n;
RouteList::iterator i;
-
- for (n = 0, i = routes.begin(); i != routes.end(); ++i) {
+ RWLockMonitor (route_lock, false, __LINE__, __FILE__);
+
+ for (i = routes.begin(); i != routes.end(); ++i) {
AudioTrack *at;
if ((at = dynamic_cast<AudioTrack*>(*i)) != 0) {
- if (n++ == trk) {
+ if (trk == at->remote_control_id()) {
at->set_record_enable (enabled, &mmc);
break;
}
@@ -1468,7 +1463,7 @@ Session::midi_thread_work ()
tmp = i;
++tmp;
- if (!(*i)) {
+ if (!(*i)()) {
midi_timeouts.erase (i);
}
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 53ca23a366..7a88443dbd 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -177,7 +177,6 @@ Session::first_stage_init (string fullpath, string snapshot_name)
_edit_mode = Slide;
pending_edit_mode = _edit_mode;
_play_range = false;
- align_style = ExistingMaterial;
_control_out = 0;
_master_out = 0;
input_auto_connect = AutoConnectOption (0);
@@ -988,16 +987,6 @@ Session::load_options (const XMLNode& node)
}
}
- if ((child = find_named_node (node, "align-style")) != 0) {
- if ((prop = child->property ("val")) != 0) {
- if (prop->value() == "capture") {
- set_align_style (CaptureTime);
- } else {
- set_align_style (ExistingMaterial);
- }
- }
- }
-
if ((child = find_named_node (node, "layer-model")) != 0) {
if ((prop = child->property ("val")) != 0) {
if (prop->value() == X_("LaterHigher")) {
@@ -1197,9 +1186,6 @@ Session::get_options () const
child = opthead->add_child ("solo-model");
child->add_property ("val", _solo_model == SoloBus ? "SoloBus" : "InverseMute");
- child = opthead->add_child ("align-style");
- child->add_property ("val", (align_style == ExistingMaterial ? "existing" : "capture"));
-
child = opthead->add_child ("layer-model");
switch (layer_model) {
case LaterHigher:
@@ -1450,6 +1436,7 @@ Session::set_state (const XMLNode& node)
XMLNodeList nlist;
XMLNode* child;
const XMLProperty* prop;
+ int ret = -1;
_state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave);
@@ -1458,6 +1445,8 @@ Session::set_state (const XMLNode& node)
return -1;
}
+ StateManager::set_allow_save (false);
+
if ((prop = node.property ("name")) != 0) {
_name = prop->value ();
}
@@ -1483,7 +1472,6 @@ Session::set_state (const XMLNode& node)
*/
if (use_config_midi_ports ()) {
- return -1;
}
if ((child = find_named_node (node, "Path")) != 0) {
@@ -1500,63 +1488,61 @@ Session::set_state (const XMLNode& node)
if ((child = find_named_node (node, "Options")) == 0) {
error << _("Session: XML state has no options section") << endmsg;
- return -1;
} else if (load_options (*child)) {
- return -1;
}
if ((child = find_named_node (node, "Sources")) == 0) {
error << _("Session: XML state has no sources section") << endmsg;
- return -1;
+ goto out;
} else if (load_sources (*child)) {
- return -1;
+ goto out;
}
if ((child = find_named_node (node, "Regions")) == 0) {
error << _("Session: XML state has no Regions section") << endmsg;
- return -1;
+ goto out;
} else if (load_regions (*child)) {
- return -1;
+ goto out;
}
if ((child = find_named_node (node, "Playlists")) == 0) {
error << _("Session: XML state has no playlists section") << endmsg;
- return -1;
+ goto out;
} else if (load_playlists (*child)) {
- return -1;
+ goto out;
}
if ((child = find_named_node (node, "UnusedPlaylists")) == 0) {
// this is OK
} else if (load_unused_playlists (*child)) {
- return -1;
+ goto out;
}
if ((child = find_named_node (node, "NamedSelections")) != 0) {
if (load_named_selections (*child)) {
- return -1;
+ goto out;
}
}
if ((child = find_named_node (node, "DiskStreams")) == 0) {
error << _("Session: XML state has no diskstreams section") << endmsg;
- return -1;
+ goto out;
} else if (load_diskstreams (*child)) {
- return -1;
+ goto out;
}
if ((child = find_named_node (node, "Connections")) == 0) {
error << _("Session: XML state has no connections section") << endmsg;
- return -1;
+ goto out;
} else if (load_connections (*child)) {
- return -1;
+ goto out;
}
if ((child = find_named_node (node, "Locations")) == 0) {
error << _("Session: XML state has no locations section") << endmsg;
- return -1;
+ goto out;
} else if (_locations.set_state (*child)) {
- return -1;
+ goto out;
}
Location* location;
@@ -1579,30 +1565,30 @@ Session::set_state (const XMLNode& node)
if ((child = find_named_node (node, "EditGroups")) == 0) {
error << _("Session: XML state has no edit groups section") << endmsg;
- return -1;
+ goto out;
} else if (load_edit_groups (*child)) {
- return -1;
+ goto out;
}
if ((child = find_named_node (node, "MixGroups")) == 0) {
error << _("Session: XML state has no mix groups section") << endmsg;
- return -1;
+ goto out;
} else if (load_mix_groups (*child)) {
- return -1;
+ goto out;
}
if ((child = find_named_node (node, "TempoMap")) == 0) {
error << _("Session: XML state has no Tempo Map section") << endmsg;
- return -1;
+ goto out;
} else if (_tempo_map->set_state (*child)) {
- return -1;
+ goto out;
}
if ((child = find_named_node (node, "Routes")) == 0) {
error << _("Session: XML state has no routes section") << endmsg;
- return -1;
+ goto out;
} else if (load_routes (*child)) {
- return -1;
+ goto out;
}
if ((child = find_named_node (node, "Click")) == 0) {
@@ -1621,13 +1607,20 @@ Session::set_state (const XMLNode& node)
_state_of_the_state = Clean;
+ StateManager::set_allow_save (true);
+
if (state_was_pending) {
save_state (_current_snapshot_name);
remove_pending_capture_state ();
state_was_pending = false;
}
- return 0;
+ ret = 0;
+
+ out:
+ /* yes, doing it twice doesn't hurt and makes the code easier */
+ StateManager::set_allow_save (true);
+ return ret;
}
int
diff --git a/libs/ardour/state_manager.cc b/libs/ardour/state_manager.cc
index de9a72b40a..4bb44dbc95 100644
--- a/libs/ardour/state_manager.cc
+++ b/libs/ardour/state_manager.cc
@@ -4,6 +4,10 @@
#include "i18n.h"
using namespace ARDOUR;
+using namespace std;
+
+bool StateManager::_allow_save = true;
+vector<StateManager::DeferredSave> StateManager::deferred;
StateManager::StateManager ()
{
@@ -15,6 +19,19 @@ StateManager::~StateManager()
}
void
+StateManager::set_allow_save (bool yn)
+{
+ _allow_save = yn;
+
+ if (yn) {
+ for (vector<DeferredSave>::iterator x = deferred.begin(); x != deferred.end(); ++x) {
+ (*x).first->save_state ((*x).second);
+ }
+ deferred.clear ();
+ }
+}
+
+void
StateManager::drop_all_states ()
{
for (StateMap::iterator i = states.begin(); i != states.end(); ++i) {
@@ -32,13 +49,12 @@ StateManager::use_state (state_id_t id)
Change what_changed;
state_id_t n;
StateMap::iterator i;
-
+
for (n = 0, i = states.begin(); n < id && i != states.end(); ++n, ++i);
if (n != id || i == states.end()) {
fatal << string_compose (_("programming error: illegal state ID (%1) passed to "
- "StateManager::set_state() (range = 0-%3)"), id,
- states.size()-1)
+ "StateManager::set_state() (range = 0-%2)"), id, states.size()-1)
<< endmsg;
/*NOTREACHED*/
return;
@@ -52,6 +68,11 @@ StateManager::use_state (state_id_t id)
void
StateManager::save_state (std::string why)
{
+ if (!_allow_save) {
+ deferred.push_back (DeferredSave (this, why));
+ return;
+ }
+
states.push_back (state_factory (why));
_current_state_id = states.size() - 1;
}
diff --git a/libs/pbd3/undo.cc b/libs/pbd3/undo.cc
index 0af1cc2e7a..482cb5cf37 100644
--- a/libs/pbd3/undo.cc
+++ b/libs/pbd3/undo.cc
@@ -77,6 +77,7 @@ UndoCommand::clear ()
void
UndoCommand::undo ()
{
+ cerr << "There are " << undo_actions.size() << " actions to undo\n";
for (list<UndoAction>::reverse_iterator i = undo_actions.rbegin(); i != undo_actions.rend(); ++i) {
(*i)();
}
@@ -99,12 +100,14 @@ UndoHistory::add (UndoCommand uc)
void
UndoHistory::undo (unsigned int n)
{
+ cerr << "Undo history undoing " << n << " with a list of " << UndoList.size() << endl;
while (n--) {
if (UndoList.size() == 0) {
return;
}
UndoCommand uc = UndoList.back ();
UndoList.pop_back ();
+ cerr << "undoing command called " << uc.name() << endl;
uc.undo ();
RedoList.push_back (uc);
}