diff options
author | Robin Gareus <robin@gareus.org> | 2012-11-13 20:29:28 +0000 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2012-11-13 20:29:28 +0000 |
commit | e1581242ca8554660ea68290688e573a9acfca06 (patch) | |
tree | 49099b7fa12f4c0732dcc635fda59e448c1e5ea3 /gtk2_ardour | |
parent | f761de0d70b896c4a3437f99b238effac520519d (diff) |
implement TC offset for slave&generator.
Many related changes that require atomic update, mostly
because ClockOption slots changed:
* change offset config format to std:string (backwards compat - reads 0)
* make Timecode offset independent from fps
* sample_to_timecode() handle negative sample-num
* audio-clock fix entry and edit of negative numbers
* option editor:
- remove old global internal offset
- add slave & generator TC entry
- still needs UI cleanup, tooltops, maybe sep. tab..
* LTC & MTC slave& generator:
- cache offset
- subscribe to parameter changes
git-svn-id: svn://localhost/ardour2/branches/3.0@13485 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/audio_clock.cc | 31 | ||||
-rw-r--r-- | gtk2_ardour/option_editor.cc | 19 | ||||
-rw-r--r-- | gtk2_ardour/option_editor.h | 7 | ||||
-rw-r--r-- | gtk2_ardour/session_option_editor.cc | 42 |
4 files changed, 73 insertions, 26 deletions
diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 4fa30186a7..9a9fc6d56e 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -915,7 +915,7 @@ AudioClock::end_edit_relative (bool add) } else { framepos_t c = current_time(); - if (c > frames) { + if (c > frames || _negative_allowed) { set (c - frames, true); } else { set (0, true); @@ -932,6 +932,11 @@ AudioClock::end_edit_relative (bool add) void AudioClock::session_configuration_changed (std::string p) { + if (_negative_allowed) { + /* session option editor clock */ + return; + } + if (p == "sync-source" || p == "external-sync") { set (current_time(), true); return; @@ -1897,10 +1902,23 @@ bool AudioClock::timecode_validate_edit (const string&) { Timecode::Time TC; + int hours; char ignored[2]; if (sscanf (_layout->get_text().c_str(), "%" PRId32 ":%" PRId32 ":%" PRId32 "%[:;]%" PRId32, - &TC.hours, &TC.minutes, &TC.seconds, ignored, &TC.frames) != 5) { + &hours, &TC.minutes, &TC.seconds, ignored, &TC.frames) != 5) { + return false; + } + + if (hours < 0) { + TC.hours = hours * -1; + TC.negative = true; + } else { + TC.hours = hours; + TC.negative = false; + } + + if (TC.negative && !_negative_allowed) { return false; } @@ -1947,19 +1965,22 @@ AudioClock::frames_from_timecode_string (const string& str) const Timecode::Time TC; framepos_t sample; char ignored[2]; + int hours; - if (sscanf (str.c_str(), "%d:%d:%d%[:;]%d", &TC.hours, &TC.minutes, &TC.seconds, ignored, &TC.frames) != 5) { + if (sscanf (str.c_str(), "%d:%d:%d%[:;]%d", &hours, &TC.minutes, &TC.seconds, ignored, &TC.frames) != 5) { error << string_compose (_("programming error: %1 %2"), "badly formatted timecode clock string", str) << endmsg; return 0; } - - TC.negative = edit_is_negative; + TC.hours = abs(hours); TC.rate = _session->timecode_frames_per_second(); TC.drop= _session->timecode_drop_frames(); _session->timecode_to_sample (TC, sample, false /* use_offset */, false /* use_subframes */ ); // timecode_tester (); + if (edit_is_negative) { + sample = - sample; + } return sample; } diff --git a/gtk2_ardour/option_editor.cc b/gtk2_ardour/option_editor.cc index 3c3f5baab6..da4594e6da 100644 --- a/gtk2_ardour/option_editor.cc +++ b/gtk2_ardour/option_editor.cc @@ -25,6 +25,7 @@ #include "ardour/rc_configuration.h" #include "ardour/utils.h" #include "ardour/dB.h" +#include "ardour/session.h" #include "option_editor.h" #include "gui_thread.h" @@ -284,7 +285,7 @@ FaderOption::add_to_page (OptionEditorPage* p) add_widgets_to_page (p, &_label, &_box); } -ClockOption::ClockOption (string const & i, string const & n, sigc::slot<framecnt_t> g, sigc::slot<bool, framecnt_t> s) +ClockOption::ClockOption (string const & i, string const & n, sigc::slot<std::string> g, sigc::slot<bool, std::string> s) : Option (i, n) , _clock (X_("timecode-offset"), false, X_(""), true, false, true, false) , _get (g) @@ -299,13 +300,24 @@ ClockOption::ClockOption (string const & i, string const & n, sigc::slot<framecn void ClockOption::set_state_from_config () { - _clock.set (_get (), true); + Timecode::Time TC; + framepos_t when; + if (!Timecode::parse_timecode_format(_get(), TC)) { + _clock.set (0, true); + } + TC.rate = _session->frames_per_timecode_frame(); + TC.drop = _session->timecode_drop_frames(); + _session->timecode_to_sample(TC, when, false, false); + if (TC.negative) { when=-when; } + _clock.set (when, true); } void ClockOption::save_clock_time () { - _set (_clock.current_time()); + Timecode::Time TC; + _session->sample_to_timecode(_clock.current_time(), TC, false, false); + _set (Timecode::timecode_format_time(TC)); } void @@ -317,6 +329,7 @@ ClockOption::add_to_page (OptionEditorPage* p) void ClockOption::set_session (Session* s) { + _session = s; _clock.set_session (s); } diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h index 454b0f2245..5fbed4ea32 100644 --- a/gtk2_ardour/option_editor.h +++ b/gtk2_ardour/option_editor.h @@ -535,7 +535,7 @@ private: class ClockOption : public Option { public: - ClockOption (std::string const &, std::string const &, sigc::slot<ARDOUR::framecnt_t>, sigc::slot<bool, ARDOUR::framecnt_t>); + ClockOption (std::string const &, std::string const &, sigc::slot<std::string>, sigc::slot<bool, std::string>); void set_state_from_config (); void add_to_page (OptionEditorPage *); void set_session (ARDOUR::Session *); @@ -547,8 +547,9 @@ private: void save_clock_time (); Gtk::Label _label; AudioClock _clock; - sigc::slot<ARDOUR::framecnt_t> _get; - sigc::slot<bool, ARDOUR::framecnt_t> _set; + sigc::slot<std::string> _get; + sigc::slot<bool, std::string> _set; + ARDOUR::Session *_session; }; class DirectoryOption : public Option diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc index dd95b7f057..64ccc93de6 100644 --- a/gtk2_ardour/session_option_editor.cc +++ b/gtk2_ardour/session_option_editor.cc @@ -91,24 +91,32 @@ SessionOptionEditor::SessionOptionEditor (Session* s) 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) + + add_option (_("Timecode"), new OptionEditorHeading (_("Ext Timecode Offsets"))); + + ClockOption* sco = new ClockOption ( + "slave-timecode-offset", + _("Slave Timecode offset"), + sigc::mem_fun (*_session_config, &SessionConfiguration::get_slave_timecode_offset), + sigc::mem_fun (*_session_config, &SessionConfiguration::set_slave_timecode_offset) ); - co->set_session (_session); - co->clock().set_negative_allowed (true); + sco->set_session (_session); + sco->clock().set_negative_allowed (true); - add_option (_("Timecode"), co); + add_option (_("Timecode"), sco); - 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) - )); + ClockOption* gco = new ClockOption ( + "timecode-generator-offset", + _("Timecode Generator offset"), + sigc::mem_fun (*_session_config, &SessionConfiguration::get_timecode_generator_offset), + sigc::mem_fun (*_session_config, &SessionConfiguration::set_timecode_generator_offset) + ); + + gco->set_session (_session); + gco->clock().set_negative_allowed (true); + + add_option (_("Timecode"), gco); add_option (_("Timecode"), new OptionEditorHeading (_("JACK Transport/Time Settings"))); @@ -300,7 +308,11 @@ SessionOptionEditor::parameter_changed (std::string const & p) _vpu->set_sensitive(true); } } - + if (p == "timecode-format") { + /* update offset clocks */ + parameter_changed("timecode-generator-offset"); + parameter_changed("slave-timecode-offset"); + } } /* the presence of absence of a monitor section is not really a regular session |