From e31c9d74fa8174c6ad1913e10027cee891f9475f Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sun, 30 Jan 2022 04:24:33 +0100 Subject: [PATCH] Add advanced settings for configuring collection watcher --- src/collection/collection.cpp | 15 ++++- src/collection/collection.h | 6 +- src/core/tagreaderclient.cpp | 11 +++- src/core/thread.cpp | 9 ++- src/settings/collectionsettingspage.cpp | 28 +++++++++ src/settings/collectionsettingspage.ui | 82 ++++++++++++++++++++++++- src/settings/settingspage.cpp | 10 +++ src/settings/settingspage.h | 1 + 8 files changed, 154 insertions(+), 8 deletions(-) diff --git a/src/collection/collection.cpp b/src/collection/collection.cpp index 1d983280d..7c9b084e6 100644 --- a/src/collection/collection.cpp +++ b/src/collection/collection.cpp @@ -94,11 +94,18 @@ void SCollection::Init() { watcher_ = new CollectionWatcher(Song::Source_Collection); watcher_thread_ = new Thread(this); - watcher_thread_->SetIoPriority(Utilities::IOPRIO_CLASS_IDLE); + +#ifndef Q_OS_WIN32 + if (io_priority_ != Utilities::IoPriority::IOPRIO_CLASS_NONE) { + watcher_thread_->SetIoPriority(io_priority_); + } +#endif watcher_->moveToThread(watcher_thread_); - watcher_thread_->start(QThread::IdlePriority); - qLog(Debug) << watcher_ << "moved to thread" << watcher_thread_; + + qLog(Debug) << watcher_ << "moved to thread" << watcher_thread_ << "with I/O priority" << io_priority_ << "and thread priority" << thread_priority_; + + watcher_thread_->start(thread_priority_); watcher_->set_backend(backend_); watcher_->set_task_manager(app_->task_manager()); @@ -176,6 +183,8 @@ void SCollection::ReloadSettings() { QSettings s; s.beginGroup(CollectionSettingsPage::kSettingsGroup); + io_priority_ = static_cast(s.value("io_priority", Utilities::IOPRIO_CLASS_IDLE).toInt()); + thread_priority_ = static_cast(s.value("thread_priority", QThread::Priority::IdlePriority).toInt()); save_playcounts_to_files_ = s.value("save_playcounts", false).toBool(); save_ratings_to_files_ = s.value("save_ratings", false).toBool(); s.endGroup(); diff --git a/src/collection/collection.h b/src/collection/collection.h index d4308f569..22a9649c9 100644 --- a/src/collection/collection.h +++ b/src/collection/collection.h @@ -28,10 +28,10 @@ #include #include #include +#include #include "core/song.h" - -class QThread; +#include "core/utilities.h" class Application; class Thread; @@ -99,6 +99,8 @@ class SCollection : public QObject { QList wait_for_exit_; + Utilities::IoPriority io_priority_; + QThread::Priority thread_priority_; bool save_playcounts_to_files_; bool save_ratings_to_files_; }; diff --git a/src/core/tagreaderclient.cpp b/src/core/tagreaderclient.cpp index 620bcac7e..3383f20c7 100644 --- a/src/core/tagreaderclient.cpp +++ b/src/core/tagreaderclient.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include "core/logging.h" @@ -36,6 +37,7 @@ #include "song.h" #include "tagreaderclient.h" +#include "settings/collectionsettingspage.h" const char *TagReaderClient::kWorkerExecutableName = "strawberry-tagreader"; TagReaderClient *TagReaderClient::sInstance = nullptr; @@ -45,8 +47,15 @@ TagReaderClient::TagReaderClient(QObject *parent) : QObject(parent), worker_pool sInstance = this; original_thread_ = thread(); + QSettings s; + s.beginGroup(CollectionSettingsPage::kSettingsGroup); + int workers = s.value("tagreader_workers", qBound(1, QThread::idealThreadCount() / 2, 4)).toInt(); + s.endGroup(); + + qLog(Debug) << "Using" << workers << "tagreader workers."; + worker_pool_->SetExecutableName(kWorkerExecutableName); - worker_pool_->SetWorkerCount(qBound(1, QThread::idealThreadCount() / 2, 4)); + worker_pool_->SetWorkerCount(workers); QObject::connect(worker_pool_, &WorkerPool::WorkerFailedToStart, this, &TagReaderClient::WorkerFailedToStart); } diff --git a/src/core/thread.cpp b/src/core/thread.cpp index 118ab9747..e85fa2ec4 100644 --- a/src/core/thread.cpp +++ b/src/core/thread.cpp @@ -23,6 +23,13 @@ #include "utilities.h" void Thread::run() { - Utilities::SetThreadIOPriority(io_priority_); + +#ifndef Q_OS_WIN32 + if (io_priority_ != Utilities::IOPRIO_CLASS_NONE) { + Utilities::SetThreadIOPriority(io_priority_); + } +#endif + QThread::run(); + } diff --git a/src/settings/collectionsettingspage.cpp b/src/settings/collectionsettingspage.cpp index afd5fe92c..b70905708 100644 --- a/src/settings/collectionsettingspage.cpp +++ b/src/settings/collectionsettingspage.cpp @@ -23,6 +23,7 @@ #include +#include #include #include #include @@ -78,6 +79,9 @@ CollectionSettingsPage::CollectionSettingsPage(SettingsDialog *dialog, QWidget * ui_->combobox_cache_size->addItems({"KB", "MB"}); ui_->combobox_disk_cache_size->addItems({"KB", "MB", "GB"}); + ui_->combobox_iopriority->addItems({"Auto", "Realtime", "Best effort", "Idle"}); + ui_->combobox_threadpriority->addItems({"Idle", "Lowest", "Low", "Normal"}); + QObject::connect(ui_->add, &QPushButton::clicked, this, &CollectionSettingsPage::Add); QObject::connect(ui_->remove, &QPushButton::clicked, this, &CollectionSettingsPage::Remove); @@ -102,6 +106,11 @@ CollectionSettingsPage::CollectionSettingsPage(SettingsDialog *dialog, QWidget * ui_->song_tracking->hide(); #endif +#ifdef Q_OS_WIN32 + ui_->label_iopriority->hide(); + ui_->combobox_iopriority->hide(); +#endif + } CollectionSettingsPage::~CollectionSettingsPage() { delete ui_; } @@ -221,6 +230,18 @@ void CollectionSettingsPage::Load() { ui_->checkbox_delete_files->hide(); #endif +#ifndef Q_OS_WIN32 + ComboBoxLoadFromSettingsByIndex(s, ui_->combobox_iopriority, "io_priority", Utilities::IOPRIO_CLASS_IDLE); +#endif + + ComboBoxLoadFromSettingsByIndex(s, ui_->combobox_threadpriority, "thread_priority", QThread::Priority::IdlePriority); + + int workers = s.value("tagreader_workers", qBound(1, QThread::idealThreadCount() / 2, 4)).toInt(); + if (workers <= 0 || workers > 4) { + workers = 4; + } + ui_->spinbox_tagreaderworkers->setValue(workers); + s.endGroup(); DiskCacheEnable(ui_->checkbox_disk_cache->checkState()); @@ -284,6 +305,13 @@ void CollectionSettingsPage::Save() { s.setValue("delete_files", ui_->checkbox_delete_files->isChecked()); +#ifndef Q_OS_WIN32 + s.setValue("io_priority", ui_->combobox_iopriority->currentIndex()); +#endif + + s.setValue("thread_priority", ui_->combobox_threadpriority->currentIndex()); + s.setValue("tagreader_workers", ui_->spinbox_tagreaderworkers->value()); + s.endGroup(); } diff --git a/src/settings/collectionsettingspage.ui b/src/settings/collectionsettingspage.ui index 794aea2fd..88633af1b 100644 --- a/src/settings/collectionsettingspage.ui +++ b/src/settings/collectionsettingspage.ui @@ -7,7 +7,7 @@ 0 0 516 - 1339 + 1490 @@ -601,6 +601,86 @@ If there are no matches then it will use the largest image in the directory. + + + + Advanced + + + + + + + + + 100 + 16777215 + + + + + + + + + 100 + 16777215 + + + + -1 + + + + + + + + 60 + 16777215 + + + + 1 + + + 4 + + + + + + + Tagreader workers + + + + + + + Thread priority + + + + + + + I/O priority + + + + + + + + + Advanced settings require restart. + + + + + + diff --git a/src/settings/settingspage.cpp b/src/settings/settingspage.cpp index 5b0172c17..4220cc884 100644 --- a/src/settings/settingspage.cpp +++ b/src/settings/settingspage.cpp @@ -151,3 +151,13 @@ void SettingsPage::ComboBoxLoadFromSettings(const QSettings &s, QComboBox *combo combobox->setCurrentIndex(i); } + +void SettingsPage::ComboBoxLoadFromSettingsByIndex(const QSettings &s, QComboBox *combobox, const QString &setting, const int default_value) { + + if (combobox->count() == 0) return; + int i = s.value(setting, default_value).toInt(); + if (i <= 0 || i >= combobox->count()) i = 0; + combobox->setCurrentIndex(i); + +} + diff --git a/src/settings/settingspage.h b/src/settings/settingspage.h index bf7588ea3..c0d2652d1 100644 --- a/src/settings/settingspage.h +++ b/src/settings/settingspage.h @@ -69,6 +69,7 @@ class SettingsPage : public QWidget { static void ComboBoxLoadFromSettings(const QSettings &s, QComboBox *combobox, const QString &setting, const QString &default_value); static void ComboBoxLoadFromSettings(const QSettings &s, QComboBox *combobox, const QString &setting, const int default_value); + static void ComboBoxLoadFromSettingsByIndex(const QSettings &s, QComboBox *combobox, const QString &setting, const int default_value); private: virtual void Save() = 0;