*/
midi_dstream_buffer_size = (uint32_t) floor (Config->get_midi_track_buffer_seconds() * rate);
- MidiDiskstream::set_readahead_frames ((nframes_t)(Config->get_midi_readahead() * rate));
+ MidiDiskstream::set_readahead_frames ((framecnt_t) (Config->get_midi_readahead() * rate));
Crossfade::set_buffer_size (audio_dstream_playback_buffer_size);
void *
Butler::_thread_work (void* arg)
{
- SessionEvent::create_per_thread_pool ("butler events", 64);
+ SessionEvent::create_per_thread_pool ("butler events", 4096);
pthread_set_name (X_("butler"));
return ((Butler *) arg)->thread_work ();
}
}
}
- if (transport_work_requested()) {
- _session.butler_transport_work ();
- }
- disk_work_outstanding = false;
bytes = 0;
compute_io = true;
+restart:
+ disk_work_outstanding = false;
+
+ if (transport_work_requested()) {
+ _session.butler_transport_work ();
+ }
+
begin = get_microseconds();
boost::shared_ptr<RouteList> rl = _session.get_routes();
for (i = rl_with_auditioner.begin(); !transport_work_requested() && should_run && i != rl_with_auditioner.end(); ++i) {
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
+
if (!tr) {
continue;
}
- /* don't read inactive tracks */
-
boost::shared_ptr<IO> io = tr->input ();
if (io && !io->active()) {
+ /* don't read inactive tracks */
continue;
}
}
if (!err && transport_work_requested()) {
- continue;
+ goto restart;
}
if (compute_io) {
// 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
*/
}
if (!err && transport_work_requested()) {
- continue;
+ goto restart;
}
if (compute_io) {
// cerr << "AFTER " << (*i)->name() << ": pb = " << (*i)->playback_buffer_load() << " cp = " << (*i)->capture_buffer_load() << endl;
// }
- continue;
+ goto restart;
}
paused.signal();
Butler::empty_pool_trash ()
{
/* look in the trash, deleting empty pools until we come to one that is not empty */
-
+
RingBuffer<CrossThreadPool*>::rw_vector vec;
pool_trash.get_read_vector (&vec);
guint deleted = 0;
-
+
for (int i = 0; i < 2; ++i) {
for (guint j = 0; j < vec.len[i]; ++j) {
if (vec.buf[i][j]->empty()) {