More engine fixes

This commit is contained in:
Jonas Kvinge
2018-07-01 01:29:52 +02:00
parent 67df8f2243
commit 04f1d296ea
22 changed files with 330 additions and 217 deletions

View File

@@ -79,7 +79,8 @@ void BackendSettingsPage::Load() {
engineloaded_ = false;
xinewarning_ = false;
Engine::EngineType enginetype = Engine::EngineTypeFromName(s_.value("engine", EngineDescription(Engine::GStreamer)).toString());
Engine::EngineType enginetype = Engine::EngineTypeFromName(s_.value("engine", EngineName(Engine::None)).toString());
if (enginetype == Engine::None && engine()) enginetype = engine()->type();
ui_->combobox_engine->clear();
#ifdef HAVE_GSTREAMER
@@ -95,7 +96,9 @@ void BackendSettingsPage::Load() {
ui_->combobox_engine->addItem(IconLoader::Load("speaker"), EngineDescription(Engine::Phonon), Engine::Phonon);
#endif
enginereset_ = false;
enginetype_current_ = enginetype;
output_current_ = s_.value("output", "").toString();
device_current_ = s_.value("device", QVariant());
ui_->combobox_engine->setCurrentIndex(ui_->combobox_engine->findData(enginetype));
if (EngineInitialised()) Load_Engine(enginetype);
@@ -152,8 +155,8 @@ void BackendSettingsPage::Load_Engine(Engine::EngineType enginetype) {
if (!EngineInitialised()) return;
QString output = s_.value("output", "").toString();
QVariant device = s_.value("device", QVariant());
QString output = output_current_;
QVariant device = device_current_;
ui_->combobox_output->clear();
ui_->combobox_device->clear();
@@ -163,13 +166,15 @@ void BackendSettingsPage::Load_Engine(Engine::EngineType enginetype) {
ui_->lineedit_device->setEnabled(false);
ui_->lineedit_device->setText("");
ui_->groupbox_replaygain->setEnabled(false);
if (engine()->type() != enginetype) {
qLog(Debug) << "Switching engine.";
dialog()->app()->player()->CreateEngine(enginetype);
dialog()->app()->player()->ReloadSettings();
dialog()->app()->player()->Init();
dialog()->set_output_changed(false);
}
engineloaded_ = true;
@@ -203,6 +208,7 @@ void BackendSettingsPage::Load_Output(QString output, QVariant device) {
}
if (!found) { // Output is invalid for this engine, reset to default output.
output = engine()->DefaultOutput();
device = (engine()->CustomDeviceSupport(output) == true ? QVariant("") : QVariant());
for (int i = 0; i < ui_->combobox_output->count(); ++i) {
EngineBase::OutputDetails o = ui_->combobox_output->itemData(i).value<EngineBase::OutputDetails>();
if (o.name == output) {
@@ -212,8 +218,16 @@ void BackendSettingsPage::Load_Output(QString output, QVariant device) {
}
}
if (engine()->type() == Engine::GStreamer) ui_->groupbox_replaygain->setEnabled(true);
else ui_->groupbox_replaygain->setEnabled(false);
if (engine()->type() == Engine::GStreamer) {
ui_->groupbox_buffer->setEnabled(true);
ui_->groupbox_replaygain->setEnabled(true);
ui_->checkbox_monoplayback->setEnabled(true);
}
else {
ui_->groupbox_buffer->setEnabled(false);
ui_->groupbox_replaygain->setEnabled(false);
ui_->checkbox_monoplayback->setEnabled(false);
}
if (ui_->combobox_output->count() < 1) {
ShowWarning("Engine may take some time to initialize. Close settings and reopen to set output and devices.");
@@ -315,23 +329,35 @@ void BackendSettingsPage::Save() {
s_.setValue("rgpreamp", float(ui_->stickslider_replaygainpreamp->value()) / 10 - 15);
s_.setValue("rgcompression", ui_->checkbox_replaygaincompression->isChecked());
// If engine has not been changed, but output or device has been changed,
// then set_output_changed(true) to reinitialize engine when dialog closes.
if (enginetype == enginetype_current_ && (output_name != output_current_ || device_value != device_current_)) dialog()->set_output_changed(true);
}
void BackendSettingsPage::Cancel() {
if (engine() && engine()->type() != enginetype_current_) { // Reset engine back to the original because user cancelled.
dialog()->app()->player()->CreateEngine(enginetype_current_);
dialog()->app()->player()->ReloadSettings();
dialog()->app()->player()->Init();
}
}
void BackendSettingsPage::EngineChanged(int index) {
if (!configloaded_ || !EngineInitialised()) return;
if (engine()->state() != Engine::Empty) {
if (enginereset_ == true) { enginereset_ = false; return; }
errordialog_.ShowMessage("Can't switch engine while playing!");
enginereset_ = true;
ui_->combobox_engine->setCurrentIndex(ui_->combobox_engine->findData(engineloaded_));
return;
}
QVariant v = ui_->combobox_engine->itemData(index);
Engine::EngineType enginetype = v.value<Engine::EngineType>();
if (engine()->type() == enginetype) return;
if (engine()->state() != Engine::Empty) {
errordialog_.ShowMessage("Can't switch engine while playing!");
ui_->combobox_engine->setCurrentIndex(ui_->combobox_engine->findData(engine()->type()));
return;
}
engineloaded_ = false;
xinewarning_ = false;
ResetWarning();
@@ -346,7 +372,7 @@ void BackendSettingsPage::OutputChanged(int index) {
EngineBase::OutputDetails output = ui_->combobox_output->itemData(index).value<EngineBase::OutputDetails>();
Load_Device(output.name, QVariant());
if (engine()->type() == Engine::Xine) XineWarning();
if (engine()->type() == Engine::Xine && engine()->state() != Engine::Empty) XineWarning();
}
@@ -371,7 +397,7 @@ void BackendSettingsPage::DeviceSelectionChanged(int index) {
if (!ui_->lineedit_device->text().isEmpty()) ui_->lineedit_device->setText("");
}
if (engine()->type() == Engine::Xine) XineWarning();
if (engine()->type() == Engine::Xine && engine()->state() != Engine::Empty) XineWarning();
}
@@ -467,8 +493,8 @@ void BackendSettingsPage::XineWarning() {
if (!engineloaded_) return;
if (!configloaded_) return;
if (engine()->type() != Engine::Xine) return;
if (engine()->state() == Engine::Empty) return;
if (xinewarning_) return;
ShowWarning("You need to restart Strawberry for output/device changes to take affect for Xine.");

View File

@@ -52,6 +52,7 @@ public:
void Load();
void Save();
void Cancel();
EngineBase *engine() const { return dialog()->app()->player()->engine(); }
@@ -65,10 +66,10 @@ public:
private:
Ui_BackendSettingsPage *ui_;
void ConnectSignals();
bool EngineInitialised();
void EngineChanged(Engine::EngineType enginetype);
void Load_Engine(Engine::EngineType enginetype);
@@ -77,14 +78,17 @@ private:
void ShowWarning(QString text);
void ResetWarning();
void XineWarning();
QSettings s_;
bool configloaded_;
bool engineloaded_;
ErrorDialog errordialog_;
bool enginereset_;
bool xinewarning_;
ErrorDialog errordialog_;
Engine::EngineType enginetype_current_;
QString output_current_;
QVariant device_current_;
};
#endif // BACKENDSETTINGSPAGE_H

View File

@@ -30,6 +30,7 @@
#include <QSpinBox>
#include "core/iconloader.h"
#include "core/logging.h"
#include "settingspage.h"
#include "playbacksettingspage.h"
#include "ui_playbacksettingspage.h"
@@ -50,9 +51,7 @@ PlaybackSettingsPage::PlaybackSettingsPage(SettingsDialog *dialog) : SettingsPag
}
PlaybackSettingsPage::~PlaybackSettingsPage() {
delete ui_;
}
void PlaybackSettingsPage::Load() {

View File

@@ -45,6 +45,7 @@
#include "core/application.h"
#include "core/player.h"
#include "core/logging.h"
#include "engine/enginebase.h"
#include "widgets/groupediconview.h"
#include "collection/collectionmodel.h"
@@ -104,7 +105,8 @@ SettingsDialog::SettingsDialog(Application *app, QWidget *parent)
model_(app_->collection_model()->directory_model()),
appearance_(app_->appearance()),
ui_(new Ui_SettingsDialog),
loading_settings_(false) {
loading_settings_(false),
output_changed_(false) {
ui_->setupUi(this);
ui_->list->setItemDelegate(new SettingsItemDelegate(this));
@@ -203,6 +205,11 @@ void SettingsDialog::Save() {
void SettingsDialog::accept() {
Save();
// Only Xine needs to reinitialize to switch output and device.
if (output_changed_ && engine() && engine()->type() == Engine::Xine && engine()->state() == Engine::Empty) {
engine()->ReloadSettings();
engine()->Init();
}
QDialog::accept();
}

View File

@@ -37,6 +37,7 @@
#include <QScrollArea>
#include <QTreeWidgetItem>
#include "core/logging.h"
#include "widgets/osd.h"
class QModelIndex;
@@ -104,6 +105,8 @@ public:
// QWidget
void showEvent(QShowEvent *e);
void set_output_changed(bool output_changed) { output_changed_ = output_changed; }
signals:
void NotificationPreview(OSD::Behaviour, QString, QString);
@@ -135,6 +138,8 @@ private:
bool loading_settings_;
QMap<Page, PageData> pages_;
bool output_changed_;
};
#endif // SETTINGSDIALOG_H