diff options
author | Piotr Srebrny <piotr.srebrny@qt.io> | 2021-09-22 10:33:14 +0200 |
---|---|---|
committer | Piotr Srebrny <piotr.srebrny@qt.io> | 2021-09-29 16:28:30 +0000 |
commit | b4879defbca4594854e5a8e730e1061e217a7b44 (patch) | |
tree | 866dc355efa8f6032abbee7c1b87912f577230ae /src/multimedia/playback | |
parent | 1d1c4dbf2aa81ff9fc9e386283791ca39deb227f (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.cpp | 12 |
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(); } |