GstEnginePipeline: actually perform (EBU R 128) loudness normalization
The magic: if EBU R 128 loudness normalization is enabled, just insert `volume` GST element into the pipeline (where ReplayGain would be inserted) and configure it. We currently don't support changing said gain after the pipeline was created. We might need to, though, for a number of reasons.
This commit is contained in:
parent
e3a333564a
commit
94ab788032
@ -110,6 +110,7 @@ GstEnginePipeline::GstEnginePipeline(QObject *parent)
|
||||
audiosink_(nullptr),
|
||||
audioqueue_(nullptr),
|
||||
audioqueueconverter_(nullptr),
|
||||
ebur128_volume_(nullptr),
|
||||
volume_(nullptr),
|
||||
volume_sw_(nullptr),
|
||||
volume_fading_(nullptr),
|
||||
@ -567,8 +568,9 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
||||
|
||||
}
|
||||
|
||||
// Create the replaygain elements if it's enabled.
|
||||
eventprobe_ = audioqueueconverter_;
|
||||
|
||||
// Create the replaygain elements if it's enabled.
|
||||
GstElement *rgvolume = nullptr;
|
||||
GstElement *rglimiter = nullptr;
|
||||
GstElement *rgconverter = nullptr;
|
||||
@ -593,6 +595,20 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
||||
g_object_set(G_OBJECT(rglimiter), "enabled", static_cast<int>(rg_compression_), nullptr);
|
||||
}
|
||||
|
||||
// Create the EBU R 128 loudness normalization volume element if enabled.
|
||||
if (ebur128_loudness_normalization_) {
|
||||
ebur128_volume_ = CreateElement("volume", "ebur128_volume", audiobin_, error);
|
||||
if (!ebur128_volume_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto dB_to_mult = [](const double gain_dB) { return std::pow(10., gain_dB / 20.); };
|
||||
|
||||
g_object_set(G_OBJECT(ebur128_volume_), "volume", dB_to_mult(ebur128_loudness_normalizing_gain_db_), nullptr);
|
||||
|
||||
eventprobe_ = ebur128_volume_;
|
||||
}
|
||||
|
||||
GstElement *bs2b = nullptr;
|
||||
if (bs2b_enabled_) {
|
||||
bs2b = CreateElement("bs2b", "bs2b", audiobin_, error);
|
||||
@ -651,6 +667,15 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
||||
element_link = rgconverter;
|
||||
}
|
||||
|
||||
// Link EBU R 128 loudness normalization volume element if enabled.
|
||||
if (ebur128_loudness_normalization_ && ebur128_volume_) {
|
||||
if (!gst_element_link(element_link, ebur128_volume_)) {
|
||||
error = "Failed to link EBU R 128 volume element.";
|
||||
return false;
|
||||
}
|
||||
element_link = ebur128_volume_;
|
||||
}
|
||||
|
||||
// Link equalizer elements if enabled.
|
||||
if (eq_enabled_ && equalizer_ && equalizer_preamp_) {
|
||||
if (!gst_element_link_many(element_link, equalizer_preamp_, equalizer_, nullptr)) {
|
||||
|
@ -301,6 +301,7 @@ class GstEnginePipeline : public QObject {
|
||||
GstElement *audiosink_;
|
||||
GstElement *audioqueue_;
|
||||
GstElement *audioqueueconverter_;
|
||||
GstElement *ebur128_volume_;
|
||||
GstElement *volume_;
|
||||
GstElement *volume_sw_;
|
||||
GstElement *volume_fading_;
|
||||
|
Loading…
x
Reference in New Issue
Block a user