mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-18 20:56:28 +01:00
split Butler::flush_tracks_to_disk() into two distinct versions with clear names and make one of them private
This commit is contained in:
parent
48b904fcee
commit
2cf779fd0c
2 changed files with 58 additions and 10 deletions
|
|
@ -67,7 +67,7 @@ class LIBARDOUR_API Butler : public SessionHandleRef
|
||||||
framecnt_t audio_diskstream_playback_buffer_size() const { return audio_dstream_playback_buffer_size; }
|
framecnt_t audio_diskstream_playback_buffer_size() const { return audio_dstream_playback_buffer_size; }
|
||||||
uint32_t midi_diskstream_buffer_size() const { return midi_dstream_buffer_size; }
|
uint32_t midi_diskstream_buffer_size() const { return midi_dstream_buffer_size; }
|
||||||
|
|
||||||
bool flush_tracks_to_disk (boost::shared_ptr<RouteList>, uint32_t& errors, bool force_flush);
|
bool flush_tracks_to_disk_after_locate (boost::shared_ptr<RouteList>, uint32_t& errors);
|
||||||
|
|
||||||
static void* _thread_work(void *arg);
|
static void* _thread_work(void *arg);
|
||||||
void* thread_work();
|
void* thread_work();
|
||||||
|
|
@ -95,6 +95,8 @@ private:
|
||||||
void empty_pool_trash ();
|
void empty_pool_trash ();
|
||||||
void config_changed (std::string);
|
void config_changed (std::string);
|
||||||
|
|
||||||
|
bool flush_tracks_to_disk_normal (boost::shared_ptr<RouteList>, uint32_t& errors);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add request to butler thread request queue
|
* Add request to butler thread request queue
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -268,7 +268,7 @@ Butler::thread_work ()
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
|
|
||||||
disk_work_outstanding = flush_tracks_to_disk (rl, err, false);
|
disk_work_outstanding = flush_tracks_to_disk_normal (rl, err);
|
||||||
|
|
||||||
if (err && _session.actively_recording()) {
|
if (err && _session.actively_recording()) {
|
||||||
/* stop the transport and try to catch as much possible
|
/* stop the transport and try to catch as much possible
|
||||||
|
|
@ -308,11 +308,60 @@ Butler::thread_work ()
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Butler::flush_tracks_to_disk (boost::shared_ptr<RouteList> rl, uint32_t& errors, bool force)
|
Butler::flush_tracks_to_disk_normal (boost::shared_ptr<RouteList> rl, uint32_t& errors)
|
||||||
{
|
{
|
||||||
bool disk_work_outstanding = false;
|
bool disk_work_outstanding = false;
|
||||||
|
|
||||||
for (RouteList::iterator i = rl->begin(); (force || !transport_work_requested()) && should_run && i != rl->end(); ++i) {
|
for (RouteList::iterator i = rl->begin(); !transport_work_requested() && should_run && i != rl->end(); ++i) {
|
||||||
|
|
||||||
|
// cerr << "write behind for " << (*i)->name () << endl;
|
||||||
|
|
||||||
|
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
|
||||||
|
|
||||||
|
if (!tr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* note that we still try to flush diskstreams attached to inactive routes
|
||||||
|
*/
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
DEBUG_TRACE (DEBUG::Butler, string_compose ("butler flushes track %1 capture load %2\n", tr->name(), tr->capture_buffer_load()));
|
||||||
|
ret = tr->do_flush (ButlerContext, false);
|
||||||
|
switch (ret) {
|
||||||
|
case 0:
|
||||||
|
DEBUG_TRACE (DEBUG::Butler, string_compose ("\tflush complete for %1\n", tr->name()));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
DEBUG_TRACE (DEBUG::Butler, string_compose ("\tflush not finished for %1\n", tr->name()));
|
||||||
|
disk_work_outstanding = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
errors++;
|
||||||
|
error << string_compose(_("Butler write-behind failure on dstream %1"), (*i)->name()) << endmsg;
|
||||||
|
std::cerr << string_compose(_("Butler write-behind failure on dstream %1"), (*i)->name()) << std::endl;
|
||||||
|
/* don't break - try to flush all streams in case they
|
||||||
|
are split across disks.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return disk_work_outstanding;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Butler::flush_tracks_to_disk_after_locate (boost::shared_ptr<RouteList> rl, uint32_t& errors)
|
||||||
|
{
|
||||||
|
bool disk_work_outstanding = false;
|
||||||
|
|
||||||
|
/* almost the same as the "normal" version except that we do not test
|
||||||
|
* for transport_work_requested() and we force flushes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
|
||||||
|
|
||||||
// cerr << "write behind for " << (*i)->name () << endl;
|
// cerr << "write behind for " << (*i)->name () << endl;
|
||||||
|
|
||||||
|
|
@ -325,20 +374,17 @@ Butler::flush_tracks_to_disk (boost::shared_ptr<RouteList> rl, uint32_t& errors,
|
||||||
/* note that we still try to flush diskstreams attached to inactive routes
|
/* note that we still try to flush diskstreams attached to inactive routes
|
||||||
*/
|
*/
|
||||||
|
|
||||||
gint64 before, after;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
DEBUG_TRACE (DEBUG::Butler, string_compose ("butler flushes track %1 capture load %2\n", tr->name(), tr->capture_buffer_load()));
|
DEBUG_TRACE (DEBUG::Butler, string_compose ("butler flushes track %1 capture load %2\n", tr->name(), tr->capture_buffer_load()));
|
||||||
before = g_get_monotonic_time ();
|
ret = tr->do_flush (ButlerContext, true);
|
||||||
ret = tr->do_flush (ButlerContext, force);
|
|
||||||
after = g_get_monotonic_time ();
|
|
||||||
switch (ret) {
|
switch (ret) {
|
||||||
case 0:
|
case 0:
|
||||||
DEBUG_TRACE (DEBUG::Butler, string_compose ("\tflush complete for %1, %2 usecs\n", tr->name(), after - before));
|
DEBUG_TRACE (DEBUG::Butler, string_compose ("\tflush complete for %1\n", tr->name()));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
DEBUG_TRACE (DEBUG::Butler, string_compose ("\tflush not finished for %1, %2 usecs\n", tr->name(), after - before));
|
DEBUG_TRACE (DEBUG::Butler, string_compose ("\tflush not finished for %1\n", tr->name()));
|
||||||
disk_work_outstanding = true;
|
disk_work_outstanding = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue