diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/multimedia/audio/qaudiooutput.cpp | 15 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiooutput.h | 6 | ||||
-rw-r--r-- | src/multimedia/platform/qplatformaudiooutput_p.h | 1 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplayer.cpp | 12 | ||||
-rw-r--r-- | src/multimedia/recording/qmediacapturesession.cpp | 15 |
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(); } /*! |