summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPiotr Srebrny <piotr.srebrny@qt.io>2021-09-21 18:48:32 +0200
committerPiotr Srebrny <piotr.srebrny@qt.io>2021-09-29 18:28:24 +0200
commit1d1c4dbf2aa81ff9fc9e386283791ca39deb227f (patch)
tree15619efe2a9ea8d1bbc28b196dab3f5b42cbb411 /src
parent42dcedc238c2622914441bf4cb69f482c976e013 (diff)
Disconnect QAudioInput from QCaptureMediaSession in destructor
The expected behavior of elements connected to the capture session is to disconnect automatically when deleted. This patch adds this behavior to the QAudioInput object. Additionally, this patch enables automatic handover of QAudioInput between two capture session. Pick-to: 6.2 Change-Id: If9e3b4ad1bf4c8abf117dc67367716ebc759c1c1 Reviewed-by: André de la Rocha <andre.rocha@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/multimedia/audio/qaudioinput.cpp17
-rw-r--r--src/multimedia/audio/qaudioinput.h5
-rw-r--r--src/multimedia/platform/qplatformaudioinput_p.h1
-rw-r--r--src/multimedia/recording/qmediacapturesession.cpp12
4 files changed, 31 insertions, 4 deletions
diff --git a/src/multimedia/audio/qaudioinput.cpp b/src/multimedia/audio/qaudioinput.cpp
index 1d0d68f0f..8472ceb6c 100644
--- a/src/multimedia/audio/qaudioinput.cpp
+++ b/src/multimedia/audio/qaudioinput.cpp
@@ -43,6 +43,8 @@
#include <private/qplatformaudioinput_p.h>
#include <private/qplatformmediaintegration_p.h>
+#include <utility>
+
/*!
\qmltype AudioInput
\instantiates QAudioInput
@@ -99,6 +101,7 @@ QAudioInput::QAudioInput(const QAudioDevice &device, QObject *parent)
QAudioInput::~QAudioInput()
{
+ setDisconnectFunction({});
delete d;
}
@@ -197,4 +200,18 @@ void QAudioInput::setDevice(const QAudioDevice &device)
d->setAudioDevice(dev);
emit deviceChanged();
}
+
+/*!
+ \internal
+*/
+void QAudioInput::setDisconnectFunction(std::function<void()> disconnectFunction)
+{
+ if (d->disconnectFunction) {
+ auto df = d->disconnectFunction;
+ d->disconnectFunction = {};
+ df();
+ }
+ d->disconnectFunction = std::move(disconnectFunction);
+}
+
#include "moc_qaudioinput.cpp"
diff --git a/src/multimedia/audio/qaudioinput.h b/src/multimedia/audio/qaudioinput.h
index 10c3ae1c9..3b3154fb5 100644
--- a/src/multimedia/audio/qaudioinput.h
+++ b/src/multimedia/audio/qaudioinput.h
@@ -75,9 +75,10 @@ Q_SIGNALS:
void volumeChanged(float volume);
void mutedChanged(bool muted);
-public:
- QPlatformAudioInput *handle() const { return d; }
private:
+ QPlatformAudioInput *handle() const { return d; }
+ void setDisconnectFunction(std::function<void()> disconnectFunction);
+ friend class QMediaCaptureSession;
Q_DISABLE_COPY(QAudioInput)
QPlatformAudioInput *d = nullptr;
};
diff --git a/src/multimedia/platform/qplatformaudioinput_p.h b/src/multimedia/platform/qplatformaudioinput_p.h
index c4e4334b3..c1e3c1ecc 100644
--- a/src/multimedia/platform/qplatformaudioinput_p.h
+++ b/src/multimedia/platform/qplatformaudioinput_p.h
@@ -71,6 +71,7 @@ public:
QAudioDevice device;
float volume = 1.;
bool muted = false;
+ std::function<void()> disconnectFunction;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/recording/qmediacapturesession.cpp b/src/multimedia/recording/qmediacapturesession.cpp
index 55b223d90..c83a43153 100644
--- a/src/multimedia/recording/qmediacapturesession.cpp
+++ b/src/multimedia/recording/qmediacapturesession.cpp
@@ -174,6 +174,7 @@ QMediaCaptureSession::~QMediaCaptureSession()
}
if (d_ptr->imageCapture)
d_ptr->imageCapture->setCaptureSession(nullptr);
+ setAudioInput(nullptr);
d_ptr->setVideoSink(nullptr);
delete d_ptr->captureSession;
delete d_ptr;
@@ -199,10 +200,17 @@ QAudioInput *QMediaCaptureSession::audioInput() const
*/
void QMediaCaptureSession::setAudioInput(QAudioInput *input)
{
- if (d_ptr->audioInput == input)
+ QAudioInput *oldInput = d_ptr->audioInput;
+ if (oldInput == input)
return;
d_ptr->audioInput = input;
- d_ptr->captureSession->setAudioInput(input ? input->handle() : nullptr);
+ d_ptr->captureSession->setAudioInput(nullptr);
+ if (oldInput)
+ oldInput->setDisconnectFunction({});
+ if (input) {
+ input->setDisconnectFunction([this](){ setAudioInput(nullptr); });
+ d_ptr->captureSession->setAudioInput(input->handle());
+ }
emit audioInputChanged();
}