X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Fsession_export.cc;h=7276d631ddd4d53f4cccf59b0ed1d6b4f23dbb61;hb=1399ef391de5b05888ea2e13e6ff80f14b6e84d9;hp=463f50441121fc1e5d090c9b6ac6092f69341cde;hpb=77687519b69f39aaa2354f4c9945958fc1c630fe;p=ardour.git diff --git a/libs/ardour/session_export.cc b/libs/ardour/session_export.cc index 463f504411..7276d631dd 100644 --- a/libs/ardour/session_export.cc +++ b/libs/ardour/session_export.cc @@ -104,15 +104,19 @@ Session::pre_export () /** Called for each range that is being exported */ int -Session::start_audio_export (framepos_t position, bool realtime) +Session::start_audio_export (framepos_t position, bool realtime, bool region_export, bool comensate_master_latency) { if (!_exporting) { pre_export (); } _realtime_export = realtime; + _region_export = region_export; - if (realtime) { + if (region_export) { + _export_preroll = 0; + } + else if (realtime) { _export_preroll = nominal_frame_rate (); } else { _export_preroll = Config->get_export_preroll() * nominal_frame_rate (); @@ -126,14 +130,28 @@ Session::start_audio_export (framepos_t position, bool realtime) /* "worst_track_latency" is the correct value for stem-exports * see to Route::add_export_point(), * - * for master-bus export, we'd need to add the master's latency. - * or actually longest-total-session-latency. + * For master-bus export, we also need to add the master's latency. + * (or actually longest-total-session-latency - worst-track-latency) + * to align the export to 00:00:00:00. + * + * We must not use worst_playback_latency because that + * includes external (hardware) latencies and would overcompensate + * during file-export. * - * We can't use worst_playback_latency because that includes - * includes external latencies and would overcompensate. + * (this is all still very [w]hacky. Individual Bus and Track outputs + * are not aligned but one can select them in the PortExportChannelSelector) */ _export_latency = worst_track_latency (); + boost::shared_ptr master = master_out (); + if (master && comensate_master_latency) { + _export_latency += master->signal_latency (); + } + + if (region_export) { + _export_latency = 0; + } + /* 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. @@ -197,19 +215,26 @@ Session::process_export (pframes_t nframes) stop_audio_export (); } - if (_export_rolling) { - if (!_realtime_export) { - /* make sure we've caught up with disk i/o, since - * we're running faster than realtime c/o JACK. - */ - _butler->wait_until_finished (); - } + /* for Region Raw or Fades, we can skip this + * RegionExportChannelFactory::update_buffers() does not care + * about anything done here + */ + if (!_region_export) { + if (_export_rolling) { + if (!_realtime_export) { + /* make sure we've caught up with disk i/o, since + * we're running faster than realtime c/o JACK. + */ + _butler->wait_until_finished (); + } + + /* do the usual stuff */ - /* do the usual stuff */ + process_without_events (nframes); - process_without_events (nframes); - } else if (_realtime_export) { - fail_roll (nframes); // somehow we need to silence _ALL_ output buffers + } else if (_realtime_export) { + fail_roll (nframes); // somehow we need to silence _ALL_ output buffers + } } try {