change the logic for a capture buffer flush to disk when a locate is occuring

We can't check for Session::actively_recording() because punch out may have disabled that. Rather
than add logic to check if a flush is needed (which is not much different than the code that runs
as part of the flush to disk), just do a flush anyway.
This commit is contained in:
Paul Davis 2015-09-30 13:02:50 -04:00
parent 7ff47ab80e
commit 71343e835a

View file

@ -314,6 +314,8 @@ Session::realtime_locate ()
void void
Session::butler_transport_work () Session::butler_transport_work ()
{ {
/* Note: this function executes in the butler thread context */
restart: restart:
bool finished; bool finished;
PostTransportWork ptw; PostTransportWork ptw;
@ -329,20 +331,27 @@ Session::butler_transport_work ()
if (ptw & PostTransportLocate) { if (ptw & PostTransportLocate) {
if (get_play_loop() && !Config->get_seamless_loop() && actively_recording()) { if (get_play_loop() && !Config->get_seamless_loop()) {
/* this locate is happening while we are doing loop DEBUG_TRACE (DEBUG::Butler, "flush loop recording fragment to disk\n");
* recording but with seam-ed (non-seamless) looping.
* We must flush any data to disk before resetting /* this locate might be happening while we are
* buffers as part of the pending locate (which happens * loop recording.
* a little later in this method). *
* Non-seamless looping will require a locate (below) that
* will reset capture buffers and throw away data.
*
* Rather than first find all tracks and see if they
* have outstanding data, just do a flush anyway. It
* may be cheaper this way anyway, and is certainly
* more accurate.
*/ */
bool more_disk_io_to_do = false; bool more_disk_io_to_do = false;
uint32_t errors = 0; uint32_t errors = 0;
do { do {
more_disk_io_to_do = _butler->flush_tracks_to_disk (r, errors, true); more_disk_io_to_do = _butler->flush_tracks_to_disk_after_locate (r, errors);
if (errors) { if (errors) {
break; break;