diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-03-05 22:54:29 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-03-18 12:19:01 +0000 |
commit | 2c24e1e70e36f1606aca16539b60114b6673e5d6 (patch) | |
tree | 7ec6101fb3a5f0bf8e3e22472682f8a983b0e570 | |
parent | 1509fb905fc1583b7ed3118b0c50c1989e086b2b (diff) |
Move the audio input settings from the encoder to the capture session
This is closer to where those settings should be. They certainly
don't belong into the media encoder.
Change-Id: I45801ee7c875600719052b6ae41e1ea5c04e4389
Reviewed-by: Doris Verria <doris.verria@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
25 files changed, 279 insertions, 347 deletions
diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp index eeb0ad407..580d7c390 100644 --- a/examples/multimediawidgets/camera/camera.cpp +++ b/examples/multimediawidgets/camera/camera.cpp @@ -241,7 +241,7 @@ void Camera::stop() void Camera::setMuted(bool muted) { - m_mediaEncoder->setMuted(muted); + m_captureSession.setMuted(muted); } void Camera::takeImage() diff --git a/src/imports/multimedia/qdeclarativecamerarecorder.cpp b/src/imports/multimedia/qdeclarativecamerarecorder.cpp index 8044230a1..b61d97177 100644 --- a/src/imports/multimedia/qdeclarativecamerarecorder.cpp +++ b/src/imports/multimedia/qdeclarativecamerarecorder.cpp @@ -75,8 +75,9 @@ QT_BEGIN_NAMESPACE \sa QAudioEncoderSettings, QVideoEncoderSettings */ -QDeclarativeCameraRecorder::QDeclarativeCameraRecorder(QMediaCaptureSession *session, QObject *parent) : - QObject(parent) +QDeclarativeCameraRecorder::QDeclarativeCameraRecorder(QMediaCaptureSession *session, QObject *parent) + : QObject(parent), + m_captureSession(session) { m_encoder = new QMediaEncoder(this); session->setEncoder(m_encoder); @@ -551,12 +552,12 @@ qint64 QDeclarativeCameraRecorder::duration() const */ bool QDeclarativeCameraRecorder::isMuted() const { - return m_encoder->isMuted(); + return m_captureSession->isMuted(); } void QDeclarativeCameraRecorder::setMuted(bool muted) { - m_encoder->setMuted(muted); + m_captureSession->setMuted(muted); } /*! diff --git a/src/imports/multimedia/qdeclarativecamerarecorder_p.h b/src/imports/multimedia/qdeclarativecamerarecorder_p.h index 4ea3f9a2f..a2444ca1d 100644 --- a/src/imports/multimedia/qdeclarativecamerarecorder_p.h +++ b/src/imports/multimedia/qdeclarativecamerarecorder_p.h @@ -211,6 +211,7 @@ private: friend class QDeclarativeCamera; QDeclarativeCameraRecorder(QMediaCaptureSession *session, QObject *parent = 0); + QMediaCaptureSession *m_captureSession = nullptr; QMediaEncoder *m_encoder = nullptr; QDeclarativeMediaMetaData *m_metaData = nullptr; diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp index 5dbd1d107..f2a943fb7 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp @@ -46,6 +46,8 @@ #include "qandroidcamerasession_p.h" #include "qandroidcameravideorenderercontrol_p.h" #include "qandroidcameraimagecapturecontrol_p.h" +#include "qmediadevicemanager.h" +#include "qaudiodeviceinfo.h" QT_BEGIN_NAMESPACE @@ -90,6 +92,52 @@ QPlatformMediaRecorder *QAndroidCaptureService::mediaRecorderControl() return m_recorderControl; } + +bool QAndroidCaptureService::isMuted() const +{ + // No API for this in Android + return false; +} + +void QAndroidCaptureService::setMuted(bool muted) +{ + // No API for this in Android + Q_UNUSED(muted); + qWarning("QMediaRecorder::setMuted() is not supported on Android."); +} + +qreal QAndroidCaptureService::volume() const +{ + // No API for this in Android + return 1.0; +} + +void QAndroidCaptureService::setVolume(qreal volume) +{ + // No API for this in Android + Q_UNUSED(volume); + qWarning("QMediaRecorder::setVolume() is not supported on Android."); +} + +QAudioDeviceInfo QAndroidCaptureService::audioInput() const +{ + QMediaDeviceManager *manager = QMediaDeviceManager::instance(); + const auto devices = manager->audioInputs(); + QByteArray id = m_captureSession->audioInput().toLatin1(); + + for (auto c : devices) { + if (c.id() == id) + return c; + } + return manager->defaultAudioInput(); +} + +bool QAndroidCaptureService::setAudioInput(const QAudioDeviceInfo &info) +{ + m_captureSession->setAudioInput(QString::fromLatin1(info.id())); + return true; +} + void QAndroidCaptureService::setVideoPreview(QAbstractVideoSurface *surface) { m_captureSession->setVideoSurface(surface); diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h index 74f31ae78..6f48e9fa5 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h @@ -75,6 +75,13 @@ public: QPlatformCameraImageCapture *imageCaptureControl() override; QPlatformMediaRecorder *mediaRecorderControl() override; + bool isMuted() const override; + void setMuted(bool muted) override; + qreal volume() const override; + void setVolume(qreal volume) override; + QAudioDeviceInfo audioInput() const override; + bool setAudioInput(const QAudioDeviceInfo &id) override; + void setVideoPreview(QAbstractVideoSurface *surface) override; bool m_videoEnabled = false; diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol.cpp index b0f1a2b20..92cdb14f4 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol.cpp @@ -40,8 +40,6 @@ #include "qandroidmediarecordercontrol_p.h" #include "qandroidcapturesession_p.h" -#include "qmediadevicemanager.h" -#include "qaudiodeviceinfo.h" QT_BEGIN_NAMESPACE @@ -81,18 +79,6 @@ qint64 QAndroidMediaRecorderControl::duration() const return m_session->duration(); } -bool QAndroidMediaRecorderControl::isMuted() const -{ - // No API for this in Android - return false; -} - -qreal QAndroidMediaRecorderControl::volume() const -{ - // No API for this in Android - return 1.0; -} - void QAndroidMediaRecorderControl::applySettings() { m_session->applySettings(); @@ -103,39 +89,6 @@ void QAndroidMediaRecorderControl::setState(QMediaRecorder::State state) m_session->setState(state); } -void QAndroidMediaRecorderControl::setMuted(bool muted) -{ - // No API for this in Android - Q_UNUSED(muted); - qWarning("QMediaRecorder::setMuted() is not supported on Android."); -} - -void QAndroidMediaRecorderControl::setVolume(qreal volume) -{ - // No API for this in Android - Q_UNUSED(volume); - qWarning("QMediaRecorder::setVolume() is not supported on Android."); -} - -QAudioDeviceInfo QAndroidMediaRecorderControl::audioInput() const -{ - QMediaDeviceManager *manager = QMediaDeviceManager::instance(); - const auto devices = manager->audioInputs(); - QByteArray id = m_session->audioInput().toLatin1(); - - for (auto c : devices) { - if (c.id() == id) - return c; - } - return manager->defaultAudioInput(); -} - -bool QAndroidMediaRecorderControl::setAudioInput(const QAudioDeviceInfo &info) -{ - m_session->setAudioInput(QString::fromLatin1(info.id())); - return true; -} - void QAndroidMediaRecorderControl::setEncoderSettings(const QMediaEncoderSettings &settings) { m_session->setEncoderSettings(settings); diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol_p.h index b1e29f3fc..d94d15bf4 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol_p.h @@ -68,19 +68,12 @@ public: QMediaRecorder::State state() const override; QMediaRecorder::Status status() const override; qint64 duration() const override; - bool isMuted() const override; - qreal volume() const override; void applySettings() override; - QAudioDeviceInfo audioInput() const override; - bool setAudioInput(const QAudioDeviceInfo &id) override; - void setEncoderSettings(const QMediaEncoderSettings &settings) override; public Q_SLOTS: void setState(QMediaRecorder::State state) override; - void setMuted(bool muted) override; - void setVolume(qreal volume) override; private: QAndroidCaptureSession *m_session; diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice.mm b/src/multimedia/platform/darwin/camera/avfcameraservice.mm index cf0f2e1dc..795f1d98e 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraservice.mm +++ b/src/multimedia/platform/darwin/camera/avfcameraservice.mm @@ -69,6 +69,7 @@ AVFCameraService::AVFCameraService() m_cameraExposureControl = new AVFCameraExposureControl(this); #endif + m_audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; } AVFCameraService::~AVFCameraService() @@ -109,6 +110,59 @@ QPlatformCameraImageProcessing *AVFCameraService::cameraImageProcessingControl() return m_cameraImageProcessingControl; } +bool AVFCameraService::isMuted() const +{ + return m_muted; +} + +void AVFCameraService::setMuted(bool muted) +{ + if (m_muted != muted) { + m_muted = muted; + Q_EMIT mutedChanged(muted); + } +} + +qreal AVFCameraService::volume() const +{ + return m_volume; +} + +void AVFCameraService::setVolume(qreal volume) +{ + if (m_volume != volume) { + m_volume = volume; + Q_EMIT volumeChanged(volume); + } +} + +QAudioDeviceInfo AVFCameraService::audioInput() const +{ + QByteArray id = [[m_audioCaptureDevice uniqueID] UTF8String]; + const QList<QAudioDeviceInfo> devices = QMediaDeviceManager::audioInputs(); + for (auto d : devices) + if (d.id() == id) + return d; + return QMediaDeviceManager::defaultAudioInput(); +} + +bool AVFCameraService::setAudioInput(const QAudioDeviceInfo &id) +{ + AVCaptureDevice *device = nullptr; + + if (!id.isNull()) { + device = [AVCaptureDevice deviceWithUniqueID: [NSString stringWithUTF8String:id.id().constData()]]; + } else { + device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; + } + + if (device) { + m_audioCaptureDevice = device; + return true; + } + return false; +} + void AVFCameraService::setVideoPreview(QAbstractVideoSurface *surface) { m_session->setVideoSurface(surface); diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h index dc5006dab..515bb40d7 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h +++ b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h @@ -55,6 +55,7 @@ #include <QtCore/qset.h> #include <private/qplatformmediacapture_p.h> +#include <AVFoundation/AVFoundation.h> QT_BEGIN_NAMESPACE class QPlatformCamera; @@ -80,6 +81,13 @@ public: QPlatformCameraImageCapture *imageCaptureControl() override; QPlatformMediaRecorder *mediaRecorderControl() override; + bool isMuted() const override; + void setMuted(bool muted) override; + qreal volume() const override; + void setVolume(qreal volume) override; + QAudioDeviceInfo audioInput() const override; + bool setAudioInput(const QAudioDeviceInfo &) override; + void setVideoPreview(QAbstractVideoSurface *surface) override; AVFCameraSession *session() const { return m_session; } @@ -91,6 +99,10 @@ public: QPlatformCameraImageProcessing *cameraImageProcessingControl() const; private: + bool m_muted = false; + qreal m_volume = 1.0; + AVCaptureDevice *m_audioCaptureDevice = nullptr; + AVFCameraSession *m_session; AVFCameraControl *m_cameraControl; AVFMediaRecorderControl *m_recorderControl; diff --git a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm index c1b9a7cfe..0136713b2 100644 --- a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm +++ b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm @@ -90,16 +90,12 @@ AVFMediaRecorderControl::AVFMediaRecorderControl(AVFCameraService *service, QObj , m_service(service) , m_state(QMediaRecorder::StoppedState) , m_lastStatus(QMediaRecorder::StoppedStatus) - , m_muted(false) - , m_volume(1.0) , m_audioSettings(nil) , m_videoSettings(nil) //, m_restoreFPS(-1, -1) { Q_ASSERT(service); - m_audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; - m_writer.reset([[QT_MANGLE_NAMESPACE(AVFMediaAssetWriter) alloc] initWithDelegate:this]); if (!m_writer) { qDebugCamera() << Q_FUNC_INFO << "failed to create an asset writer"; @@ -152,32 +148,6 @@ qint64 AVFMediaRecorderControl::duration() const return m_writer.data().durationInMs; } -bool AVFMediaRecorderControl::isMuted() const -{ - return m_muted; -} - -qreal AVFMediaRecorderControl::volume() const -{ - return m_volume; -} - -void AVFMediaRecorderControl::setMuted(bool muted) -{ - if (m_muted != muted) { - m_muted = muted; - Q_EMIT mutedChanged(muted); - } -} - -void AVFMediaRecorderControl::setVolume(qreal volume) -{ - if (m_volume != volume) { - m_volume = volume; - Q_EMIT volumeChanged(volume); - } -} - static bool formatSupportsFramerate(AVCaptureDeviceFormat *format, qreal fps) { if (format && fps > qreal(0)) { @@ -447,33 +417,6 @@ void AVFMediaRecorderControl::unapplySettings() } } -QAudioDeviceInfo AVFMediaRecorderControl::audioInput() const -{ - QByteArray id = [[m_audioCaptureDevice uniqueID] UTF8String]; - const QList<QAudioDeviceInfo> devices = QMediaDeviceManager::audioInputs(); - for (auto d : devices) - if (d.id() == id) - return d; - return QMediaDeviceManager::defaultAudioInput(); -} - -bool AVFMediaRecorderControl::setAudioInput(const QAudioDeviceInfo &id) -{ - AVCaptureDevice *device = nullptr; - - if (!id.isNull()) { - device = [AVCaptureDevice deviceWithUniqueID: [NSString stringWithUTF8String:id.id().constData()]]; - } else { - device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; - } - - if (device) { - m_audioCaptureDevice = device; - return true; - } - return false; -} - void AVFMediaRecorderControl::setEncoderSettings(const QMediaEncoderSettings &settings) { m_settings = settings; diff --git a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h index 4aa0077fd..8a7dbd67a 100644 --- a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h +++ b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h @@ -85,15 +85,9 @@ public: qint64 duration() const override; - bool isMuted() const override; - qreal volume() const override; - void applySettings() override; void unapplySettings(); - QAudioDeviceInfo audioInput() const override; - bool setAudioInput(const QAudioDeviceInfo &) override; - void setEncoderSettings(const QMediaEncoderSettings &settings) override; QMediaEncoderSettings encoderSettings() const { QMediaEncoderSettings s = m_settings; @@ -103,8 +97,6 @@ public: public Q_SLOTS: void setState(QMediaRecorder::State state) override; - void setMuted(bool muted) override; - void setVolume(qreal volume) override; private: @@ -119,7 +111,6 @@ private: AVFCameraService *m_service; AVFScopedPointer<QT_MANGLE_NAMESPACE(AVFMediaAssetWriter)> m_writer; - AVCaptureDevice *m_audioCaptureDevice = nullptr; QUrl m_outputLocation; AVFStorageLocation m_storageLocation; @@ -128,9 +119,6 @@ private: QMediaRecorder::Status m_lastStatus; QMediaEncoderSettings m_settings; - bool m_muted; - qreal m_volume; - NSDictionary *m_audioSettings; NSDictionary *m_videoSettings; QVideoOutputOrientationHandler m_orientationHandler; diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp index ed34fa9cc..072dfb874 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp @@ -58,6 +58,8 @@ QGstreamerMediaCapture::QGstreamerMediaCapture(QMediaRecorder::CaptureMode mode) m_captureSession = new QGstreamerCaptureSession(QGstreamerCaptureSession::AudioAndVideo, this); m_cameraControl = new QGstreamerCamera(m_captureSession); } + connect(m_captureSession, SIGNAL(mutedChanged(bool)), SIGNAL(mutedChanged(bool))); + connect(m_captureSession, SIGNAL(volumeChanged(qreal)), SIGNAL(volumeChanged(qreal))); } QGstreamerMediaCapture::~QGstreamerMediaCapture() = default; @@ -77,6 +79,37 @@ QPlatformMediaRecorder *QGstreamerMediaCapture::mediaRecorderControl() return m_captureSession->recorderControl(); } +QAudioDeviceInfo QGstreamerMediaCapture::audioInput() const +{ + return m_captureSession->audioCaptureDevice(); +} + +bool QGstreamerMediaCapture::setAudioInput(const QAudioDeviceInfo &info) +{ + m_captureSession->setAudioCaptureDevice(info); + return true; +} + +bool QGstreamerMediaCapture::isMuted() const +{ + return m_captureSession->isMuted(); +} + +void QGstreamerMediaCapture::setMuted(bool muted) +{ + m_captureSession->setMuted(muted); +} + +qreal QGstreamerMediaCapture::volume() const +{ + return m_captureSession->volume(); +} + +void QGstreamerMediaCapture::setVolume(qreal volume) +{ + m_captureSession->setVolume(volume); +} + void QGstreamerMediaCapture::setVideoPreview(QAbstractVideoSurface *surface) { m_captureSession->setVideoPreview(surface); diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h index c5f61290e..a698d31c0 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h @@ -78,6 +78,14 @@ public: QPlatformCameraImageCapture *imageCaptureControl() override; QPlatformMediaRecorder *mediaRecorderControl() override; + bool isMuted() const override; + void setMuted(bool) override; + qreal volume() const override; + void setVolume(qreal volume) override; + + QAudioDeviceInfo audioInput() const override; + bool setAudioInput(const QAudioDeviceInfo &id) override; + void setVideoPreview(QAbstractVideoSurface *surface) override; private: diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediarecorder.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediarecorder.cpp index 317e2a6a9..dc13801b5 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediarecorder.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediarecorder.cpp @@ -53,8 +53,6 @@ QGstreamerMediaRecorder::QGstreamerMediaRecorder(QGstreamerCaptureSession *sessi connect(m_session, SIGNAL(stateChanged(QGstreamerCaptureSession::State)), SLOT(updateStatus())); connect(m_session, SIGNAL(error(int,QString)), SLOT(handleSessionError(int,QString))); connect(m_session, SIGNAL(durationChanged(qint64)), SIGNAL(durationChanged(qint64))); - connect(m_session, SIGNAL(mutedChanged(bool)), SIGNAL(mutedChanged(bool))); - connect(m_session, SIGNAL(volumeChanged(qreal)), SIGNAL(volumeChanged(qreal))); m_hasPreviewState = m_session->captureMode() != QGstreamerCaptureSession::Audio; } @@ -212,17 +210,6 @@ void QGstreamerMediaRecorder::applySettings() { } -QAudioDeviceInfo QGstreamerMediaRecorder::audioInput() const -{ - return m_session->audioCaptureDevice(); -} - -bool QGstreamerMediaRecorder::setAudioInput(const QAudioDeviceInfo &info) -{ - m_session->setAudioCaptureDevice(info); - return true; -} - void QGstreamerMediaRecorder::setEncoderSettings(const QMediaEncoderSettings &settings) { m_settings = settings; @@ -245,26 +232,6 @@ QMediaMetaData QGstreamerMediaRecorder::metaData() const return m_metaData; } -bool QGstreamerMediaRecorder::isMuted() const -{ - return m_session->isMuted(); -} - -qreal QGstreamerMediaRecorder::volume() const -{ - return m_session->volume(); -} - -void QGstreamerMediaRecorder::setMuted(bool muted) -{ - m_session->setMuted(muted); -} - -void QGstreamerMediaRecorder::setVolume(qreal volume) -{ - m_session->setVolume(volume); -} - QDir QGstreamerMediaRecorder::defaultDir() const { QStringList dirCandidates; diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediarecorder_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediarecorder_p.h index 22e1fa194..57eb070e5 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediarecorder_p.h +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediarecorder_p.h @@ -77,14 +77,8 @@ public: qint64 duration() const override; - bool isMuted() const override; - qreal volume() const override; - void applySettings() override; - QAudioDeviceInfo audioInput() const override; - bool setAudioInput(const QAudioDeviceInfo &id) override; - void setEncoderSettings(const QMediaEncoderSettings &settings) override; QMediaEncoderSettings encoderSettings() const { return m_settings; } QMediaEncoderSettings resolvedEncoderSettings() const; @@ -97,8 +91,6 @@ public slots: void record(); void pause(); void stop(); - void setMuted(bool) override; - void setVolume(qreal volume) override; private slots: void updateStatus(); diff --git a/src/multimedia/platform/qplatformmediacapture_p.h b/src/multimedia/platform/qplatformmediacapture_p.h index 54928c9b7..0c17f6c04 100644 --- a/src/multimedia/platform/qplatformmediacapture_p.h +++ b/src/multimedia/platform/qplatformmediacapture_p.h @@ -63,6 +63,7 @@ class QAbstractVideoSurface; class Q_MULTIMEDIA_EXPORT QPlatformMediaCaptureSession : public QObject { + Q_OBJECT public: QPlatformMediaCaptureSession() = default; virtual ~QPlatformMediaCaptureSession(); @@ -71,7 +72,20 @@ public: virtual QPlatformCameraImageCapture *imageCaptureControl() = 0; virtual QPlatformMediaRecorder *mediaRecorderControl() = 0; + virtual bool isMuted() const = 0; + virtual void setMuted(bool muted) = 0; + virtual qreal volume() const = 0; + virtual void setVolume(qreal volume) = 0; + + virtual QAudioDeviceInfo audioInput() const = 0; + virtual bool setAudioInput(const QAudioDeviceInfo &id) = 0; + virtual void setVideoPreview(QAbstractVideoSurface *surface) = 0; + +Q_SIGNALS: + void mutedChanged(bool muted); + void volumeChanged(qreal volume); + }; QT_END_NAMESPACE diff --git a/src/multimedia/platform/qplatformmediarecorder_p.h b/src/multimedia/platform/qplatformmediarecorder_p.h index a34e6385c..5fa62618c 100644 --- a/src/multimedia/platform/qplatformmediarecorder_p.h +++ b/src/multimedia/platform/qplatformmediarecorder_p.h @@ -77,14 +77,7 @@ public: virtual qint64 duration() const = 0; - virtual bool isMuted() const = 0; - virtual qreal volume() const = 0; - virtual void applySettings() = 0; - - virtual QAudioDeviceInfo audioInput() const = 0; - virtual bool setAudioInput(const QAudioDeviceInfo &id) = 0; - virtual void setEncoderSettings(const QMediaEncoderSettings &settings) = 0; virtual void setMetaData(const QMediaMetaData &) {} @@ -94,16 +87,12 @@ Q_SIGNALS: void stateChanged(QMediaRecorder::State state); void statusChanged(QMediaRecorder::Status status); void durationChanged(qint64 position); - void mutedChanged(bool muted); - void volumeChanged(qreal volume); void actualLocationChanged(const QUrl &location); void error(int error, const QString &errorString); void metaDataChanged(); public Q_SLOTS: virtual void setState(QMediaRecorder::State state) = 0; - virtual void setMuted(bool muted) = 0; - virtual void setVolume(qreal volume) = 0; protected: explicit QPlatformMediaRecorder(QObject *parent = nullptr); diff --git a/src/multimedia/recording/qmediacapturesession.cpp b/src/multimedia/recording/qmediacapturesession.cpp index 5cde856a4..96504d102 100644 --- a/src/multimedia/recording/qmediacapturesession.cpp +++ b/src/multimedia/recording/qmediacapturesession.cpp @@ -99,6 +99,48 @@ void QMediaCaptureSession::setAudioInput(const QAudioDeviceInfo &device) emit audioInputChanged(); } +/*! + \property QMediaCaptureSession::muted + + \brief whether a recording audio stream is muted. +*/ + +bool QMediaCaptureSession::isMuted() const +{ + return d_ptr->captureSession->isMuted(); +} + +void QMediaCaptureSession::setMuted(bool muted) +{ + d_ptr->captureSession->setMuted(muted); +} + +/*! + \property QMediaCaptureSession::volume + + \brief the current recording audio volume. + + The volume is scaled linearly from \c 0.0 (silence) to \c 1.0 (full volume). Values outside this + range will be clamped. + + The default volume is \c 1.0. + + UI volume controls should usually be scaled nonlinearly. For example, using a logarithmic scale + will produce linear changes in perceived loudness, which is what a user would normally expect + from a volume control. See QAudio::convertVolume() for more details. +*/ + +qreal QMediaCaptureSession::volume() const +{ + return d_ptr->captureSession->volume(); +} + +void QMediaCaptureSession::setVolume(qreal volume) +{ + d_ptr->captureSession->setVolume(volume); +} + + QCamera *QMediaCaptureSession::camera() const { return d_ptr->camera; diff --git a/src/multimedia/recording/qmediacapturesession.h b/src/multimedia/recording/qmediacapturesession.h index e6fae4780..1534e84a3 100644 --- a/src/multimedia/recording/qmediacapturesession.h +++ b/src/multimedia/recording/qmediacapturesession.h @@ -58,6 +58,8 @@ class Q_MULTIMEDIA_EXPORT QMediaCaptureSession : public QObject { Q_OBJECT Q_PROPERTY(QAudioDeviceInfo audioInput READ audioInput WRITE setAudioInput NOTIFY audioInputChanged) + Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) + Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged) Q_PROPERTY(QCamera *camera READ camera WRITE setCamera NOTIFY cameraChanged) Q_PROPERTY(QCameraImageCapture *imageCapture READ imageCapture WRITE setImageCapture NOTIFY imageCaptureChanged) Q_PROPERTY(QMediaEncoder *encoder READ encoder WRITE setEncoder NOTIFY encoderChanged) @@ -70,6 +72,11 @@ public: QAudioDeviceInfo audioInput() const; // ### Should use a QAudioDevice * void setAudioInput(const QAudioDeviceInfo &device); + bool isMuted() const; // ### Should move to QAudioDevice + void setMuted(bool muted); + qreal volume() const; + void setVolume(qreal volume); + QCamera *camera() const; void setCamera(QCamera *camera); @@ -86,6 +93,8 @@ public: Q_SIGNALS: void audioInputChanged(); + void mutedChanged(bool muted); + void volumeChanged(qreal volume); void cameraChanged(); void imageCaptureChanged(); void encoderChanged(); diff --git a/src/multimedia/recording/qmediaencoder.cpp b/src/multimedia/recording/qmediaencoder.cpp index 83f337cca..7f8b2c281 100644 --- a/src/multimedia/recording/qmediaencoder.cpp +++ b/src/multimedia/recording/qmediaencoder.cpp @@ -300,45 +300,6 @@ qint64 QMediaEncoder::duration() const } /*! - \property QMediaEncoder::muted - - \brief whether a recording audio stream is muted. -*/ - -bool QMediaEncoder::isMuted() const -{ - return d_func()->control ? d_func()->control->isMuted() : false; -} - -void QMediaEncoder::setMuted(bool muted) -{ - Q_D(QMediaEncoder); - - if (d->control) - d->control->setMuted(muted); -} - -/*! - \property QMediaEncoder::volume - - \brief the current recording audio volume. - - The volume is scaled linearly from \c 0.0 (silence) to \c 1.0 (full volume). Values outside this - range will be clamped. - - The default volume is \c 1.0. - - UI volume controls should usually be scaled nonlinearly. For example, using a logarithmic scale - will produce linear changes in perceived loudness, which is what a user would normally expect - from a volume control. See QAudio::convertVolume() for more details. -*/ - -qreal QMediaEncoder::volume() const -{ - return d_func()->control ? d_func()->control->volume() : 1.0; -} - -/*! Sets the encoder settings to \a settings. \sa QMediaEncoderSettings @@ -362,17 +323,6 @@ QMediaEncoderSettings QMediaEncoder::encoderSettings() const return d_func()->encoderSettings; } - -void QMediaEncoder::setVolume(qreal volume) -{ - Q_D(QMediaEncoder); - - if (d->control) { - volume = qMax(qreal(0.0), volume); - d->control->setVolume(volume); - } -} - /*! Start recording. diff --git a/src/multimedia/recording/qmediaencoder.h b/src/multimedia/recording/qmediaencoder.h index 0a1d76066..80ea885a1 100644 --- a/src/multimedia/recording/qmediaencoder.h +++ b/src/multimedia/recording/qmediaencoder.h @@ -108,8 +108,6 @@ class Q_MULTIMEDIA_EXPORT QMediaEncoder : public QMediaEncoderBase Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged) Q_PROPERTY(QUrl outputLocation READ outputLocation WRITE setOutputLocation) Q_PROPERTY(QUrl actualLocation READ actualLocation NOTIFY actualLocationChanged) - Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) - Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged) Q_PROPERTY(QMediaMetaData metaData READ metaData WRITE setMetaData NOTIFY metaDataChanged) public: @@ -131,10 +129,6 @@ public: qint64 duration() const; - // ### These two properties should move to the capture session or a QAudioDevice object - bool isMuted() const; - qreal volume() const; - void setEncoderSettings(const QMediaEncoderSettings &); QMediaEncoderSettings encoderSettings() const; @@ -148,15 +142,11 @@ public Q_SLOTS: void record(); void pause(); void stop(); - void setMuted(bool muted); - void setVolume(qreal volume); Q_SIGNALS: void stateChanged(QMediaEncoder::State state); void statusChanged(QMediaEncoder::Status status); void durationChanged(qint64 duration); - void mutedChanged(bool muted); - void volumeChanged(qreal volume); void actualLocationChanged(const QUrl &location); void error(QMediaEncoder::Error error); diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp index 0ec5a6127..5b1bc134d 100644 --- a/src/multimedia/recording/qmediarecorder.cpp +++ b/src/multimedia/recording/qmediarecorder.cpp @@ -95,8 +95,8 @@ QMediaRecorder::QMediaRecorder(QObject *parent, CaptureMode mode) connect(d->encoder, &QMediaEncoder::stateChanged, this, &QMediaRecorder::stateChanged); connect(d->encoder, &QMediaEncoder::statusChanged, this, &QMediaRecorder::statusChanged); - connect(d->encoder, &QMediaEncoder::mutedChanged, this, &QMediaRecorder::mutedChanged); - connect(d->encoder, &QMediaEncoder::volumeChanged, this, &QMediaRecorder::volumeChanged); + connect(d->captureSession, &QMediaCaptureSession::mutedChanged, this, &QMediaRecorder::mutedChanged); + connect(d->captureSession, &QMediaCaptureSession::volumeChanged, this, &QMediaRecorder::volumeChanged); connect(d->captureSession, &QMediaCaptureSession::audioInputChanged, this, &QMediaRecorder::audioInputChanged); } @@ -256,12 +256,12 @@ qint64 QMediaRecorder::duration() const bool QMediaRecorder::isMuted() const { - return d_ptr->encoder->isMuted(); + return d_ptr->captureSession->isMuted(); } void QMediaRecorder::setMuted(bool muted) { - d_ptr->encoder->setMuted(muted); + d_ptr->captureSession->setMuted(muted); } /*! @@ -281,7 +281,12 @@ void QMediaRecorder::setMuted(bool muted) qreal QMediaRecorder::volume() const { - return d_ptr->encoder->volume(); + return d_ptr->captureSession->volume(); +} + +void QMediaRecorder::setVolume(qreal volume) +{ + d_ptr->captureSession->setVolume(volume); } /*! @@ -304,12 +309,6 @@ QMediaEncoderSettings QMediaRecorder::encoderSettings() const return d_ptr->encoder->encoderSettings(); } - -void QMediaRecorder::setVolume(qreal volume) -{ - d_ptr->encoder->setVolume(volume); -} - /*! Start recording. diff --git a/tests/auto/unit/mockbackend/mockmediarecordercontrol.h b/tests/auto/unit/mockbackend/mockmediarecordercontrol.h index 0906d1ade..fc5a44df4 100644 --- a/tests/auto/unit/mockbackend/mockmediarecordercontrol.h +++ b/tests/auto/unit/mockbackend/mockmediarecordercontrol.h @@ -44,8 +44,6 @@ public: m_state(QMediaRecorder::StoppedState), m_status(QMediaRecorder::StoppedStatus), m_position(0), - m_muted(false), - m_volume(1.0), m_settingAppliedCount(0) { } @@ -76,31 +74,11 @@ public: return m_position; } - bool isMuted() const - { - return m_muted; - } - - qreal volume() const - { - return m_volume; - } - void applySettings() { m_settingAppliedCount++; } - QAudioDeviceInfo audioInput() const - { - return m_audioInput; - } - bool setAudioInput(const QAudioDeviceInfo &id) - { - m_audioInput = id; - return true; - } - void setEncoderSettings(const QMediaEncoderSettings &) {} virtual void setMetaData(const QMediaMetaData &m) @@ -158,28 +136,12 @@ public slots: } } - - void setMuted(bool muted) - { - if (m_muted != muted) - emit mutedChanged(m_muted = muted); - } - - void setVolume(qreal volume) - { - if (!qFuzzyCompare(m_volume, volume)) - emit volumeChanged(m_volume = volume); - } - public: QMediaMetaData m_metaData; - QAudioDeviceInfo m_audioInput; QUrl m_sink; QMediaRecorder::State m_state; QMediaRecorder::Status m_status; qint64 m_position; - bool m_muted; - qreal m_volume; int m_settingAppliedCount; }; diff --git a/tests/auto/unit/mockbackend/mockmediarecorderservice.h b/tests/auto/unit/mockbackend/mockmediarecorderservice.h index c5e2810cd..769ccc770 100644 --- a/tests/auto/unit/mockbackend/mockmediarecorderservice.h +++ b/tests/auto/unit/mockbackend/mockmediarecorderservice.h @@ -61,6 +61,38 @@ public: void setVideoPreview(QAbstractVideoSurface *) override {} + bool isMuted() const override + { + return m_muted; + } + + void setMuted(bool muted) override + { + if (m_muted != muted) + emit mutedChanged(m_muted = muted); + } + + qreal volume() const override + { + return m_volume; + } + + void setVolume(qreal volume) override + { + if (!qFuzzyCompare(m_volume, volume)) + emit volumeChanged(m_volume = volume); + } + + QAudioDeviceInfo audioInput() const override + { + return m_audioInput; + } + bool setAudioInput(const QAudioDeviceInfo &id) override + { + m_audioInput = id; + return true; + } + static bool simpleCamera; MockCameraControl *mockCameraControl; @@ -70,6 +102,9 @@ public: MockImageProcessingControl *mockImageProcessingControl; MockMediaRecorderControl *mockControl; + QAudioDeviceInfo m_audioInput; + bool m_muted = false; + qreal m_volume = 1.0; bool hasControls; }; diff --git a/tests/auto/unit/multimedia/qmediaencoder/tst_qmediaencoder.cpp b/tests/auto/unit/multimedia/qmediaencoder/tst_qmediaencoder.cpp index 366b112f7..fd5e8e834 100644 --- a/tests/auto/unit/multimedia/qmediaencoder/tst_qmediaencoder.cpp +++ b/tests/auto/unit/multimedia/qmediaencoder/tst_qmediaencoder.cpp @@ -57,9 +57,6 @@ private slots: void testError(); void testSink(); void testRecord(); - void testMute(); - void testVolume(); - void testAudioDeviceControl(); void testEncodingSettings(); void testAudioSettings(); void testVideoSettings(); @@ -128,9 +125,6 @@ void tst_QMediaEncoder::testNullService() QCOMPARE(recorder.state(), QMediaEncoder::StoppedState); QCOMPARE(recorder.error(), QMediaEncoder::NoError); QCOMPARE(recorder.duration(), qint64(0)); - QVERIFY(!recorder.isMuted()); - recorder.setMuted(true); - QVERIFY(!recorder.isMuted()); } void tst_QMediaEncoder::testNullControls() @@ -291,58 +285,6 @@ void tst_QMediaEncoder::testRecord() QCOMPARE(stateSignal.count(), 3); } -void tst_QMediaEncoder::testMute() -{ - QSignalSpy mutedChanged(capture, SIGNAL(mutedChanged(bool))); - QVERIFY(!capture->isMuted()); - capture->setMuted(true); - - QCOMPARE(mutedChanged.size(), 1); - QCOMPARE(mutedChanged[0][0].toBool(), true); - QVERIFY(capture->isMuted()); - - capture->setMuted(false); - - QCOMPARE(mutedChanged.size(), 2); - QCOMPARE(mutedChanged[1][0].toBool(), false); - QVERIFY(!capture->isMuted()); - - capture->setMuted(false); - QCOMPARE(mutedChanged.size(), 2); -} - -void tst_QMediaEncoder::testVolume() -{ - QSignalSpy volumeChanged(capture, SIGNAL(volumeChanged(qreal))); - QCOMPARE(capture->volume(), 1.0); - capture->setVolume(2.0); - - QCOMPARE(volumeChanged.size(), 1); - QCOMPARE(volumeChanged[0][0].toReal(), 2.0); - QCOMPARE(capture->volume(), 2.0); - - capture->setVolume(1.0); - - QCOMPARE(volumeChanged.size(), 2); - QCOMPARE(volumeChanged[1][0].toReal(), 1.0); - QCOMPARE(capture->volume(), 1.0); - - capture->setVolume(1.0); - QCOMPARE(volumeChanged.size(), 2); -} - -void tst_QMediaEncoder::testAudioDeviceControl() -{ -// QSignalSpy readSignal(capture,SIGNAL(audioInputChanged())); -// QVERIFY(audio->availableInputs().size() == 3); -// QVERIFY(audio->defaultInput().compare("device1") == 0); -// audio->setActiveInput("device2"); -// QTestEventLoop::instance().enterLoop(1); -// QVERIFY(audio->activeInput().compare("device2") == 0); -// QVERIFY(readSignal.count() == 1); -// QVERIFY(audio->inputDescription("device2").compare("dev2 comment") == 0); -} - void tst_QMediaEncoder::testEncodingSettings() { // QAudioEncoderSettings audioSettings = capture->audioSettings(); |