GstEnginePipeline: Remove upstream events and buffer probes
Also rename some variables and callback functions Possible fix for #1090
This commit is contained in:
parent
8b2e8d3804
commit
6d05bb2de5
@ -104,17 +104,22 @@ GstEnginePipeline::GstEnginePipeline(QObject *parent)
|
|||||||
audiobin_(nullptr),
|
audiobin_(nullptr),
|
||||||
audiosink_(nullptr),
|
audiosink_(nullptr),
|
||||||
audioqueue_(nullptr),
|
audioqueue_(nullptr),
|
||||||
|
audioqueueconverter_(nullptr),
|
||||||
volume_(nullptr),
|
volume_(nullptr),
|
||||||
volume_sw_(nullptr),
|
volume_sw_(nullptr),
|
||||||
volume_fading_(nullptr),
|
volume_fading_(nullptr),
|
||||||
audiopanorama_(nullptr),
|
audiopanorama_(nullptr),
|
||||||
equalizer_(nullptr),
|
equalizer_(nullptr),
|
||||||
equalizer_preamp_(nullptr),
|
equalizer_preamp_(nullptr),
|
||||||
element_added_cb_id_(-1),
|
eventprobe_(nullptr),
|
||||||
pad_added_cb_id_(-1),
|
upstream_events_probe_cb_id_(-1UL),
|
||||||
notify_source_cb_id_(-1),
|
buffer_probe_cb_id_(-1UL),
|
||||||
about_to_finish_cb_id_(-1),
|
playbin_probe_cb_id_(-1UL),
|
||||||
notify_volume_cb_id_(-1),
|
element_added_cb_id_(-1UL),
|
||||||
|
pad_added_cb_id_(-1UL),
|
||||||
|
notify_source_cb_id_(-1UL),
|
||||||
|
about_to_finish_cb_id_(-1UL),
|
||||||
|
notify_volume_cb_id_(-1UL),
|
||||||
logged_unsupported_analyzer_format_(false) {
|
logged_unsupported_analyzer_format_(false) {
|
||||||
|
|
||||||
eq_band_gains_.reserve(kEqBandCount);
|
eq_band_gains_.reserve(kEqBandCount);
|
||||||
@ -133,31 +138,49 @@ GstEnginePipeline::~GstEnginePipeline() {
|
|||||||
fader_.reset();
|
fader_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (element_added_cb_id_ != -1) {
|
if (element_added_cb_id_ != -1UL) {
|
||||||
g_signal_handler_disconnect(G_OBJECT(audiobin_), element_added_cb_id_);
|
g_signal_handler_disconnect(G_OBJECT(audiobin_), element_added_cb_id_);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pad_added_cb_id_ != -1) {
|
if (pad_added_cb_id_ != -1UL) {
|
||||||
g_signal_handler_disconnect(G_OBJECT(pipeline_), pad_added_cb_id_);
|
g_signal_handler_disconnect(G_OBJECT(pipeline_), pad_added_cb_id_);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (notify_source_cb_id_ != -1) {
|
if (notify_source_cb_id_ != -1UL) {
|
||||||
g_signal_handler_disconnect(G_OBJECT(pipeline_), notify_source_cb_id_);
|
g_signal_handler_disconnect(G_OBJECT(pipeline_), notify_source_cb_id_);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (about_to_finish_cb_id_ != -1) {
|
if (about_to_finish_cb_id_ != -1UL) {
|
||||||
g_signal_handler_disconnect(G_OBJECT(pipeline_), about_to_finish_cb_id_);
|
g_signal_handler_disconnect(G_OBJECT(pipeline_), about_to_finish_cb_id_);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (notify_volume_cb_id_ != -1) {
|
if (notify_volume_cb_id_ != -1UL) {
|
||||||
g_signal_handler_disconnect(G_OBJECT(volume_), notify_volume_cb_id_);
|
g_signal_handler_disconnect(G_OBJECT(volume_), notify_volume_cb_id_);
|
||||||
}
|
}
|
||||||
|
|
||||||
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline_));
|
if (upstream_events_probe_cb_id_ > 0UL) {
|
||||||
if (bus) {
|
GstPad *pad = gst_element_get_static_pad(eventprobe_, "src");
|
||||||
gst_bus_remove_watch(bus);
|
if (pad) {
|
||||||
gst_bus_set_sync_handler(bus, nullptr, nullptr, nullptr);
|
gst_pad_remove_probe(pad, upstream_events_probe_cb_id_);
|
||||||
gst_object_unref(bus);
|
gst_object_unref(pad);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer_probe_cb_id_ > 0UL) {
|
||||||
|
GstPad *pad = gst_element_get_static_pad(audioqueueconverter_, "src");
|
||||||
|
if (pad) {
|
||||||
|
gst_pad_remove_probe(pad, buffer_probe_cb_id_);
|
||||||
|
gst_object_unref(pad);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline_));
|
||||||
|
if (bus) {
|
||||||
|
gst_bus_remove_watch(bus);
|
||||||
|
gst_bus_set_sync_handler(bus, nullptr, nullptr, nullptr);
|
||||||
|
gst_object_unref(bus);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_element_set_state(pipeline_, GST_STATE_NULL);
|
gst_element_set_state(pipeline_, GST_STATE_NULL);
|
||||||
@ -261,8 +284,8 @@ bool GstEnginePipeline::InitFromUrl(const QByteArray &stream_url, const QUrl &or
|
|||||||
pipeline_ = CreateElement("playbin", "pipeline", nullptr, error);
|
pipeline_ = CreateElement("playbin", "pipeline", nullptr, error);
|
||||||
if (!pipeline_) return false;
|
if (!pipeline_) return false;
|
||||||
|
|
||||||
pad_added_cb_id_ = CHECKED_GCONNECT(G_OBJECT(pipeline_), "pad-added", &NewPadCallback, this);
|
pad_added_cb_id_ = CHECKED_GCONNECT(G_OBJECT(pipeline_), "pad-added", &PadAddedCallback, this);
|
||||||
notify_source_cb_id_ = CHECKED_GCONNECT(G_OBJECT(pipeline_), "notify::source", &SourceSetupCallback, this);
|
notify_source_cb_id_ = CHECKED_GCONNECT(G_OBJECT(pipeline_), "notify::source", &NotifySourceCallback, this);
|
||||||
about_to_finish_cb_id_ = CHECKED_GCONNECT(G_OBJECT(pipeline_), "about-to-finish", &AboutToFinishCallback, this);
|
about_to_finish_cb_id_ = CHECKED_GCONNECT(G_OBJECT(pipeline_), "about-to-finish", &AboutToFinishCallback, this);
|
||||||
|
|
||||||
if (!InitAudioBin(error)) return false;
|
if (!InitAudioBin(error)) return false;
|
||||||
@ -431,8 +454,8 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
GstElement *audioqueueconverter = CreateElement("audioconvert", "audioqueueconverter", audiobin_, error);
|
audioqueueconverter_ = CreateElement("audioconvert", "audioqueueconverter", audiobin_, error);
|
||||||
if (!audioqueueconverter) {
|
if (!audioqueueconverter_) {
|
||||||
gst_object_unref(GST_OBJECT(audiobin_));
|
gst_object_unref(GST_OBJECT(audiobin_));
|
||||||
audiobin_ = nullptr;
|
audiobin_ = nullptr;
|
||||||
return false;
|
return false;
|
||||||
@ -530,7 +553,7 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create the replaygain elements if it's enabled.
|
// Create the replaygain elements if it's enabled.
|
||||||
GstElement *eventprobe = audioqueueconverter;
|
eventprobe_ = audioqueueconverter_;
|
||||||
GstElement *rgvolume = nullptr;
|
GstElement *rgvolume = nullptr;
|
||||||
GstElement *rglimiter = nullptr;
|
GstElement *rglimiter = nullptr;
|
||||||
GstElement *rgconverter = nullptr;
|
GstElement *rgconverter = nullptr;
|
||||||
@ -553,7 +576,7 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
|||||||
audiobin_ = nullptr;
|
audiobin_ = nullptr;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
eventprobe = rgconverter;
|
eventprobe_ = rgconverter;
|
||||||
// Set replaygain settings
|
// Set replaygain settings
|
||||||
g_object_set(G_OBJECT(rgvolume), "album-mode", rg_mode_, nullptr);
|
g_object_set(G_OBJECT(rgvolume), "album-mode", rg_mode_, nullptr);
|
||||||
g_object_set(G_OBJECT(rgvolume), "pre-amp", rg_preamp_, nullptr);
|
g_object_set(G_OBJECT(rgvolume), "pre-amp", rg_preamp_, nullptr);
|
||||||
@ -582,9 +605,9 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
|||||||
// Add a data probe on the src pad of the audioconvert element for our scope.
|
// Add a data probe on the src pad of the audioconvert element for our scope.
|
||||||
// We do it here because we want pre-equalized and pre-volume samples so that our visualization are not be affected by them.
|
// We do it here because we want pre-equalized and pre-volume samples so that our visualization are not be affected by them.
|
||||||
{
|
{
|
||||||
GstPad *pad = gst_element_get_static_pad(eventprobe, "src");
|
GstPad *pad = gst_element_get_static_pad(eventprobe_, "src");
|
||||||
if (pad) {
|
if (pad) {
|
||||||
gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_EVENT_UPSTREAM, &EventHandoffCallback, this, nullptr);
|
upstream_events_probe_cb_id_ = gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_EVENT_UPSTREAM, &UpstreamEventsProbeCallback, this, nullptr);
|
||||||
gst_object_unref(pad);
|
gst_object_unref(pad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -605,14 +628,14 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
|||||||
|
|
||||||
// Link all elements
|
// Link all elements
|
||||||
|
|
||||||
if (!gst_element_link(audioqueue_, audioqueueconverter)) {
|
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 = audioqueueconverter; // 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) {
|
||||||
@ -700,14 +723,20 @@ 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(audiosinkconverter, audiosink_, caps);
|
if (!gst_element_link_filtered(audiosinkconverter, audiosink_, caps)) {
|
||||||
|
gst_caps_unref(caps);
|
||||||
|
gst_object_unref(GST_OBJECT(audiobin_));
|
||||||
|
audiobin_ = nullptr;
|
||||||
|
error = "gst_element_link_filtered() failed.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
gst_caps_unref(caps);
|
gst_caps_unref(caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
{ // Add probes and handlers.
|
{ // Add probes and handlers.
|
||||||
GstPad *pad = gst_element_get_static_pad(audioqueueconverter, "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);
|
buffer_probe_cb_id_ = gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, BufferProbeCallback, this, nullptr);
|
||||||
gst_object_unref(pad);
|
gst_object_unref(pad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -715,8 +744,8 @@ bool GstEnginePipeline::InitAudioBin(QString &error) {
|
|||||||
{
|
{
|
||||||
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline_));
|
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline_));
|
||||||
if (bus) {
|
if (bus) {
|
||||||
gst_bus_set_sync_handler(bus, BusCallbackSync, this, nullptr);
|
gst_bus_set_sync_handler(bus, BusSyncCallback, this, nullptr);
|
||||||
gst_bus_add_watch(bus, BusCallback, this);
|
gst_bus_add_watch(bus, BusWatchCallback, this);
|
||||||
gst_object_unref(bus);
|
gst_object_unref(bus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -732,11 +761,13 @@ void GstEnginePipeline::SetupVolume(GstElement *element) {
|
|||||||
if (volume_) return;
|
if (volume_) return;
|
||||||
|
|
||||||
volume_ = element;
|
volume_ = element;
|
||||||
notify_volume_cb_id_ = CHECKED_GCONNECT(G_OBJECT(element), "notify::volume", &VolumeCallback, this);
|
notify_volume_cb_id_ = CHECKED_GCONNECT(G_OBJECT(element), "notify::volume", &NotifyVolumeCallback, this);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GstPadProbeReturn GstEnginePipeline::EventHandoffCallback(GstPad*, GstPadProbeInfo *info, gpointer self) {
|
GstPadProbeReturn GstEnginePipeline::UpstreamEventsProbeCallback(GstPad *pad, GstPadProbeInfo *info, gpointer self) {
|
||||||
|
|
||||||
|
Q_UNUSED(pad)
|
||||||
|
|
||||||
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
||||||
|
|
||||||
@ -787,7 +818,9 @@ void GstEnginePipeline::ElementAddedCallback(GstBin *bin, GstBin*, GstElement *e
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GstEnginePipeline::SourceSetupCallback(GstPlayBin *bin, GParamSpec*, gpointer self) {
|
void GstEnginePipeline::NotifySourceCallback(GstPlayBin *bin, GParamSpec *param_spec, gpointer self) {
|
||||||
|
|
||||||
|
Q_UNUSED(param_spec)
|
||||||
|
|
||||||
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
||||||
|
|
||||||
@ -833,7 +866,10 @@ void GstEnginePipeline::SourceSetupCallback(GstPlayBin *bin, GParamSpec*, gpoint
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GstEnginePipeline::VolumeCallback(GstElement*, GParamSpec*, gpointer self) {
|
void GstEnginePipeline::NotifyVolumeCallback(GstElement *element, GParamSpec *param_spec, gpointer self) {
|
||||||
|
|
||||||
|
Q_UNUSED(element)
|
||||||
|
Q_UNUSED(param_spec)
|
||||||
|
|
||||||
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
||||||
|
|
||||||
@ -848,7 +884,9 @@ void GstEnginePipeline::VolumeCallback(GstElement*, GParamSpec*, gpointer self)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GstEnginePipeline::NewPadCallback(GstElement*, GstPad *pad, gpointer self) {
|
void GstEnginePipeline::PadAddedCallback(GstElement *element, GstPad *pad, gpointer self) {
|
||||||
|
|
||||||
|
Q_UNUSED(element)
|
||||||
|
|
||||||
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
||||||
|
|
||||||
@ -869,7 +907,7 @@ void GstEnginePipeline::NewPadCallback(GstElement*, GstPad *pad, gpointer self)
|
|||||||
gst_pad_set_offset(pad, static_cast<gint64>(running_time));
|
gst_pad_set_offset(pad, static_cast<gint64>(running_time));
|
||||||
|
|
||||||
// Add a probe to the pad so we can update last_playbin_segment_.
|
// Add a probe to the pad so we can update last_playbin_segment_.
|
||||||
gst_pad_add_probe(pad, static_cast<GstPadProbeType>(GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | GST_PAD_PROBE_TYPE_EVENT_FLUSH), PlaybinProbe, instance, nullptr);
|
instance->playbin_probe_cb_id_ = gst_pad_add_probe(pad, static_cast<GstPadProbeType>(GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | GST_PAD_PROBE_TYPE_EVENT_FLUSH), PlaybinProbeCallback, instance, nullptr);
|
||||||
|
|
||||||
instance->pipeline_is_connected_ = true;
|
instance->pipeline_is_connected_ = true;
|
||||||
if (instance->pending_seek_nanosec_ != -1 && instance->pipeline_is_initialized_) {
|
if (instance->pending_seek_nanosec_ != -1 && instance->pipeline_is_initialized_) {
|
||||||
@ -878,9 +916,9 @@ void GstEnginePipeline::NewPadCallback(GstElement*, GstPad *pad, gpointer self)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GstPadProbeReturn GstEnginePipeline::PlaybinProbe(GstPad *pad, GstPadProbeInfo *info, gpointer data) {
|
GstPadProbeReturn GstEnginePipeline::PlaybinProbeCallback(GstPad *pad, GstPadProbeInfo *info, gpointer self) {
|
||||||
|
|
||||||
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(data);
|
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
||||||
|
|
||||||
const GstPadProbeType info_type = GST_PAD_PROBE_INFO_TYPE(info);
|
const GstPadProbeType info_type = GST_PAD_PROBE_INFO_TYPE(info);
|
||||||
|
|
||||||
@ -918,7 +956,7 @@ GstPadProbeReturn GstEnginePipeline::PlaybinProbe(GstPad *pad, GstPadProbeInfo *
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GstPadProbeReturn GstEnginePipeline::HandoffCallback(GstPad *pad, GstPadProbeInfo *info, gpointer self) {
|
GstPadProbeReturn GstEnginePipeline::BufferProbeCallback(GstPad *pad, GstPadProbeInfo *info, gpointer self) {
|
||||||
|
|
||||||
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
||||||
|
|
||||||
@ -1081,7 +1119,9 @@ GstPadProbeReturn GstEnginePipeline::HandoffCallback(GstPad *pad, GstPadProbeInf
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GstEnginePipeline::AboutToFinishCallback(GstPlayBin*, gpointer self) {
|
void GstEnginePipeline::AboutToFinishCallback(GstPlayBin *playbin, gpointer self) {
|
||||||
|
|
||||||
|
Q_UNUSED(playbin)
|
||||||
|
|
||||||
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
||||||
|
|
||||||
@ -1094,32 +1134,9 @@ void GstEnginePipeline::AboutToFinishCallback(GstPlayBin*, gpointer self) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean GstEnginePipeline::BusCallback(GstBus*, GstMessage *msg, gpointer self) {
|
GstBusSyncReply GstEnginePipeline::BusSyncCallback(GstBus *bus, GstMessage *msg, gpointer self) {
|
||||||
|
|
||||||
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
Q_UNUSED(bus)
|
||||||
|
|
||||||
switch (GST_MESSAGE_TYPE(msg)) {
|
|
||||||
case GST_MESSAGE_ERROR:
|
|
||||||
instance->ErrorMessageReceived(msg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MESSAGE_TAG:
|
|
||||||
instance->TagMessageReceived(msg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MESSAGE_STATE_CHANGED:
|
|
||||||
instance->StateChangedMessageReceived(msg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
GstBusSyncReply GstEnginePipeline::BusCallbackSync(GstBus*, GstMessage *msg, gpointer self) {
|
|
||||||
|
|
||||||
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
||||||
|
|
||||||
@ -1164,6 +1181,33 @@ GstBusSyncReply GstEnginePipeline::BusCallbackSync(GstBus*, GstMessage *msg, gpo
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean GstEnginePipeline::BusWatchCallback(GstBus *bus, GstMessage *msg, gpointer self) {
|
||||||
|
|
||||||
|
Q_UNUSED(bus)
|
||||||
|
|
||||||
|
GstEnginePipeline *instance = reinterpret_cast<GstEnginePipeline*>(self);
|
||||||
|
|
||||||
|
switch (GST_MESSAGE_TYPE(msg)) {
|
||||||
|
case GST_MESSAGE_ERROR:
|
||||||
|
instance->ErrorMessageReceived(msg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GST_MESSAGE_TAG:
|
||||||
|
instance->TagMessageReceived(msg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GST_MESSAGE_STATE_CHANGED:
|
||||||
|
instance->StateChangedMessageReceived(msg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void GstEnginePipeline::StreamStatusMessageReceived(GstMessage *msg) {
|
void GstEnginePipeline::StreamStatusMessageReceived(GstMessage *msg) {
|
||||||
|
|
||||||
GstStreamStatusType type = GST_STREAM_STATUS_TYPE_CREATE;
|
GstStreamStatusType type = GST_STREAM_STATUS_TYPE_CREATE;
|
||||||
@ -1198,7 +1242,11 @@ void GstEnginePipeline::StreamStartMessageReceived() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GstEnginePipeline::TaskEnterCallback(GstTask*, GThread*, gpointer) {
|
void GstEnginePipeline::TaskEnterCallback(GstTask *task, GThread *thread, gpointer self) {
|
||||||
|
|
||||||
|
Q_UNUSED(task)
|
||||||
|
Q_UNUSED(thread)
|
||||||
|
Q_UNUSED(self)
|
||||||
|
|
||||||
// Bump the priority of the thread only on macOS
|
// Bump the priority of the thread only on macOS
|
||||||
|
|
||||||
|
@ -146,24 +146,24 @@ class GstEnginePipeline : public QObject {
|
|||||||
void SetupVolume(GstElement *element);
|
void SetupVolume(GstElement *element);
|
||||||
|
|
||||||
// Static callbacks. The GstEnginePipeline instance is passed in the last argument.
|
// Static callbacks. The GstEnginePipeline instance is passed in the last argument.
|
||||||
static GstPadProbeReturn EventHandoffCallback(GstPad*, GstPadProbeInfo*, gpointer);
|
static GstPadProbeReturn UpstreamEventsProbeCallback(GstPad *pad, GstPadProbeInfo *info, gpointer self);
|
||||||
|
static GstPadProbeReturn BufferProbeCallback(GstPad *pad, GstPadProbeInfo *info, gpointer self);
|
||||||
|
static GstPadProbeReturn PlaybinProbeCallback(GstPad *pad, GstPadProbeInfo *info, gpointer self);
|
||||||
static void ElementAddedCallback(GstBin *bin, GstBin*, GstElement *element, gpointer self);
|
static void ElementAddedCallback(GstBin *bin, GstBin*, GstElement *element, gpointer self);
|
||||||
static void SourceSetupCallback(GstPlayBin*, GParamSpec *pspec, gpointer);
|
static void PadAddedCallback(GstElement *element, GstPad *pad, gpointer self);
|
||||||
static void VolumeCallback(GstElement*, GParamSpec*, gpointer self);
|
static void NotifySourceCallback(GstPlayBin *bin, GParamSpec *param_spec, gpointer self);
|
||||||
static void NewPadCallback(GstElement*, GstPad*, gpointer);
|
static void NotifyVolumeCallback(GstElement *element, GParamSpec *param_spec, gpointer self);
|
||||||
static GstPadProbeReturn PlaybinProbe(GstPad*, GstPadProbeInfo*, gpointer);
|
static void AboutToFinishCallback(GstPlayBin *playbin, gpointer self);
|
||||||
static GstPadProbeReturn HandoffCallback(GstPad*, GstPadProbeInfo*, gpointer);
|
static GstBusSyncReply BusSyncCallback(GstBus *bus, GstMessage *msg, gpointer self);
|
||||||
static void AboutToFinishCallback(GstPlayBin*, gpointer);
|
static gboolean BusWatchCallback(GstBus *bus, GstMessage *msg, gpointer self);
|
||||||
static GstBusSyncReply BusCallbackSync(GstBus*, GstMessage*, gpointer);
|
static void TaskEnterCallback(GstTask *task, GThread *thread, gpointer self);
|
||||||
static gboolean BusCallback(GstBus*, GstMessage*, gpointer);
|
|
||||||
static void TaskEnterCallback(GstTask*, GThread*, gpointer);
|
|
||||||
|
|
||||||
void TagMessageReceived(GstMessage*);
|
void TagMessageReceived(GstMessage *msg);
|
||||||
void ErrorMessageReceived(GstMessage*);
|
void ErrorMessageReceived(GstMessage *msg);
|
||||||
void ElementMessageReceived(GstMessage*);
|
void ElementMessageReceived(GstMessage *msg);
|
||||||
void StateChangedMessageReceived(GstMessage*);
|
void StateChangedMessageReceived(GstMessage *msg);
|
||||||
void BufferingMessageReceived(GstMessage*);
|
void BufferingMessageReceived(GstMessage *msg);
|
||||||
void StreamStatusMessageReceived(GstMessage*);
|
void StreamStatusMessageReceived(GstMessage *msg);
|
||||||
void StreamStartMessageReceived();
|
void StreamStartMessageReceived();
|
||||||
|
|
||||||
static QString ParseStrTag(GstTagList *list, const char *tag);
|
static QString ParseStrTag(GstTagList *list, const char *tag);
|
||||||
@ -285,18 +285,23 @@ class GstEnginePipeline : public QObject {
|
|||||||
GstElement *audiobin_;
|
GstElement *audiobin_;
|
||||||
GstElement *audiosink_;
|
GstElement *audiosink_;
|
||||||
GstElement *audioqueue_;
|
GstElement *audioqueue_;
|
||||||
|
GstElement *audioqueueconverter_;
|
||||||
GstElement *volume_;
|
GstElement *volume_;
|
||||||
GstElement *volume_sw_;
|
GstElement *volume_sw_;
|
||||||
GstElement *volume_fading_;
|
GstElement *volume_fading_;
|
||||||
GstElement *audiopanorama_;
|
GstElement *audiopanorama_;
|
||||||
GstElement *equalizer_;
|
GstElement *equalizer_;
|
||||||
GstElement *equalizer_preamp_;
|
GstElement *equalizer_preamp_;
|
||||||
|
GstElement *eventprobe_;
|
||||||
|
|
||||||
int element_added_cb_id_;
|
gulong upstream_events_probe_cb_id_;
|
||||||
int pad_added_cb_id_;
|
gulong buffer_probe_cb_id_;
|
||||||
int notify_source_cb_id_;
|
gulong playbin_probe_cb_id_;
|
||||||
int about_to_finish_cb_id_;
|
gulong element_added_cb_id_;
|
||||||
int notify_volume_cb_id_;
|
gulong pad_added_cb_id_;
|
||||||
|
gulong notify_source_cb_id_;
|
||||||
|
gulong about_to_finish_cb_id_;
|
||||||
|
gulong notify_volume_cb_id_;
|
||||||
|
|
||||||
QThreadPool set_state_threadpool_;
|
QThreadPool set_state_threadpool_;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user