summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-06-04 15:58:15 +0200
committerLars Knoll <lars.knoll@qt.io>2021-06-11 15:12:28 +0200
commitd5b87ad6554a674aa38a3d301918a49f5baf57a7 (patch)
treea2d28e0f72142a13ca602c1ef927f3a81a15eee7
parent9fd208f11a218d8a8b07fc525258eea3b3596d62 (diff)
Use QAudioInput in QMediaCaptureSession
Convert the audioInput property to use a pointer to a QAudioInput in line with the API changes planned. Not setting up a QAudioInput implies that you do not get any audio. Move the volume and muted properties over to QAudioInput, they should really not be part of the QMediaCaptureSession. Adjust the platform API accordingly and adjust implementations. The Android adaptation is incomplete, but that was the case before as well. This needs some refactoring to properly support setting devices and adjusting volume/muted. Dynamically adjusting to changes of the audio input device is not yet implemented on Windows. Change-Id: I2fb63b9e57908d6dc02130b8d534ef7ac1a1ac85 Reviewed-by: André de la Rocha <andre.rocha@qt.io> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-rw-r--r--examples/multimedia/audiorecorder/audiorecorder.cpp12
-rw-r--r--examples/multimediawidgets/camera/camera.cpp7
-rw-r--r--examples/multimediawidgets/camera/camera.h2
-rw-r--r--examples/multimediawidgets/camera/videosettings.cpp6
-rw-r--r--src/multimedia/audio/qaudioinput.cpp2
-rw-r--r--src/multimedia/audio/qaudioinput.h2
-rw-r--r--src/multimedia/audio/qaudiooutput.cpp2
-rw-r--r--src/multimedia/audio/qaudiooutput.h2
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp43
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h7
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp18
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h9
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraservice.mm63
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraservice_p.h15
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerasession.mm7
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerasession_p.h1
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreameraudioinput.cpp35
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreameraudioinput_p.h14
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp77
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h12
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp6
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerintegration.cpp13
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerintegration_p.h3
-rw-r--r--src/multimedia/platform/qplatformaudioinput_p.h10
-rw-r--r--src/multimedia/platform/qplatformaudiooutput_p.h10
-rw-r--r--src/multimedia/platform/qplatformmediacapture.cpp13
-rw-r--r--src/multimedia/platform/qplatformmediacapture_p.h12
-rw-r--r--src/multimedia/platform/qplatformmediaintegration.cpp12
-rw-r--r--src/multimedia/platform/qplatformmediaintegration_p.h4
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp30
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h8
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp36
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h15
-rw-r--r--src/multimedia/recording/qmediacapturesession.cpp56
-rw-r--r--src/multimedia/recording/qmediacapturesession.h17
-rw-r--r--src/multimedia/recording/qmediarecorder.cpp17
-rw-r--r--tests/auto/unit/mockbackend/qmockmediacapturesession.h36
37 files changed, 247 insertions, 387 deletions
diff --git a/examples/multimedia/audiorecorder/audiorecorder.cpp b/examples/multimedia/audiorecorder/audiorecorder.cpp
index 53575c45a..7771d3cd2 100644
--- a/examples/multimedia/audiorecorder/audiorecorder.cpp
+++ b/examples/multimedia/audiorecorder/audiorecorder.cpp
@@ -61,6 +61,7 @@
#include <qmediadevices.h>
#include <qaudiodevice.h>
#include <qaudiobuffer.h>
+#include <qaudioinput.h>
static QList<qreal> getBufferLevels(const QAudioBuffer &buffer);
@@ -71,6 +72,7 @@ AudioRecorder::AudioRecorder()
m_audioEncoder = new QMediaEncoder(this);
m_captureSession.setEncoder(m_audioEncoder);
+ m_captureSession.setAudioInput(new QAudioInput(this));
// ### replace with a monitoring output once we have it.
// m_probe = new QAudioProbe(this);
// connect(m_probe, &QAudioProbe::audioBufferProbed,
@@ -98,10 +100,10 @@ AudioRecorder::AudioRecorder()
}
//sample rate
- ui->sampleRateBox->setRange(m_captureSession.audioInput().minimumSampleRate(),
- m_captureSession.audioInput().maximumSampleRate());
- ui->sampleRateBox->setValue(qBound(m_captureSession.audioInput().minimumSampleRate(), 44100,
- m_captureSession.audioInput().maximumSampleRate()));
+ ui->sampleRateBox->setRange(m_captureSession.audioInput()->device().minimumSampleRate(),
+ m_captureSession.audioInput()->device().maximumSampleRate());
+ ui->sampleRateBox->setValue(qBound(m_captureSession.audioInput()->device().minimumSampleRate(), 44100,
+ m_captureSession.audioInput()->device().maximumSampleRate()));
//channels
ui->channelsBox->addItem(tr("Default"), QVariant(-1));
@@ -189,7 +191,7 @@ static QVariant boxValue(const QComboBox *box)
void AudioRecorder::toggleRecord()
{
if (m_audioEncoder->state() == QMediaEncoder::StoppedState) {
- m_captureSession.setAudioInput(boxValue(ui->audioDeviceBox).value<QAudioDevice>());
+ m_captureSession.audioInput()->setDevice(boxValue(ui->audioDeviceBox).value<QAudioDevice>());
QMediaEncoderSettings settings;
settings.setFileFormat(boxValue(ui->containerBox).value<QMediaFormat::FileFormat>());
diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp
index 8e339a6cb..0e8d2b4a3 100644
--- a/examples/multimediawidgets/camera/camera.cpp
+++ b/examples/multimediawidgets/camera/camera.cpp
@@ -60,6 +60,7 @@
#include <QMediaMetaData>
#include <QMediaDevices>
#include <QAudioDevice>
+#include <QAudioInput>
#include <QMessageBox>
#include <QPalette>
@@ -74,6 +75,9 @@ Camera::Camera()
{
ui->setupUi(this);
+ m_audioInput.reset(new QAudioInput);
+ m_captureSession.setAudioInput(m_audioInput.get());
+
//Camera devices:
videoDevicesGroup = new QActionGroup(this);
@@ -110,7 +114,6 @@ void Camera::setCamera(const QCameraDevice &cameraInfo)
connect(ui->exposureCompensation, &QAbstractSlider::valueChanged, this, &Camera::setExposureCompensation);
m_captureSession.setVideoOutput(ui->viewfinder);
- m_captureSession.setAudioInput(QMediaDevices::defaultAudioInput());
updateCameraActive(m_camera->isActive());
updateRecorderState(m_mediaEncoder->state());
@@ -229,7 +232,7 @@ void Camera::stop()
void Camera::setMuted(bool muted)
{
- m_captureSession.setMuted(muted);
+ m_captureSession.audioInput()->setMuted(muted);
}
void Camera::takeImage()
diff --git a/examples/multimediawidgets/camera/camera.h b/examples/multimediawidgets/camera/camera.h
index 95e436744..c30927deb 100644
--- a/examples/multimediawidgets/camera/camera.h
+++ b/examples/multimediawidgets/camera/camera.h
@@ -58,6 +58,7 @@
#include <QMediaMetaData>
#include <QMediaCaptureSession>
#include <QMediaDevices>
+#include <QAudioInput>
#include <QMainWindow>
@@ -133,6 +134,7 @@ private:
QMediaDevices m_devices;
QMediaCaptureSession m_captureSession;
QScopedPointer<QCamera> m_camera;
+ QScopedPointer<QAudioInput> m_audioInput;
QCameraImageCapture *m_imageCapture;
QScopedPointer<QMediaEncoder> m_mediaEncoder;
diff --git a/examples/multimediawidgets/camera/videosettings.cpp b/examples/multimediawidgets/camera/videosettings.cpp
index aafd4b5f3..29764eb9a 100644
--- a/examples/multimediawidgets/camera/videosettings.cpp
+++ b/examples/multimediawidgets/camera/videosettings.cpp
@@ -60,6 +60,7 @@
#include <QMediaCaptureSession>
#include <QCameraDevice>
#include <QCamera>
+#include <QAudioInput>
VideoSettings::VideoSettings(QMediaEncoder *mediaRecorder, QWidget *parent)
: QDialog(parent),
@@ -77,8 +78,9 @@ VideoSettings::VideoSettings(QMediaEncoder *mediaRecorder, QWidget *parent)
}
//sample rate:
- ui->audioSampleRateBox->setRange(mediaRecorder->captureSession()->audioInput().minimumSampleRate(),
- mediaRecorder->captureSession()->audioInput().maximumSampleRate());
+ auto audioDevice = mediaRecorder->captureSession()->audioInput()->device();
+ ui->audioSampleRateBox->setRange(audioDevice.minimumSampleRate(),
+ audioDevice.maximumSampleRate());
//video codecs
ui->videoCodecBox->addItem(tr("Default video codec"), QVariant::fromValue(QMediaFormat::VideoCodec::Unspecified));
diff --git a/src/multimedia/audio/qaudioinput.cpp b/src/multimedia/audio/qaudioinput.cpp
index c3e3c0bf2..671cec4ee 100644
--- a/src/multimedia/audio/qaudioinput.cpp
+++ b/src/multimedia/audio/qaudioinput.cpp
@@ -95,7 +95,7 @@ QAudioInput::QAudioInput(const QAudioDevice &device, QObject *parent)
d(QPlatformMediaIntegration::instance()->createAudioInput(this))
{
d->device = device;
- if (d->device.mode() != QAudio::AudioInput)
+ if (!d->device.isNull() && d->device.mode() != QAudio::AudioInput)
d->device = QMediaDevices::defaultAudioInput();
d->setAudioDevice(d->device);
}
diff --git a/src/multimedia/audio/qaudioinput.h b/src/multimedia/audio/qaudioinput.h
index bc0bf89ef..10c3ae1c9 100644
--- a/src/multimedia/audio/qaudioinput.h
+++ b/src/multimedia/audio/qaudioinput.h
@@ -75,6 +75,8 @@ Q_SIGNALS:
void volumeChanged(float volume);
void mutedChanged(bool muted);
+public:
+ QPlatformAudioInput *handle() const { return d; }
private:
Q_DISABLE_COPY(QAudioInput)
QPlatformAudioInput *d = nullptr;
diff --git a/src/multimedia/audio/qaudiooutput.cpp b/src/multimedia/audio/qaudiooutput.cpp
index 31065aee6..c2590533b 100644
--- a/src/multimedia/audio/qaudiooutput.cpp
+++ b/src/multimedia/audio/qaudiooutput.cpp
@@ -95,7 +95,7 @@ QAudioOutput::QAudioOutput(const QAudioDevice &device, QObject *parent)
d(QPlatformMediaIntegration::instance()->createAudioOutput(this))
{
d->device = device;
- if (d->device.mode() != QAudio::AudioOutput)
+ if (!d->device.isNull() && d->device.mode() != QAudio::AudioOutput)
d->device = QMediaDevices::defaultAudioOutput();
d->setAudioDevice(d->device);
}
diff --git a/src/multimedia/audio/qaudiooutput.h b/src/multimedia/audio/qaudiooutput.h
index 9d76c9ca2..0f1461a55 100644
--- a/src/multimedia/audio/qaudiooutput.h
+++ b/src/multimedia/audio/qaudiooutput.h
@@ -75,6 +75,8 @@ Q_SIGNALS:
void volumeChanged(float volume);
void mutedChanged(bool muted);
+public:
+ QPlatformAudioOutput *handle() const { return d; }
private:
Q_DISABLE_COPY(QAudioOutput)
QPlatformAudioOutput *d = nullptr;
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp
index 869395924..97b436ee3 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp
@@ -136,48 +136,9 @@ void QAndroidCaptureService::setMediaEncoder(QPlatformMediaEncoder *encoder)
}
-bool QAndroidCaptureService::isMuted() const
+void QAndroidCaptureService::setAudioInput(QPlatformAudioInput *input)
{
- // 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.");
-}
-
-QAudioDevice QAndroidCaptureService::audioInput() const
-{
- const auto devices = QMediaDevices::audioInputs();
- QByteArray id = m_captureSession->audioInput().toLatin1();
-
- for (auto c : devices) {
- if (c.id() == id)
- return c;
- }
- return QMediaDevices::defaultAudioInput();
-}
-
-bool QAndroidCaptureService::setAudioInput(const QAudioDevice &info)
-{
- m_captureSession->setAudioInput(QString::fromLatin1(info.id()));
- return true;
+ m_captureSession->setAudioInput(input);
}
void QAndroidCaptureService::setVideoPreview(QVideoSink *sink)
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h
index ead543dfa..6e8dc5460 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h
@@ -80,12 +80,7 @@ public:
QPlatformMediaEncoder *mediaEncoder() override;
void setMediaEncoder(QPlatformMediaEncoder *encoder) override;
- bool isMuted() const override;
- void setMuted(bool muted) override;
- qreal volume() const override;
- void setVolume(qreal volume) override;
- QAudioDevice audioInput() const override;
- bool setAudioInput(const QAudioDevice &id) override;
+ void setAudioInput(QPlatformAudioInput *input) override;
void setVideoPreview(QVideoSink *sink) override;
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp b/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp
index 8eb80e071..f8861982e 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp
@@ -45,6 +45,7 @@
#include "qandroidmultimediautils_p.h"
#include "qandroidvideooutput_p.h"
#include "qandroidglobal_p.h"
+#include <private/qplatformaudioinput_p.h>
#include <QtCore/qmimetype.h>
#include <algorithm>
@@ -109,29 +110,28 @@ QAndroidCaptureSession::~QAndroidCaptureSession()
delete m_mediaRecorder;
}
-void QAndroidCaptureSession::setAudioInput(const QString &input)
+void QAndroidCaptureSession::setAudioInput(QPlatformAudioInput *input)
{
if (m_audioInput == input)
return;
m_audioInput = input;
- if (m_audioInput == QLatin1String("default"))
+ QString id = input ? QString::fromLatin1(input->device.id()) : QString();
+ if (id == QLatin1String("default"))
m_audioSource = AndroidMediaRecorder::DefaultAudioSource;
- else if (m_audioInput == QLatin1String("mic"))
+ else if (id == QLatin1String("mic"))
m_audioSource = AndroidMediaRecorder::Mic;
- else if (m_audioInput == QLatin1String("voice_uplink"))
+ else if (id == QLatin1String("voice_uplink"))
m_audioSource = AndroidMediaRecorder::VoiceUplink;
- else if (m_audioInput == QLatin1String("voice_downlink"))
+ else if (id == QLatin1String("voice_downlink"))
m_audioSource = AndroidMediaRecorder::VoiceDownlink;
- else if (m_audioInput == QLatin1String("voice_call"))
+ else if (id == QLatin1String("voice_call"))
m_audioSource = AndroidMediaRecorder::VoiceCall;
- else if (m_audioInput == QLatin1String("voice_recognition"))
+ else if (id == QLatin1String("voice_recognition"))
m_audioSource = AndroidMediaRecorder::VoiceRecognition;
else
m_audioSource = AndroidMediaRecorder::DefaultAudioSource;
-
- emit audioInputChanged(m_audioInput);
}
QUrl QAndroidCaptureSession::outputLocation() const
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h b/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h
index 4bb0c06f7..772c08738 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h
@@ -62,6 +62,7 @@
QT_BEGIN_NAMESPACE
+class QAudioInput;
class QAndroidCameraSession;
class QAndroidCaptureSession : public QObject
@@ -74,8 +75,7 @@ public:
QList<QSize> supportedResolutions() const { return m_supportedResolutions; }
QList<qreal> supportedFrameRates() const { return m_supportedFramerates; }
- QString audioInput() const { return m_audioInput; }
- void setAudioInput(const QString &input);
+ void setAudioInput(QPlatformAudioInput *input);
QUrl outputLocation() const;
bool setOutputLocation(const QUrl &location);
@@ -119,9 +119,6 @@ public:
m_mediaEncoder->error(QMediaEncoder::Error(error), errorString);
}
-Q_SIGNALS:
- void audioInputChanged(const QString& name);
-
private Q_SLOTS:
void updateDuration();
void onCameraOpened();
@@ -175,7 +172,7 @@ private:
AndroidMediaRecorder *m_mediaRecorder;
QAndroidCameraSession *m_cameraSession;
- QString m_audioInput;
+ QPlatformAudioInput *m_audioInput = nullptr;
AndroidMediaRecorder::AudioSource m_audioSource;
QMediaStorageLocation m_mediaStorageLocation;
diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice.mm b/src/multimedia/platform/darwin/camera/avfcameraservice.mm
index 899dd4602..8ee350d02 100644
--- a/src/multimedia/platform/darwin/camera/avfcameraservice.mm
+++ b/src/multimedia/platform/darwin/camera/avfcameraservice.mm
@@ -48,13 +48,14 @@
#include "avfcameraimagecapture_p.h"
#include "avfmediaencoder_p.h"
#include <qmediadevices.h>
+#include <private/qplatformaudioinput_p.h>
+#include <qaudioinput.h>
QT_USE_NAMESPACE
AVFCameraService::AVFCameraService()
{
m_session = new AVFCameraSession(this);
- m_audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
}
AVFCameraService::~AVFCameraService()
@@ -122,57 +123,35 @@ void AVFCameraService::setMediaEncoder(QPlatformMediaEncoder *encoder)
emit encoderChanged();
}
-bool AVFCameraService::isMuted() const
+void AVFCameraService::setAudioInput(QPlatformAudioInput *input)
{
- return m_muted;
-}
-
-void AVFCameraService::setMuted(bool muted)
-{
- if (m_muted != muted) {
- m_muted = muted;
- Q_EMIT mutedChanged(muted);
- }
-}
+ if (m_audioInput == input)
+ return;
+ if (m_audioInput)
+ m_audioInput->q->disconnect(this);
-qreal AVFCameraService::volume() const
-{
- return m_volume;
-}
+ m_audioInput = input;
-void AVFCameraService::setVolume(qreal volume)
-{
- if (m_volume != volume) {
- m_volume = volume;
- Q_EMIT volumeChanged(volume);
+ if (input) {
+ connect(m_audioInput->q, &QAudioInput::destroyed, this, &AVFCameraService::audioInputDestroyed);
+ connect(m_audioInput->q, &QAudioInput::deviceChanged, this, &AVFCameraService::audioInputChanged);
}
+ audioInputChanged();
}
-QAudioDevice AVFCameraService::audioInput() const
-{
- QByteArray id = [[m_audioCaptureDevice uniqueID] UTF8String];
- const QList<QAudioDevice> devices = QMediaDevices::audioInputs();
- for (auto d : devices)
- if (d.id() == id)
- return d;
- return QMediaDevices::defaultAudioInput();
-}
-
-bool AVFCameraService::setAudioInput(const QAudioDevice &id)
+void AVFCameraService::audioInputChanged()
{
- AVCaptureDevice *device = nullptr;
+ m_audioCaptureDevice = nullptr;
+ if (!m_audioInput)
+ return;
- if (!id.isNull()) {
- device = [AVCaptureDevice deviceWithUniqueID: [NSString stringWithUTF8String:id.id().constData()]];
+ QByteArray id = m_audioInput->device.id();
+ if (!id.isEmpty()) {
+ m_audioCaptureDevice = [AVCaptureDevice deviceWithUniqueID: [NSString stringWithUTF8String:id.constData()]];
} else {
- device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
- }
-
- if (device) {
- m_audioCaptureDevice = device;
- return true;
+ m_audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
}
- return false;
+ m_session->updateAudioInput();
}
void AVFCameraService::setVideoPreview(QVideoSink *sink)
diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
index 5698cda7a..d2c75096e 100644
--- a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
+++ b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
@@ -67,7 +67,7 @@ class AVFMediaEncoder;
class AVFCameraService : public QPlatformMediaCaptureSession
{
-Q_OBJECT
+ Q_OBJECT
public:
AVFCameraService();
~AVFCameraService();
@@ -81,12 +81,7 @@ public:
QPlatformMediaEncoder *mediaEncoder() override;
void setMediaEncoder(QPlatformMediaEncoder *encoder) override;
- bool isMuted() const override;
- void setMuted(bool muted) override;
- qreal volume() const override;
- void setVolume(qreal volume) override;
- QAudioDevice audioInput() const override;
- bool setAudioInput(const QAudioDevice &) override;
+ void setAudioInput(QPlatformAudioInput *) override;
void setVideoPreview(QVideoSink *sink) override;
@@ -96,9 +91,11 @@ public:
AVFCameraImageCapture *avfImageCaptureControl() const { return m_imageCaptureControl; }
AVCaptureDevice *audioCaptureDevice() const { return m_audioCaptureDevice; }
+public Q_SLOTS:
+ void audioInputDestroyed() { setAudioInput(nullptr); }
+ void audioInputChanged();
private:
- bool m_muted = false;
- qreal m_volume = 1.0;
+ QPlatformAudioInput *m_audioInput = nullptr;
AVCaptureDevice *m_audioCaptureDevice = nullptr;
AVFCameraSession *m_session = nullptr;
diff --git a/src/multimedia/platform/darwin/camera/avfcamerasession.mm b/src/multimedia/platform/darwin/camera/avfcamerasession.mm
index 745db0ae9..61dd83459 100644
--- a/src/multimedia/platform/darwin/camera/avfcamerasession.mm
+++ b/src/multimedia/platform/darwin/camera/avfcamerasession.mm
@@ -362,6 +362,8 @@ void AVFCameraSession::attachAudioInputDevice()
}
AVCaptureDevice *audioDevice = m_service->audioCaptureDevice();
+ if (!audioDevice)
+ return;
NSError *error = nil;
m_audioInput = [AVCaptureDeviceInput
@@ -429,4 +431,9 @@ void AVFCameraSession::setVideoSink(QVideoSink *sink)
}
}
+void AVFCameraSession::updateAudioInput()
+{
+ attachAudioInputDevice();
+}
+
#include "moc_avfcamerasession_p.cpp"
diff --git a/src/multimedia/platform/darwin/camera/avfcamerasession_p.h b/src/multimedia/platform/darwin/camera/avfcamerasession_p.h
index 530bdc96a..9d863e7fa 100644
--- a/src/multimedia/platform/darwin/camera/avfcamerasession_p.h
+++ b/src/multimedia/platform/darwin/camera/avfcamerasession_p.h
@@ -93,6 +93,7 @@ public:
AVCaptureDeviceInput *audioInput() const {return m_audioInput;}
void setVideoSink(QVideoSink *sink);
+ void updateAudioInput();
public Q_SLOTS:
void setActive(bool active);
diff --git a/src/multimedia/platform/gstreamer/common/qgstreameraudioinput.cpp b/src/multimedia/platform/gstreamer/common/qgstreameraudioinput.cpp
index 3867038cd..46e941a00 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreameraudioinput.cpp
+++ b/src/multimedia/platform/gstreamer/common/qgstreameraudioinput.cpp
@@ -40,6 +40,7 @@
#include <private/qgstreameraudioinput_p.h>
#include <private/qgstreameraudiodevice_p.h>
#include <qaudiodevice.h>
+#include <qaudioinput.h>
#include <QtCore/qloggingcategory.h>
#include <QtNetwork/qnetworkaccessmanager.h>
@@ -53,9 +54,10 @@ Q_LOGGING_CATEGORY(qLcMediaAudioInput, "qt.multimedia.audioInput")
QT_BEGIN_NAMESPACE
-QGstreamerAudioInput::QGstreamerAudioInput(QObject *parent)
- : QObject(parent),
- gstAudioInput("audioInput")
+QGstreamerAudioInput::QGstreamerAudioInput(QAudioInput *parent)
+ : QObject(parent),
+ QPlatformAudioInput(parent),
+ gstAudioInput("audioInput")
{
audioSrc = QGstElement("autoaudiosrc", "autoaudiosrc");
audioVolume = QGstElement("volume", "volume");
@@ -79,12 +81,12 @@ bool QGstreamerAudioInput::isMuted() const
return m_muted;
}
-void QGstreamerAudioInput::setVolume(int vol)
+void QGstreamerAudioInput::setVolume(float vol)
{
if (vol == m_volume)
return;
m_volume = vol;
- audioVolume.set("volume", vol/100.);
+ audioVolume.set("volume", vol);
emit volumeChanged(m_volume);
}
@@ -102,28 +104,27 @@ void QGstreamerAudioInput::setPipeline(const QGstPipeline &pipeline)
gstPipeline = pipeline;
}
-bool QGstreamerAudioInput::setAudioInput(const QAudioDevice &info)
+void QGstreamerAudioInput::setAudioDevice(const QAudioDevice &device)
{
- if (info == m_audioInput)
- return true;
- qCDebug(qLcMediaAudioInput) << "setAudioInput" << info.description() << info.isNull();
- m_audioInput = info;
+ if (device == m_audioDevice)
+ return;
+ qCDebug(qLcMediaAudioInput) << "setAudioInput" << device.description() << device.isNull();
+ m_audioDevice = device;
- auto state = gstPipeline.state();
- if (state != GST_STATE_PLAYING)
- return changeAudioInput();
+ if (gstPipeline.isNull() || gstPipeline.state() != GST_STATE_PLAYING) {
+ changeAudioInput();
+ return;
+ }
auto pad = audioVolume.staticPad("src");
pad.addProbe<&QGstreamerAudioInput::prepareAudioInputChange>(this, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM);
-
- return true;
}
bool QGstreamerAudioInput::changeAudioInput()
{
qCDebug(qLcMediaAudioInput) << "Changing audio Input";
QGstElement newSrc;
- auto *deviceInfo = static_cast<const QGStreamerAudioDeviceInfo *>(m_audioInput.handle());
+ auto *deviceInfo = static_cast<const QGStreamerAudioDeviceInfo *>(m_audioDevice.handle());
if (deviceInfo && deviceInfo->gstDevice)
newSrc = gst_device_create_element(deviceInfo->gstDevice , "audiosrc");
@@ -151,7 +152,7 @@ void QGstreamerAudioInput::prepareAudioInputChange(const QGstPad &/*pad*/)
QAudioDevice QGstreamerAudioInput::audioInput() const
{
- return m_audioInput;
+ return m_audioDevice;
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/common/qgstreameraudioinput_p.h b/src/multimedia/platform/gstreamer/common/qgstreameraudioinput_p.h
index 46ab7b78e..5a6a330ac 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreameraudioinput_p.h
+++ b/src/multimedia/platform/gstreamer/common/qgstreameraudioinput_p.h
@@ -58,18 +58,19 @@
#include <private/qgst_p.h>
#include <private/qgstpipeline_p.h>
+#include <private/qplatformaudioinput_p.h>
QT_BEGIN_NAMESPACE
class QGstreamerMessage;
class QAudioDevice;
-class Q_MULTIMEDIA_EXPORT QGstreamerAudioInput : public QObject
+class Q_MULTIMEDIA_EXPORT QGstreamerAudioInput : public QObject, public QPlatformAudioInput
{
Q_OBJECT
public:
- QGstreamerAudioInput(QObject *parent = 0);
+ QGstreamerAudioInput(QAudioInput *parent);
~QGstreamerAudioInput();
int volume() const;
@@ -78,8 +79,9 @@ public:
bool setAudioInput(const QAudioDevice &);
QAudioDevice audioInput() const;
- void setVolume(int volume);
- void setMuted(bool muted);
+ void setAudioDevice(const QAudioDevice &) override;
+ void setVolume(float volume) override;
+ void setMuted(bool muted) override;
void setPipeline(const QGstPipeline &pipeline);
@@ -93,10 +95,10 @@ private:
void prepareAudioInputChange(const QGstPad &pad);
bool changeAudioInput();
- int m_volume = 100.;
+ float m_volume = 1.;
bool m_muted = false;
- QAudioDevice m_audioInput;
+ QAudioDevice m_audioDevice;
// Gst elements
QGstPipeline gstPipeline;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
index a6bac1a04..80518af3c 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
@@ -57,20 +57,6 @@ Q_LOGGING_CATEGORY(qLcMediaCapture, "qt.multimedia.capture")
QGstreamerMediaCapture::QGstreamerMediaCapture()
: gstPipeline("pipeline")
{
- gstAudioInput = new QGstreamerAudioInput(this);
- gstAudioInput->setPipeline(gstPipeline);
- connect(gstAudioInput, &QGstreamerAudioInput::mutedChanged, this, &QGstreamerMediaCapture::mutedChanged);
- connect(gstAudioInput, &QGstreamerAudioInput::volumeChanged, this, &QGstreamerMediaCapture::volumeChanged);
-
- gstAudioOutput = new QGstreamerAudioOutput(this);
- gstAudioOutput->setPipeline(gstPipeline);
- gstAudioTee = QGstElement("tee", "audiotee");
-
- gstPipeline.add(gstAudioInput->gstElement(), gstAudioTee, gstAudioOutput->gstElement());
- gstAudioInput->gstElement().link(gstAudioTee);
- auto pad = gstAudioTee.getRequestPad("src_%u");
- pad.link(gstAudioOutput->gstElement().staticPad("sink"));
-
gstVideoOutput = new QGstreamerVideoOutput(this);
gstVideoOutput->setIsPreview();
gstVideoOutput->setPipeline(gstPipeline);
@@ -179,34 +165,18 @@ QPlatformMediaEncoder *QGstreamerMediaCapture::mediaEncoder()
return m_mediaEncoder;
}
-QAudioDevice QGstreamerMediaCapture::audioInput() const
-{
- return gstAudioInput->audioInput();
-}
-
-bool QGstreamerMediaCapture::setAudioInput(const QAudioDevice &info)
-{
- return gstAudioInput->setAudioInput(info);
-}
-
-bool QGstreamerMediaCapture::isMuted() const
-{
- return gstAudioOutput->isMuted();
-}
-
-void QGstreamerMediaCapture::setMuted(bool muted)
-{
- gstAudioOutput->setMuted(muted);
-}
-
-qreal QGstreamerMediaCapture::volume() const
+void QGstreamerMediaCapture::setAudioInput(QPlatformAudioInput *input)
{
- return gstAudioOutput->volume();
-}
-
-void QGstreamerMediaCapture::setVolume(qreal volume)
-{
- gstAudioOutput->setVolume(volume);
+ if (gstAudioInput == input)
+ return;
+ if (gstAudioInput) {
+ gstAudioInput = nullptr;
+ setupAudioPipeline();
+ }
+ gstAudioInput = static_cast<QGstreamerAudioInput *>(input);
+ if (gstAudioInput)
+ gstAudioInput->setPipeline(gstPipeline);
+ setupAudioPipeline();
}
void QGstreamerMediaCapture::setVideoPreview(QVideoSink *sink)
@@ -247,5 +217,30 @@ void QGstreamerMediaCapture::releaseVideoPad(const QGstPad &pad) const
gstVideoTee.releaseRequestPad(pad);
}
+void QGstreamerMediaCapture::setupAudioPipeline()
+{
+ gstPipeline.setStateSync(GST_STATE_PAUSED);
+
+ if (!gstAudioInput) {
+ if (gstAudioOutput)
+ gstPipeline.remove(gstAudioOutput->gstElement());
+ if (!gstAudioTee.isNull())
+ gstPipeline.remove(gstAudioTee);
+ return;
+ }
+ if (!gstAudioOutput) {
+ gstAudioOutput = new QGstreamerAudioOutput(this);
+ gstAudioOutput->setPipeline(gstPipeline);
+ }
+ gstAudioTee = QGstElement("tee", "audiotee");
+
+ gstPipeline.add(gstAudioInput->gstElement(), gstAudioTee, gstAudioOutput->gstElement());
+ gstAudioInput->gstElement().link(gstAudioTee);
+ auto pad = gstAudioTee.getRequestPad("src_%u");
+ pad.link(gstAudioOutput->gstElement().staticPad("sink"));
+
+ gstPipeline.setStateSync(GST_STATE_PLAYING);
+}
+
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h
index d4ad23292..20824443e 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h
@@ -83,20 +83,12 @@ public:
QPlatformMediaEncoder *mediaEncoder() override;
void setMediaEncoder(QPlatformMediaEncoder *encoder) override;
- bool isMuted() const override;
- void setMuted(bool) override;
- qreal volume() const override;
- void setVolume(qreal volume) override;
-
- QAudioDevice audioInput() const override;
- bool setAudioInput(const QAudioDevice &id) override;
+ void setAudioInput(QPlatformAudioInput *input) override;
void setVideoPreview(QVideoSink *sink) override;
QAudioDevice audioPreview() const override;
bool setAudioPreview(const QAudioDevice &info) override;
- // void cameraChanged();
-
QGstPad getAudioPad() const;
QGstPad getVideoPad() const;
void releaseAudioPad(const QGstPad &pad) const;
@@ -104,6 +96,8 @@ public:
QGstPipeline pipeline() const { return gstPipeline; }
+ void setupAudioPipeline();
+
private:
friend QGstreamerMediaEncoder;
// Gst elements
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
index c50f91a6a..9a9fdfd9e 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
@@ -317,8 +317,10 @@ void QGstreamerMediaEncoder::record()
gstFileSink.lockState(false);
audioSrcPad = m_session->getAudioPad();
- QGstPad audioPad = gstEncoder.getRequestPad("audio_%u");
- audioSrcPad.link(audioPad);
+ if (!audioSrcPad.isNull()) {
+ QGstPad audioPad = gstEncoder.getRequestPad("audio_%u");
+ audioSrcPad.link(audioPad);
+ }
if (m_resolvedSettings.videoCodec() != QMediaFormat::VideoCodec::Unspecified) {
videoSrcPad = m_session->getVideoPad();
diff --git a/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp b/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp
index dc83ffcda..e834f1141 100644
--- a/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp
+++ b/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp
@@ -48,6 +48,8 @@
#include "private/qgstreamerformatinfo_p.h"
#include "private/qgstreamervideorenderer_p.h"
#include "private/qgstreamervideosink_p.h"
+#include "private/qgstreameraudioinput_p.h"
+#include "private/qgstreameraudiooutput_p.h"
QT_BEGIN_NAMESPACE
@@ -109,4 +111,15 @@ QPlatformVideoSink *QGstreamerIntegration::createVideoSink(QVideoSink *sink)
return new QGstreamerVideoSink(sink);
}
+QPlatformAudioInput *QGstreamerIntegration::createAudioInput(QAudioInput *q)
+{
+ return new QGstreamerAudioInput(q);
+}
+
+QPlatformAudioOutput *QGstreamerIntegration::createAudioOutput(QAudioOutput *)
+{
+// return new QGstreamerAudioOutput(q);
+ return nullptr;
+}
+
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h b/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h
index e445cdb82..2ffd73925 100644
--- a/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h
+++ b/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h
@@ -78,6 +78,9 @@ public:
QPlatformVideoSink *createVideoSink(QVideoSink *sink) override;
+ QPlatformAudioInput *createAudioInput(QAudioInput *) override;
+ QPlatformAudioOutput *createAudioOutput(QAudioOutput *) override;
+
QGstreamerMediaDevices *m_devices = nullptr;
QGstreamerFormatInfo *m_formatsInfo = nullptr;
};
diff --git a/src/multimedia/platform/qplatformaudioinput_p.h b/src/multimedia/platform/qplatformaudioinput_p.h
index e68fc99d2..c4e4334b3 100644
--- a/src/multimedia/platform/qplatformaudioinput_p.h
+++ b/src/multimedia/platform/qplatformaudioinput_p.h
@@ -55,15 +55,19 @@
QT_BEGIN_NAMESPACE
+class QAudioInput;
+
class Q_MULTIMEDIA_EXPORT QPlatformAudioInput
{
public:
+ QPlatformAudioInput(QAudioInput *qq) : q(qq) {}
virtual ~QPlatformAudioInput() {}
- virtual bool setAudioDevice(const QAudioDevice &id) = 0;
- virtual void setMuted(bool muted) = 0;
- virtual void setVolume(qreal volume) = 0;
+ virtual void setAudioDevice(const QAudioDevice &/*device*/) {}
+ virtual void setMuted(bool /*muted*/) {}
+ virtual void setVolume(float /*volume*/) {}
+ QAudioInput *q = nullptr;
QAudioDevice device;
float volume = 1.;
bool muted = false;
diff --git a/src/multimedia/platform/qplatformaudiooutput_p.h b/src/multimedia/platform/qplatformaudiooutput_p.h
index 3c0b155f9..594d59ed0 100644
--- a/src/multimedia/platform/qplatformaudiooutput_p.h
+++ b/src/multimedia/platform/qplatformaudiooutput_p.h
@@ -55,15 +55,19 @@
QT_BEGIN_NAMESPACE
+class QAudioOutput;
+
class Q_MULTIMEDIA_EXPORT QPlatformAudioOutput
{
public:
+ QPlatformAudioOutput(QAudioOutput *qq) : q(qq) {}
virtual ~QPlatformAudioOutput() {}
- virtual bool setAudioDevice(const QAudioDevice &id) = 0;
- virtual void setMuted(bool muted) = 0;
- virtual void setVolume(qreal volume) = 0;
+ virtual void setAudioDevice(const QAudioDevice &/*device*/) {}
+ virtual void setMuted(bool /*muted*/) {}
+ virtual void setVolume(float /*volume*/) {}
+ QAudioOutput *q = nullptr;
QAudioDevice device;
float volume = 1.;
bool muted = false;
diff --git a/src/multimedia/platform/qplatformmediacapture.cpp b/src/multimedia/platform/qplatformmediacapture.cpp
index 50a8c9c56..ee2c53567 100644
--- a/src/multimedia/platform/qplatformmediacapture.cpp
+++ b/src/multimedia/platform/qplatformmediacapture.cpp
@@ -46,19 +46,6 @@ QT_BEGIN_NAMESPACE
QPlatformMediaCaptureSession::~QPlatformMediaCaptureSession()
{
- if (m_audioInput)
- m_audioInput->setPlatformInterface(nullptr);
-}
-
-void QPlatformMediaCaptureSession::setAudioInput(QAudioInput *input)
-{
- if (m_audioInput == input)
- return;
- if (m_audioInput)
- m_audioInput->setPlatformInterface(nullptr);
- m_audioInput = input;
- if (m_audioInput)
- m_audioInput->setPlatformInterface(this);
}
QAudioDevice QPlatformMediaCaptureSession::audioPreview() const
diff --git a/src/multimedia/platform/qplatformmediacapture_p.h b/src/multimedia/platform/qplatformmediacapture_p.h
index 13d47033a..46f555d89 100644
--- a/src/multimedia/platform/qplatformmediacapture_p.h
+++ b/src/multimedia/platform/qplatformmediacapture_p.h
@@ -52,7 +52,6 @@
#include <private/qtmultimediaglobal_p.h>
#include <QtCore/qobject.h>
-#include <private/qplatformaudiointerface_p.h>
QT_BEGIN_NAMESPACE
class QPlatformCamera;
@@ -61,9 +60,9 @@ class QPlatformMediaEncoder;
class QAudioDevice;
class QCameraDevice;
class QVideoSink;
-class QAudioInput;
+class QPlatformAudioInput;
-class Q_MULTIMEDIA_EXPORT QPlatformMediaCaptureSession : public QObject, public QPlatformAudioInterface
+class Q_MULTIMEDIA_EXPORT QPlatformMediaCaptureSession : public QObject
{
Q_OBJECT
public:
@@ -79,21 +78,16 @@ public:
virtual QPlatformMediaEncoder *mediaEncoder() = 0;
virtual void setMediaEncoder(QPlatformMediaEncoder *) {}
- void setAudioInput(QAudioInput *input);
+ virtual void setAudioInput(QPlatformAudioInput *input) = 0;
virtual void setVideoPreview(QVideoSink * /*sink*/) {}
virtual QAudioDevice audioPreview() const;
virtual bool setAudioPreview(const QAudioDevice &) { return true; }
Q_SIGNALS:
- void mutedChanged(bool muted);
- void volumeChanged(qreal volume);
void cameraChanged();
void imageCaptureChanged();
void encoderChanged();
-
-private:
- QAudioInput *m_audioInput = nullptr;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/qplatformmediaintegration.cpp b/src/multimedia/platform/qplatformmediaintegration.cpp
index cf5abb9e9..b49ebccdc 100644
--- a/src/multimedia/platform/qplatformmediaintegration.cpp
+++ b/src/multimedia/platform/qplatformmediaintegration.cpp
@@ -41,6 +41,8 @@
#include "qplatformmediaintegration_p.h"
#include <qatomic.h>
#include <qmutex.h>
+#include <qplatformaudioinput_p.h>
+#include <qplatformaudiooutput_p.h>
#if QT_CONFIG(gstreamer)
#include <private/qgstreamerintegration_p.h>
@@ -108,6 +110,16 @@ void QPlatformMediaIntegration::setIntegration(QPlatformMediaIntegration *integr
holder.instance = integration;
}
+QPlatformAudioInput *QPlatformMediaIntegration::createAudioInput(QAudioInput *q)
+{
+ return new QPlatformAudioInput(q);
+}
+
+QPlatformAudioOutput *QPlatformMediaIntegration::createAudioOutput(QAudioOutput *q)
+{
+ return new QPlatformAudioOutput(q);
+}
+
QPlatformMediaIntegration::~QPlatformMediaIntegration()
= default;
diff --git a/src/multimedia/platform/qplatformmediaintegration_p.h b/src/multimedia/platform/qplatformmediaintegration_p.h
index 7d6131925..28c447a82 100644
--- a/src/multimedia/platform/qplatformmediaintegration_p.h
+++ b/src/multimedia/platform/qplatformmediaintegration_p.h
@@ -96,8 +96,8 @@ public:
virtual QPlatformMediaEncoder *createEncoder(QMediaEncoder *) { return nullptr; }
virtual QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *) { return nullptr; }
- virtual QPlatformAudioInput *createAudioInput(QAudioInput *) { return nullptr; }
- virtual QPlatformAudioOutput *createAudioOutput(QAudioOutput *) { return nullptr; }
+ virtual QPlatformAudioInput *createAudioInput(QAudioInput *);
+ virtual QPlatformAudioOutput *createAudioOutput(QAudioOutput *);
virtual QPlatformVideoSink *createVideoSink(QVideoSink *) { return nullptr; }
};
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp
index 5e8928295..043e3ac41 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp
@@ -45,6 +45,7 @@
#include "qwindowscameraimagecapture_p.h"
#include "qmediadevices.h"
#include "qaudiodevice.h"
+#include "qplatformaudioinput_p.h"
QT_BEGIN_NAMESPACE
@@ -118,34 +119,9 @@ void QWindowsMediaCaptureService::setMediaEncoder(QPlatformMediaEncoder *encoder
emit encoderChanged();
}
-bool QWindowsMediaCaptureService::isMuted() const
+void QWindowsMediaCaptureService::setAudioInput(QPlatformAudioInput *input)
{
- return m_mediaDeviceSession->isMuted();
-}
-
-void QWindowsMediaCaptureService::setMuted(bool muted)
-{
- m_mediaDeviceSession->setMuted(muted);
-}
-
-qreal QWindowsMediaCaptureService::volume() const
-{
- return m_mediaDeviceSession->volume();
-}
-
-void QWindowsMediaCaptureService::setVolume(qreal volume)
-{
- m_mediaDeviceSession->setVolume(volume);
-}
-
-QAudioDevice QWindowsMediaCaptureService::audioInput() const
-{
- return m_mediaDeviceSession->audioInput();
-}
-
-bool QWindowsMediaCaptureService::setAudioInput(const QAudioDevice &info)
-{
- return m_mediaDeviceSession->setAudioInput(info);
+ m_mediaDeviceSession->setAudioInput(input ? input->q : nullptr);
}
void QWindowsMediaCaptureService::setVideoPreview(QVideoSink *sink)
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h
index d67decd8e..f5da2f498 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h
@@ -59,6 +59,7 @@ class QWindowsMediaEncoder;
class QWindowsCamera;
class QWindowsMediaDeviceSession;
class QWindowsCameraImageCapture;
+class QPlatformAudioInput;
class QWindowsMediaCaptureService : public QPlatformMediaCaptureSession
{
@@ -77,12 +78,7 @@ public:
QPlatformMediaEncoder *mediaEncoder() override;
void setMediaEncoder(QPlatformMediaEncoder *encoder) override;
- bool isMuted() const override;
- void setMuted(bool muted) override;
- qreal volume() const override;
- void setVolume(qreal volume) override;
- QAudioDevice audioInput() const override;
- bool setAudioInput(const QAudioDevice &) override;
+ void setAudioInput(QPlatformAudioInput *) override;
void setVideoPreview(QVideoSink *sink) override;
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp
index c29018e1d..1776f9fe9 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp
@@ -43,6 +43,7 @@
#include "qwindowsmultimediautils_p.h"
#include <qvideosink.h>
#include <QtCore/qdebug.h>
+#include <qaudioinput.h>
QT_BEGIN_NAMESPACE
@@ -81,7 +82,7 @@ void QWindowsMediaDeviceSession::setActive(bool active)
if (active) {
auto camId = QString::fromUtf8(m_activeCameraDevice.id());
- auto micId = QString::fromUtf8(m_audioInput.id());
+ auto micId = m_audioInput ? QString::fromUtf8(m_audioInput->device().id()) : QString();
if (!camId.isEmpty() || !micId.isEmpty()) {
m_activating = true;
m_mediaDeviceReader->activate(camId, m_cameraFormat, micId);
@@ -156,35 +157,34 @@ void QWindowsMediaDeviceSession::setVideoSettings(const QMediaEncoderSettings &s
m_mediaEncoderSettings = settings;
}
-bool QWindowsMediaDeviceSession::isMuted() const
-{
- return m_mediaDeviceReader->isMuted();
-}
-
-void QWindowsMediaDeviceSession::setMuted(bool muted)
+void QWindowsMediaDeviceSession::setAudioInputMuted(bool muted)
{
m_mediaDeviceReader->setMuted(muted);
}
-qreal QWindowsMediaDeviceSession::volume() const
-{
- return m_mediaDeviceReader->volume();
-}
-
-void QWindowsMediaDeviceSession::setVolume(qreal volume)
+void QWindowsMediaDeviceSession::setAudioInputVolume(float volume)
{
m_mediaDeviceReader->setVolume(volume);
}
-QAudioDevice QWindowsMediaDeviceSession::audioInput() const
+void QWindowsMediaDeviceSession::audioInputDeviceChanged()
{
- return m_audioInput;
+ // ### FIXME: get the new input device from m_audioInput and adjust
+ // the pipeline
}
-bool QWindowsMediaDeviceSession::setAudioInput(const QAudioDevice &info)
+void QWindowsMediaDeviceSession::setAudioInput(QAudioInput *input)
{
- m_audioInput = info;
- return true;
+ if (m_audioInput == input)
+ return;
+ if (m_audioInput)
+ m_audioInput->disconnect(this);
+ m_audioInput = input;
+ if (!m_audioInput)
+ return;
+ connect(m_audioInput, &QAudioInput::mutedChanged, this, &QWindowsMediaDeviceSession::setAudioInputMuted);
+ connect(m_audioInput, &QAudioInput::volumeChanged, this, &QWindowsMediaDeviceSession::setAudioInputVolume);
+ connect(m_audioInput, &QAudioInput::deviceChanged, this, &QWindowsMediaDeviceSession::audioInputDeviceChanged);
}
bool QWindowsMediaDeviceSession::startRecording(const QString &fileName, bool audioOnly)
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h
index 08a513264..2a2d04f7c 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h
@@ -59,6 +59,7 @@
QT_BEGIN_NAMESPACE
+class QAudioInput;
class QVideoSink;
class QWindowsMediaDeviceReader;
@@ -84,12 +85,12 @@ public:
QMediaEncoderSettings videoSettings() const;
void setVideoSettings(const QMediaEncoderSettings &settings);
- bool isMuted() const;
- void setMuted(bool muted);
- qreal volume() const;
- void setVolume(qreal volume);
- QAudioDevice audioInput() const;
- bool setAudioInput(const QAudioDevice &info);
+public Q_SLOTS:
+ void setAudioInputMuted(bool muted);
+ void setAudioInputVolume(float volume);
+ void audioInputDeviceChanged();
+public:
+ void setAudioInput(QAudioInput *input);
bool startRecording(const QString &fileName, bool audioOnly);
void stopRecording();
@@ -121,7 +122,7 @@ private:
QCameraFormat m_cameraFormat;
QWindowsMediaDeviceReader *m_mediaDeviceReader = nullptr;
QMediaEncoderSettings m_mediaEncoderSettings;
- QAudioDevice m_audioInput;
+ QAudioInput *m_audioInput = nullptr;
QVideoSink *m_surface = nullptr;
};
diff --git a/src/multimedia/recording/qmediacapturesession.cpp b/src/multimedia/recording/qmediacapturesession.cpp
index 9fd68e0a9..82ed9a558 100644
--- a/src/multimedia/recording/qmediacapturesession.cpp
+++ b/src/multimedia/recording/qmediacapturesession.cpp
@@ -48,6 +48,7 @@
#include "qplatformmediaintegration_p.h"
#include "qplatformmediacapture_p.h"
+#include "qaudioinput.h"
QT_BEGIN_NAMESPACE
@@ -56,7 +57,7 @@ class QMediaCaptureSessionPrivate
public:
QMediaCaptureSession *q = nullptr;
QPlatformMediaCaptureSession *captureSession;
- QAudioDevice audioInput;
+ QAudioInput *audioInput = nullptr;
QCamera *camera = nullptr;
QCameraImageCapture *imageCapture = nullptr;
QMediaEncoder *encoder = nullptr;
@@ -75,6 +76,7 @@ public:
captureSession->setVideoPreview(sink);
emit q->videoOutputChanged();
}
+
};
/*!
@@ -108,9 +110,6 @@ QMediaCaptureSession::QMediaCaptureSession(QObject *parent)
{
d_ptr->q = this;
d_ptr->captureSession = QPlatformMediaIntegration::instance()->createCaptureSession();
-
- connect(d_ptr->captureSession, SIGNAL(mutedChanged(bool)), this, SIGNAL(mutedChanged(bool)));
- connect(d_ptr->captureSession, SIGNAL(volumeChanged(qreal)), this, SIGNAL(volumeChanged(qreal)));
}
/*!
@@ -140,7 +139,7 @@ bool QMediaCaptureSession::isAvailable() const
/*!
Returns the device that is being used to capture audio.
*/
-QAudioDevice QMediaCaptureSession::audioInput() const
+QAudioInput *QMediaCaptureSession::audioInput() const
{
return d_ptr->audioInput;
}
@@ -154,55 +153,16 @@ QAudioDevice QMediaCaptureSession::audioInput() const
\sa muted(), setMuted()
*/
-void QMediaCaptureSession::setAudioInput(const QAudioDevice &device)
+void QMediaCaptureSession::setAudioInput(QAudioInput *device)
{
+ if (d_ptr->audioInput == device)
+ return;
d_ptr->audioInput = device;
- d_ptr->captureSession->setAudioInput(device);
+ d_ptr->captureSession->setAudioInput(device->handle());
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);
-}
-
-/*!
\property QMediaCaptureSession::camera
\brief the camera used to capture video.
diff --git a/src/multimedia/recording/qmediacapturesession.h b/src/multimedia/recording/qmediacapturesession.h
index 947b964c9..ce5555a93 100644
--- a/src/multimedia/recording/qmediacapturesession.h
+++ b/src/multimedia/recording/qmediacapturesession.h
@@ -46,7 +46,7 @@
QT_BEGIN_NAMESPACE
class QCamera;
-class QAudioDevice;
+class QAudioInput;
class QCameraDevice;
class QCameraImageCapture; // ### rename to QMediaImageCapture
class QMediaEncoder;
@@ -57,9 +57,7 @@ class QMediaCaptureSessionPrivate;
class Q_MULTIMEDIA_EXPORT QMediaCaptureSession : public QObject
{
Q_OBJECT
- Q_PROPERTY(QAudioDevice 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(QAudioInput *audioInput READ audioInput WRITE setAudioInput NOTIFY audioInputChanged)
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,13 +68,8 @@ public:
bool isAvailable() const;
- QAudioDevice audioInput() const; // ### Should use a QAudioDevice *
- void setAudioInput(const QAudioDevice &device);
-
- bool isMuted() const; // ### Should move to QAudioDevice
- void setMuted(bool muted);
- qreal volume() const;
- void setVolume(qreal volume);
+ QAudioInput *audioInput() const;
+ void setAudioInput(QAudioInput *device);
QCamera *camera() const;
void setCamera(QCamera *camera);
@@ -97,8 +90,6 @@ 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/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp
index f26e53c91..a08b4d19e 100644
--- a/src/multimedia/recording/qmediarecorder.cpp
+++ b/src/multimedia/recording/qmediarecorder.cpp
@@ -41,9 +41,11 @@
#include <qaudiodevice.h>
#include <qcamera.h>
+#include <qmediadevices.h>
#include <qmediacapturesession.h>
#include <qmediaencoder.h>
#include <qcamera.h>
+#include <qaudioinput.h>
#include <QtCore/qdebug.h>
#include <QtCore/qurl.h>
@@ -59,6 +61,7 @@ public:
QMediaCaptureSession *captureSession = nullptr;
QCamera *camera = nullptr;
QMediaEncoder *encoder = nullptr;
+ QAudioInput *audioInput = nullptr;
QMediaRecorder *q_ptr = nullptr;
};
@@ -98,6 +101,8 @@ QMediaRecorder::QMediaRecorder(QObject *parent, CaptureMode mode)
d->q_ptr = this;
d->captureSession = new QMediaCaptureSession(this);
+ d->audioInput = new QAudioInput(this);
+ d->captureSession->setAudioInput(d->audioInput);
d->encoder = new QMediaEncoder(this);
d->captureSession->setEncoder(d->encoder);
setCaptureMode(mode);
@@ -105,8 +110,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::actualLocationChanged, this, &QMediaRecorder::actualLocationChanged);
- connect(d->captureSession, &QMediaCaptureSession::mutedChanged, this, &QMediaRecorder::mutedChanged);
- connect(d->captureSession, &QMediaCaptureSession::volumeChanged, this, &QMediaRecorder::volumeChanged);
+ connect(d->audioInput, &QAudioInput::mutedChanged, this, &QMediaRecorder::mutedChanged);
+ connect(d->audioInput, &QAudioInput::volumeChanged, this, &QMediaRecorder::volumeChanged);
connect(d->captureSession, &QMediaCaptureSession::videoOutputChanged, this, &QMediaRecorder::videoOutputChanged);
}
@@ -270,12 +275,12 @@ qint64 QMediaRecorder::duration() const
bool QMediaRecorder::isMuted() const
{
- return d_ptr->captureSession->isMuted();
+ return d_ptr->audioInput->isMuted();
}
void QMediaRecorder::setMuted(bool muted)
{
- d_ptr->captureSession->setMuted(muted);
+ d_ptr->audioInput->setMuted(muted);
}
/*!
@@ -295,12 +300,12 @@ void QMediaRecorder::setMuted(bool muted)
qreal QMediaRecorder::volume() const
{
- return d_ptr->captureSession->volume();
+ return d_ptr->audioInput->volume();
}
void QMediaRecorder::setVolume(qreal volume)
{
- d_ptr->captureSession->setVolume(volume);
+ d_ptr->audioInput->setVolume(volume);
}
/*!
diff --git a/tests/auto/unit/mockbackend/qmockmediacapturesession.h b/tests/auto/unit/mockbackend/qmockmediacapturesession.h
index a895a4227..8ddbeefcd 100644
--- a/tests/auto/unit/mockbackend/qmockmediacapturesession.h
+++ b/tests/auto/unit/mockbackend/qmockmediacapturesession.h
@@ -82,45 +82,15 @@ public:
void setVideoPreview(QVideoSink *) override {}
- bool isMuted() const override
+ void setAudioInput(QPlatformAudioInput *input) 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);
- }
-
- QAudioDevice audioInput() const override
- {
- return m_audioInput;
- }
- bool setAudioInput(const QAudioDevice &id) override
- {
- m_audioInput = id;
- return true;
+ m_audioInput = input;
}
QMockCamera *mockCameraControl = nullptr;
QPlatformCameraImageCapture *mockImageCapture = nullptr;
QMockMediaEncoder *mockControl = nullptr;
-
- QAudioDevice m_audioInput;
- bool m_muted = false;
- qreal m_volume = 1.0;
+ QPlatformAudioInput *m_audioInput = nullptr;
bool hasControls;
};