use -r argument with JACK if realtime is not requested in engine dialog (also applied...
[ArdourMidi.git] / gtk2_ardour / session_option_editor.cc
blobed7520118b922120cad1155fc67d0efce99c562e
1 #include "ardour/session.h"
2 #include "ardour/io.h"
3 #include "ardour/auditioner.h"
4 #include "ardour/audioengine.h"
5 #include "ardour/port.h"
7 #include "gui_thread.h"
8 #include "session_option_editor.h"
9 #include "port_matrix.h"
10 #include "i18n.h"
12 using namespace std;
13 using namespace ARDOUR;
15 class OptionsPortMatrix : public PortMatrix
17 public:
18 OptionsPortMatrix (Gtk::Window* parent, ARDOUR::Session* session)
19 : PortMatrix (parent, session, DataType::AUDIO)
21 _port_group.reset (new PortGroup (""));
22 _ports[OURS].add_group (_port_group);
24 setup_all_ports ();
25 init ();
28 void setup_ports (int dim)
30 if (dim == OURS) {
31 _port_group->clear ();
32 _port_group->add_bundle (_session->click_io()->bundle());
33 _port_group->add_bundle (_session->the_auditioner()->output()->bundle());
34 } else {
35 _ports[OTHER].gather (_session, DataType::AUDIO, true, false);
39 void set_state (ARDOUR::BundleChannel c[2], bool s)
41 Bundle::PortList const & our_ports = c[OURS].bundle->channel_ports (c[OURS].channel);
42 Bundle::PortList const & other_ports = c[OTHER].bundle->channel_ports (c[OTHER].channel);
44 if (c[OURS].bundle == _session->click_io()->bundle()) {
46 for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) {
47 for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
49 Port* f = _session->engine().get_port_by_name (*i);
50 assert (f);
52 if (s) {
53 _session->click_io()->connect (f, *j, 0);
54 } else {
55 _session->click_io()->disconnect (f, *j, 0);
62 PortMatrixNode::State get_state (ARDOUR::BundleChannel c[2]) const
64 Bundle::PortList const & our_ports = c[OURS].bundle->channel_ports (c[OURS].channel);
65 Bundle::PortList const & other_ports = c[OTHER].bundle->channel_ports (c[OTHER].channel);
67 if (c[OURS].bundle == _session->click_io()->bundle()) {
69 for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) {
70 for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
71 Port* f = _session->engine().get_port_by_name (*i);
72 assert (f);
74 if (f->connected_to (*j)) {
75 return PortMatrixNode::ASSOCIATED;
76 } else {
77 return PortMatrixNode::NOT_ASSOCIATED;
82 } else {
84 /* XXX */
88 return PortMatrixNode::NOT_ASSOCIATED;
91 bool list_is_global (int dim) const {
92 return (dim == OTHER);
95 bool can_remove_channels (boost::shared_ptr<Bundle>) const {
96 return false;
99 void remove_channel (ARDOUR::BundleChannel) {}
101 std::string disassociation_verb () const {
102 return _("Disassociate");
105 private:
106 /* see PortMatrix: signal flow from 0 to 1 (out to in) */
107 enum {
108 OURS = 0,
109 OTHER = 1,
112 boost::shared_ptr<PortGroup> _port_group;
117 class ConnectionOptions : public OptionEditorBox
119 public:
120 ConnectionOptions (Gtk::Window* parent, ARDOUR::Session* s)
121 : _port_matrix (parent, s)
123 _box->pack_start (_port_matrix);
126 void parameter_changed (string const &)
131 void set_state_from_config ()
136 private:
137 OptionsPortMatrix _port_matrix;
140 SessionOptionEditor::SessionOptionEditor (Session* s)
141 : OptionEditor (&(s->config), _("Session Properties"))
142 , _session_config (&(s->config))
144 set_name ("SessionProperties");
146 /* SYNC */
148 ComboOption<uint32_t>* spf = new ComboOption<uint32_t> (
149 "subframes-per-frame",
150 _("Subframes per frame"),
151 sigc::mem_fun (*_session_config, &SessionConfiguration::get_subframes_per_frame),
152 sigc::mem_fun (*_session_config, &SessionConfiguration::set_subframes_per_frame)
155 spf->add (80, _("80"));
156 spf->add (100, _("100"));
158 add_option (_("Sync"), spf);
160 ComboOption<SyncSource>* ssrc = new ComboOption<SyncSource> (
161 "sync-source",
162 _("External sync source"),
163 sigc::mem_fun (*_session_config, &SessionConfiguration::get_sync_source),
164 sigc::mem_fun (*_session_config, &SessionConfiguration::set_sync_source)
167 s->config.ParameterChanged.connect (_session_connections, invalidator (*this), ui_bind (&SessionOptionEditor::follow_sync_state, this, _1, s, ssrc), gui_context());
169 populate_sync_options (s, ssrc);
170 follow_sync_state (string ("external-sync"), s, ssrc);
172 add_option (_("Sync"), ssrc);
174 ComboOption<TimecodeFormat>* smf = new ComboOption<TimecodeFormat> (
175 "timecode-format",
176 _("Timecode frames-per-second"),
177 sigc::mem_fun (*_session_config, &SessionConfiguration::get_timecode_format),
178 sigc::mem_fun (*_session_config, &SessionConfiguration::set_timecode_format)
181 smf->add (timecode_23976, _("23.976"));
182 smf->add (timecode_24, _("24"));
183 smf->add (timecode_24976, _("24.976"));
184 smf->add (timecode_25, _("25"));
185 smf->add (timecode_2997, _("29.97"));
186 smf->add (timecode_2997drop, _("29.97 drop"));
187 smf->add (timecode_30, _("30"));
188 smf->add (timecode_30drop, _("30 drop"));
189 smf->add (timecode_5994, _("59.94"));
190 smf->add (timecode_60, _("60"));
192 add_option (_("Sync"), smf);
194 add_option (_("Sync"), new BoolOption (
195 "timecode-source-is-synced",
196 _("Timecode source shares sample clock with audio interface"),
197 sigc::mem_fun (*_session_config, &SessionConfiguration::get_timecode_source_is_synced),
198 sigc::mem_fun (*_session_config, &SessionConfiguration::set_timecode_source_is_synced)
201 ComboOption<float>* vpu = new ComboOption<float> (
202 "video-pullup",
203 _("Pull-up / pull-down"),
204 sigc::mem_fun (*_session_config, &SessionConfiguration::get_video_pullup),
205 sigc::mem_fun (*_session_config, &SessionConfiguration::set_video_pullup)
208 vpu->add (4.1667 + 0.1, _("4.1667 + 0.1%"));
209 vpu->add (4.1667, _("4.1667"));
210 vpu->add (4.1667 - 0.1, _("4.1667 - 0.1%"));
211 vpu->add (0.1, _("0.1"));
212 vpu->add (0, _("none"));
213 vpu->add (-0.1, _("-0.1"));
214 vpu->add (-4.1667 + 0.1, _("-4.1667 + 0.1%"));
215 vpu->add (-4.1667, _("-4.1667"));
216 vpu->add (-4.1667 - 0.1, _("-4.1667 - 0.1%"));
218 add_option (_("Sync"), vpu);
220 /* FADES */
222 ComboOption<CrossfadeModel>* cfm = new ComboOption<CrossfadeModel> (
223 "xfade-model",
224 _("Crossfades are created"),
225 sigc::mem_fun (*_session_config, &SessionConfiguration::get_xfade_model),
226 sigc::mem_fun (*_session_config, &SessionConfiguration::set_xfade_model)
229 cfm->add (FullCrossfade, _("to span entire overlap"));
230 cfm->add (ShortCrossfade, _("short"));
232 add_option (_("Fades"), cfm);
234 add_option (_("Fades"), new SpinOption<float> (
235 _("short-xfade-seconds"),
236 _("Short crossfade length"),
237 sigc::mem_fun (*_session_config, &SessionConfiguration::get_short_xfade_seconds),
238 sigc::mem_fun (*_session_config, &SessionConfiguration::set_short_xfade_seconds),
239 0, 1000, 1, 10,
240 _("ms"), 0.001
243 add_option (_("Fades"), new SpinOption<float> (
244 _("destructive-xfade-seconds"),
245 _("Destructive crossfade length"),
246 sigc::mem_fun (*_session_config, &SessionConfiguration::get_destructive_xfade_msecs),
247 sigc::mem_fun (*_session_config, &SessionConfiguration::set_destructive_xfade_msecs),
248 0, 1000, 1, 10,
249 _("ms")
252 add_option (_("Fades"), new BoolOption (
253 "auto-xfade",
254 _("Create crossfades automatically"),
255 sigc::mem_fun (*_session_config, &SessionConfiguration::get_auto_xfade),
256 sigc::mem_fun (*_session_config, &SessionConfiguration::set_auto_xfade)
259 add_option (_("Fades"), new BoolOption (
260 "xfades-active",
261 _("Crossfades active"),
262 sigc::mem_fun (*_session_config, &SessionConfiguration::get_xfades_active),
263 sigc::mem_fun (*_session_config, &SessionConfiguration::set_xfades_active)
266 add_option (_("Fades"), new BoolOption (
267 "xfades-visible",
268 _("Crossfades visible"),
269 sigc::mem_fun (*_session_config, &SessionConfiguration::get_xfades_visible),
270 sigc::mem_fun (*_session_config, &SessionConfiguration::set_xfades_visible)
273 add_option (_("Fades"), new BoolOption (
274 "use-region-fades",
275 _("Region fades active"),
276 sigc::mem_fun (*_session_config, &SessionConfiguration::get_use_region_fades),
277 sigc::mem_fun (*_session_config, &SessionConfiguration::set_use_region_fades)
280 add_option (_("Fades"), new BoolOption (
281 "show-region-fades",
282 _("Region fades visible"),
283 sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_region_fades),
284 sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_region_fades)
287 /* MISC */
289 add_option (_("Misc"), new OptionEditorHeading (_("Audio file format")));
291 ComboOption<SampleFormat>* sf = new ComboOption<SampleFormat> (
292 "native-file-data-format",
293 _("Sample format"),
294 sigc::mem_fun (*_session_config, &SessionConfiguration::get_native_file_data_format),
295 sigc::mem_fun (*_session_config, &SessionConfiguration::set_native_file_data_format)
298 sf->add (FormatFloat, _("32-bit floating point"));
299 sf->add (FormatInt24, _("24-bit integer"));
300 sf->add (FormatInt16, _("16-bit integer"));
302 add_option (_("Misc"), sf);
304 ComboOption<HeaderFormat>* hf = new ComboOption<HeaderFormat> (
305 "native-file-header-format",
306 _("File type"),
307 sigc::mem_fun (*_session_config, &SessionConfiguration::get_native_file_header_format),
308 sigc::mem_fun (*_session_config, &SessionConfiguration::set_native_file_header_format)
311 hf->add (BWF, _("Broadcast WAVE"));
312 hf->add (WAVE, _("WAVE"));
313 hf->add (WAVE64, _("WAVE-64"));
314 hf->add (CAF, _("CAF"));
316 add_option (_("Misc"), hf);
318 add_option (_("Misc"), new OptionEditorHeading (_("Layering")));
320 ComboOption<LayerModel>* lm = new ComboOption<LayerModel> (
321 "layer-model",
322 _("Layering model in overlaid mode"),
323 sigc::mem_fun (*_session_config, &SessionConfiguration::get_layer_model),
324 sigc::mem_fun (*_session_config, &SessionConfiguration::set_layer_model)
327 lm->add (LaterHigher, _("later is higher"));
328 lm->add (MoveAddHigher, _("most recently moved or added is higher"));
329 lm->add (AddHigher, _("most recently added is higher"));
331 add_option (_("Misc"), lm);
333 add_option (_("Misc"), new OptionEditorHeading (_("MIDI Note Overlaps")));
335 ComboOption<InsertMergePolicy>* li = new ComboOption<InsertMergePolicy> (
336 "insert-merge-policy",
337 _("Handle same note+channel overlaps by"),
338 sigc::mem_fun (*_session_config, &SessionConfiguration::get_insert_merge_policy),
339 sigc::mem_fun (*_session_config, &SessionConfiguration::set_insert_merge_policy)
342 li->add (InsertMergeReject, _("Never allowing them"));
343 li->add (InsertMergeRelax, _("Don't do anything in particular"));
344 li->add (InsertMergeReplace, _("Replace any overlapped existing note"));
345 li->add (InsertMergeTruncateExisting, _("Shorten the overlapped existing note"));
346 li->add (InsertMergeTruncateAddition, _("Shorten the overlapping new note"));
347 li->add (InsertMergeExtend, _("Replace both overlapping notes with a single note"));
349 add_option (_("Misc"), li);
351 add_option (_("Misc"), new OptionEditorHeading (_("Broadcast WAVE metadata")));
353 add_option (_("Misc"), new EntryOption (
354 "bwf-country-code",
355 _("Country code"),
356 sigc::mem_fun (*_session_config, &SessionConfiguration::get_bwf_country_code),
357 sigc::mem_fun (*_session_config, &SessionConfiguration::set_bwf_country_code)
360 add_option (_("Misc"), new EntryOption (
361 "bwf-organization-code",
362 _("Organization code"),
363 sigc::mem_fun (*_session_config, &SessionConfiguration::get_bwf_organization_code),
364 sigc::mem_fun (*_session_config, &SessionConfiguration::set_bwf_organization_code)
367 add_option (_("Connections"), new ConnectionOptions (this, s));
370 void
371 SessionOptionEditor::populate_sync_options (Session* s, Option* opt)
373 ComboOption<SyncSource>* sync_opt = dynamic_cast<ComboOption<SyncSource>* > (opt);
375 vector<SyncSource> sync_opts = s->get_available_sync_options ();
377 sync_opt->clear ();
379 for (vector<SyncSource>::iterator i = sync_opts.begin(); i != sync_opts.end(); ++i) {
380 sync_opt->add (*i, sync_source_to_string (*i));
384 void
385 SessionOptionEditor::follow_sync_state (std::string p, Session* s, Option* opt)
387 ComboOption<SyncSource>* sync_opt = dynamic_cast<ComboOption<SyncSource>* > (opt);
388 if (p == "external-sync") {
389 if (s->config.get_external_sync()) {
390 sync_opt->set_sensitive (false);
391 } else {
392 sync_opt->set_sensitive (true);