#include "ardour/auditioner.h"
#include "ardour/audioengine.h"
#include "ardour/port.h"
+
+#include "gui_thread.h"
#include "session_option_editor.h"
#include "port_matrix.h"
#include "i18n.h"
using namespace std;
-using namespace sigc;
using namespace ARDOUR;
class OptionsPortMatrix : public PortMatrix
{
public:
- OptionsPortMatrix (Gtk::Window* parent, ARDOUR::Session& session)
+ OptionsPortMatrix (Gtk::Window* parent, ARDOUR::Session* session)
: PortMatrix (parent, session, DataType::AUDIO)
{
_port_group.reset (new PortGroup (""));
_ports[OURS].add_group (_port_group);
setup_all_ports ();
+ init ();
}
void setup_ports (int dim)
{
- cerr << _session.the_auditioner()->output()->n_ports() << "\n";
-
if (dim == OURS) {
_port_group->clear ();
- _port_group->add_bundle (_session.click_io()->bundle());
- _port_group->add_bundle (_session.the_auditioner()->output()->bundle());
+ _port_group->add_bundle (_session->click_io()->bundle());
+ _port_group->add_bundle (_session->the_auditioner()->output()->bundle());
} else {
- _ports[OTHER].gather (_session, true);
+ _ports[OTHER].gather (_session, true, false);
}
}
Bundle::PortList const & our_ports = c[OURS].bundle->channel_ports (c[OURS].channel);
Bundle::PortList const & other_ports = c[OTHER].bundle->channel_ports (c[OTHER].channel);
- if (c[OURS].bundle == _session.click_io()->bundle()) {
+ if (c[OURS].bundle == _session->click_io()->bundle()) {
for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) {
for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
- Port* f = _session.engine().get_port_by_name (*i);
+ Port* f = _session->engine().get_port_by_name (*i);
assert (f);
if (s) {
- _session.click_io()->connect (f, *j, 0);
+ _session->click_io()->connect (f, *j, 0);
} else {
- _session.click_io()->disconnect (f, *j, 0);
+ _session->click_io()->disconnect (f, *j, 0);
}
}
}
Bundle::PortList const & our_ports = c[OURS].bundle->channel_ports (c[OURS].channel);
Bundle::PortList const & other_ports = c[OTHER].bundle->channel_ports (c[OTHER].channel);
- if (c[OURS].bundle == _session.click_io()->bundle()) {
+ if (c[OURS].bundle == _session->click_io()->bundle()) {
for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) {
for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
- Port* f = _session.engine().get_port_by_name (*i);
+ Port* f = _session->engine().get_port_by_name (*i);
assert (f);
if (f->connected_to (*j)) {
{
public:
ConnectionOptions (Gtk::Window* parent, ARDOUR::Session* s)
- : _port_matrix (parent, *s)
+ : _port_matrix (parent, s)
{
_box->pack_start (_port_matrix);
}
};
SessionOptionEditor::SessionOptionEditor (Session* s)
- : OptionEditor (&(s->config), _("Session Preferences")),
- _session_config (&(s->config))
+ : OptionEditor (&(s->config), _("Session Preferences"))
+ , _session_config (&(s->config))
{
- /* FADES */
-
- ComboOption<CrossfadeModel>* cfm = new ComboOption<CrossfadeModel> (
- "xfade-model",
- _("Crossfades are created"),
- mem_fun (*_session_config, &SessionConfiguration::get_xfade_model),
- mem_fun (*_session_config, &SessionConfiguration::set_xfade_model)
- );
-
- cfm->add (FullCrossfade, _("to span entire overlap"));
- cfm->add (ShortCrossfade, _("short"));
-
- add_option (_("Fades"), cfm);
-
- add_option (_("Fades"), new SpinOption<float> (
- _("short-xfade-seconds"),
- _("Short crossfade length"),
- mem_fun (*_session_config, &SessionConfiguration::get_short_xfade_seconds),
- mem_fun (*_session_config, &SessionConfiguration::set_short_xfade_seconds),
- 0, 1000, 1, 10,
- _("ms"), 0.001
- ));
-
- add_option (_("Fades"), new SpinOption<float> (
- _("destructive-xfade-seconds"),
- _("Destructive crossfade length"),
- mem_fun (*_session_config, &SessionConfiguration::get_destructive_xfade_msecs),
- mem_fun (*_session_config, &SessionConfiguration::set_destructive_xfade_msecs),
- 0, 1000, 1, 10,
- _("ms")
- ));
-
- add_option (_("Fades"), new BoolOption (
- "auto-xfade",
- _("Create crossfades automatically"),
- mem_fun (*_session_config, &SessionConfiguration::get_auto_xfade),
- mem_fun (*_session_config, &SessionConfiguration::set_auto_xfade)
- ));
-
- add_option (_("Fades"), new BoolOption (
- "xfades-active",
- _("Crossfades active"),
- mem_fun (*_session_config, &SessionConfiguration::get_xfades_active),
- mem_fun (*_session_config, &SessionConfiguration::set_xfades_active)
- ));
-
- add_option (_("Fades"), new BoolOption (
- "xfades-visible",
- _("Crossfades visible"),
- mem_fun (*_session_config, &SessionConfiguration::get_xfades_visible),
- mem_fun (*_session_config, &SessionConfiguration::set_xfades_visible)
- ));
-
- add_option (_("Fades"), new BoolOption (
- "use-region-fades",
- _("Region fades active"),
- mem_fun (*_session_config, &SessionConfiguration::get_use_region_fades),
- mem_fun (*_session_config, &SessionConfiguration::set_use_region_fades)
- ));
-
- add_option (_("Fades"), new BoolOption (
- "show-region-fades",
- _("Region fades visible"),
- mem_fun (*_session_config, &SessionConfiguration::get_show_region_fades),
- mem_fun (*_session_config, &SessionConfiguration::set_show_region_fades)
- ));
-
/* SYNC */
ComboOption<uint32_t>* spf = new ComboOption<uint32_t> (
"subframes-per-frame",
_("Subframes per frame"),
- mem_fun (*_session_config, &SessionConfiguration::get_subframes_per_frame),
- mem_fun (*_session_config, &SessionConfiguration::set_subframes_per_frame)
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_subframes_per_frame),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_subframes_per_frame)
);
spf->add (80, _("80"));
add_option (_("Sync"), spf);
+ ComboOption<SyncSource>* ssrc = new ComboOption<SyncSource> (
+ "sync-source",
+ _("External sync source"),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_sync_source),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_sync_source)
+ );
+
+ s->MTC_PortChanged.connect (_session_connections, invalidator (*this), boost::bind (&SessionOptionEditor::populate_sync_options, this, s, ssrc), gui_context());
+ s->MIDIClock_PortChanged.connect (_session_connections, invalidator (*this), boost::bind (&SessionOptionEditor::populate_sync_options, this, s, ssrc), gui_context());
+ s->config.ParameterChanged.connect (_session_connections, invalidator (*this), ui_bind (&SessionOptionEditor::follow_sync_state, this, _1, s, ssrc), gui_context());
+
+ populate_sync_options (s, ssrc);
+ follow_sync_state (string ("external-sync"), s, ssrc);
+
+ add_option (_("Sync"), ssrc);
+
ComboOption<TimecodeFormat>* smf = new ComboOption<TimecodeFormat> (
"timecode-format",
_("Timecode frames-per-second"),
- mem_fun (*_session_config, &SessionConfiguration::get_timecode_format),
- mem_fun (*_session_config, &SessionConfiguration::set_timecode_format)
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_timecode_format),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_timecode_format)
);
smf->add (timecode_23976, _("23.976"));
add_option (_("Sync"), new BoolOption (
"timecode-source-is-synced",
- _("Timecode source is synced"),
- mem_fun (*_session_config, &SessionConfiguration::get_timecode_source_is_synced),
- mem_fun (*_session_config, &SessionConfiguration::set_timecode_source_is_synced)
+ _("Timecode source shares sample clock with audio interface"),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_timecode_source_is_synced),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_timecode_source_is_synced)
));
ComboOption<float>* vpu = new ComboOption<float> (
"video-pullup",
_("Pull-up / pull-down"),
- mem_fun (*_session_config, &SessionConfiguration::get_video_pullup),
- mem_fun (*_session_config, &SessionConfiguration::set_video_pullup)
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_video_pullup),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_video_pullup)
);
vpu->add (4.1667 + 0.1, _("4.1667 + 0.1%"));
add_option (_("Sync"), vpu);
+ /* FADES */
+
+ ComboOption<CrossfadeModel>* cfm = new ComboOption<CrossfadeModel> (
+ "xfade-model",
+ _("Crossfades are created"),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_xfade_model),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_xfade_model)
+ );
+
+ cfm->add (FullCrossfade, _("to span entire overlap"));
+ cfm->add (ShortCrossfade, _("short"));
+
+ add_option (_("Fades"), cfm);
+
+ add_option (_("Fades"), new SpinOption<float> (
+ _("short-xfade-seconds"),
+ _("Short crossfade length"),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_short_xfade_seconds),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_short_xfade_seconds),
+ 0, 1000, 1, 10,
+ _("ms"), 0.001
+ ));
+
+ add_option (_("Fades"), new SpinOption<float> (
+ _("destructive-xfade-seconds"),
+ _("Destructive crossfade length"),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_destructive_xfade_msecs),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_destructive_xfade_msecs),
+ 0, 1000, 1, 10,
+ _("ms")
+ ));
+
+ add_option (_("Fades"), new BoolOption (
+ "auto-xfade",
+ _("Create crossfades automatically"),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_auto_xfade),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_auto_xfade)
+ ));
+
+ add_option (_("Fades"), new BoolOption (
+ "xfades-active",
+ _("Crossfades active"),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_xfades_active),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_xfades_active)
+ ));
+
+ add_option (_("Fades"), new BoolOption (
+ "xfades-visible",
+ _("Crossfades visible"),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_xfades_visible),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_xfades_visible)
+ ));
+
+ add_option (_("Fades"), new BoolOption (
+ "use-region-fades",
+ _("Region fades active"),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_use_region_fades),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_use_region_fades)
+ ));
+
+ add_option (_("Fades"), new BoolOption (
+ "show-region-fades",
+ _("Region fades visible"),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_region_fades),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_region_fades)
+ ));
+
/* MISC */
add_option (_("Misc"), new OptionEditorHeading (_("Audio file format")));
ComboOption<SampleFormat>* sf = new ComboOption<SampleFormat> (
"native-file-data-format",
_("Sample format"),
- mem_fun (*_session_config, &SessionConfiguration::get_native_file_data_format),
- mem_fun (*_session_config, &SessionConfiguration::set_native_file_data_format)
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_native_file_data_format),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_native_file_data_format)
);
sf->add (FormatFloat, _("32-bit floating point"));
ComboOption<HeaderFormat>* hf = new ComboOption<HeaderFormat> (
"native-file-header-format",
_("File type"),
- mem_fun (*_session_config, &SessionConfiguration::get_native_file_header_format),
- mem_fun (*_session_config, &SessionConfiguration::set_native_file_header_format)
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_native_file_header_format),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_native_file_header_format)
);
hf->add (BWF, _("Broadcast WAVE"));
ComboOption<LayerModel>* lm = new ComboOption<LayerModel> (
"layer-model",
_("Layering model in overlaid mode"),
- mem_fun (*_session_config, &SessionConfiguration::get_layer_model),
- mem_fun (*_session_config, &SessionConfiguration::set_layer_model)
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_layer_model),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_layer_model)
);
lm->add (LaterHigher, _("later is higher"));
add_option (_("Misc"), new EntryOption (
"bwf-country-code",
_("Country code"),
- mem_fun (*_session_config, &SessionConfiguration::get_bwf_country_code),
- mem_fun (*_session_config, &SessionConfiguration::set_bwf_country_code)
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_bwf_country_code),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_bwf_country_code)
));
add_option (_("Misc"), new EntryOption (
"bwf-organization-code",
_("Organization code"),
- mem_fun (*_session_config, &SessionConfiguration::get_bwf_organization_code),
- mem_fun (*_session_config, &SessionConfiguration::set_bwf_organization_code)
+ sigc::mem_fun (*_session_config, &SessionConfiguration::get_bwf_organization_code),
+ sigc::mem_fun (*_session_config, &SessionConfiguration::set_bwf_organization_code)
));
add_option (_("Connections"), new ConnectionOptions (this, s));
}
+
+void
+SessionOptionEditor::populate_sync_options (Session* s, Option* opt)
+{
+ ComboOption<SyncSource>* sync_opt = dynamic_cast<ComboOption<SyncSource>* > (opt);
+
+ vector<SyncSource> sync_opts = s->get_available_sync_options ();
+
+ sync_opt->clear ();
+
+ for (vector<SyncSource>::iterator i = sync_opts.begin(); i != sync_opts.end(); ++i) {
+ sync_opt->add (*i, sync_source_to_string (*i));
+ }
+}
+
+void
+SessionOptionEditor::follow_sync_state (std::string p, Session* s, Option* opt)
+{
+ ComboOption<SyncSource>* sync_opt = dynamic_cast<ComboOption<SyncSource>* > (opt);
+ if (p == "external-sync") {
+ if (s->config.get_external_sync()) {
+ sync_opt->set_sensitive (false);
+ } else {
+ sync_opt->set_sensitive (true);
+ }
+ }
+}