bool MediaNode::disconnectNode(QObject *obj) { MediaNode *sink = qobject_cast<MediaNode*>(obj); if (root()) { // Disconnecting elements while playing or paused seems to cause // potential deadlock. Hence we force the pipeline into ready state // before any nodes are disconnected. gst_element_set_state(root()->pipeline(), GST_STATE_READY); Q_ASSERT(sink->root()); //sink has to have a root since it is onnected if (sink->description() & (AudioSink)) { GstPad *sinkPad = gst_element_get_pad(sink->audioElement(), "sink"); // Release requested src pad from tee GstPad *requestedPad = gst_pad_get_peer(sinkPad); if (requestedPad) { gst_element_release_request_pad(m_audioTee, requestedPad); gst_object_unref(requestedPad); } if (GST_ELEMENT_PARENT(sink->audioElement())) gst_bin_remove(GST_BIN(root()->audioGraph()), sink->audioElement()); gst_object_unref(sinkPad); } if (sink->description() & (VideoSink)) { GstPad *sinkPad = gst_element_get_pad(sink->videoElement(), "sink"); // Release requested src pad from tee GstPad *requestedPad = gst_pad_get_peer(sinkPad); if (requestedPad) { gst_element_release_request_pad(m_videoTee, requestedPad); gst_object_unref(requestedPad); } if (GST_ELEMENT_PARENT(sink->videoElement())) gst_bin_remove(GST_BIN(root()->videoGraph()), sink->videoElement()); gst_object_unref(sinkPad); } sink->breakGraph(); sink->setRoot(0); } m_videoSinkList.removeAll(obj); m_audioSinkList.removeAll(obj); if (sink->m_description & AudioSink) { // Remove sink from graph MediaNodeEvent event(MediaNodeEvent::AudioSinkRemoved, sink); mediaNodeEvent(&event); return true; } if ((m_description & VideoSource) && (sink->m_description & VideoSink)) { // Remove sink from graph MediaNodeEvent event(MediaNodeEvent::VideoSinkRemoved, sink); mediaNodeEvent(&event); return true; } return false; }
foreach (QObject *object, objects) { MediaNode *sourceNode = qobject_cast<MediaNode *>(object); MediaObject *media = sourceNode->root(); if (media) { media->saveState(); return true; } }
bool MediaNode::connectNode(QObject *obj) { MediaNode *sink = qobject_cast<MediaNode*>(obj); bool success = false; if (sink) { if (!sink->isValid()) { m_backend->logMessage(QString("Trying to link to an invalid node (%0)").arg(sink->name()), Backend::Warning); return false; } if (sink->root()) { m_backend->logMessage("Trying to link a node that is already linked to a different mediasource ", Backend::Warning); return false; } if ((m_description & AudioSource) && (sink->m_description & AudioSink)) { m_audioSinkList << obj; MediaNodeEvent event(MediaNodeEvent::AudioSinkAdded, sink); root()->mediaNodeEvent(&event); success = true; } if ((m_description & VideoSource) && (sink->m_description & VideoSink)) { m_videoSinkList << obj; MediaNodeEvent event(MediaNodeEvent::VideoSinkAdded, sink); root()->mediaNodeEvent(&event); success = true; } // If we have a root source, and we are connected // try to link the gstreamer elements if (success && root()) { MediaNodeEvent mediaObjectConnected(MediaNodeEvent::MediaObjectConnected, root()); notify(&mediaObjectConnected); root()->buildGraph(); } } return success; }