X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fsession_option_editor.cc;h=dbc8bbf2337cecc30e9c04ec2bf60c4f98380990;hb=a851e3b5d96a0610ab8b0efc2b64954c5a17fd62;hp=d9bc00379ca5591e165f40f7275ff7ae737ad4ca;hpb=bcbb1fe93902707b9f1258fc6d2fad32e64e7a7b;p=ardour.git diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc index d9bc00379c..dbc8bbf233 100644 --- a/gtk2_ardour/session_option_editor.cc +++ b/gtk2_ardour/session_option_editor.cc @@ -1,182 +1,66 @@ +/* + Copyright (C) 2000-2010 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + #include "ardour/session.h" #include "ardour/io.h" #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 "search_path_option.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) - : 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()); - } else { - _ports[OTHER].gather (_session, true, false); - } - } - - void set_state (ARDOUR::BundleChannel c[2], bool s) - { - 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()) { - - 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); - assert (f); - - if (s) { - _session.click_io()->connect (f, *j, 0); - } else { - _session.click_io()->disconnect (f, *j, 0); - } - } - } - } - } - - PortMatrixNode::State get_state (ARDOUR::BundleChannel c[2]) const - { - 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()) { - - 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); - assert (f); - - if (f->connected_to (*j)) { - return PortMatrixNode::ASSOCIATED; - } else { - return PortMatrixNode::NOT_ASSOCIATED; - } - } - } - - } else { - - /* XXX */ - - } - - return PortMatrixNode::NOT_ASSOCIATED; - } - - bool list_is_global (int dim) const { - return (dim == OTHER); - } - - bool can_remove_channels (boost::shared_ptr) const { - return false; - } - - void remove_channel (ARDOUR::BundleChannel) {} - - std::string disassociation_verb () const { - return _("Disassociate"); - } - -private: - /* see PortMatrix: signal flow from 0 to 1 (out to in) */ - enum { - OURS = 0, - OTHER = 1, - }; - - boost::shared_ptr _port_group; - -}; - - -class ConnectionOptions : public OptionEditorBox -{ -public: - ConnectionOptions (Gtk::Window* parent, ARDOUR::Session* s) - : _port_matrix (parent, *s) - { - _box->pack_start (_port_matrix); - } - - void parameter_changed (string const &) - { - - } - - void set_state_from_config () - { - - } - -private: - OptionsPortMatrix _port_matrix; -}; - SessionOptionEditor::SessionOptionEditor (Session* s) - : OptionEditor (&(s->config), _("Session Preferences")) + : OptionEditor (&(s->config), _("Session Properties")) , _session_config (&(s->config)) { - /* SYNC */ - - ComboOption* spf = new ComboOption ( - "subframes-per-frame", - _("Subframes per frame"), - mem_fun (*_session_config, &SessionConfiguration::get_subframes_per_frame), - mem_fun (*_session_config, &SessionConfiguration::set_subframes_per_frame) - ); - - spf->add (80, _("80")); - spf->add (100, _("100")); + set_session (s); + + set_name ("SessionProperties"); - add_option (_("Sync"), spf); + /* TIMECODE*/ - ComboOption* ssrc = new ComboOption ( + _sync_source = new ComboOption ( "sync-source", - _("External sync source"), - mem_fun (*_session_config, &SessionConfiguration::get_sync_source), - mem_fun (*_session_config, &SessionConfiguration::set_sync_source) + _("External timecode source"), + sigc::mem_fun (*_session_config, &SessionConfiguration::get_sync_source), + sigc::mem_fun (*_session_config, &SessionConfiguration::set_sync_source) ); - s->MTC_PortChanged.connect (bind (mem_fun (*this, &SessionOptionEditor::populate_sync_options), s, ssrc)); - s->MIDIClock_PortChanged.connect (bind (mem_fun (*this, &SessionOptionEditor::populate_sync_options), s, ssrc)); - s->config.ParameterChanged.connect (bind (mem_fun (*this, &SessionOptionEditor::follow_sync_state), s, ssrc)); + populate_sync_options (); + parameter_changed (string ("external-sync")); - populate_sync_options (s, ssrc); - follow_sync_state (string ("external-sync"), s, ssrc); + add_option (_("Timecode"), _sync_source); + + add_option (_("Timecode"), new OptionEditorHeading (_("Timecode Settings"))); - add_option (_("Sync"), ssrc); ComboOption* smf = new ComboOption ( "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")); @@ -190,20 +74,32 @@ SessionOptionEditor::SessionOptionEditor (Session* s) smf->add (timecode_5994, _("59.94")); smf->add (timecode_60, _("60")); - add_option (_("Sync"), smf); + add_option (_("Timecode"), smf); + + ComboOption* spf = new ComboOption ( + "subframes-per-frame", + _("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")); + spf->add (100, _("100")); + + add_option (_("Timecode"), spf); - add_option (_("Sync"), new BoolOption ( + add_option (_("Timecode"), 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* vpu = new ComboOption ( "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%")); @@ -216,15 +112,33 @@ SessionOptionEditor::SessionOptionEditor (Session* s) vpu->add (-4.1667, _("-4.1667")); vpu->add (-4.1667 - 0.1, _("-4.1667 - 0.1%")); - add_option (_("Sync"), vpu); + add_option (_("Timecode"), vpu); + + ClockOption* co = new ClockOption ( + "timecode-offset", + _("Timecode Offset"), + sigc::mem_fun (*_session_config, &SessionConfiguration::get_timecode_offset), + sigc::mem_fun (*_session_config, &SessionConfiguration::set_timecode_offset) + ); + + co->set_session (_session); + + add_option (_("Timecode"), co); + + add_option (_("Timecode"), new BoolOption ( + "timecode-offset-negative", + _("Timecode Offset Negative"), + sigc::mem_fun (*_session_config, &SessionConfiguration::get_timecode_offset_negative), + sigc::mem_fun (*_session_config, &SessionConfiguration::set_timecode_offset_negative) + )); /* FADES */ ComboOption* cfm = new ComboOption ( "xfade-model", _("Crossfades are created"), - mem_fun (*_session_config, &SessionConfiguration::get_xfade_model), - mem_fun (*_session_config, &SessionConfiguration::set_xfade_model) + 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")); @@ -235,8 +149,8 @@ SessionOptionEditor::SessionOptionEditor (Session* s) add_option (_("Fades"), new SpinOption ( _("short-xfade-seconds"), _("Short crossfade length"), - mem_fun (*_session_config, &SessionConfiguration::get_short_xfade_seconds), - mem_fun (*_session_config, &SessionConfiguration::set_short_xfade_seconds), + 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 )); @@ -244,8 +158,8 @@ SessionOptionEditor::SessionOptionEditor (Session* s) add_option (_("Fades"), new SpinOption ( _("destructive-xfade-seconds"), _("Destructive crossfade length"), - mem_fun (*_session_config, &SessionConfiguration::get_destructive_xfade_msecs), - mem_fun (*_session_config, &SessionConfiguration::set_destructive_xfade_msecs), + 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") )); @@ -253,60 +167,60 @@ SessionOptionEditor::SessionOptionEditor (Session* s) 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) + 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"), - mem_fun (*_session_config, &SessionConfiguration::get_xfades_active), - mem_fun (*_session_config, &SessionConfiguration::set_xfades_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"), - mem_fun (*_session_config, &SessionConfiguration::get_xfades_visible), - mem_fun (*_session_config, &SessionConfiguration::set_xfades_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"), - mem_fun (*_session_config, &SessionConfiguration::get_use_region_fades), - mem_fun (*_session_config, &SessionConfiguration::set_use_region_fades) + 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"), - mem_fun (*_session_config, &SessionConfiguration::get_show_region_fades), - mem_fun (*_session_config, &SessionConfiguration::set_show_region_fades) + sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_region_fades), + sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_region_fades) )); - /* MISC */ + /* Media */ - add_option (_("Misc"), new OptionEditorHeading (_("Audio file format"))); + add_option (_("Media"), new OptionEditorHeading (_("Audio file format"))); ComboOption* sf = new ComboOption ( "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")); sf->add (FormatInt24, _("24-bit integer")); sf->add (FormatInt16, _("16-bit integer")); - add_option (_("Misc"), sf); + add_option (_("Media"), sf); ComboOption* hf = new ComboOption ( "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")); @@ -314,15 +228,30 @@ SessionOptionEditor::SessionOptionEditor (Session* s) hf->add (WAVE64, _("WAVE-64")); hf->add (CAF, _("CAF")); - add_option (_("Misc"), hf); + add_option (_("Media"), hf); + + add_option (_("Media"), new OptionEditorHeading (_("File locations"))); + + SearchPathOption* spo = new SearchPathOption ("audio-search-path", _("Search for audio files in:"), + sigc::mem_fun (*_session_config, &SessionConfiguration::get_audio_search_path), + sigc::mem_fun (*_session_config, &SessionConfiguration::set_audio_search_path)); + add_option (_("Media"), spo); + + spo = new SearchPathOption ("midi-search-path", _("Search for MIDI files in:"), + sigc::mem_fun (*_session_config, &SessionConfiguration::get_midi_search_path), + sigc::mem_fun (*_session_config, &SessionConfiguration::set_midi_search_path)); - add_option (_("Misc"), new OptionEditorHeading (_("Layering"))); + add_option (_("Media"), spo); + + /* Misc */ + + add_option (_("Misc"), new OptionEditorHeading (_("Layering (in overlaid mode)"))); ComboOption* lm = new ComboOption ( "layer-model", - _("Layering model in overlaid mode"), - mem_fun (*_session_config, &SessionConfiguration::get_layer_model), - mem_fun (*_session_config, &SessionConfiguration::set_layer_model) + _("Layering 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")); @@ -331,48 +260,59 @@ SessionOptionEditor::SessionOptionEditor (Session* s) add_option (_("Misc"), lm); + add_option (_("Misc"), new OptionEditorHeading (_("MIDI Note Overlaps"))); + + ComboOption* li = new ComboOption ( + "insert-merge-policy", + _("Policy for handling same note\nand channel overlaps"), + sigc::mem_fun (*_session_config, &SessionConfiguration::get_insert_merge_policy), + sigc::mem_fun (*_session_config, &SessionConfiguration::set_insert_merge_policy) + ); + + li->add (InsertMergeReject, _("never allow them")); + li->add (InsertMergeRelax, _("don't do anything in particular")); + li->add (InsertMergeReplace, _("replace any overlapped existing note")); + li->add (InsertMergeTruncateExisting, _("shorten the overlapped existing note")); + li->add (InsertMergeTruncateAddition, _("shorten the overlapping new note")); + li->add (InsertMergeExtend, _("replace both overlapping notes with a single note")); + + add_option (_("Misc"), li); + add_option (_("Misc"), new OptionEditorHeading (_("Broadcast WAVE metadata"))); 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) +SessionOptionEditor::populate_sync_options () { - ComboOption* sync_opt = dynamic_cast* > (opt); + vector sync_opts = _session->get_available_sync_options (); - vector sync_opts = s->get_available_sync_options (); - - sync_opt->clear (); + _sync_source->clear (); for (vector::iterator i = sync_opts.begin(); i != sync_opts.end(); ++i) { - sync_opt->add (*i, sync_source_to_string (*i)); + _sync_source->add (*i, sync_source_to_string (*i)); } } void -SessionOptionEditor::follow_sync_state (std::string p, Session* s, Option* opt) +SessionOptionEditor::parameter_changed (std::string const & p) { - ComboOption* sync_opt = dynamic_cast* > (opt); + OptionEditor::parameter_changed (p); + if (p == "external-sync") { - if (s->config.get_external_sync()) { - sync_opt->set_sensitive (false); - } else { - sync_opt->set_sensitive (true); - } + _sync_source->set_sensitive (!_session->config.get_external_sync ()); } }