X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fsession_option_editor.cc;h=bd5f359297ce26c416bad9579dd3de27699e1888;hb=315f41f82f1e5e5cf941e83895848a6372670935;hp=1afc079aaf353b4c3e683daf62ded9e8f5d75dfb;hpb=4f16de5cfe3fcd73711f3f0e78ef7cd5ea2bb63b;p=ardour.git diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc index 1afc079aaf..bd5f359297 100644 --- a/gtk2_ardour/session_option_editor.cc +++ b/gtk2_ardour/session_option_editor.cc @@ -1,3 +1,22 @@ +/* + 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" @@ -6,172 +25,36 @@ #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 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) - { - 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 Properties")) , _session_config (&(s->config)) { - set_name ("SessionProperties"); - - /* SYNC */ - - 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) - ); + set_session (s); - spf->add (80, _("80")); - spf->add (100, _("100")); + set_name ("SessionProperties"); - add_option (_("Sync"), spf); + /* TIMECODE*/ - ComboOption* ssrc = new ComboOption ( + _sync_source = new ComboOption ( "sync-source", - _("External 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 (_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); + populate_sync_options (); + parameter_changed (string ("external-sync")); + + add_option (_("Timecode"), _sync_source); + + add_option (_("Timecode"), new OptionEditorHeading (_("Timecode Settings"))); - add_option (_("Sync"), ssrc); ComboOption* smf = new ComboOption ( "timecode-format", @@ -191,9 +74,21 @@ SessionOptionEditor::SessionOptionEditor (Session* s) smf->add (timecode_5994, _("59.94")); smf->add (timecode_60, _("60")); - add_option (_("Sync"), smf); + add_option (_("Timecode"), smf); - add_option (_("Sync"), new BoolOption ( + 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 (_("Timecode"), new BoolOption ( "timecode-source-is-synced", _("Timecode source shares sample clock with audio interface"), sigc::mem_fun (*_session_config, &SessionConfiguration::get_timecode_source_is_synced), @@ -217,7 +112,25 @@ 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 */ @@ -286,9 +199,9 @@ SessionOptionEditor::SessionOptionEditor (Session* s) 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", @@ -301,7 +214,7 @@ SessionOptionEditor::SessionOptionEditor (Session* s) 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", @@ -315,13 +228,28 @@ 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 (_("Media"), spo); - add_option (_("Misc"), new OptionEditorHeading (_("Layering"))); + /* Misc */ + + add_option (_("Misc"), new OptionEditorHeading (_("Layering (in overlaid mode)"))); ComboOption* lm = new ComboOption ( "layer-model", - _("Layering model in overlaid mode"), + _("Layering model"), sigc::mem_fun (*_session_config, &SessionConfiguration::get_layer_model), sigc::mem_fun (*_session_config, &SessionConfiguration::set_layer_model) ); @@ -336,17 +264,17 @@ SessionOptionEditor::SessionOptionEditor (Session* s) ComboOption* li = new ComboOption ( "insert-merge-policy", - _("Handle same note+channel overlaps by"), + _("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 allowing 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")); + 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); @@ -366,32 +294,34 @@ SessionOptionEditor::SessionOptionEditor (Session* s) sigc::mem_fun (*_session_config, &SessionConfiguration::set_bwf_organization_code) )); - add_option (_("Connections"), new ConnectionOptions (this, s)); + add_option (_("Misc"), new OptionEditorHeading (_("Glue to bars and beats"))); + + add_option (_("Misc"), new BoolOption ( + "glue-new-markers-to-bars-and-beats", + _("Glue new markers to bars and beats"), + sigc::mem_fun (*_session_config, &SessionConfiguration::get_glue_new_markers_to_bars_and_beats), + sigc::mem_fun (*_session_config, &SessionConfiguration::set_glue_new_markers_to_bars_and_beats) + )); } 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 ()); } }