ardour
session_option_editor.cc
Go to the documentation of this file.
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 "i18n.h"
26 
27 using namespace std;
28 using namespace ARDOUR;
29 using namespace Timecode;
30 
32  : OptionEditor (&(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 
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-region-fades",
146  _("Region fades active"),
147  sigc::mem_fun (*_session_config, &SessionConfiguration::get_use_region_fades),
148  sigc::mem_fun (*_session_config, &SessionConfiguration::set_use_region_fades)
149  ));
150 
151  add_option (_("Fades"), new BoolOption (
152  "show-region-fades",
153  _("Region fades visible"),
154  sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_region_fades),
155  sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_region_fades)
156  ));
157 
158  /* Media */
159 
160  add_option (_("Media"), new OptionEditorHeading (_("Audio file format")));
161 
163  "native-file-data-format",
164  _("Sample format"),
165  sigc::mem_fun (*_session_config, &SessionConfiguration::get_native_file_data_format),
166  sigc::mem_fun (*_session_config, &SessionConfiguration::set_native_file_data_format)
167  );
168 
169  sf->add (FormatFloat, _("32-bit floating point"));
170  sf->add (FormatInt24, _("24-bit integer"));
171  sf->add (FormatInt16, _("16-bit integer"));
172 
173  add_option (_("Media"), sf);
174 
176  "native-file-header-format",
177  _("File type"),
178  sigc::mem_fun (*_session_config, &SessionConfiguration::get_native_file_header_format),
179  sigc::mem_fun (*_session_config, &SessionConfiguration::set_native_file_header_format)
180  );
181 
182  hf->add (BWF, _("Broadcast WAVE"));
183  hf->add (WAVE, _("WAVE"));
184  hf->add (WAVE64, _("WAVE-64"));
185  hf->add (CAF, _("CAF"));
186 
187  add_option (_("Media"), hf);
188 
189  add_option (_("Locations"), new OptionEditorHeading (_("File locations")));
190 
191  SearchPathOption* spo = new SearchPathOption ("audio-search-path", _("Search for audio files in:"),
192  _session->path(),
193  sigc::mem_fun (*_session_config, &SessionConfiguration::get_audio_search_path),
194  sigc::mem_fun (*_session_config, &SessionConfiguration::set_audio_search_path));
195  add_option (_("Locations"), spo);
196 
197  spo = new SearchPathOption ("midi-search-path", _("Search for MIDI files in:"),
198  _session->path(),
199  sigc::mem_fun (*_session_config, &SessionConfiguration::get_midi_search_path),
200  sigc::mem_fun (*_session_config, &SessionConfiguration::set_midi_search_path));
201 
202  add_option (_("Locations"), spo);
203 
204  /* File Naming */
205 
206  add_option (_("Filenames"), new OptionEditorHeading (_("File Naming")));
207 
208  BoolOption *bo;
209 
210  bo = new RouteDisplayBoolOption (
211  "track-name-number",
212  _("Prefix Track number"),
213  sigc::mem_fun (*_session_config, &SessionConfiguration::get_track_name_number),
214  sigc::mem_fun (*_session_config, &SessionConfiguration::set_track_name_number)
215  );
217  _("Adds the current track number to the beginning of the recorded file name."));
218  add_option (_("Filenames"), bo);
219 
220  bo = new BoolOption (
221  "track-name-take",
222  _("Prefix Take Name"),
223  sigc::mem_fun (*_session_config, &SessionConfiguration::get_track_name_take),
224  sigc::mem_fun (*_session_config, &SessionConfiguration::set_track_name_take)
225  );
227  _("Adds the Take Name to the beginning of the recorded file name."));
228  add_option (_("Filenames"), bo);
229 
230  _take_name = new EntryOption (
231  "take-name",
232  _("Take Name"),
233  sigc::mem_fun (*_session_config, &SessionConfiguration::get_take_name),
234  sigc::mem_fun (*_session_config, &SessionConfiguration::set_take_name)
235  );
237  _take_name->set_sensitive(_session_config->get_track_name_take());
238 
239  add_option (_("Filenames"), _take_name);
240 
241  /* Monitoring */
242 
243  add_option (_("Monitoring"), new BoolOption (
244  "auto-input",
245  _("Track Input Monitoring automatically follows transport state (\"auto-input\")"),
246  sigc::mem_fun (*_session_config, &SessionConfiguration::get_auto_input),
247  sigc::mem_fun (*_session_config, &SessionConfiguration::set_auto_input)
248  ));
249 
250  add_option (_("Monitoring"), new BoolOption (
251  "have-monitor-section",
252  _("Use monitor section in this session"),
253  sigc::mem_fun (*this, &SessionOptionEditor::get_use_monitor_section),
254  sigc::mem_fun (*this, &SessionOptionEditor::set_use_monitor_section)
255  ));
256  /* Meterbridge */
257  add_option (_("Meterbridge"), new OptionEditorHeading (_("Route Display")));
258 
259  add_option (_("Meterbridge"), new BoolOption (
260  "show-midi-on-meterbridge",
261  _("Show Midi Tracks"),
262  sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_midi_on_meterbridge),
263  sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_midi_on_meterbridge)
264  ));
265 
266  add_option (_("Meterbridge"), new BoolOption (
267  "show-busses-on-meterbridge",
268  _("Show Busses"),
269  sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_busses_on_meterbridge),
270  sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_busses_on_meterbridge)
271  ));
272 
273  add_option (_("Meterbridge"), new BoolOption (
274  "show-master-on-meterbridge",
275  _("Include Master Bus"),
276  sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_master_on_meterbridge),
277  sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_master_on_meterbridge)
278  ));
279 
280  add_option (_("Meterbridge"), new OptionEditorHeading (_("Button Area")));
281 
282  add_option (_("Meterbridge"), new BoolOption (
283  "show-rec-on-meterbridge",
284  _("Rec-enable Button"),
285  sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_rec_on_meterbridge),
286  sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_rec_on_meterbridge)
287  ));
288 
289  add_option (_("Meterbridge"), new BoolOption (
290  "show-mute-on-meterbridge",
291  _("Mute Button"),
292  sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_mute_on_meterbridge),
293  sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_mute_on_meterbridge)
294  ));
295 
296  add_option (_("Meterbridge"), new BoolOption (
297  "show-solo-on-meterbridge",
298  _("Solo Button"),
299  sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_solo_on_meterbridge),
300  sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_solo_on_meterbridge)
301  ));
302 
303  add_option (_("Meterbridge"), new BoolOption (
304  "show-monitor-on-meterbridge",
305  _("Monitor Buttons"),
306  sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_monitor_on_meterbridge),
307  sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_monitor_on_meterbridge)
308  ));
309 
310  add_option (_("Meterbridge"), new OptionEditorHeading (_("Name Labels")));
311 
312  add_option (_("Meterbridge"), new BoolOption (
313  "show-name-on-meterbridge",
314  _("Track Name"),
315  sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_name_on_meterbridge),
316  sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_name_on_meterbridge)
317  ));
318 
319  /* Misc */
320 
321  add_option (_("Misc"), new OptionEditorHeading (_("MIDI Options")));
322 
323  add_option (_("Misc"), new BoolOption (
324  "midi-copy-is-fork",
325  _("MIDI region copies are independent"),
326  sigc::mem_fun (*_session_config, &SessionConfiguration::get_midi_copy_is_fork),
327  sigc::mem_fun (*_session_config, &SessionConfiguration::set_midi_copy_is_fork)
328  ));
329 
331  "insert-merge-policy",
332  _("Policy for handling overlapping notes\n on the same MIDI channel"),
333  sigc::mem_fun (*_session_config, &SessionConfiguration::get_insert_merge_policy),
334  sigc::mem_fun (*_session_config, &SessionConfiguration::set_insert_merge_policy)
335  );
336 
337  li->add (InsertMergeReject, _("never allow them"));
338  li->add (InsertMergeRelax, _("don't do anything in particular"));
339  li->add (InsertMergeReplace, _("replace any overlapped existing note"));
340  li->add (InsertMergeTruncateExisting, _("shorten the overlapped existing note"));
341  li->add (InsertMergeTruncateAddition, _("shorten the overlapping new note"));
342  li->add (InsertMergeExtend, _("replace both overlapping notes with a single note"));
343 
344  add_option (_("Misc"), li);
345 
346  add_option (_("Misc"), new OptionEditorHeading (_("Glue to bars and beats")));
347 
348  add_option (_("Misc"), new BoolOption (
349  "glue-new-markers-to-bars-and-beats",
350  _("Glue new markers to bars and beats"),
351  sigc::mem_fun (*_session_config, &SessionConfiguration::get_glue_new_markers_to_bars_and_beats),
352  sigc::mem_fun (*_session_config, &SessionConfiguration::set_glue_new_markers_to_bars_and_beats)
353  ));
354 
355  add_option (_("Misc"), new BoolOption (
356  "glue-new-regions-to-bars-and-beats",
357  _("Glue new regions to bars and beats"),
358  sigc::mem_fun (*_session_config, &SessionConfiguration::get_glue_new_regions_to_bars_and_beats),
359  sigc::mem_fun (*_session_config, &SessionConfiguration::set_glue_new_regions_to_bars_and_beats)
360  ));
361 
362  add_option (_("Misc"), new OptionEditorHeading (_("Defaults")));
363 
364  Gtk::Button* btn = Gtk::manage (new Gtk::Button (_("Use these settings as defaults")));
365  btn->signal_clicked().connect (sigc::mem_fun (*this, &SessionOptionEditor::save_defaults));
366  add_option (_("Misc"), new FooOption (btn));
367 
368 }
369 
370 void
372 {
374  if (p == "external-sync") {
375  if (Config->get_sync_source() == Engine) {
376  _vpu->set_sensitive(!_session_config->get_external_sync());
377  } else {
378  _vpu->set_sensitive(true);
379  }
380  }
381  else if (p == "timecode-format") {
382  /* update offset clocks */
383  parameter_changed("timecode-generator-offset");
384  parameter_changed("slave-timecode-offset");
385  }
386  else if (p == "track-name-take") {
387  _take_name->set_sensitive(_session_config->get_track_name_take());
388  }
389 }
390 
391 /* the presence of absence of a monitor section is not really a regular session
392  * property so we provide these two functions to act as setter/getter slots
393  */
394 
395 bool
397 {
398  bool had_monitor_section = _session->monitor_out() != 0;
399 
400  if (yn) {
402  } else {
404  }
405 
406  /* store this choice for any new sessions */
407 
408  Config->set_use_monitor_bus (yn);
409 
410  return had_monitor_section != yn;
411 }
412 
413 bool
415 {
416  return _session->monitor_out() != 0;
417 }
418 
419 void
421 {
423 }
ComboOption< float > * _vpu
SessionOptionEditor(ARDOUR::Session *s)
Gtk::Widget & tip_widget()
Definition: Beats.hpp:239
static UI * instance()
Definition: gtk_ui.h:119
void parameter_changed(std::string const &)
virtual void parameter_changed(std::string const &)
#define _(Text)
Definition: i18n.h:11
LIBARDOUR_API RCConfiguration * Config
Definition: globals.cc:119
Definition: amp.h:29
void set_invalid_chars(std::string i)
void add_option(std::string const &, OptionEditorComponent *)
std::string path() const
Definition: session.h:165
ARDOUR::SessionConfiguration * _session_config
void add(T e, std::string const &o)
void set_tip(Gtk::Widget &w, const gchar *tip)
bool save_default_options()
void set_session(ARDOUR::Session *)
void set_sensitive(bool)
void set_sensitive(bool yn)
AudioClock & clock()
virtual void set_session(ARDOUR::Session *)
Gtk::Widget & tip_widget()
void remove_monitor_section()
Definition: session.cc:877
void set_negative_allowed(bool yn)
boost::shared_ptr< Route > monitor_out() const
Definition: session.h:717
ARDOUR::Session * _session
void add_monitor_section()
Definition: session.cc:929
std::string string_compose(const std::string &fmt, const T1 &o1)
Definition: compose.h:208
smf_t * smf
Definition: smfsh.c:51