set_tip (midi_panic_button, _("MIDI Panic\nSend note off and reset controller messages on all MIDI channels"));
set_tip (auto_return_button, _("Return to last playback start when stopped"));
set_tip (follow_edits_button, _("Playhead follows Range tool clicks, and Range selections"));
- set_tip (auto_input_button, _("Be sensible about input monitoring"));
+ set_tip (auto_input_button, _("Track Input Monitoring automatically follows transport state"));
set_tip (click_button, _("Enable/Disable audio click"));
set_tip (solo_alert_button, _("When active, something is soloed.\nClick to de-solo everything"));
set_tip (auditioning_alert_button, _("When active, auditioning is taking place.\nClick to stop the audition"));
act = ActionManager::get_action ("Transport", "TogglePunchOut");
punch_out_button.set_related_action (act);
+ act = ActionManager::get_action ("Transport", "SessionMonitorIn");
+ monitor_in_button.set_related_action (act);
+ act = ActionManager::get_action ("Transport", "SessionMonitorDisk");
+ monitor_disk_button.set_related_action (act);
+
/* connect signals */
ARDOUR_UI::Clock.connect (sigc::mem_fun (primary_clock, &AudioClock::set));
ARDOUR_UI::Clock.connect (sigc::mem_fun (secondary_clock, &AudioClock::set));
auto_return_button.set_name ("transport option button");
follow_edits_button.set_name ("transport option button");
- auto_input_button.set_name ("transport option button");
solo_alert_button.set_name ("rude solo");
auditioning_alert_button.set_name ("rude audition");
punch_out_button.set_name ("punch button");
layered_button.set_name (("layered button"));
+ monitor_in_button.set_name ("punch button"); // XXX
+ monitor_disk_button.set_name ("punch button"); // XXX
+ auto_input_button.set_name ("transport option button");
+
click_button.set_name ("transport button");
sync_button.set_name ("transport active option button");
/* and widget text */
auto_return_button.set_text(_("Auto Return"));
follow_edits_button.set_text(_("Follow Range"));
- //auto_input_button.set_text (_("Auto Input"));
punch_in_button.set_text (_("In"));
punch_out_button.set_text (_("Out"));
layered_button.set_text (_("Non-Layered"));
+ monitor_in_button.set_text (_("All In"));
+ monitor_disk_button.set_text (_("All Disk"));
+ auto_input_button.set_text (_("Auto-Input"));
+
punch_label.set_text (_("Punch:"));
layered_label.set_text (_("Rec:"));
Gtkmm2ext::UI::instance()->set_tip (punch_in_button, _("Start recording at auto-punch start"));
Gtkmm2ext::UI::instance()->set_tip (punch_out_button, _("Stop recording at auto-punch end"));
+ Gtkmm2ext::UI::instance()->set_tip (monitor_in_button, _("Force all implicit monitoed tracks to monitor input"));
+ Gtkmm2ext::UI::instance()->set_tip (monitor_disk_button, _("Force all implicit monitored tracks to disk-monitoring"));
+
/* setup icons */
click_button.set_icon (ArdourIcon::TransportMetronom);
punch_button_size_group->add_widget (punch_in_button);
punch_button_size_group->add_widget (punch_out_button);
+ Glib::RefPtr<SizeGroup> monitor_button_size_group = SizeGroup::create (Gtk::SIZE_GROUP_HORIZONTAL);
+ monitor_button_size_group->add_widget (monitor_in_button);
+ monitor_button_size_group->add_widget (monitor_disk_button);
+
/* and now the layout... */
/* top level packing */
transport_table.attach (layered_label, TCOL, 1, 2 , FILL, SHRINK, 3, 0);
++col;
- transport_table.attach (punch_in_button, col, col + 1, 0, 1 , FILL, SHRINK, 0, 2);
+ transport_table.attach (punch_in_button, col, col + 1, 0, 1 , FILL, SHRINK, 0, 2);
transport_table.attach (*(manage (new Label (""))), col + 1, col + 2, 0, 1 , FILL, SHRINK, 2, 2);
- transport_table.attach (punch_out_button, col + 2, col + 3, 0, 1 , FILL, SHRINK, 0, 2);
- transport_table.attach (layered_button, col, col + 3, 1, 2 , FILL, SHRINK, 0, 2);
+ transport_table.attach (punch_out_button, col + 2, col + 3, 0, 1 , FILL, SHRINK, 0, 2);
+ transport_table.attach (layered_button, col, col + 3, 1, 2 , FILL, SHRINK, 0, 2);
+ col += 3;
+
+ transport_table.attach (*(manage (new ArdourVSpacer ())), TCOL, 0, 2 , SHRINK, EXPAND|FILL, 3, 0);
+ ++col;
+
+ transport_table.attach (monitor_in_button, col, col + 1, 0, 1 , FILL, SHRINK, 0, 2);
+ transport_table.attach (*(manage (new Label (""))), col + 1, col + 2, 0, 1 , FILL, SHRINK, 2, 2);
+ transport_table.attach (monitor_disk_button, col + 2, col + 3, 0, 1 , FILL, SHRINK, 0, 2);
+ transport_table.attach (auto_input_button, col, col + 3, 1, 2 , FILL, SHRINK, 0, 2);
col += 3;
transport_table.attach (*(manage (new ArdourVSpacer ())), TCOL, 0, 2 , SHRINK, EXPAND|FILL, 3, 0);
#include "pbd/convert.h"
#include "pbd/stacktrace.h"
+#include "pbd/unwind.h"
#include <gtkmm2ext/utils.h>
ActionManager::toggle_config_state ("Transport", "ToggleClick", &RCConfiguration::set_clicking, &RCConfiguration::get_clicking);
}
+void
+ARDOUR_UI::toggle_session_monitoring_in ()
+{
+ if (ignore_session_monitoring) {
+ return;
+ }
+ Glib::RefPtr<Action> act = ActionManager::get_action (X_("Transport"), X_("SessionMonitorIn"));
+ if (!act) {
+ return;
+ }
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+ if (!tact) {
+ return;
+ }
+ if (tact->get_active()) {
+ Glib::RefPtr<Action> dact = ActionManager::get_action (X_("Transport"), X_("SessionMonitorDisk"));
+ if (dact) {
+ Glib::RefPtr<ToggleAction> tdact = Glib::RefPtr<ToggleAction>::cast_dynamic(dact);
+ if (tdact) {
+ PBD::Unwinder<bool> (ignore_session_monitoring, true);
+ tdact->set_active (false);
+ }
+ }
+ _session->config.set_session_monitoring (MonitorInput);
+ } else {
+ _session->config.set_session_monitoring (MonitorAuto);
+ }
+}
+
+void
+ARDOUR_UI::toggle_session_monitoring_disk ()
+{
+ if (ignore_session_monitoring) {
+ return;
+ }
+ Glib::RefPtr<Action> act = ActionManager::get_action (X_("Transport"), X_("SessionMonitorDisk"));
+ if (!act) {
+ return;
+ }
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+ if (!tact) {
+ return;
+ }
+ if (tact->get_active()) {
+ Glib::RefPtr<Action> iact = ActionManager::get_action (X_("Transport"), X_("SessionMonitorIn"));
+ if (iact) {
+ Glib::RefPtr<ToggleAction> tiact = Glib::RefPtr<ToggleAction>::cast_dynamic(iact);
+ if (tiact) {
+ PBD::Unwinder<bool> (ignore_session_monitoring, true);
+ tiact->set_active (false);
+ }
+ }
+ _session->config.set_session_monitoring (MonitorDisk);
+ } else {
+ _session->config.set_session_monitoring (MonitorAuto);
+ }
+}
+
void
ARDOUR_UI::unset_dual_punch ()
{
ActionManager::map_some_state ("Transport", "ToggleAutoReturn", sigc::mem_fun (_session->config, &SessionConfiguration::get_auto_return));
} else if (p == "auto-input") {
ActionManager::map_some_state ("Transport", "ToggleAutoInput", sigc::mem_fun (_session->config, &SessionConfiguration::get_auto_input));
+ } else if (p == "session-monitoring") {
+ Glib::RefPtr<Action> iact = ActionManager::get_action (X_("Transport"), X_("SessionMonitorIn"));
+ Glib::RefPtr<Action> dact = ActionManager::get_action (X_("Transport"), X_("SessionMonitorDisk"));
+ if (iact && dact) {
+ Glib::RefPtr<ToggleAction> tdact = Glib::RefPtr<ToggleAction>::cast_dynamic(dact);
+ Glib::RefPtr<ToggleAction> tiact = Glib::RefPtr<ToggleAction>::cast_dynamic(iact);
+ if (tdact && tiact) {
+ switch (_session->config.get_session_monitoring ()) {
+ case MonitorDisk:
+ tdact->set_active (true);
+ break;
+ case MonitorInput:
+ tiact->set_active (true);
+ break;
+ default:
+ tdact->set_active (false);
+ tiact->set_active (false);
+ break;
+ }
+ }
+ }
} else if (p == "punch-out") {
ActionManager::map_some_state ("Transport", "TogglePunchOut", sigc::mem_fun (_session->config, &SessionConfiguration::get_punch_out));
if (!_session->config.get_punch_out()) {