}
/* full MTC */
-
+
fake_mtc_time[0] = sysex_buf[8]; // frames
fake_mtc_time[1] = sysex_buf[7]; // minutes
fake_mtc_time[2] = sysex_buf[6]; // seconds
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;
{
int which_quarter_frame = (msg[1] & 0xf0) >> 4;
- /* Is it an expected frame?
- Remember, the first can be frame 7 or frame 0,
+ /* Is it an expected frame?
+ Remember, the first can be frame 7 or frame 0,
depending on the direction of the MTC generator ...
*/
#ifdef DEBUG_MTC
- cerr << "MTC: (state = " << _mtc_running << ") "
+ cerr << "MTC: (state = " << _mtc_running << ") "
<< which_quarter_frame << " vs. " << expected_mtc_quarter_frame_code
<< " consecutive ? " << consecutive_qtr_frame_cnt
<< endl;
#endif
if (_mtc_running == MTC_Stopped) {
-
+
/* we are stopped but are seeing qtr frame messages */
if (consecutive_qtr_frame_cnt == 0) {
/* first quarter frame */
if (which_quarter_frame != 0 && which_quarter_frame != 7) {
-
+
last_qtr_frame = which_quarter_frame;
consecutive_qtr_frame_cnt++;
}
-
+
// cerr << "first seen qframe = " << (int) last_qtr_frame << endl;
return;
} else if (consecutive_qtr_frame_cnt == 1) {
/* third quarter frame */
-
+
#ifdef DEBUG_MTC
cerr << "second seen qframe = " << (int) which_quarter_frame << endl;
#endif
cerr << "Send MTC status as " << _mtc_running << endl;
#endif
mtc_status (_mtc_running);
- }
+ }
switch (_mtc_running) {
case MTC_Forward:
case MTC_Backward:
if (which_quarter_frame == 0) {
expected_mtc_quarter_frame_code = 7;
-
+
} else {
expected_mtc_quarter_frame_code = which_quarter_frame - 1;
}
case MTC_Stopped:
break;
}
-
+
} else {
-
+
/* already running */
// for testing bad MIDI connections etc.
consecutive_qtr_frame_cnt = 0;
#ifdef DEBUG_MTC
- cerr << "MTC: (state = " << _mtc_running << ") "
+ cerr << "MTC: (state = " << _mtc_running << ") "
<< which_quarter_frame << " vs. " << expected_mtc_quarter_frame_code << endl;
#endif
*/
boost::optional<bool> res = mtc_skipped ();
-
+
if (res.get_value_or (false)) {
/* no error, reset next expected frame */
case MTC_Backward:
if (which_quarter_frame == 0) {
expected_mtc_quarter_frame_code = 7;
-
+
} else {
expected_mtc_quarter_frame_code = which_quarter_frame - 1;
}
#ifdef DEBUG_MTC
cerr << "SKIPPED, next expected = " << expected_mtc_quarter_frame_code << endl;
-#endif
+#endif
return;
}
#endif
reset_mtc_state ();
mtc_status (MTC_Stopped);
-
+
return;
} else {
case 5: // minutes MS nibble
_qtr_mtc_time[2] |= (msg[1] & 0xf)<<4;
break;
-
+
case 6: // hours LS nibble
_qtr_mtc_time[3] |= msg[1] & 0xf;
break;
- case 7:
-
+ case 7:
+
/* last quarter frame msg has the MS bit of
the hour in bit 0, and the SMPTE FPS type
- in bits 5 and 6
+ in bits 5 and 6
*/
-
+
_qtr_mtc_time[3] |= ((msg[1] & 0x1) << 4);
_mtc_fps = MTC_FPS ((msg[1] & 0x6) >> 1);
_qtr_mtc_time[4] = _mtc_fps;
break;
default:
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
break;
- }
-
+ }
+
#ifdef DEBUG_MTC
cerr << "Emit MTC Qtr\n";
#endif
switch (_mtc_running) {
case MTC_Forward:
if (which_quarter_frame == 7) {
-
+
/* we've reached the final of 8 quarter frame messages.
store the time, reset the pending time holder,
and signal anyone who wants to know the time.
*/
-
+
if (consecutive_qtr_frame_cnt >= 8) {
memcpy (_mtc_time, _qtr_mtc_time, sizeof (_mtc_time));
memset (_qtr_mtc_time, 0, sizeof (_qtr_mtc_time));
mtc_time (_mtc_time, false, _timestamp);
}
expected_mtc_quarter_frame_code = 0;
-
+
} else {
expected_mtc_quarter_frame_code = which_quarter_frame + 1;
}
break;
-
+
case MTC_Backward:
if (which_quarter_frame == 0) {
-
+
/* we've reached the final of 8 quarter frame messages.
store the time, reset the pending time holder,
and signal anyone who wants to know the time.