X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_export.cc;h=efb731463f7151e2adcc50688e08f5669416655c;hb=27d06075a7cdbfbedae95035977fc2622aeadbe6;hp=0db4fc33bb61d19e5abc6fb96223783e448ad6fb;hpb=682ebad62bdc85df151ad0b81dc27cc9f3e71cec;p=ardour.git diff --git a/libs/ardour/session_export.cc b/libs/ardour/session_export.cc index 0db4fc33bb..efb731463f 100644 --- a/libs/ardour/session_export.cc +++ b/libs/ardour/session_export.cc @@ -21,7 +21,6 @@ #include "pbd/error.h" #include -#include #include #include "ardour/audioengine.h" @@ -74,12 +73,16 @@ Session::pre_export () } } - /* make sure we are actually rolling */ + /* prepare transport */ + + realtime_stop (true, true); if (get_record_enabled()) { disable_record (false); } + unset_play_loop (); + /* no slaving */ post_export_sync = config.get_external_sync (); @@ -88,13 +91,13 @@ Session::pre_export () config.set_external_sync (false); _exporting = true; - export_status->running = true; + export_status->set_running (true); export_status->Finished.connect_same_thread (*this, boost::bind (&Session::finalize_audio_export, this)); - + /* disable MMC output early */ - _pre_export_mmc_enabled = MIDI::Manager::instance()->mmc()->send_enabled (); - MIDI::Manager::instance()->mmc()->enable_send (false); + _pre_export_mmc_enabled = _mmc->send_enabled (); + _mmc->enable_send (false); return 0; } @@ -106,13 +109,14 @@ Session::start_audio_export (framepos_t position) if (!_exporting) { pre_export (); } - _export_started = false; + + _export_preroll = Config->get_export_preroll() * nominal_frame_rate (); /* We're about to call Track::seek, so the butler must have finished everything up otherwise it could be doing do_refill in its thread while we are doing it here. */ - + _butler->wait_until_finished (); /* get everyone to the right position */ @@ -191,18 +195,29 @@ Session::process_export (pframes_t nframes) int Session::process_export_fw (pframes_t nframes) { - if (!_export_started) { - _export_started = true; - set_transport_speed (1.0, false); + if (_export_preroll > 0) { + + _engine.main_thread()->get_buffers (); + fail_roll (nframes); + _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 0; + } + + set_transport_speed (1.0, 0, false); butler_transport_work (); g_atomic_int_set (&_butler->should_do_transport_work, 0); post_transport (); return 0; } - - _engine.main_thread()->get_buffers (); + + _engine.main_thread()->get_buffers (); process_export (nframes); - _engine.main_thread()->drop_buffers (); + _engine.main_thread()->drop_buffers (); return 0; } @@ -236,8 +251,8 @@ Session::finalize_audio_export () _engine.freewheel (false); export_freewheel_connection.disconnect(); - - MIDI::Manager::instance()->mmc()->enable_send (_pre_export_mmc_enabled); + + _mmc->enable_send (_pre_export_mmc_enabled); /* maybe write CUE/TOC */