Add option to disable volume control
This commit is contained in:
@@ -36,7 +36,7 @@
|
||||
#include "settings/backendsettingspage.h"
|
||||
|
||||
Engine::Base::Base()
|
||||
: volume_(50),
|
||||
: volume_(100),
|
||||
beginning_nanosec_(0),
|
||||
end_nanosec_(0),
|
||||
scope_(kScopeSize),
|
||||
@@ -103,6 +103,8 @@ void Engine::Base::ReloadSettings() {
|
||||
output_ = s.value("output").toString();
|
||||
device_ = s.value("device");
|
||||
|
||||
volume_control_ = s.value("volume_control", true).toBool();
|
||||
|
||||
buffer_duration_nanosec_ = s.value("bufferduration", 4000).toLongLong() * kNsecPerMsec;
|
||||
buffer_min_fill_ = s.value("bufferminfill", 33).toInt();
|
||||
|
||||
|
||||
@@ -112,6 +112,7 @@ public:
|
||||
|
||||
// Simple accessors
|
||||
EngineType type() const { return type_; }
|
||||
bool volume_control() const { return volume_control_; }
|
||||
inline uint volume() const { return volume_; }
|
||||
|
||||
bool is_fadeout_enabled() const { return fadeout_enabled_; }
|
||||
@@ -153,7 +154,7 @@ signals:
|
||||
// Always use the state from event, because it's not guaranteed that immediate subsequent call to state() won't return a stale value.
|
||||
void StateChanged(Engine::State);
|
||||
|
||||
protected:
|
||||
protected:
|
||||
|
||||
struct PluginDetails {
|
||||
QString name;
|
||||
@@ -163,6 +164,7 @@ protected:
|
||||
typedef QList<PluginDetails> PluginDetailsList;
|
||||
|
||||
EngineType type_;
|
||||
bool volume_control_;
|
||||
uint volume_;
|
||||
quint64 beginning_nanosec_;
|
||||
qint64 end_nanosec_;
|
||||
|
||||
@@ -803,6 +803,7 @@ shared_ptr<GstEnginePipeline> GstEngine::CreatePipeline() {
|
||||
|
||||
shared_ptr<GstEnginePipeline> ret(new GstEnginePipeline(this));
|
||||
ret->set_output_device(output_, device_);
|
||||
ret->set_volume_control(volume_control_);
|
||||
ret->set_replaygain(rg_enabled_, rg_mode_, rg_preamp_, rg_compression_);
|
||||
ret->set_buffer_duration_nanosec(buffer_duration_nanosec_);
|
||||
ret->set_buffer_min_fill(buffer_min_fill_);
|
||||
|
||||
@@ -75,6 +75,7 @@ class GstEngine : public Engine::Base, public GstBufferConsumer {
|
||||
void Pause();
|
||||
void Unpause();
|
||||
void Seek(quint64 offset_nanosec);
|
||||
|
||||
protected:
|
||||
void SetVolumeSW(uint percent);
|
||||
|
||||
|
||||
@@ -53,8 +53,7 @@ const int GstEnginePipeline::kGstStateTimeoutNanosecs = 10000000;
|
||||
const int GstEnginePipeline::kFaderFudgeMsec = 2000;
|
||||
|
||||
const int GstEnginePipeline::kEqBandCount = 10;
|
||||
const int GstEnginePipeline::kEqBandFrequencies[] = {
|
||||
60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000};
|
||||
const int GstEnginePipeline::kEqBandFrequencies[] = { 60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000 };
|
||||
|
||||
int GstEnginePipeline::sId = 1;
|
||||
GstElementDeleter *GstEnginePipeline::sElementDeleter = nullptr;
|
||||
@@ -64,8 +63,9 @@ GstEnginePipeline::GstEnginePipeline(GstEngine *engine)
|
||||
engine_(engine),
|
||||
id_(sId++),
|
||||
valid_(false),
|
||||
output_(""),
|
||||
output_(QString()),
|
||||
device_(QVariant()),
|
||||
volume_control_(true),
|
||||
eq_enabled_(false),
|
||||
eq_preamp_(0),
|
||||
stereo_balance_(0.0f),
|
||||
@@ -118,6 +118,12 @@ void GstEnginePipeline::set_output_device(const QString &output, const QVariant
|
||||
|
||||
}
|
||||
|
||||
void GstEnginePipeline::set_volume_control(bool volume_control) {
|
||||
|
||||
volume_control_ = volume_control;
|
||||
|
||||
}
|
||||
|
||||
void GstEnginePipeline::set_replaygain(bool enabled, int mode, float preamp, bool compression) {
|
||||
|
||||
rg_enabled_ = enabled;
|
||||
@@ -239,14 +245,21 @@ bool GstEnginePipeline::InitAudioBin() {
|
||||
probe_sink = engine_->CreateElement("fakesink", audiobin_);
|
||||
|
||||
audio_queue = engine_->CreateElement("queue", audiobin_);
|
||||
equalizer_preamp_ = engine_->CreateElement("volume", audiobin_, false);
|
||||
equalizer_ = engine_->CreateElement("equalizer-nbands", audiobin_, false);
|
||||
audio_panorama_ = engine_->CreateElement("audiopanorama", audiobin_, false);
|
||||
volume_ = engine_->CreateElement("volume", audiobin_);
|
||||
audioscale_ = engine_->CreateElement("audioresample", audiobin_);
|
||||
convert = engine_->CreateElement("audioconvert", audiobin_);
|
||||
|
||||
if (!queue_ || !audioconvert_ || !tee || !probe_queue || !probe_converter || !probe_sink || !audio_queue || !volume_ || !audioscale_ || !convert) {
|
||||
if (engine_->volume_control()) {
|
||||
volume_ = engine_->CreateElement("volume", audiobin_);
|
||||
}
|
||||
|
||||
audio_panorama_ = engine_->CreateElement("audiopanorama", audiobin_, false);
|
||||
|
||||
if (eq_enabled_) {
|
||||
equalizer_preamp_ = engine_->CreateElement("volume", audiobin_, false);
|
||||
equalizer_ = engine_->CreateElement("equalizer-nbands", audiobin_, false);
|
||||
}
|
||||
|
||||
if (!queue_ || !audioconvert_ || !tee || !probe_queue || !probe_converter || !probe_sink || !audio_queue || !audioscale_ || !convert) {
|
||||
gst_object_unref(GST_OBJECT(audiobin_));
|
||||
return false;
|
||||
}
|
||||
@@ -348,8 +361,16 @@ bool GstEnginePipeline::InitAudioBin() {
|
||||
// Don't force 16 bit.
|
||||
gst_element_link(probe_queue, probe_converter);
|
||||
|
||||
if (engine_->IsEqualizerEnabled() && equalizer_ && equalizer_preamp_ && audio_panorama_) gst_element_link_many(audio_queue, equalizer_preamp_, equalizer_, audio_panorama_, volume_, audioscale_, convert, nullptr);
|
||||
else gst_element_link_many(audio_queue, volume_, audioscale_, convert, nullptr);
|
||||
if (eq_enabled_ && equalizer_ && equalizer_preamp_ && audio_panorama_) {
|
||||
if (volume_)
|
||||
gst_element_link_many(audio_queue, equalizer_preamp_, equalizer_, audio_panorama_, volume_, audioscale_, convert, nullptr);
|
||||
else
|
||||
gst_element_link_many(audio_queue, equalizer_preamp_, equalizer_, audio_panorama_, audioscale_, convert, nullptr);
|
||||
}
|
||||
else {
|
||||
if (volume_) gst_element_link_many(audio_queue, volume_, audioscale_, convert, nullptr);
|
||||
else gst_element_link_many(audio_queue, audioscale_, convert, nullptr);
|
||||
}
|
||||
|
||||
// Let the audio output of the tee autonegotiate the bit depth and format.
|
||||
GstCaps *caps = gst_caps_new_empty_simple("audio/x-raw");
|
||||
@@ -993,16 +1014,19 @@ void GstEnginePipeline::UpdateStereoBalance() {
|
||||
}
|
||||
|
||||
void GstEnginePipeline::SetVolume(int percent) {
|
||||
if (!volume_) return;
|
||||
volume_percent_ = percent;
|
||||
UpdateVolume();
|
||||
}
|
||||
|
||||
void GstEnginePipeline::SetVolumeModifier(qreal mod) {
|
||||
if (!volume_) return;
|
||||
volume_modifier_ = mod;
|
||||
UpdateVolume();
|
||||
}
|
||||
|
||||
void GstEnginePipeline::UpdateVolume() {
|
||||
if (!volume_) return;
|
||||
float vol = double(volume_percent_) * 0.01 * volume_modifier_;
|
||||
g_object_set(G_OBJECT(volume_), "volume", vol, nullptr);
|
||||
}
|
||||
|
||||
@@ -68,6 +68,7 @@ class GstEnginePipeline : public QObject {
|
||||
|
||||
// Call these setters before Init
|
||||
void set_output_device(const QString &sink, const QVariant &device);
|
||||
void set_volume_control(bool volume_control);
|
||||
void set_replaygain(bool enabled, int mode, float preamp, bool compression);
|
||||
void set_buffer_duration_nanosec(qint64 duration_nanosec);
|
||||
void set_buffer_min_fill(int percent);
|
||||
@@ -187,6 +188,7 @@ signals:
|
||||
bool valid_;
|
||||
QString output_;
|
||||
QVariant device_;
|
||||
bool volume_control_;
|
||||
|
||||
// Equalizer
|
||||
bool eq_enabled_;
|
||||
|
||||
@@ -173,6 +173,7 @@ void VLCEngine::Seek(quint64 offset_nanosec) {
|
||||
|
||||
void VLCEngine::SetVolumeSW(uint percent) {
|
||||
if (!Initialised()) return;
|
||||
if (!volume_control_ && percent != 100) return;
|
||||
libvlc_audio_set_volume(player_, percent);
|
||||
}
|
||||
|
||||
|
||||
@@ -393,6 +393,7 @@ void XineEngine::Seek(quint64 offset_nanosec) {
|
||||
void XineEngine::SetVolumeSW(uint vol) {
|
||||
|
||||
if (!stream_) return;
|
||||
if (!volume_control_ && vol != 100) return;
|
||||
xine_set_param(stream_, XINE_PARAM_AUDIO_AMP_LEVEL, static_cast<uint>(vol * preamp_));
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user