GstEnginePipeline: Add audio converter for sink
This commit is contained in:
@@ -431,8 +431,15 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
GstElement *audioconverter = CreateElement("audioconvert", "audioconverter", audiobin_, error);
|
GstElement *audioqueueconverter = CreateElement("audioconvert", "audioqueueconverter", audiobin_, error);
|
||||||
if (!audioconverter) {
|
if (!audioqueueconverter) {
|
||||||
|
gst_object_unref(GST_OBJECT(audiobin_));
|
||||||
|
audiobin_ = nullptr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
GstElement *audiosinkconverter = CreateElement("audioconvert", "audiosinkconverter", audiobin_, error);
|
||||||
|
if (!audiosinkconverter) {
|
||||||
gst_object_unref(GST_OBJECT(audiobin_));
|
gst_object_unref(GST_OBJECT(audiobin_));
|
||||||
audiobin_ = nullptr;
|
audiobin_ = nullptr;
|
||||||
return false;
|
return false;
|
||||||
@@ -523,7 +530,7 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create the replaygain elements if it's enabled.
|
// Create the replaygain elements if it's enabled.
|
||||||
GstElement *eventprobe = audioconverter;
|
GstElement *eventprobe = audioqueueconverter;
|
||||||
GstElement *rgvolume = nullptr;
|
GstElement *rgvolume = nullptr;
|
||||||
GstElement *rglimiter = nullptr;
|
GstElement *rglimiter = nullptr;
|
||||||
GstElement *rgconverter = nullptr;
|
GstElement *rgconverter = nullptr;
|
||||||
@@ -598,14 +605,14 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
|||||||
|
|
||||||
// Link all elements
|
// Link all elements
|
||||||
|
|
||||||
if (!gst_element_link(audioqueue_, audioconverter)) {
|
if (!gst_element_link(audioqueue_, audioqueueconverter)) {
|
||||||
gst_object_unref(GST_OBJECT(audiobin_));
|
gst_object_unref(GST_OBJECT(audiobin_));
|
||||||
audiobin_ = nullptr;
|
audiobin_ = nullptr;
|
||||||
error = "gst_element_link() failed.";
|
error = "gst_element_link() failed.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
GstElement *element_link = audioconverter; // The next element to link from.
|
GstElement *element_link = audioqueueconverter; // The next element to link from.
|
||||||
|
|
||||||
// Link replaygain elements if enabled.
|
// Link replaygain elements if enabled.
|
||||||
if (rg_enabled_ && rgvolume && rglimiter && rgconverter) {
|
if (rg_enabled_ && rgvolume && rglimiter && rgconverter) {
|
||||||
@@ -674,6 +681,13 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
|||||||
element_link = bs2b;
|
element_link = bs2b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!gst_element_link(element_link, audiosinkconverter)) {
|
||||||
|
gst_object_unref(GST_OBJECT(audiobin_));
|
||||||
|
audiobin_ = nullptr;
|
||||||
|
error = "gst_element_link() failed.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
GstCaps *caps = gst_caps_new_empty_simple("audio/x-raw");
|
GstCaps *caps = gst_caps_new_empty_simple("audio/x-raw");
|
||||||
if (!caps) {
|
if (!caps) {
|
||||||
@@ -686,12 +700,12 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
|||||||
qLog(Debug) << "Setting channels to" << channels_;
|
qLog(Debug) << "Setting channels to" << channels_;
|
||||||
gst_caps_set_simple(caps, "channels", G_TYPE_INT, channels_, nullptr);
|
gst_caps_set_simple(caps, "channels", G_TYPE_INT, channels_, nullptr);
|
||||||
}
|
}
|
||||||
gst_element_link_filtered(element_link, audiosink_, caps);
|
gst_element_link_filtered(audiosinkconverter, audiosink_, caps);
|
||||||
gst_caps_unref(caps);
|
gst_caps_unref(caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
{ // Add probes and handlers.
|
{ // Add probes and handlers.
|
||||||
GstPad *pad = gst_element_get_static_pad(audioconverter, "src");
|
GstPad *pad = gst_element_get_static_pad(audioqueueconverter, "src");
|
||||||
if (pad) {
|
if (pad) {
|
||||||
gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, HandoffCallback, this, nullptr);
|
gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, HandoffCallback, this, nullptr);
|
||||||
gst_object_unref(pad);
|
gst_object_unref(pad);
|
||||||
|
|||||||
Reference in New Issue
Block a user