summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/multimedia/audio/qaudiooutput.cpp15
-rw-r--r--src/multimedia/audio/qaudiooutput.h6
-rw-r--r--src/multimedia/platform/qplatformaudiooutput_p.h1
-rw-r--r--src/multimedia/playback/qmediaplayer.cpp12
-rw-r--r--src/multimedia/recording/qmediacapturesession.cpp15
5 files changed, 41 insertions, 8 deletions
diff --git a/src/multimedia/audio/qaudiooutput.cpp b/src/multimedia/audio/qaudiooutput.cpp
index 275050a51..209ed63ca 100644
--- a/src/multimedia/audio/qaudiooutput.cpp
+++ b/src/multimedia/audio/qaudiooutput.cpp
@@ -100,6 +100,7 @@ QAudioOutput::QAudioOutput(const QAudioDevice &device, QObject *parent)
QAudioOutput::~QAudioOutput()
{
+ setDisconnectFunction({});
delete d;
}
@@ -221,4 +222,18 @@ void QAudioOutput::setDevice(const QAudioDevice &device)
emit deviceChanged();
}
+/*!
+ \internal
+*/
+void QAudioOutput::setDisconnectFunction(std::function<void()> disconnectFunction)
+{
+ if (d->disconnectFunction) {
+ auto df = d->disconnectFunction;
+ d->disconnectFunction = {};
+ df();
+ }
+ d->disconnectFunction = std::move(disconnectFunction);
+}
+
+
#include "moc_qaudiooutput.cpp"
diff --git a/src/multimedia/audio/qaudiooutput.h b/src/multimedia/audio/qaudiooutput.h
index 0f1461a55..24c142ca2 100644
--- a/src/multimedia/audio/qaudiooutput.h
+++ b/src/multimedia/audio/qaudiooutput.h
@@ -75,9 +75,11 @@ Q_SIGNALS:
void volumeChanged(float volume);
void mutedChanged(bool muted);
-public:
- QPlatformAudioOutput *handle() const { return d; }
private:
+ QPlatformAudioOutput *handle() const { return d; }
+ void setDisconnectFunction(std::function<void()> disconnectFunction);
+ friend class QMediaCaptureSession;
+ friend class QMediaPlayer;
Q_DISABLE_COPY(QAudioOutput)
QPlatformAudioOutput *d = nullptr;
};
diff --git a/src/multimedia/platform/qplatformaudiooutput_p.h b/src/multimedia/platform/qplatformaudiooutput_p.h
index 594d59ed0..300d20e46 100644
--- a/src/multimedia/platform/qplatformaudiooutput_p.h
+++ b/src/multimedia/platform/qplatformaudiooutput_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/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp
index b2abb6ec6..2fc4ad4df 100644
--- a/src/multimedia/playback/qmediaplayer.cpp
+++ b/src/multimedia/playback/qmediaplayer.cpp
@@ -263,6 +263,7 @@ QMediaPlayer::~QMediaPlayer()
// Disconnect everything to prevent notifying
// when a receiver is already destroyed.
disconnect();
+ setAudioOutput(nullptr);
d->setVideoSink(nullptr);
delete d->control;
@@ -653,10 +654,17 @@ void QMediaPlayer::setSourceDevice(QIODevice *device, const QUrl &sourceUrl)
void QMediaPlayer::setAudioOutput(QAudioOutput *output)
{
Q_D(QMediaPlayer);
- if (d->audioOutput == output)
+ auto oldOutput = d->audioOutput;
+ if (oldOutput == output)
return;
d->audioOutput = output;
- d->control->setAudioOutput(output ? output->handle() : nullptr);
+ d->control->setAudioOutput(nullptr);
+ if (oldOutput)
+ oldOutput->setDisconnectFunction({});
+ if (output) {
+ output->setDisconnectFunction([this](){ setAudioOutput(nullptr); });
+ d->control->setAudioOutput(output->handle());
+ }
emit audioOutputChanged();
}
diff --git a/src/multimedia/recording/qmediacapturesession.cpp b/src/multimedia/recording/qmediacapturesession.cpp
index c83a43153..2f6314f5d 100644
--- a/src/multimedia/recording/qmediacapturesession.cpp
+++ b/src/multimedia/recording/qmediacapturesession.cpp
@@ -175,6 +175,7 @@ QMediaCaptureSession::~QMediaCaptureSession()
if (d_ptr->imageCapture)
d_ptr->imageCapture->setCaptureSession(nullptr);
setAudioInput(nullptr);
+ setAudioOutput(nullptr);
d_ptr->setVideoSink(nullptr);
delete d_ptr->captureSession;
delete d_ptr;
@@ -379,11 +380,17 @@ QVideoSink *QMediaCaptureSession::videoSink() const
*/
void QMediaCaptureSession::setAudioOutput(QAudioOutput *output)
{
- Q_D(QMediaCaptureSession);
- if (d->audioOutput == output)
+ QAudioOutput *oldOutput = d_ptr->audioOutput;
+ if (oldOutput == output)
return;
- d->audioOutput = output;
- d->captureSession->setAudioOutput(output ? output->handle() : nullptr);
+ d_ptr->audioOutput = output;
+ d_ptr->captureSession->setAudioOutput(nullptr);
+ if (oldOutput)
+ oldOutput->setDisconnectFunction({});
+ if (output) {
+ output->setDisconnectFunction([this](){ setAudioOutput(nullptr); });
+ d_ptr->captureSession->setAudioOutput(output->handle());
+ }
emit audioOutputChanged();
}
/*!