diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 23dc654e7..04a88e36a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -615,6 +615,7 @@ set(HEADERS transcoder/transcoder.h transcoder/transcoderoptionsdialog.h transcoder/transcoderoptionsmp3.h + transcoder/transcoderoptionsflac.h transcoder/transcodersettingspage.h ui/about.h diff --git a/src/transcoder/transcoderoptionsflac.cpp b/src/transcoder/transcoderoptionsflac.cpp index 9de8aed68..590aed899 100644 --- a/src/transcoder/transcoderoptionsflac.cpp +++ b/src/transcoder/transcoderoptionsflac.cpp @@ -26,6 +26,8 @@ const char* TranscoderOptionsFlac::kSettingsGroup = "Transcoder/flacenc"; TranscoderOptionsFlac::TranscoderOptionsFlac(QWidget* parent) : TranscoderOptionsInterface(parent), ui_(new Ui_TranscoderOptionsFlac) { ui_->setupUi(this); + connect(ui_->quality, SIGNAL(valueChanged(int)), this, + SLOT(ValueChanged(int))); } TranscoderOptionsFlac::~TranscoderOptionsFlac() { delete ui_; } @@ -37,9 +39,34 @@ void TranscoderOptionsFlac::Load() { ui_->quality->setValue(s.value("quality", 5).toInt()); } +void TranscoderOptionsFlac::ValueChanged(int value) { + if (!IsInStreamingSubset(value)) { + ui_->info->setStyleSheet("QLabel { color : red }"); + ui_->info->setText( + tr("Warning: This compression level is outside of the streamable " + "subset. This means that a decoder may not be able to start " + "playing it mid-stream. It may also affect the performance of " + "hardware decoders.")); + } else { + ui_->info->setStyleSheet(""); + ui_->info->setText(""); + } +} + void TranscoderOptionsFlac::Save() { QSettings s; s.beginGroup(kSettingsGroup + settings_postfix_); - s.setValue("quality", ui_->quality->value()); + int quality = ui_->quality->value(); + s.setValue("quality", quality); + + s.setValue("streamable-subset", IsInStreamingSubset(quality)); +} + +bool TranscoderOptionsFlac::IsInStreamingSubset(int level) { + // The gstreamer flacenc element defines its own quality settings. The + // highest level, 9 (aka "insane"), uses settings that are outside of the + // streamable subset. + // https://xiph.org/flac/format.html#subset + return (level < 9); } diff --git a/src/transcoder/transcoderoptionsflac.h b/src/transcoder/transcoderoptionsflac.h index b5e416e8b..9e945718d 100644 --- a/src/transcoder/transcoderoptionsflac.h +++ b/src/transcoder/transcoderoptionsflac.h @@ -23,6 +23,8 @@ class Ui_TranscoderOptionsFlac; class TranscoderOptionsFlac : public TranscoderOptionsInterface { + Q_OBJECT + public: TranscoderOptionsFlac(QWidget* parent = nullptr); ~TranscoderOptionsFlac(); @@ -30,7 +32,12 @@ class TranscoderOptionsFlac : public TranscoderOptionsInterface { void Load(); void Save(); + private slots: + void ValueChanged(int value); + private: + static bool IsInStreamingSubset(int level); + static const char* kSettingsGroup; Ui_TranscoderOptionsFlac* ui_; diff --git a/src/transcoder/transcoderoptionsflac.ui b/src/transcoder/transcoderoptionsflac.ui index 8375ff62f..3635ec5d7 100644 --- a/src/transcoder/transcoderoptionsflac.ui +++ b/src/transcoder/transcoderoptionsflac.ui @@ -15,7 +15,7 @@ - + Quality @@ -24,7 +24,7 @@ - + Fast @@ -47,7 +47,7 @@ - + Best @@ -55,6 +55,22 @@ + + + + + 0 + 0 + + + + + + + true + + +