diff options
author | Piotr Srebrny <piotr.srebrny@qt.io> | 2022-09-09 15:55:48 +0200 |
---|---|---|
committer | Piotr Srebrny <piotr.srebrny@qt.io> | 2022-09-26 14:35:28 +0200 |
commit | f1aa625049a08519d52ba87958e25cb80e47fd1e (patch) | |
tree | 32ec669d0c9f93e481173b37e3dc78c3ce1c4da8 /src/multimedia | |
parent | 953468d895413c738e7c8784c271f394e6c53a8d (diff) | |
download | qtmultimedia-f1aa625049a08519d52ba87958e25cb80e47fd1e.tar.gz |
Enable error reporting when failed to initialize backend element
This patch adds an option to report error message when a backend
component cannot be instantiated. This error message is then
displayed in the console with qWarning and in some cases reported
to the app user with error signals. We need further improvements
on the error reporting side.
Additionally, this patch cleans up the code in the .cpp API
classes.
Pick-to: 6.4
Change-Id: Id39865cc8f1e9b52804bf5b9d9b15e738508f860
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
Diffstat (limited to 'src/multimedia')
-rw-r--r-- | src/multimedia/audio/qaudiodecoder.cpp | 58 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiodecoder.h | 2 | ||||
-rw-r--r-- | src/multimedia/audio/qaudioinput.cpp | 14 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiooutput.cpp | 14 | ||||
-rw-r--r-- | src/multimedia/camera/qcamera.cpp | 45 | ||||
-rw-r--r-- | src/multimedia/camera/qimagecapture.cpp | 51 | ||||
-rw-r--r-- | src/multimedia/platform/qplatformmediaintegration.cpp | 4 | ||||
-rw-r--r-- | src/multimedia/platform/qplatformmediaintegration_p.h | 21 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplayer.cpp | 114 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplayer_p.h | 3 | ||||
-rw-r--r-- | src/multimedia/recording/qmediacapturesession.cpp | 51 | ||||
-rw-r--r-- | src/multimedia/recording/qmediarecorder.cpp | 14 | ||||
-rw-r--r-- | src/multimedia/recording/qmediarecorder_p.h | 1 | ||||
-rw-r--r-- | src/multimedia/video/qvideosink.cpp | 20 |
14 files changed, 193 insertions, 219 deletions
diff --git a/src/multimedia/audio/qaudiodecoder.cpp b/src/multimedia/audio/qaudiodecoder.cpp index c35f7b64f..015ecb2de 100644 --- a/src/multimedia/audio/qaudiodecoder.cpp +++ b/src/multimedia/audio/qaudiodecoder.cpp @@ -41,7 +41,12 @@ QT_BEGIN_NAMESPACE QAudioDecoder::QAudioDecoder(QObject *parent) : QObject(parent) { - decoder = QPlatformMediaIntegration::instance()->createAudioDecoder(this); + auto maybeDecoder = QPlatformMediaIntegration::instance()->createAudioDecoder(this); + if (maybeDecoder) { + decoder = maybeDecoder.value(); + } else { + qWarning() << "Failed to initialize QAudioDecoder" << maybeDecoder.error(); + } } @@ -55,7 +60,7 @@ QAudioDecoder::~QAudioDecoder() = default; */ bool QAudioDecoder::isSupported() const { - return decoder != nullptr; + return bool(decoder); } /*! @@ -73,9 +78,7 @@ bool QAudioDecoder::isDecoding() const */ QAudioDecoder::Error QAudioDecoder::error() const { - if (!decoder) - return NotSupportedError; - return decoder->error(); + return decoder ? decoder->error() : NotSupportedError; } /*! @@ -103,12 +106,11 @@ QString QAudioDecoder::errorString() const */ void QAudioDecoder::start() { - if (decoder == nullptr) + if (!decoder) return; // Reset error conditions decoder->clearError(); - decoder->start(); } @@ -117,10 +119,8 @@ void QAudioDecoder::start() */ void QAudioDecoder::stop() { - if (!decoder) - return; - - decoder->stop(); + if (decoder) + decoder->stop(); } /*! @@ -130,9 +130,7 @@ void QAudioDecoder::stop() */ QUrl QAudioDecoder::source() const { - if (decoder) - return decoder->source(); - return QString(); + return decoder ? decoder->source() : QString{}; } /*! @@ -159,9 +157,7 @@ void QAudioDecoder::setSource(const QUrl &fileName) */ QIODevice *QAudioDecoder::sourceDevice() const { - if (decoder) - return decoder->sourceDevice(); - return nullptr; + return decoder ? decoder->sourceDevice() : nullptr; } /*! @@ -175,9 +171,8 @@ QIODevice *QAudioDecoder::sourceDevice() const */ void QAudioDecoder::setSourceDevice(QIODevice *device) { - if (!decoder) - return; - decoder->setSourceDevice(device); + if (decoder) + decoder->setSourceDevice(device); } /*! @@ -190,9 +185,7 @@ void QAudioDecoder::setSourceDevice(QIODevice *device) */ QAudioFormat QAudioDecoder::audioFormat() const { - if (decoder) - return decoder->audioFormat(); - return QAudioFormat(); + return decoder ? decoder->audioFormat() : QAudioFormat{}; } /*! @@ -219,7 +212,7 @@ void QAudioDecoder::setAudioFormat(const QAudioFormat &format) if (isDecoding()) return; - if (decoder != nullptr) + if (decoder) decoder->setAudioFormat(format); } @@ -230,9 +223,7 @@ void QAudioDecoder::setAudioFormat(const QAudioFormat &format) */ bool QAudioDecoder::bufferAvailable() const { - if (decoder) - return decoder->bufferAvailable(); - return false; + return decoder && decoder->bufferAvailable(); } /*! @@ -242,9 +233,7 @@ bool QAudioDecoder::bufferAvailable() const qint64 QAudioDecoder::position() const { - if (decoder) - return decoder->position(); - return -1; + return decoder ? decoder->position() : -1; } /*! @@ -254,9 +243,7 @@ qint64 QAudioDecoder::position() const qint64 QAudioDecoder::duration() const { - if (decoder) - return decoder->duration(); - return -1; + return decoder ? decoder->duration() : -1; } /*! @@ -271,10 +258,7 @@ qint64 QAudioDecoder::duration() const QAudioBuffer QAudioDecoder::read() const { - if (decoder) - return decoder->read(); - - return QAudioBuffer(); + return decoder ? decoder->read() : QAudioBuffer{}; } // Enums diff --git a/src/multimedia/audio/qaudiodecoder.h b/src/multimedia/audio/qaudiodecoder.h index 8594736a4..4a7d6f00a 100644 --- a/src/multimedia/audio/qaudiodecoder.h +++ b/src/multimedia/audio/qaudiodecoder.h @@ -76,7 +76,7 @@ Q_SIGNALS: private: Q_DISABLE_COPY(QAudioDecoder) - QPlatformAudioDecoder *decoder; + QPlatformAudioDecoder *decoder = nullptr; }; QT_END_NAMESPACE diff --git a/src/multimedia/audio/qaudioinput.cpp b/src/multimedia/audio/qaudioinput.cpp index 8d151d404..f8c088e97 100644 --- a/src/multimedia/audio/qaudioinput.cpp +++ b/src/multimedia/audio/qaudioinput.cpp @@ -56,11 +56,17 @@ QAudioInput::QAudioInput(QObject *parent) {} QAudioInput::QAudioInput(const QAudioDevice &device, QObject *parent) - : QObject(parent), - d(QPlatformMediaIntegration::instance()->createAudioInput(this)) + : QObject(parent) { - d->device = device.mode() == QAudioDevice::Input ? device : QMediaDevices::defaultAudioInput(); - d->setAudioDevice(d->device); + auto maybeAudioInput = QPlatformMediaIntegration::instance()->createAudioInput(this); + if (maybeAudioInput) { + d = maybeAudioInput.value(); + d->device = device.mode() == QAudioDevice::Input ? device : QMediaDevices::defaultAudioInput(); + d->setAudioDevice(d->device); + } else { + d = new QPlatformAudioInput(nullptr); + qWarning() << "Failed to initialize QAudioInput" << maybeAudioInput.error(); + } } QAudioInput::~QAudioInput() diff --git a/src/multimedia/audio/qaudiooutput.cpp b/src/multimedia/audio/qaudiooutput.cpp index dd7b31a87..60cf0d476 100644 --- a/src/multimedia/audio/qaudiooutput.cpp +++ b/src/multimedia/audio/qaudiooutput.cpp @@ -55,11 +55,17 @@ QAudioOutput::QAudioOutput(QObject *parent) {} QAudioOutput::QAudioOutput(const QAudioDevice &device, QObject *parent) - : QObject(parent), - d(QPlatformMediaIntegration::instance()->createAudioOutput(this)) + : QObject(parent) { - d->device = device.mode() == QAudioDevice::Output ? device : QMediaDevices::defaultAudioOutput(); - d->setAudioDevice(d->device); + auto maybeAudioOutput = QPlatformMediaIntegration::instance()->createAudioOutput(this); + if (maybeAudioOutput) { + d = maybeAudioOutput.value(); + d->device = device.mode() == QAudioDevice::Output ? device : QMediaDevices::defaultAudioOutput(); + d->setAudioDevice(d->device); + } else { + d = new QPlatformAudioOutput(nullptr); + qWarning() << "Failed to initialize QAudioOutput" << maybeAudioOutput.error(); + } } QAudioOutput::~QAudioOutput() diff --git a/src/multimedia/camera/qcamera.cpp b/src/multimedia/camera/qcamera.cpp index 0a0052f7c..370a10dad 100644 --- a/src/multimedia/camera/qcamera.cpp +++ b/src/multimedia/camera/qcamera.cpp @@ -168,12 +168,14 @@ void QCameraPrivate::init(const QCameraDevice &device) { Q_Q(QCamera); - control = QPlatformMediaIntegration::instance()->createCamera(q); - if (!control) { - _q_error(QCamera::CameraError, QString::fromUtf8("Camera not supported")); + auto maybeControl = QPlatformMediaIntegration::instance()->createCamera(q); + if (!maybeControl) { + qWarning() << "Failed to initialize QCamera" << maybeControl.error(); + error = QCamera::CameraError; + errorString = maybeControl.error(); return; } - + control = maybeControl.value(); cameraDevice = !device.isNull() ? device : QMediaDevices::defaultVideoInput(); if (cameraDevice.isNull()) _q_error(QCamera::CameraError, QString::fromUtf8("No camera detected")); @@ -243,7 +245,6 @@ QCamera::~QCamera() Q_D(QCamera); if (d->captureSession) d->captureSession->setCamera(nullptr); - Q_ASSERT(!d->captureSession); } /*! @@ -614,9 +615,8 @@ QPointF QCamera::customFocusPoint() const void QCamera::setCustomFocusPoint(const QPointF &point) { Q_D(QCamera); - if (!d->control) - return; - d->control->setCustomFocusPoint(point); + if (d->control) + d->control->setCustomFocusPoint(point); } /*! @@ -672,7 +672,7 @@ float QCamera::focusDistance() const float QCamera::maximumZoomFactor() const { Q_D(const QCamera); - return d->control ? d->control->maxZoomFactor() : 1.; + return d->control ? d->control->maxZoomFactor() : 1.f; } /*! @@ -692,7 +692,7 @@ float QCamera::maximumZoomFactor() const float QCamera::minimumZoomFactor() const { Q_D(const QCamera); - return d->control ? d->control->minZoomFactor() : 1.; + return d->control ? d->control->minZoomFactor() : 1.f; } /*! @@ -712,14 +712,14 @@ float QCamera::minimumZoomFactor() const float QCamera::zoomFactor() const { Q_D(const QCamera); - return d->control ? d->control->zoomFactor() : 1.; + return d->control ? d->control->zoomFactor() : 1.f; } /*! Zooms to a zoom factor \a factor at a rate of 1 factor per second. */ void QCamera::setZoomFactor(float factor) { - zoomTo(factor, 0.); + zoomTo(factor, 0.f); } /*! @@ -745,9 +745,9 @@ void QCamera::setZoomFactor(float factor) */ void QCamera::zoomTo(float factor, float rate) { - Q_ASSERT(rate >= 0.); - if (rate < 0.) - rate = 0.; + Q_ASSERT(rate >= 0.f); + if (rate < 0.f) + rate = 0.f; Q_D(QCamera); if (!d->control) @@ -916,10 +916,7 @@ void QCamera::setExposureMode(QCamera::ExposureMode mode) bool QCamera::isExposureModeSupported(QCamera::ExposureMode mode) const { Q_D(const QCamera); - if (!d->control) - return false; - - return d->control->isExposureModeSupported(mode); + return d->control && d->control->isExposureModeSupported(mode); } /*! @@ -941,7 +938,7 @@ bool QCamera::isExposureModeSupported(QCamera::ExposureMode mode) const float QCamera::exposureCompensation() const { Q_D(const QCamera); - return d->control ? d->control->exposureCompensation() : 0.; + return d->control ? d->control->exposureCompensation() : 0.f; } void QCamera::setExposureCompensation(float ev) @@ -1039,7 +1036,7 @@ int QCamera::maximumIsoSensitivity() const float QCamera::minimumExposureTime() const { Q_D(const QCamera); - return d->control ? d->control->minExposureTime() : -1.; + return d->control ? d->control->minExposureTime() : -1.f; } /*! @@ -1048,7 +1045,7 @@ float QCamera::minimumExposureTime() const float QCamera::maximumExposureTime() const { Q_D(const QCamera); - return d->control ? d->control->maxExposureTime() : -1.; + return d->control ? d->control->maxExposureTime() : -1.f; } /*! @@ -1234,9 +1231,7 @@ void QCamera::setWhiteBalanceMode(QCamera::WhiteBalanceMode mode) bool QCamera::isWhiteBalanceModeSupported(QCamera::WhiteBalanceMode mode) const { Q_D(const QCamera); - if (!d->control) - return false; - return d->control->isWhiteBalanceModeSupported(mode); + return d->control && d->control->isWhiteBalanceModeSupported(mode); } /*! diff --git a/src/multimedia/camera/qimagecapture.cpp b/src/multimedia/camera/qimagecapture.cpp index e44558674..30672393b 100644 --- a/src/multimedia/camera/qimagecapture.cpp +++ b/src/multimedia/camera/qimagecapture.cpp @@ -82,8 +82,16 @@ QImageCapture::QImageCapture(QObject *parent) { Q_D(QImageCapture); d->q_ptr = this; - d->control = QPlatformMediaIntegration::instance()->createImageCapture(this); + auto maybeControl = QPlatformMediaIntegration::instance()->createImageCapture(this); + if (!maybeControl) { + qWarning() << "Failed to initialize QImageCapture" << maybeControl.error(); + d->errorString = maybeControl.error(); + d->error = NotReadyError; + return; + } + + d->control = maybeControl.value(); connect(d->control, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int))); connect(d->control, SIGNAL(imageCaptured(int,QImage)), @@ -125,7 +133,7 @@ QImageCapture::~QImageCapture() */ bool QImageCapture::isAvailable() const { - return d_func()->captureSession && d_func()->captureSession->camera(); + return d_func()->control && d_func()->captureSession && d_func()->captureSession->camera(); } /*! @@ -183,7 +191,8 @@ void QImageCapture::setMetaData(const QMediaMetaData &metaData) { Q_D(QImageCapture); d->metaData = metaData; - d->control->setMetaData(d->metaData); + if (d->control) + d->control->setMetaData(d->metaData); emit metaDataChanged(); } @@ -249,14 +258,13 @@ bool QImageCapture::isReadyForCapture() const int QImageCapture::captureToFile(const QString &file) { Q_D(QImageCapture); - - d->unsetError(); - if (!d->control) { - d->_q_error(-1, NotSupportedFeatureError, QPlatformImageCapture::msgCameraNotReady()); + d->_q_error(-1, d->error, d->errorString); return -1; } + d->unsetError(); + if (!isReadyForCapture()) { d->_q_error(-1, NotReadyError, tr("Could not capture in stopped state")); return -1; @@ -280,18 +288,13 @@ int QImageCapture::captureToFile(const QString &file) int QImageCapture::capture() { Q_D(QImageCapture); - - d->unsetError(); - - if (d->control) + if (!d->control) { + d->_q_error(-1, d->error, d->errorString); + return -1; + } else { + d->unsetError(); return d->control->captureToBuffer(); - - d->error = NotSupportedFeatureError; - d->errorString = tr("Device does not support images capture."); - - d->_q_error(-1, d->error, d->errorString); - - return -1; + } } /*! @@ -346,9 +349,7 @@ int QImageCapture::capture() QImageCapture::FileFormat QImageCapture::fileFormat() const { Q_D(const QImageCapture); - if (!d->control) - return UnspecifiedFormat; - return d->control->imageSettings().format(); + return d->control ? d->control->imageSettings().format() : UnspecifiedFormat; } /*! @@ -425,9 +426,7 @@ QString QImageCapture::fileFormatDescription(QImageCapture::FileFormat f) QSize QImageCapture::resolution() const { Q_D(const QImageCapture); - if (!d->control) - return QSize(); - return d->control->imageSettings().resolution(); + return d->control ? d->control->imageSettings().resolution() : QSize{}; } /*! @@ -478,9 +477,7 @@ void QImageCapture::setResolution(int width, int height) QImageCapture::Quality QImageCapture::quality() const { Q_D(const QImageCapture); - if (!d->control) - return NormalQuality; - return d->control->imageSettings().quality(); + return d->control ? d->control->imageSettings().quality() : NormalQuality; } /*! diff --git a/src/multimedia/platform/qplatformmediaintegration.cpp b/src/multimedia/platform/qplatformmediaintegration.cpp index 712d8a47f..e97dca08c 100644 --- a/src/multimedia/platform/qplatformmediaintegration.cpp +++ b/src/multimedia/platform/qplatformmediaintegration.cpp @@ -104,12 +104,12 @@ QList<QCameraDevice> QPlatformMediaIntegration::videoInputs() return m_videoDevices ? m_videoDevices->videoDevices() : QList<QCameraDevice>{}; } -QPlatformAudioInput *QPlatformMediaIntegration::createAudioInput(QAudioInput *q) +QMaybe<QPlatformAudioInput *> QPlatformMediaIntegration::createAudioInput(QAudioInput *q) { return new QPlatformAudioInput(q); } -QPlatformAudioOutput *QPlatformMediaIntegration::createAudioOutput(QAudioOutput *q) +QMaybe<QPlatformAudioOutput *> QPlatformMediaIntegration::createAudioOutput(QAudioOutput *q) { return new QPlatformAudioOutput(q); } diff --git a/src/multimedia/platform/qplatformmediaintegration_p.h b/src/multimedia/platform/qplatformmediaintegration_p.h index 6e60e41bc..771063972 100644 --- a/src/multimedia/platform/qplatformmediaintegration_p.h +++ b/src/multimedia/platform/qplatformmediaintegration_p.h @@ -15,7 +15,9 @@ // #include <private/qtmultimediaglobal_p.h> +#include <private/qmultimediautils_p.h> #include <qmediarecorder.h> +#include <qstring.h> QT_BEGIN_NAMESPACE @@ -46,6 +48,7 @@ class QPlatformVideoDevices; class Q_MULTIMEDIA_EXPORT QPlatformMediaIntegration { + inline static const QString notAvailable = QStringLiteral("Not available"); public: static QPlatformMediaIntegration *instance(); @@ -56,19 +59,19 @@ public: virtual QPlatformMediaFormatInfo *formatInfo() = 0; virtual QList<QCameraDevice> videoInputs(); - virtual QPlatformCamera *createCamera(QCamera *) { return nullptr; } + virtual QMaybe<QPlatformCamera *> createCamera(QCamera *) { return notAvailable; } virtual QPlatformScreenCapture *createScreenCapture(QScreenCapture *) { return nullptr; } - virtual QPlatformAudioDecoder *createAudioDecoder(QAudioDecoder *) { return nullptr; } - virtual QPlatformMediaCaptureSession *createCaptureSession() { return nullptr; } - virtual QPlatformMediaPlayer *createPlayer(QMediaPlayer *) { return nullptr; } - virtual QPlatformMediaRecorder *createRecorder(QMediaRecorder *) { return nullptr; } - virtual QPlatformImageCapture *createImageCapture(QImageCapture *) { return nullptr; } + virtual QMaybe<QPlatformAudioDecoder *> createAudioDecoder(QAudioDecoder *) { return notAvailable; } + virtual QMaybe<QPlatformMediaCaptureSession *> createCaptureSession() { return notAvailable; } + virtual QMaybe<QPlatformMediaPlayer *> createPlayer(QMediaPlayer *) { return notAvailable; } + virtual QMaybe<QPlatformMediaRecorder *> createRecorder(QMediaRecorder *) { return notAvailable; } + virtual QMaybe<QPlatformImageCapture *> createImageCapture(QImageCapture *) { return notAvailable; } - virtual QPlatformAudioInput *createAudioInput(QAudioInput *); - virtual QPlatformAudioOutput *createAudioOutput(QAudioOutput *); + virtual QMaybe<QPlatformAudioInput *> createAudioInput(QAudioInput *); + virtual QMaybe<QPlatformAudioOutput *> createAudioOutput(QAudioOutput *); - virtual QPlatformVideoSink *createVideoSink(QVideoSink *) { return nullptr; } + virtual QMaybe<QPlatformVideoSink *> createVideoSink(QVideoSink *) { return notAvailable; } protected: QPlatformVideoDevices *m_videoDevices = nullptr; diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp index 04a1e4a09..947d27e64 100644 --- a/src/multimedia/playback/qmediaplayer.cpp +++ b/src/multimedia/playback/qmediaplayer.cpp @@ -233,14 +233,14 @@ QMediaPlayer::QMediaPlayer(QObject *parent) { Q_D(QMediaPlayer); - d->control = QPlatformMediaIntegration::instance()->createPlayer(this); - if (!d->control) { // ### Should this be an assertion? - d->setError(QMediaPlayer::ResourceError, QMediaPlayer::tr("Platform does not support media playback.")); - return; + auto maybeControl = QPlatformMediaIntegration::instance()->createPlayer(this); + if (maybeControl) { + d->control = maybeControl.value(); + d->state = d->control->state(); + } else { + qWarning() << "Failed to initialize QMediaPlayer" << maybeControl.error(); + d->setError(QMediaPlayer::ResourceError, maybeControl.error()); } - Q_ASSERT(d->control); - - d->state = d->control->state(); } @@ -289,7 +289,7 @@ QMediaPlayer::PlaybackState QMediaPlayer::playbackState() const // In case if EndOfMedia status is already received // but state is not. - if (d->control != nullptr + if (d->control && d->control->mediaStatus() == QMediaPlayer::EndOfMedia && d->state != d->control->state()) { return d->control->state(); @@ -314,11 +314,7 @@ QMediaPlayer::MediaStatus QMediaPlayer::mediaStatus() const qint64 QMediaPlayer::duration() const { Q_D(const QMediaPlayer); - - if (d->control != nullptr) - return d->control->duration(); - - return 0; + return d->control ? d->control->duration() : 0; } /*! @@ -331,11 +327,7 @@ qint64 QMediaPlayer::duration() const qint64 QMediaPlayer::position() const { Q_D(const QMediaPlayer); - - if (d->control != nullptr) - return d->control->position(); - - return 0; + return d->control ? d->control->position() : 0; } /*! @@ -350,11 +342,7 @@ qint64 QMediaPlayer::position() const float QMediaPlayer::bufferProgress() const { Q_D(const QMediaPlayer); - - if (d->control != nullptr) - return d->control->bufferProgress(); - - return 0.; + return d->control ? d->control->bufferProgress() : 0; } /*! @@ -369,11 +357,7 @@ float QMediaPlayer::bufferProgress() const QMediaTimeRange QMediaPlayer::bufferedTimeRange() const { Q_D(const QMediaPlayer); - - if (d->control) - return d->control->availablePlaybackRanges(); - - return {}; + return d->control ? d->control->availablePlaybackRanges() : QMediaTimeRange{}; } /*! @@ -389,11 +373,7 @@ QMediaTimeRange QMediaPlayer::bufferedTimeRange() const bool QMediaPlayer::hasAudio() const { Q_D(const QMediaPlayer); - - if (d->control != nullptr) - return d->control->isAudioAvailable(); - - return false; + return d->control && d->control->isAudioAvailable(); } /*! @@ -409,11 +389,7 @@ bool QMediaPlayer::hasAudio() const bool QMediaPlayer::hasVideo() const { Q_D(const QMediaPlayer); - - if (d->control != nullptr) - return d->control->isVideoAvailable(); - - return false; + return d->control && d->control->isVideoAvailable(); } /*! @@ -425,11 +401,7 @@ bool QMediaPlayer::hasVideo() const bool QMediaPlayer::isSeekable() const { Q_D(const QMediaPlayer); - - if (d->control != nullptr) - return d->control->isSeekable(); - - return false; + return d->control && d->control->isSeekable(); } /*! @@ -438,11 +410,7 @@ bool QMediaPlayer::isSeekable() const qreal QMediaPlayer::playbackRate() const { Q_D(const QMediaPlayer); - - if (d->control != nullptr) - return d->control->playbackRate(); - - return 0.0; + return d->control ? d->control->playbackRate() : 0.; } /*! @@ -474,11 +442,7 @@ qreal QMediaPlayer::playbackRate() const int QMediaPlayer::loops() const { Q_D(const QMediaPlayer); - - if (d->control) - return d->control->loops(); - - return 1; + return d->control ? d->control->loops() : 1; } void QMediaPlayer::setLoops(int loops) @@ -559,7 +523,7 @@ void QMediaPlayer::pause() { Q_D(QMediaPlayer); - if (d->control != nullptr) + if (d->control) d->control->pause(); } @@ -580,7 +544,7 @@ void QMediaPlayer::stop() { Q_D(QMediaPlayer); - if (d->control != nullptr) + if (d->control) d->control->stop(); } @@ -588,7 +552,7 @@ void QMediaPlayer::setPosition(qint64 position) { Q_D(QMediaPlayer); - if (d->control == nullptr) + if (!d->control) return; if (!d->control->isSeekable()) return; @@ -599,7 +563,7 @@ void QMediaPlayer::setPlaybackRate(qreal rate) { Q_D(QMediaPlayer); - if (d->control != nullptr) + if (d->control) d->control->setPlaybackRate(rate); } @@ -696,12 +660,14 @@ void QMediaPlayer::setAudioOutput(QAudioOutput *output) if (oldOutput == output) return; d->audioOutput = output; - d->control->setAudioOutput(nullptr); + if (d->control) + d->control->setAudioOutput(nullptr); if (oldOutput) oldOutput->setDisconnectFunction({}); if (output) { output->setDisconnectFunction([this](){ setAudioOutput(nullptr); }); - d->control->setAudioOutput(output->handle()); + if (d->control) + d->control->setAudioOutput(output->handle()); } emit audioOutputChanged(); } @@ -807,9 +773,7 @@ QList<QMediaMetaData> QMediaPlayer::subtitleTracks() const int QMediaPlayer::activeAudioTrack() const { Q_D(const QMediaPlayer); - if (d->control) - return d->control->activeTrack(QPlatformMediaPlayer::AudioStream); - return 0; + return d->control ? d->control->activeTrack(QPlatformMediaPlayer::AudioStream) : 0; } /*! @@ -833,9 +797,7 @@ int QMediaPlayer::activeAudioTrack() const int QMediaPlayer::activeVideoTrack() const { Q_D(const QMediaPlayer); - if (d->control) - return d->control->activeTrack(QPlatformMediaPlayer::VideoStream); - return -1; + return d->control ? d->control->activeTrack(QPlatformMediaPlayer::VideoStream) : -1; } /*! @@ -859,9 +821,7 @@ int QMediaPlayer::activeVideoTrack() const int QMediaPlayer::activeSubtitleTrack() const { Q_D(const QMediaPlayer); - if (d->control) - return d->control->activeTrack(QPlatformMediaPlayer::SubtitleStream); - return -1; + return d->control ? d->control->activeTrack(QPlatformMediaPlayer::SubtitleStream) : -1; } void QMediaPlayer::setActiveAudioTrack(int index) @@ -925,16 +885,13 @@ QObject *QMediaPlayer::videoOutput() const void QMediaPlayer::setVideoOutput(QObject *output) { Q_D(QMediaPlayer); - if (!d->control) - return; if (d->videoOutput == output) return; - QVideoSink *sink = qobject_cast<QVideoSink *>(output); + auto *sink = qobject_cast<QVideoSink *>(output); if (!sink && output) { auto *mo = output->metaObject(); - if (output) - mo->invokeMethod(output, "videoSink", Q_RETURN_ARG(QVideoSink *, sink)); + mo->invokeMethod(output, "videoSink", Q_RETURN_ARG(QVideoSink *, sink)); } d->videoOutput = output; d->setVideoSink(sink); @@ -943,9 +900,6 @@ void QMediaPlayer::setVideoOutput(QObject *output) void QMediaPlayer::setVideoSink(QVideoSink *sink) { Q_D(QMediaPlayer); - if (!d->control) - return; - d->videoOutput = nullptr; d->setVideoSink(sink); } @@ -980,11 +934,7 @@ void QMediaPlayer::setVideoOutput(const QList<QVideoSink *> &sinks) bool QMediaPlayer::isAvailable() const { Q_D(const QMediaPlayer); - - if (!d->control) - return false; - - return true; + return bool(d->control); } /*! @@ -1009,7 +959,7 @@ bool QMediaPlayer::isAvailable() const QMediaMetaData QMediaPlayer::metaData() const { Q_D(const QMediaPlayer); - return d->control->metaData(); + return d->control ? d->control->metaData() : QMediaMetaData{}; } // Enums diff --git a/src/multimedia/playback/qmediaplayer_p.h b/src/multimedia/playback/qmediaplayer_p.h index db8412ef8..ce9bf091e 100644 --- a/src/multimedia/playback/qmediaplayer_p.h +++ b/src/multimedia/playback/qmediaplayer_p.h @@ -72,7 +72,8 @@ public: videoSink = sink; if (sink) sink->setSource(q); - control->setVideoSink(sink); + if (control) + control->setVideoSink(sink); emit q->videoOutputChanged(); } }; diff --git a/src/multimedia/recording/qmediacapturesession.cpp b/src/multimedia/recording/qmediacapturesession.cpp index 4cd04804f..cb663b0ce 100644 --- a/src/multimedia/recording/qmediacapturesession.cpp +++ b/src/multimedia/recording/qmediacapturesession.cpp @@ -22,7 +22,7 @@ class QMediaCaptureSessionPrivate { public: QMediaCaptureSession *q = nullptr; - QPlatformMediaCaptureSession *captureSession; + QPlatformMediaCaptureSession *captureSession = nullptr; QAudioInput *audioInput = nullptr; QAudioOutput *audioOutput = nullptr; QCamera *camera = nullptr; @@ -41,7 +41,8 @@ public: videoSink = sink; if (sink) sink->setSource(q); - captureSession->setVideoPreview(sink); + if (captureSession) + captureSession->setVideoPreview(sink); emit q->videoOutputChanged(); } @@ -126,9 +127,13 @@ QMediaCaptureSession::QMediaCaptureSession(QObject *parent) d_ptr(new QMediaCaptureSessionPrivate) { d_ptr->q = this; - d_ptr->captureSession = QPlatformMediaIntegration::instance()->createCaptureSession(); - d_ptr->captureSession->setCaptureSession(this); - Q_ASSERT(d_ptr->captureSession); + auto maybeCaptureSession = QPlatformMediaIntegration::instance()->createCaptureSession(); + if (maybeCaptureSession) { + d_ptr->captureSession = maybeCaptureSession.value(); + d_ptr->captureSession->setCaptureSession(this); + } else { + qWarning() << "Failed to initialize QMediaCaptureSession" << maybeCaptureSession.error(); + } } /*! @@ -170,12 +175,14 @@ void QMediaCaptureSession::setAudioInput(QAudioInput *input) if (oldInput == input) return; d_ptr->audioInput = input; - d_ptr->captureSession->setAudioInput(nullptr); + if (d_ptr->captureSession) + d_ptr->captureSession->setAudioInput(nullptr); if (oldInput) oldInput->setDisconnectFunction({}); if (input) { input->setDisconnectFunction([this](){ setAudioInput(nullptr); }); - d_ptr->captureSession->setAudioInput(input->handle()); + if (d_ptr->captureSession) + d_ptr->captureSession->setAudioInput(input->handle()); } emit audioInputChanged(); } @@ -208,7 +215,8 @@ void QMediaCaptureSession::setCamera(QCamera *camera) if (oldCamera == camera) return; d_ptr->camera = camera; - d_ptr->captureSession->setCamera(nullptr); + if (d_ptr->captureSession) + d_ptr->captureSession->setCamera(nullptr); if (oldCamera) { if (oldCamera->captureSession() && oldCamera->captureSession() != this) oldCamera->captureSession()->setCamera(nullptr); @@ -217,7 +225,8 @@ void QMediaCaptureSession::setCamera(QCamera *camera) if (camera) { if (camera->captureSession()) camera->captureSession()->setCamera(nullptr); - d_ptr->captureSession->setCamera(camera->platformCamera()); + if (d_ptr->captureSession) + d_ptr->captureSession->setCamera(camera->platformCamera()); camera->setCaptureSession(this); } emit cameraChanged(); @@ -251,7 +260,8 @@ void QMediaCaptureSession::setScreenCapture(QScreenCapture *screenCapture) if (oldScreenCapture == screenCapture) return; d_ptr->screenCapture = screenCapture; - d_ptr->captureSession->setScreenCapture(nullptr); + if (d_ptr->captureSession) + d_ptr->captureSession->setScreenCapture(nullptr); if (oldScreenCapture) { if (oldScreenCapture->captureSession() && oldScreenCapture->captureSession() != this) oldScreenCapture->captureSession()->setScreenCapture(nullptr); @@ -260,7 +270,8 @@ void QMediaCaptureSession::setScreenCapture(QScreenCapture *screenCapture) if (screenCapture) { if (screenCapture->captureSession()) screenCapture->captureSession()->setScreenCapture(nullptr); - d_ptr->captureSession->setScreenCapture(screenCapture->platformScreenCapture()); + if (d_ptr->captureSession) + d_ptr->captureSession->setScreenCapture(screenCapture->platformScreenCapture()); screenCapture->setCaptureSession(this); } emit screenCaptureChanged(); @@ -292,7 +303,8 @@ void QMediaCaptureSession::setImageCapture(QImageCapture *imageCapture) if (oldImageCapture == imageCapture) return; d_ptr->imageCapture = imageCapture; - d_ptr->captureSession->setImageCapture(nullptr); + if (d_ptr->captureSession) + d_ptr->captureSession->setImageCapture(nullptr); if (oldImageCapture) { if (oldImageCapture->captureSession() && oldImageCapture->captureSession() != this) oldImageCapture->captureSession()->setImageCapture(nullptr); @@ -301,7 +313,8 @@ void QMediaCaptureSession::setImageCapture(QImageCapture *imageCapture) if (imageCapture) { if (imageCapture->captureSession()) imageCapture->captureSession()->setImageCapture(nullptr); - d_ptr->captureSession->setImageCapture(imageCapture->platformImageCapture()); + if (d_ptr->captureSession) + d_ptr->captureSession->setImageCapture(imageCapture->platformImageCapture()); imageCapture->setCaptureSession(this); } emit imageCaptureChanged(); @@ -334,7 +347,8 @@ void QMediaCaptureSession::setRecorder(QMediaRecorder *recorder) if (oldRecorder == recorder) return; d_ptr->recorder = recorder; - d_ptr->captureSession->setMediaRecorder(nullptr); + if (d_ptr->captureSession) + d_ptr->captureSession->setMediaRecorder(nullptr); if (oldRecorder) { if (oldRecorder->captureSession() && oldRecorder->captureSession() != this) oldRecorder->captureSession()->setRecorder(nullptr); @@ -343,7 +357,8 @@ void QMediaCaptureSession::setRecorder(QMediaRecorder *recorder) if (recorder) { if (recorder->captureSession()) recorder->captureSession()->setRecorder(nullptr); - d_ptr->captureSession->setMediaRecorder(recorder->platformRecoder()); + if (d_ptr->captureSession) + d_ptr->captureSession->setMediaRecorder(recorder->platformRecoder()); recorder->setCaptureSession(this); } emit recorderChanged(); @@ -414,12 +429,14 @@ void QMediaCaptureSession::setAudioOutput(QAudioOutput *output) if (oldOutput == output) return; d_ptr->audioOutput = output; - d_ptr->captureSession->setAudioOutput(nullptr); + if (d_ptr->captureSession) + d_ptr->captureSession->setAudioOutput(nullptr); if (oldOutput) oldOutput->setDisconnectFunction({}); if (output) { output->setDisconnectFunction([this](){ setAudioOutput(nullptr); }); - d_ptr->captureSession->setAudioOutput(output->handle()); + if (d_ptr->captureSession) + d_ptr->captureSession->setAudioOutput(output->handle()); } emit audioOutputChanged(); } diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp index 9faf11591..b88d1f425 100644 --- a/src/multimedia/recording/qmediarecorder.cpp +++ b/src/multimedia/recording/qmediarecorder.cpp @@ -108,7 +108,13 @@ QMediaRecorder::QMediaRecorder(QObject *parent) { Q_D(QMediaRecorder); d->q_ptr = this; - d->control = QPlatformMediaIntegration::instance()->createRecorder(this); + auto maybeControl = QPlatformMediaIntegration::instance()->createRecorder(this); + if (maybeControl) { + d->control = maybeControl.value(); + } else { + d->initErrorMessage = maybeControl.error(); + qWarning() << "Failed to initialize QMediaRecorder" << maybeControl.error(); + } } /*! @@ -192,7 +198,7 @@ void QMediaRecorder::setCaptureSession(QMediaCaptureSession *session) */ bool QMediaRecorder::isAvailable() const { - return d_func()->control != nullptr && d_func()->captureSession; + return d_func()->control && d_func()->captureSession; } QUrl QMediaRecorder::outputLocation() const @@ -204,7 +210,7 @@ void QMediaRecorder::setOutputLocation(const QUrl &location) { Q_D(QMediaRecorder); if (!d->control) { - emit errorOccurred(QMediaRecorder::ResourceError, tr("Not available")); + emit errorOccurred(QMediaRecorder::ResourceError, d->initErrorMessage); return; } d->control->setOutputLocation(location); @@ -258,7 +264,7 @@ QString QMediaRecorder::errorString() const { Q_D(const QMediaRecorder); - return d->control ? d->control->errorString() : tr("QMediaRecorder not supported on this platform"); + return d->control ? d->control->errorString() : d->initErrorMessage; } /*! \qmlproperty qint64 QtMultimedia::MediaRecorder::duration diff --git a/src/multimedia/recording/qmediarecorder_p.h b/src/multimedia/recording/qmediarecorder_p.h index 618106848..193aa5f00 100644 --- a/src/multimedia/recording/qmediarecorder_p.h +++ b/src/multimedia/recording/qmediarecorder_p.h @@ -37,6 +37,7 @@ public: QMediaCaptureSession *captureSession = nullptr; QPlatformMediaRecorder *control = nullptr; + QString initErrorMessage; bool settingsChanged = false; diff --git a/src/multimedia/video/qvideosink.cpp b/src/multimedia/video/qvideosink.cpp index 22c8b1bb0..3597255d5 100644 --- a/src/multimedia/video/qvideosink.cpp +++ b/src/multimedia/video/qvideosink.cpp @@ -22,7 +22,12 @@ public: QVideoSinkPrivate(QVideoSink *q) : q_ptr(q) { - videoSink = QPlatformMediaIntegration::instance()->createVideoSink(q); + auto maybeVideoSink = QPlatformMediaIntegration::instance()->createVideoSink(q); + if (maybeVideoSink) { + videoSink = maybeVideoSink.value(); + } else { + qWarning() << "Failed to create QVideoSink" << maybeVideoSink.error(); + } } ~QVideoSinkPrivate() { @@ -109,7 +114,8 @@ void QVideoSink::setRhi(QRhi *rhi) if (d->rhi == rhi) return; d->rhi = rhi; - d->videoSink->setRhi(rhi); + if (d->videoSink) + d->videoSink->setRhi(rhi); } /*! @@ -125,7 +131,7 @@ QPlatformVideoSink *QVideoSink::platformVideoSink() const */ QVideoFrame QVideoSink::videoFrame() const { - return d->videoSink->currentVideoFrame(); + return d->videoSink ? d->videoSink->currentVideoFrame() : QVideoFrame{}; } /*! @@ -133,7 +139,8 @@ QVideoFrame QVideoSink::videoFrame() const */ void QVideoSink::setVideoFrame(const QVideoFrame &frame) { - d->videoSink->setVideoFrame(frame); + if (d->videoSink) + d->videoSink->setVideoFrame(frame); } /*! @@ -141,7 +148,7 @@ void QVideoSink::setVideoFrame(const QVideoFrame &frame) */ QString QVideoSink::subtitleText() const { - return d->videoSink->subtitleText(); + return d->videoSink ? d->videoSink->subtitleText() : QString{}; } /*! @@ -149,7 +156,8 @@ QString QVideoSink::subtitleText() const */ void QVideoSink::setSubtitleText(const QString &subtitle) { - d->videoSink->setSubtitleText(subtitle); + if (d->videoSink) + d->videoSink->setSubtitleText(subtitle); } /*! |