Merge libs/ardour and gtk2_ardour with 2.0-ongoing R2837.
[ardour.git] / gtk2_ardour / ardour_ui_options.cc
1 /*
2     Copyright (C) 2005 Paul Davis 
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include <pbd/convert.h>
21 #include <pbd/stacktrace.h>
22
23 #include <gtkmm2ext/utils.h>
24
25 #include <ardour/configuration.h>
26 #include <ardour/session.h>
27 #include <ardour/audioengine.h>
28
29 #ifdef HAVE_LIBLO
30 #include <ardour/osc.h>
31 #endif
32
33 #include "ardour_ui.h"
34 #include "actions.h"
35 #include "gui_thread.h"
36 #include "public_editor.h"
37
38 #include "i18n.h"
39
40 using namespace Gtk;
41 using namespace Gtkmm2ext;
42 using namespace ARDOUR;
43 using namespace PBD;
44 using namespace sigc;
45
46 void
47 ARDOUR_UI::toggle_time_master ()
48 {
49         ActionManager::toggle_config_state ("Transport", "ToggleTimeMaster", &Configuration::set_jack_time_master, &Configuration::get_jack_time_master);
50 }
51
52 void
53 ARDOUR_UI::toggle_send_mtc ()
54 {
55         ActionManager::toggle_config_state ("options", "SendMTC", &Configuration::set_send_mtc, &Configuration::get_send_mtc);
56 }
57
58 void
59 ARDOUR_UI::toggle_send_mmc ()
60 {
61         ActionManager::toggle_config_state ("options", "SendMMC", &Configuration::set_send_mmc, &Configuration::get_send_mmc);
62 }
63
64 void
65 ARDOUR_UI::toggle_use_mmc ()
66 {
67         ActionManager::toggle_config_state ("options", "UseMMC", &Configuration::set_mmc_control, &Configuration::get_mmc_control);
68 }
69
70 void
71 ARDOUR_UI::toggle_use_osc ()
72 {
73         ActionManager::toggle_config_state ("options", "UseOSC", &Configuration::set_use_osc, &Configuration::get_use_osc);
74 }
75
76 void
77 ARDOUR_UI::toggle_send_midi_feedback ()
78 {
79         ActionManager::toggle_config_state ("options", "SendMIDIfeedback", &Configuration::set_midi_feedback, &Configuration::get_midi_feedback);
80 }
81
82 void
83 ARDOUR_UI::toggle_denormal_protection ()
84 {
85         ActionManager::toggle_config_state ("options", "DenormalProtection", &Configuration::set_denormal_protection, &Configuration::get_denormal_protection);
86 }
87
88 void
89 ARDOUR_UI::toggle_only_copy_imported_files ()
90 {
91         ActionManager::toggle_config_state ("options", "OnlyCopyImportedFiles", &Configuration::set_only_copy_imported_files, &Configuration::get_only_copy_imported_files);
92 }
93
94
95 void
96 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
97 {
98         const char *action = 0;
99
100         switch (hf) {
101         case BWF:
102                 action = X_("FileHeaderFormatBWF");
103                 break;
104         case WAVE:
105                 action = X_("FileHeaderFormatWAVE");
106                 break;
107         case WAVE64:
108                 action = X_("FileHeaderFormatWAVE64");
109                 break;
110         case iXML:
111                 action = X_("FileHeaderFormatiXML");
112                 break;
113         case RF64:
114                 action = X_("FileHeaderFormatRF64");
115                 break;
116         case CAF:
117                 action = X_("FileHeaderFormatCAF");
118                 break;
119         case AIFF:
120                 action = X_("FileHeaderFormatAIFF");
121                 break;
122         default:
123                 fatal << string_compose (_("programming error: %1"), "illegal file header format in ::set_native_file_header_format") << endmsg;
124                 /*NOTREACHED*/  
125         }
126
127         Glib::RefPtr<Action> act = ActionManager::get_action ("options", action);
128
129         if (act) {
130                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
131                 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
132                         Config->set_native_file_header_format (hf);
133                 }
134         }
135 }
136
137 void
138 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
139 {
140         const char* action = 0;
141
142         switch (sf) {
143         case FormatFloat:
144                 action = X_("FileDataFormatFloat");
145                 break;
146         case FormatInt24:
147                 action = X_("FileDataFormat24bit");
148                 break;
149         case FormatInt16:
150                 action = X_("FileDataFormat16bit");
151                 break;
152         default:
153                 fatal << string_compose (_("programming error: %1"), "illegal file data format in ::set_native_file_data_format") << endmsg;
154                 /*NOTREACHED*/
155         }
156
157         Glib::RefPtr<Action> act = ActionManager::get_action ("options", action);
158
159         if (act) {
160                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
161                 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
162                         Config->set_native_file_data_format (sf);
163                 }
164         }
165 }
166
167 void
168 ARDOUR_UI::set_input_auto_connect (AutoConnectOption option)
169 {
170         const char* action;
171         
172         switch (option) {
173         case AutoConnectPhysical:
174                 action = X_("InputAutoConnectPhysical");
175                 break;
176         default:
177                 action = X_("InputAutoConnectManual");
178         }
179
180         Glib::RefPtr<Action> act = ActionManager::get_action ("options", action);
181
182         if (act) {
183                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
184
185                 if (ract && ract->get_active() && Config->get_input_auto_connect() != option) {
186                         Config->set_input_auto_connect (option);
187                 }
188         }
189 }
190
191 void
192 ARDOUR_UI::set_output_auto_connect (AutoConnectOption option)
193 {
194         const char* action;
195         
196         switch (option) {
197         case AutoConnectPhysical:
198                 action = X_("OutputAutoConnectPhysical");
199                 break;
200         case AutoConnectMaster:
201                 action = X_("OutputAutoConnectMaster");
202                 break;
203         default:
204                 action = X_("OutputAutoConnectManual");
205         }
206
207         Glib::RefPtr<Action> act = ActionManager::get_action ("options", action);
208
209         if (act) {
210                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
211
212                 if (ract && ract->get_active() && Config->get_output_auto_connect() != option) {
213                         Config->set_output_auto_connect (option);
214                 }
215         }
216 }
217
218 void
219 ARDOUR_UI::set_solo_model (SoloModel model)
220 {
221         const char* action = 0;
222
223         switch (model) {
224         case SoloBus:
225                 action = X_("SoloViaBus");
226                 break;
227                 
228         case InverseMute:
229                 action = X_("SoloInPlace");
230                 break;
231         default:
232                 fatal << string_compose (_("programming error: unknown solo model in ARDOUR_UI::set_solo_model: %1"), model) << endmsg;
233                 /*NOTREACHED*/
234         }
235
236         Glib::RefPtr<Action> act = ActionManager::get_action ("options", action);
237
238         if (act) {
239                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
240
241                 if (ract && ract->get_active() && Config->get_solo_model() != model) {
242                         Config->set_solo_model (model);
243                 }
244         }
245
246 }
247
248 void
249 ARDOUR_UI::set_remote_model (RemoteModel model)
250 {
251         const char* action = 0;
252
253         switch (model) {
254         case UserOrdered:
255                 action = X_("RemoteUserDefined");
256                 break;
257         case MixerOrdered:
258                 action = X_("RemoteMixerDefined");
259                 break;
260         case EditorOrdered:
261                 action = X_("RemoteEditorDefined");
262                 break;
263
264         default:
265                 fatal << string_compose (_("programming error: unknown remote model in ARDOUR_UI::set_remote_model: %1"), model) << endmsg;
266                 /*NOTREACHED*/
267         }
268
269         Glib::RefPtr<Action> act = ActionManager::get_action ("options", action);
270
271         if (act) {
272                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
273
274                 if (ract && ract->get_active() && Config->get_remote_model() != model) {
275                         Config->set_remote_model (model);
276                 }
277         }
278
279 }
280
281 void
282 ARDOUR_UI::set_monitor_model (MonitorModel model)
283 {
284         const char* action = 0;
285
286         switch (model) {
287         case HardwareMonitoring:
288                 action = X_("UseHardwareMonitoring");
289                 break;
290                 
291         case SoftwareMonitoring:
292                 action = X_("UseSoftwareMonitoring");
293                 break;
294         case ExternalMonitoring:
295                 action = X_("UseExternalMonitoring");
296                 break;
297
298         default:
299                 fatal << string_compose (_("programming error: unknown monitor model in ARDOUR_UI::set_monitor_model: %1"), model) << endmsg;
300                 /*NOTREACHED*/
301         }
302
303         Glib::RefPtr<Action> act = ActionManager::get_action ("options", action);
304
305         if (act) {
306                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
307
308                 if (ract && ract->get_active() && Config->get_monitoring_model() != model) {
309                         Config->set_monitoring_model (model);
310                 }
311         }
312
313 }
314
315 void
316 ARDOUR_UI::set_denormal_model (DenormalModel model)
317 {
318         const char* action = 0;
319
320         switch (model) {
321         case DenormalNone:
322                 action = X_("DenormalNone");
323                 break;
324
325         case DenormalFTZ:
326                 action = X_("DenormalFTZ");
327                 break;
328                 
329         case DenormalDAZ:
330                 action = X_("DenormalDAZ");
331                 break;
332
333         case DenormalFTZDAZ:
334                 action = X_("DenormalFTZDAZ");
335                 break;
336
337         default:
338                 fatal << string_compose (_("programming error: unknown denormal model in ARDOUR_UI::set_denormal_model: %1"), model) << endmsg;
339                 /*NOTREACHED*/
340         }
341
342         Glib::RefPtr<Action> act = ActionManager::get_action ("options", action);
343
344         if (act) {
345                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
346
347                 if (ract && ract->get_active() && Config->get_denormal_model() != model) {
348                         Config->set_denormal_model (model);
349                 }
350         }
351
352 }
353
354 void
355 ARDOUR_UI::toggle_auto_input ()
356 {
357         ActionManager::toggle_config_state ("Transport", "ToggleAutoInput", &Configuration::set_auto_input, &Configuration::get_auto_input);
358 }
359
360 void
361 ARDOUR_UI::toggle_auto_play ()
362 {
363         ActionManager::toggle_config_state ("Transport", "ToggleAutoPlay", &Configuration::set_auto_play, &Configuration::get_auto_play);
364 }
365
366 void
367 ARDOUR_UI::toggle_auto_return ()
368 {
369         ActionManager::toggle_config_state ("Transport", "ToggleAutoReturn", &Configuration::set_auto_return, &Configuration::get_auto_return);
370 }
371
372 void
373 ARDOUR_UI::toggle_click ()
374 {
375         ActionManager::toggle_config_state ("Transport", "ToggleClick", &Configuration::set_clicking, &Configuration::get_clicking);
376 }
377
378 void
379 ARDOUR_UI::toggle_session_auto_loop ()
380 {
381         if (session) {
382                 if (session->get_play_loop()) {
383                         if (session->transport_rolling()) {
384                                 transport_roll();
385                         } else {
386                                 session->request_play_loop (false);
387                         }
388                 } else {
389                         session->request_play_loop (true);
390                 }
391         }
392 }
393
394 void
395 ARDOUR_UI::toggle_punch_in ()
396 {
397         ActionManager::toggle_config_state ("Transport", "TogglePunchIn", &Configuration::set_punch_in, &Configuration::get_punch_in);
398 }
399
400 void
401 ARDOUR_UI::toggle_punch_out ()
402 {
403         ActionManager::toggle_config_state ("Transport", "TogglePunchOut", &Configuration::set_punch_out, &Configuration::get_punch_out);
404 }
405
406 void
407 ARDOUR_UI::toggle_video_sync()
408 {
409         Glib::RefPtr<Action> act = ActionManager::get_action ("Transport", "ToggleVideoSync");
410         if (act) {
411                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
412                 Config->set_use_video_sync (tact->get_active());
413         }
414 }
415
416 void
417 ARDOUR_UI::toggle_editing_space()
418 {
419         Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMaximalEditor");
420         if (act) {
421                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
422                 if (tact->get_active()) {
423                         maximise_editing_space ();
424                 } else {
425                         restore_editing_space ();
426                 }
427         }
428 }
429
430 void
431 ARDOUR_UI::toggle_StopPluginsWithTransport()
432 {
433         ActionManager::toggle_config_state ("options", "StopPluginsWithTransport", &Configuration::set_plugins_stop_with_transport, &Configuration::get_plugins_stop_with_transport);
434 }
435
436 void
437 ARDOUR_UI::toggle_LatchedRecordEnable()
438 {
439         ActionManager::toggle_config_state ("options", "LatchedRecordEnable", &Configuration::set_latched_record_enable, &Configuration::get_latched_record_enable);
440 }
441
442 void
443 ARDOUR_UI::toggle_RegionEquivalentsOverlap()
444 {
445         ActionManager::toggle_config_state ("options", "RegionEquivalentsOverlap", &Configuration::set_use_overlap_equivalency, &Configuration::get_use_overlap_equivalency);
446 }
447
448 void
449 ARDOUR_UI::toggle_DoNotRunPluginsWhileRecording()
450 {
451         ActionManager::toggle_config_state ("options", "DoNotRunPluginsWhileRecording", &Configuration::set_do_not_record_plugins, &Configuration::get_do_not_record_plugins);
452 }
453
454 void
455 ARDOUR_UI::toggle_VerifyRemoveLastCapture()
456 {
457         ActionManager::toggle_config_state ("options", "VerifyRemoveLastCapture", &Configuration::set_verify_remove_last_capture, &Configuration::get_verify_remove_last_capture);
458 }
459
460 void
461 ARDOUR_UI::toggle_PeriodicSafetyBackups()
462 {
463         ActionManager::toggle_config_state ("options", "PeriodicSafetyBackups", &Configuration::set_periodic_safety_backups, &Configuration::get_periodic_safety_backups);
464 }
465
466 void
467 ARDOUR_UI::toggle_StopRecordingOnXrun()
468 {
469         ActionManager::toggle_config_state ("options", "StopRecordingOnXrun", &Configuration::set_stop_recording_on_xrun, &Configuration::get_stop_recording_on_xrun);
470 }
471
472 void
473 ARDOUR_UI::toggle_sync_order_keys ()
474 {
475         ActionManager::toggle_config_state ("options", "SyncEditorAndMixerTrackOrder", &Configuration::set_sync_all_route_ordering, &Configuration::get_sync_all_route_ordering);
476 }
477
478 void
479 ARDOUR_UI::toggle_StopTransportAtEndOfSession()
480 {
481         ActionManager::toggle_config_state ("options", "StopTransportAtEndOfSession", &Configuration::set_stop_at_session_end, &Configuration::get_stop_at_session_end);
482 }
483
484 void
485 ARDOUR_UI::toggle_GainReduceFastTransport()
486 {
487         ActionManager::toggle_config_state ("options", "GainReduceFastTransport", &Configuration::set_quieten_at_speed, &Configuration::get_quieten_at_speed);
488 }
489
490 void
491 ARDOUR_UI::toggle_LatchedSolo()
492 {
493         ActionManager::toggle_config_state ("options", "LatchedSolo", &Configuration::set_solo_latched, &Configuration::get_solo_latched);
494 }
495
496 void
497 ARDOUR_UI::toggle_ShowSoloMutes()
498 {
499         ActionManager::toggle_config_state ("options", "ShowSoloMutes", &Configuration::set_show_solo_mutes, &Configuration::get_show_solo_mutes);
500 }
501
502 void
503 ARDOUR_UI::toggle_PrimaryClockDeltaEditCursor()
504 {
505         ActionManager::toggle_config_state ("options", "PrimaryClockDeltaEditCursor", &Configuration::set_primary_clock_delta_edit_cursor, &Configuration::get_primary_clock_delta_edit_cursor);
506 }
507
508 void
509 ARDOUR_UI::toggle_SecondaryClockDeltaEditCursor()
510 {
511         ActionManager::toggle_config_state ("options", "SecondaryClockDeltaEditCursor", &Configuration::set_secondary_clock_delta_edit_cursor, &Configuration::get_secondary_clock_delta_edit_cursor);
512 }
513
514 void
515 ARDOUR_UI::toggle_ShowTrackMeters()
516 {
517         ActionManager::toggle_config_state ("options", "ShowTrackMeters", &Configuration::set_show_track_meters, &Configuration::get_show_track_meters);
518 }
519
520 void
521 ARDOUR_UI::mtc_port_changed ()
522 {
523         bool have_mtc;
524
525         if (session) {
526                 if (session->mtc_port()) {
527                         have_mtc = true;
528                 } else {
529                         have_mtc = false;
530                 }
531         } else {
532                 have_mtc = false;
533         }
534
535         positional_sync_strings.clear ();
536         positional_sync_strings.push_back (slave_source_to_string (None));
537         if (have_mtc) {
538                 positional_sync_strings.push_back (slave_source_to_string (MTC));
539         }
540         positional_sync_strings.push_back (slave_source_to_string (JACK));
541         
542         set_popdown_strings (sync_option_combo, positional_sync_strings);
543 }
544
545 void
546 ARDOUR_UI::setup_session_options ()
547 {
548         mtc_port_changed ();
549
550         Config->ParameterChanged.connect (mem_fun (*this, &ARDOUR_UI::parameter_changed));
551 }
552
553
554 void
555 ARDOUR_UI::map_solo_model ()
556 {
557         const char* on;
558
559         if (Config->get_solo_model() == InverseMute) {
560                 on = X_("SoloInPlace");
561         } else {
562                 on = X_("SoloViaBus");
563         }
564
565         Glib::RefPtr<Action> act = ActionManager::get_action ("options", on);
566         if (act) {
567                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
568
569                 if (tact && !tact->get_active()) {
570                         tact->set_active (true);
571                 }
572         }
573 }
574
575 void
576 ARDOUR_UI::map_monitor_model ()
577 {
578         const char* on = 0;
579
580         switch (Config->get_monitoring_model()) {
581         case HardwareMonitoring:
582                 on = X_("UseHardwareMonitoring");
583                 break;
584         case SoftwareMonitoring:
585                 on = X_("UseSoftwareMonitoring");
586                 break;
587         case ExternalMonitoring:
588                 on = X_("UseExternalMonitoring");
589                 break;
590         }
591
592         Glib::RefPtr<Action> act = ActionManager::get_action ("options", on);
593         if (act) {
594                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
595
596                 if (tact && !tact->get_active()) {
597                         tact->set_active (true);
598                 }
599         }
600 }
601
602 void
603 ARDOUR_UI::map_denormal_protection ()
604 {
605         Glib::RefPtr<Action> act = ActionManager::get_action ("options", X_("DenormalProtection"));
606         if (act) {
607                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
608
609                 if (tact && !tact->get_active()) {
610                         tact->set_active (Config->get_denormal_protection());
611                 }
612         }
613 }
614
615 void
616 ARDOUR_UI::map_denormal_model ()
617 {
618         const char* on = 0;
619
620         switch (Config->get_denormal_model()) {
621         case DenormalNone:
622                 on = X_("DenormalNone");
623                 break;
624         case DenormalFTZ:
625                 on = X_("DenormalFTZ");
626                 break;
627         case DenormalDAZ:
628                 on = X_("DenormalDAZ");
629                 break;
630         case DenormalFTZDAZ:
631                 on = X_("DenormalFTZDAZ");
632                 break;
633         }
634
635         Glib::RefPtr<Action> act = ActionManager::get_action ("options", on);
636         if (act) {
637                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
638
639                 if (tact && !tact->get_active()) {
640                         tact->set_active (true);
641                 }
642         }
643 }
644
645 void
646 ARDOUR_UI::map_remote_model ()
647 {
648         const char* on = 0;
649
650         switch (Config->get_remote_model()) {
651         case UserOrdered:
652                 on = X_("RemoteUserDefined");
653                 break;
654         case MixerOrdered:
655                 on = X_("RemoteMixerDefined");
656                 break;
657         case EditorOrdered:
658                 on = X_("RemoteEditorDefined");
659                 break;
660         }
661
662         Glib::RefPtr<Action> act = ActionManager::get_action ("options", on);
663         if (act) {
664                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
665
666                 if (tact && !tact->get_active()) {
667                         tact->set_active (true);
668                 }
669         }
670 }
671
672 void
673 ARDOUR_UI::map_file_header_format ()
674 {
675         const char* action = 0;
676
677         switch (Config->get_native_file_header_format()) {
678         case BWF:
679                 action = X_("FileHeaderFormatBWF");
680                 break;
681
682         case WAVE:
683                 action = X_("FileHeaderFormatWAVE");
684                 break;
685
686         case WAVE64:
687                 action = X_("FileHeaderFormatWAVE64");
688                 break;
689
690         case iXML:
691                 action = X_("FileHeaderFormatiXML");
692                 break;
693
694         case RF64:
695                 action = X_("FileHeaderFormatRF64");
696                 break;
697
698         case CAF:
699                 action = X_("FileHeaderFormatCAF");
700                 break;
701
702         default:
703                 fatal << string_compose (_("programming error: unknown file header format passed to ARDOUR_UI::map_file_data_format: %1"), 
704                                          Config->get_native_file_header_format()) << endmsg;
705                 /*NOTREACHED*/
706         }
707
708
709         Glib::RefPtr<Action> act = ActionManager::get_action ("options", action);
710
711         if (act) {
712                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
713
714                 if (tact && !tact->get_active()) {
715                         tact->set_active (true);
716                 }
717         }
718 }
719
720 void
721 ARDOUR_UI::map_file_data_format ()
722 {
723         const char* action = 0;
724
725         switch (Config->get_native_file_data_format()) {
726         case FormatFloat:
727                 action = X_("FileDataFormatFloat");
728                 break;
729
730         case FormatInt24:
731                 action = X_("FileDataFormat24bit");
732                 break;
733
734         case FormatInt16:
735                 action = X_("FileDataFormat16bit");
736                 break;
737
738         default:
739                 fatal << string_compose (_("programming error: unknown file data format passed to ARDOUR_UI::map_file_data_format: %1"), 
740                                          Config->get_native_file_data_format()) << endmsg;
741                 /*NOTREACHED*/
742         }
743
744
745         Glib::RefPtr<Action> act = ActionManager::get_action ("options", action);
746
747         if (act) {
748                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
749
750                 if (tact && !tact->get_active()) {
751                         tact->set_active (true);
752                 }
753         }
754 }
755
756 void
757 ARDOUR_UI::map_input_auto_connect ()
758 {
759         const char* on;
760
761         if (Config->get_input_auto_connect() == (AutoConnectOption) 0) {
762                 on = "InputAutoConnectManual";
763         } else {
764                 on = "InputAutoConnectPhysical";
765         }
766
767         Glib::RefPtr<Action> act = ActionManager::get_action ("options", on);
768         if (act) {
769                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
770
771                 if (tact && !tact->get_active()) {
772                         tact->set_active (true);
773                 }
774         }
775 }
776
777 void
778 ARDOUR_UI::map_output_auto_connect ()
779 {
780         const char* on;
781
782         if (Config->get_output_auto_connect() == (AutoConnectOption) 0) {
783                 on = "OutputAutoConnectManual";
784         } else if (Config->get_output_auto_connect() == AutoConnectPhysical) {
785                 on = "OutputAutoConnectPhysical";
786         } else {
787                 on = "OutputAutoConnectMaster";
788         }
789
790         Glib::RefPtr<Action> act = ActionManager::get_action ("options", on);
791         if (act) {
792                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
793                 
794                 if (tact && !tact->get_active()) {
795                         tact->set_active (true);
796                 }
797         }
798 }
799
800 void
801 ARDOUR_UI::map_only_copy_imported_files ()
802 {
803         Glib::RefPtr<Action> act = ActionManager::get_action ("options", X_("OnlyCopyImportedFiles"));
804         if (act) {
805                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
806
807                 if (tact && !tact->get_active()) {
808                         tact->set_active (Config->get_only_copy_imported_files());
809                 }
810         }
811
812 }
813
814
815 void
816 ARDOUR_UI::map_meter_falloff ()
817 {
818         const char* action = X_("MeterFalloffMedium");
819
820         float val = Config->get_meter_falloff ();
821         MeterFalloff code = meter_falloff_from_float(val);
822
823         switch (code) {
824         case MeterFalloffOff:
825                 action = X_("MeterFalloffOff");
826                 break;
827         case MeterFalloffSlowest:
828                 action = X_("MeterFalloffSlowest");
829                 break;
830         case MeterFalloffSlow:
831                 action = X_("MeterFalloffSlow");
832                 break;
833         case MeterFalloffMedium:
834                 action = X_("MeterFalloffMedium");
835                 break;
836         case MeterFalloffFast:
837                 action = X_("MeterFalloffFast");
838                 break;
839         case MeterFalloffFaster:
840                 action = X_("MeterFalloffFaster");
841                 break;
842         case MeterFalloffFastest:
843                 action = X_("MeterFalloffFastest");
844                 break;
845         }
846
847         Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), action);
848
849         if (act) {
850                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
851                 if (ract && !ract->get_active()) {
852                         ract->set_active (true);
853                 }
854         }
855 }
856
857 void
858 ARDOUR_UI::map_meter_hold ()
859 {
860         const char* action = X_("MeterHoldMedium");
861
862         /* XXX hack alert. Fix this. Please */
863
864         float val = Config->get_meter_hold ();
865         MeterHold code = (MeterHold) (int) (floor (val));
866
867         switch (code) {
868         case MeterHoldOff:
869                 action = X_("MeterHoldOff");
870                 break;
871         case MeterHoldShort:
872                 action = X_("MeterHoldShort");
873                 break;
874         case MeterHoldMedium:
875                 action = X_("MeterHoldMedium");
876                 break;
877         case MeterHoldLong:
878                 action = X_("MeterHoldLong");
879                 break;
880         }
881
882         Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), action);
883
884         if (act) {
885                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
886                 if (ract && !ract->get_active()) {
887                         ract->set_active (true);
888                 }
889         }
890 }
891
892 void 
893 ARDOUR_UI::set_meter_hold (MeterHold val)
894 {
895         const char* action = 0;
896         float fval;
897
898         fval = meter_hold_to_float (val);
899
900         switch (val) {
901         case MeterHoldOff:
902                 action = X_("MeterHoldOff");
903                 break;
904         case MeterHoldShort:
905                 action = X_("MeterHoldShort");
906                 break;
907         case MeterHoldMedium:
908                 action = X_("MeterHoldMedium");
909                 break;
910         case MeterHoldLong:
911                 action = X_("MeterHoldLong");
912                 break;
913         }
914
915         Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), action);
916         
917         if (act) {
918                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
919                 if (ract && ract->get_active() && Config->get_meter_hold() != fval) {
920                         Config->set_meter_hold (fval);
921                 }
922         }
923 }
924
925 void
926 ARDOUR_UI::set_meter_falloff (MeterFalloff val)
927 {
928         const char* action = 0;
929         float fval;
930
931         fval = meter_falloff_to_float (val);
932
933         switch (val) {
934         case MeterFalloffOff:
935                 action = X_("MeterFalloffOff");
936                 break;
937         case MeterFalloffSlowest:
938                 action = X_("MeterFalloffSlowest");
939                 break;
940         case MeterFalloffSlow:
941                 action = X_("MeterFalloffSlow");
942                 break;
943         case MeterFalloffMedium:
944                 action = X_("MeterFalloffMedium");
945                 break;
946         case MeterFalloffFast:
947                 action = X_("MeterFalloffFast");
948                 break;
949         case MeterFalloffFaster:
950                 action = X_("MeterFalloffFaster");
951                 break;
952         case MeterFalloffFastest:
953                 action = X_("MeterFalloffFastest");
954                 break;
955         }
956
957         Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), action);
958
959         if (act) {
960                 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
961                 if (ract && ract->get_active() && Config->get_meter_falloff () != fval) {
962                         Config->set_meter_falloff (fval);
963                 }
964         }
965 }
966
967 void
968 ARDOUR_UI::parameter_changed (const char* parameter_name)
969 {
970         ENSURE_GUI_THREAD (bind (mem_fun (*this, &ARDOUR_UI::parameter_changed), parameter_name));
971
972 #define PARAM_IS(x) (!strcmp (parameter_name, (x)))
973         
974         if (PARAM_IS ("slave-source")) {
975
976                 sync_option_combo.set_active_text (slave_source_to_string (Config->get_slave_source()));
977                 
978                 switch (Config->get_slave_source()) {
979                 case None:
980                         ActionManager::get_action ("Transport", "ToggleAutoPlay")->set_sensitive (true);
981                         ActionManager::get_action ("Transport", "ToggleAutoReturn")->set_sensitive (true);
982                         break;
983
984                 default:
985                         /* XXX need to make auto-play is off as well as insensitive */
986                         ActionManager::get_action ("Transport", "ToggleAutoPlay")->set_sensitive (false);
987                         ActionManager::get_action ("Transport", "ToggleAutoReturn")->set_sensitive (false);
988                         break;
989                 }
990
991         } else if (PARAM_IS ("send-mtc")) {
992
993                 ActionManager::map_some_state ("options", "SendMTC", &Configuration::get_send_mtc);
994
995         } else if (PARAM_IS ("send-mmc")) {
996
997                 ActionManager::map_some_state ("options", "SendMMC", &Configuration::get_send_mmc);
998
999         } else if (PARAM_IS ("use-osc")) {
1000
1001 #ifdef HAVE_LIBLO
1002                 if (Config->get_use_osc()) {
1003                         osc->start ();
1004                 } else {
1005                         osc->stop ();
1006                 }
1007 #endif
1008
1009                 ActionManager::map_some_state ("options", "UseOSC", &Configuration::get_use_osc);
1010                 
1011         } else if (PARAM_IS ("mmc-control")) {
1012                 ActionManager::map_some_state ("options", "UseMMC", &Configuration::get_mmc_control);
1013         } else if (PARAM_IS ("midi-feedback")) {
1014                 ActionManager::map_some_state ("options", "SendMIDIfeedback", &Configuration::get_midi_feedback);
1015         } else if (PARAM_IS ("do-not-record-plugins")) {
1016                 ActionManager::map_some_state ("options", "DoNotRunPluginsWhileRecording", &Configuration::get_do_not_record_plugins);
1017         } else if (PARAM_IS ("latched-record-enable")) {
1018                 ActionManager::map_some_state ("options", "LatchedRecordEnable", &Configuration::get_latched_record_enable);
1019         } else if (PARAM_IS ("solo-latched")) {
1020                 ActionManager::map_some_state ("options", "LatchedSolo", &Configuration::get_solo_latched);
1021         } else if (PARAM_IS ("show-solo-mutes")) {
1022                 ActionManager::map_some_state ("options", "ShowSoloMutes", &Configuration::get_show_solo_mutes);
1023         } else if (PARAM_IS ("solo-model")) {
1024                 map_solo_model ();
1025         } else if (PARAM_IS ("auto-play")) {
1026                 ActionManager::map_some_state ("Transport", "ToggleAutoPlay", &Configuration::get_auto_play);
1027         } else if (PARAM_IS ("auto-return")) {
1028                 ActionManager::map_some_state ("Transport", "ToggleAutoReturn", &Configuration::get_auto_return);
1029         } else if (PARAM_IS ("auto-input")) {
1030                 ActionManager::map_some_state ("Transport", "ToggleAutoInput", &Configuration::get_auto_input);
1031         } else if (PARAM_IS ("punch-out")) {
1032                 ActionManager::map_some_state ("Transport", "TogglePunchOut", &Configuration::get_punch_out);
1033         } else if (PARAM_IS ("punch-in")) {
1034                 ActionManager::map_some_state ("Transport", "TogglePunchIn", &Configuration::get_punch_in);
1035         } else if (PARAM_IS ("clicking")) {
1036                 ActionManager::map_some_state ("Transport", "ToggleClick", &Configuration::get_clicking);
1037         } else if (PARAM_IS ("jack-time-master")) {
1038                 ActionManager::map_some_state ("Transport",  "ToggleTimeMaster", &Configuration::get_jack_time_master);
1039         } else if (PARAM_IS ("plugins-stop-with-transport")) {
1040                 ActionManager::map_some_state ("options",  "StopPluginsWithTransport", &Configuration::get_plugins_stop_with_transport);
1041         } else if (PARAM_IS ("latched-record-enable")) {
1042                 ActionManager::map_some_state ("options", "LatchedRecordEnable", &Configuration::get_latched_record_enable);
1043         } else if (PARAM_IS ("verify-remove-last-capture")) {
1044                 ActionManager::map_some_state ("options",  "VerifyRemoveLastCapture", &Configuration::get_verify_remove_last_capture);
1045         } else if (PARAM_IS ("periodic-safety-backups")) {
1046                 ActionManager::map_some_state ("options",  "PeriodicSafetyBackups", &Configuration::get_periodic_safety_backups);
1047         } else if (PARAM_IS ("stop-recording-on-xrun")) {
1048                 ActionManager::map_some_state ("options",  "StopRecordingOnXrun", &Configuration::get_stop_recording_on_xrun);
1049         } else if (PARAM_IS ("sync-all-route-ordering")) {
1050                 ActionManager::map_some_state ("options",  "SyncEditorAndMixerTrackOrder", &Configuration::get_sync_all_route_ordering);
1051         } else if (PARAM_IS ("stop-at-session-end")) {
1052                 ActionManager::map_some_state ("options",  "StopTransportAtEndOfSession", &Configuration::get_stop_at_session_end);
1053         } else if (PARAM_IS ("monitoring-model")) {
1054                 map_monitor_model ();
1055         } else if (PARAM_IS ("denormal-model")) {
1056                 map_denormal_model ();
1057         } else if (PARAM_IS ("denormal-protection")) {
1058                 map_denormal_protection ();
1059         } else if (PARAM_IS ("remote-model")) {
1060                 map_remote_model ();
1061         } else if (PARAM_IS ("use-video-sync")) {
1062                 ActionManager::map_some_state ("Transport",  "ToggleVideoSync", &Configuration::get_use_video_sync);
1063         } else if (PARAM_IS ("quieten-at-speed")) {
1064                 ActionManager::map_some_state ("options",  "GainReduceFastTransport", &Configuration::get_quieten_at_speed);
1065         } else if (PARAM_IS ("shuttle-behaviour")) {
1066
1067                 switch (Config->get_shuttle_behaviour ()) {
1068                 case Sprung:
1069                         shuttle_style_button.set_active_text (_("sprung"));
1070                         shuttle_fract = 0.0;
1071                         shuttle_box.queue_draw ();
1072                         if (session) {
1073                                 if (session->transport_rolling()) {
1074                                         shuttle_fract = SHUTTLE_FRACT_SPEED1;
1075                                         session->request_transport_speed (1.0);
1076                                 }
1077                         }
1078                         break;
1079                 case Wheel:
1080                         shuttle_style_button.set_active_text (_("wheel"));
1081                         break;
1082                 }
1083
1084         } else if (PARAM_IS ("shuttle-units")) {
1085                 
1086                 switch (Config->get_shuttle_units()) {
1087                 case Percentage:
1088                         shuttle_units_button.set_label("% ");
1089                         break;
1090                 case Semitones:
1091                         shuttle_units_button.set_label(_("ST"));
1092                         break;
1093                 }
1094         } else if (PARAM_IS ("input-auto-connect")) {
1095                 map_input_auto_connect ();
1096         } else if (PARAM_IS ("output-auto-connect")) {
1097                 map_output_auto_connect ();
1098         } else if (PARAM_IS ("native-file-header-format")) {
1099                 map_file_header_format ();
1100         } else if (PARAM_IS ("native-file-data-format")) {
1101                 map_file_data_format ();
1102         } else if (PARAM_IS ("meter-hold")) {
1103                 map_meter_hold ();
1104         } else if (PARAM_IS ("meter-falloff")) {
1105                 map_meter_falloff ();
1106         } else if (PARAM_IS ("video-pullup") || PARAM_IS ("smpte-format")) {
1107                 if (session) {
1108                         primary_clock.set (session->audible_frame(), true);
1109                         secondary_clock.set (session->audible_frame(), true);
1110                 } else {
1111                         primary_clock.set (0, true);
1112                         secondary_clock.set (0, true);
1113                 }
1114         } else if (PARAM_IS ("use-overlap-equivalency")) {
1115                 ActionManager::map_some_state ("options", "RegionEquivalentsOverlap", &Configuration::get_use_overlap_equivalency);
1116         } else if (PARAM_IS ("primary-clock-delta-edit-cursor")) {
1117                 ActionManager::map_some_state ("options",  "PrimaryClockDeltaEditCursor", &Configuration::get_primary_clock_delta_edit_cursor);
1118         } else if (PARAM_IS ("secondary-clock-delta-edit-cursor")) {
1119                 ActionManager::map_some_state ("options",  "SecondaryClockDeltaEditCursor", &Configuration::get_secondary_clock_delta_edit_cursor);
1120         } else if (PARAM_IS ("only-copy-imported-files")) {
1121                 map_only_copy_imported_files ();
1122         } else if (PARAM_IS ("show-track-meters")) {
1123                 ActionManager::map_some_state ("options",  "ShowTrackMeters", &Configuration::get_show_track_meters);
1124                 editor->toggle_meter_updating();
1125         }
1126
1127 #undef PARAM_IS
1128 }