summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp')
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp112
1 files changed, 67 insertions, 45 deletions
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
index a6bac1a04..d6ee3fdb4 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
@@ -57,20 +57,6 @@ Q_LOGGING_CATEGORY(qLcMediaCapture, "qt.multimedia.capture")
QGstreamerMediaCapture::QGstreamerMediaCapture()
: gstPipeline("pipeline")
{
- gstAudioInput = new QGstreamerAudioInput(this);
- gstAudioInput->setPipeline(gstPipeline);
- connect(gstAudioInput, &QGstreamerAudioInput::mutedChanged, this, &QGstreamerMediaCapture::mutedChanged);
- connect(gstAudioInput, &QGstreamerAudioInput::volumeChanged, this, &QGstreamerMediaCapture::volumeChanged);
-
- gstAudioOutput = new QGstreamerAudioOutput(this);
- gstAudioOutput->setPipeline(gstPipeline);
- gstAudioTee = QGstElement("tee", "audiotee");
-
- gstPipeline.add(gstAudioInput->gstElement(), gstAudioTee, gstAudioOutput->gstElement());
- gstAudioInput->gstElement().link(gstAudioTee);
- auto pad = gstAudioTee.getRequestPad("src_%u");
- pad.link(gstAudioOutput->gstElement().staticPad("sink"));
-
gstVideoOutput = new QGstreamerVideoOutput(this);
gstVideoOutput->setIsPreview();
gstVideoOutput->setPipeline(gstPipeline);
@@ -179,34 +165,41 @@ QPlatformMediaEncoder *QGstreamerMediaCapture::mediaEncoder()
return m_mediaEncoder;
}
-QAudioDevice QGstreamerMediaCapture::audioInput() const
-{
- return gstAudioInput->audioInput();
-}
-
-bool QGstreamerMediaCapture::setAudioInput(const QAudioDevice &info)
-{
- return gstAudioInput->setAudioInput(info);
-}
-
-bool QGstreamerMediaCapture::isMuted() const
+void QGstreamerMediaCapture::setAudioInput(QPlatformAudioInput *input)
{
- return gstAudioOutput->isMuted();
-}
+ if (gstAudioInput == input)
+ return;
+ gstPipeline.setStateSync(GST_STATE_PAUSED);
+ if (gstAudioInput) {
+ gstAudioOutput->setPipeline({});
+ gstAudioInput = nullptr;
+ if (gstAudioOutput) {
+ gstAudioOutput->gstElement().setStateSync(GST_STATE_NULL);
+ gstPipeline.remove(gstAudioOutput->gstElement());
+ }
+ if (!gstAudioTee.isNull()) {
+ gstAudioTee.setStateSync(GST_STATE_NULL);
+ gstPipeline.remove(gstAudioTee);
+ }
+ gstAudioTee = {};
+ }
+ gstAudioInput = static_cast<QGstreamerAudioInput *>(input);
+ if (gstAudioInput)
+ gstAudioInput->setPipeline(gstPipeline);
-void QGstreamerMediaCapture::setMuted(bool muted)
-{
- gstAudioOutput->setMuted(muted);
-}
+ Q_ASSERT(gstAudioTee.isNull());
+ gstAudioTee = QGstElement("tee", "audiotee");
+ gstAudioTee.set("allow-not-linked", true);
+ gstPipeline.add(gstAudioInput->gstElement(), gstAudioTee);
+ gstAudioInput->gstElement().link(gstAudioTee);
-qreal QGstreamerMediaCapture::volume() const
-{
- return gstAudioOutput->volume();
-}
+ if (gstAudioOutput) {
+ gstPipeline.add(gstAudioOutput->gstElement());
+ gstAudioOutputPad = gstAudioTee.getRequestPad("src_%u");
+ gstAudioOutputPad.link(gstAudioOutput->gstElement().staticPad("sink"));
+ }
-void QGstreamerMediaCapture::setVolume(qreal volume)
-{
- gstAudioOutput->setVolume(volume);
+ gstPipeline.setState(GST_STATE_PLAYING);
}
void QGstreamerMediaCapture::setVideoPreview(QVideoSink *sink)
@@ -214,17 +207,38 @@ void QGstreamerMediaCapture::setVideoPreview(QVideoSink *sink)
gstVideoOutput->setVideoSink(sink);
}
-QAudioDevice QGstreamerMediaCapture::audioPreview() const
+void QGstreamerMediaCapture::setAudioOutput(QPlatformAudioOutput *output)
{
- return gstAudioOutput->audioOutput();
-}
+ if (gstAudioOutput == output)
+ return;
+ gstPipeline.setStateSync(GST_STATE_PAUSED);
-bool QGstreamerMediaCapture::setAudioPreview(const QAudioDevice &info)
-{
- gstAudioOutput->setAudioOutput(info);
- return true;
+ if (gstAudioOutput) {
+ gstAudioOutput->setPipeline({});
+ gstAudioOutput = nullptr;
+ if (!gstAudioTee.isNull()) {
+ gstAudioOutput->gstElement().setStateSync(GST_STATE_NULL);
+ gstAudioOutputPad.unlinkPeer();
+ gstAudioTee.releaseRequestPad(gstAudioOutputPad);
+ gstAudioOutputPad = {};
+ gstPipeline.remove(gstAudioOutput->gstElement());
+ }
+ setupAudioPipeline();
+ }
+ gstAudioOutput = static_cast<QGstreamerAudioOutput *>(output);
+ if (gstAudioOutput)
+ gstAudioOutput->setPipeline(gstPipeline);
+
+ if (!gstAudioTee.isNull()) {
+ gstPipeline.add(gstAudioOutput->gstElement());
+ gstAudioOutputPad = gstAudioTee.getRequestPad("src_%u");
+ gstAudioOutputPad.link(gstAudioOutput->gstElement().staticPad("sink"));
+ }
+
+ gstPipeline.setState(GST_STATE_PLAYING);
}
+
QGstPad QGstreamerMediaCapture::getAudioPad() const
{
return gstAudioTee.getRequestPad("src_%u");
@@ -247,5 +261,13 @@ void QGstreamerMediaCapture::releaseVideoPad(const QGstPad &pad) const
gstVideoTee.releaseRequestPad(pad);
}
+void QGstreamerMediaCapture::setupAudioPipeline()
+{
+
+ if (!gstAudioInput) {
+ return;
+ }
+}
+
QT_END_NAMESPACE