+ if (reset_tc) {
+ TimecodeFormat cur_timecode = session.config.get_timecode_format();
+ if (Config->get_timecode_sync_frame_rate()) {
+ /* enforce time-code */
+ if (!did_reset_tc_format) {
+ saved_tc_format = cur_timecode;
+ did_reset_tc_format = true;
+ }
+ if (cur_timecode != tc_format) {
+ if (ceil(Timecode::timecode_to_frames_per_second(cur_timecode)) != ceil(Timecode::timecode_to_frames_per_second(tc_format))) {
+ warning << string_compose(_("Session framerate adjusted from %1 TO: MTC's %2."),
+ Timecode::timecode_format_name(cur_timecode),
+ Timecode::timecode_format_name(tc_format))
+ << endmsg;
+ }
+ }
+ session.config.set_timecode_format (tc_format);
+ } else {
+ /* only warn about TC mismatch */
+ if (mtc_timecode != tc_format) printed_timecode_warning = false;
+ if (a3e_timecode != cur_timecode) printed_timecode_warning = false;
+
+ if (cur_timecode != tc_format && ! printed_timecode_warning) {
+ if (ceil(Timecode::timecode_to_frames_per_second(cur_timecode)) != ceil(Timecode::timecode_to_frames_per_second(tc_format))) {
+ warning << string_compose(_("Session and MTC framerate mismatch: MTC:%1 %2:%3."),
+ Timecode::timecode_format_name(tc_format),
+ PROGRAM_NAME,
+ Timecode::timecode_format_name(cur_timecode))
+ << endmsg;
+ }
+ printed_timecode_warning = true;
+ }
+ }
+ mtc_timecode = tc_format;
+ a3e_timecode = cur_timecode;
+
+ speedup_due_to_tc_mismatch = timecode.rate / Timecode::timecode_to_frames_per_second(a3e_timecode);
+ }
+
+ /* do a careful conversion of the timecode value to a position
+ so that we take drop/nondrop and all that nonsense into
+ consideration.
+ */
+
+ quarter_frame_duration = (double(session.frame_rate()) / (double) timecode.rate / 4.0);
+
+ Timecode::timecode_to_sample (timecode, mtc_frame, true, false,
+ double(session.frame_rate()),
+ session.config.get_subframes_per_frame(),
+ timecode_negative_offset, timecode_offset
+ );
+
+ DEBUG_TRACE (DEBUG::MTC, string_compose ("MTC at %1 TC %2 = mtc_frame %3 (from full message ? %4) tc-ratio %5\n",
+ now, timecode, mtc_frame, was_full, speedup_due_to_tc_mismatch));
+
+ if (was_full || outside_window (mtc_frame)) {
+ DEBUG_TRACE (DEBUG::MTC, string_compose ("update_mtc_time: full TC %1 or outside window %2\n", was_full, outside_window (mtc_frame)));
+ session.request_locate (mtc_frame, false);
+ session.request_transport_speed (0);
+ update_mtc_status (MIDI::MTC_Stopped);
+ reset (false);
+ reset_window (mtc_frame);