+ const bool need_buffers = _engine.freewheeling ();
+ if (_export_preroll > 0) {
+
+ if (need_buffers) {
+ _engine.main_thread()->get_buffers ();
+ }
+ fail_roll (nframes);
+ if (need_buffers) {
+ _engine.main_thread()->drop_buffers ();
+ }
+
+ _export_preroll -= std::min ((framepos_t)nframes, _export_preroll);
+
+ if (_export_preroll > 0) {
+ // clear out buffers (reverb tails etc).
+ return;
+ }
+
+ set_transport_speed (1.0, 0, false);
+ butler_transport_work ();
+ g_atomic_int_set (&_butler->should_do_transport_work, 0);
+ post_transport ();
+
+ return;
+ }
+
+ if (_export_latency > 0) {
+ framepos_t remain = std::min ((framepos_t)nframes, _export_latency);
+
+ if (need_buffers) {
+ _engine.main_thread()->get_buffers ();
+ }
+ process_without_events (remain);
+ if (need_buffers) {
+ _engine.main_thread()->drop_buffers ();
+ }
+
+ _export_latency -= remain;
+ nframes -= remain;
+
+ if (nframes == 0) {
+ return;
+ }
+ }
+
+ if (need_buffers) {
+ _engine.main_thread()->get_buffers ();
+ }