enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / gtk2_ardour / session_option_editor.cc
1 /*
2     Copyright (C) 2000-2010 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 "ardour/session.h"
21
22 #include "gui_thread.h"
23 #include "session_option_editor.h"
24 #include "search_path_option.h"
25 #include "pbd/i18n.h"
26
27 using namespace std;
28 using namespace ARDOUR;
29 using namespace Timecode;
30
31 SessionOptionEditor::SessionOptionEditor (Session* s)
32         : OptionEditorWindow (&(s->config), _("Session Properties"))
33         , _session_config (&(s->config))
34 {
35         set_session (s);
36
37         set_name ("SessionProperties");
38
39         /* TIMECODE*/
40
41         add_option (_("Timecode"), new OptionEditorHeading (_("Timecode Settings")));
42
43         ComboOption<TimecodeFormat>* smf = new ComboOption<TimecodeFormat> (
44                 "timecode-format",
45                 _("Timecode frames-per-second"),
46                 sigc::mem_fun (*_session_config, &SessionConfiguration::get_timecode_format),
47                 sigc::mem_fun (*_session_config, &SessionConfiguration::set_timecode_format)
48                 );
49
50         smf->add (timecode_23976, _("23.976"));
51         smf->add (timecode_24, _("24"));
52         smf->add (timecode_24976, _("24.975"));
53         smf->add (timecode_25, _("25"));
54         smf->add (timecode_2997, _("29.97"));
55         smf->add (timecode_2997drop, _("29.97 drop"));
56         smf->add (timecode_30, _("30"));
57         smf->add (timecode_30drop, _("30 drop"));
58         smf->add (timecode_5994, _("59.94"));
59         smf->add (timecode_60, _("60"));
60
61         add_option (_("Timecode"), smf);
62
63         _vpu = new ComboOption<float> (
64                 "video-pullup",
65                 _("Pull-up / pull-down"),
66                 sigc::mem_fun (*_session_config, &SessionConfiguration::get_video_pullup),
67                 sigc::mem_fun (*_session_config, &SessionConfiguration::set_video_pullup)
68                 );
69
70         _vpu->add (4.1667 + 0.1, _("4.1667 + 0.1%"));
71         _vpu->add (4.1667, _("4.1667"));
72         _vpu->add (4.1667 - 0.1, _("4.1667 - 0.1%"));
73         _vpu->add (0.1, _("0.1"));
74         _vpu->add (0, _("none"));
75         _vpu->add (-0.1, _("-0.1"));
76         _vpu->add (-4.1667 + 0.1, _("-4.1667 + 0.1%"));
77         _vpu->add (-4.1667, _("-4.1667"));
78         _vpu->add (-4.1667 - 0.1, _("-4.1667 - 0.1%"));
79
80         add_option (_("Timecode"), _vpu);
81
82         add_option (_("Sync"), new BoolOption (
83                             "use-video-file-fps",
84                             _("Use Video File's FPS Instead of Timecode Value for Timeline and Video Monitor."),
85                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_use_video_file_fps),
86                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_use_video_file_fps)
87                             ));
88
89         add_option (_("Sync"), new BoolOption (
90                             "videotimeline-pullup",
91                             _("Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-sync)."),
92                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_videotimeline_pullup),
93                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_videotimeline_pullup)
94                             ));
95
96         add_option (_("Timecode"), new OptionEditorHeading (_("Ext Timecode Offsets")));
97
98         ClockOption* sco = new ClockOption (
99                 "slave-timecode-offset",
100                 _("Slave Timecode offset"),
101                 sigc::mem_fun (*_session_config, &SessionConfiguration::get_slave_timecode_offset),
102                 sigc::mem_fun (*_session_config, &SessionConfiguration::set_slave_timecode_offset)
103                 );
104
105         sco->set_session (_session);
106         sco->clock().set_negative_allowed (true);
107         Gtkmm2ext::UI::instance()->set_tip (sco->tip_widget(), _("The specified offset is added to the received timecode (MTC or LTC)."));
108
109         add_option (_("Timecode"), sco);
110
111         ClockOption* gco = new ClockOption (
112                 "timecode-generator-offset",
113                 _("Timecode Generator offset"),
114                 sigc::mem_fun (*_session_config, &SessionConfiguration::get_timecode_generator_offset),
115                 sigc::mem_fun (*_session_config, &SessionConfiguration::set_timecode_generator_offset)
116                 );
117
118         gco->set_session (_session);
119         gco->clock().set_negative_allowed (true);
120         Gtkmm2ext::UI::instance()->set_tip (gco->tip_widget(), _("Specify an offset which is added to the generated timecode (so far only LTC)."));
121
122         add_option (_("Timecode"), gco);
123
124         add_option (_("Timecode"), new OptionEditorHeading (_("JACK Transport/Time Settings")));
125
126         add_option (_("Timecode"), new BoolOption (
127                             "jack-time-master",
128                             string_compose (_("%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)"), PROGRAM_NAME),
129                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_jack_time_master),
130                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_jack_time_master)
131                             ));
132
133         /* FADES */
134
135         add_option (_("Fades"), new SpinOption<float> (
136                 _("destructive-xfade-seconds"),
137                 _("Destructive crossfade length"),
138                 sigc::mem_fun (*_session_config, &SessionConfiguration::get_destructive_xfade_msecs),
139                 sigc::mem_fun (*_session_config, &SessionConfiguration::set_destructive_xfade_msecs),
140                 0, 1000, 1, 10,
141                 _("ms")
142                             ));
143
144         add_option (_("Fades"), new BoolOption (
145                             "use-transport-fades",
146                             _("Declick when transport starts and stops"),
147                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_use_transport_fades),
148                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_use_transport_fades)
149                             ));
150
151         add_option (_("Fades"), new BoolOption (
152                             "use-monitor-fades",
153                             _("Declick when monitor state changes"),
154                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_use_monitor_fades),
155                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_use_monitor_fades)
156                             ));
157
158         add_option (_("Fades"), new BoolOption (
159                             "use-region-fades",
160                             _("Region fades active"),
161                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_use_region_fades),
162                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_use_region_fades)
163                             ));
164
165         add_option (_("Fades"), new BoolOption (
166                             "show-region-fades",
167                             _("Region fades visible"),
168                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_region_fades),
169                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_region_fades)
170                             ));
171
172         /* Media */
173
174         add_option (_("Media"), new OptionEditorHeading (_("Audio file format")));
175
176         ComboOption<SampleFormat>* sf = new ComboOption<SampleFormat> (
177                 "native-file-data-format",
178                 _("Sample format"),
179                 sigc::mem_fun (*_session_config, &SessionConfiguration::get_native_file_data_format),
180                 sigc::mem_fun (*_session_config, &SessionConfiguration::set_native_file_data_format)
181                 );
182
183         sf->add (FormatFloat, _("32-bit floating point"));
184         sf->add (FormatInt24, _("24-bit integer"));
185         sf->add (FormatInt16, _("16-bit integer"));
186
187         add_option (_("Media"), sf);
188
189         ComboOption<HeaderFormat>* hf = new ComboOption<HeaderFormat> (
190                 "native-file-header-format",
191                 _("File type"),
192                 sigc::mem_fun (*_session_config, &SessionConfiguration::get_native_file_header_format),
193                 sigc::mem_fun (*_session_config, &SessionConfiguration::set_native_file_header_format)
194                 );
195
196         hf->add (BWF, _("Broadcast WAVE (4GB size limit)"));
197 #ifdef HAVE_RF64_RIFF
198         hf->add (MBWF, _("Broadcast RF64"));
199 #endif
200         hf->add (WAVE, _("WAVE (4GB size limit)"));
201         hf->add (WAVE64, _("WAVE-64"));
202         hf->add (CAF, _("CAF"));
203         hf->add (RF64, _("RF64"));
204 #ifdef HAVE_RF64_RIFF
205         hf->add (RF64_WAV, _("RF64 (WAV compatible)"));
206 #endif
207
208         add_option (_("Media"), hf);
209
210         add_option (S_("Files|Locations"), new OptionEditorHeading (_("File locations")));
211
212         SearchPathOption* spo = new SearchPathOption ("audio-search-path", _("Search for audio files in:"),
213                                                       _session->path(),
214                                                       sigc::mem_fun (*_session_config, &SessionConfiguration::get_audio_search_path),
215                                                       sigc::mem_fun (*_session_config, &SessionConfiguration::set_audio_search_path));
216         add_option (S_("Files|Locations"), spo);
217
218         spo = new SearchPathOption ("midi-search-path", _("Search for MIDI files in:"),
219                                     _session->path(),
220                                     sigc::mem_fun (*_session_config, &SessionConfiguration::get_midi_search_path),
221                                     sigc::mem_fun (*_session_config, &SessionConfiguration::set_midi_search_path));
222
223         add_option (S_("Files|Locations"), spo);
224
225         /* File Naming  */
226
227         add_option (_("Filenames"), new OptionEditorHeading (_("File Naming")));
228
229         BoolOption *bo;
230
231         bo = new RouteDisplayBoolOption (
232                         "track-name-number",
233                         _("Prefix Track number"),
234                         sigc::mem_fun (*_session_config, &SessionConfiguration::get_track_name_number),
235                         sigc::mem_fun (*_session_config, &SessionConfiguration::set_track_name_number)
236                         );
237         Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
238                         _("Adds the current track number to the beginning of the recorded file name."));
239         add_option (_("Filenames"), bo);
240
241         bo = new BoolOption (
242                         "track-name-take",
243                         _("Prefix Take Name"),
244                         sigc::mem_fun (*_session_config, &SessionConfiguration::get_track_name_take),
245                         sigc::mem_fun (*_session_config, &SessionConfiguration::set_track_name_take)
246                         );
247         Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
248                         _("Adds the Take Name to the beginning of the recorded file name."));
249         add_option (_("Filenames"), bo);
250
251         _take_name = new EntryOption (
252                 "take-name",
253                 _("Take Name"),
254                 sigc::mem_fun (*_session_config, &SessionConfiguration::get_take_name),
255                 sigc::mem_fun (*_session_config, &SessionConfiguration::set_take_name)
256                 );
257         _take_name->set_invalid_chars(".");
258         _take_name->set_sensitive(_session_config->get_track_name_take());
259
260         add_option (_("Filenames"), _take_name);
261
262         /* Monitoring */
263
264         add_option (_("Monitoring"), new BoolOption (
265                             "auto-input",
266                             _("Track Input Monitoring automatically follows transport state (\"auto-input\")"),
267                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_auto_input),
268                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_auto_input)
269                             ));
270
271         add_option (_("Monitoring"), new BoolOption (
272                             "have-monitor-section",
273                             _("Use monitor section in this session"),
274                             sigc::mem_fun (*this, &SessionOptionEditor::get_use_monitor_section),
275                             sigc::mem_fun (*this, &SessionOptionEditor::set_use_monitor_section)
276                             ));
277         /* Meterbridge */
278         add_option (_("Meterbridge"), new OptionEditorHeading (_("Route Display")));
279
280         add_option (_("Meterbridge"), new BoolOption (
281                             "show-midi-on-meterbridge",
282                             _("Show Midi Tracks"),
283                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_midi_on_meterbridge),
284                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_midi_on_meterbridge)
285                             ));
286
287         add_option (_("Meterbridge"), new BoolOption (
288                             "show-busses-on-meterbridge",
289                             _("Show Busses"),
290                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_busses_on_meterbridge),
291                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_busses_on_meterbridge)
292                             ));
293
294         add_option (_("Meterbridge"), new BoolOption (
295                             "show-master-on-meterbridge",
296                             _("Include Master Bus"),
297                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_master_on_meterbridge),
298                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_master_on_meterbridge)
299                             ));
300
301         add_option (_("Meterbridge"), new OptionEditorHeading (_("Button Area")));
302
303         add_option (_("Meterbridge"), new BoolOption (
304                             "show-rec-on-meterbridge",
305                             _("Rec-enable Button"),
306                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_rec_on_meterbridge),
307                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_rec_on_meterbridge)
308                             ));
309
310         add_option (_("Meterbridge"), new BoolOption (
311                             "show-mute-on-meterbridge",
312                             _("Mute Button"),
313                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_mute_on_meterbridge),
314                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_mute_on_meterbridge)
315                             ));
316
317         add_option (_("Meterbridge"), new BoolOption (
318                             "show-solo-on-meterbridge",
319                             _("Solo Button"),
320                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_solo_on_meterbridge),
321                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_solo_on_meterbridge)
322                             ));
323
324         add_option (_("Meterbridge"), new BoolOption (
325                             "show-monitor-on-meterbridge",
326                             _("Monitor Buttons"),
327                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_monitor_on_meterbridge),
328                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_monitor_on_meterbridge)
329                             ));
330
331         add_option (_("Meterbridge"), new OptionEditorHeading (_("Name Labels")));
332
333         add_option (_("Meterbridge"), new BoolOption (
334                             "show-name-on-meterbridge",
335                             _("Track Name"),
336                             sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_name_on_meterbridge),
337                             sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_name_on_meterbridge)
338                             ));
339
340         /* Misc */
341
342         add_option (_("Misc"), new OptionEditorHeading (_("MIDI Options")));
343
344         add_option (_("Misc"), new BoolOption (
345                                 "midi-copy-is-fork",
346                                 _("MIDI region copies are independent"),
347                                 sigc::mem_fun (*_session_config, &SessionConfiguration::get_midi_copy_is_fork),
348                                 sigc::mem_fun (*_session_config, &SessionConfiguration::set_midi_copy_is_fork)
349                                 ));
350
351         ComboOption<InsertMergePolicy>* li = new ComboOption<InsertMergePolicy> (
352                         "insert-merge-policy",
353                         _("Policy for handling overlapping notes\n on the same MIDI channel"),
354                         sigc::mem_fun (*_session_config, &SessionConfiguration::get_insert_merge_policy),
355                         sigc::mem_fun (*_session_config, &SessionConfiguration::set_insert_merge_policy)
356                         );
357
358         li->add (InsertMergeReject, _("never allow them"));
359         li->add (InsertMergeRelax, _("don't do anything in particular"));
360         li->add (InsertMergeReplace, _("replace any overlapped existing note"));
361         li->add (InsertMergeTruncateExisting, _("shorten the overlapped existing note"));
362         li->add (InsertMergeTruncateAddition, _("shorten the overlapping new note"));
363         li->add (InsertMergeExtend, _("replace both overlapping notes with a single note"));
364
365         add_option (_("Misc"), li);
366
367         add_option (_("Misc"), new OptionEditorHeading (_("Glue to bars and beats")));
368
369         add_option (_("Misc"), new BoolOption (
370                                 "glue-new-markers-to-bars-and-beats",
371                                 _("Glue new markers to bars and beats"),
372                                 sigc::mem_fun (*_session_config, &SessionConfiguration::get_glue_new_markers_to_bars_and_beats),
373                                 sigc::mem_fun (*_session_config, &SessionConfiguration::set_glue_new_markers_to_bars_and_beats)
374                                 ));
375
376         add_option (_("Misc"), new BoolOption (
377                                 "glue-new-regions-to-bars-and-beats",
378                                 _("Glue new regions to bars and beats"),
379                                 sigc::mem_fun (*_session_config, &SessionConfiguration::get_glue_new_regions_to_bars_and_beats),
380                                 sigc::mem_fun (*_session_config, &SessionConfiguration::set_glue_new_regions_to_bars_and_beats)
381                                 ));
382
383         add_option (_("Misc"), new OptionEditorHeading (_("Defaults")));
384
385         Gtk::Button* btn = Gtk::manage (new Gtk::Button (_("Use these settings as defaults")));
386         btn->signal_clicked().connect (sigc::mem_fun (*this, &SessionOptionEditor::save_defaults));
387         add_option (_("Misc"), new FooOption (btn));
388
389 }
390
391 void
392 SessionOptionEditor::parameter_changed (std::string const & p)
393 {
394         OptionEditor::parameter_changed (p);
395         if (p == "external-sync") {
396                 if (Config->get_sync_source() == Engine) {
397                         _vpu->set_sensitive(!_session_config->get_external_sync());
398                 } else {
399                         _vpu->set_sensitive(true);
400                 }
401         }
402         else if (p == "timecode-format") {
403                 /* update offset clocks */
404                 parameter_changed("timecode-generator-offset");
405                 parameter_changed("slave-timecode-offset");
406         }
407         else if (p == "track-name-take") {
408                 _take_name->set_sensitive(_session_config->get_track_name_take());
409         }
410 }
411
412 /* the presence of absence of a monitor section is not really a regular session
413  * property so we provide these two functions to act as setter/getter slots
414  */
415
416 bool
417 SessionOptionEditor::set_use_monitor_section (bool yn)
418 {
419         bool had_monitor_section = _session->monitor_out() != 0;
420
421         if (yn) {
422                 _session->add_monitor_section ();
423         } else {
424                 _session->remove_monitor_section ();
425         }
426
427         /* store this choice for any new sessions */
428
429         Config->set_use_monitor_bus (yn);
430
431         return had_monitor_section != (_session->monitor_out() != 0);
432 }
433
434 bool
435 SessionOptionEditor::get_use_monitor_section ()
436 {
437         return _session->monitor_out() != 0;
438 }
439
440 void
441 SessionOptionEditor::save_defaults ()
442 {
443         _session->save_default_options();
444 }