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 /libs/ardour/ltc_slave.cc | |
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 'libs/ardour/ltc_slave.cc')
-rw-r--r-- | libs/ardour/ltc_slave.cc | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/libs/ardour/ltc_slave.cc b/libs/ardour/ltc_slave.cc index 166c78ce24..7b182cfa64 100644 --- a/libs/ardour/ltc_slave.cc +++ b/libs/ardour/ltc_slave.cc @@ -60,6 +60,9 @@ LTC_Slave::LTC_Slave (Session& s) memset(&prev_frame, 0, sizeof(LTCFrameExt)); decoder = ltc_decoder_create((int) frames_per_ltc_frame, 128 /*queue size*/); + + session.config.ParameterChanged.connect_same_thread (config_connection, boost::bind (<C_Slave::parameter_changed, this, _1)); + parse_timecode_offset(); reset(); resync_latency(); session.Xrun.connect_same_thread (port_connections, boost::bind (<C_Slave::resync_xrun, this)); @@ -69,6 +72,7 @@ LTC_Slave::LTC_Slave (Session& s) LTC_Slave::~LTC_Slave() { port_connections.drop_connections(); + config_connection.disconnect(); if (did_reset_tc_format) { session.config.set_timecode_format (saved_tc_format); @@ -77,6 +81,27 @@ LTC_Slave::~LTC_Slave() ltc_decoder_free(decoder); } +void +LTC_Slave::parse_timecode_offset() { + Timecode::Time offset_tc; + Timecode::parse_timecode_format(session.config.get_slave_timecode_offset(), offset_tc); + offset_tc.rate = session.timecode_frames_per_second(); + offset_tc.drop = session.timecode_drop_frames(); + session.timecode_to_sample(offset_tc, timecode_offset, false, false); + timecode_negative_offset = offset_tc.negative; +} + +void +LTC_Slave::parameter_changed (std::string const & p) +{ + if (p == "slave-timecode-offset" + || p == "subframes-per-frame" + || p == "timecode-format" + ) { + parse_timecode_offset(); + } +} + ARDOUR::framecnt_t LTC_Slave::resolution () const { @@ -334,7 +359,7 @@ LTC_Slave::process_ltc(framepos_t const now) Timecode::timecode_to_sample (timecode, ltc_frame, true, false, double(session.frame_rate()), session.config.get_subframes_per_frame(), - session.config.get_slave_timecode_offset_negative(), session.config.get_slave_timecode_offset() + timecode_negative_offset, timecode_offset ); framepos_t cur_timestamp = frame.off_end + 1; |