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
+
+
+