diff options
| author | Carl Hetherington <cth@carlh.net> | 2017-01-28 00:35:55 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2017-01-28 00:35:55 +0000 |
| commit | f5bc071ddac2355da1d116404cc37f4485e97699 (patch) | |
| tree | 55da5257669b366fac0a6d9d214655f75867543a /src/lib/job_manager.cc | |
| parent | 861267156da5960260c9a080dce94c0892fd012a (diff) | |
Add priority control buttons to batch converter (#961).
Diffstat (limited to 'src/lib/job_manager.cc')
| -rw-r--r-- | src/lib/job_manager.cc | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/lib/job_manager.cc b/src/lib/job_manager.cc index c9924d226..3992e685e 100644 --- a/src/lib/job_manager.cc +++ b/src/lib/job_manager.cc @@ -210,3 +210,72 @@ JobManager::analyse_audio ( emit (boost::bind (boost::ref (JobAdded), weak_ptr<Job> (job))); } + +void +JobManager::increase_priority (shared_ptr<Job> job) +{ + bool changed = false; + + { + boost::mutex::scoped_lock lm (_mutex); + list<shared_ptr<Job> >::iterator last = _jobs.end (); + for (list<shared_ptr<Job> >::iterator i = _jobs.begin(); i != _jobs.end(); ++i) { + if (*i == job && last != _jobs.end()) { + swap (*i, *last); + changed = true; + break; + } + last = i; + } + } + + if (changed) { + priority_changed (); + } +} + +void +JobManager::priority_changed () +{ + { + boost::mutex::scoped_lock lm (_mutex); + + bool first = true; + BOOST_FOREACH (shared_ptr<Job> i, _jobs) { + if (first) { + if (i->is_new ()) { + i->start (); + } else if (i->paused_by_priority ()) { + i->resume (); + } + first = false; + } else { + if (i->running ()) { + i->pause_by_priority (); + } + } + } + } + + emit (boost::bind (boost::ref (JobsReordered))); +} + +void +JobManager::decrease_priority (shared_ptr<Job> job) +{ + bool changed = false; + + for (list<shared_ptr<Job> >::iterator i = _jobs.begin(); i != _jobs.end(); ++i) { + list<shared_ptr<Job> >::iterator next = i; + ++next; + if (*i == job && next != _jobs.end()) { + swap (*i, *next); + changed = true; + break; + } + } + + if (changed) { + priority_changed (); + } +} |
