diff options
Diffstat (limited to 'src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp')
-rw-r--r-- | src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp | 112 |
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 |