summaryrefslogtreecommitdiffstats
path: root/src/multimedia/playback
diff options
context:
space:
mode:
authorPiotr Srebrny <piotr.srebrny@qt.io>2021-09-22 10:33:14 +0200
committerPiotr Srebrny <piotr.srebrny@qt.io>2021-09-29 16:28:30 +0000
commitb4879defbca4594854e5a8e730e1061e217a7b44 (patch)
tree866dc355efa8f6032abbee7c1b87912f577230ae /src/multimedia/playback
parent1d1c4dbf2aa81ff9fc9e386283791ca39deb227f (diff)
Disconnect QAudioOutput from capture session and player in destructor
The expected behavior of elements connected to the capture session and the player is to disconnect automatically when deleted. This patch adds this behavior to the QAudioOutput object. Additionally, this patch enables automatic handover of QAudioOutput between two capture sessions or a capture session and a player. Pick-to: 6.2 Change-Id: I75e5135c54bd11b33876db317cf306d9255f38ce Reviewed-by: André de la Rocha <andre.rocha@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia/playback')
-rw-r--r--src/multimedia/playback/qmediaplayer.cpp12
1 files changed, 10 insertions, 2 deletions
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();
}