summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-03-05 22:54:29 +0100
committerLars Knoll <lars.knoll@qt.io>2021-03-18 12:19:01 +0000
commit2c24e1e70e36f1606aca16539b60114b6673e5d6 (patch)
tree7ec6101fb3a5f0bf8e3e22472682f8a983b0e570
parent1509fb905fc1583b7ed3118b0c50c1989e086b2b (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>
-rw-r--r--examples/multimediawidgets/camera/camera.cpp2
-rw-r--r--src/imports/multimedia/qdeclarativecamerarecorder.cpp9
-rw-r--r--src/imports/multimedia/qdeclarativecamerarecorder_p.h1
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp48
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h7
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol.cpp47
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol_p.h7
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraservice.mm54
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraservice_p.h12
-rw-r--r--src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm57
-rw-r--r--src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h12
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp33
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h8
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediarecorder.cpp33
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediarecorder_p.h8
-rw-r--r--src/multimedia/platform/qplatformmediacapture_p.h14
-rw-r--r--src/multimedia/platform/qplatformmediarecorder_p.h11
-rw-r--r--src/multimedia/recording/qmediacapturesession.cpp42
-rw-r--r--src/multimedia/recording/qmediacapturesession.h9
-rw-r--r--src/multimedia/recording/qmediaencoder.cpp50
-rw-r--r--src/multimedia/recording/qmediaencoder.h10
-rw-r--r--src/multimedia/recording/qmediarecorder.cpp21
-rw-r--r--tests/auto/unit/mockbackend/mockmediarecordercontrol.h38
-rw-r--r--tests/auto/unit/mockbackend/mockmediarecorderservice.h35
-rw-r--r--tests/auto/unit/multimedia/qmediaencoder/tst_qmediaencoder.cpp58
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();