X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fmidi%2B%2B2%2Fmtc.cc;h=d1bb7c9bad673c814c3f5ea1098418b5e7e7b629;hb=31e203ac07cbda216fc842c68b9192d082ba8d65;hp=74b528e5e34f3ab40e5dcbe9e29376f52e450a3b;hpb=b825b86862223862f2cd23e08d204b2de657b4b7;p=ardour.git diff --git a/libs/midi++2/mtc.cc b/libs/midi++2/mtc.cc index 74b528e5e3..d1bb7c9bad 100644 --- a/libs/midi++2/mtc.cc +++ b/libs/midi++2/mtc.cc @@ -33,6 +33,8 @@ using namespace std; using namespace sigc; using namespace MIDI; +#undef DEBUG_MTC + bool Parser::possible_mtc (byte *sysex_buf, size_t msglen) { @@ -62,6 +64,9 @@ Parser::possible_mtc (byte *sysex_buf, size_t msglen) mtc (*this, &sysex_buf[1], msglen - 1); mtc_time (fake_mtc_time, true, _timestamp); +#ifdef DEBUG_MTC + cerr << "New full-MTC message marks state stopped" << endl; +#endif mtc_status (MTC_Stopped); return true; @@ -70,6 +75,11 @@ Parser::possible_mtc (byte *sysex_buf, size_t msglen) void Parser::reset_mtc_state () { +#ifdef DEBUG_MTC + cerr << "MTC state reset" << endl; +#endif + /* MUST REMAIN RT-SAFE */ + _mtc_forward = false; _mtc_running = MTC_Stopped; _mtc_locked = false; @@ -119,14 +129,17 @@ Parser::process_mtc_quarter_frame (byte *msg) /* third quarter frame */ - // cerr << "second seen qframe = " << (int) which_quarter_frame << endl; - +#ifdef DEBUG_MTC + cerr << "second seen qframe = " << (int) which_quarter_frame << endl; +#endif if (last_qtr_frame < which_quarter_frame) { _mtc_running = MTC_Forward; } else if (last_qtr_frame > which_quarter_frame) { _mtc_running = MTC_Backward; } - +#ifdef DEBUG_MTC + cerr << "Send MTC status as " << _mtc_running << endl; +#endif mtc_status (_mtc_running); } @@ -172,7 +185,9 @@ Parser::process_mtc_quarter_frame (byte *msg) true, just ignore this in terms of it being an error. */ - if (1) { /* mtc_skipped () */ + boost::optional res = mtc_skipped (); + + if (res.get_value_or (false)) { /* no error, reset next expected frame */ @@ -204,13 +219,12 @@ Parser::process_mtc_quarter_frame (byte *msg) return; } - /* go back to waiting for the first frame */ - - expected_mtc_quarter_frame_code = 0; - memset (_qtr_mtc_time, 0, sizeof (_qtr_mtc_time)); + /* skip counts as an error ... go back to waiting for the first frame */ - _mtc_running = MTC_Stopped; - _mtc_locked = false; +#ifdef DEBUG_MTC + cerr << "Skipped MTC qtr frame, return to stopped state" << endl; +#endif + reset_mtc_state (); mtc_status (MTC_Stopped); return; @@ -226,7 +240,7 @@ Parser::process_mtc_quarter_frame (byte *msg) /* time code is looking good */ #ifdef DEBUG_MTC - cerr << "for quarter frame " << which_quarter_frame << " byte = " << hex << (int) msg[1] << dec << endl; + // cerr << "for quarter frame " << which_quarter_frame << " byte = " << hex << (int) msg[1] << dec << endl; #endif switch (which_quarter_frame) { @@ -276,6 +290,10 @@ Parser::process_mtc_quarter_frame (byte *msg) } +#ifdef DEBUG_MTC + cerr << "Emit MTC Qtr\n"; +#endif + mtc_qtr (*this, which_quarter_frame, _timestamp); /* EMIT_SIGNAL */ // mtc (*this, &msg[1], msglen - 1);