diff options
-rw-r--r-- | gtk2_ardour/audio_clock.cc | 6 | ||||
-rw-r--r-- | libs/ardour/ardour/slave.h | 8 | ||||
-rw-r--r-- | libs/ardour/mtc_slave.cc | 11 |
3 files changed, 22 insertions, 3 deletions
diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index b19942c664..2e5628214d 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -1121,7 +1121,7 @@ AudioClock::set_timecode (framepos_t when, bool /*force*/) _left_layout->set_text (string_compose ("%1 %2", sync_source_to_string(sync_src, true), dynamic_cast<TimecodeSlave*>(slave)->approximate_current_position())); - _right_layout->set_text ("+- 0"); // XXX + _right_layout->set_text (slave->approximate_current_delta()); } else { _left_layout->set_text (string_compose ("%1 --pending--", sync_source_to_string(sync_src, true))); @@ -1131,14 +1131,14 @@ AudioClock::set_timecode (framepos_t when, bool /*force*/) case MIDIClock: _left_layout->set_text (string_compose ("%1", sync_source_to_string(sync_src, true))); - _right_layout->set_text (""); + _right_layout->set_text (slave->approximate_current_delta()); break; case LTC: if (slave) { _left_layout->set_text (string_compose ("%1 %2", sync_source_to_string(sync_src, true), dynamic_cast<TimecodeSlave*>(slave)->approximate_current_position())); - _right_layout->set_text ("+- 0"); // XXX + _right_layout->set_text (slave->approximate_current_delta()); } else { _left_layout->set_text (string_compose ("%1 --pending--", sync_source_to_string(sync_src, true))); diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h index 8f4ac1384b..85730e78b6 100644 --- a/libs/ardour/ardour/slave.h +++ b/libs/ardour/ardour/slave.h @@ -171,6 +171,12 @@ class Slave { * @return - whether ARDOUR should use the slave speed without any adjustments */ virtual bool give_slave_full_control_over_transport_speed() const { return false; } + + /** + * @return - current time-delta between engine and sync-source + */ + virtual std::string approximate_current_delta() const { return ""; } + }; /// We need this wrapper for testability, it's just too hard to mock up a session class @@ -255,6 +261,7 @@ class MTC_Slave : public TimecodeSlave { bool requires_seekahead () const { return true; } framecnt_t seekahead_distance() const; bool give_slave_full_control_over_transport_speed() const; + std::string approximate_current_delta() const; Timecode::TimecodeFormat apparent_timecode_format() const; std::string approximate_current_position() const; @@ -289,6 +296,7 @@ class MTC_Slave : public TimecodeSlave { Timecode::TimecodeFormat a3e_timecode; Timecode::Time timecode; bool printed_timecode_warning; + frameoffset_t current_delta; /* DLL - chase MTC */ double t0; ///< time at the beginning of the MTC quater frame diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc index 4696f1e936..5eee8381bb 100644 --- a/libs/ardour/mtc_slave.cc +++ b/libs/ardour/mtc_slave.cc @@ -183,6 +183,7 @@ MTC_Slave::reset (bool with_position) window_begin = 0; window_end = 0; transport_direction = 1; + current_delta = 0; } void @@ -629,6 +630,8 @@ MTC_Slave::speed_and_position (double& speed, framepos_t& pos) DEBUG_TRACE (DEBUG::MTC, string_compose ("MTCsync spd: %1 pos: %2 | last-pos: %3 elapsed: %4 delta: %5\n", speed, pos, last.position, elapsed, pos - sess_pos)); + current_delta = (pos - sess_pos); + return true; } @@ -652,3 +655,11 @@ MTC_Slave::approximate_current_position() const Timecode::timecode_to_frames_per_second(mtc_timecode), Timecode::timecode_has_drop_frames(mtc_timecode)); } + +std::string +MTC_Slave::approximate_current_delta() const +{ + char delta[24]; + snprintf(delta, sizeof(delta), "%+" PRIi64, current_delta); // XXX TODO unit, refine + return std::string(delta); +} |