X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fsession_option_editor.cc;h=dbc8bbf2337cecc30e9c04ec2bf60c4f98380990;hb=718b2eab6706f304e398f036e3d817567cd746e8;hp=2cc6e253ba69b639f64cd4139379ee7424825e39;hpb=aae367b63c9b619db1e40f27dc334c6987219481;p=ardour.git diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc index 2cc6e253ba..dbc8bbf233 100644 --- a/gtk2_ardour/session_option_editor.cc +++ b/gtk2_ardour/session_option_editor.cc @@ -1,173 +1,60 @@ +/* + 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 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 Preferences")) + : OptionEditor (&(s->config), _("Session Properties")) , _session_config (&(s->config)) { - /* 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) - ); - - 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"), + _("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, boost::bind (&SessionOptionEditor::populate_sync_options, this, s, ssrc)); - s->MIDIClock_PortChanged.connect (_session_connections, boost::bind (&SessionOptionEditor::populate_sync_options, this, s, ssrc)); - s->config.ParameterChanged.connect (_session_connections, boost::bind (&SessionOptionEditor::follow_sync_state, this, _1, 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", @@ -187,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); + + 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 shares sample clock with audio interface"), sigc::mem_fun (*_session_config, &SessionConfiguration::get_timecode_source_is_synced), @@ -213,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 */ @@ -282,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", @@ -297,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", @@ -311,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); - add_option (_("Misc"), new OptionEditorHeading (_("Layering"))); + 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); + + /* 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) ); @@ -328,6 +260,24 @@ 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 ( @@ -343,33 +293,26 @@ SessionOptionEditor::SessionOptionEditor (Session* s) 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 ()); } }