diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-02-23 13:40:09 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-02-23 13:40:09 +0000 |
commit | 3ecf8cd00838293b79832b6124312c0b294fdc0f (patch) | |
tree | 140c25457bfb2ccfeaec4c313a8796e99f606f91 /libs | |
parent | dfa996f8be7ca8dfbcabed81379390a3825e48f0 (diff) |
possible fix for MTC slaving
git-svn-id: svn://localhost/ardour2/trunk@1498 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/slave.h | 1 | ||||
-rw-r--r-- | libs/ardour/mtc_slave.cc | 37 | ||||
-rw-r--r-- | libs/midi++2/mtc.cc | 6 |
3 files changed, 40 insertions, 4 deletions
diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h index d4a7e2f22a..0c05fe58dd 100644 --- a/libs/ardour/ardour/slave.h +++ b/libs/ardour/ardour/slave.h @@ -70,6 +70,7 @@ class MTC_Slave : public Slave, public sigc::trackable { Session& session; MIDI::Port* port; std::vector<sigc::connection> connections; + bool can_notify_on_unknown_rate; struct SafeTime { diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc index d241636785..a86a3e9014 100644 --- a/libs/ardour/mtc_slave.cc +++ b/libs/ardour/mtc_slave.cc @@ -41,6 +41,8 @@ using namespace PBD; MTC_Slave::MTC_Slave (Session& s, MIDI::Port& p) : session (s) { + can_notify_on_unknown_rate = true; + rebind (p); reset (); } @@ -93,8 +95,39 @@ MTC_Slave::update_mtc_time (const byte *msg, bool was_full) smpte.minutes = msg[2]; smpte.seconds = msg[1]; smpte.frames = msg[0]; - - session.smpte_to_sample( smpte, mtc_frame, true, false ); + + switch (msg[4]) { + case MTC_24_FPS: + smpte.rate = 24; + smpte.drop = false; + can_notify_on_unknown_rate = true; + break; + case MTC_25_FPS: + smpte.rate = 25; + smpte.drop = false; + can_notify_on_unknown_rate = true; + break; + case MTC_30_FPS_DROP: + smpte.rate = 30; + smpte.drop = true; + can_notify_on_unknown_rate = true; + break; + case MTC_30_FPS: + smpte.rate = 30; + smpte.drop = false; + can_notify_on_unknown_rate = true; + break; + default: + /* throttle error messages about unknown MTC rates */ + if (can_notify_on_unknown_rate) { + error << _("Unknown rate/drop value in incoming MTC stream, session values used instead") << endmsg; + can_notify_on_unknown_rate = false; + } + smpte.rate = session.smpte_frames_per_second(); + smpte.drop = session.smpte_drop_frames(); + } + + session.smpte_to_sample (smpte, mtc_frame, true, false); if (was_full) { diff --git a/libs/midi++2/mtc.cc b/libs/midi++2/mtc.cc index 19fdb1fabd..1da9ae6e36 100644 --- a/libs/midi++2/mtc.cc +++ b/libs/midi++2/mtc.cc @@ -36,7 +36,7 @@ using namespace MIDI; bool Parser::possible_mtc (byte *sysex_buf, size_t msglen) { - byte fake_mtc_time[4]; + byte fake_mtc_time[5]; if (msglen != 10 || sysex_buf[0] != 0xf0 || sysex_buf[1] != 0x7f || sysex_buf[3] != 0x01 || sysex_buf[4] != 0x01) { return false; @@ -50,7 +50,9 @@ Parser::possible_mtc (byte *sysex_buf, size_t msglen) fake_mtc_time[3] = (sysex_buf[5] & 0x1f); // hours _mtc_fps = MTC_FPS ((sysex_buf[5] & 0x60) >> 5); // fps - + + fake_mtc_time[4] = (byte) _mtc_fps; + /* wait for first quarter frame, which could indicate forwards or backwards ... */ |