summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-06-16 09:21:35 +0200
committerLars Knoll <lars.knoll@qt.io>2021-06-16 09:21:35 +0200
commitda35e256f5da8d93cef0ab1bed8ca3e8ccfe5a43 (patch)
tree6eafa4110806eb354f899cbd4fea2b826c9fdf2c
parent3287ad8656b700f245834f09458bc1613beb9757 (diff)
parentfde5d6f7cce6118cac4ce7b92cd056225737917f (diff)
Merge remote-tracking branch 'origin/dev' into 6.2
-rw-r--r--CMakeLists.txt6
-rw-r--r--examples/multimedia/audiodecoder/audiodecoder.cpp5
-rw-r--r--examples/multimedia/audiodecoder/audiodecoder.h1
-rw-r--r--examples/multimedia/audiodecoder/main.cpp3
-rw-r--r--examples/multimedia/audiodevices/audiodevices.cpp4
-rw-r--r--examples/multimedia/audiodevices/audiodevices.h2
-rw-r--r--examples/multimedia/audiorecorder/audiorecorder.cpp57
-rw-r--r--examples/multimedia/audiorecorder/audiorecorder.h8
-rw-r--r--examples/multimedia/audiorecorder/doc/src/audiorecorder.qdoc2
-rw-r--r--examples/multimedia/declarative-camera/VideoPreview.qml2
-rw-r--r--examples/multimedia/spectrum/app/engine.cpp26
-rw-r--r--examples/multimedia/spectrum/app/engine.h8
-rw-r--r--examples/multimedia/spectrum/app/mainwidget.cpp6
-rw-r--r--examples/multimedia/spectrum/app/mainwidget.h4
-rw-r--r--examples/multimedia/video/mediaplayer/main.qml3
-rw-r--r--examples/multimedia/video/qmlvideo/qml/qmlvideo/VideoItem.qml3
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/ContentVideo.qml6
-rw-r--r--examples/multimediawidgets/camera/camera.cpp36
-rw-r--r--examples/multimediawidgets/camera/camera.h9
-rw-r--r--examples/multimediawidgets/camera/imagesettings.cpp30
-rw-r--r--examples/multimediawidgets/camera/imagesettings.h3
-rw-r--r--examples/multimediawidgets/camera/videosettings.cpp12
-rw-r--r--examples/multimediawidgets/camera/videosettings.h6
-rw-r--r--examples/multimediawidgets/player/player.cpp29
-rw-r--r--examples/multimediawidgets/player/player.h3
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/multimedia/QtAndroidMediaPlayer.java22
-rw-r--r--src/multimedia/CMakeLists.txt17
-rw-r--r--src/multimedia/audio/qaudio.cpp17
-rw-r--r--src/multimedia/audio/qaudio.h2
-rw-r--r--src/multimedia/audio/qaudiodecoder.h5
-rw-r--r--src/multimedia/audio/qaudiodevice.cpp19
-rw-r--r--src/multimedia/audio/qaudiodevice.h12
-rw-r--r--src/multimedia/audio/qaudiodevice_p.h4
-rw-r--r--src/multimedia/audio/qaudioinput.cpp151
-rw-r--r--src/multimedia/audio/qaudioinput.h87
-rw-r--r--src/multimedia/audio/qaudiooutput.cpp192
-rw-r--r--src/multimedia/audio/qaudiooutput.h93
-rw-r--r--src/multimedia/audio/qsoundeffect.h4
-rw-r--r--src/multimedia/camera/qcamera.h17
-rw-r--r--src/multimedia/camera/qcameradevice.h2
-rw-r--r--src/multimedia/camera/qcameraimagecapture.cpp188
-rw-r--r--src/multimedia/camera/qcameraimagecapture.h43
-rw-r--r--src/multimedia/doc/snippets/multimedia-snippets/audio.cpp2
-rw-r--r--src/multimedia/doc/snippets/multimedia-snippets/camera.cpp6
-rw-r--r--src/multimedia/doc/snippets/multimedia-snippets/media.cpp2
-rw-r--r--src/multimedia/doc/snippets/multimedia-snippets/multiple-videooutputs.qml3
-rw-r--r--src/multimedia/doc/snippets/multimedia-snippets/qtvideosink.qml8
-rw-r--r--src/multimedia/doc/src/cameraoverview.qdoc10
-rw-r--r--src/multimedia/doc/src/changes.qdoc2
-rw-r--r--src/multimedia/platform/alsa/qalsaaudiodevice.cpp4
-rw-r--r--src/multimedia/platform/alsa/qalsaaudiodevice_p.h2
-rw-r--r--src/multimedia/platform/alsa/qalsamediadevices.cpp8
-rw-r--r--src/multimedia/platform/android/audio/qandroidaudiodevice.cpp4
-rw-r--r--src/multimedia/platform/android/audio/qandroidaudiodevice_p.h2
-rw-r--r--src/multimedia/platform/android/audio/qopenslesengine.cpp14
-rw-r--r--src/multimedia/platform/android/audio/qopenslesengine_p.h6
-rw-r--r--src/multimedia/platform/android/common/qandroidaudiooutput_p.h79
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp12
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h1
-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.cpp84
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h29
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp10
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h8
-rw-r--r--src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol.cpp73
-rw-r--r--src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol_p.h16
-rw-r--r--src/multimedia/platform/android/qandroidformatsinfo.cpp2
-rw-r--r--src/multimedia/platform/android/qandroidintegration.cpp8
-rw-r--r--src/multimedia/platform/android/qandroidintegration_p.h4
-rw-r--r--src/multimedia/platform/android/qandroidmediadevices.cpp4
-rw-r--r--src/multimedia/platform/android/qandroidmediadevices_p.h2
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidcamera_p.h4
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidsurfaceview.cpp9
-rw-r--r--src/multimedia/platform/darwin/audio/avfaudiodecoder.mm536
-rw-r--r--src/multimedia/platform/darwin/audio/avfaudiodecoder_p.h136
-rw-r--r--src/multimedia/platform/darwin/audio/qdarwinaudiodevice.mm10
-rw-r--r--src/multimedia/platform/darwin/audio/qdarwinaudiodevice_p.h4
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm4
-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/darwin/camera/avfmediaencoder.mm60
-rw-r--r--src/multimedia/platform/darwin/camera/avfmediaencoder_p.h12
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm84
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h15
-rw-r--r--src/multimedia/platform/darwin/qdarwinformatsinfo.mm2
-rw-r--r--src/multimedia/platform/darwin/qdarwinintegration.mm8
-rw-r--r--src/multimedia/platform/darwin/qdarwinintegration_p.h3
-rw-r--r--src/multimedia/platform/darwin/qdarwinmediadevices.mm26
-rw-r--r--src/multimedia/platform/gstreamer/audio/qgstreameraudiodevice.cpp2
-rw-r--r--src/multimedia/platform/gstreamer/audio/qgstreameraudiodevice_p.h2
-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/common/qgstreameraudiooutput.cpp33
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreameraudiooutput_p.h17
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp40
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamermediaplayer_p.h11
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp112
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h16
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp44
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h6
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp20
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h2
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerintegration.cpp14
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerintegration_p.h5
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamermediadevices.cpp10
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamermediadevices_p.h4
-rw-r--r--src/multimedia/platform/pulseaudio/qaudioengine_pulse.cpp12
-rw-r--r--src/multimedia/platform/pulseaudio/qaudioengine_pulse_p.h4
-rw-r--r--src/multimedia/platform/pulseaudio/qpulseaudiodevice.cpp2
-rw-r--r--src/multimedia/platform/pulseaudio/qpulseaudiodevice_p.h2
-rw-r--r--src/multimedia/platform/pulseaudio/qpulseaudiomediadevices.cpp4
-rw-r--r--src/multimedia/platform/qnx/audio/qnxaudioutils.cpp4
-rw-r--r--src/multimedia/platform/qnx/audio/qnxaudioutils_p.h2
-rw-r--r--src/multimedia/platform/qnx/audio/qqnxaudiodevice.cpp8
-rw-r--r--src/multimedia/platform/qnx/audio/qqnxaudiodevice_p.h2
-rw-r--r--src/multimedia/platform/qnx/audio/qqnxaudiosink.cpp2
-rw-r--r--src/multimedia/platform/qnx/audio/qqnxaudiosource.cpp2
-rw-r--r--src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol.cpp6
-rw-r--r--src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol_p.h4
-rw-r--r--src/multimedia/platform/qnx/camera/bbcamerasession.cpp6
-rw-r--r--src/multimedia/platform/qnx/camera/bbcamerasession_p.h8
-rw-r--r--src/multimedia/platform/qnx/qqnxdevicemanager.cpp4
-rw-r--r--src/multimedia/platform/qplatformaudioinput_p.h (renamed from src/multimedia/recording/qmediaencoder_p.h)48
-rw-r--r--src/multimedia/platform/qplatformaudiooutput_p.h82
-rw-r--r--src/multimedia/platform/qplatformcameraimagecapture_p.h27
-rw-r--r--src/multimedia/platform/qplatformmediacapture.cpp6
-rw-r--r--src/multimedia/platform/qplatformmediacapture_p.h17
-rw-r--r--src/multimedia/platform/qplatformmediaencoder.cpp18
-rw-r--r--src/multimedia/platform/qplatformmediaencoder_p.h28
-rw-r--r--src/multimedia/platform/qplatformmediaformatinfo_p.h3
-rw-r--r--src/multimedia/platform/qplatformmediaintegration.cpp12
-rw-r--r--src/multimedia/platform/qplatformmediaintegration_p.h11
-rw-r--r--src/multimedia/platform/qplatformmediaplayer_p.h15
-rw-r--r--src/multimedia/platform/windows/audio/qwindowsaudiodevice.cpp6
-rw-r--r--src/multimedia/platform/windows/audio/qwindowsaudiodevice_p.h2
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowscamera.cpp48
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowscamera_p.h6
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture.cpp42
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture_p.h8
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp42
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h14
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp (renamed from src/multimedia/platform/windows/mediacapture/qwindowscamerareader.cpp)98
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h (renamed from src/multimedia/platform/windows/mediacapture/qwindowscamerareader_p.h)12
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp (renamed from src/multimedia/platform/windows/mediacapture/qwindowscamerasession.cpp)149
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h (renamed from src/multimedia/platform/windows/mediacapture/qwindowscamerasession_p.h)41
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp111
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder_p.h16
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsstoragelocation.cpp8
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsstoragelocation_p.h3
-rw-r--r--src/multimedia/platform/windows/player/mfplayercontrol.cpp29
-rw-r--r--src/multimedia/platform/windows/player/mfplayercontrol_p.h9
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession.cpp92
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession_p.h21
-rw-r--r--src/multimedia/platform/windows/qwindowsformatinfo.cpp2
-rw-r--r--src/multimedia/platform/windows/qwindowsintegration.cpp2
-rw-r--r--src/multimedia/platform/windows/qwindowsintegration_p.h2
-rw-r--r--src/multimedia/platform/windows/qwindowsmediadevices.cpp8
-rw-r--r--src/multimedia/platform/windows/qwindowsmediadevices_p.h3
-rw-r--r--src/multimedia/playback/qmediaplayer.cpp156
-rw-r--r--src/multimedia/playback/qmediaplayer.h30
-rw-r--r--src/multimedia/playback/qmediaplayer_p.h3
-rw-r--r--src/multimedia/playback/qmediaplaylist.h3
-rw-r--r--src/multimedia/qmediaformat.cpp4
-rw-r--r--src/multimedia/qmediaformat.h6
-rw-r--r--src/multimedia/recording/qmediacapturesession.cpp88
-rw-r--r--src/multimedia/recording/qmediacapturesession.h30
-rw-r--r--src/multimedia/recording/qmediaencoder.cpp484
-rw-r--r--src/multimedia/recording/qmediaencoder.h171
-rw-r--r--src/multimedia/recording/qmediaencodersettings.cpp229
-rw-r--r--src/multimedia/recording/qmediaencodersettings.h57
-rw-r--r--src/multimedia/recording/qmediarecorder.cpp372
-rw-r--r--src/multimedia/recording/qmediarecorder.h116
-rw-r--r--src/multimedia/recording/qmediarecorder_p.h24
-rw-r--r--src/multimediaquick/Video.qml5
-rw-r--r--src/multimediaquick/multimedia_plugin.cpp2
-rw-r--r--src/multimediaquick/qquickplaylist_p.h6
-rw-r--r--src/multimediaquick/qquickvideooutput_p.h4
-rw-r--r--src/multimediaquick/qtmultimediaquicktypes_p.h18
-rw-r--r--src/multimediawidgets/qvideowidget.cpp2
-rw-r--r--tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp101
-rw-r--r--tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp28
-rw-r--r--tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp116
-rw-r--r--tests/auto/integration/shared/mediafileselector.h3
-rw-r--r--tests/auto/unit/mockbackend/CMakeLists.txt1
-rw-r--r--tests/auto/unit/mockbackend/qmockaudiooutput.h76
-rw-r--r--tests/auto/unit/mockbackend/qmockintegration.cpp8
-rw-r--r--tests/auto/unit/mockbackend/qmockintegration_p.h4
-rw-r--r--tests/auto/unit/mockbackend/qmockmediacapturesession.h36
-rw-r--r--tests/auto/unit/mockbackend/qmockmediaencoder.h34
-rw-r--r--tests/auto/unit/mockbackend/qmockmediaplayer.h34
-rw-r--r--tests/auto/unit/multimedia/CMakeLists.txt2
-rw-r--r--tests/auto/unit/multimedia/qaudionamespace/tst_qaudionamespace.cpp21
-rw-r--r--tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp18
-rw-r--r--tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp93
-rw-r--r--tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp12
-rw-r--r--tests/auto/unit/multimedia/qmediaplayer/tst_qmediaplayer.cpp84
-rw-r--r--tests/auto/unit/multimedia/qmediarecorder/CMakeLists.txt (renamed from tests/auto/unit/multimedia/qmediaencoder/CMakeLists.txt)8
-rw-r--r--tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp (renamed from tests/auto/unit/multimedia/qmediaencoder/tst_qmediaencoder.cpp)146
201 files changed, 3573 insertions, 3165 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1a8538b1e..3f90e7064 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,12 +10,6 @@ project(QtMultimedia
LANGUAGES CXX C
)
-# Make sure we only use latest private CMake API, aka no compatibility wrappers.
-set(QT_NO_INTERNAL_COMPATIBILITY_FUNCTIONS TRUE)
-
-# Make sure we use the fixed BASE argument of qt_add_resource.
-set(QT_USE_FIXED_QT_ADD_RESOURCE_BASE TRUE)
-
find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core)
find_package(Qt6 ${PROJECT_VERSION} QUIET CONFIG OPTIONAL_COMPONENTS Gui Network Widgets Quick Qml QuickTest QuickControls2)
diff --git a/examples/multimedia/audiodecoder/audiodecoder.cpp b/examples/multimedia/audiodecoder/audiodecoder.cpp
index 401b41bfd..891499ea2 100644
--- a/examples/multimedia/audiodecoder/audiodecoder.cpp
+++ b/examples/multimedia/audiodecoder/audiodecoder.cpp
@@ -112,6 +112,11 @@ void AudioDecoder::stop()
m_decoder.stop();
}
+QAudioDecoder::Error AudioDecoder::getError()
+{
+ return m_decoder.error();
+}
+
void AudioDecoder::setTargetFilename(const QString &fileName)
{
m_targetFilename = fileName;
diff --git a/examples/multimedia/audiodecoder/audiodecoder.h b/examples/multimedia/audiodecoder/audiodecoder.h
index b6c8dc36f..cd27a9bf3 100644
--- a/examples/multimedia/audiodecoder/audiodecoder.h
+++ b/examples/multimedia/audiodecoder/audiodecoder.h
@@ -68,6 +68,7 @@ public:
void setSource(const QString &fileName);
void start();
void stop();
+ QAudioDecoder::Error getError();
void setTargetFilename(const QString &fileName);
diff --git a/examples/multimedia/audiodecoder/main.cpp b/examples/multimedia/audiodecoder/main.cpp
index 5bb240b94..a219fffe3 100644
--- a/examples/multimedia/audiodecoder/main.cpp
+++ b/examples/multimedia/audiodecoder/main.cpp
@@ -88,6 +88,7 @@ int main(int argc, char *argv[])
cout << "Error: source filename is not specified.\n";
return 0;
}
+
sourceFile.setFile(app.arguments().at(sourceFileIndex));
if (app.arguments().size() > sourceFileIndex + 1)
targetFile.setFile(app.arguments().at(sourceFileIndex + 1));
@@ -99,6 +100,8 @@ int main(int argc, char *argv[])
&app, &QCoreApplication::quit);
decoder.setSource(sourceFile.absoluteFilePath());
decoder.start();
+ if (decoder.getError() != QAudioDecoder::NoError)
+ return 0;
return app.exec();
}
diff --git a/examples/multimedia/audiodevices/audiodevices.cpp b/examples/multimedia/audiodevices/audiodevices.cpp
index ecd097a50..c4a57f29f 100644
--- a/examples/multimedia/audiodevices/audiodevices.cpp
+++ b/examples/multimedia/audiodevices/audiodevices.cpp
@@ -124,7 +124,7 @@ void AudioTest::test()
void AudioTest::updateAudioDevices()
{
deviceBox->clear();
- const auto devices = m_mode == QAudio::AudioInput ? m_devices->audioInputs() : m_devices->audioOutputs();
+ const auto devices = m_mode == QAudioDevice::Input ? m_devices->audioInputs() : m_devices->audioOutputs();
for (auto &deviceInfo: devices)
deviceBox->addItem(deviceInfo.description(), QVariant::fromValue(deviceInfo));
}
@@ -133,7 +133,7 @@ void AudioTest::updateAudioDevices()
void AudioTest::modeChanged(int idx)
{
testResult->clear();
- m_mode = idx == 0 ? QAudio::AudioInput : QAudio::AudioOutput;
+ m_mode = idx == 0 ? QAudioDevice::Input : QAudioDevice::Output;
updateAudioDevices();
deviceBox->setCurrentIndex(0);
deviceChanged(0);
diff --git a/examples/multimedia/audiodevices/audiodevices.h b/examples/multimedia/audiodevices/audiodevices.h
index 18c968ca1..a2c5325bc 100644
--- a/examples/multimedia/audiodevices/audiodevices.h
+++ b/examples/multimedia/audiodevices/audiodevices.h
@@ -75,7 +75,7 @@ public:
private:
QAudioDevice m_deviceInfo;
QAudioFormat m_settings;
- QAudio::Mode m_mode = QAudio::AudioInput;
+ QAudioDevice::Mode m_mode = QAudioDevice::Input;
QMediaDevices *m_devices = nullptr;
private slots:
diff --git a/examples/multimedia/audiorecorder/audiorecorder.cpp b/examples/multimedia/audiorecorder/audiorecorder.cpp
index 53575c45a..4983fa97c 100644
--- a/examples/multimedia/audiorecorder/audiorecorder.cpp
+++ b/examples/multimedia/audiorecorder/audiorecorder.cpp
@@ -53,14 +53,16 @@
#include "ui_audiorecorder.h"
-#include <QMediaEncoder>
+#include <QMediaRecorder>
#include <QDir>
#include <QFileDialog>
-#include <QMediaEncoder>
+#include <QMediaRecorder>
#include <QStandardPaths>
#include <qmediadevices.h>
#include <qaudiodevice.h>
#include <qaudiobuffer.h>
+#include <qaudioinput.h>
+#include <qcameraimagecapture.h>
static QList<qreal> getBufferLevels(const QAudioBuffer &buffer);
@@ -69,8 +71,9 @@ AudioRecorder::AudioRecorder()
{
ui->setupUi(this);
- m_audioEncoder = new QMediaEncoder(this);
+ m_audioEncoder = new QMediaRecorder(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 +101,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));
@@ -110,8 +113,8 @@ AudioRecorder::AudioRecorder()
ui->channelsBox->addItem(QStringLiteral("4"), QVariant(4));
//quality
- ui->qualitySlider->setRange(0, int(QImageEncoderSettings::VeryHighQuality));
- ui->qualitySlider->setValue(int(QImageEncoderSettings::NormalQuality));
+ ui->qualitySlider->setRange(0, int(QCameraImageCapture::VeryHighQuality));
+ ui->qualitySlider->setValue(int(QCameraImageCapture::NormalQuality));
//bitrates:
ui->bitrateBox->addItem(tr("Default"), QVariant(0));
@@ -120,61 +123,61 @@ AudioRecorder::AudioRecorder()
ui->bitrateBox->addItem(QStringLiteral("96000"), QVariant(96000));
ui->bitrateBox->addItem(QStringLiteral("128000"), QVariant(128000));
- connect(m_audioEncoder, &QMediaEncoder::durationChanged, this, &AudioRecorder::updateProgress);
- connect(m_audioEncoder, &QMediaEncoder::statusChanged, this, &AudioRecorder::updateStatus);
- connect(m_audioEncoder, &QMediaEncoder::stateChanged, this, &AudioRecorder::onStateChanged);
- connect(m_audioEncoder, &QMediaEncoder::errorChanged, this, &AudioRecorder::displayErrorMessage);
+ connect(m_audioEncoder, &QMediaRecorder::durationChanged, this, &AudioRecorder::updateProgress);
+ connect(m_audioEncoder, &QMediaRecorder::statusChanged, this, &AudioRecorder::updateStatus);
+ connect(m_audioEncoder, &QMediaRecorder::recorderStateChanged, this, &AudioRecorder::onStateChanged);
+ connect(m_audioEncoder, &QMediaRecorder::errorChanged, this, &AudioRecorder::displayErrorMessage);
}
void AudioRecorder::updateProgress(qint64 duration)
{
- if (m_audioEncoder->error() != QMediaEncoder::NoError || duration < 2000)
+ if (m_audioEncoder->error() != QMediaRecorder::NoError || duration < 2000)
return;
ui->statusbar->showMessage(tr("Recorded %1 sec").arg(duration / 1000));
}
-void AudioRecorder::updateStatus(QMediaEncoder::Status status)
+void AudioRecorder::updateStatus(QMediaRecorder::Status status)
{
QString statusMessage;
switch (status) {
- case QMediaEncoder::RecordingStatus:
+ case QMediaRecorder::RecordingStatus:
statusMessage = tr("Recording to %1").arg(m_audioEncoder->actualLocation().toString());
break;
- case QMediaEncoder::PausedStatus:
+ case QMediaRecorder::PausedStatus:
clearAudioLevels();
statusMessage = tr("Paused");
break;
- case QMediaEncoder::StoppedStatus:
+ case QMediaRecorder::StoppedStatus:
clearAudioLevels();
statusMessage = tr("Stopped");
default:
break;
}
- if (m_audioEncoder->error() == QMediaEncoder::NoError)
+ if (m_audioEncoder->error() == QMediaRecorder::NoError)
ui->statusbar->showMessage(statusMessage);
}
-void AudioRecorder::onStateChanged(QMediaEncoder::State state)
+void AudioRecorder::onStateChanged(QMediaRecorder::RecorderState state)
{
switch (state) {
- case QMediaEncoder::RecordingState:
+ case QMediaRecorder::RecordingState:
ui->recordButton->setText(tr("Stop"));
ui->pauseButton->setText(tr("Pause"));
break;
- case QMediaEncoder::PausedState:
+ case QMediaRecorder::PausedState:
ui->recordButton->setText(tr("Stop"));
ui->pauseButton->setText(tr("Resume"));
break;
- case QMediaEncoder::StoppedState:
+ case QMediaRecorder::StoppedState:
ui->recordButton->setText(tr("Record"));
ui->pauseButton->setText(tr("Pause"));
break;
}
- ui->pauseButton->setEnabled(m_audioEncoder->state() != QMediaEncoder::StoppedState);
+ ui->pauseButton->setEnabled(m_audioEncoder->recorderState() != QMediaRecorder::StoppedState);
}
static QVariant boxValue(const QComboBox *box)
@@ -188,8 +191,8 @@ static QVariant boxValue(const QComboBox *box)
void AudioRecorder::toggleRecord()
{
- if (m_audioEncoder->state() == QMediaEncoder::StoppedState) {
- m_captureSession.setAudioInput(boxValue(ui->audioDeviceBox).value<QAudioDevice>());
+ if (m_audioEncoder->recorderState() == QMediaRecorder::StoppedState) {
+ m_captureSession.audioInput()->setDevice(boxValue(ui->audioDeviceBox).value<QAudioDevice>());
QMediaEncoderSettings settings;
settings.setFileFormat(boxValue(ui->containerBox).value<QMediaFormat::FileFormat>());
@@ -212,7 +215,7 @@ void AudioRecorder::toggleRecord()
void AudioRecorder::togglePause()
{
- if (m_audioEncoder->state() != QMediaEncoder::PausedState)
+ if (m_audioEncoder->recorderState() != QMediaRecorder::PausedState)
m_audioEncoder->pause();
else
m_audioEncoder->record();
diff --git a/examples/multimedia/audiorecorder/audiorecorder.h b/examples/multimedia/audiorecorder/audiorecorder.h
index f94bb899c..55dd37a8d 100644
--- a/examples/multimedia/audiorecorder/audiorecorder.h
+++ b/examples/multimedia/audiorecorder/audiorecorder.h
@@ -52,7 +52,7 @@
#define AUDIORECORDER_H
#include <QMainWindow>
-#include <QMediaEncoder>
+#include <QMediaRecorder>
#include <QMediaCaptureSession>
#include <QUrl>
@@ -78,8 +78,8 @@ private slots:
void togglePause();
void toggleRecord();
- void updateStatus(QMediaEncoder::Status);
- void onStateChanged(QMediaEncoder::State);
+ void updateStatus(QMediaRecorder::Status);
+ void onStateChanged(QMediaRecorder::RecorderState);
void updateProgress(qint64 pos);
void displayErrorMessage();
@@ -89,7 +89,7 @@ private:
Ui::AudioRecorder *ui = nullptr;
QMediaCaptureSession m_captureSession;
- QMediaEncoder *m_audioEncoder = nullptr;
+ QMediaRecorder *m_audioEncoder = nullptr;
QList<AudioLevel*> m_audioLevels;
bool m_outputLocationSet = false;
diff --git a/examples/multimedia/audiorecorder/doc/src/audiorecorder.qdoc b/examples/multimedia/audiorecorder/doc/src/audiorecorder.qdoc
index 4d5bdfa0e..d5d49e723 100644
--- a/examples/multimedia/audiorecorder/doc/src/audiorecorder.qdoc
+++ b/examples/multimedia/audiorecorder/doc/src/audiorecorder.qdoc
@@ -64,7 +64,7 @@
\endcode
And setup the lists as described above. The text on the record and pause
- buttons are toggled depending on the \l{QMediaRecorder::State}{state} of
+ buttons are toggled depending on the \l{QMediaRecorder::RecorderState}{state} of
the \c audioRecorder object. This means that if the state is
\l{QMediaRecorder::StoppedState} then the button text will be "Record" and
"Pause". In \l{QMediaRecorder::RecordingState} the record button will have
diff --git a/examples/multimedia/declarative-camera/VideoPreview.qml b/examples/multimedia/declarative-camera/VideoPreview.qml
index 5a2f90829..f47bfd009 100644
--- a/examples/multimedia/declarative-camera/VideoPreview.qml
+++ b/examples/multimedia/declarative-camera/VideoPreview.qml
@@ -67,6 +67,8 @@ Item {
}
videoOutput: output
+ audioOutput: AudioOutput {
+ }
}
VideoOutput {
diff --git a/examples/multimedia/spectrum/app/engine.cpp b/examples/multimedia/spectrum/app/engine.cpp
index 78aef1412..6d07a9817 100644
--- a/examples/multimedia/spectrum/app/engine.cpp
+++ b/examples/multimedia/spectrum/app/engine.cpp
@@ -78,7 +78,7 @@ const int LevelWindowUs = 0.1 * 1000000;
Engine::Engine(QObject *parent)
: QObject(parent)
- , m_mode(QAudio::AudioInput)
+ , m_mode(QAudioDevice::Input)
, m_state(QAudio::StoppedState)
, m_devices(new QMediaDevices(this))
, m_generateTone(false)
@@ -225,7 +225,7 @@ void Engine::setWindowFunction(WindowFunction type)
void Engine::startRecording()
{
if (m_audioInput) {
- if (QAudio::AudioInput == m_mode &&
+ if (QAudioDevice::Input == m_mode &&
QAudio::SuspendedState == m_state) {
m_audioInput->resume();
} else {
@@ -235,7 +235,7 @@ void Engine::startRecording()
m_buffer.fill(0);
setRecordPosition(0, true);
stopPlayback();
- m_mode = QAudio::AudioInput;
+ m_mode = QAudioDevice::Input;
connect(m_audioInput, &QAudioSource::stateChanged,
this, &Engine::audioStateChanged);
@@ -253,7 +253,7 @@ void Engine::startRecording()
void Engine::startPlayback()
{
if (m_audioOutput) {
- if (QAudio::AudioOutput == m_mode &&
+ if (QAudioDevice::Output == m_mode &&
QAudio::SuspendedState == m_state) {
#ifdef Q_OS_WIN
// The Windows backend seems to internally go back into ActiveState
@@ -267,7 +267,7 @@ void Engine::startPlayback()
spectrumChanged(0, 0, FrequencySpectrum());
setPlayPosition(0, true);
stopRecording();
- m_mode = QAudio::AudioOutput;
+ m_mode = QAudioDevice::Output;
connect(m_audioOutput, &QAudioSink::stateChanged,
this, &Engine::audioStateChanged);
@@ -293,10 +293,10 @@ void Engine::suspend()
if (QAudio::ActiveState == m_state ||
QAudio::IdleState == m_state) {
switch (m_mode) {
- case QAudio::AudioInput:
+ case QAudioDevice::Input:
m_audioInput->suspend();
break;
- case QAudio::AudioOutput:
+ case QAudioDevice::Output:
m_audioOutput->suspend();
break;
}
@@ -328,7 +328,7 @@ void Engine::setAudioOutputDevice(const QAudioDevice &device)
void Engine::audioNotify()
{
switch (m_mode) {
- case QAudio::AudioInput: {
+ case QAudioDevice::Input: {
const qint64 recordPosition = qMin(m_bufferLength, m_format.bytesForDuration(m_audioInput->processedUSecs()));
setRecordPosition(recordPosition);
const qint64 levelPosition = m_dataLength - m_levelBufferLength;
@@ -341,7 +341,7 @@ void Engine::audioNotify()
emit bufferChanged(0, m_dataLength, m_buffer);
}
break;
- case QAudio::AudioOutput: {
+ case QAudioDevice::Output: {
const qint64 playPosition = m_format.bytesForDuration(m_audioOutput->processedUSecs());
setPlayPosition(qMin(bufferLength(), playPosition));
const qint64 levelPosition = playPosition - m_levelBufferLength;
@@ -395,10 +395,10 @@ void Engine::audioStateChanged(QAudio::State state)
// Check error
QAudio::Error error = QAudio::NoError;
switch (m_mode) {
- case QAudio::AudioInput:
+ case QAudioDevice::Input:
error = m_audioInput->error();
break;
- case QAudio::AudioOutput:
+ case QAudioDevice::Output:
error = m_audioOutput->error();
break;
}
@@ -459,7 +459,7 @@ void Engine::reset()
{
stopRecording();
stopPlayback();
- setState(QAudio::AudioInput, QAudio::StoppedState);
+ setState(QAudioDevice::Input, QAudio::StoppedState);
setFormat(QAudioFormat());
m_generateTone = false;
delete m_file;
@@ -604,7 +604,7 @@ void Engine::setState(QAudio::State state)
emit stateChanged(m_mode, m_state);
}
-void Engine::setState(QAudio::Mode mode, QAudio::State state)
+void Engine::setState(QAudioDevice::Mode mode, QAudio::State state)
{
const bool changed = (m_mode != mode || m_state != state);
m_mode = mode;
diff --git a/examples/multimedia/spectrum/app/engine.h b/examples/multimedia/spectrum/app/engine.h
index 1ee87a2a5..449884251 100644
--- a/examples/multimedia/spectrum/app/engine.h
+++ b/examples/multimedia/spectrum/app/engine.h
@@ -99,7 +99,7 @@ public:
const QList<QAudioDevice> &availableAudioOutputDevices() const
{ return m_availableAudioOutputDevices; }
- QAudio::Mode mode() const { return m_mode; }
+ QAudioDevice::Mode mode() const { return m_mode; }
QAudio::State state() const { return m_state; }
/**
@@ -182,7 +182,7 @@ public slots:
void setAudioOutputDevice(const QAudioDevice &device);
signals:
- void stateChanged(QAudio::Mode mode, QAudio::State state);
+ void stateChanged(QAudioDevice::Mode mode, QAudio::State state);
/**
* Informational message for non-modal display
@@ -259,7 +259,7 @@ private:
void stopRecording();
void stopPlayback();
void setState(QAudio::State state);
- void setState(QAudio::Mode mode, QAudio::State state);
+ void setState(QAudioDevice::Mode mode, QAudio::State state);
void setFormat(const QAudioFormat &format);
void setRecordPosition(qint64 position, bool forceEmit = false);
void setPlayPosition(qint64 position, bool forceEmit = false);
@@ -277,7 +277,7 @@ private:
#endif
private:
- QAudio::Mode m_mode;
+ QAudioDevice::Mode m_mode;
QAudio::State m_state;
QMediaDevices *m_devices;
diff --git a/examples/multimedia/spectrum/app/mainwidget.cpp b/examples/multimedia/spectrum/app/mainwidget.cpp
index 9a6fa0ac5..2dbfda9ab 100644
--- a/examples/multimedia/spectrum/app/mainwidget.cpp
+++ b/examples/multimedia/spectrum/app/mainwidget.cpp
@@ -110,7 +110,7 @@ MainWidget::~MainWidget() = default;
// Public slots
//-----------------------------------------------------------------------------
-void MainWidget::stateChanged(QAudio::Mode mode, QAudio::State state)
+void MainWidget::stateChanged(QAudioDevice::Mode mode, QAudio::State state)
{
Q_UNUSED(mode);
@@ -409,7 +409,7 @@ void MainWidget::createMenus()
void MainWidget::updateButtonStates()
{
- const bool recordEnabled = ((QAudio::AudioOutput == m_engine->mode() ||
+ const bool recordEnabled = ((QAudioDevice::Output == m_engine->mode() ||
(QAudio::ActiveState != m_engine->state() &&
QAudio::IdleState != m_engine->state())) &&
RecordMode == m_mode);
@@ -420,7 +420,7 @@ void MainWidget::updateButtonStates()
m_pauseButton->setEnabled(pauseEnabled);
const bool playEnabled = (/*m_engine->dataLength() &&*/
- (QAudio::AudioOutput != m_engine->mode() ||
+ (QAudioDevice::Output != m_engine->mode() ||
(QAudio::ActiveState != m_engine->state() &&
QAudio::IdleState != m_engine->state())));
m_playButton->setEnabled(playEnabled);
diff --git a/examples/multimedia/spectrum/app/mainwidget.h b/examples/multimedia/spectrum/app/mainwidget.h
index 2ff863a13..d2340daae 100644
--- a/examples/multimedia/spectrum/app/mainwidget.h
+++ b/examples/multimedia/spectrum/app/mainwidget.h
@@ -51,7 +51,7 @@
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
-#include <QAudio>
+#include <QAudioDevice>
#include <QIcon>
#include <QWidget>
@@ -88,7 +88,7 @@ public:
void timerEvent(QTimerEvent *event) override;
public slots:
- void stateChanged(QAudio::Mode mode, QAudio::State state);
+ void stateChanged(QAudioDevice::Mode mode, QAudio::State state);
void formatChanged(const QAudioFormat &format);
void spectrumChanged(qint64 position, qint64 length,
const FrequencySpectrum &spectrum);
diff --git a/examples/multimedia/video/mediaplayer/main.qml b/examples/multimedia/video/mediaplayer/main.qml
index 05946474b..e88117112 100644
--- a/examples/multimedia/video/mediaplayer/main.qml
+++ b/examples/multimedia/video/mediaplayer/main.qml
@@ -73,6 +73,9 @@ Window {
MediaPlayer {
id: mediaPlayer
videoOutput: videoOutput
+ audioOutput: AudioOutput {
+ }
+
onErrorOccurred: { mediaErrorText.text = mediaPlayer.errorString; mediaError.open() }
onMetaDataChanged: { metadataInfo.read(mediaPlayer.metaData) }
}
diff --git a/examples/multimedia/video/qmlvideo/qml/qmlvideo/VideoItem.qml b/examples/multimedia/video/qmlvideo/qml/qmlvideo/VideoItem.qml
index a7d4ef2f4..c6159a9af 100644
--- a/examples/multimedia/video/qmlvideo/qml/qmlvideo/VideoItem.qml
+++ b/examples/multimedia/video/qmlvideo/qml/qmlvideo/VideoItem.qml
@@ -70,6 +70,9 @@ VideoOutput {
MediaPlayer {
id: mediaPlayer
videoOutput: root;
+ audioOutput: AudioOutput {
+
+ }
onErrorOccurred: function(error, errorString) {
if (MediaPlayer.NoError !== error) {
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/ContentVideo.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/ContentVideo.qml
index ae57cee75..13872c959 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/ContentVideo.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/ContentVideo.qml
@@ -52,7 +52,7 @@ import QtQuick
import QtMultimedia
VideoOutput {
- source: mediaPlayer
+ id: video
property alias mediaSource: mediaPlayer.source
property alias volume: mediaPlayer.volume
property bool isRunning: true
@@ -62,6 +62,10 @@ VideoOutput {
autoPlay: true
volume: 0.5
loops: Audio.Infinite
+ videoOutput: video
+ audioOutput: AudioOutput {
+
+ }
}
function play() { mediaPlayer.play() }
diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp
index 8e339a6cb..f45971e9f 100644
--- a/examples/multimediawidgets/camera/camera.cpp
+++ b/examples/multimediawidgets/camera/camera.cpp
@@ -54,12 +54,13 @@
#include "imagesettings.h"
#include "metadatadialog.h"
-#include <QMediaEncoder>
+#include <QMediaRecorder>
#include <QVideoWidget>
#include <QCameraDevice>
#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);
@@ -97,23 +101,22 @@ void Camera::setCamera(const QCameraDevice &cameraInfo)
connect(m_camera.data(), &QCamera::activeChanged, this, &Camera::updateCameraActive);
connect(m_camera.data(), &QCamera::errorOccurred, this, &Camera::displayCameraError);
- m_mediaEncoder.reset(new QMediaEncoder);
+ m_mediaEncoder.reset(new QMediaRecorder);
m_captureSession.setEncoder(m_mediaEncoder.data());
- connect(m_mediaEncoder.data(), &QMediaEncoder::stateChanged, this, &Camera::updateRecorderState);
+ connect(m_mediaEncoder.data(), &QMediaRecorder::recorderStateChanged, this, &Camera::updateRecorderState);
m_imageCapture = new QCameraImageCapture;
m_captureSession.setImageCapture(m_imageCapture);
- connect(m_mediaEncoder.data(), &QMediaEncoder::durationChanged, this, &Camera::updateRecordTime);
- connect(m_mediaEncoder.data(), &QMediaEncoder::errorChanged, this, &Camera::displayRecorderError);
+ connect(m_mediaEncoder.data(), &QMediaRecorder::durationChanged, this, &Camera::updateRecordTime);
+ connect(m_mediaEncoder.data(), &QMediaRecorder::errorChanged, this, &Camera::displayRecorderError);
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());
+ updateRecorderState(m_mediaEncoder->recorderState());
connect(m_imageCapture, &QCameraImageCapture::readyForCaptureChanged, this, &Camera::readyForCapture);
connect(m_imageCapture, &QCameraImageCapture::imageCaptured, this, &Camera::processCapturedImage);
@@ -139,7 +142,7 @@ void Camera::keyPressEvent(QKeyEvent * event)
if (m_doImageCapture) {
takeImage();
} else {
- if (m_mediaEncoder->state() == QMediaEncoder::RecordingState)
+ if (m_mediaEncoder->recorderState() == QMediaRecorder::RecordingState)
stop();
else
record();
@@ -203,11 +206,8 @@ void Camera::configureImageSettings()
ImageSettings settingsDialog(m_imageCapture);
settingsDialog.setWindowFlags(settingsDialog.windowFlags() & ~Qt::WindowContextHelpButtonHint);
- settingsDialog.setImageSettings(m_imageSettings);
-
if (settingsDialog.exec()) {
- m_imageSettings = settingsDialog.imageSettings();
- m_imageCapture->setEncodingSettings(m_imageSettings);
+ settingsDialog.applyImageSettings();
}
}
@@ -229,7 +229,7 @@ void Camera::stop()
void Camera::setMuted(bool muted)
{
- m_captureSession.setMuted(muted);
+ m_captureSession.audioInput()->setMuted(muted);
}
void Camera::takeImage()
@@ -277,22 +277,22 @@ void Camera::updateCameraActive(bool active)
}
}
-void Camera::updateRecorderState(QMediaEncoder::State state)
+void Camera::updateRecorderState(QMediaRecorder::RecorderState state)
{
switch (state) {
- case QMediaEncoder::StoppedState:
+ case QMediaRecorder::StoppedState:
ui->recordButton->setEnabled(true);
ui->pauseButton->setEnabled(true);
ui->stopButton->setEnabled(false);
ui->metaDataButton->setEnabled(true);
break;
- case QMediaEncoder::PausedState:
+ case QMediaRecorder::PausedState:
ui->recordButton->setEnabled(true);
ui->pauseButton->setEnabled(false);
ui->stopButton->setEnabled(true);
ui->metaDataButton->setEnabled(false);
break;
- case QMediaEncoder::RecordingState:
+ case QMediaRecorder::RecordingState:
ui->recordButton->setEnabled(false);
ui->pauseButton->setEnabled(true);
ui->stopButton->setEnabled(true);
@@ -308,7 +308,7 @@ void Camera::setExposureCompensation(int index)
void Camera::displayRecorderError()
{
- if (m_mediaEncoder->error() != QMediaEncoder::NoError)
+ if (m_mediaEncoder->error() != QMediaRecorder::NoError)
QMessageBox::warning(this, tr("Capture Error"), m_mediaEncoder->errorString());
}
diff --git a/examples/multimediawidgets/camera/camera.h b/examples/multimediawidgets/camera/camera.h
index 95e436744..6a55f42b3 100644
--- a/examples/multimediawidgets/camera/camera.h
+++ b/examples/multimediawidgets/camera/camera.h
@@ -53,11 +53,12 @@
#include <QCamera>
#include <QCameraImageCapture>
-#include <QMediaEncoder>
+#include <QMediaRecorder>
#include <QScopedPointer>
#include <QMediaMetaData>
#include <QMediaCaptureSession>
#include <QMediaDevices>
+#include <QAudioInput>
#include <QMainWindow>
@@ -103,7 +104,7 @@ private slots:
void updateCameraActive(bool active);
void updateCaptureMode();
- void updateRecorderState(QMediaEncoder::State state);
+ void updateRecorderState(QMediaRecorder::RecorderState state);
void setExposureCompensation(int index);
void updateRecordTime();
@@ -133,10 +134,10 @@ private:
QMediaDevices m_devices;
QMediaCaptureSession m_captureSession;
QScopedPointer<QCamera> m_camera;
+ QScopedPointer<QAudioInput> m_audioInput;
QCameraImageCapture *m_imageCapture;
- QScopedPointer<QMediaEncoder> m_mediaEncoder;
+ QScopedPointer<QMediaRecorder> m_mediaEncoder;
- QImageEncoderSettings m_imageSettings;
QMediaEncoderSettings m_encoderSettings;
bool m_isCapturingImage = false;
bool m_applicationExiting = false;
diff --git a/examples/multimediawidgets/camera/imagesettings.cpp b/examples/multimediawidgets/camera/imagesettings.cpp
index df0056029..8e58fc7d4 100644
--- a/examples/multimediawidgets/camera/imagesettings.cpp
+++ b/examples/multimediawidgets/camera/imagesettings.cpp
@@ -66,13 +66,13 @@ ImageSettings::ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent)
//image codecs
ui->imageCodecBox->addItem(tr("Default image format"), QVariant(QString()));
- const auto supportedImageFormats = QImageEncoderSettings::supportedFormats();
+ const auto supportedImageFormats = QCameraImageCapture::supportedFormats();
for (const auto &f : supportedImageFormats) {
- QString description = QImageEncoderSettings::fileFormatDescription(f);
- ui->imageCodecBox->addItem(QImageEncoderSettings::fileFormatName(f) + ": " + description, QVariant::fromValue(f));
+ QString description = QCameraImageCapture::fileFormatDescription(f);
+ ui->imageCodecBox->addItem(QCameraImageCapture::fileFormatName(f) + ": " + description, QVariant::fromValue(f));
}
- ui->imageQualitySlider->setRange(0, int(QImageEncoderSettings::VeryHighQuality));
+ ui->imageQualitySlider->setRange(0, int(QCameraImageCapture::VeryHighQuality));
ui->imageResolutionBox->addItem(tr("Default Resolution"));
const QList<QSize> supportedResolutions = imagecapture->captureSession()->camera()->cameraInfo().photoResolutions();
@@ -80,6 +80,10 @@ ImageSettings::ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent)
ui->imageResolutionBox->addItem(QString("%1x%2").arg(resolution.width()).arg(resolution.height()),
QVariant(resolution));
}
+
+ selectComboBoxItem(ui->imageCodecBox, QVariant::fromValue(imagecapture->fileFormat()));
+ selectComboBoxItem(ui->imageResolutionBox, QVariant(imagecapture->resolution()));
+ ui->imageQualitySlider->setValue(imagecapture->quality());
}
ImageSettings::~ImageSettings()
@@ -99,21 +103,11 @@ void ImageSettings::changeEvent(QEvent *e)
}
}
-QImageEncoderSettings ImageSettings::imageSettings() const
-{
- QImageEncoderSettings settings = imagecapture->encodingSettings();
- settings.setFormat(boxValue(ui->imageCodecBox).value<QImageEncoderSettings::FileFormat>());
- settings.setQuality(QImageEncoderSettings::Quality(ui->imageQualitySlider->value()));
- settings.setResolution(boxValue(ui->imageResolutionBox).toSize());
-
- return settings;
-}
-
-void ImageSettings::setImageSettings(const QImageEncoderSettings &imageSettings)
+void ImageSettings::applyImageSettings() const
{
- selectComboBoxItem(ui->imageCodecBox, QVariant::fromValue(imageSettings.format()));
- selectComboBoxItem(ui->imageResolutionBox, QVariant(imageSettings.resolution()));
- ui->imageQualitySlider->setValue(imageSettings.quality());
+ imagecapture->setFileFormat(boxValue(ui->imageCodecBox).value<QCameraImageCapture::FileFormat>());
+ imagecapture->setQuality(QCameraImageCapture::Quality(ui->imageQualitySlider->value()));
+ imagecapture->setResolution(boxValue(ui->imageResolutionBox).toSize());
}
QVariant ImageSettings::boxValue(const QComboBox *box) const
diff --git a/examples/multimediawidgets/camera/imagesettings.h b/examples/multimediawidgets/camera/imagesettings.h
index 26b309126..cb7691045 100644
--- a/examples/multimediawidgets/camera/imagesettings.h
+++ b/examples/multimediawidgets/camera/imagesettings.h
@@ -68,8 +68,7 @@ public:
explicit ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent = nullptr);
~ImageSettings();
- QImageEncoderSettings imageSettings() const;
- void setImageSettings(const QImageEncoderSettings &settings);
+ void applyImageSettings() const;
QString format() const;
void setFormat(const QString &format);
diff --git a/examples/multimediawidgets/camera/videosettings.cpp b/examples/multimediawidgets/camera/videosettings.cpp
index aafd4b5f3..9bc0d0ea0 100644
--- a/examples/multimediawidgets/camera/videosettings.cpp
+++ b/examples/multimediawidgets/camera/videosettings.cpp
@@ -54,14 +54,15 @@
#include <QComboBox>
#include <QSpinBox>
#include <QDebug>
-#include <QMediaEncoder>
+#include <QMediaRecorder>
#include <QMediaFormat>
#include <QAudioDevice>
#include <QMediaCaptureSession>
#include <QCameraDevice>
#include <QCamera>
+#include <QAudioInput>
-VideoSettings::VideoSettings(QMediaEncoder *mediaRecorder, QWidget *parent)
+VideoSettings::VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent)
: QDialog(parent),
ui(new Ui::VideoSettingsUi),
mediaRecorder(mediaRecorder)
@@ -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));
@@ -111,7 +113,7 @@ VideoSettings::VideoSettings(QMediaEncoder *mediaRecorder, QWidget *parent)
QVariant::fromValue(format));
}
- ui->qualitySlider->setRange(0, int(QImageEncoderSettings::VeryHighQuality));
+ ui->qualitySlider->setRange(0, int(QMediaEncoderSettings::VeryHighQuality));
}
VideoSettings::~VideoSettings()
diff --git a/examples/multimediawidgets/camera/videosettings.h b/examples/multimediawidgets/camera/videosettings.h
index 05a21b4e4..2cb690d27 100644
--- a/examples/multimediawidgets/camera/videosettings.h
+++ b/examples/multimediawidgets/camera/videosettings.h
@@ -56,7 +56,7 @@
QT_BEGIN_NAMESPACE
class QComboBox;
-class QMediaEncoder;
+class QMediaRecorder;
namespace Ui { class VideoSettingsUi; }
QT_END_NAMESPACE
@@ -65,7 +65,7 @@ class VideoSettings : public QDialog
Q_OBJECT
public:
- explicit VideoSettings(QMediaEncoder *mediaRecorder, QWidget *parent = nullptr);
+ explicit VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent = nullptr);
~VideoSettings();
QMediaEncoderSettings encoderSettings() const;
@@ -79,7 +79,7 @@ private:
void selectComboBoxItem(QComboBox *box, const QVariant &value);
Ui::VideoSettingsUi *ui;
- QMediaEncoder *mediaRecorder;
+ QMediaRecorder *mediaRecorder;
};
#endif // VIDEOSETTINGS_H
diff --git a/examples/multimediawidgets/player/player.cpp b/examples/multimediawidgets/player/player.cpp
index 7c9d74b9c..a5a0922ba 100644
--- a/examples/multimediawidgets/player/player.cpp
+++ b/examples/multimediawidgets/player/player.cpp
@@ -59,6 +59,7 @@
#include <QMediaMetaData>
#include <QMediaDevices>
#include <QAudioDevice>
+#include <QAudioOutput>
#include <QMediaFormat>
#include <QtWidgets>
@@ -67,7 +68,9 @@ Player::Player(QWidget *parent)
{
//! [create-objs]
m_player = new QMediaPlayer(this);
- m_player->setAudioRole(QAudio::VideoRole);
+ m_audioOutput = new QAudioOutput(this);
+ m_player->setAudioOutput(m_audioOutput);
+ m_audioOutput->setAudioRole(QAudio::VideoRole);
//! [create-objs]
//! [2]
@@ -162,7 +165,7 @@ Player::Player(QWidget *parent)
PlayerControls *controls = new PlayerControls(this);
controls->setState(m_player->playbackState());
- controls->setVolume(m_player->volume());
+ controls->setVolume(m_audioOutput->volume());
controls->setMuted(controls->isMuted());
connect(controls, &PlayerControls::play, m_player, &QMediaPlayer::play);
@@ -170,14 +173,14 @@ Player::Player(QWidget *parent)
connect(controls, &PlayerControls::stop, m_player, &QMediaPlayer::stop);
connect(controls, &PlayerControls::next, m_playlist, &QMediaPlaylist::next);
connect(controls, &PlayerControls::previous, this, &Player::previousClicked);
- connect(controls, &PlayerControls::changeVolume, m_player, &QMediaPlayer::setVolume);
- connect(controls, &PlayerControls::changeMuting, m_player, &QMediaPlayer::setMuted);
+ connect(controls, &PlayerControls::changeVolume, m_audioOutput, &QAudioOutput::setVolume);
+ connect(controls, &PlayerControls::changeMuting, m_audioOutput, &QAudioOutput::setMuted);
connect(controls, &PlayerControls::changeRate, m_player, &QMediaPlayer::setPlaybackRate);
connect(controls, &PlayerControls::stop, m_videoWidget, QOverload<>::of(&QVideoWidget::update));
connect(m_player, &QMediaPlayer::playbackStateChanged, controls, &PlayerControls::setState);
- connect(m_player, &QMediaPlayer::volumeChanged, controls, &PlayerControls::setVolume);
- connect(m_player, &QMediaPlayer::mutedChanged, controls, &PlayerControls::setMuted);
+ connect(m_audioOutput, &QAudioOutput::volumeChanged, controls, &PlayerControls::setVolume);
+ connect(m_audioOutput, &QAudioOutput::mutedChanged, controls, &PlayerControls::setMuted);
m_fullScreenButton = new QPushButton(tr("FullScreen"), this);
m_fullScreenButton->setCheckable(true);
@@ -186,11 +189,11 @@ Player::Player(QWidget *parent)
m_colorButton->setEnabled(false);
connect(m_colorButton, &QPushButton::clicked, this, &Player::showColorDialog);
- m_audioOutput = new QComboBox(this);
- m_audioOutput->addItem(QString::fromUtf8("Default"), QVariant::fromValue(QAudioDevice()));
+ m_audioOutputCombo = new QComboBox(this);
+ m_audioOutputCombo->addItem(QString::fromUtf8("Default"), QVariant::fromValue(QAudioDevice()));
for (auto &deviceInfo: QMediaDevices::audioOutputs())
- m_audioOutput->addItem(deviceInfo.description(), QVariant::fromValue(deviceInfo));
- connect(m_audioOutput, QOverload<int>::of(&QComboBox::activated), this, &Player::audioOutputChanged);
+ m_audioOutputCombo->addItem(deviceInfo.description(), QVariant::fromValue(deviceInfo));
+ connect(m_audioOutputCombo, QOverload<int>::of(&QComboBox::activated), this, &Player::audioOutputChanged);
QBoxLayout *displayLayout = new QHBoxLayout;
displayLayout->addWidget(m_videoWidget, 2);
@@ -204,7 +207,7 @@ Player::Player(QWidget *parent)
controlLayout->addStretch(1);
controlLayout->addWidget(m_fullScreenButton);
controlLayout->addWidget(m_colorButton);
- controlLayout->addWidget(m_audioOutput);
+ controlLayout->addWidget(m_audioOutputCombo);
QBoxLayout *layout = new QVBoxLayout;
layout->addLayout(displayLayout);
@@ -583,8 +586,8 @@ void Player::showColorDialog()
void Player::audioOutputChanged(int index)
{
- auto device = m_audioOutput->itemData(index).value<QAudioDevice>();
- m_player->setAudioOutput(device);
+ auto device = m_audioOutputCombo->itemData(index).value<QAudioDevice>();
+ m_player->audioOutput()->setDevice(device);
}
void Player::clearHistogram()
diff --git a/examples/multimediawidgets/player/player.h b/examples/multimediawidgets/player/player.h
index 4294e909a..1d723a343 100644
--- a/examples/multimediawidgets/player/player.h
+++ b/examples/multimediawidgets/player/player.h
@@ -122,13 +122,14 @@ private:
void updateDurationInfo(qint64 currentInfo);
QMediaPlayer *m_player = nullptr;
+ QAudioOutput *m_audioOutput = nullptr;
QMediaPlaylist *m_playlist = nullptr;
QVideoWidget *m_videoWidget = nullptr;
QSlider *m_slider = nullptr;
QLabel *m_labelDuration = nullptr;
QPushButton *m_fullScreenButton = nullptr;
QPushButton *m_colorButton = nullptr;
- QComboBox *m_audioOutput = nullptr;
+ QComboBox *m_audioOutputCombo = nullptr;
QDialog *m_colorDialog = nullptr;
QLabel *m_statusLabel = nullptr;
QStatusBar *m_statusBar = nullptr;
diff --git a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAndroidMediaPlayer.java b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAndroidMediaPlayer.java
index aa706179c..72a299c7d 100644
--- a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAndroidMediaPlayer.java
+++ b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAndroidMediaPlayer.java
@@ -379,8 +379,7 @@ public class QtAndroidMediaPlayer
FileInputStream fis = null;
try {
mUri = Uri.parse(path);
- final boolean inAssets = (mUri.getScheme().compareTo("assets") == 0);
- if (inAssets) {
+ if (mUri.getScheme().compareTo("assets") == 0) {
final String asset = mUri.getPath().substring(1 /* Remove first '/' */);
final AssetManager am = mContext.getAssets();
afd = am.openFd(asset);
@@ -392,23 +391,14 @@ public class QtAndroidMediaPlayer
fis = new FileInputStream(mUri.getPath());
FileDescriptor fd = fis.getFD();
mMediaPlayer.setDataSource(fd);
+ } else if (mUri.getScheme().compareTo("content") == 0) {
+ mMediaPlayer.setDataSource(mContext, mUri, mHeaders);
} else {
- if (mHeaders.isEmpty())
- mMediaPlayer.setDataSource(path);
- else
- mMediaPlayer.setDataSource(mContext, mUri, mHeaders);
+ mMediaPlayer.setDataSource(path);
}
setState(State.Initialized);
- } catch (final IOException e) {
- Log.d(TAG, "" + e.getMessage());
- } catch (final IllegalArgumentException e) {
- Log.d(TAG, "" + e.getMessage());
- } catch (final SecurityException e) {
- Log.d(TAG, "" + e.getMessage());
- } catch (final IllegalStateException e) {
- Log.d(TAG, "" + e.getMessage());
- } catch (final NullPointerException e) {
- Log.d(TAG, "" + e.getMessage());
+ } catch (final Exception e) {
+ Log.d(TAG, "Exception: " + e.getMessage());
} finally {
try {
if (afd != null)
diff --git a/src/multimedia/CMakeLists.txt b/src/multimedia/CMakeLists.txt
index 2e18d36bd..7e979863b 100644
--- a/src/multimedia/CMakeLists.txt
+++ b/src/multimedia/CMakeLists.txt
@@ -18,6 +18,8 @@ qt_internal_add_module(Multimedia
audio/qaudiobuffer.cpp audio/qaudiobuffer.h
audio/qaudiodecoder.cpp audio/qaudiodecoder.h
audio/qaudiodevice.cpp audio/qaudiodevice.h audio/qaudiodevice_p.h
+ audio/qaudioinput.cpp audio/qaudioinput.h
+ audio/qaudiooutput.cpp audio/qaudiooutput.h
audio/qaudioformat.cpp audio/qaudioformat.h
audio/qaudiohelpers.cpp audio/qaudiohelpers_p.h
audio/qaudiosource.cpp audio/qaudiosource.h
@@ -30,6 +32,8 @@ qt_internal_add_module(Multimedia
camera/qcameradevice.cpp camera/qcameradevice.h camera/qcameradevice_p.h
camera/qcameraimagecapture.cpp camera/qcameraimagecapture.h
platform/qplatformaudiodecoder.cpp platform/qplatformaudiodecoder_p.h
+ platform/qplatformaudioinput_p.h
+ platform/qplatformaudiooutput_p.h
platform/qplatformcamera.cpp platform/qplatformcamera_p.h
platform/qplatformcameraimagecapture.cpp platform/qplatformcameraimagecapture_p.h
platform/qplatformmediacapture.cpp platform/qplatformmediacapture_p.h
@@ -51,9 +55,8 @@ qt_internal_add_module(Multimedia
qmultimediautils.cpp qmultimediautils_p.h
qtmultimediaglobal.h qtmultimediaglobal_p.h
recording/qmediacapturesession.cpp recording/qmediacapturesession.h
- recording/qmediaencoder.cpp recording/qmediaencoder.h recording/qmediaencoder_p.h
- recording/qmediaencodersettings.cpp recording/qmediaencodersettings.h
recording/qmediarecorder.cpp recording/qmediarecorder.h recording/qmediarecorder_p.h
+ recording/qmediaencodersettings.cpp recording/qmediaencodersettings.h
video/qabstractvideobuffer.cpp video/qabstractvideobuffer_p.h
video/qmemoryvideobuffer.cpp video/qmemoryvideobuffer_p.h
video/qvideoframe.cpp video/qvideoframe.h
@@ -154,13 +157,13 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_wmf
platform/windows/mediacapture/qwindowscamera.cpp
platform/windows/mediacapture/qwindowscameraimagecapture.cpp
platform/windows/mediacapture/qwindowscameraimagecapture_p.h
- platform/windows/mediacapture/qwindowscamerareader.cpp
- platform/windows/mediacapture/qwindowscamerareader_p.h
- platform/windows/mediacapture/qwindowscamerasession.cpp
- platform/windows/mediacapture/qwindowscamerasession_p.h
platform/windows/mediacapture/qwindowscamera_p.h
platform/windows/mediacapture/qwindowsmediacapture.cpp
platform/windows/mediacapture/qwindowsmediacapture_p.h
+ platform/windows/mediacapture/qwindowsmediadevicereader.cpp
+ platform/windows/mediacapture/qwindowsmediadevicereader_p.h
+ platform/windows/mediacapture/qwindowsmediadevicesession.cpp
+ platform/windows/mediacapture/qwindowsmediadevicesession_p.h
platform/windows/mediacapture/qwindowsmediaencoder.cpp
platform/windows/mediacapture/qwindowsmediaencoder_p.h
platform/windows/qwindowsmediadevices.cpp platform/windows/qwindowsmediadevices_p.h
@@ -300,6 +303,7 @@ qt_internal_extend_target(Multimedia CONDITION ANDROID
platform/android/audio/qandroidaudiosink.cpp platform/android/audio/qandroidaudiosink_p.h
platform/android/audio/qandroidaudiodevice.cpp platform/android/audio/qandroidaudiodevice_p.h
platform/android/audio/qopenslesengine.cpp platform/android/audio/qopenslesengine_p.h
+ platform/android/common/qandroidaudiooutput_p.h
platform/android/common/qandroidglobal_p.h
platform/android/common/qandroidmultimediautils.cpp platform/android/common/qandroidmultimediautils_p.h
platform/android/common/qandroidvideooutput.cpp platform/android/common/qandroidvideooutput_p.h
@@ -352,6 +356,7 @@ qt_internal_extend_target(Multimedia CONDITION TARGET Qt::Widgets AND WIN32
qt_internal_extend_target(Multimedia CONDITION APPLE AND NOT WATCHOS
SOURCES
+ platform/darwin/audio/avfaudiodecoder.mm platform/darwin/audio/avfaudiodecoder_p.h
platform/darwin/audio/qdarwinaudiodevice.mm platform/darwin/audio/qdarwinaudiodevice_p.h
platform/darwin/audio/qdarwinaudiosource.mm platform/darwin/audio/qdarwinaudiosource_p.h
platform/darwin/audio/qdarwinaudiosink.mm platform/darwin/audio/qdarwinaudiosink_p.h
diff --git a/src/multimedia/audio/qaudio.cpp b/src/multimedia/audio/qaudio.cpp
index 1ded74e99..e45a67868 100644
--- a/src/multimedia/audio/qaudio.cpp
+++ b/src/multimedia/audio/qaudio.cpp
@@ -80,7 +80,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \enum QAudio::Mode
+ \enum QAudioDevice::Mode
\value AudioOutput audio output device
\value AudioInput audio input device
@@ -280,21 +280,6 @@ QDebug operator<<(QDebug dbg, QAudio::State state)
return dbg;
}
-QDebug operator<<(QDebug dbg, QAudio::Mode mode)
-{
- QDebugStateSaver saver(dbg);
- dbg.nospace();
- switch (mode) {
- case QAudio::AudioInput:
- dbg << "AudioInput";
- break;
- case QAudio::AudioOutput:
- dbg << "AudioOutput";
- break;
- }
- return dbg;
-}
-
QDebug operator<<(QDebug dbg, QAudio::Role role)
{
QDebugStateSaver saver(dbg);
diff --git a/src/multimedia/audio/qaudio.h b/src/multimedia/audio/qaudio.h
index a3c844318..c7852ecfc 100644
--- a/src/multimedia/audio/qaudio.h
+++ b/src/multimedia/audio/qaudio.h
@@ -55,7 +55,6 @@ namespace QAudio
{
enum Error { NoError, OpenError, IOError, UnderrunError, FatalError };
enum State { ActiveState, SuspendedState, StoppedState, IdleState };
- enum Mode { AudioInput, AudioOutput };
enum Role {
UnknownRole,
@@ -83,7 +82,6 @@ namespace QAudio
#ifndef QT_NO_DEBUG_STREAM
Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug dbg, QAudio::Error error);
Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug dbg, QAudio::State state);
-Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug dbg, QAudio::Mode mode);
Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug dbg, QAudio::Role role);
Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug dbg, QAudio::VolumeScale role);
#endif
diff --git a/src/multimedia/audio/qaudiodecoder.h b/src/multimedia/audio/qaudiodecoder.h
index 9b7c360d5..9dd257cc9 100644
--- a/src/multimedia/audio/qaudiodecoder.h
+++ b/src/multimedia/audio/qaudiodecoder.h
@@ -56,15 +56,13 @@ class Q_MULTIMEDIA_EXPORT QAudioDecoder : public QObject
Q_PROPERTY(QString error READ errorString)
Q_PROPERTY(bool bufferAvailable READ bufferAvailable NOTIFY bufferAvailableChanged)
- Q_ENUMS(State)
- Q_ENUMS(Error)
-
public:
enum State
{
StoppedState,
DecodingState
};
+ Q_ENUM(State)
enum Error
{
@@ -74,6 +72,7 @@ public:
AccessDeniedError,
NotSupportedError
};
+ Q_ENUM(Error)
explicit QAudioDecoder(QObject *parent = nullptr);
~QAudioDecoder();
diff --git a/src/multimedia/audio/qaudiodevice.cpp b/src/multimedia/audio/qaudiodevice.cpp
index dc4615c79..bfba09e32 100644
--- a/src/multimedia/audio/qaudiodevice.cpp
+++ b/src/multimedia/audio/qaudiodevice.cpp
@@ -274,9 +274,26 @@ QAudioDevice::QAudioDevice(QAudioDevicePrivate *p)
/*!
returns whether this device is an input or output device.
*/
-QAudio::Mode QAudioDevice::mode() const
+QAudioDevice::Mode QAudioDevice::mode() const
{
return d->mode;
}
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug dbg, QAudioDevice::Mode mode)
+{
+ QDebugStateSaver saver(dbg);
+ dbg.nospace();
+ switch (mode) {
+ case QAudioDevice::Input:
+ dbg << "QAudioDevice::Input";
+ break;
+ case QAudioDevice::Output:
+ dbg << "QAudioDevice::Output";
+ break;
+ }
+ return dbg;
+}
+#endif
+
QT_END_NAMESPACE
diff --git a/src/multimedia/audio/qaudiodevice.h b/src/multimedia/audio/qaudiodevice.h
index 5afd1ebfa..4541f60bc 100644
--- a/src/multimedia/audio/qaudiodevice.h
+++ b/src/multimedia/audio/qaudiodevice.h
@@ -64,6 +64,12 @@ class Q_MULTIMEDIA_EXPORT QAudioDevice
Q_PROPERTY(QString description READ description CONSTANT)
Q_PROPERTY(bool isDefault READ isDefault CONSTANT)
public:
+ enum Mode {
+ Input,
+ Output
+ };
+ Q_ENUM(Mode)
+
QAudioDevice();
QAudioDevice(const QAudioDevice& other);
~QAudioDevice();
@@ -84,7 +90,7 @@ public:
QString description() const;
bool isDefault() const;
- QAudio::Mode mode() const;
+ QAudioDevice::Mode mode() const;
bool isFormatSupported(const QAudioFormat &format) const;
QAudioFormat preferredFormat() const;
@@ -102,6 +108,10 @@ private:
QExplicitlySharedDataPointer<QAudioDevicePrivate> d;
};
+#ifndef QT_NO_DEBUG_STREAM
+Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug dbg, QAudioDevice::Mode mode);
+#endif
+
QT_END_NAMESPACE
#endif // QAUDIODEVICEINFO_H
diff --git a/src/multimedia/audio/qaudiodevice_p.h b/src/multimedia/audio/qaudiodevice_p.h
index dbebac034..9ab75800c 100644
--- a/src/multimedia/audio/qaudiodevice_p.h
+++ b/src/multimedia/audio/qaudiodevice_p.h
@@ -59,13 +59,13 @@ QT_BEGIN_NAMESPACE
class QAudioDevicePrivate : public QSharedData
{
public:
- QAudioDevicePrivate(const QByteArray &i, QAudio::Mode m)
+ QAudioDevicePrivate(const QByteArray &i, QAudioDevice::Mode m)
: id(i),
mode(m)
{}
virtual ~QAudioDevicePrivate();
QByteArray id;
- QAudio::Mode mode = QAudio::AudioOutput;
+ QAudioDevice::Mode mode = QAudioDevice::Output;
bool isDefault = false;
QAudioFormat preferredFormat;
diff --git a/src/multimedia/audio/qaudioinput.cpp b/src/multimedia/audio/qaudioinput.cpp
new file mode 100644
index 000000000..4d65aee3a
--- /dev/null
+++ b/src/multimedia/audio/qaudioinput.cpp
@@ -0,0 +1,151 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qaudioinput.h>
+#include <qaudiodevice.h>
+#include <qmediadevices.h>
+#include <private/qplatformaudioinput_p.h>
+#include <private/qplatformmediaintegration_p.h>
+
+/*!
+ \class QAudioInput
+ \brief The QAudioOutput class represents an input channel for audio.
+ \inmodule QtMultimedia
+ \ingroup multimedia
+ \ingroup multimedia_audio
+
+ QAudioOutput represents an output channel that can be used together QMediaCaptureSession.
+ It allows selecting the physical input device to be used, muting the channel
+ or changing its volume.
+*/
+
+/*!
+ \property QAudioInput::volume
+ \brief the current volume.
+
+ The volume is scaled linearly, ranging from \c 0 (silence) to \c 1 (full volume).
+ Values outside this range will be clamped.
+
+ By default the volume is \c 1.
+
+ 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.
+*/
+
+/*!
+ \property QAudioInput::muted
+ \brief the muted state of the current media.
+
+ The value will be true if the input is muted; otherwise false.
+*/
+
+/*!
+ \property QAudioInput::device
+ \brief the audio device connected to this input.
+
+ The device property represents the audio device connected to this input. A default constructed
+ QAudioInput object will be connected to the systems default audio input at construction time.
+
+ This property can be used to select any other output device listed by QMediaDevices::audioInputs().
+*/
+
+QAudioInput::QAudioInput(QObject *parent)
+ : QAudioInput(QMediaDevices::defaultAudioInput(), parent)
+{}
+
+QAudioInput::QAudioInput(const QAudioDevice &device, QObject *parent)
+ : QObject(parent),
+ d(QPlatformMediaIntegration::instance()->createAudioInput(this))
+{
+ d->device = device;
+ if (!d->device.isNull() && d->device.mode() != QAudioDevice::Input)
+ d->device = QMediaDevices::defaultAudioInput();
+ d->setAudioDevice(d->device);
+}
+
+QAudioInput::~QAudioInput()
+{
+ delete d;
+}
+
+QAudioDevice QAudioInput::device() const
+{
+ return d->device;
+}
+
+void QAudioInput::setDevice(const QAudioDevice &device)
+{
+ if (device.mode() != QAudioDevice::Input)
+ return;
+ d->device = device;
+ d->setAudioDevice(device);
+ emit deviceChanged();
+}
+
+float QAudioInput::volume() const
+{
+ return d->volume;
+}
+
+void QAudioInput::setVolume(float volume)
+{
+ volume = qBound(0., volume, 1.);
+ if (d->volume == volume)
+ return;
+ d->volume = volume;
+ d->setVolume(volume);
+ emit volumeChanged(volume);
+}
+
+bool QAudioInput::isMuted() const
+{
+ return d->muted;
+}
+
+void QAudioInput::setMuted(bool muted)
+{
+ if (d->muted == muted)
+ return;
+ d->muted = muted;
+ d->setMuted(muted);
+ emit mutedChanged(muted);
+}
+
+#include "moc_qaudioinput.cpp"
diff --git a/src/multimedia/audio/qaudioinput.h b/src/multimedia/audio/qaudioinput.h
new file mode 100644
index 000000000..10c3ae1c9
--- /dev/null
+++ b/src/multimedia/audio/qaudioinput.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QAUDIOINPUTDEVICE_H
+#define QAUDIOINPUTDEVICE_H
+
+#include <QtCore/qobject.h>
+#include <QtMultimedia/qtmultimediaglobal.h>
+#include <QtMultimedia/qaudio.h>
+
+QT_BEGIN_NAMESPACE
+
+class QAudioDevice;
+class QPlatformAudioInput;
+
+class Q_MULTIMEDIA_EXPORT QAudioInput : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QAudioDevice device READ device WRITE setDevice NOTIFY deviceChanged)
+ Q_PROPERTY(float volume READ volume WRITE setVolume NOTIFY volumeChanged)
+ Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged)
+
+public:
+ explicit QAudioInput(QObject *parent = nullptr);
+ explicit QAudioInput(const QAudioDevice &deviceInfo, QObject *parent = nullptr);
+ ~QAudioInput();
+
+ QAudioDevice device() const;
+ float volume() const;
+ bool isMuted() const;
+
+public Q_SLOTS:
+ void setDevice(const QAudioDevice &device);
+ void setVolume(float volume);
+ void setMuted(bool muted);
+
+Q_SIGNALS:
+ void deviceChanged();
+ void volumeChanged(float volume);
+ void mutedChanged(bool muted);
+
+public:
+ QPlatformAudioInput *handle() const { return d; }
+private:
+ Q_DISABLE_COPY(QAudioInput)
+ QPlatformAudioInput *d = nullptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QAUDIOINPUTDEVICE_H
diff --git a/src/multimedia/audio/qaudiooutput.cpp b/src/multimedia/audio/qaudiooutput.cpp
new file mode 100644
index 000000000..2f03f78b2
--- /dev/null
+++ b/src/multimedia/audio/qaudiooutput.cpp
@@ -0,0 +1,192 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qaudiooutput.h>
+#include <qaudiodevice.h>
+#include <qmediadevices.h>
+#include <private/qplatformaudiooutput_p.h>
+#include <private/qplatformmediaintegration_p.h>
+
+/*!
+ \class QAudioOutput
+ \brief The QAudioOutput class represents an output channel for audio.
+ \inmodule QtMultimedia
+ \ingroup multimedia
+ \ingroup multimedia_audio
+ \since 6.0
+
+ QAudioOutput represents an output channel that can be used together with QMediaPlayer or
+ QMediaCaptureSession. It allows selecting the physical output device to be used, muting the channel
+ or changing its volume.
+*/
+
+/*!
+ \property QAudioOutput::volume
+ \brief the current volume.
+
+ The volume is scaled linearly, ranging from \c 0 (silence) to \c 1 (full volume).
+ Values outside this range will be clamped.
+
+ By default the volume is \c 1.
+
+ 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.
+*/
+
+/*!
+ \property QAudioOutput::muted
+ \brief the muted state of the current media.
+
+ The value will be true if the output is muted; otherwise false.
+*/
+
+/*!
+ \property QAudioOutput::device
+ \brief the audio device connected to this output.
+
+ The device property represents the audio device connected to this output. A default constructed
+ QAudioOutput object will be connected to the systems default audio output at construction time.
+
+ This property can be used to select any other output device listed by QMediaDevices::audioOutputs().
+*/
+
+/*!
+ \property QAudioOutput::audioRole
+ \brief the role of the audio played by this output.
+
+ It can be set to specify the type of audio being played, allowing the system to make
+ appropriate decisions when it comes to volume, routing or post-processing.
+
+ \sa supportedAudioRoles()
+*/
+
+QAudioOutput::QAudioOutput(QObject *parent)
+ : QAudioOutput(QMediaDevices::defaultAudioOutput(), parent)
+{}
+
+QAudioOutput::QAudioOutput(const QAudioDevice &device, QObject *parent)
+ : QObject(parent),
+ d(QPlatformMediaIntegration::instance()->createAudioOutput(this))
+{
+ d->device = device;
+ if (!d->device.isNull() && d->device.mode() != QAudioDevice::Output)
+ d->device = QMediaDevices::defaultAudioOutput();
+ d->setAudioDevice(d->device);
+}
+
+QAudioOutput::~QAudioOutput()
+{
+ delete d;
+}
+
+QAudioDevice QAudioOutput::device() const
+{
+ return d->device;
+}
+
+void QAudioOutput::setDevice(const QAudioDevice &device)
+{
+ if (!device.isNull() && device.mode() != QAudioDevice::Output)
+ return;
+ if (d->device == device)
+ return;
+ d->device = device;
+ d->setAudioDevice(device);
+ emit deviceChanged();
+}
+
+float QAudioOutput::volume() const
+{
+ return d->volume;
+}
+
+void QAudioOutput::setVolume(float volume)
+{
+ volume = qBound(0., volume, 1.);
+ if (d->volume == volume)
+ return;
+ d->volume = volume;
+ d->setVolume(volume);
+ emit volumeChanged(volume);
+}
+
+bool QAudioOutput::isMuted() const
+{
+ return d->muted;
+}
+
+QAudio::Role QAudioOutput::audioRole() const
+{
+ return d->role;
+}
+
+/*!
+ Returns a list of supported audio roles.
+
+ If setting the audio role is not supported, an empty list is returned.
+
+ \sa audioRole
+*/
+QList<QAudio::Role> QAudioOutput::supportedAudioRoles() const
+{
+ return d->supportedAudioRoles();
+}
+
+void QAudioOutput::setMuted(bool muted)
+{
+ if (d->muted == muted)
+ return;
+ d->muted = muted;
+ d->setMuted(muted);
+ emit mutedChanged(muted);
+}
+
+void QAudioOutput::setAudioRole(QAudio::Role audioRole)
+{
+ if (d->role == audioRole)
+ return;
+ if (!d->supportedAudioRoles().contains(audioRole))
+ return;
+ d->role = audioRole;
+ d->setAudioRole(d->role);
+ emit audioRoleChanged(d->role);
+}
+
+#include "moc_qaudiooutput.cpp"
diff --git a/src/multimedia/audio/qaudiooutput.h b/src/multimedia/audio/qaudiooutput.h
new file mode 100644
index 000000000..9a4cf3998
--- /dev/null
+++ b/src/multimedia/audio/qaudiooutput.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QAUDIOOUTPUTDEVICE_H
+#define QAUDIOOUTPUTDEVICE_H
+
+#include <QtCore/qobject.h>
+#include <QtMultimedia/qtmultimediaglobal.h>
+#include <QtMultimedia/qaudio.h>
+
+QT_BEGIN_NAMESPACE
+
+class QAudioDevice;
+class QPlatformAudioOutput;
+
+class Q_MULTIMEDIA_EXPORT QAudioOutput : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QAudioDevice device READ device WRITE setDevice NOTIFY deviceChanged)
+ Q_PROPERTY(float volume READ volume WRITE setVolume NOTIFY volumeChanged)
+ Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged)
+ Q_PROPERTY(QAudio::Role audioRole READ audioRole WRITE setAudioRole NOTIFY audioRoleChanged)
+
+public:
+ explicit QAudioOutput(QObject *parent = nullptr);
+ explicit QAudioOutput(const QAudioDevice &device, QObject *parent = nullptr);
+ ~QAudioOutput();
+
+ QAudioDevice device() const;
+ float volume() const;
+ bool isMuted() const;
+ QAudio::Role audioRole() const;
+
+ QList<QAudio::Role> supportedAudioRoles() const;
+
+public Q_SLOTS:
+ void setDevice(const QAudioDevice &device);
+ void setVolume(float volume);
+ void setMuted(bool muted);
+ void setAudioRole(QAudio::Role audioRole);
+
+Q_SIGNALS:
+ void deviceChanged();
+ void volumeChanged(float volume);
+ void mutedChanged(bool muted);
+ void audioRoleChanged(QAudio::Role role);
+
+public:
+ QPlatformAudioOutput *handle() const { return d; }
+private:
+ Q_DISABLE_COPY(QAudioOutput)
+ QPlatformAudioOutput *d = nullptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QAUDIOOUTPUTDEVICE_H
diff --git a/src/multimedia/audio/qsoundeffect.h b/src/multimedia/audio/qsoundeffect.h
index 85e80b704..fef49fb34 100644
--- a/src/multimedia/audio/qsoundeffect.h
+++ b/src/multimedia/audio/qsoundeffect.h
@@ -65,14 +65,13 @@ class Q_MULTIMEDIA_EXPORT QSoundEffect : public QObject
Q_PROPERTY(bool playing READ isPlaying NOTIFY playingChanged)
Q_PROPERTY(Status status READ status NOTIFY statusChanged)
Q_PROPERTY(QAudio::Role audioRole READ audioRole WRITE setAudioRole NOTIFY audioRoleChanged)
- Q_ENUMS(Loop)
- Q_ENUMS(Status)
public:
enum Loop
{
Infinite = -2
};
+ Q_ENUM(Loop)
enum Status
{
@@ -81,6 +80,7 @@ public:
Ready,
Error
};
+ Q_ENUM(Status)
explicit QSoundEffect(QObject *parent = nullptr);
explicit QSoundEffect(const QAudioDevice &audioDevice, QObject *parent = nullptr);
diff --git a/src/multimedia/camera/qcamera.h b/src/multimedia/camera/qcamera.h
index 12d241f31..881579ae0 100644
--- a/src/multimedia/camera/qcamera.h
+++ b/src/multimedia/camera/qcamera.h
@@ -89,16 +89,6 @@ class Q_MULTIMEDIA_EXPORT QCamera : public QObject
Q_PROPERTY(int colorTemperature READ colorTemperature WRITE setColorTemperature NOTIFY colorTemperatureChanged)
Q_PROPERTY(Features supportedFeatures READ supportedFeatures NOTIFY supportedFeaturesChanged)
- Q_ENUMS(Status)
- Q_ENUMS(Error)
-
- Q_ENUMS(FocusMode)
-
- Q_ENUMS(FlashMode)
- Q_ENUMS(TorchMode)
- Q_ENUMS(ExposureMode)
-
- Q_ENUMS(WhiteBalanceMode)
public:
enum Status {
UnavailableStatus,
@@ -107,12 +97,14 @@ public:
StoppingStatus,
ActiveStatus
};
+ Q_ENUM(Status)
enum Error
{
NoError,
CameraError
};
+ Q_ENUM(Error)
enum FocusMode {
FocusModeAuto,
@@ -122,18 +114,21 @@ public:
FocusModeInfinity,
FocusModeManual
};
+ Q_ENUM(FocusMode)
enum FlashMode {
FlashOff,
FlashOn,
FlashAuto
};
+ Q_ENUM(FlashMode)
enum TorchMode {
TorchOff,
TorchOn,
TorchAuto
};
+ Q_ENUM(TorchMode)
enum ExposureMode {
ExposureAuto,
@@ -154,6 +149,7 @@ public:
ExposureCandlelight,
ExposureBarcode
};
+ Q_ENUM(ExposureMode)
enum WhiteBalanceMode {
WhiteBalanceAuto = 0,
@@ -166,6 +162,7 @@ public:
WhiteBalanceFlash = 7,
WhiteBalanceSunset = 8
};
+ Q_ENUM(WhiteBalanceMode)
enum class Feature {
ColorTemperature = 0x1,
diff --git a/src/multimedia/camera/qcameradevice.h b/src/multimedia/camera/qcameradevice.h
index 7918d058b..d2a97d927 100644
--- a/src/multimedia/camera/qcameradevice.h
+++ b/src/multimedia/camera/qcameradevice.h
@@ -79,7 +79,6 @@ class Q_MULTIMEDIA_EXPORT QCameraDevice
Q_PROPERTY(QString description READ description CONSTANT)
Q_PROPERTY(bool isDefault READ isDefault CONSTANT)
Q_PROPERTY(Position position READ position CONSTANT)
- Q_ENUMS(Position)
public:
QCameraDevice();
QCameraDevice(const QCameraDevice& other);
@@ -106,6 +105,7 @@ public:
BackFace,
FrontFace
};
+ Q_ENUM(Position)
Position position() const;
diff --git a/src/multimedia/camera/qcameraimagecapture.cpp b/src/multimedia/camera/qcameraimagecapture.cpp
index e90d11fdd..0a503479b 100644
--- a/src/multimedia/camera/qcameraimagecapture.cpp
+++ b/src/multimedia/camera/qcameraimagecapture.cpp
@@ -42,6 +42,7 @@
#include <qmediametadata.h>
#include <private/qplatformmediacapture_p.h>
#include <private/qplatformmediaintegration_p.h>
+#include <private/qplatformmediaformatinfo_p.h>
#include <qmediacapturesession.h>
#include "private/qobject_p.h"
@@ -204,34 +205,6 @@ QString QCameraImageCapture::errorString() const
}
/*!
- Returns the image encoder settings being used.
-
- \sa setEncodingSettings()
-*/
-
-QImageEncoderSettings QCameraImageCapture::encodingSettings() const
-{
- return d_func()->control ?
- d_func()->control->imageSettings() : QImageEncoderSettings();
-}
-
-/*!
- Sets the image encoding \a settings.
-
- If some parameters are not specified, or null settings are passed,
- the encoder choose the default encoding parameters.
-
- \sa encodingSettings()
-*/
-void QCameraImageCapture::setEncodingSettings(const QImageEncoderSettings &settings)
-{
- Q_D(QCameraImageCapture);
-
- if (d->control)
- d->control->setImageSettings(settings);
-}
-
-/*!
Returns the meta data that will get embedded into the image. A couple of additional fields
such as a time stamp or location might get added by the camera backend.
*/
@@ -419,6 +392,165 @@ int QCameraImageCapture::capture()
the frame with request \a id was saved to \a fileName.
*/
+/*!
+ Returns the image format.
+*/
+
+QCameraImageCapture::FileFormat QCameraImageCapture::fileFormat() const
+{
+ Q_D(const QCameraImageCapture);
+ if (!d->control)
+ return UnspecifiedFormat;
+ return d->control->imageSettings().format();
+}
+
+/*!
+ Sets the image \a format.
+*/
+void QCameraImageCapture::setFileFormat(QCameraImageCapture::FileFormat format)
+{
+ Q_D(QCameraImageCapture);
+ if (!d->control)
+ return;
+ auto fmt = d->control->imageSettings();
+ if (fmt.format() == format)
+ return;
+ fmt.setFormat(format);
+ d->control->setImageSettings(fmt);
+ emit fileFormatChanged();
+}
+
+QList<QCameraImageCapture::FileFormat> QCameraImageCapture::supportedFormats()
+{
+ return QPlatformMediaIntegration::instance()->formatInfo()->imageFormats;
+}
+
+QString QCameraImageCapture::fileFormatName(QCameraImageCapture::FileFormat f)
+{
+ const char *name = nullptr;
+ switch (f) {
+ case UnspecifiedFormat:
+ name = "Unspecified image format";
+ break;
+ case JPEG:
+ name = "JPEG";
+ break;
+ case PNG:
+ name = "PNG";
+ break;
+ case WebP:
+ name = "WebP";
+ break;
+ case Tiff:
+ name = "Tiff";
+ break;
+ }
+ return QString::fromUtf8(name);
+}
+
+QString QCameraImageCapture::fileFormatDescription(QCameraImageCapture::FileFormat f)
+{
+ const char *name = nullptr;
+ switch (f) {
+ case UnspecifiedFormat:
+ name = "Unspecified image format";
+ break;
+ case JPEG:
+ name = "JPEG";
+ break;
+ case PNG:
+ name = "PNG";
+ break;
+ case WebP:
+ name = "WebP";
+ break;
+ case Tiff:
+ name = "Tiff";
+ break;
+ }
+ return QString::fromUtf8(name);
+}
+
+/*!
+ Returns the resolution of the encoded image.
+*/
+
+QSize QCameraImageCapture::resolution() const
+{
+ Q_D(const QCameraImageCapture);
+ if (!d->control)
+ return QSize();
+ return d->control->imageSettings().resolution();
+}
+
+/*!
+ Sets the \a resolution of the encoded image.
+
+ An empty QSize indicates the encoder should make an optimal choice based on
+ what is available from the image source and the limitations of the codec.
+*/
+void QCameraImageCapture::setResolution(const QSize &resolution)
+{
+ Q_D(QCameraImageCapture);
+ if (!d->control)
+ return;
+ auto fmt = d->control->imageSettings();
+ if (fmt.resolution() == resolution)
+ return;
+ fmt.setResolution(resolution);
+ d->control->setImageSettings(fmt);
+ emit resolutionChanged();
+}
+
+/*!
+ Sets the \a width and \a height of the resolution of the encoded image.
+
+ \overload
+*/
+void QCameraImageCapture::setResolution(int width, int height)
+{
+ setResolution(QSize(width, height));
+}
+
+/*!
+ \enum QCameraImageCapture::EncodingQuality
+
+ Enumerates quality encoding levels.
+
+ \value VeryLowQuality
+ \value LowQuality
+ \value NormalQuality
+ \value HighQuality
+ \value VeryHighQuality
+*/
+
+/*!
+ Returns the image encoding quality.
+*/
+QCameraImageCapture::Quality QCameraImageCapture::quality() const
+{
+ Q_D(const QCameraImageCapture);
+ if (!d->control)
+ return NormalQuality;
+ return d->control->imageSettings().quality();
+}
+
+/*!
+ Sets the image encoding \a quality.
+*/
+void QCameraImageCapture::setQuality(Quality quality)
+{
+ Q_D(QCameraImageCapture);
+ if (!d->control)
+ return;
+ auto fmt = d->control->imageSettings();
+ if (fmt.quality() == quality)
+ return;
+ fmt.setQuality(quality);
+ d->control->setImageSettings(fmt);
+ emit resolutionChanged();
+}
+
QT_END_NAMESPACE
#include "moc_qcameraimagecapture.cpp"
diff --git a/src/multimedia/camera/qcameraimagecapture.h b/src/multimedia/camera/qcameraimagecapture.h
index c285e0784..015b7f0a3 100644
--- a/src/multimedia/camera/qcameraimagecapture.h
+++ b/src/multimedia/camera/qcameraimagecapture.h
@@ -62,11 +62,12 @@ class QCameraImageCapturePrivate;
class Q_MULTIMEDIA_EXPORT QCameraImageCapture : public QObject
{
Q_OBJECT
- Q_ENUMS(Error)
Q_PROPERTY(bool readyForCapture READ isReadyForCapture NOTIFY readyForCaptureChanged)
Q_PROPERTY(QMediaMetaData metaData READ metaData WRITE setMetaData NOTIFY metaDataChanged)
Q_PROPERTY(Error error READ error NOTIFY errorChanged)
Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged)
+ Q_PROPERTY(FileFormat fileFormat READ fileFormat NOTIFY setFileFormat NOTIFY fileFormatChanged)
+ Q_PROPERTY(Quality quality READ quality NOTIFY setQuality NOTIFY qualityChanged)
public:
enum Error
{
@@ -77,6 +78,27 @@ public:
NotSupportedFeatureError,
FormatError
};
+ Q_ENUM(Error)
+
+ enum Quality
+ {
+ VeryLowQuality,
+ LowQuality,
+ NormalQuality,
+ HighQuality,
+ VeryHighQuality
+ };
+ Q_ENUM(Quality)
+
+ enum FileFormat {
+ UnspecifiedFormat,
+ JPEG,
+ PNG,
+ WebP,
+ Tiff,
+ LastFileFormat = Tiff
+ };
+ Q_ENUM(FileFormat)
explicit QCameraImageCapture(QObject *parent = nullptr);
~QCameraImageCapture();
@@ -90,8 +112,19 @@ public:
bool isReadyForCapture() const;
- QImageEncoderSettings encodingSettings() const;
- void setEncodingSettings(const QImageEncoderSettings& settings);
+ FileFormat fileFormat() const;
+ void setFileFormat(FileFormat format);
+
+ static QList<FileFormat> supportedFormats();
+ static QString fileFormatName(FileFormat c);
+ static QString fileFormatDescription(FileFormat c);
+
+ QSize resolution() const;
+ void setResolution(const QSize &);
+ void setResolution(int width, int height);
+
+ Quality quality() const;
+ void setQuality(Quality quality);
QMediaMetaData metaData() const;
void setMetaData(const QMediaMetaData &metaData);
@@ -108,6 +141,10 @@ Q_SIGNALS:
void readyForCaptureChanged(bool ready);
void metaDataChanged();
+ void fileFormatChanged();
+ void qualityChanged();
+ void resolutionChanged();
+
void imageExposed(int id);
void imageCaptured(int id, const QImage &preview);
void imageMetadataAvailable(int id, const QMediaMetaData &metaData);
diff --git a/src/multimedia/doc/snippets/multimedia-snippets/audio.cpp b/src/multimedia/doc/snippets/multimedia-snippets/audio.cpp
index 6cc3d3151..24045adab 100644
--- a/src/multimedia/doc/snippets/multimedia-snippets/audio.cpp
+++ b/src/multimedia/doc/snippets/multimedia-snippets/audio.cpp
@@ -203,7 +203,7 @@ void AudioDeviceInfo()
//! [Setting audio format]
//! [Dumping audio formats]
- const auto deviceInfos = QMediaDevices::availableDevices(QAudio::AudioOutput);
+ const auto deviceInfos = QMediaDevices::availableDevices(QAudioDevice::Output);
for (const QAudioDevice &deviceInfo : deviceInfos)
qDebug() << "Device: " << deviceInfo.description();
//! [Dumping audio formats]
diff --git a/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp b/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp
index af0724ed7..2306265b7 100644
--- a/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp
+++ b/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp
@@ -41,7 +41,7 @@
#include "qcamera.h"
#include "qcameradevice.h"
-#include "qmediaencoder.h"
+#include "qmediarecorder.h"
#include "qmediadevices.h"
#include "qmediacapturesession.h"
#include "qcameraimagecapture.h"
@@ -53,7 +53,7 @@
/* Globals so that everything is consistent. */
QCamera *camera = 0;
-QMediaEncoder *encoder = 0;
+QMediaRecorder *encoder = 0;
QCameraImageCapture *imageCapture = 0;
//! [Camera overview check]
@@ -151,7 +151,7 @@ void overview_movie()
QMediaCaptureSession captureSession;
camera = new QCamera;
captureSession.setCamera(camera);
- encoder = new QMediaEncoder(camera);
+ encoder = new QMediaRecorder(camera);
captureSession.setEncoder(encoder);
camera->start();
diff --git a/src/multimedia/doc/snippets/multimedia-snippets/media.cpp b/src/multimedia/doc/snippets/multimedia-snippets/media.cpp
index 9a896e460..f2ed71cf7 100644
--- a/src/multimedia/doc/snippets/multimedia-snippets/media.cpp
+++ b/src/multimedia/doc/snippets/multimedia-snippets/media.cpp
@@ -103,7 +103,7 @@ void MediaExample::ImageEncoderSettings()
{
//! [Image encoder settings]
QImageEncoderSettings imageSettings;
- imageSettings.setFormat(QImageEncoderSettings::JPEG);
+ imageSettings.setFormat(QCameraImageCapture::JPEG);
imageSettings.setResolution(1600, 1200);
imageCapture->setEncodingSettings(imageSettings);
diff --git a/src/multimedia/doc/snippets/multimedia-snippets/multiple-videooutputs.qml b/src/multimedia/doc/snippets/multimedia-snippets/multiple-videooutputs.qml
index 4796b8629..8484a5f28 100644
--- a/src/multimedia/doc/snippets/multimedia-snippets/multiple-videooutputs.qml
+++ b/src/multimedia/doc/snippets/multimedia-snippets/multiple-videooutputs.qml
@@ -48,6 +48,9 @@ Item {
autoPlay: true
source: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
videoOutput: [v1, v2]
+ audioOutput: AudioOutput {
+
+ }
}
VideoOutput {
diff --git a/src/multimedia/doc/snippets/multimedia-snippets/qtvideosink.qml b/src/multimedia/doc/snippets/multimedia-snippets/qtvideosink.qml
index 190954e44..842b3138c 100644
--- a/src/multimedia/doc/snippets/multimedia-snippets/qtvideosink.qml
+++ b/src/multimedia/doc/snippets/multimedia-snippets/qtvideosink.qml
@@ -44,12 +44,16 @@ import QtMultimedia
Item {
MediaPlayer {
id: mediaplayer
- source: "gst-pipeline: videotestsrc ! qtvideosink"
+ source: "file:///test.mp4"
+ videoOutput: videoOutput
+ audioOutput: AudioOutput {
+
+ }
}
VideoOutput {
+ id: videoOutput
anchors.fill: parent
- source: mediaplayer
}
MouseArea {
diff --git a/src/multimedia/doc/src/cameraoverview.qdoc b/src/multimedia/doc/src/cameraoverview.qdoc
index 1ade899b0..f1f33d79a 100644
--- a/src/multimedia/doc/src/cameraoverview.qdoc
+++ b/src/multimedia/doc/src/cameraoverview.qdoc
@@ -204,7 +204,7 @@ object. All that is then needed is to start the camera and capture the image.
\section2 Movies
Previously we saw code that allowed the capture of a still image. Recording
-video requires the use of a \l QMediaEncoder object.
+video requires the use of a \l QMediaRecorder object.
To record video we need to create a camera object as before but this time as
well as creating a viewfinder, we will also initialize a media recorder object.
@@ -213,11 +213,11 @@ well as creating a viewfinder, we will also initialize a media recorder object.
Signals from the \e mediaEncoder can be connected to slots to react to
changes in the state of the encoding process or error events. Recording itself
-starts with the \l {QMediaEncoder::record()}{record()} function of
+starts with the \l {QMediaRecorder::record()}{record()} function of
mediaEncoder being called, this causes the signal \l
-{QMediaEncoder::stateChanged()}{stateChanged()} to be emitted. The
-recording process can be changed with the \l {QMediaEncoder::record()}{record()},
-\l {QMediaEncoder::stop()}{stop()} slots in \l QMediaEncoder.
+{QMediaRecorder::recorderStateChanged()}{recorderStateChanged()} to be emitted. The
+recording process can be changed with the \l {QMediaRecorder::record()}{record()},
+\l {QMediaRecorder::stop()}{stop()} slots in \l QMediaRecorder.
On top of the above, QMediaRecorder provides a simple to use, but more limited all-in-one class
for recording audio and video content.
diff --git a/src/multimedia/doc/src/changes.qdoc b/src/multimedia/doc/src/changes.qdoc
index 871dc92b5..4855620a4 100644
--- a/src/multimedia/doc/src/changes.qdoc
+++ b/src/multimedia/doc/src/changes.qdoc
@@ -42,7 +42,7 @@ There are a number of new features in Qt Multimedia:
\list
\li QMediaCaptureSession class as the central object for media capture
\li Changed QMediaRecorder class to be a high level class for audio/video recording
-\li new QMediaEncoder class to handle encoding of data produced in a capture session
+\li new QMediaRecorder class to handle encoding of data produced in a capture session
\li Setting up the desired encodings when recording has changed significantly, see
QMediaEncoderSettings for details
\li Support for selection of audio, video and subtitle tracks when playing back media files
diff --git a/src/multimedia/platform/alsa/qalsaaudiodevice.cpp b/src/multimedia/platform/alsa/qalsaaudiodevice.cpp
index 1b0ed0941..ed0aa0030 100644
--- a/src/multimedia/platform/alsa/qalsaaudiodevice.cpp
+++ b/src/multimedia/platform/alsa/qalsaaudiodevice.cpp
@@ -54,7 +54,7 @@
QT_BEGIN_NAMESPACE
-QAlsaAudioDeviceInfo::QAlsaAudioDeviceInfo(const QByteArray &dev, const QString &desc, QAudio::Mode mode)
+QAlsaAudioDeviceInfo::QAlsaAudioDeviceInfo(const QByteArray &dev, const QString &desc, QAudioDevice::Mode mode)
: QAudioDevicePrivate(dev, mode)
{
description = desc;
@@ -100,7 +100,7 @@ void QAlsaAudioDeviceInfo::checkSurround()
io = snd_device_name_get_hint(*n, "IOID");
if((name != NULL) && (descr != NULL)) {
QString deviceName = QLatin1String(name);
- if (mode == QAudio::AudioOutput) {
+ if (mode == QAudioDevice::Output) {
if(deviceName.contains(QLatin1String("surround40")))
surround40 = true;
if(deviceName.contains(QLatin1String("surround51")))
diff --git a/src/multimedia/platform/alsa/qalsaaudiodevice_p.h b/src/multimedia/platform/alsa/qalsaaudiodevice_p.h
index 9c946dc34..4f7bc5757 100644
--- a/src/multimedia/platform/alsa/qalsaaudiodevice_p.h
+++ b/src/multimedia/platform/alsa/qalsaaudiodevice_p.h
@@ -69,7 +69,7 @@ QT_BEGIN_NAMESPACE
class QAlsaAudioDeviceInfo : public QAudioDevicePrivate
{
public:
- QAlsaAudioDeviceInfo(const QByteArray &dev, const QString &description, QAudio::Mode mode);
+ QAlsaAudioDeviceInfo(const QByteArray &dev, const QString &description, QAudioDevice::Mode mode);
~QAlsaAudioDeviceInfo();
private:
diff --git a/src/multimedia/platform/alsa/qalsamediadevices.cpp b/src/multimedia/platform/alsa/qalsamediadevices.cpp
index 6871cad16..e2561e66a 100644
--- a/src/multimedia/platform/alsa/qalsamediadevices.cpp
+++ b/src/multimedia/platform/alsa/qalsamediadevices.cpp
@@ -54,7 +54,7 @@ QAlsaMediaDevices::QAlsaMediaDevices()
{
}
-static QList<QAudioDevice> availableDevices(QAudio::Mode mode)
+static QList<QAudioDevice> availableDevices(QAudioDevice::Mode mode)
{
QList<QAudioDevice> devices;
@@ -70,7 +70,7 @@ static QList<QAudioDevice> availableDevices(QAudio::Mode mode)
}
n = hints;
- if(mode == QAudio::AudioInput) {
+ if(mode == QAudioDevice::Input) {
filter = "Input";
} else {
filter = "Output";
@@ -102,12 +102,12 @@ static QList<QAudioDevice> availableDevices(QAudio::Mode mode)
QList<QAudioDevice> QAlsaMediaDevices::audioInputs() const
{
- return availableDevices(QAudio::AudioInput);
+ return availableDevices(QAudioDevice::Input);
}
QList<QAudioDevice> QAlsaMediaDevices::audioOutputs() const
{
- return availableDevices(QAudio::AudioOutput);
+ return availableDevices(QAudioDevice::Output);
}
QList<QCameraDevice> QAlsaMediaDevices::videoInputs() const
diff --git a/src/multimedia/platform/android/audio/qandroidaudiodevice.cpp b/src/multimedia/platform/android/audio/qandroidaudiodevice.cpp
index 07cf9c12e..6768362f5 100644
--- a/src/multimedia/platform/android/audio/qandroidaudiodevice.cpp
+++ b/src/multimedia/platform/android/audio/qandroidaudiodevice.cpp
@@ -43,7 +43,7 @@
QT_BEGIN_NAMESPACE
-QOpenSLESDeviceInfo::QOpenSLESDeviceInfo(const QByteArray &device, const QString &desc, QAudio::Mode mode)
+QOpenSLESDeviceInfo::QOpenSLESDeviceInfo(const QByteArray &device, const QString &desc, QAudioDevice::Mode mode)
: QAudioDevicePrivate(device, mode),
m_engine(QOpenSLESEngine::instance())
{
@@ -60,7 +60,7 @@ QOpenSLESDeviceInfo::QOpenSLESDeviceInfo(const QByteArray &device, const QString
minimumSampleRate = sampleRates.first();
maximumSampleRate = sampleRates.last();
}
- if (mode == QAudio::AudioInput)
+ if (mode == QAudioDevice::Input)
supportedSampleFormats.append(QAudioFormat::UInt8);
supportedSampleFormats.append(QAudioFormat::Int16);
diff --git a/src/multimedia/platform/android/audio/qandroidaudiodevice_p.h b/src/multimedia/platform/android/audio/qandroidaudiodevice_p.h
index 626037f73..81b85c9fd 100644
--- a/src/multimedia/platform/android/audio/qandroidaudiodevice_p.h
+++ b/src/multimedia/platform/android/audio/qandroidaudiodevice_p.h
@@ -61,7 +61,7 @@ class QOpenSLESEngine;
class QOpenSLESDeviceInfo : public QAudioDevicePrivate
{
public:
- QOpenSLESDeviceInfo(const QByteArray &device, const QString &desc, QAudio::Mode mode);
+ QOpenSLESDeviceInfo(const QByteArray &device, const QString &desc, QAudioDevice::Mode mode);
~QOpenSLESDeviceInfo() {}
private:
diff --git a/src/multimedia/platform/android/audio/qopenslesengine.cpp b/src/multimedia/platform/android/audio/qopenslesengine.cpp
index 3bddea920..1ec3306dd 100644
--- a/src/multimedia/platform/android/audio/qopenslesengine.cpp
+++ b/src/multimedia/platform/android/audio/qopenslesengine.cpp
@@ -103,16 +103,16 @@ SLDataFormat_PCM QOpenSLESEngine::audioFormatToSLFormatPCM(const QAudioFormat &f
}
-QList<QAudioDevice> QOpenSLESEngine::availableDevices(QAudio::Mode mode)
+QList<QAudioDevice> QOpenSLESEngine::availableDevices(QAudioDevice::Mode mode)
{
QList<QAudioDevice> devices;
QJniObject devs;
- if (mode == QAudio::AudioInput) {
+ if (mode == QAudioDevice::Input) {
devs = QJniObject::callStaticObjectMethod(
"org/qtproject/qt/android/multimedia/QtAudioDeviceManager",
"getAudioInputDevices",
"()[Ljava/lang/String;");
- } else if (mode == QAudio::AudioOutput) {
+ } else if (mode == QAudioDevice::Output) {
devs = QJniObject::callStaticObjectMethod(
"org/qtproject/qt/android/multimedia/QtAudioDeviceManager",
"getAudioOutputDevices",
@@ -132,9 +132,9 @@ QList<QAudioDevice> QOpenSLESEngine::availableDevices(QAudio::Mode mode)
return devices;
}
-QList<int> QOpenSLESEngine::supportedChannelCounts(QAudio::Mode mode) const
+QList<int> QOpenSLESEngine::supportedChannelCounts(QAudioDevice::Mode mode) const
{
- if (mode == QAudio::AudioInput) {
+ if (mode == QAudioDevice::Input) {
if (!m_checkedInputFormats)
const_cast<QOpenSLESEngine *>(this)->checkSupportedInputFormats();
return m_supportedInputChannelCounts;
@@ -143,9 +143,9 @@ QList<int> QOpenSLESEngine::supportedChannelCounts(QAudio::Mode mode) const
}
}
-QList<int> QOpenSLESEngine::supportedSampleRates(QAudio::Mode mode) const
+QList<int> QOpenSLESEngine::supportedSampleRates(QAudioDevice::Mode mode) const
{
- if (mode == QAudio::AudioInput) {
+ if (mode == QAudioDevice::Input) {
if (!m_checkedInputFormats)
const_cast<QOpenSLESEngine *>(this)->checkSupportedInputFormats();
return m_supportedInputSampleRates;
diff --git a/src/multimedia/platform/android/audio/qopenslesengine_p.h b/src/multimedia/platform/android/audio/qopenslesengine_p.h
index 4427235d7..922f42378 100644
--- a/src/multimedia/platform/android/audio/qopenslesengine_p.h
+++ b/src/multimedia/platform/android/audio/qopenslesengine_p.h
@@ -74,9 +74,9 @@ public:
static SLDataFormat_PCM audioFormatToSLFormatPCM(const QAudioFormat &format);
- static QList<QAudioDevice> availableDevices(QAudio::Mode mode);
- QList<int> supportedChannelCounts(QAudio::Mode mode) const;
- QList<int> supportedSampleRates(QAudio::Mode mode) const;
+ static QList<QAudioDevice> availableDevices(QAudioDevice::Mode mode);
+ QList<int> supportedChannelCounts(QAudioDevice::Mode mode) const;
+ QList<int> supportedSampleRates(QAudioDevice::Mode mode) const;
static int getOutputValue(OutputValue type, int defaultValue = 0);
static int getDefaultBufferSize(const QAudioFormat &format);
diff --git a/src/multimedia/platform/android/common/qandroidaudiooutput_p.h b/src/multimedia/platform/android/common/qandroidaudiooutput_p.h
new file mode 100644
index 000000000..65e40a300
--- /dev/null
+++ b/src/multimedia/platform/android/common/qandroidaudiooutput_p.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QANDROIDAUDIOOUTPUT_H
+#define QANDROIDAUDIOOUTPUT_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qplatformaudiooutput_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_MULTIMEDIA_EXPORT QAndroidAudioOutput : public QPlatformAudioOutput
+{
+public:
+ QAndroidAudioOutput(QAudioOutput *qq) : QPlatformAudioOutput(qq) {}
+
+ virtual QList<QAudio::Role> supportedAudioRoles() const {
+ return QList<QAudio::Role>()
+ << QAudio::VoiceCommunicationRole
+ << QAudio::MusicRole
+ << QAudio::VideoRole
+ << QAudio::SonificationRole
+ << QAudio::AlarmRole
+ << QAudio::NotificationRole
+ << QAudio::RingtoneRole
+ << QAudio::AccessibilityRole
+ << QAudio::GameRole;
+ }
+};
+
+QT_END_NAMESPACE
+
+
+#endif // QANDROIDAUDIOOUTPUT_H
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp b/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp
index 1f1229944..a5cb1a467 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp
@@ -463,7 +463,7 @@ void QAndroidCameraSession::applyImageSettings()
return;
// only supported format right now.
- m_actualImageSettings.setFormat(QImageEncoderSettings::JPEG);
+ m_actualImageSettings.setFormat(QCameraImageCapture::JPEG);
const QSize requestedResolution = m_requestedImageSettings.resolution();
const QList<QSize> supportedResolutions = m_camera->getSupportedPictureSizes();
@@ -485,19 +485,19 @@ void QAndroidCameraSession::applyImageSettings()
int jpegQuality = 100;
switch (m_requestedImageSettings.quality()) {
- case QImageEncoderSettings::VeryLowQuality:
+ case QCameraImageCapture::VeryLowQuality:
jpegQuality = 20;
break;
- case QImageEncoderSettings::LowQuality:
+ case QCameraImageCapture::LowQuality:
jpegQuality = 40;
break;
- case QImageEncoderSettings::NormalQuality:
+ case QCameraImageCapture::NormalQuality:
jpegQuality = 60;
break;
- case QImageEncoderSettings::HighQuality:
+ case QCameraImageCapture::HighQuality:
jpegQuality = 80;
break;
- case QImageEncoderSettings::VeryHighQuality:
+ case QCameraImageCapture::VeryHighQuality:
jpegQuality = 100;
break;
}
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h b/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h
index 7caf782e9..75929b489 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h
@@ -58,6 +58,7 @@
#include <QSet>
#include <QMutex>
#include <private/qmediastoragelocation_p.h>
+#include <private/qplatformcameraimagecapture_p.h>
#include "androidcamera_p.h"
QT_BEGIN_NAMESPACE
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..021159b32 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>
@@ -57,8 +58,8 @@ QAndroidCaptureSession::QAndroidCaptureSession(QAndroidCameraSession *cameraSess
, m_cameraSession(cameraSession)
, m_audioSource(AndroidMediaRecorder::DefaultAudioSource)
, m_duration(0)
- , m_state(QMediaEncoder::StoppedState)
- , m_status(QMediaEncoder::StoppedStatus)
+ , m_state(QMediaRecorder::StoppedState)
+ , m_status(QMediaRecorder::StoppedStatus)
, m_encoderSettingsDirty(true)
, m_outputFormat(AndroidMediaRecorder::DefaultOutputFormat)
, m_audioEncoder(AndroidMediaRecorder::DefaultAudioEncoder)
@@ -77,26 +78,26 @@ QAndroidCaptureSession::QAndroidCaptureSession(QAndroidCameraSession *cameraSess
connect(cameraSession, &QAndroidCameraSession::statusChanged, this,
[this](QCamera::Status status) {
if (status == QCamera::UnavailableStatus) {
- setState(QMediaEncoder::StoppedState);
- setStatus(QMediaEncoder::UnavailableStatus);
+ setState(QMediaRecorder::StoppedState);
+ setStatus(QMediaRecorder::UnavailableStatus);
return;
}
// Stop recording when stopping the camera.
if (status == QCamera::StoppingStatus) {
- setState(QMediaEncoder::StoppedState);
- setStatus(QMediaEncoder::StoppedStatus);
+ setState(QMediaRecorder::StoppedState);
+ setStatus(QMediaRecorder::StoppedStatus);
return;
}
});
connect(cameraSession, &QAndroidCameraSession::readyForCaptureChanged, this,
[this](bool ready) {
if (ready)
- setStatus(QMediaEncoder::StoppedStatus);
+ setStatus(QMediaRecorder::StoppedStatus);
});
} else {
// Audio-only recording.
- setStatus(QMediaEncoder::StoppedStatus);
+ setStatus(QMediaRecorder::StoppedStatus);
}
m_notifyTimer.setInterval(1000);
@@ -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
@@ -159,36 +159,36 @@ bool QAndroidCaptureSession::setOutputLocation(const QUrl &location)
return false;
}
-QMediaEncoder::State QAndroidCaptureSession::state() const
+QMediaRecorder::RecorderState QAndroidCaptureSession::state() const
{
return m_state;
}
-void QAndroidCaptureSession::setState(QMediaEncoder::State state)
+void QAndroidCaptureSession::setState(QMediaRecorder::RecorderState state)
{
if (m_state == state)
return;
switch (state) {
- case QMediaEncoder::StoppedState:
+ case QMediaRecorder::StoppedState:
stop();
break;
- case QMediaEncoder::RecordingState:
+ case QMediaRecorder::RecordingState:
start();
break;
- case QMediaEncoder::PausedState:
+ case QMediaRecorder::PausedState:
// Not supported by Android API
- qWarning("QMediaEncoder::PausedState is not supported on Android");
+ qWarning("QMediaRecorder::PausedState is not supported on Android");
break;
}
}
void QAndroidCaptureSession::start()
{
- if (m_state == QMediaEncoder::RecordingState || m_status != QMediaEncoder::StoppedStatus)
+ if (m_state == QMediaRecorder::RecordingState || m_status != QMediaRecorder::StoppedStatus)
return;
- setStatus(QMediaEncoder::StartingStatus);
+ setStatus(QMediaRecorder::StartingStatus);
if (m_mediaRecorder) {
m_mediaRecorder->release();
@@ -199,8 +199,8 @@ void QAndroidCaptureSession::start()
? m_cameraSession->requestRecordingPermission()
: qt_androidRequestRecordingPermission();
if (!granted) {
- setStatus(QMediaEncoder::UnavailableStatus);
- Q_EMIT error(QMediaEncoder::ResourceError, QLatin1String("Permission denied."));
+ setStatus(QMediaRecorder::UnavailableStatus);
+ Q_EMIT error(QMediaRecorder::ResourceError, QLatin1String("Permission denied."));
return;
}
@@ -268,14 +268,14 @@ void QAndroidCaptureSession::start()
}
if (!m_mediaRecorder->prepare()) {
- emit error(QMediaEncoder::FormatError, QLatin1String("Unable to prepare the media recorder."));
+ emit error(QMediaRecorder::FormatError, QLatin1String("Unable to prepare the media recorder."));
if (m_cameraSession)
restartViewfinder();
return;
}
if (!m_mediaRecorder->start()) {
- emit error(QMediaEncoder::FormatError, QLatin1String("Unable to start the media recorder."));
+ emit error(QMediaRecorder::FormatError, QLatin1String("Unable to start the media recorder."));
if (m_cameraSession)
restartViewfinder();
return;
@@ -293,17 +293,17 @@ void QAndroidCaptureSession::start()
m_cameraSession->camera()->setupPreviewFrameCallback();
}
- m_state = QMediaEncoder::RecordingState;
+ m_state = QMediaRecorder::RecordingState;
emit stateChanged(m_state);
- setStatus(QMediaEncoder::RecordingStatus);
+ setStatus(QMediaRecorder::RecordingStatus);
}
void QAndroidCaptureSession::stop(bool error)
{
- if (m_state == QMediaEncoder::StoppedState || m_mediaRecorder == 0)
+ if (m_state == QMediaRecorder::StoppedState || m_mediaRecorder == 0)
return;
- setStatus(QMediaEncoder::FinalizingStatus);
+ setStatus(QMediaRecorder::FinalizingStatus);
m_mediaRecorder->stop();
m_notifyTimer.stop();
@@ -332,12 +332,12 @@ void QAndroidCaptureSession::stop(bool error)
emit actualLocationChanged(m_actualOutputLocation);
}
- m_state = QMediaEncoder::StoppedState;
+ m_state = QMediaRecorder::StoppedState;
emit stateChanged(m_state);
- setStatus(QMediaEncoder::StoppedStatus);
+ setStatus(QMediaRecorder::StoppedStatus);
}
-void QAndroidCaptureSession::setStatus(QMediaEncoder::Status status)
+void QAndroidCaptureSession::setStatus(QMediaRecorder::Status status)
{
if (m_status == status)
return;
@@ -346,7 +346,7 @@ void QAndroidCaptureSession::setStatus(QMediaEncoder::Status status)
emit statusChanged(m_status);
}
-QMediaEncoder::Status QAndroidCaptureSession::status() const
+QMediaRecorder::Status QAndroidCaptureSession::status() const
{
return m_status;
}
@@ -537,7 +537,7 @@ void QAndroidCaptureSession::onError(int what, int extra)
Q_UNUSED(what);
Q_UNUSED(extra);
stop(true);
- emit error(QMediaEncoder::ResourceError, QLatin1String("Unknown error."));
+ emit error(QMediaRecorder::ResourceError, QLatin1String("Unknown error."));
}
void QAndroidCaptureSession::onInfo(int what, int extra)
@@ -545,12 +545,12 @@ void QAndroidCaptureSession::onInfo(int what, int extra)
Q_UNUSED(extra);
if (what == 800) {
// MEDIA_RECORDER_INFO_MAX_DURATION_REACHED
- setState(QMediaEncoder::StoppedState);
- emit error(QMediaEncoder::OutOfSpaceError, QLatin1String("Maximum duration reached."));
+ setState(QMediaRecorder::StoppedState);
+ emit error(QMediaRecorder::OutOfSpaceError, QLatin1String("Maximum duration reached."));
} else if (what == 801) {
// MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED
- setState(QMediaEncoder::StoppedState);
- emit error(QMediaEncoder::OutOfSpaceError, QLatin1String("Maximum file size reached."));
+ setState(QMediaRecorder::StoppedState);
+ emit error(QMediaRecorder::OutOfSpaceError, QLatin1String("Maximum file size reached."));
}
}
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h b/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h
index 4bb0c06f7..43f26969b 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h
@@ -52,7 +52,7 @@
//
#include <qobject.h>
-#include <qmediaencoder.h>
+#include <qmediarecorder.h>
#include <qurl.h>
#include <qelapsedtimer.h>
#include <qtimer.h>
@@ -62,6 +62,7 @@
QT_BEGIN_NAMESPACE
+class QAudioInput;
class QAndroidCameraSession;
class QAndroidCaptureSession : public QObject
@@ -74,16 +75,15 @@ 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);
- QMediaEncoder::State state() const;
- void setState(QMediaEncoder::State state);
+ QMediaRecorder::RecorderState state() const;
+ void setState(QMediaRecorder::RecorderState state);
- QMediaEncoder::Status status() const;
+ QMediaRecorder::Status status() const;
qint64 duration() const;
@@ -94,11 +94,11 @@ public:
void applySettings();
- void stateChanged(QMediaEncoder::State state) {
+ void stateChanged(QMediaRecorder::RecorderState state) {
if (m_mediaEncoder)
m_mediaEncoder->stateChanged(state);
}
- void statusChanged(QMediaEncoder::Status status)
+ void statusChanged(QMediaRecorder::Status status)
{
if (m_mediaEncoder)
m_mediaEncoder->statusChanged(status);
@@ -116,12 +116,9 @@ public:
void error(int error, const QString &errorString)
{
if (m_mediaEncoder)
- m_mediaEncoder->error(QMediaEncoder::Error(error), errorString);
+ m_mediaEncoder->error(QMediaRecorder::Error(error), errorString);
}
-Q_SIGNALS:
- void audioInputChanged(const QString& name);
-
private Q_SLOTS:
void updateDuration();
void onCameraOpened();
@@ -166,7 +163,7 @@ private:
void start();
void stop(bool error = false);
- void setStatus(QMediaEncoder::Status status);
+ void setStatus(QMediaRecorder::Status status);
void updateResolution();
void restartViewfinder();
@@ -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;
@@ -184,8 +181,8 @@ private:
QTimer m_notifyTimer;
qint64 m_duration;
- QMediaEncoder::State m_state;
- QMediaEncoder::Status m_status;
+ QMediaRecorder::RecorderState m_state;
+ QMediaRecorder::Status m_status;
QUrl m_requestedOutputLocation;
QUrl m_usedOutputLocation;
QUrl m_actualOutputLocation;
diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp
index eb620a0d9..5b51d9281 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp
@@ -44,7 +44,7 @@
QT_BEGIN_NAMESPACE
-QAndroidMediaEncoder::QAndroidMediaEncoder(QMediaEncoder *parent)
+QAndroidMediaEncoder::QAndroidMediaEncoder(QMediaRecorder *parent)
: QPlatformMediaEncoder(parent)
{
}
@@ -59,12 +59,12 @@ bool QAndroidMediaEncoder::setOutputLocation(const QUrl &location)
return m_session->setOutputLocation(location);
}
-QMediaEncoder::State QAndroidMediaEncoder::state() const
+QMediaRecorder::RecorderState QAndroidMediaEncoder::state() const
{
return m_session->state();
}
-QMediaEncoder::Status QAndroidMediaEncoder::status() const
+QMediaRecorder::Status QAndroidMediaEncoder::status() const
{
return m_session->status();
}
@@ -79,7 +79,7 @@ void QAndroidMediaEncoder::applySettings()
m_session->applySettings();
}
-void QAndroidMediaEncoder::setState(QMediaEncoder::State state)
+void QAndroidMediaEncoder::setState(QMediaRecorder::RecorderState state)
{
m_session->setState(state);
}
@@ -96,7 +96,7 @@ void QAndroidMediaEncoder::setCaptureSession(QPlatformMediaCaptureSession *sessi
return;
if (m_service)
- setState(QMediaEncoder::StoppedState);
+ setState(QMediaRecorder::StoppedState);
if (m_session)
m_session->setMediaEncoder(nullptr);
diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h
index 35c6c0749..237f1a5b4 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h
@@ -62,12 +62,12 @@ class QAndroidCaptureService;
class QAndroidMediaEncoder : public QPlatformMediaEncoder
{
public:
- explicit QAndroidMediaEncoder(QMediaEncoder *parent);
+ explicit QAndroidMediaEncoder(QMediaRecorder *parent);
QUrl outputLocation() const override;
bool setOutputLocation(const QUrl &location) override;
- QMediaEncoder::State state() const override;
- QMediaEncoder::Status status() const override;
+ QMediaRecorder::RecorderState state() const override;
+ QMediaRecorder::Status status() const override;
qint64 duration() const override;
void applySettings() override;
@@ -75,7 +75,7 @@ public:
void setCaptureSession(QPlatformMediaCaptureSession *session);
- void setState(QMediaEncoder::State state) override;
+ void setState(QMediaRecorder::RecorderState state) override;
private:
friend class QAndroidCaptureSession;
diff --git a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol.cpp b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol.cpp
index 4794dd3e0..85b4e3df4 100644
--- a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol.cpp
+++ b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol.cpp
@@ -42,6 +42,8 @@
#include "qandroidvideooutput_p.h"
#include "qandroidmetadata_p.h"
#include "qandroidmediaplayervideorenderercontrol_p.h"
+#include "qandroidaudiooutput_p.h"
+#include "qaudiooutput.h"
QT_BEGIN_NAMESPACE
@@ -184,12 +186,7 @@ void QAndroidMediaPlayerControl::setPosition(qint64 position)
Q_EMIT positionChanged(seekPosition);
}
-int QAndroidMediaPlayerControl::volume() const
-{
- return (mPendingVolume == -1) ? mMediaPlayer->volume() : mPendingVolume;
-}
-
-void QAndroidMediaPlayerControl::setVolume(int volume)
+void QAndroidMediaPlayerControl::setVolume(float volume)
{
if ((mState & (AndroidMediaPlayer::Idle
| AndroidMediaPlayer::Initialized
@@ -198,26 +195,12 @@ void QAndroidMediaPlayerControl::setVolume(int volume)
| AndroidMediaPlayer::Started
| AndroidMediaPlayer::Paused
| AndroidMediaPlayer::PlaybackCompleted)) == 0) {
- if (mPendingVolume != volume) {
- mPendingVolume = volume;
- Q_EMIT volumeChanged(volume);
- }
- return;
- }
-
- mMediaPlayer->setVolume(volume);
-
- if (mPendingVolume != -1) {
- mPendingVolume = -1;
+ mPendingVolume = volume;
return;
}
- Q_EMIT volumeChanged(volume);
-}
-
-bool QAndroidMediaPlayerControl::isMuted() const
-{
- return (mPendingMute == -1) ? mMediaPlayer->isMuted() : (mPendingMute == 1);
+ mMediaPlayer->setVolume(qRound(volume*100.));
+ mPendingVolume = -1;
}
void QAndroidMediaPlayerControl::setMuted(bool muted)
@@ -229,21 +212,12 @@ void QAndroidMediaPlayerControl::setMuted(bool muted)
| AndroidMediaPlayer::Started
| AndroidMediaPlayer::Paused
| AndroidMediaPlayer::PlaybackCompleted)) == 0) {
- if (mPendingMute != muted) {
- mPendingMute = muted;
- Q_EMIT mutedChanged(muted);
- }
+ mPendingMute = muted;
return;
}
mMediaPlayer->setMuted(muted);
-
- if (mPendingMute != -1) {
- mPendingMute = -1;
- return;
- }
-
- Q_EMIT mutedChanged(muted);
+ mPendingMute = -1;
}
void QAndroidMediaPlayerControl::setAudioRole(QAudio::Role role)
@@ -251,20 +225,6 @@ void QAndroidMediaPlayerControl::setAudioRole(QAudio::Role role)
mMediaPlayer->setAudioRole(role);
}
-QList<QAudio::Role> QAndroidMediaPlayerControl::supportedAudioRoles() const
-{
- return QList<QAudio::Role>()
- << QAudio::VoiceCommunicationRole
- << QAudio::MusicRole
- << QAudio::VideoRole
- << QAudio::SonificationRole
- << QAudio::AlarmRole
- << QAudio::NotificationRole
- << QAudio::RingtoneRole
- << QAudio::AccessibilityRole
- << QAudio::GameRole;
-}
-
QMediaMetaData QAndroidMediaPlayerControl::metaData() const
{
return QAndroidMetaData::extractMetadata(mMediaContent);
@@ -429,6 +389,21 @@ void QAndroidMediaPlayerControl::setVideoSink(QVideoSink *sink)
mVideoRendererControl->setSurface(sink);
}
+void QAndroidMediaPlayerControl::setAudioOutput(QPlatformAudioOutput *output)
+{
+ if (m_audioOutput == output)
+ return;
+ if (m_audioOutput)
+ m_audioOutput->q->disconnect(this);
+ m_audioOutput = static_cast<QAndroidAudioOutput *>(output);
+ if (m_audioOutput) {
+ // #### Implement device changes: connect(m_audioOutput->q, &QAudioOutput::deviceChanged, this, XXXX);
+ connect(m_audioOutput->q, &QAudioOutput::volumeChanged, this, &QAndroidMediaPlayerControl::setVolume);
+ connect(m_audioOutput->q, &QAudioOutput::mutedChanged, this, &QAndroidMediaPlayerControl::setMuted);
+ connect(m_audioOutput->q, &QAudioOutput::audioRoleChanged, this, &QAndroidMediaPlayerControl::setAudioRole);
+ }
+}
+
void QAndroidMediaPlayerControl::play()
{
StateChangeNotifier notifier(this);
@@ -772,7 +747,7 @@ void QAndroidMediaPlayerControl::flushPendingStates()
if (mPendingPosition != -1)
setPosition(mPendingPosition);
- if (mPendingVolume != -1)
+ if (mPendingVolume >= 0)
setVolume(mPendingVolume);
if (mPendingMute != -1)
setMuted((mPendingMute == 1));
diff --git a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol_p.h b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol_p.h
index d1db4fd58..3bbc20260 100644
--- a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol_p.h
+++ b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayercontrol_p.h
@@ -61,6 +61,7 @@ QT_BEGIN_NAMESPACE
class AndroidMediaPlayer;
class QAndroidVideoOutput;
class QAndroidMediaPlayerVideoRendererControl;
+class QAndroidAudioOutput;
class QAndroidMediaPlayerControl : public QObject, public QPlatformMediaPlayer
{
@@ -72,8 +73,6 @@ public:
QMediaPlayer::PlaybackState state() const override;
qint64 duration() const override;
qint64 position() const override;
- int volume() const override;
- bool isMuted() const override;
float bufferProgress() const override;
bool isAudioAvailable() const override;
bool isVideoAvailable() const override;
@@ -85,22 +84,22 @@ public:
const QIODevice *mediaStream() const override;
void setMedia(const QUrl &mediaContent, QIODevice *stream) override;
- void setAudioRole(QAudio::Role role) override;
- QList<QAudio::Role> supportedAudioRoles() const override;
-
QMediaMetaData metaData() const override;
void setVideoOutput(QAndroidVideoOutput *videoOutput);
void setVideoSink(QVideoSink *surface) override;
+ void setAudioOutput(QPlatformAudioOutput *output) override;
+
void setPosition(qint64 position) override;
void play() override;
void pause() override;
void stop() override;
- void setVolume(int volume) override;
- void setMuted(bool muted) override;
private Q_SLOTS:
+ void setVolume(float volume);
+ void setMuted(bool muted);
+ void setAudioRole(QAudio::Role role);
void onVideoOutputReady(bool ready);
void onError(qint32 what, qint32 extra);
void onInfo(qint32 what, qint32 extra);
@@ -111,6 +110,7 @@ private Q_SLOTS:
private:
AndroidMediaPlayer *mMediaPlayer;
QAndroidMediaPlayerVideoRendererControl *mVideoRendererControl = nullptr;
+ QAndroidAudioOutput *m_audioOutput = nullptr;
QMediaPlayer::PlaybackState mCurrentState;
QUrl mMediaContent;
QIODevice *mMediaStream;
@@ -127,7 +127,7 @@ private:
int mPendingState;
qint64 mPendingPosition;
bool mPendingSetMedia;
- int mPendingVolume;
+ float mPendingVolume;
int mPendingMute;
bool mReloadingMedia;
int mActiveStateChangeNotifiers;
diff --git a/src/multimedia/platform/android/qandroidformatsinfo.cpp b/src/multimedia/platform/android/qandroidformatsinfo.cpp
index c0cf72149..4d31cc15d 100644
--- a/src/multimedia/platform/android/qandroidformatsinfo.cpp
+++ b/src/multimedia/platform/android/qandroidformatsinfo.cpp
@@ -53,7 +53,7 @@ QAndroidFormatInfo::QAndroidFormatInfo()
};
encoders = decoders;
- imageFormats << QImageEncoderSettings::JPEG;
+ imageFormats << QCameraImageCapture::JPEG;
}
QAndroidFormatInfo::~QAndroidFormatInfo()
diff --git a/src/multimedia/platform/android/qandroidintegration.cpp b/src/multimedia/platform/android/qandroidintegration.cpp
index d7fe2b3bc..1a8a10a43 100644
--- a/src/multimedia/platform/android/qandroidintegration.cpp
+++ b/src/multimedia/platform/android/qandroidintegration.cpp
@@ -52,6 +52,7 @@
#include "private/androidmediarecorder_p.h"
#include "private/qandroidformatsinfo_p.h"
#include "private/qandroidmediaplayercontrol_p.h"
+#include "private/qandroidaudiooutput_p.h"
QT_BEGIN_NAMESPACE
@@ -98,7 +99,7 @@ QPlatformCamera *QAndroidIntegration::createCamera(QCamera *camera)
return new QAndroidCameraControl(camera);
}
-QPlatformMediaEncoder *QAndroidIntegration::createEncoder(QMediaEncoder *encoder)
+QPlatformMediaEncoder *QAndroidIntegration::createEncoder(QMediaRecorder *encoder)
{
return new QAndroidMediaEncoder(encoder);
}
@@ -108,6 +109,11 @@ QPlatformCameraImageCapture *QAndroidIntegration::createImageCapture(QCameraImag
return new QAndroidCameraImageCaptureControl(imageCapture);
}
+QPlatformAudioOutput *QAndroidIntegration::createAudioOutput(QAudioOutput *q)
+{
+ return new QAndroidAudioOutput(q);
+}
+
Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/)
{
static bool initialized = false;
diff --git a/src/multimedia/platform/android/qandroidintegration_p.h b/src/multimedia/platform/android/qandroidintegration_p.h
index bab5e6529..6df40672c 100644
--- a/src/multimedia/platform/android/qandroidintegration_p.h
+++ b/src/multimedia/platform/android/qandroidintegration_p.h
@@ -69,9 +69,11 @@ public:
QPlatformMediaCaptureSession *createCaptureSession() override;
QPlatformMediaPlayer *createPlayer(QMediaPlayer *player) override;
QPlatformCamera *createCamera(QCamera *camera) override;
- QPlatformMediaEncoder *createEncoder(QMediaEncoder *encoder) override;
+ QPlatformMediaEncoder *createEncoder(QMediaRecorder *encoder) override;
QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *imageCapture) override;
+ QPlatformAudioOutput *createAudioOutput(QAudioOutput *q) override;
+
QAndroidMediaDevices *m_devices = nullptr;
QPlatformMediaFormatInfo *m_formatInfo = nullptr;
};
diff --git a/src/multimedia/platform/android/qandroidmediadevices.cpp b/src/multimedia/platform/android/qandroidmediadevices.cpp
index a0cfee354..9b888f700 100644
--- a/src/multimedia/platform/android/qandroidmediadevices.cpp
+++ b/src/multimedia/platform/android/qandroidmediadevices.cpp
@@ -57,12 +57,12 @@ QAndroidMediaDevices::QAndroidMediaDevices()
QList<QAudioDevice> QAndroidMediaDevices::audioInputs() const
{
- return QOpenSLESEngine::availableDevices(QAudio::AudioInput);
+ return QOpenSLESEngine::availableDevices(QAudioDevice::Input);
}
QList<QAudioDevice> QAndroidMediaDevices::audioOutputs() const
{
- return QOpenSLESEngine::availableDevices(QAudio::AudioOutput);
+ return QOpenSLESEngine::availableDevices(QAudioDevice::Output);
}
QList<QCameraDevice> QAndroidMediaDevices::videoInputs() const
diff --git a/src/multimedia/platform/android/qandroidmediadevices_p.h b/src/multimedia/platform/android/qandroidmediadevices_p.h
index d262308dd..734678aad 100644
--- a/src/multimedia/platform/android/qandroidmediadevices_p.h
+++ b/src/multimedia/platform/android/qandroidmediadevices_p.h
@@ -54,8 +54,6 @@
#include <private/qplatformmediadevices_p.h>
#include <qaudio.h>
-#include <QtCore/private/qjni_p.h>
-
QT_BEGIN_NAMESPACE
class QAndroidMediaDevices : public QPlatformMediaDevices
diff --git a/src/multimedia/platform/android/wrappers/jni/androidcamera_p.h b/src/multimedia/platform/android/wrappers/jni/androidcamera_p.h
index b390f3aba..46f3dd3ac 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidcamera_p.h
+++ b/src/multimedia/platform/android/wrappers/jni/androidcamera_p.h
@@ -70,13 +70,12 @@ class AndroidSurfaceHolder;
class AndroidCamera : public QObject
{
Q_OBJECT
- Q_ENUMS(CameraFacing)
- Q_ENUMS(ImageFormat)
public:
enum CameraFacing {
CameraFacingBack = 0,
CameraFacingFront = 1
};
+ Q_ENUM(CameraFacing)
enum ImageFormat { // same values as in android.graphics.ImageFormat Java class
UnknownImageFormat = 0,
@@ -87,6 +86,7 @@ public:
JPEG = 256,
YV12 = 842094169
};
+ Q_ENUM(ImageFormat)
// http://developer.android.com/reference/android/hardware/Camera.Parameters.html#getSupportedPreviewFpsRange%28%29
// "The values are multiplied by 1000 and represented in integers"
diff --git a/src/multimedia/platform/android/wrappers/jni/androidsurfaceview.cpp b/src/multimedia/platform/android/wrappers/jni/androidsurfaceview.cpp
index 80527373b..d3c95f553 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidsurfaceview.cpp
+++ b/src/multimedia/platform/android/wrappers/jni/androidsurfaceview.cpp
@@ -39,7 +39,6 @@
#include "androidsurfaceview_p.h"
-#include <QtCore/private/qjnihelpers_p.h>
#include <QtCore/qcoreapplication.h>
#include <QtCore/qdebug.h>
#include <QtCore/qlist.h>
@@ -129,11 +128,11 @@ AndroidSurfaceView::AndroidSurfaceView()
, m_surfaceHolder(0)
, m_pendingVisible(-1)
{
- QtAndroidPrivate::runOnAndroidThreadSync([this] {
+ QNativeInterface::QAndroidApplication::runOnAndroidMainThread([this] {
m_surfaceView = QJniObject("android/view/SurfaceView",
- "(Landroid/content/Context;)V",
- QNativeInterface::QAndroidApplication::context());
- }, QJniEnvironment().jniEnv());
+ "(Landroid/content/Context;)V",
+ QNativeInterface::QAndroidApplication::context());
+ }).waitForFinished();
Q_ASSERT(m_surfaceView.isValid());
diff --git a/src/multimedia/platform/darwin/audio/avfaudiodecoder.mm b/src/multimedia/platform/darwin/audio/avfaudiodecoder.mm
new file mode 100644
index 000000000..2ff872212
--- /dev/null
+++ b/src/multimedia/platform/darwin/audio/avfaudiodecoder.mm
@@ -0,0 +1,536 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "avfaudiodecoder_p.h"
+
+#include <QtCore/qmutex.h>
+#include <QtCore/qiodevice.h>
+#include <QMimeDatabase>
+#include "qcoreaudioutils_p.h"
+
+#include <AVFoundation/AVFoundation.h>
+
+#define MAX_BUFFERS_IN_QUEUE 6
+
+QT_USE_NAMESPACE
+
+@interface AVFResourceReaderDelegate : NSObject <AVAssetResourceLoaderDelegate>
+{
+ AVFAudioDecoder *m_decoder;
+ QMutex m_mutex;
+}
+
+-(void)handleNextSampleBuffer:(CMSampleBufferRef)sampleBuffer;
+
+-(BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader
+ shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest;
+
+@end
+
+@implementation AVFResourceReaderDelegate
+
+-(id)initWithDecoder: (AVFAudioDecoder *)decoder {
+ if (!(self = [super init]))
+ return nil;
+
+ m_decoder = decoder;
+
+ return self;
+}
+
+-(void)dealloc {
+ m_decoder = nil;
+ [super dealloc];
+}
+
+-(void)handleNextSampleBuffer:(CMSampleBufferRef)sampleBuffer
+{
+ if (!sampleBuffer)
+ return;
+
+ // Check format
+ CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);
+ if (!formatDescription)
+ return;
+ const AudioStreamBasicDescription* const asbd = CMAudioFormatDescriptionGetStreamBasicDescription(formatDescription);
+ QAudioFormat qtFormat = CoreAudioUtils::toQAudioFormat(*asbd);
+ if (!qtFormat.isValid() || qtFormat != m_decoder->audioFormat())
+ return;
+
+ // Get the required size to allocate to audioBufferList
+ size_t audioBufferListSize = 0;
+ OSStatus err = CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer,
+ &audioBufferListSize,
+ NULL,
+ 0,
+ NULL,
+ NULL,
+ kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
+ NULL);
+ if (err != noErr)
+ return;
+
+ CMBlockBufferRef blockBuffer = NULL;
+ AudioBufferList* audioBufferList = (AudioBufferList*) malloc(audioBufferListSize);
+ // This ensures the buffers placed in audioBufferList are contiguous
+ err = CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer,
+ NULL,
+ audioBufferList,
+ audioBufferListSize,
+ NULL,
+ NULL,
+ kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
+ &blockBuffer);
+ if (err != noErr) {
+ free(audioBufferList);
+ return;
+ }
+
+ QByteArray abuf;
+ for (UInt32 i = 0; i < audioBufferList->mNumberBuffers; i++)
+ {
+ AudioBuffer audioBuffer = audioBufferList->mBuffers[i];
+ abuf.push_back(QByteArray((const char*)audioBuffer.mData, audioBuffer.mDataByteSize));
+ }
+
+ free(audioBufferList);
+ CFRelease(blockBuffer);
+
+ CMTime sampleStartTime = (CMSampleBufferGetPresentationTimeStamp(sampleBuffer));
+ float sampleStartTimeSecs = CMTimeGetSeconds(sampleStartTime);
+
+ QAudioBuffer audioBuffer;
+ audioBuffer = QAudioBuffer(abuf, qtFormat, qint64(sampleStartTimeSecs * 1000000));
+ if (!audioBuffer.isValid())
+ return;
+
+ emit m_decoder->newAudioBuffer(audioBuffer);
+}
+
+-(BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader
+ shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
+{
+ Q_UNUSED(resourceLoader);
+
+ if (![loadingRequest.request.URL.scheme isEqualToString:@"iodevice"])
+ return NO;
+
+ QMutexLocker locker(&m_mutex);
+
+ QIODevice *device = m_decoder->sourceDevice();
+ if (!device)
+ return NO;
+
+ device->seek(loadingRequest.dataRequest.requestedOffset);
+ if (loadingRequest.contentInformationRequest) {
+ loadingRequest.contentInformationRequest.contentLength = device->size();
+ loadingRequest.contentInformationRequest.byteRangeAccessSupported = YES;
+ }
+
+ if (loadingRequest.dataRequest) {
+ NSInteger requestedLength = loadingRequest.dataRequest.requestedLength;
+ int maxBytes = qMin(32 * 1024, int(requestedLength));
+ char buffer[maxBytes];
+ NSInteger submitted = 0;
+ while (submitted < requestedLength) {
+ qint64 len = device->read(buffer, maxBytes);
+ if (len < 1)
+ break;
+
+ [loadingRequest.dataRequest respondWithData:[NSData dataWithBytes:buffer length:len]];
+ submitted += len;
+ }
+
+ // Finish loading even if not all bytes submitted.
+ [loadingRequest finishLoading];
+ }
+
+ return YES;
+}
+
+@end
+
+namespace {
+
+NSDictionary *av_audio_settings_for_format(const QAudioFormat &format)
+{
+ float sampleRate = format.sampleRate();
+ int nChannels = format.channelCount();
+ int sampleSize = format.bytesPerSample() * 8;
+ BOOL isFloat = format.sampleFormat() == QAudioFormat::Float;
+
+ NSDictionary *audioSettings = [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,
+ [NSNumber numberWithFloat:sampleRate], AVSampleRateKey,
+ [NSNumber numberWithInt:nChannels], AVNumberOfChannelsKey,
+ [NSNumber numberWithInt:sampleSize], AVLinearPCMBitDepthKey,
+ [NSNumber numberWithBool:isFloat], AVLinearPCMIsFloatKey,
+ [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,
+ [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey,
+ nil];
+
+ return audioSettings;
+}
+
+QAudioFormat qt_format_for_audio_track(AVAssetTrack *track)
+{
+ QAudioFormat format;
+ CMFormatDescriptionRef desc = (__bridge CMFormatDescriptionRef)track.formatDescriptions[0];
+ const AudioStreamBasicDescription* const asbd =
+ CMAudioFormatDescriptionGetStreamBasicDescription(desc);
+ format = CoreAudioUtils::toQAudioFormat(*asbd);
+ return format;
+}
+
+}
+
+AVFAudioDecoder::AVFAudioDecoder(QAudioDecoder *parent)
+ : QPlatformAudioDecoder(parent)
+{
+ m_readingQueue = dispatch_queue_create("reader_queue", DISPATCH_QUEUE_SERIAL);
+ m_decodingQueue = dispatch_queue_create("decoder_queue", DISPATCH_QUEUE_SERIAL);
+
+ m_readerDelegate = [[AVFResourceReaderDelegate alloc] initWithDecoder:this];
+
+ connect(this, &AVFAudioDecoder::readyToRead, this, &AVFAudioDecoder::startReading);
+ connect(this, &AVFAudioDecoder::newAudioBuffer, this, &AVFAudioDecoder::handleNewAudioBuffer);
+}
+
+AVFAudioDecoder::~AVFAudioDecoder()
+{
+ stop();
+
+ [m_readerOutput release];
+ m_readerOutput = nil;
+
+ [m_reader release];
+ m_reader = nil;
+
+ [m_readerDelegate release];
+ m_readerDelegate = nil;
+
+ [m_asset release];
+ m_asset = nil;
+
+ if (m_readingQueue)
+ dispatch_release(m_readingQueue);
+ if (m_decodingQueue)
+ dispatch_release(m_decodingQueue);
+}
+
+QUrl AVFAudioDecoder::source() const
+{
+ return m_source;
+}
+
+void AVFAudioDecoder::setSource(const QUrl &fileName)
+{
+ if (!m_device && m_source == fileName)
+ return;
+
+ stop();
+ m_device = nullptr;
+ [m_asset release];
+ m_asset = nil;
+
+ m_source = fileName;
+
+ if (!m_source.isEmpty()) {
+ NSURL *nsURL = m_source.toNSURL();
+ m_asset = [[AVURLAsset alloc] initWithURL:nsURL options:nil];
+ }
+
+ emit sourceChanged();
+}
+
+QIODevice *AVFAudioDecoder::sourceDevice() const
+{
+ return m_device;
+}
+
+void AVFAudioDecoder::setSourceDevice(QIODevice *device)
+{
+ if (m_device == device && m_source.isEmpty())
+ return;
+
+ stop();
+ m_source.clear();
+ [m_asset release];
+ m_asset = nil;
+
+ m_device = device;
+
+ if (m_device) {
+ const QString ext = QMimeDatabase().mimeTypeForData(m_device).preferredSuffix();
+ const QString url = "iodevice:///iodevice." + ext;
+ NSString *urlString = url.toNSString();
+ NSURL *nsURL = [NSURL URLWithString:urlString];
+
+ m_asset = [[AVURLAsset alloc] initWithURL:nsURL options:nil];
+ [m_asset.resourceLoader setDelegate:m_readerDelegate queue:m_readingQueue];
+
+ m_loadingSource = true;
+ }
+
+ emit sourceChanged();
+}
+
+void AVFAudioDecoder::start()
+{
+ Q_ASSERT(!m_buffersAvailable);
+ if (m_state != QAudioDecoder::StoppedState)
+ return;
+
+ if (m_position != -1) {
+ m_position = -1;
+ emit positionChanged(-1);
+ }
+
+ if (m_device && (!m_device->isOpen() || !m_device->isReadable())) {
+ processInvalidMedia(QAudioDecoder::AccessDeniedError, tr("Unable to read from specified device"));
+ return;
+ }
+
+ [m_asset loadValuesAsynchronouslyForKeys:@[@"tracks"] completionHandler:
+ ^{
+ dispatch_async(m_readingQueue,
+ ^{
+ NSError *error = nil;
+ AVKeyValueStatus status = [m_asset statusOfValueForKey:@"tracks" error:&error];
+ if (status != AVKeyValueStatusLoaded) {
+ if (status == AVKeyValueStatusFailed) {
+ if (error.domain == NSURLErrorDomain)
+ processInvalidMedia(QAudioDecoder::ResourceError, QString::fromNSString(error.localizedDescription));
+ else
+ processInvalidMedia(QAudioDecoder::FormatError, tr("Could not load media source's tracks"));
+ }
+ return;
+ }
+ initAssetReader();
+ });
+ }
+ ];
+
+ if (m_device && m_loadingSource) {
+ m_state = QAudioDecoder::DecodingState;
+ emit stateChanged(m_state);
+ return;
+ }
+}
+
+void AVFAudioDecoder::stop()
+{
+ QAudioDecoder::State oldState = m_state;
+ m_state = QAudioDecoder::StoppedState;
+ if (m_asset)
+ [m_asset cancelLoading];
+ if (m_reader)
+ [m_reader cancelReading];
+
+ if (m_buffersAvailable != 0) {
+ m_buffersAvailable = 0;
+ emit bufferAvailableChanged(false);
+ }
+ if (m_position != -1) {
+ m_position = -1;
+ emit positionChanged(m_position);
+ }
+ if (m_duration != -1) {
+ m_duration = -1;
+ emit durationChanged(m_duration);
+ }
+ if (m_state != oldState)
+ emit stateChanged(m_state);
+}
+
+QAudioFormat AVFAudioDecoder::audioFormat() const
+{
+ return m_format;
+}
+
+void AVFAudioDecoder::setAudioFormat(const QAudioFormat &format)
+{
+ if (m_format != format) {
+ m_format = format;
+ emit formatChanged(m_format);
+ }
+}
+
+QAudioBuffer AVFAudioDecoder::read()
+{
+ if (!m_buffersAvailable)
+ return QAudioBuffer();
+
+ Q_ASSERT(m_cachedBuffers.size() > 0);
+ QAudioBuffer buffer = m_cachedBuffers.takeFirst();
+
+ m_position = qint64(buffer.startTime() / 1000);
+ emit positionChanged(m_position);
+
+ m_buffersAvailable--;
+ if (!m_buffersAvailable)
+ emit bufferAvailableChanged(false);
+ return buffer;
+}
+
+bool AVFAudioDecoder::bufferAvailable() const
+{
+ return m_buffersAvailable > 0;
+}
+
+qint64 AVFAudioDecoder::position() const
+{
+ return m_position;
+}
+
+qint64 AVFAudioDecoder::duration() const
+{
+ return m_duration;
+}
+
+void AVFAudioDecoder::processInvalidMedia(QAudioDecoder::Error errorCode, const QString& errorString)
+{
+ stop();
+ emit error(int(errorCode), errorString);
+}
+
+void AVFAudioDecoder::initAssetReader()
+{
+ if (!m_asset)
+ return;
+
+ NSArray<AVAssetTrack *> *tracks = [m_asset tracksWithMediaType:AVMediaTypeAudio];
+ if (!tracks.count) {
+ processInvalidMedia(QAudioDecoder::FormatError, tr("No audio tracks found"));
+ return;
+ }
+ AVAssetTrack *track = [tracks objectAtIndex:0];
+
+ // Set format
+ QAudioFormat format;
+ if (m_format.isValid()) {
+ format = m_format;
+ } else {
+ format = qt_format_for_audio_track(track);
+ if (!format.isValid())
+ {
+ processInvalidMedia(QAudioDecoder::FormatError, tr("Unsupported source format"));
+ return;
+ }
+ // ### Change QAudioDecoder's format to resolved one?
+ m_format = format;
+ emit formatChanged(m_format);
+ }
+
+ // Set duration
+ qint64 duration = CMTimeGetSeconds(track.timeRange.duration) * 1000;
+ if (m_duration != duration) {
+ m_duration = duration;
+ emit durationChanged(m_duration);
+ }
+
+ // Initialize asset reader and output
+ [m_reader release];
+ m_reader = nil;
+ [m_readerOutput release];
+ m_readerOutput = nil;
+
+ NSError *error = nil;
+ NSDictionary *audioSettings = av_audio_settings_for_format(format);
+ m_readerOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:track outputSettings:audioSettings];
+ m_reader = [[AVAssetReader alloc] initWithAsset:m_asset error:&error];
+ if (error) {
+ processInvalidMedia(QAudioDecoder::ResourceError, QString::fromNSString(error.localizedDescription));
+ return;
+ }
+ if (![m_reader canAddOutput:m_readerOutput]) {
+ processInvalidMedia(QAudioDecoder::ResourceError, tr("Failed to add asset reader output"));
+ return;
+ }
+ [m_reader addOutput:m_readerOutput];
+
+ emit readyToRead();
+}
+
+void AVFAudioDecoder::startReading()
+{
+ m_loadingSource = false;
+
+ // Prepares the receiver for obtaining sample buffers from the asset.
+ if (!m_reader || ![m_reader startReading]) {
+ processInvalidMedia(QAudioDecoder::ResourceError, tr("Could not start reading"));
+ return;
+ }
+
+ QAudioDecoder::State oldState = m_state;
+ m_state = QAudioDecoder::DecodingState;
+ if (oldState != m_state)
+ emit stateChanged(m_state);
+
+ // Since copyNextSampleBuffer is synchronous, submit it to an async dispatch queue
+ // to run in a separate thread. Call the handleNextSampleBuffer "callback" on another
+ // thread when new audio sample is read.
+ dispatch_async(m_readingQueue, ^{
+ CMSampleBufferRef sampleBuffer;
+ while ((sampleBuffer = [m_readerOutput copyNextSampleBuffer])) {
+ dispatch_async(m_decodingQueue, ^{
+ if (CMSampleBufferDataIsReady(sampleBuffer))
+ [m_readerDelegate handleNextSampleBuffer:sampleBuffer];
+ CFRelease(sampleBuffer);
+ });
+ }
+ if (m_reader.status == AVAssetReaderStatusCompleted) {
+ m_state = QAudioDecoder::StoppedState;
+ emit finished();
+ emit stateChanged(m_state);
+ }
+ });
+}
+
+void AVFAudioDecoder::handleNewAudioBuffer(QAudioBuffer buffer)
+{
+ Q_ASSERT(m_cachedBuffers.size() <= MAX_BUFFERS_IN_QUEUE);
+ m_cachedBuffers.push_back(buffer);
+
+ m_buffersAvailable++;
+ Q_ASSERT(m_buffersAvailable <= MAX_BUFFERS_IN_QUEUE);
+
+ emit bufferAvailableChanged(true);
+ emit bufferReady();
+}
diff --git a/src/multimedia/platform/darwin/audio/avfaudiodecoder_p.h b/src/multimedia/platform/darwin/audio/avfaudiodecoder_p.h
new file mode 100644
index 000000000..9f302cc39
--- /dev/null
+++ b/src/multimedia/platform/darwin/audio/avfaudiodecoder_p.h
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef AVFAUDIODECODER_H
+#define AVFAUDIODECODER_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtMultimedia/private/qtmultimediaglobal_p.h>
+#include <QObject>
+#include <QtCore/qurl.h>
+
+#include "private/qplatformaudiodecoder_p.h"
+#include "qaudiodecoder.h"
+
+#include <dispatch/dispatch.h>
+
+Q_FORWARD_DECLARE_OBJC_CLASS(AVURLAsset);
+Q_FORWARD_DECLARE_OBJC_CLASS(AVAssetReader);
+Q_FORWARD_DECLARE_OBJC_CLASS(AVAssetReaderTrackOutput);
+Q_FORWARD_DECLARE_OBJC_CLASS(AVFResourceReaderDelegate);
+
+QT_BEGIN_NAMESPACE
+
+class AVFAudioDecoder : public QPlatformAudioDecoder
+{
+ Q_OBJECT
+
+public:
+ AVFAudioDecoder(QAudioDecoder *parent);
+ virtual ~AVFAudioDecoder();
+
+ // QAudioDecoder interface
+ QAudioDecoder::State state() const override { return m_state; }
+
+ QUrl source() const override;
+ void setSource(const QUrl &fileName) override;
+
+ QIODevice *sourceDevice() const override;
+ void setSourceDevice(QIODevice *device) override;
+
+ void start() override;
+ void stop() override;
+
+ QAudioFormat audioFormat() const override;
+ void setAudioFormat(const QAudioFormat &format) override;
+
+ QAudioBuffer read() override;
+ bool bufferAvailable() const override;
+
+ qint64 position() const override;
+ qint64 duration() const override;
+
+private slots:
+ void handleNewAudioBuffer(QAudioBuffer);
+ void startReading();
+
+signals:
+ void newAudioBuffer(QAudioBuffer);
+ void readyToRead();
+
+private:
+ void processInvalidMedia(QAudioDecoder::Error errorCode, const QString& errorString);
+ void initAssetReader();
+
+ QAudioDecoder::State m_state = QAudioDecoder::StoppedState;
+ QAudioDecoder::State m_pendingState = QAudioDecoder::StoppedState;
+
+ QUrl m_source;
+ QIODevice *m_device = nullptr;
+ QAudioFormat m_format;
+
+ int m_buffersAvailable = 0;
+ QList<QAudioBuffer> m_cachedBuffers;
+
+ qint64 m_position = -1;
+ qint64 m_duration = -1;
+
+ bool m_loadingSource = false;
+
+ AVURLAsset *m_asset = nullptr;
+ AVAssetReader *m_reader = nullptr;
+ AVAssetReaderTrackOutput *m_readerOutput = nullptr;
+ AVFResourceReaderDelegate *m_readerDelegate = nullptr;
+ dispatch_queue_t m_readingQueue;
+ dispatch_queue_t m_decodingQueue;
+};
+
+QT_END_NAMESPACE
+
+#endif // AVFAUDIODECODER_H
diff --git a/src/multimedia/platform/darwin/audio/qdarwinaudiodevice.mm b/src/multimedia/platform/darwin/audio/qdarwinaudiodevice.mm
index d24a7c59e..8fe6f1a2c 100644
--- a/src/multimedia/platform/darwin/audio/qdarwinaudiodevice.mm
+++ b/src/multimedia/platform/darwin/audio/qdarwinaudiodevice.mm
@@ -53,11 +53,11 @@
QT_BEGIN_NAMESPACE
#if defined(Q_OS_MACOS)
- QCoreAudioDeviceInfo::QCoreAudioDeviceInfo(AudioDeviceID id, const QByteArray &device, QAudio::Mode mode)
+ QCoreAudioDeviceInfo::QCoreAudioDeviceInfo(AudioDeviceID id, const QByteArray &device, QAudioDevice::Mode mode)
: QAudioDevicePrivate(device, mode),
m_deviceId(id)
#else
- QCoreAudioDeviceInfo::QCoreAudioDeviceInfo(const QByteArray &device, QAudio::Mode mode)
+ QCoreAudioDeviceInfo::QCoreAudioDeviceInfo(const QByteArray &device, QAudioDevice::Mode mode)
: QAudioDevicePrivate(device, mode)
#endif
{
@@ -77,7 +77,7 @@ QAudioFormat QCoreAudioDeviceInfo::determinePreferredFormat() const
#if defined(Q_OS_MACOS)
UInt32 propSize = 0;
- AudioObjectPropertyScope audioDevicePropertyScope = mode == QAudio::AudioInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput;
+ AudioObjectPropertyScope audioDevicePropertyScope = mode == QAudioDevice::Input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput;
AudioObjectPropertyAddress audioDevicePropertyStreamsAddress = { kAudioDevicePropertyStreams,
audioDevicePropertyScope,
kAudioObjectPropertyElementMaster };
@@ -119,7 +119,7 @@ QAudioFormat QCoreAudioDeviceInfo::determinePreferredFormat() const
{
format.setSampleRate(44100);
format.setSampleFormat(QAudioFormat::Int16);
- format.setChannelCount(mode == QAudio::AudioInput ? 1 : 2);
+ format.setChannelCount(mode == QAudioDevice::Input ? 1 : 2);
}
return format;
@@ -131,7 +131,7 @@ QString QCoreAudioDeviceInfo::getDescription() const
#ifdef Q_OS_MACOS
CFStringRef name;
UInt32 size = sizeof(CFStringRef);
- AudioObjectPropertyScope audioPropertyScope = mode == QAudio::AudioInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput;
+ AudioObjectPropertyScope audioPropertyScope = mode == QAudioDevice::Input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput;
AudioObjectPropertyAddress audioDeviceNamePropertyAddress = { kAudioObjectPropertyName,
audioPropertyScope,
diff --git a/src/multimedia/platform/darwin/audio/qdarwinaudiodevice_p.h b/src/multimedia/platform/darwin/audio/qdarwinaudiodevice_p.h
index 30aead354..8a1ad502d 100644
--- a/src/multimedia/platform/darwin/audio/qdarwinaudiodevice_p.h
+++ b/src/multimedia/platform/darwin/audio/qdarwinaudiodevice_p.h
@@ -63,9 +63,9 @@ class QCoreAudioDeviceInfo : public QAudioDevicePrivate
{
public:
#if defined(Q_OS_MACOS)
- QCoreAudioDeviceInfo(AudioDeviceID id, const QByteArray &device, QAudio::Mode mode);
+ QCoreAudioDeviceInfo(AudioDeviceID id, const QByteArray &device, QAudioDevice::Mode mode);
#else
- QCoreAudioDeviceInfo(const QByteArray &device, QAudio::Mode mode);
+ QCoreAudioDeviceInfo(const QByteArray &device, QAudioDevice::Mode mode);
#endif
~QCoreAudioDeviceInfo() {}
diff --git a/src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm b/src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm
index 60a4484ff..7536d88d3 100644
--- a/src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm
+++ b/src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm
@@ -301,7 +301,7 @@ QImageEncoderSettings AVFCameraImageCapture::imageSettings() const
}
settings.setResolution(res);
- settings.setFormat(QImageEncoderSettings::JPEG);
+ settings.setFormat(QCameraImageCapture::JPEG);
return settings;
}
@@ -330,7 +330,7 @@ bool AVFCameraImageCapture::applySettings()
return false;
}
- if (m_settings.format() != QImageEncoderSettings::UnspecifiedFormat && m_settings.format() != QImageEncoderSettings::JPEG) {
+ if (m_settings.format() != QCameraImageCapture::UnspecifiedFormat && m_settings.format() != QCameraImageCapture::JPEG) {
qDebugCamera() << Q_FUNC_INFO << "unsupported format:" << m_settings.format();
return false;
}
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/darwin/camera/avfmediaencoder.mm b/src/multimedia/platform/darwin/camera/avfmediaencoder.mm
index 7d1725913..916d9fe7e 100644
--- a/src/multimedia/platform/darwin/camera/avfmediaencoder.mm
+++ b/src/multimedia/platform/darwin/camera/avfmediaencoder.mm
@@ -85,11 +85,11 @@ bool qt_file_exists(NSURL *fileURL)
}
-AVFMediaEncoder::AVFMediaEncoder(QMediaEncoder *parent)
+AVFMediaEncoder::AVFMediaEncoder(QMediaRecorder *parent)
: QObject(parent)
, QPlatformMediaEncoder(parent)
- , m_state(QMediaEncoder::StoppedState)
- , m_lastStatus(QMediaEncoder::StoppedStatus)
+ , m_state(QMediaRecorder::StoppedState)
+ , m_lastStatus(QMediaRecorder::StoppedStatus)
, m_audioSettings(nil)
, m_videoSettings(nil)
//, m_restoreFPS(-1, -1)
@@ -122,12 +122,12 @@ bool AVFMediaEncoder::setOutputLocation(const QUrl &location)
return location.scheme() == QLatin1String("file") || location.scheme().isEmpty();
}
-QMediaEncoder::State AVFMediaEncoder::state() const
+QMediaRecorder::RecorderState AVFMediaEncoder::state() const
{
return m_state;
}
-QMediaEncoder::Status AVFMediaEncoder::status() const
+QMediaRecorder::Status AVFMediaEncoder::status() const
{
return m_lastStatus;
}
@@ -368,7 +368,7 @@ void AVFMediaEncoder::applySettings()
return;
AVFCameraSession *session = m_service->session();
- if (m_state != QMediaEncoder::StoppedState)
+ if (m_state != QMediaRecorder::StoppedState)
return;
const auto flag = (session->activeCameraInfo().isNull())
@@ -427,7 +427,7 @@ void AVFMediaEncoder::setCaptureSession(QPlatformMediaCaptureSession *session)
return;
if (m_service)
- setState(QMediaEncoder::StoppedState);
+ setState(QMediaRecorder::StoppedState);
m_service = captureSession;
if (!m_service)
@@ -437,7 +437,7 @@ void AVFMediaEncoder::setCaptureSession(QPlatformMediaCaptureSession *session)
onCameraChanged();
}
-void AVFMediaEncoder::setState(QMediaEncoder::State state)
+void AVFMediaEncoder::setState(QMediaRecorder::RecorderState state)
{
if (!m_service || !m_service->session()) {
qWarning() << Q_FUNC_INFO << "Encoder is not set to a capture session";
@@ -453,14 +453,14 @@ void AVFMediaEncoder::setState(QMediaEncoder::State state)
return;
switch (state) {
- case QMediaEncoder::RecordingState:
+ case QMediaRecorder::RecordingState:
m_service->session()->setActive(true);
record();
break;
- case QMediaEncoder::PausedState:
- Q_EMIT error(QMediaEncoder::FormatError, tr("Recording pause not supported"));
+ case QMediaRecorder::PausedState:
+ Q_EMIT error(QMediaRecorder::FormatError, tr("Recording pause not supported"));
return;
- case QMediaEncoder::StoppedState:
+ case QMediaRecorder::StoppedState:
// Do not check the camera status, we can stop if we started.
stopWriter();
}
@@ -476,7 +476,7 @@ void AVFMediaEncoder::record()
AVFCamera *cameraControl = m_service->avfCameraControl();
if (!cameraControl || cameraControl->status() != QCamera::ActiveStatus) {
qDebugCamera() << Q_FUNC_INFO << "can not start record while camera is not active";
- Q_EMIT error(QMediaEncoder::ResourceError, tr("Failed to start recording"));
+ Q_EMIT error(QMediaRecorder::ResourceError, tr("Failed to start recording"));
return;
}
@@ -503,13 +503,13 @@ void AVFMediaEncoder::record()
NSURL *nsFileURL = fileURL.toNSURL();
if (!nsFileURL) {
qWarning() << Q_FUNC_INFO << "invalid output URL:" << fileURL;
- Q_EMIT error(QMediaEncoder::ResourceError, tr("Invalid output file URL"));
+ Q_EMIT error(QMediaRecorder::ResourceError, tr("Invalid output file URL"));
return;
}
if (!qt_is_writable_file_URL(nsFileURL)) {
qWarning() << Q_FUNC_INFO << "invalid output URL:" << fileURL
<< "(the location is not writable)";
- Q_EMIT error(QMediaEncoder::ResourceError, tr("Non-writeable file location"));
+ Q_EMIT error(QMediaRecorder::ResourceError, tr("Non-writeable file location"));
return;
}
if (qt_file_exists(nsFileURL)) {
@@ -517,7 +517,7 @@ void AVFMediaEncoder::record()
// Objective-C exception, which is not good at all.
qWarning() << Q_FUNC_INFO << "invalid output URL:" << fileURL
<< "(file already exists)";
- Q_EMIT error(QMediaEncoder::ResourceError, tr("File already exists"));
+ Q_EMIT error(QMediaRecorder::ResourceError, tr("File already exists"));
return;
}
@@ -533,8 +533,8 @@ void AVFMediaEncoder::record()
videoSettings:m_videoSettings
transform:CGAffineTransformMakeRotation(qDegreesToRadians(rotation))]) {
- m_state = QMediaEncoder::RecordingState;
- m_lastStatus = QMediaEncoder::StartingStatus;
+ m_state = QMediaRecorder::RecordingState;
+ m_lastStatus = QMediaRecorder::StartingStatus;
Q_EMIT actualLocationChanged(fileURL);
Q_EMIT stateChanged(m_state);
@@ -551,14 +551,14 @@ void AVFMediaEncoder::record()
[m_writer start];
} else {
[session startRunning];
- Q_EMIT error(QMediaEncoder::FormatError, tr("Failed to start recording"));
+ Q_EMIT error(QMediaRecorder::FormatError, tr("Failed to start recording"));
}
}
void AVFMediaEncoder::assetWriterStarted()
{
- m_lastStatus = QMediaEncoder::RecordingStatus;
- Q_EMIT statusChanged(QMediaEncoder::RecordingStatus);
+ m_lastStatus = QMediaRecorder::RecordingStatus;
+ Q_EMIT statusChanged(QMediaRecorder::RecordingStatus);
}
void AVFMediaEncoder::assetWriterFinished()
@@ -566,8 +566,8 @@ void AVFMediaEncoder::assetWriterFinished()
Q_ASSERT(m_service && m_service->session());
AVFCameraSession *session = m_service->session();
- const QMediaEncoder::Status lastStatus = m_lastStatus;
- const QMediaEncoder::State lastState = m_state;
+ const QMediaRecorder::Status lastStatus = m_lastStatus;
+ const QMediaRecorder::RecorderState lastState = m_state;
unapplySettings();
@@ -576,8 +576,8 @@ void AVFMediaEncoder::assetWriterFinished()
}
[session->captureSession() startRunning];
- m_state = QMediaEncoder::StoppedState;
- m_lastStatus = QMediaEncoder::StoppedStatus;
+ m_state = QMediaRecorder::StoppedState;
+ m_lastStatus = QMediaRecorder::StoppedStatus;
if (m_lastStatus != lastStatus)
Q_EMIT statusChanged(m_lastStatus);
if (m_state != lastState)
@@ -599,12 +599,12 @@ void AVFMediaEncoder::cameraActiveChanged(bool active)
AVFCamera *cameraControl = m_service->avfCameraControl();
Q_ASSERT(cameraControl);
- const QMediaEncoder::Status lastStatus = m_lastStatus;
+ const QMediaRecorder::Status lastStatus = m_lastStatus;
if (!active) {
- if (m_lastStatus == QMediaEncoder::RecordingStatus)
+ if (m_lastStatus == QMediaRecorder::RecordingStatus)
return stopWriter();
- m_lastStatus = QMediaEncoder::StoppedStatus;
+ m_lastStatus = QMediaRecorder::StoppedStatus;
}
if (lastStatus != m_lastStatus)
@@ -613,8 +613,8 @@ void AVFMediaEncoder::cameraActiveChanged(bool active)
void AVFMediaEncoder::stopWriter()
{
- if (m_lastStatus == QMediaEncoder::RecordingStatus) {
- m_lastStatus = QMediaEncoder::FinalizingStatus;
+ if (m_lastStatus == QMediaRecorder::RecordingStatus) {
+ m_lastStatus = QMediaRecorder::FinalizingStatus;
Q_EMIT statusChanged(m_lastStatus);
diff --git a/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h b/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h
index 149adafa7..bd9588e27 100644
--- a/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h
+++ b/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h
@@ -74,14 +74,14 @@ class AVFMediaEncoder : public QObject, public QPlatformMediaEncoder
{
Q_OBJECT
public:
- AVFMediaEncoder(QMediaEncoder *parent);
+ AVFMediaEncoder(QMediaRecorder *parent);
~AVFMediaEncoder() override;
QUrl outputLocation() const override;
bool setOutputLocation(const QUrl &location) override;
- QMediaEncoder::State state() const override;
- QMediaEncoder::Status status() const override;
+ QMediaRecorder::RecorderState state() const override;
+ QMediaRecorder::Status status() const override;
qint64 duration() const override;
@@ -96,7 +96,7 @@ public:
void setCaptureSession(QPlatformMediaCaptureSession *session);
public Q_SLOTS:
- void setState(QMediaEncoder::State state) override;
+ void setState(QMediaRecorder::RecorderState state) override;
private:
@@ -117,8 +117,8 @@ private:
QUrl m_outputLocation;
AVFStorageLocation m_storageLocation;
- QMediaEncoder::State m_state;
- QMediaEncoder::Status m_lastStatus;
+ QMediaRecorder::RecorderState m_state;
+ QMediaRecorder::Status m_lastStatus;
QMediaEncoderSettings m_settings;
NSDictionary *m_audioSettings;
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm
index cfd310cd3..f60c61261 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm
+++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm
@@ -43,6 +43,9 @@
#include <private/avfvideosink_p.h>
#include "avfmetadata_p.h"
+#include "qaudiooutput.h"
+#include "qplatformaudiooutput_p.h"
+
#include <qpointer.h>
#include <QFileInfo>
@@ -268,8 +271,9 @@ static void *AVFMediaPlayerObserverCurrentItemDurationObservationContext = &AVFM
//Set the initial volume on new player object
if (self.session) {
- [m_player setVolume:m_session->volume() / 100.0f];
- [m_player setMuted:m_session->isMuted()];
+ auto *audioOutput = m_session->m_audioOutput;
+ m_player.volume = (audioOutput ? audioOutput->volume : 1.);
+ m_player.muted = (audioOutput ? audioOutput->muted : true);
}
//Assign the output layer to the new player
@@ -471,9 +475,7 @@ AVFMediaPlayer::AVFMediaPlayer(QMediaPlayer *player)
, m_state(QMediaPlayer::StoppedState)
, m_mediaStatus(QMediaPlayer::NoMedia)
, m_mediaStream(nullptr)
- , m_muted(false)
, m_tryingAsync(false)
- , m_volume(100)
, m_rate(1.0)
, m_requestedPosition(-1)
, m_duration(0)
@@ -651,16 +653,6 @@ float AVFMediaPlayer::bufferProgress() const
return m_bufferProgress/100.;
}
-int AVFMediaPlayer::volume() const
-{
- return m_volume;
-}
-
-bool AVFMediaPlayer::isMuted() const
-{
- return m_muted;
-}
-
void AVFMediaPlayer::setAudioAvailable(bool available)
{
if (m_audioAvailable == available)
@@ -727,25 +719,22 @@ qreal AVFMediaPlayer::playbackRate() const
return m_rate;
}
-bool AVFMediaPlayer::setAudioOutput(const QAudioDevice &info)
+void AVFMediaPlayer::setAudioOutput(QPlatformAudioOutput *output)
{
- m_audioOutput = info;
-
-#ifdef Q_OS_MACOS
- AVPlayer *player = [static_cast<AVFMediaPlayerObserver*>(m_observer) player];
- if (info.isNull()) {
- player.audioOutputDeviceUniqueID = nil;
- } else {
- NSString *str = QString::fromUtf8(info.id()).toNSString();
- player.audioOutputDeviceUniqueID = str;
+ if (m_audioOutput == output)
+ return;
+ if (m_audioOutput)
+ m_audioOutput->q->disconnect(this);
+ m_audioOutput = output;
+ if (m_audioOutput) {
+ connect(m_audioOutput->q, &QAudioOutput::deviceChanged, this, &AVFMediaPlayer::audioOutputChanged);
+ connect(m_audioOutput->q, &QAudioOutput::volumeChanged, this, &AVFMediaPlayer::setVolume);
+ connect(m_audioOutput->q, &QAudioOutput::mutedChanged, this, &AVFMediaPlayer::setMuted);
+ //connect(m_audioOutput->q, &QAudioOutput::audioRoleChanged, this, &AVFMediaPlayer::setAudioRole);
}
-#endif
- return true;
-}
-
-QAudioDevice AVFMediaPlayer::audioOutput() const
-{
- return m_audioOutput;
+ audioOutputChanged();
+ setMuted(m_audioOutput ? m_audioOutput->muted : true);
+ setVolume(m_audioOutput ? m_audioOutput->volume : 1.);
}
QMediaMetaData AVFMediaPlayer::metaData() const
@@ -895,22 +884,15 @@ void AVFMediaPlayer::stop()
m_playbackTimer.stop();
}
-void AVFMediaPlayer::setVolume(int volume)
+void AVFMediaPlayer::setVolume(float volume)
{
#ifdef QT_DEBUG_AVF
qDebug() << Q_FUNC_INFO << volume;
#endif
- if (m_volume == volume)
- return;
-
- m_volume = volume;
-
AVPlayer *player = [static_cast<AVFMediaPlayerObserver*>(m_observer) player];
if (player)
- [player setVolume:volume / 100.0f];
-
- Q_EMIT volumeChanged(m_volume);
+ player.volume = volume;
}
void AVFMediaPlayer::setMuted(bool muted)
@@ -919,16 +901,24 @@ void AVFMediaPlayer::setMuted(bool muted)
qDebug() << Q_FUNC_INFO << muted;
#endif
- if (m_muted == muted)
- return;
-
- m_muted = muted;
-
AVPlayer *player = [static_cast<AVFMediaPlayerObserver*>(m_observer) player];
if (player)
- [player setMuted:muted];
+ player.muted = muted;
+}
- Q_EMIT mutedChanged(muted);
+void AVFMediaPlayer::audioOutputChanged()
+{
+#ifdef Q_OS_MACOS
+ AVPlayer *player = [static_cast<AVFMediaPlayerObserver*>(m_observer) player];
+ if (!m_audioOutput || m_audioOutput->device.id().isEmpty()) {
+ player.audioOutputDeviceUniqueID = nil;
+ if (!m_audioOutput)
+ player.muted = true;
+ } else {
+ NSString *str = QString::fromUtf8(m_audioOutput->device.id()).toNSString();
+ player.audioOutputDeviceUniqueID = str;
+ }
+#endif
}
void AVFMediaPlayer::processEOS()
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h
index 367b3d81e..4bd082c1c 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h
+++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h
@@ -94,9 +94,6 @@ public:
float bufferProgress() const override;
- int volume() const override;
- bool isMuted() const override;
-
bool isAudioAvailable() const override;
bool isVideoAvailable() const override;
@@ -105,9 +102,8 @@ public:
qreal playbackRate() const override;
- bool setAudioOutput(const QAudioDevice &) override;
- QAudioDevice audioOutput() const override;
- QAudioDevice m_audioOutput;
+ void setAudioOutput(QPlatformAudioOutput *output) override;
+ QPlatformAudioOutput *m_audioOutput = nullptr;
QMediaMetaData metaData() const override;
@@ -121,8 +117,9 @@ public Q_SLOTS:
void pause() override;
void stop() override;
- void setVolume(int volume) override;
- void setMuted(bool muted) override;
+ void setVolume(float volume);
+ void setMuted(bool muted);
+ void audioOutputChanged();
void processEOS();
void processLoadStateChange(QMediaPlayer::PlaybackState newState);
@@ -163,9 +160,7 @@ private:
QUrl m_resources;
QMediaMetaData m_metaData;
- bool m_muted;
bool m_tryingAsync;
- int m_volume;
qreal m_rate;
qint64 m_requestedPosition;
diff --git a/src/multimedia/platform/darwin/qdarwinformatsinfo.mm b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm
index 1cbbee939..59c563537 100644
--- a/src/multimedia/platform/darwin/qdarwinformatsinfo.mm
+++ b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm
@@ -166,7 +166,7 @@ QDarwinFormatInfo::QDarwinFormatInfo()
// #endif
// ###
- imageFormats << QImageEncoderSettings::JPEG;
+ imageFormats << QCameraImageCapture::JPEG;
}
QDarwinFormatInfo::~QDarwinFormatInfo()
diff --git a/src/multimedia/platform/darwin/qdarwinintegration.mm b/src/multimedia/platform/darwin/qdarwinintegration.mm
index 511745ce1..753dabff4 100644
--- a/src/multimedia/platform/darwin/qdarwinintegration.mm
+++ b/src/multimedia/platform/darwin/qdarwinintegration.mm
@@ -46,6 +46,7 @@
#include <private/avfmediaencoder_p.h>
#include <private/qdarwinformatsinfo_p.h>
#include <private/avfvideosink_p.h>
+#include <private/avfaudiodecoder_p.h>
QT_BEGIN_NAMESPACE
@@ -74,6 +75,11 @@ QPlatformMediaFormatInfo *QDarwinIntegration::formatInfo()
return m_formatInfo;
}
+QPlatformAudioDecoder *QDarwinIntegration::createAudioDecoder(QAudioDecoder *decoder)
+{
+ return new AVFAudioDecoder(decoder);
+}
+
QPlatformMediaCaptureSession *QDarwinIntegration::createCaptureSession()
{
return new AVFCameraService;
@@ -89,7 +95,7 @@ QPlatformCamera *QDarwinIntegration::createCamera(QCamera *camera)
return new AVFCamera(camera);
}
-QPlatformMediaEncoder *QDarwinIntegration::createEncoder(QMediaEncoder *encoder)
+QPlatformMediaEncoder *QDarwinIntegration::createEncoder(QMediaRecorder *encoder)
{
return new AVFMediaEncoder(encoder);
}
diff --git a/src/multimedia/platform/darwin/qdarwinintegration_p.h b/src/multimedia/platform/darwin/qdarwinintegration_p.h
index ef7b3d7ac..52832585e 100644
--- a/src/multimedia/platform/darwin/qdarwinintegration_p.h
+++ b/src/multimedia/platform/darwin/qdarwinintegration_p.h
@@ -66,10 +66,11 @@ public:
QPlatformMediaDevices *devices() override;
QPlatformMediaFormatInfo *formatInfo() override;
+ QPlatformAudioDecoder *createAudioDecoder(QAudioDecoder *) override;
QPlatformMediaCaptureSession *createCaptureSession() override;
QPlatformMediaPlayer *createPlayer(QMediaPlayer *player) override;
QPlatformCamera *createCamera(QCamera *camera) override;
- QPlatformMediaEncoder *createEncoder(QMediaEncoder *) override;
+ QPlatformMediaEncoder *createEncoder(QMediaRecorder *) override;
QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *) override;
QPlatformVideoSink *createVideoSink(QVideoSink *) override;
diff --git a/src/multimedia/platform/darwin/qdarwinmediadevices.mm b/src/multimedia/platform/darwin/qdarwinmediadevices.mm
index 271b3a9d1..2a71fc863 100644
--- a/src/multimedia/platform/darwin/qdarwinmediadevices.mm
+++ b/src/multimedia/platform/darwin/qdarwinmediadevices.mm
@@ -58,11 +58,11 @@
QT_BEGIN_NAMESPACE
#if defined(Q_OS_MACOS)
-AudioDeviceID defaultAudioDevice(QAudio::Mode mode)
+AudioDeviceID defaultAudioDevice(QAudioDevice::Mode mode)
{
AudioDeviceID audioDevice;
UInt32 size = sizeof(audioDevice);
- const AudioObjectPropertySelector selector = (mode == QAudio::AudioOutput) ? kAudioHardwarePropertyDefaultOutputDevice
+ const AudioObjectPropertySelector selector = (mode == QAudioDevice::Output) ? kAudioHardwarePropertyDefaultOutputDevice
: kAudioHardwarePropertyDefaultInputDevice;
AudioObjectPropertyAddress defaultDevicePropertyAddress = { selector,
kAudioObjectPropertyScopeGlobal,
@@ -71,19 +71,19 @@ AudioDeviceID defaultAudioDevice(QAudio::Mode mode)
if (AudioObjectGetPropertyData(kAudioObjectSystemObject,
&defaultDevicePropertyAddress,
0, NULL, &size, &audioDevice) != noErr) {
- qWarning("QAudioDevice: Unable to find default %s device", (mode == QAudio::AudioOutput) ? "output" : "input");
+ qWarning("QAudioDevice: Unable to find default %s device", (mode == QAudioDevice::Output) ? "output" : "input");
return 0;
}
return audioDevice;
}
-static QByteArray uniqueId(AudioDeviceID device, QAudio::Mode mode)
+static QByteArray uniqueId(AudioDeviceID device, QAudioDevice::Mode mode)
{
CFStringRef name;
UInt32 size = sizeof(CFStringRef);
- AudioObjectPropertyScope audioPropertyScope = mode == QAudio::AudioInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput;
+ AudioObjectPropertyScope audioPropertyScope = mode == QAudioDevice::Input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput;
AudioObjectPropertyAddress audioDeviceNamePropertyAddress = { kAudioDevicePropertyDeviceUID,
audioPropertyScope,
@@ -99,7 +99,7 @@ static QByteArray uniqueId(AudioDeviceID device, QAudio::Mode mode)
return s.toUtf8();
}
-QList<QAudioDevice> availableAudioDevices(QAudio::Mode mode)
+QList<QAudioDevice> availableAudioDevices(QAudioDevice::Mode mode)
{
QList<QAudioDevice> devices;
@@ -130,7 +130,7 @@ QList<QAudioDevice> availableAudioDevices(QAudio::Mode mode)
AudioStreamBasicDescription sf;
UInt32 size = sizeof(AudioStreamBasicDescription);
AudioObjectPropertyAddress audioDeviceStreamFormatPropertyAddress = { kAudioDevicePropertyStreamFormat,
- (mode == QAudio::AudioInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput),
+ (mode == QAudioDevice::Input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput),
kAudioObjectPropertyElementMaster };
if (AudioObjectGetPropertyData(audioDevices[i], &audioDeviceStreamFormatPropertyAddress, 0, NULL, &size, &sf) == noErr)
@@ -205,10 +205,10 @@ QList<QAudioDevice> QDarwinMediaDevices::audioInputs() const
{
#ifdef Q_OS_IOS
QList<QAudioDevice> devices;
- devices.append((new QCoreAudioDeviceInfo("default", QAudio::AudioInput))->create());
+ devices.append((new QCoreAudioDeviceInfo("default", QAudioDevice::Input))->create());
return devices;
#else
- return availableAudioDevices(QAudio::AudioInput);
+ return availableAudioDevices(QAudioDevice::Input);
#endif
}
@@ -216,10 +216,10 @@ QList<QAudioDevice> QDarwinMediaDevices::audioOutputs() const
{
#ifdef Q_OS_IOS
QList<QAudioDevice> devices;
- devices.append((new QCoreAudioDeviceInfo("default", QAudio::AudioOutput))->create());
+ devices.append((new QCoreAudioDeviceInfo("default", QAudioDevice::Output))->create());
return devices;
#else
- return availableAudioDevices(QAudio::AudioOutput);
+ return availableAudioDevices(QAudioDevice::Output);
#endif
}
@@ -315,13 +315,13 @@ void QDarwinMediaDevices::updateCameraDevices()
void QDarwinMediaDevices::updateAudioDevices()
{
#ifdef Q_OS_MACOS
- QList<QAudioDevice> inputs = availableAudioDevices(QAudio::AudioInput);
+ QList<QAudioDevice> inputs = availableAudioDevices(QAudioDevice::Input);
if (m_audioInputs != inputs) {
m_audioInputs = inputs;
audioInputsChanged();
}
- QList<QAudioDevice> outputs = availableAudioDevices(QAudio::AudioOutput);
+ QList<QAudioDevice> outputs = availableAudioDevices(QAudioDevice::Output);
if (m_audioOutputs!= outputs) {
m_audioOutputs = outputs;
audioOutputsChanged();
diff --git a/src/multimedia/platform/gstreamer/audio/qgstreameraudiodevice.cpp b/src/multimedia/platform/gstreamer/audio/qgstreameraudiodevice.cpp
index f68edf369..301283013 100644
--- a/src/multimedia/platform/gstreamer/audio/qgstreameraudiodevice.cpp
+++ b/src/multimedia/platform/gstreamer/audio/qgstreameraudiodevice.cpp
@@ -45,7 +45,7 @@
QT_BEGIN_NAMESPACE
-QGStreamerAudioDeviceInfo::QGStreamerAudioDeviceInfo(GstDevice *d, const QByteArray &device, QAudio::Mode mode)
+QGStreamerAudioDeviceInfo::QGStreamerAudioDeviceInfo(GstDevice *d, const QByteArray &device, QAudioDevice::Mode mode)
: QAudioDevicePrivate(device, mode),
gstDevice(d)
{
diff --git a/src/multimedia/platform/gstreamer/audio/qgstreameraudiodevice_p.h b/src/multimedia/platform/gstreamer/audio/qgstreameraudiodevice_p.h
index c9e5442b7..9da109e38 100644
--- a/src/multimedia/platform/gstreamer/audio/qgstreameraudiodevice_p.h
+++ b/src/multimedia/platform/gstreamer/audio/qgstreameraudiodevice_p.h
@@ -66,7 +66,7 @@ QT_BEGIN_NAMESPACE
class QGStreamerAudioDeviceInfo : public QAudioDevicePrivate
{
public:
- QGStreamerAudioDeviceInfo(GstDevice *gstDevice, const QByteArray &device, QAudio::Mode mode);
+ QGStreamerAudioDeviceInfo(GstDevice *gstDevice, const QByteArray &device, QAudioDevice::Mode mode);
~QGStreamerAudioDeviceInfo();
GstDevice *gstDevice = nullptr;
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/common/qgstreameraudiooutput.cpp b/src/multimedia/platform/gstreamer/common/qgstreameraudiooutput.cpp
index 4227a04d5..a7a531e7f 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreameraudiooutput.cpp
+++ b/src/multimedia/platform/gstreamer/common/qgstreameraudiooutput.cpp
@@ -40,6 +40,7 @@
#include <private/qgstreameraudiooutput_p.h>
#include <private/qgstreameraudiodevice_p.h>
#include <qaudiodevice.h>
+#include <qaudiooutput.h>
#include <QtCore/qloggingcategory.h>
#include <QtNetwork/qnetworkaccessmanager.h>
@@ -53,9 +54,10 @@ Q_LOGGING_CATEGORY(qLcMediaAudioOutput, "qt.multimedia.audiooutput")
QT_BEGIN_NAMESPACE
-QGstreamerAudioOutput::QGstreamerAudioOutput(QObject *parent)
- : QObject(parent),
- gstAudioOutput("audioOutput")
+QGstreamerAudioOutput::QGstreamerAudioOutput(QAudioOutput *parent)
+ : QObject(parent),
+ QPlatformAudioOutput(parent),
+ gstAudioOutput("audioOutput")
{
audioQueue = QGstElement("queue", "audioQueue");
audioConvert = QGstElement("audioconvert", "audioConvert");
@@ -72,32 +74,14 @@ QGstreamerAudioOutput::~QGstreamerAudioOutput()
{
}
-int QGstreamerAudioOutput::volume() const
+void QGstreamerAudioOutput::setVolume(float vol)
{
- return m_volume;
-}
-
-bool QGstreamerAudioOutput::isMuted() const
-{
- return m_muted;
-}
-
-void QGstreamerAudioOutput::setVolume(int vol)
-{
- if (vol == m_volume)
- return;
- m_volume = vol;
- audioVolume.set("volume", vol/100.);
- emit volumeChanged(m_volume);
+ audioVolume.set("volume", vol);
}
void QGstreamerAudioOutput::setMuted(bool muted)
{
- if (muted == m_muted)
- return;
- m_muted = muted;
audioVolume.set("mute", muted);
- emit mutedChanged(muted);
}
void QGstreamerAudioOutput::setPipeline(const QGstPipeline &pipeline)
@@ -112,8 +96,7 @@ bool QGstreamerAudioOutput::setAudioOutput(const QAudioDevice &info)
qCDebug(qLcMediaAudioOutput) << "setAudioOutput" << info.description() << info.isNull();
m_audioOutput = info;
- auto state = gstPipeline.state();
- if (state != GST_STATE_PLAYING)
+ if (gstPipeline.isNull() || gstPipeline.state() != GST_STATE_PLAYING)
return changeAudioOutput();
auto pad = audioVolume.staticPad("src");
diff --git a/src/multimedia/platform/gstreamer/common/qgstreameraudiooutput_p.h b/src/multimedia/platform/gstreamer/common/qgstreameraudiooutput_p.h
index 940d82330..fc1a8b8db 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreameraudiooutput_p.h
+++ b/src/multimedia/platform/gstreamer/common/qgstreameraudiooutput_p.h
@@ -58,28 +58,28 @@
#include <private/qgst_p.h>
#include <private/qgstpipeline_p.h>
+#include <private/qplatformaudiooutput_p.h>
QT_BEGIN_NAMESPACE
class QGstreamerMessage;
class QAudioDevice;
-class Q_MULTIMEDIA_EXPORT QGstreamerAudioOutput : public QObject
+class Q_MULTIMEDIA_EXPORT QGstreamerAudioOutput : public QObject, public QPlatformAudioOutput
{
Q_OBJECT
public:
- QGstreamerAudioOutput(QObject *parent = 0);
+ QGstreamerAudioOutput(QAudioOutput *parent);
~QGstreamerAudioOutput();
- int volume() const;
- bool isMuted() const;
-
bool setAudioOutput(const QAudioDevice &);
QAudioDevice audioOutput() const;
- void setVolume(int volume);
- void setMuted(bool muted);
+ void setAudioDevice(const QAudioDevice &) override
+ { setAudioOutput(device); }
+ void setVolume(float volume) override;
+ void setMuted(bool muted) override;
void setPipeline(const QGstPipeline &pipeline);
@@ -93,9 +93,6 @@ private:
void prepareAudioOutputChange(const QGstPad &pad);
bool changeAudioOutput();
- int m_volume = 100.;
- bool m_muted = false;
-
QAudioDevice m_audioOutput;
// Gst elements
diff --git a/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp b/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp
index 63061961d..f1aa64a5a 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp
+++ b/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp
@@ -70,11 +70,6 @@ QGstreamerMediaPlayer::QGstreamerMediaPlayer(QMediaPlayer *parent)
QPlatformMediaPlayer(parent),
playerPipeline("playerPipeline")
{
- gstAudioOutput = new QGstreamerAudioOutput(this);
- gstAudioOutput->setPipeline(playerPipeline);
- connect(gstAudioOutput, &QGstreamerAudioOutput::mutedChanged, this, &QGstreamerMediaPlayer::mutedChangedHandler);
- connect(gstAudioOutput, &QGstreamerAudioOutput::volumeChanged, this, &QGstreamerMediaPlayer::volumeChangedHandler);
-
gstVideoOutput = new QGstreamerVideoOutput(this);
gstVideoOutput->setPipeline(playerPipeline);
@@ -121,16 +116,6 @@ float QGstreamerMediaPlayer::bufferProgress() const
return m_bufferProgress/100.;
}
-int QGstreamerMediaPlayer::volume() const
-{
- return gstAudioOutput->volume();
-}
-
-bool QGstreamerMediaPlayer::isMuted() const
-{
- return gstAudioOutput->isMuted();
-}
-
bool QGstreamerMediaPlayer::isSeekable() const
{
return true;
@@ -231,16 +216,6 @@ void QGstreamerMediaPlayer::stopOrEOS(bool eos)
mediaStatusChanged(eos ? QMediaPlayer::EndOfMedia : QMediaPlayer::LoadedMedia);
}
-void QGstreamerMediaPlayer::setVolume(int vol)
-{
- gstAudioOutput->setVolume(vol);
-}
-
-void QGstreamerMediaPlayer::setMuted(bool muted)
-{
- gstAudioOutput->setMuted(muted);
-}
-
bool QGstreamerMediaPlayer::processBusMessage(const QGstreamerMessage &message)
{
if (message.isNull())
@@ -424,7 +399,8 @@ void QGstreamerMediaPlayer::decoderPadAdded(const QGstElement &src, const QGstPa
output = gstVideoOutput->gstElement();
} else if (type.startsWith("audio/x-raw")) {
streamType = AudioStream;
- output = gstAudioOutput->gstElement();
+ if (gstAudioOutput)
+ output = gstAudioOutput->gstElement();
} else if (type.startsWith("text/")) {
streamType = SubtitleStream;
} else {
@@ -601,14 +577,12 @@ void QGstreamerMediaPlayer::setMedia(const QUrl &content, QIODevice *stream)
positionChanged(0);
}
-bool QGstreamerMediaPlayer::setAudioOutput(const QAudioDevice &info)
+void QGstreamerMediaPlayer::setAudioOutput(QPlatformAudioOutput *output)
{
- return gstAudioOutput->setAudioOutput(info);
-}
-
-QAudioDevice QGstreamerMediaPlayer::audioOutput() const
-{
- return gstAudioOutput->audioOutput();
+ if (gstAudioOutput == output)
+ return;
+ gstAudioOutput = static_cast<QGstreamerAudioOutput *>(output);
+ // ### Connect it if we're already running!
}
QMediaMetaData QGstreamerMediaPlayer::metaData() const
diff --git a/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer_p.h b/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer_p.h
index 23062e4d0..2d939a0f8 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer_p.h
+++ b/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer_p.h
@@ -84,9 +84,6 @@ public:
float bufferProgress() const override;
- int volume() const override;
- bool isMuted() const override;
-
bool isAudioAvailable() const override;
bool isVideoAvailable() const override;
@@ -102,8 +99,7 @@ public:
bool streamPlaybackSupported() const override { return true; }
- bool setAudioOutput(const QAudioDevice &) override;
- QAudioDevice audioOutput() const override;
+ void setAudioOutput(QPlatformAudioOutput *output) override;
QMediaMetaData metaData() const override;
@@ -120,13 +116,8 @@ public:
void pause() override;
void stop() override;
- void setVolume(int volume) override;
- void setMuted(bool muted) override;
-
bool processBusMessage(const QGstreamerMessage& message) override;
public Q_SLOTS:
- void volumeChangedHandler(int volume) { volumeChanged(volume); }
- void mutedChangedHandler(bool mute) { mutedChanged(mute); }
void updatePosition() { positionChanged(position()); }
private:
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
index a6bac1a04..d6ee3fdb4 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,41 @@ 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
+void QGstreamerMediaCapture::setAudioInput(QPlatformAudioInput *input)
{
- return gstAudioOutput->isMuted();
-}
+ if (gstAudioInput == input)
+ return;
+ gstPipeline.setStateSync(GST_STATE_PAUSED);
+ if (gstAudioInput) {
+ gstAudioOutput->setPipeline({});
+ gstAudioInput = nullptr;
+ if (gstAudioOutput) {
+ gstAudioOutput->gstElement().setStateSync(GST_STATE_NULL);
+ gstPipeline.remove(gstAudioOutput->gstElement());
+ }
+ if (!gstAudioTee.isNull()) {
+ gstAudioTee.setStateSync(GST_STATE_NULL);
+ gstPipeline.remove(gstAudioTee);
+ }
+ gstAudioTee = {};
+ }
+ gstAudioInput = static_cast<QGstreamerAudioInput *>(input);
+ if (gstAudioInput)
+ gstAudioInput->setPipeline(gstPipeline);
-void QGstreamerMediaCapture::setMuted(bool muted)
-{
- gstAudioOutput->setMuted(muted);
-}
+ Q_ASSERT(gstAudioTee.isNull());
+ gstAudioTee = QGstElement("tee", "audiotee");
+ gstAudioTee.set("allow-not-linked", true);
+ gstPipeline.add(gstAudioInput->gstElement(), gstAudioTee);
+ gstAudioInput->gstElement().link(gstAudioTee);
-qreal QGstreamerMediaCapture::volume() const
-{
- return gstAudioOutput->volume();
-}
+ if (gstAudioOutput) {
+ gstPipeline.add(gstAudioOutput->gstElement());
+ gstAudioOutputPad = gstAudioTee.getRequestPad("src_%u");
+ gstAudioOutputPad.link(gstAudioOutput->gstElement().staticPad("sink"));
+ }
-void QGstreamerMediaCapture::setVolume(qreal volume)
-{
- gstAudioOutput->setVolume(volume);
+ gstPipeline.setState(GST_STATE_PLAYING);
}
void QGstreamerMediaCapture::setVideoPreview(QVideoSink *sink)
@@ -214,17 +207,38 @@ void QGstreamerMediaCapture::setVideoPreview(QVideoSink *sink)
gstVideoOutput->setVideoSink(sink);
}
-QAudioDevice QGstreamerMediaCapture::audioPreview() const
+void QGstreamerMediaCapture::setAudioOutput(QPlatformAudioOutput *output)
{
- return gstAudioOutput->audioOutput();
-}
+ if (gstAudioOutput == output)
+ return;
+ gstPipeline.setStateSync(GST_STATE_PAUSED);
-bool QGstreamerMediaCapture::setAudioPreview(const QAudioDevice &info)
-{
- gstAudioOutput->setAudioOutput(info);
- return true;
+ if (gstAudioOutput) {
+ gstAudioOutput->setPipeline({});
+ gstAudioOutput = nullptr;
+ if (!gstAudioTee.isNull()) {
+ gstAudioOutput->gstElement().setStateSync(GST_STATE_NULL);
+ gstAudioOutputPad.unlinkPeer();
+ gstAudioTee.releaseRequestPad(gstAudioOutputPad);
+ gstAudioOutputPad = {};
+ gstPipeline.remove(gstAudioOutput->gstElement());
+ }
+ setupAudioPipeline();
+ }
+ gstAudioOutput = static_cast<QGstreamerAudioOutput *>(output);
+ if (gstAudioOutput)
+ gstAudioOutput->setPipeline(gstPipeline);
+
+ if (!gstAudioTee.isNull()) {
+ gstPipeline.add(gstAudioOutput->gstElement());
+ gstAudioOutputPad = gstAudioTee.getRequestPad("src_%u");
+ gstAudioOutputPad.link(gstAudioOutput->gstElement().staticPad("sink"));
+ }
+
+ gstPipeline.setState(GST_STATE_PLAYING);
}
+
QGstPad QGstreamerMediaCapture::getAudioPad() const
{
return gstAudioTee.getRequestPad("src_%u");
@@ -247,5 +261,13 @@ void QGstreamerMediaCapture::releaseVideoPad(const QGstPad &pad) const
gstVideoTee.releaseRequestPad(pad);
}
+void QGstreamerMediaCapture::setupAudioPipeline()
+{
+
+ if (!gstAudioInput) {
+ return;
+ }
+}
+
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..bf10054d1 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h
@@ -83,19 +83,10 @@ 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();
+ void setAudioOutput(QPlatformAudioOutput *output) override;
QGstPad getAudioPad() const;
QGstPad getVideoPad() const;
@@ -104,6 +95,8 @@ public:
QGstPipeline pipeline() const { return gstPipeline; }
+ void setupAudioPipeline();
+
private:
friend QGstreamerMediaEncoder;
// Gst elements
@@ -115,6 +108,7 @@ private:
QGstElement gstAudioTee;
QGstElement gstVideoTee;
+ QGstPad gstAudioOutputPad;
QGstreamerAudioOutput *gstAudioOutput = nullptr;
QGstreamerVideoOutput *gstVideoOutput = nullptr;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
index c50f91a6a..81fcecc2e 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
@@ -56,7 +56,7 @@
Q_LOGGING_CATEGORY(qLcMediaEncoder, "qt.multimedia.encoder")
-QGstreamerMediaEncoder::QGstreamerMediaEncoder(QMediaEncoder *parent)
+QGstreamerMediaEncoder::QGstreamerMediaEncoder(QMediaRecorder *parent)
: QPlatformMediaEncoder(parent)
{
gstEncoder = QGstElement("encodebin", "encodebin");
@@ -84,27 +84,27 @@ bool QGstreamerMediaEncoder::setOutputLocation(const QUrl &sink)
void QGstreamerMediaEncoder::updateStatus()
{
- static QMediaEncoder::Status statusTable[3][3] = {
+ static QMediaRecorder::Status statusTable[3][3] = {
//Stopped recorder state:
- { QMediaEncoder::StoppedStatus, QMediaEncoder::FinalizingStatus, QMediaEncoder::FinalizingStatus },
+ { QMediaRecorder::StoppedStatus, QMediaRecorder::FinalizingStatus, QMediaRecorder::FinalizingStatus },
//Recording recorder state:
- { QMediaEncoder::StartingStatus, QMediaEncoder::RecordingStatus, QMediaEncoder::PausedStatus },
+ { QMediaRecorder::StartingStatus, QMediaRecorder::RecordingStatus, QMediaRecorder::PausedStatus },
//Paused recorder state:
- { QMediaEncoder::StartingStatus, QMediaEncoder::RecordingStatus, QMediaEncoder::PausedStatus }
+ { QMediaRecorder::StartingStatus, QMediaRecorder::RecordingStatus, QMediaRecorder::PausedStatus }
};
- QMediaEncoder::State sessionState = QMediaEncoder::StoppedState;
+ QMediaRecorder::RecorderState sessionState = QMediaRecorder::StoppedState;
auto gstState = gstEncoder.isNull() ? GST_STATE_NULL : gstEncoder.state();
switch (gstState) {
case GST_STATE_PLAYING:
- sessionState = QMediaEncoder::RecordingState;
+ sessionState = QMediaRecorder::RecordingState;
break;
case GST_STATE_PAUSED:
- sessionState = QMediaEncoder::PausedState;
+ sessionState = QMediaRecorder::PausedState;
break;
default:
- sessionState = QMediaEncoder::StoppedState;
+ sessionState = QMediaRecorder::StoppedState;
break;
}
@@ -114,7 +114,7 @@ void QGstreamerMediaEncoder::updateStatus()
statusChanged(newStatus);
}
-void QGstreamerMediaEncoder::handleSessionError(QMediaEncoder::Error code, const QString &description)
+void QGstreamerMediaEncoder::handleSessionError(QMediaRecorder::Error code, const QString &description)
{
error(code, description);
stop();
@@ -153,7 +153,7 @@ bool QGstreamerMediaEncoder::processBusMessage(const QGstreamerMessage &message)
GError *err;
gchar *debug;
gst_message_parse_error(gm, &err, &debug);
- error(QMediaEncoder::ResourceError, QString::fromUtf8(err->message));
+ error(QMediaRecorder::ResourceError, QString::fromUtf8(err->message));
g_error_free(err);
g_free(debug);
}
@@ -264,19 +264,19 @@ static GstEncodingContainerProfile *createEncodingProfile(const QMediaEncoderSet
return containerProfile;
}
-void QGstreamerMediaEncoder::setState(QMediaEncoder::State s)
+void QGstreamerMediaEncoder::setState(QMediaRecorder::RecorderState s)
{
if (s == state())
return;
switch (s) {
- case QMediaEncoder::StoppedState:
+ case QMediaRecorder::StoppedState:
stop();
break;
- case QMediaEncoder::PausedState:
+ case QMediaRecorder::PausedState:
pause();
break;
- case QMediaEncoder::RecordingState:
+ case QMediaRecorder::RecordingState:
record();
break;
}
@@ -288,11 +288,11 @@ void QGstreamerMediaEncoder::record()
if (!m_session)
return;
auto oldState = state();
- stateChanged(QMediaEncoder::RecordingState);
+ stateChanged(QMediaRecorder::RecordingState);
- if (oldState == QMediaEncoder::PausedState) {
+ if (oldState == QMediaRecorder::PausedState) {
// coming from paused state
- stateChanged(QMediaEncoder::RecordingState);
+ stateChanged(QMediaRecorder::RecordingState);
gstEncoder.setState(GST_STATE_PLAYING);
updateStatus();
return;
@@ -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();
@@ -372,7 +374,7 @@ void QGstreamerMediaEncoder::stop()
qCDebug(qLcMediaEncoder) << ">>>>>>>>>>>>> sending EOS";
gstEncoder.sendEos();
- stateChanged(QMediaEncoder::StoppedState);
+ stateChanged(QMediaRecorder::StoppedState);
updateStatus();
}
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h
index ae4170c5d..3c0238c02 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h
@@ -69,7 +69,7 @@ class QGstreamerMessage;
class QGstreamerMediaEncoder : public QPlatformMediaEncoder, QGstreamerBusMessageFilter
{
public:
- QGstreamerMediaEncoder(QMediaEncoder *parent);
+ QGstreamerMediaEncoder(QMediaRecorder *parent);
virtual ~QGstreamerMediaEncoder();
QUrl outputLocation() const override;
@@ -90,7 +90,7 @@ public:
private:
bool processBusMessage(const QGstreamerMessage& message) override;
public:
- void setState(QMediaEncoder::State state) override;
+ void setState(QMediaRecorder::RecorderState state) override;
void record();
void pause();
void stop();
@@ -98,7 +98,7 @@ public:
private:
void updateStatus();
- void handleSessionError(QMediaEncoderBase::Error code, const QString &description);
+ void handleSessionError(QMediaRecorder::Error code, const QString &description);
void finalize();
QDir defaultDir() const;
QString generateFileName(const QDir &dir, const QString &ext) const;
diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp b/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp
index 6bb4de423..f89cf36c7 100644
--- a/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp
+++ b/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp
@@ -140,22 +140,22 @@ QMediaFormat::FileFormat QGstreamerFormatInfo::fileFormatForCaps(QGstStructure s
}
-QImageEncoderSettings::FileFormat QGstreamerFormatInfo::imageFormatForCaps(QGstStructure structure)
+QCameraImageCapture::FileFormat QGstreamerFormatInfo::imageFormatForCaps(QGstStructure structure)
{
const char *name = structure.name().data();
if (!strcmp(name, "image/jpeg")) {
- return QImageEncoderSettings::JPEG;
+ return QCameraImageCapture::JPEG;
} else if (!strcmp(name, "image/png")) {
- return QImageEncoderSettings::PNG;
+ return QCameraImageCapture::PNG;
} else if (!strcmp(name, "image/webp")) {
- return QImageEncoderSettings::WebP;
+ return QCameraImageCapture::WebP;
} else if (!strcmp(name, "image/webp")) {
- return QImageEncoderSettings::WebP;
+ return QCameraImageCapture::WebP;
} else if (!strcmp(name, "image/tiff")) {
- return QImageEncoderSettings::Tiff;
+ return QCameraImageCapture::Tiff;
}
- return QImageEncoderSettings::UnspecifiedFormat;
+ return QCameraImageCapture::UnspecifiedFormat;
}
static QPair<QList<QMediaFormat::AudioCodec>, QList<QMediaFormat::VideoCodec>> getCodecsList(bool decode)
@@ -266,9 +266,9 @@ QList<QGstreamerFormatInfo::CodecMap> QGstreamerFormatInfo::getMuxerList(bool de
return muxers;
}
-static QList<QImageEncoderSettings::FileFormat> getImageFormatList()
+static QList<QCameraImageCapture::FileFormat> getImageFormatList()
{
- QSet<QImageEncoderSettings::FileFormat> formats;
+ QSet<QCameraImageCapture::FileFormat> formats;
GList *elementList = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_ENCODER,
GST_RANK_MARGINAL);
@@ -289,7 +289,7 @@ static QList<QImageEncoderSettings::FileFormat> getImageFormatList()
for (int i = 0; i < caps.size(); i++) {
QGstStructure structure = caps.at(i);
auto f = QGstreamerFormatInfo::imageFormatForCaps(structure);
- if (f != QImageEncoderSettings::UnspecifiedFormat) {
+ if (f != QCameraImageCapture::UnspecifiedFormat) {
// qDebug() << structure.toString() << f;
formats.insert(f);
}
diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h b/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h
index d198b4fff..47d0f133a 100644
--- a/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h
+++ b/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h
@@ -71,7 +71,7 @@ public:
static QMediaFormat::AudioCodec audioCodecForCaps(QGstStructure structure);
static QMediaFormat::VideoCodec videoCodecForCaps(QGstStructure structure);
static QMediaFormat::FileFormat fileFormatForCaps(QGstStructure structure);
- static QImageEncoderSettings::FileFormat imageFormatForCaps(QGstStructure structure);
+ static QCameraImageCapture::FileFormat imageFormatForCaps(QGstStructure structure);
QList<CodecMap> getMuxerList(bool demuxer, QList<QMediaFormat::AudioCodec> audioCodecs, QList<QMediaFormat::VideoCodec> videoCodecs);
};
diff --git a/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp b/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp
index dc83ffcda..06a0f6af8 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
@@ -94,7 +96,7 @@ QPlatformCamera *QGstreamerIntegration::createCamera(QCamera *camera)
return new QGstreamerCamera(camera);
}
-QPlatformMediaEncoder *QGstreamerIntegration::createEncoder(QMediaEncoder *encoder)
+QPlatformMediaEncoder *QGstreamerIntegration::createEncoder(QMediaRecorder *encoder)
{
return new QGstreamerMediaEncoder(encoder);
}
@@ -109,4 +111,14 @@ QPlatformVideoSink *QGstreamerIntegration::createVideoSink(QVideoSink *sink)
return new QGstreamerVideoSink(sink);
}
+QPlatformAudioInput *QGstreamerIntegration::createAudioInput(QAudioInput *q)
+{
+ return new QGstreamerAudioInput(q);
+}
+
+QPlatformAudioOutput *QGstreamerIntegration::createAudioOutput(QAudioOutput *q)
+{
+ return new QGstreamerAudioOutput(q);
+}
+
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h b/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h
index e445cdb82..0bd21ead4 100644
--- a/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h
+++ b/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h
@@ -73,11 +73,14 @@ public:
QPlatformMediaCaptureSession *createCaptureSession() override;
QPlatformMediaPlayer *createPlayer(QMediaPlayer *player) override;
QPlatformCamera *createCamera(QCamera *) override;
- QPlatformMediaEncoder *createEncoder(QMediaEncoder *) override;
+ QPlatformMediaEncoder *createEncoder(QMediaRecorder *) override;
QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *) override;
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/gstreamer/qgstreamermediadevices.cpp b/src/multimedia/platform/gstreamer/qgstreamermediadevices.cpp
index 6be1a3cb9..f66329f5e 100644
--- a/src/multimedia/platform/gstreamer/qgstreamermediadevices.cpp
+++ b/src/multimedia/platform/gstreamer/qgstreamermediadevices.cpp
@@ -99,7 +99,7 @@ QGstreamerMediaDevices::QGstreamerMediaDevices()
}
}
-static QList<QAudioDevice> devicesFromSet(const QSet<GstDevice *> &deviceSet, QAudio::Mode mode)
+static QList<QAudioDevice> devicesFromSet(const QSet<GstDevice *> &deviceSet, QAudioDevice::Mode mode)
{
QList<QAudioDevice> devices;
for (auto *d : deviceSet) {
@@ -124,12 +124,12 @@ static QList<QAudioDevice> devicesFromSet(const QSet<GstDevice *> &deviceSet, QA
QList<QAudioDevice> QGstreamerMediaDevices::audioInputs() const
{
- return devicesFromSet(m_audioSources, QAudio::AudioInput);
+ return devicesFromSet(m_audioSources, QAudioDevice::Input);
}
QList<QAudioDevice> QGstreamerMediaDevices::audioOutputs() const
{
- return devicesFromSet(m_audioSinks, QAudio::AudioOutput);
+ return devicesFromSet(m_audioSinks, QAudioDevice::Output);
}
QList<QCameraDevice> QGstreamerMediaDevices::videoInputs() const
@@ -250,9 +250,9 @@ static GstDevice *getDevice(const QSet<GstDevice *> &devices, const char *key, c
}
-GstDevice *QGstreamerMediaDevices::audioDevice(const QByteArray &id, QAudio::Mode mode) const
+GstDevice *QGstreamerMediaDevices::audioDevice(const QByteArray &id, QAudioDevice::Mode mode) const
{
- const auto devices = (mode == QAudio::AudioOutput) ? m_audioSinks : m_audioSources;
+ const auto devices = (mode == QAudioDevice::Output) ? m_audioSinks : m_audioSources;
return getDevice(devices, "sysfs.path", id);
}
diff --git a/src/multimedia/platform/gstreamer/qgstreamermediadevices_p.h b/src/multimedia/platform/gstreamer/qgstreamermediadevices_p.h
index c00d66209..e3f34433f 100644
--- a/src/multimedia/platform/gstreamer/qgstreamermediadevices_p.h
+++ b/src/multimedia/platform/gstreamer/qgstreamermediadevices_p.h
@@ -54,7 +54,7 @@
#include <private/qplatformmediadevices_p.h>
#include <gst/gst.h>
#include <qset.h>
-#include <qaudio.h>
+#include <qaudiodevice.h>
QT_BEGIN_NAMESPACE
@@ -72,7 +72,7 @@ public:
void addDevice(GstDevice *);
void removeDevice(GstDevice *);
- GstDevice *audioDevice(const QByteArray &id, QAudio::Mode mode) const;
+ GstDevice *audioDevice(const QByteArray &id, QAudioDevice::Mode mode) const;
GstDevice *videoDevice(const QByteArray &id) const;
private:
diff --git a/src/multimedia/platform/pulseaudio/qaudioengine_pulse.cpp b/src/multimedia/platform/pulseaudio/qaudioengine_pulse.cpp
index 9b1cecbcf..cc7fdb1d4 100644
--- a/src/multimedia/platform/pulseaudio/qaudioengine_pulse.cpp
+++ b/src/multimedia/platform/pulseaudio/qaudioengine_pulse.cpp
@@ -124,7 +124,7 @@ static void sinkInfoCallback(pa_context *context, const pa_sink_info *info, int
QWriteLocker locker(&pulseEngine->m_sinkLock);
bool isDefault = pulseEngine->m_defaultSink == info->name;
- auto *dinfo = new QPulseAudioDeviceInfo(info->name, info->description, isDefault, QAudio::AudioOutput);
+ auto *dinfo = new QPulseAudioDeviceInfo(info->name, info->description, isDefault, QAudioDevice::Output);
pulseEngine->m_sinks.insert(info->index, dinfo->create());
}
@@ -162,7 +162,7 @@ static void sourceInfoCallback(pa_context *context, const pa_source_info *info,
if (info->monitor_of_sink != PA_INVALID_INDEX)
return;
bool isDefault = pulseEngine->m_defaultSink == info->name;
- auto *dinfo = new QPulseAudioDeviceInfo(info->name, info->description, isDefault, QAudio::AudioInput);
+ auto *dinfo = new QPulseAudioDeviceInfo(info->name, info->description, isDefault, QAudioDevice::Input);
pulseEngine->m_sources.insert(info->index, dinfo->create());
}
@@ -448,14 +448,14 @@ QPulseAudioEngine *QPulseAudioEngine::instance()
return pulseEngine();
}
-QList<QAudioDevice> QPulseAudioEngine::availableDevices(QAudio::Mode mode) const
+QList<QAudioDevice> QPulseAudioEngine::availableDevices(QAudioDevice::Mode mode) const
{
QList<QAudioDevice> devices;
QByteArray defaultDevice;
m_serverLock.lockForRead();
- if (mode == QAudio::AudioOutput) {
+ if (mode == QAudioDevice::Output) {
QReadLocker locker(&m_sinkLock);
devices = m_sinks.values();
defaultDevice = m_defaultSink;
@@ -470,9 +470,9 @@ QList<QAudioDevice> QPulseAudioEngine::availableDevices(QAudio::Mode mode) const
return devices;
}
-QByteArray QPulseAudioEngine::defaultDevice(QAudio::Mode mode) const
+QByteArray QPulseAudioEngine::defaultDevice(QAudioDevice::Mode mode) const
{
- return (mode == QAudio::AudioOutput) ? m_defaultSink : m_defaultSource;
+ return (mode == QAudioDevice::Output) ? m_defaultSink : m_defaultSource;
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/pulseaudio/qaudioengine_pulse_p.h b/src/multimedia/platform/pulseaudio/qaudioengine_pulse_p.h
index 9f11e8ca3..c384d274b 100644
--- a/src/multimedia/platform/pulseaudio/qaudioengine_pulse_p.h
+++ b/src/multimedia/platform/pulseaudio/qaudioengine_pulse_p.h
@@ -90,8 +90,8 @@ public:
pa_threaded_mainloop_wait(m_mainLoop);
}
- QList<QAudioDevice> availableDevices(QAudio::Mode mode) const;
- QByteArray defaultDevice(QAudio::Mode mode) const;
+ QList<QAudioDevice> availableDevices(QAudioDevice::Mode mode) const;
+ QByteArray defaultDevice(QAudioDevice::Mode mode) const;
Q_SIGNALS:
void contextFailed();
diff --git a/src/multimedia/platform/pulseaudio/qpulseaudiodevice.cpp b/src/multimedia/platform/pulseaudio/qpulseaudiodevice.cpp
index d624de847..df161ab18 100644
--- a/src/multimedia/platform/pulseaudio/qpulseaudiodevice.cpp
+++ b/src/multimedia/platform/pulseaudio/qpulseaudiodevice.cpp
@@ -43,7 +43,7 @@
QT_BEGIN_NAMESPACE
-QPulseAudioDeviceInfo::QPulseAudioDeviceInfo(const char *device, const char *desc, bool isDef, QAudio::Mode mode)
+QPulseAudioDeviceInfo::QPulseAudioDeviceInfo(const char *device, const char *desc, bool isDef, QAudioDevice::Mode mode)
: QAudioDevicePrivate(device, mode)
{
description = QString::fromUtf8(desc);
diff --git a/src/multimedia/platform/pulseaudio/qpulseaudiodevice_p.h b/src/multimedia/platform/pulseaudio/qpulseaudiodevice_p.h
index 59e013167..111134614 100644
--- a/src/multimedia/platform/pulseaudio/qpulseaudiodevice_p.h
+++ b/src/multimedia/platform/pulseaudio/qpulseaudiodevice_p.h
@@ -65,7 +65,7 @@ QT_BEGIN_NAMESPACE
class QPulseAudioDeviceInfo : public QAudioDevicePrivate
{
public:
- QPulseAudioDeviceInfo(const char *device, const char *description, bool isDefault, QAudio::Mode mode);
+ QPulseAudioDeviceInfo(const char *device, const char *description, bool isDefault, QAudioDevice::Mode mode);
~QPulseAudioDeviceInfo() {}
};
diff --git a/src/multimedia/platform/pulseaudio/qpulseaudiomediadevices.cpp b/src/multimedia/platform/pulseaudio/qpulseaudiomediadevices.cpp
index c847592ec..4c3c561b4 100644
--- a/src/multimedia/platform/pulseaudio/qpulseaudiomediadevices.cpp
+++ b/src/multimedia/platform/pulseaudio/qpulseaudiomediadevices.cpp
@@ -56,12 +56,12 @@ QPulseAudioMediaDevices::QPulseAudioMediaDevices(QPulseAudioEngine *engine)
QList<QAudioDevice> QPulseAudioMediaDevices::audioInputs() const
{
- return pulseEngine->availableDevices(QAudio::AudioInput);
+ return pulseEngine->availableDevices(QAudioDevice::Input);
}
QList<QAudioDevice> QPulseAudioMediaDevices::audioOutputs() const
{
- return pulseEngine->availableDevices(QAudio::AudioOutput);
+ return pulseEngine->availableDevices(QAudioDevice::Output);
}
QList<QCameraDevice> QPulseAudioMediaDevices::videoInputs() const
diff --git a/src/multimedia/platform/qnx/audio/qnxaudioutils.cpp b/src/multimedia/platform/qnx/audio/qnxaudioutils.cpp
index aef4492d8..7aa31e408 100644
--- a/src/multimedia/platform/qnx/audio/qnxaudioutils.cpp
+++ b/src/multimedia/platform/qnx/audio/qnxaudioutils.cpp
@@ -41,11 +41,11 @@
QT_BEGIN_NAMESPACE
-snd_pcm_channel_params_t QnxAudioUtils::formatToChannelParams(const QAudioFormat &format, QAudio::Mode mode, int fragmentSize)
+snd_pcm_channel_params_t QnxAudioUtils::formatToChannelParams(const QAudioFormat &format, QAudioDevice::Mode mode, int fragmentSize)
{
snd_pcm_channel_params_t params;
memset(&params, 0, sizeof(params));
- params.channel = (mode == QAudio::AudioOutput) ? SND_PCM_CHANNEL_PLAYBACK : SND_PCM_CHANNEL_CAPTURE;
+ params.channel = (mode == QAudioDevice::Output) ? SND_PCM_CHANNEL_PLAYBACK : SND_PCM_CHANNEL_CAPTURE;
params.mode = SND_PCM_MODE_BLOCK;
params.start_mode = SND_PCM_START_DATA;
params.stop_mode = SND_PCM_STOP_ROLLOVER;
diff --git a/src/multimedia/platform/qnx/audio/qnxaudioutils_p.h b/src/multimedia/platform/qnx/audio/qnxaudioutils_p.h
index 0696d986e..d8e454de2 100644
--- a/src/multimedia/platform/qnx/audio/qnxaudioutils_p.h
+++ b/src/multimedia/platform/qnx/audio/qnxaudioutils_p.h
@@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE
namespace QnxAudioUtils
{
- snd_pcm_channel_params_t formatToChannelParams(const QAudioFormat &format, QAudio::Mode mode, int fragmentSize);
+ snd_pcm_channel_params_t formatToChannelParams(const QAudioFormat &format, QAudioDevice::Mode mode, int fragmentSize);
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/qnx/audio/qqnxaudiodevice.cpp b/src/multimedia/platform/qnx/audio/qqnxaudiodevice.cpp
index 4d1d0f76f..ff7d23192 100644
--- a/src/multimedia/platform/qnx/audio/qqnxaudiodevice.cpp
+++ b/src/multimedia/platform/qnx/audio/qqnxaudiodevice.cpp
@@ -45,7 +45,7 @@
QT_BEGIN_NAMESPACE
-QnxAudioDeviceInfo::QnxAudioDeviceInfo(const QByteArray &deviceName, QAudio::Mode mode)
+QnxAudioDeviceInfo::QnxAudioDeviceInfo(const QByteArray &deviceName, QAudioDevice::Mode mode)
: QAudioDevicePrivate(deviceName, mode)
{
}
@@ -62,14 +62,14 @@ QAudioFormat QnxAudioDeviceInfo::preferredFormat() const
format.setSampleType(QAudioFormat::SignedInt);
format.setSampleSize(16);
format.setChannelCount(2);
- if(mode == QAudio::AudioInput && !isFormatSupported(format))
+ if(mode == QAudioDevice::Input && !isFormatSupported(format))
format.setChannelCount(1);
return format;
}
bool QnxAudioDeviceInfo::isFormatSupported(const QAudioFormat &format) const
{
- const int pcmMode = (mode == QAudio::AudioOutput) ? SND_PCM_OPEN_PLAYBACK : SND_PCM_OPEN_CAPTURE;
+ const int pcmMode = (mode == QAudioDevice::Output) ? SND_PCM_OPEN_PLAYBACK : SND_PCM_OPEN_CAPTURE;
snd_pcm_t *handle;
int card = 0;
@@ -79,7 +79,7 @@ bool QnxAudioDeviceInfo::isFormatSupported(const QAudioFormat &format) const
snd_pcm_channel_info_t info;
memset (&info, 0, sizeof(info));
- info.channel = (mode == QAudio::AudioOutput) ? SND_PCM_CHANNEL_PLAYBACK : SND_PCM_CHANNEL_CAPTURE;
+ info.channel = (mode == QAudioDevice::Output) ? SND_PCM_CHANNEL_PLAYBACK : SND_PCM_CHANNEL_CAPTURE;
if (snd_pcm_plugin_info(handle, &info) < 0) {
qWarning("QAudioDevice: couldn't get channel info");
diff --git a/src/multimedia/platform/qnx/audio/qqnxaudiodevice_p.h b/src/multimedia/platform/qnx/audio/qqnxaudiodevice_p.h
index e3039daa5..96e65759a 100644
--- a/src/multimedia/platform/qnx/audio/qqnxaudiodevice_p.h
+++ b/src/multimedia/platform/qnx/audio/qqnxaudiodevice_p.h
@@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE
class QnxAudioDeviceInfo : public QAudioDevicePrivate
{
public:
- QnxAudioDeviceInfo(const QByteArray &deviceName, QAudio::Mode mode);
+ QnxAudioDeviceInfo(const QByteArray &deviceName, QAudioDevice::Mode mode);
~QnxAudioDeviceInfo();
QAudioFormat preferredFormat() const override;
diff --git a/src/multimedia/platform/qnx/audio/qqnxaudiosink.cpp b/src/multimedia/platform/qnx/audio/qqnxaudiosink.cpp
index 7fe70ee9d..d2c1f98c7 100644
--- a/src/multimedia/platform/qnx/audio/qqnxaudiosink.cpp
+++ b/src/multimedia/platform/qnx/audio/qqnxaudiosink.cpp
@@ -278,7 +278,7 @@ bool QQnxAudioSink::open()
return false;
}
- snd_pcm_channel_params_t params = QnxAudioUtils::formatToChannelParams(m_format, QAudio::AudioOutput, info.max_fragment_size);
+ snd_pcm_channel_params_t params = QnxAudioUtils::formatToChannelParams(m_format, QAudioDevice::Output, info.max_fragment_size);
setTypeName(&params);
if ((errorCode = snd_pcm_plugin_params(m_pcmHandle, &params)) < 0) {
diff --git a/src/multimedia/platform/qnx/audio/qqnxaudiosource.cpp b/src/multimedia/platform/qnx/audio/qqnxaudiosource.cpp
index 803c22ff4..b90681a83 100644
--- a/src/multimedia/platform/qnx/audio/qqnxaudiosource.cpp
+++ b/src/multimedia/platform/qnx/audio/qqnxaudiosource.cpp
@@ -267,7 +267,7 @@ bool QQnxAudioSource::open()
return false;
}
- snd_pcm_channel_params_t params = QnxAudioUtils::formatToChannelParams(m_format, QAudio::AudioInput, info.max_fragment_size);
+ snd_pcm_channel_params_t params = QnxAudioUtils::formatToChannelParams(m_format, QAudioDevice::Input, info.max_fragment_size);
if ((errorCode = snd_pcm_plugin_params(m_pcmHandle, &params)) < 0) {
qWarning("QQnxAudioSource: open error, couldn't set channel params (0x%x)", -errorCode);
diff --git a/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol.cpp b/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol.cpp
index 809e30827..cdd4793af 100644
--- a/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol.cpp
+++ b/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol.cpp
@@ -65,7 +65,7 @@ BbCameraMediaRecorderControl::BbCameraMediaRecorderControl(BbCameraSession *sess
: QPlatformMediaEncoder(parent)
, m_session(session)
{
- connect(m_session, SIGNAL(videoStateChanged(QMediaRecorder::State)), this, SIGNAL(stateChanged(QMediaRecorder::State)));
+ connect(m_session, SIGNAL(videoStateChanged(QMediaRecorder::RecorderState)), this, SIGNAL(stateChanged(QMediaRecorder::RecorderState)));
connect(m_session, SIGNAL(videoStatusChanged(QMediaRecorder::Status)), this, SIGNAL(statusChanged(QMediaRecorder::Status)));
connect(m_session, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64)));
connect(m_session, SIGNAL(actualLocationChanged(QUrl)), this, SIGNAL(actualLocationChanged(QUrl)));
@@ -82,7 +82,7 @@ bool BbCameraMediaRecorderControl::setOutputLocation(const QUrl &location)
return m_session->setOutputLocation(location);
}
-QMediaRecorder::State BbCameraMediaRecorderControl::state() const
+QMediaRecorder::RecorderState BbCameraMediaRecorderControl::state() const
{
return m_session->videoState();
}
@@ -128,7 +128,7 @@ void BbCameraMediaRecorderControl::applySettings()
m_session->applyVideoSettings();
}
-void BbCameraMediaRecorderControl::setState(QMediaRecorder::State state)
+void BbCameraMediaRecorderControl::setState(QMediaRecorder::RecorderState state)
{
m_session->setVideoState(state);
}
diff --git a/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol_p.h b/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol_p.h
index 40de8e474..7b9d11ecc 100644
--- a/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol_p.h
+++ b/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol_p.h
@@ -64,7 +64,7 @@ public:
QUrl outputLocation() const override;
bool setOutputLocation(const QUrl &location) override;
- QMediaRecorder::State state() const override;
+ QMediaRecorder::RecorderState state() const override;
QMediaRecorder::Status status() const override;
qint64 duration() const override;
bool isMuted() const override;
@@ -72,7 +72,7 @@ public:
void applySettings() override;
public Q_SLOTS:
- void setState(QMediaRecorder::State state) override;
+ void setState(QMediaRecorder::RecorderState state) override;
void setMuted(bool muted) override;
void setVolume(qreal volume) override;
diff --git a/src/multimedia/platform/qnx/camera/bbcamerasession.cpp b/src/multimedia/platform/qnx/camera/bbcamerasession.cpp
index 623dce93b..1856fa48c 100644
--- a/src/multimedia/platform/qnx/camera/bbcamerasession.cpp
+++ b/src/multimedia/platform/qnx/camera/bbcamerasession.cpp
@@ -418,17 +418,17 @@ bool BbCameraSession::setOutputLocation(const QUrl &location)
return true;
}
-QMediaRecorder::State BbCameraSession::videoState() const
+QMediaRecorder::RecorderState BbCameraSession::videoState() const
{
return m_videoState;
}
-void BbCameraSession::setVideoState(QMediaRecorder::State state)
+void BbCameraSession::setVideoState(QMediaRecorder::RecorderState state)
{
if (m_videoState == state)
return;
- const QMediaRecorder::State previousState = m_videoState;
+ const QMediaRecorder::RecorderState previousState = m_videoState;
if (previousState == QMediaRecorder::StoppedState) {
if (state == QMediaRecorder::RecordingState) {
diff --git a/src/multimedia/platform/qnx/camera/bbcamerasession_p.h b/src/multimedia/platform/qnx/camera/bbcamerasession_p.h
index c3db06e3a..c92c2ac2d 100644
--- a/src/multimedia/platform/qnx/camera/bbcamerasession_p.h
+++ b/src/multimedia/platform/qnx/camera/bbcamerasession_p.h
@@ -109,8 +109,8 @@ public:
// media recorder control
QUrl outputLocation() const;
bool setOutputLocation(const QUrl &location);
- QMediaRecorder::State videoState() const;
- void setVideoState(QMediaRecorder::State state);
+ QMediaRecorder::RecorderState videoState() const;
+ void setVideoState(QMediaRecorder::RecorderState state);
QMediaRecorder::Status videoStatus() const;
qint64 duration() const;
void applyVideoSettings();
@@ -142,7 +142,7 @@ Q_SIGNALS:
void imageCaptureError(int id, int error, const QString &errorString);
// media recorder control
- void videoStateChanged(QMediaRecorder::State state);
+ void videoStateChanged(QMediaRecorder::RecorderState state);
void videoStatusChanged(QMediaRecorder::Status status);
void durationChanged(qint64 duration);
void actualLocationChanged(const QUrl &location);
@@ -192,7 +192,7 @@ private:
QImageEncoderSettings m_imageEncoderSettings;
QString m_videoOutputLocation;
- QMediaRecorder::State m_videoState;
+ QMediaRecorder::RecorderState m_videoState;
QMediaRecorder::Status m_videoStatus;
QElapsedTimer m_videoRecordingDuration;
diff --git a/src/multimedia/platform/qnx/qqnxdevicemanager.cpp b/src/multimedia/platform/qnx/qqnxdevicemanager.cpp
index 5aad69868..23bc0bcf0 100644
--- a/src/multimedia/platform/qnx/qqnxdevicemanager.cpp
+++ b/src/multimedia/platform/qnx/qqnxdevicemanager.cpp
@@ -96,12 +96,12 @@ QQnxMediaDevices::QQnxMediaDevices()
QList<QAudioDevice> QQnxMediaDevices::audioInputs() const
{
- return { QAudioDevice(new QnxAudioDeviceInfo("default", QAudio::AudioInput)) };
+ return { QAudioDevice(new QnxAudioDeviceInfo("default", QAudioDevice::Input)) };
}
QList<QAudioDevice> QQnxMediaDevices::audioOutputs() const
{
- return { QAudioDevice(new QnxAudioDeviceInfo("default", QAudio::AudioOutput)) };
+ return { QAudioDevice(new QnxAudioDeviceInfo("default", QAudioDevice::Output)) };
}
QList<QCameraDevice> QQnxMediaDevices::videoInputs() const
diff --git a/src/multimedia/recording/qmediaencoder_p.h b/src/multimedia/platform/qplatformaudioinput_p.h
index a2c5e4725..c4e4334b3 100644
--- a/src/multimedia/recording/qmediaencoder_p.h
+++ b/src/multimedia/platform/qplatformaudioinput_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2021 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Toolkit.
@@ -36,9 +36,8 @@
** $QT_END_LICENSE$
**
****************************************************************************/
-
-#ifndef QMEDIAENCODER_P_H
-#define QMEDIAENCODER_P_H
+#ifndef QPLATFORMAUDIOINPUT_H
+#define QPLATFORMAUDIOINPUT_H
//
// W A R N I N G
@@ -51,43 +50,30 @@
// We mean it.
//
-#include "qmediaencoder.h"
-#include "qcamera.h"
-#include <QtCore/qurl.h>
-#include <QtCore/qpointer.h>
+#include <private/qtmultimediaglobal_p.h>
+#include <qaudiodevice.h>
QT_BEGIN_NAMESPACE
-class QPlatformMediaEncoder;
-class QMediaContainerControl;
-class QAudioEncoderSettingsControl;
-class QVideoEncoderSettingsControl;
-class QTimer;
+class QAudioInput;
-class QMediaEncoderPrivate
+class Q_MULTIMEDIA_EXPORT QPlatformAudioInput
{
- Q_DECLARE_PUBLIC(QMediaEncoder)
-
public:
- QMediaEncoderPrivate() = default;
-
- void applySettingsLater();
-
- QMediaCaptureSession *captureSession = nullptr;
- QPlatformMediaEncoder *control = nullptr;
+ QPlatformAudioInput(QAudioInput *qq) : q(qq) {}
+ virtual ~QPlatformAudioInput() {}
- bool settingsChanged = false;
+ virtual void setAudioDevice(const QAudioDevice &/*device*/) {}
+ virtual void setMuted(bool /*muted*/) {}
+ virtual void setVolume(float /*volume*/) {}
- QMediaEncoderSettings encoderSettings;
-
- void _q_applySettings();
-
- QMediaEncoder *q_ptr = nullptr;
+ QAudioInput *q = nullptr;
+ QAudioDevice device;
+ float volume = 1.;
+ bool muted = false;
};
-#undef Q_DECLARE_NON_CONST_PUBLIC
-
QT_END_NAMESPACE
-#endif
+#endif // QPLATFORMAUDIOINPUT_H
diff --git a/src/multimedia/platform/qplatformaudiooutput_p.h b/src/multimedia/platform/qplatformaudiooutput_p.h
new file mode 100644
index 000000000..9979a6d5e
--- /dev/null
+++ b/src/multimedia/platform/qplatformaudiooutput_p.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QPLATFORMAUDIOOUTPUT_H
+#define QPLATFORMAUDIOOUTPUT_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qtmultimediaglobal_p.h>
+#include <qaudiodevice.h>
+
+QT_BEGIN_NAMESPACE
+
+class QAudioOutput;
+
+class Q_MULTIMEDIA_EXPORT QPlatformAudioOutput
+{
+public:
+ QPlatformAudioOutput(QAudioOutput *qq) : q(qq) {}
+ virtual ~QPlatformAudioOutput() {}
+
+ virtual void setAudioDevice(const QAudioDevice &/*device*/) {}
+ virtual void setMuted(bool /*muted*/) {}
+ virtual void setVolume(float /*volume*/) {}
+ virtual void setAudioRole(QAudio::Role /*role*/) {}
+ virtual QList<QAudio::Role> supportedAudioRoles() const { return {}; }
+
+ QAudioOutput *q = nullptr;
+ QAudioDevice device;
+ float volume = 1.;
+ bool muted = false;
+ QAudio::Role role = QAudio::UnknownRole;
+};
+
+QT_END_NAMESPACE
+
+
+#endif // QPLATFORMAUDIOOUTPUT_H
diff --git a/src/multimedia/platform/qplatformcameraimagecapture_p.h b/src/multimedia/platform/qplatformcameraimagecapture_p.h
index b7a12a561..65f96a97d 100644
--- a/src/multimedia/platform/qplatformcameraimagecapture_p.h
+++ b/src/multimedia/platform/qplatformcameraimagecapture_p.h
@@ -53,12 +53,39 @@
#include <QtMultimedia/qcameraimagecapture.h>
#include <QtMultimedia/qmediametadata.h>
+#include <QtMultimedia/qcameraimagecapture.h>
QT_BEGIN_NAMESPACE
class QImage;
class QPlatformMediaCaptureSession;
+class QImageEncoderSettingsPrivate;
+class Q_MULTIMEDIA_EXPORT QImageEncoderSettings
+{
+ QCameraImageCapture::FileFormat m_format = QCameraImageCapture::UnspecifiedFormat;
+ QSize m_resolution;
+ QCameraImageCapture::Quality m_quality = QCameraImageCapture::NormalQuality;
+
+public:
+ bool operator==(const QImageEncoderSettings &other) {
+ return m_format == other.m_format &&
+ m_resolution == other.m_resolution &&
+ m_quality == other.m_quality;
+ }
+ bool operator!=(const QImageEncoderSettings &other) { return !operator==(other); }
+
+ QCameraImageCapture::FileFormat format() const { return m_format; }
+ void setFormat(QCameraImageCapture::FileFormat f) { m_format = f; }
+
+ QSize resolution() const { return m_resolution; }
+ void setResolution(const QSize &s) { m_resolution = s; }
+ void setResolution(int width, int height) { m_resolution = QSize(width, height); }
+
+ QCameraImageCapture::Quality quality() const { return m_quality; }
+ void setQuality(QCameraImageCapture::Quality quality) { m_quality = quality; }
+};
+
class Q_MULTIMEDIA_EXPORT QPlatformCameraImageCapture : public QObject
{
Q_OBJECT
diff --git a/src/multimedia/platform/qplatformmediacapture.cpp b/src/multimedia/platform/qplatformmediacapture.cpp
index 56c3e0719..b041f69db 100644
--- a/src/multimedia/platform/qplatformmediacapture.cpp
+++ b/src/multimedia/platform/qplatformmediacapture.cpp
@@ -40,14 +40,12 @@
#include <qtmultimediaglobal_p.h>
#include "qplatformmediacapture_p.h"
#include "qaudiodevice.h"
+#include "qaudioinput.h"
QT_BEGIN_NAMESPACE
-QPlatformMediaCaptureSession::~QPlatformMediaCaptureSession() = default;
-
-QAudioDevice QPlatformMediaCaptureSession::audioPreview() const
+QPlatformMediaCaptureSession::~QPlatformMediaCaptureSession()
{
- return QAudioDevice();
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/qplatformmediacapture_p.h b/src/multimedia/platform/qplatformmediacapture_p.h
index d8893544d..222a98686 100644
--- a/src/multimedia/platform/qplatformmediacapture_p.h
+++ b/src/multimedia/platform/qplatformmediacapture_p.h
@@ -60,6 +60,8 @@ class QPlatformMediaEncoder;
class QAudioDevice;
class QCameraDevice;
class QVideoSink;
+class QPlatformAudioInput;
+class QPlatformAudioOutput;
class Q_MULTIMEDIA_EXPORT QPlatformMediaCaptureSession : public QObject
{
@@ -77,25 +79,16 @@ public:
virtual QPlatformMediaEncoder *mediaEncoder() = 0;
virtual void setMediaEncoder(QPlatformMediaEncoder *) {}
- virtual bool isMuted() const = 0;
- virtual void setMuted(bool muted) = 0;
- virtual qreal volume() const = 0;
- virtual void setVolume(qreal volume) = 0;
-
- virtual QAudioDevice audioInput() const = 0;
- virtual bool setAudioInput(const QAudioDevice &id) = 0;
+ virtual void setAudioInput(QPlatformAudioInput *input) = 0;
virtual void setVideoPreview(QVideoSink * /*sink*/) {}
- virtual QAudioDevice audioPreview() const;
- virtual bool setAudioPreview(const QAudioDevice &) { return true; }
+
+ virtual void setAudioOutput(QPlatformAudioOutput *) {}
Q_SIGNALS:
- void mutedChanged(bool muted);
- void volumeChanged(qreal volume);
void cameraChanged();
void imageCaptureChanged();
void encoderChanged();
-
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/qplatformmediaencoder.cpp b/src/multimedia/platform/qplatformmediaencoder.cpp
index 944c1d944..3e4e150d7 100644
--- a/src/multimedia/platform/qplatformmediaencoder.cpp
+++ b/src/multimedia/platform/qplatformmediaencoder.cpp
@@ -65,7 +65,7 @@ QT_BEGIN_NAMESPACE
Constructs a media recorder control with the given \a parent.
*/
-QPlatformMediaEncoder::QPlatformMediaEncoder(QMediaEncoder *parent)
+QPlatformMediaEncoder::QPlatformMediaEncoder(QMediaRecorder *parent)
: q(parent)
{
}
@@ -90,7 +90,7 @@ QPlatformMediaEncoder::QPlatformMediaEncoder(QMediaEncoder *parent)
*/
/*!
- \fn QMediaRecorder::State QPlatformMediaEncoder::state() const
+ \fn QMediaRecorder::RecorderState QPlatformMediaEncoder::state() const
Return the current recording state.
*/
@@ -108,7 +108,7 @@ QPlatformMediaEncoder::QPlatformMediaEncoder(QMediaEncoder *parent)
*/
/*!
- \fn void QPlatformMediaEncoder::setState(QMediaRecorder::State state)
+ \fn void QPlatformMediaEncoder::setState(QMediaRecorder::RecorderState state)
Set the media recorder \a state.
*/
@@ -127,16 +127,16 @@ QPlatformMediaEncoder::QPlatformMediaEncoder(QMediaEncoder *parent)
*/
/*!
- \fn void QPlatformMediaEncoder::stateChanged(QMediaRecorder::State state)
+ \fn void QPlatformMediaEncoder::stateChanged(QMediaRecorder::RecorderState state)
Signals that the \a state of a media recorder has changed.
*/
-void QPlatformMediaEncoder::stateChanged(QMediaEncoder::State state)
+void QPlatformMediaEncoder::stateChanged(QMediaRecorder::RecorderState state)
{
if (m_state == state)
return;
m_state = state;
- emit q->stateChanged(state);
+ emit q->recorderStateChanged(state);
}
/*!
@@ -144,7 +144,7 @@ void QPlatformMediaEncoder::stateChanged(QMediaEncoder::State state)
Signals that the \a status of a media recorder has changed.
*/
-void QPlatformMediaEncoder::statusChanged(QMediaEncoder::Status status)
+void QPlatformMediaEncoder::statusChanged(QMediaRecorder::Status status)
{
if (m_status == status)
return;
@@ -183,13 +183,13 @@ void QPlatformMediaEncoder::actualLocationChanged(const QUrl &location)
Signals that an \a error has occurred. The \a errorString describes the error.
*/
-void QPlatformMediaEncoder::error(QMediaEncoderBase::Error error, const QString &errorString)
+void QPlatformMediaEncoder::error(QMediaRecorder::Error error, const QString &errorString)
{
if (error == m_error && errorString == m_errorString)
return;
m_error = error;
m_errorString = errorString;
- if (error != QMediaEncoder::NoError)
+ if (error != QMediaRecorder::NoError)
emit q->errorOccurred(error, errorString);
emit q->errorChanged();
}
diff --git a/src/multimedia/platform/qplatformmediaencoder_p.h b/src/multimedia/platform/qplatformmediaencoder_p.h
index b535636bd..102842dc1 100644
--- a/src/multimedia/platform/qplatformmediaencoder_p.h
+++ b/src/multimedia/platform/qplatformmediaencoder_p.h
@@ -53,7 +53,7 @@
#include <QtCore/qurl.h>
-#include <QtMultimedia/qmediaencoder.h>
+#include <QtMultimedia/qmediarecorder.h>
#include <QtMultimedia/qmediametadata.h>
QT_BEGIN_NAMESPACE
@@ -73,10 +73,10 @@ public:
virtual QUrl outputLocation() const = 0;
virtual bool setOutputLocation(const QUrl &location) = 0;
- virtual QMediaEncoder::State state() const { return m_state; }
- virtual void setState(QMediaEncoder::State state) = 0;
+ virtual QMediaRecorder::RecorderState state() const { return m_state; }
+ virtual void setState(QMediaRecorder::RecorderState state) = 0;
- virtual QMediaEncoder::Status status() const { return m_status; }
+ virtual QMediaRecorder::Status status() const { return m_status; }
virtual qint64 duration() const = 0;
@@ -86,30 +86,30 @@ public:
virtual void setMetaData(const QMediaMetaData &) {}
virtual QMediaMetaData metaData() const { return {}; }
- QMediaEncoder::Error error() const { return m_error;}
+ QMediaRecorder::Error error() const { return m_error;}
QString errorString() const { return m_errorString; }
QUrl actualLocation() const { return m_actualLocation; }
void clearActualLocation() { m_actualLocation.clear(); }
- void clearError() { error(QMediaEncoder::NoError, QString()); }
+ void clearError() { error(QMediaRecorder::NoError, QString()); }
protected:
- explicit QPlatformMediaEncoder(QMediaEncoder *parent);
+ explicit QPlatformMediaEncoder(QMediaRecorder *parent);
- void stateChanged(QMediaEncoder::State state);
- void statusChanged(QMediaEncoder::Status status);
+ void stateChanged(QMediaRecorder::RecorderState state);
+ void statusChanged(QMediaRecorder::Status status);
void durationChanged(qint64 position);
void actualLocationChanged(const QUrl &location);
- void error(QMediaEncoder::Error error, const QString &errorString);
+ void error(QMediaRecorder::Error error, const QString &errorString);
void metaDataChanged();
private:
- QMediaEncoder *q = nullptr;
- QMediaEncoder::Error m_error = QMediaEncoder::NoError;
+ QMediaRecorder *q = nullptr;
+ QMediaRecorder::Error m_error = QMediaRecorder::NoError;
QString m_errorString;
QUrl m_actualLocation;
- QMediaEncoder::State m_state = QMediaEncoder::StoppedState;
- QMediaEncoder::Status m_status = QMediaEncoder::StoppedStatus;
+ QMediaRecorder::RecorderState m_state = QMediaRecorder::StoppedState;
+ QMediaRecorder::Status m_status = QMediaRecorder::StoppedStatus;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/qplatformmediaformatinfo_p.h b/src/multimedia/platform/qplatformmediaformatinfo_p.h
index a1b93f5f4..984065b17 100644
--- a/src/multimedia/platform/qplatformmediaformatinfo_p.h
+++ b/src/multimedia/platform/qplatformmediaformatinfo_p.h
@@ -53,6 +53,7 @@
#include <private/qtmultimediaglobal_p.h>
#include <qmediaencodersettings.h>
+#include <qcameraimagecapture.h>
QT_BEGIN_NAMESPACE
@@ -76,7 +77,7 @@ public:
QList<CodecMap> encoders;
QList<CodecMap> decoders;
- QList<QImageEncoderSettings::FileFormat> imageFormats;
+ QList<QCameraImageCapture::FileFormat> imageFormats;
};
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 36a6e0955..9d28a9528 100644
--- a/src/multimedia/platform/qplatformmediaintegration_p.h
+++ b/src/multimedia/platform/qplatformmediaintegration_p.h
@@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE
class QMediaPlayer;
class QAudioDecoder;
class QCamera;
-class QMediaEncoder;
+class QMediaRecorder;
class QCameraImageCapture;
class QMediaDevices;
class QPlatformMediaDevices;
@@ -72,6 +72,10 @@ class QPlatformMediaFormatInfo;
class QObject;
class QPlatformVideoSink;
class QVideoSink;
+class QAudioInput;
+class QAudioOutput;
+class QPlatformAudioInput;
+class QPlatformAudioOutput;
class Q_MULTIMEDIA_EXPORT QPlatformMediaIntegration
{
@@ -89,9 +93,12 @@ public:
virtual QPlatformMediaCaptureSession *createCaptureSession() { return nullptr; }
virtual QPlatformMediaPlayer *createPlayer(QMediaPlayer *) { return nullptr; }
virtual QPlatformCamera *createCamera(QCamera *) { return nullptr; }
- virtual QPlatformMediaEncoder *createEncoder(QMediaEncoder *) { return nullptr; }
+ virtual QPlatformMediaEncoder *createEncoder(QMediaRecorder *) { return nullptr; }
virtual QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *) { return nullptr; }
+ virtual QPlatformAudioInput *createAudioInput(QAudioInput *);
+ virtual QPlatformAudioOutput *createAudioOutput(QAudioOutput *);
+
virtual QPlatformVideoSink *createVideoSink(QVideoSink *) { return nullptr; }
};
diff --git a/src/multimedia/platform/qplatformmediaplayer_p.h b/src/multimedia/platform/qplatformmediaplayer_p.h
index d32e6ee6d..542c87b39 100644
--- a/src/multimedia/platform/qplatformmediaplayer_p.h
+++ b/src/multimedia/platform/qplatformmediaplayer_p.h
@@ -61,6 +61,7 @@
QT_BEGIN_NAMESPACE
class QMediaStreamsControl;
+class QPlatformAudioOutput;
class Q_MULTIMEDIA_EXPORT QPlatformMediaPlayer
{
@@ -74,12 +75,6 @@ public:
virtual qint64 position() const = 0;
virtual void setPosition(qint64 position) = 0;
- virtual int volume() const = 0;
- virtual void setVolume(int volume) = 0;
-
- virtual bool isMuted() const = 0;
- virtual void setMuted(bool mute) = 0;
-
virtual float bufferProgress() const = 0;
virtual bool isAudioAvailable() const = 0;
@@ -100,13 +95,9 @@ public:
virtual void pause() = 0;
virtual void stop() = 0;
- virtual void setAudioRole(QAudio::Role /*role*/) {}
- virtual QList<QAudio::Role> supportedAudioRoles() const { return {}; }
-
virtual bool streamPlaybackSupported() const { return false; }
- virtual bool setAudioOutput(const QAudioDevice &) { return false; }
- virtual QAudioDevice audioOutput() const { return QAudioDevice(); }
+ virtual void setAudioOutput(QPlatformAudioOutput *) {}
virtual QMediaMetaData metaData() const { return {}; }
@@ -124,8 +115,6 @@ public:
void positionChanged(qint64 position) { player->positionChanged(position); }
void audioAvailableChanged(bool audioAvailable) { player->hasAudioChanged(audioAvailable); }
void videoAvailableChanged(bool videoAvailable) { player->hasVideoChanged(videoAvailable); }
- void volumeChanged(int volume) { player->volumeChanged(volume); }
- void mutedChanged(bool mute) { player->mutedChanged(mute); }
void seekableChanged(bool seekable) { player->seekableChanged(seekable); }
void playbackRateChanged(qreal rate) { player->playbackRateChanged(rate); }
void bufferProgressChanged(float progress) { player->bufferProgressChanged(progress); }
diff --git a/src/multimedia/platform/windows/audio/qwindowsaudiodevice.cpp b/src/multimedia/platform/windows/audio/qwindowsaudiodevice.cpp
index 9ba7a2965..4c8f3814b 100644
--- a/src/multimedia/platform/windows/audio/qwindowsaudiodevice.cpp
+++ b/src/multimedia/platform/windows/audio/qwindowsaudiodevice.cpp
@@ -57,7 +57,7 @@
#include "qwindowsaudioutils_p.h"
-QWindowsAudioDeviceInfo::QWindowsAudioDeviceInfo(QByteArray dev, int waveID, const QString &description, QAudio::Mode mode)
+QWindowsAudioDeviceInfo::QWindowsAudioDeviceInfo(QByteArray dev, int waveID, const QString &description, QAudioDevice::Mode mode)
: QAudioDevicePrivate(dev, mode),
devId(waveID)
{
@@ -68,7 +68,7 @@ QWindowsAudioDeviceInfo::QWindowsAudioDeviceInfo(QByteArray dev, int waveID, con
DWORD fmt = 0;
- if(mode == QAudio::AudioOutput) {
+ if(mode == QAudioDevice::Output) {
WAVEOUTCAPS woc;
if (waveOutGetDevCaps(devId, &woc, sizeof(WAVEOUTCAPS)) == MMSYSERR_NOERROR)
fmt = woc.dwFormats;
@@ -214,7 +214,7 @@ bool QWindowsAudioDeviceInfo::testSettings(const QAudioFormat& format) const
WAVEFORMATEXTENSIBLE wfx;
if (qt_convertFormat(format, &wfx)) {
// query only, do not open device
- if (mode == QAudio::AudioOutput) {
+ if (mode == QAudioDevice::Output) {
return (waveOutOpen(NULL, UINT_PTR(devId), &wfx.Format, 0, 0,
WAVE_FORMAT_QUERY) == MMSYSERR_NOERROR);
} else { // AudioInput
diff --git a/src/multimedia/platform/windows/audio/qwindowsaudiodevice_p.h b/src/multimedia/platform/windows/audio/qwindowsaudiodevice_p.h
index 475296e12..7d55a5820 100644
--- a/src/multimedia/platform/windows/audio/qwindowsaudiodevice_p.h
+++ b/src/multimedia/platform/windows/audio/qwindowsaudiodevice_p.h
@@ -70,7 +70,7 @@ const unsigned int SAMPLE_RATES[] = { 8000, 11025, 22050, 44100, 48000 };
class QWindowsAudioDeviceInfo : public QAudioDevicePrivate
{
public:
- QWindowsAudioDeviceInfo(QByteArray dev, int waveID, const QString &description, QAudio::Mode mode);
+ QWindowsAudioDeviceInfo(QByteArray dev, int waveID, const QString &description, QAudioDevice::Mode mode);
~QWindowsAudioDeviceInfo();
bool open();
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscamera.cpp b/src/multimedia/platform/windows/mediacapture/qwindowscamera.cpp
index 1c2230f6c..8be1ab1e1 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowscamera.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowscamera.cpp
@@ -39,7 +39,7 @@
#include "qwindowscamera_p.h"
-#include "qwindowscamerasession_p.h"
+#include "qwindowsmediadevicesession_p.h"
#include "qwindowsmediacapture_p.h"
#include <qcameradevice.h>
@@ -61,11 +61,11 @@ void QWindowsCamera::setActive(bool active)
{
if (m_active == active)
return;
- if (m_cameraInfo.isNull() && active)
+ if (m_cameraDevice.isNull() && active)
return;
m_active = active;
- if (m_cameraSession)
- m_cameraSession->setActive(active);
+ if (m_mediaDeviceSession)
+ m_mediaDeviceSession->setActive(active);
emit activeChanged(m_active);
updateStatus();
@@ -73,13 +73,13 @@ void QWindowsCamera::setActive(bool active)
QCamera::Status QWindowsCamera::status() const
{
- if (!m_cameraSession)
+ if (!m_mediaDeviceSession)
return QCamera::InactiveStatus;
if (m_active)
- return m_cameraSession->isActive() ? QCamera::ActiveStatus : QCamera::StartingStatus;
+ return m_mediaDeviceSession->isActive() ? QCamera::ActiveStatus : QCamera::StartingStatus;
- return m_cameraSession->isActive() ? QCamera::StoppingStatus : QCamera::InactiveStatus;
+ return m_mediaDeviceSession->isActive() ? QCamera::StoppingStatus : QCamera::InactiveStatus;
}
void QWindowsCamera::updateStatus()
@@ -94,11 +94,11 @@ void QWindowsCamera::updateStatus()
void QWindowsCamera::setCamera(const QCameraDevice &camera)
{
- if (m_cameraInfo == camera)
+ if (m_cameraDevice == camera)
return;
- m_cameraInfo = camera;
- if (m_cameraSession)
- m_cameraSession->setActiveCamera(camera);
+ m_cameraDevice = camera;
+ if (m_mediaDeviceSession)
+ m_mediaDeviceSession->setActiveCamera(camera);
}
void QWindowsCamera::setCaptureSession(QPlatformMediaCaptureSession *session)
@@ -107,33 +107,33 @@ void QWindowsCamera::setCaptureSession(QPlatformMediaCaptureSession *session)
if (m_captureService == captureService)
return;
- if (m_cameraSession)
- m_cameraSession->setActive(false);
+ if (m_mediaDeviceSession)
+ m_mediaDeviceSession->setActive(false);
m_captureService = captureService;
if (!m_captureService) {
- m_cameraSession = nullptr;
+ m_mediaDeviceSession = nullptr;
return;
}
- m_cameraSession = m_captureService->session();
- Q_ASSERT(m_cameraSession);
- connect(m_cameraSession, SIGNAL(activeChanged(bool)), SLOT(updateStatus()));
+ m_mediaDeviceSession = m_captureService->session();
+ Q_ASSERT(m_mediaDeviceSession);
+ connect(m_mediaDeviceSession, SIGNAL(activeChanged(bool)), SLOT(updateStatus()));
- m_cameraSession->setActiveCamera(m_cameraInfo);
- m_cameraSession->setCameraFormat(m_cameraFormat);
- m_cameraSession->setActive(m_active);
+ m_mediaDeviceSession->setActiveCamera(m_cameraDevice);
+ m_mediaDeviceSession->setCameraFormat(m_cameraFormat);
+ m_mediaDeviceSession->setActive(m_active);
}
bool QWindowsCamera::setCameraFormat(const QCameraFormat &format)
{
- if (!format.isNull() && !m_cameraInfo.videoFormats().contains(format))
+ if (!format.isNull() && !m_cameraDevice.videoFormats().contains(format))
return false;
- m_cameraFormat = format.isNull() ? findBestCameraFormat(m_cameraInfo) : format;
+ m_cameraFormat = format.isNull() ? findBestCameraFormat(m_cameraDevice) : format;
- if (m_cameraSession)
- m_cameraSession->setCameraFormat(m_cameraFormat);
+ if (m_mediaDeviceSession)
+ m_mediaDeviceSession->setCameraFormat(m_cameraFormat);
return true;
}
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscamera_p.h b/src/multimedia/platform/windows/mediacapture/qwindowscamera_p.h
index 2a408d7bd..1665c492d 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowscamera_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowscamera_p.h
@@ -56,7 +56,7 @@
QT_BEGIN_NAMESPACE
class QWindowsMediaCaptureService;
-class QWindowsCameraSession;
+class QWindowsMediaDeviceSession;
class QWindowsCamera : public QPlatformCamera
{
@@ -81,8 +81,8 @@ private Q_SLOTS:
private:
QWindowsMediaCaptureService *m_captureService = nullptr;
- QWindowsCameraSession *m_cameraSession = nullptr;
- QCameraDevice m_cameraInfo;
+ QWindowsMediaDeviceSession *m_mediaDeviceSession = nullptr;
+ QCameraDevice m_cameraDevice;
QCameraFormat m_cameraFormat;
QCamera::Status m_lastStatus = QCamera::InactiveStatus;
bool m_active = false;
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture.cpp b/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture.cpp
index 114ebb17c..b4499d61c 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture.cpp
@@ -39,7 +39,7 @@
#include "qwindowscameraimagecapture_p.h"
-#include "qwindowscamerasession_p.h"
+#include "qwindowsmediadevicesession_p.h"
#include "qwindowsmediacapture_p.h"
#include <QtConcurrent/qtconcurrentrun.h>
@@ -56,9 +56,9 @@ QWindowsCameraImageCapture::~QWindowsCameraImageCapture() = default;
bool QWindowsCameraImageCapture::isReadyForCapture() const
{
- if (!m_cameraSession)
+ if (!m_mediaDeviceSession)
return false;
- return !m_capturing && m_cameraSession->isReadyForCapture();
+ return !m_capturing && m_mediaDeviceSession->isActive() && !m_mediaDeviceSession->activeCamera().isNull();
}
int QWindowsCameraImageCapture::capture(const QString &fileName)
@@ -99,22 +99,22 @@ void QWindowsCameraImageCapture::setCaptureSession(QPlatformMediaCaptureSession
if (m_captureService == captureService)
return;
- if (m_cameraSession)
- disconnect(m_cameraSession, nullptr, this, nullptr);
+ if (m_mediaDeviceSession)
+ disconnect(m_mediaDeviceSession, nullptr, this, nullptr);
m_captureService = captureService;
if (!m_captureService) {
- m_cameraSession = nullptr;
+ m_mediaDeviceSession = nullptr;
return;
}
- m_cameraSession = m_captureService->session();
- Q_ASSERT(m_cameraSession);
+ m_mediaDeviceSession = m_captureService->session();
+ Q_ASSERT(m_mediaDeviceSession);
- connect(m_cameraSession, SIGNAL(readyForCaptureChanged(bool)),
+ connect(m_mediaDeviceSession, SIGNAL(readyForCaptureChanged(bool)),
this, SIGNAL(readyForCaptureChanged(bool)));
- connect(m_cameraSession, SIGNAL(newVideoFrame(QVideoFrame)),
+ connect(m_mediaDeviceSession, SIGNAL(newVideoFrame(QVideoFrame)),
this, SLOT(handleNewVideoFrame(QVideoFrame)));
}
@@ -169,21 +169,21 @@ void QWindowsCameraImageCapture::saveImage(int captureId, const QString &fileNam
Q_ARG(int, captureId), Q_ARG(QString, fileName));
}
-QString QWindowsCameraImageCapture::writerFormat(QImageEncoderSettings::FileFormat reqFormat)
+QString QWindowsCameraImageCapture::writerFormat(QCameraImageCapture::FileFormat reqFormat)
{
QString format;
switch (reqFormat) {
- case QImageEncoderSettings::FileFormat::JPEG:
+ case QCameraImageCapture::FileFormat::JPEG:
format = QLatin1String("jpg");
break;
- case QImageEncoderSettings::FileFormat::PNG:
+ case QCameraImageCapture::FileFormat::PNG:
format = QLatin1String("png");
break;
- case QImageEncoderSettings::FileFormat::WebP:
+ case QCameraImageCapture::FileFormat::WebP:
format = QLatin1String("webp");
break;
- case QImageEncoderSettings::FileFormat::Tiff:
+ case QCameraImageCapture::FileFormat::Tiff:
format = QLatin1String("tiff");
break;
default:
@@ -199,21 +199,21 @@ QString QWindowsCameraImageCapture::writerFormat(QImageEncoderSettings::FileForm
}
int QWindowsCameraImageCapture::writerQuality(const QString &writerFormat,
- QImageEncoderSettings::Quality quality)
+ QCameraImageCapture::Quality quality)
{
if (writerFormat.compare(QLatin1String("jpg"), Qt::CaseInsensitive) == 0 ||
writerFormat.compare(QLatin1String("jpeg"), Qt::CaseInsensitive) == 0) {
switch (quality) {
- case QImageEncoderSettings::Quality::VeryLowQuality:
+ case QCameraImageCapture::Quality::VeryLowQuality:
return 10;
- case QImageEncoderSettings::Quality::LowQuality:
+ case QCameraImageCapture::Quality::LowQuality:
return 30;
- case QImageEncoderSettings::Quality::NormalQuality:
+ case QCameraImageCapture::Quality::NormalQuality:
return 75;
- case QImageEncoderSettings::Quality::HighQuality:
+ case QCameraImageCapture::Quality::HighQuality:
return 90;
- case QImageEncoderSettings::Quality::VeryHighQuality:
+ case QCameraImageCapture::Quality::VeryHighQuality:
return 98;
default:
return 75;
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture_p.h b/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture_p.h
index 140d461c5..4cd405454 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture_p.h
@@ -57,7 +57,7 @@
QT_BEGIN_NAMESPACE
-class QWindowsCameraSession;
+class QWindowsMediaDeviceSession;
class QWindowsMediaCaptureService;
class QWindowsCameraImageCapture : public QPlatformCameraImageCapture
@@ -85,12 +85,12 @@ private:
void saveImage(int captureId, const QString &fileName,
const QImage &image, const QMediaMetaData &metaData,
const QImageEncoderSettings &settings);
- QString writerFormat(QImageEncoderSettings::FileFormat reqFormat);
+ QString writerFormat(QCameraImageCapture::FileFormat reqFormat);
int writerQuality(const QString &writerFormat,
- QImageEncoderSettings::Quality quality);
+ QCameraImageCapture::Quality quality);
QWindowsMediaCaptureService *m_captureService = nullptr;
- QWindowsCameraSession *m_cameraSession = nullptr;
+ QWindowsMediaDeviceSession *m_mediaDeviceSession = nullptr;
QImageEncoderSettings m_settings;
QWindowsStorageLocation m_storageLocation;
int m_captureId = 0;
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp
index 86cd1eb56..043e3ac41 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp
@@ -41,21 +41,22 @@
#include "qwindowsmediaencoder_p.h"
#include "qwindowscamera_p.h"
-#include "qwindowscamerasession_p.h"
+#include "qwindowsmediadevicesession_p.h"
#include "qwindowscameraimagecapture_p.h"
#include "qmediadevices.h"
#include "qaudiodevice.h"
+#include "qplatformaudioinput_p.h"
QT_BEGIN_NAMESPACE
QWindowsMediaCaptureService::QWindowsMediaCaptureService()
{
- m_cameraSession = new QWindowsCameraSession(this);
+ m_mediaDeviceSession = new QWindowsMediaDeviceSession(this);
}
QWindowsMediaCaptureService::~QWindowsMediaCaptureService()
{
- delete m_cameraSession;
+ delete m_mediaDeviceSession;
}
QPlatformCamera *QWindowsMediaCaptureService::camera()
@@ -118,44 +119,19 @@ void QWindowsMediaCaptureService::setMediaEncoder(QPlatformMediaEncoder *encoder
emit encoderChanged();
}
-bool QWindowsMediaCaptureService::isMuted() const
+void QWindowsMediaCaptureService::setAudioInput(QPlatformAudioInput *input)
{
- return m_cameraSession->isMuted();
-}
-
-void QWindowsMediaCaptureService::setMuted(bool muted)
-{
- m_cameraSession->setMuted(muted);
-}
-
-qreal QWindowsMediaCaptureService::volume() const
-{
- return m_cameraSession->volume();
-}
-
-void QWindowsMediaCaptureService::setVolume(qreal volume)
-{
- m_cameraSession->setVolume(volume);
-}
-
-QAudioDevice QWindowsMediaCaptureService::audioInput() const
-{
- return m_cameraSession->audioInput();
-}
-
-bool QWindowsMediaCaptureService::setAudioInput(const QAudioDevice &info)
-{
- return m_cameraSession->setAudioInput(info);
+ m_mediaDeviceSession->setAudioInput(input ? input->q : nullptr);
}
void QWindowsMediaCaptureService::setVideoPreview(QVideoSink *sink)
{
- m_cameraSession->setVideoSink(sink);
+ m_mediaDeviceSession->setVideoSink(sink);
}
-QWindowsCameraSession *QWindowsMediaCaptureService::session() const
+QWindowsMediaDeviceSession *QWindowsMediaCaptureService::session() const
{
- return m_cameraSession;
+ return m_mediaDeviceSession;
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h
index d7ecbfe5a..f5da2f498 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h
@@ -57,8 +57,9 @@ QT_BEGIN_NAMESPACE
class QWindowsMediaEncoder;
class QWindowsCamera;
-class QWindowsCameraSession;
+class QWindowsMediaDeviceSession;
class QWindowsCameraImageCapture;
+class QPlatformAudioInput;
class QWindowsMediaCaptureService : public QPlatformMediaCaptureSession
{
@@ -77,20 +78,15 @@ 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;
- QWindowsCameraSession *session() const;
+ QWindowsMediaDeviceSession *session() const;
private:
QWindowsCamera *m_camera = nullptr;
- QWindowsCameraSession *m_cameraSession = nullptr;
+ QWindowsMediaDeviceSession *m_mediaDeviceSession = nullptr;
QWindowsCameraImageCapture *m_imageCapture = nullptr;
QWindowsMediaEncoder *m_encoder = nullptr;
};
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscamerareader.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp
index 3dc969eba..935420170 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowscamerareader.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp
@@ -37,7 +37,7 @@
**
****************************************************************************/
-#include "qwindowscamerareader_p.h"
+#include "qwindowsmediadevicereader_p.h"
#include "qwindowsmultimediautils_p.h"
#include <qvideosink.h>
@@ -50,7 +50,7 @@ QT_BEGIN_NAMESPACE
enum { MEDIA_TYPE_INDEX_DEFAULT = 0xffffffff };
-QWindowsCameraReader::QWindowsCameraReader(QObject *parent)
+QWindowsMediaDeviceReader::QWindowsMediaDeviceReader(QObject *parent)
: QObject(parent),
m_finalizeSemaphore(1)
{
@@ -58,13 +58,13 @@ QWindowsCameraReader::QWindowsCameraReader(QObject *parent)
connect(&m_durationTimer, SIGNAL(timeout()), this, SLOT(updateDuration()));
}
-QWindowsCameraReader::~QWindowsCameraReader()
+QWindowsMediaDeviceReader::~QWindowsMediaDeviceReader()
{
deactivate();
}
// Creates a video or audio media source specified by deviceId (symbolic link)
-HRESULT QWindowsCameraReader::createSource(const QString &deviceId, bool video, IMFMediaSource **source)
+HRESULT QWindowsMediaDeviceReader::createSource(const QString &deviceId, bool video, IMFMediaSource **source)
{
if (!source)
return E_INVALIDARG;
@@ -96,10 +96,10 @@ HRESULT QWindowsCameraReader::createSource(const QString &deviceId, bool video,
// Creates a source/reader aggregating two other sources (video/audio).
// If one of the sources is null the result will be video-only or audio-only.
-HRESULT QWindowsCameraReader::createAggregateReader(IMFMediaSource *firstSource,
- IMFMediaSource *secondSource,
- IMFMediaSource **aggregateSource,
- IMFSourceReader **sourceReader)
+HRESULT QWindowsMediaDeviceReader::createAggregateReader(IMFMediaSource *firstSource,
+ IMFMediaSource *secondSource,
+ IMFMediaSource **aggregateSource,
+ IMFSourceReader **sourceReader)
{
if ((!firstSource && !secondSource) || !aggregateSource || !sourceReader)
return E_INVALIDARG;
@@ -143,7 +143,7 @@ HRESULT QWindowsCameraReader::createAggregateReader(IMFMediaSource *firstSource,
// Selects the requested resolution/frame rate (if specified),
// or chooses a high quality configuration otherwise.
-DWORD QWindowsCameraReader::findMediaTypeIndex(const QCameraFormat &reqFormat)
+DWORD QWindowsMediaDeviceReader::findMediaTypeIndex(const QCameraFormat &reqFormat)
{
DWORD mediaIndex = MEDIA_TYPE_INDEX_DEFAULT;
@@ -202,7 +202,7 @@ DWORD QWindowsCameraReader::findMediaTypeIndex(const QCameraFormat &reqFormat)
// Prepares the source video stream and gets some metadata.
-HRESULT QWindowsCameraReader::prepareVideoStream(DWORD mediaTypeIndex)
+HRESULT QWindowsMediaDeviceReader::prepareVideoStream(DWORD mediaTypeIndex)
{
if (!m_sourceReader)
return E_FAIL;
@@ -261,7 +261,7 @@ HRESULT QWindowsCameraReader::prepareVideoStream(DWORD mediaTypeIndex)
}
// Prepares the source audio stream.
-HRESULT QWindowsCameraReader::prepareAudioStream()
+HRESULT QWindowsMediaDeviceReader::prepareAudioStream()
{
if (!m_sourceReader)
return E_FAIL;
@@ -286,7 +286,7 @@ HRESULT QWindowsCameraReader::prepareAudioStream()
}
// Retrieves the indexes for selected video/audio streams.
-HRESULT QWindowsCameraReader::initSourceIndexes()
+HRESULT QWindowsMediaDeviceReader::initSourceIndexes()
{
if (!m_sourceReader)
return E_FAIL;
@@ -321,9 +321,9 @@ HRESULT QWindowsCameraReader::initSourceIndexes()
// Activates the requested camera/microphone for streaming.
// One of the IDs may be empty for video-only/audio-only.
-bool QWindowsCameraReader::activate(const QString &cameraId,
- const QCameraFormat &cameraFormat,
- const QString &microphoneId)
+bool QWindowsMediaDeviceReader::activate(const QString &cameraId,
+ const QCameraFormat &cameraFormat,
+ const QString &microphoneId)
{
QMutexLocker locker(&m_mutex);
@@ -381,7 +381,7 @@ bool QWindowsCameraReader::activate(const QString &cameraId,
return true;
}
-void QWindowsCameraReader::deactivate()
+void QWindowsMediaDeviceReader::deactivate()
{
stopRecording();
stopStreaming();
@@ -389,14 +389,14 @@ void QWindowsCameraReader::deactivate()
m_streaming = false;
}
-void QWindowsCameraReader::stopStreaming()
+void QWindowsMediaDeviceReader::stopStreaming()
{
QMutexLocker locker(&m_mutex);
releaseResources();
}
// Releases allocated streaming stuff.
-void QWindowsCameraReader::releaseResources()
+void QWindowsMediaDeviceReader::releaseResources()
{
if (m_videoMediaType) {
m_videoMediaType->Release();
@@ -424,8 +424,8 @@ void QWindowsCameraReader::releaseResources()
}
}
-HRESULT QWindowsCameraReader::createVideoMediaType(const GUID &format, UINT32 bitRate, UINT32 width, UINT32 height,
- qreal frameRate, IMFMediaType **mediaType)
+HRESULT QWindowsMediaDeviceReader::createVideoMediaType(const GUID &format, UINT32 bitRate, UINT32 width,
+ UINT32 height, qreal frameRate, IMFMediaType **mediaType)
{
if (!mediaType)
return E_INVALIDARG;
@@ -470,7 +470,7 @@ HRESULT QWindowsCameraReader::createVideoMediaType(const GUID &format, UINT32 bi
return E_FAIL;
}
-HRESULT QWindowsCameraReader::createAudioMediaType(const GUID &format, UINT32 bitRate, IMFMediaType **mediaType)
+HRESULT QWindowsMediaDeviceReader::createAudioMediaType(const GUID &format, UINT32 bitRate, IMFMediaType **mediaType)
{
if (!mediaType)
return E_INVALIDARG;
@@ -496,14 +496,14 @@ HRESULT QWindowsCameraReader::createAudioMediaType(const GUID &format, UINT32 bi
return E_FAIL;
}
-bool QWindowsCameraReader::startRecording(const QString &fileName, const GUID &container,
- const GUID &videoFormat, UINT32 videoBitRate, UINT32 width,
- UINT32 height, qreal frameRate, const GUID &audioFormat,
- UINT32 audioBitRate)
+bool QWindowsMediaDeviceReader::startRecording(const QString &fileName, const GUID &container,
+ const GUID &videoFormat, UINT32 videoBitRate, UINT32 width,
+ UINT32 height, qreal frameRate, const GUID &audioFormat,
+ UINT32 audioBitRate)
{
QMutexLocker locker(&m_mutex);
- if (!m_active || m_recording)
+ if (!m_active || m_recording || (videoFormat == GUID_NULL && audioFormat == GUID_NULL))
return false;
IMFAttributes *writerAttributes = nullptr;
@@ -526,7 +526,7 @@ bool QWindowsCameraReader::startRecording(const QString &fileName, const GUID &c
m_sinkVideoStreamIndex = MF_SINK_WRITER_INVALID_STREAM_INDEX;
m_sinkAudioStreamIndex = MF_SINK_WRITER_INVALID_STREAM_INDEX;
- if (m_videoSource) {
+ if (m_videoSource && videoFormat != GUID_NULL) {
IMFMediaType *targetMediaType = nullptr;
hr = createVideoMediaType(videoFormat, videoBitRate, width, height,
@@ -545,7 +545,7 @@ bool QWindowsCameraReader::startRecording(const QString &fileName, const GUID &c
if (SUCCEEDED(hr)) {
- if (m_audioSource) {
+ if (m_audioSource && audioFormat != GUID_NULL) {
IMFMediaType *targetMediaType = nullptr;
hr = createAudioMediaType(audioFormat, audioBitRate, &targetMediaType);
@@ -588,7 +588,7 @@ bool QWindowsCameraReader::startRecording(const QString &fileName, const GUID &c
return SUCCEEDED(hr);
}
-void QWindowsCameraReader::stopRecording()
+void QWindowsMediaDeviceReader::stopRecording()
{
// The semaphore is used to ensure the video is properly saved
// to disk, e.g, before the app exits. Released on OnFinalize.
@@ -610,7 +610,7 @@ void QWindowsCameraReader::stopRecording()
m_currentDuration = -1;
}
-bool QWindowsCameraReader::pauseRecording()
+bool QWindowsMediaDeviceReader::pauseRecording()
{
if (!m_recording || m_paused)
return false;
@@ -619,7 +619,7 @@ bool QWindowsCameraReader::pauseRecording()
return true;
}
-bool QWindowsCameraReader::resumeRecording()
+bool QWindowsMediaDeviceReader::resumeRecording()
{
if (!m_recording || !m_paused)
return false;
@@ -629,7 +629,7 @@ bool QWindowsCameraReader::resumeRecording()
}
//from IUnknown
-STDMETHODIMP QWindowsCameraReader::QueryInterface(REFIID riid, LPVOID *ppvObject)
+STDMETHODIMP QWindowsMediaDeviceReader::QueryInterface(REFIID riid, LPVOID *ppvObject)
{
if (!ppvObject)
return E_POINTER;
@@ -647,12 +647,12 @@ STDMETHODIMP QWindowsCameraReader::QueryInterface(REFIID riid, LPVOID *ppvObject
return S_OK;
}
-STDMETHODIMP_(ULONG) QWindowsCameraReader::AddRef(void)
+STDMETHODIMP_(ULONG) QWindowsMediaDeviceReader::AddRef(void)
{
return InterlockedIncrement(&m_cRef);
}
-STDMETHODIMP_(ULONG) QWindowsCameraReader::Release(void)
+STDMETHODIMP_(ULONG) QWindowsMediaDeviceReader::Release(void)
{
LONG cRef = InterlockedDecrement(&m_cRef);
if (cRef == 0) {
@@ -661,42 +661,42 @@ STDMETHODIMP_(ULONG) QWindowsCameraReader::Release(void)
return cRef;
}
-UINT32 QWindowsCameraReader::frameWidth() const
+UINT32 QWindowsMediaDeviceReader::frameWidth() const
{
return m_frameWidth;
}
-UINT32 QWindowsCameraReader::frameHeight() const
+UINT32 QWindowsMediaDeviceReader::frameHeight() const
{
return m_frameHeight;
}
-qreal QWindowsCameraReader::frameRate() const
+qreal QWindowsMediaDeviceReader::frameRate() const
{
return m_frameRate;
}
-bool QWindowsCameraReader::isMuted() const
+bool QWindowsMediaDeviceReader::isMuted() const
{
return m_muted;
}
-void QWindowsCameraReader::setMuted(bool muted)
+void QWindowsMediaDeviceReader::setMuted(bool muted)
{
m_muted = muted;
}
-qreal QWindowsCameraReader::volume() const
+qreal QWindowsMediaDeviceReader::volume() const
{
return m_volume;
}
-void QWindowsCameraReader::setVolume(qreal volume)
+void QWindowsMediaDeviceReader::setVolume(qreal volume)
{
m_volume = volume;
}
-void QWindowsCameraReader::updateDuration()
+void QWindowsMediaDeviceReader::updateDuration()
{
if (m_currentDuration >= 0 && m_lastDuration != m_currentDuration) {
m_lastDuration = m_currentDuration;
@@ -705,9 +705,9 @@ void QWindowsCameraReader::updateDuration()
}
//from IMFSourceReaderCallback
-STDMETHODIMP QWindowsCameraReader::OnReadSample(HRESULT hrStatus, DWORD dwStreamIndex,
- DWORD dwStreamFlags, LONGLONG llTimestamp,
- IMFSample *pSample)
+STDMETHODIMP QWindowsMediaDeviceReader::OnReadSample(HRESULT hrStatus, DWORD dwStreamIndex,
+ DWORD dwStreamFlags, LONGLONG llTimestamp,
+ IMFSample *pSample)
{
QMutexLocker locker(&m_mutex);
@@ -821,18 +821,18 @@ STDMETHODIMP QWindowsCameraReader::OnReadSample(HRESULT hrStatus, DWORD dwStream
return S_OK;
}
-STDMETHODIMP QWindowsCameraReader::OnFlush(DWORD)
+STDMETHODIMP QWindowsMediaDeviceReader::OnFlush(DWORD)
{
return S_OK;
}
-STDMETHODIMP QWindowsCameraReader::OnEvent(DWORD, IMFMediaEvent*)
+STDMETHODIMP QWindowsMediaDeviceReader::OnEvent(DWORD, IMFMediaEvent*)
{
return S_OK;
}
//from IMFSinkWriterCallback
-STDMETHODIMP QWindowsCameraReader::OnFinalize(HRESULT)
+STDMETHODIMP QWindowsMediaDeviceReader::OnFinalize(HRESULT)
{
QMutexLocker locker(&m_mutex);
if (m_sinkWriter) {
@@ -844,7 +844,7 @@ STDMETHODIMP QWindowsCameraReader::OnFinalize(HRESULT)
return S_OK;
}
-STDMETHODIMP QWindowsCameraReader::OnMarker(DWORD, LPVOID)
+STDMETHODIMP QWindowsMediaDeviceReader::OnMarker(DWORD, LPVOID)
{
return S_OK;
}
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscamerareader_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h
index 5390ece15..48ddafecb 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowscamerareader_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h
@@ -37,8 +37,8 @@
**
****************************************************************************/
-#ifndef QWINDOWSCAMERAREADER_H
-#define QWINDOWSCAMERAREADER_H
+#ifndef QWINDOWSMEDIADEVICEREADER_H
+#define QWINDOWSMEDIADEVICEREADER_H
//
// W A R N I N G
@@ -67,14 +67,14 @@ QT_BEGIN_NAMESPACE
class QVideoSink;
-class QWindowsCameraReader : public QObject,
+class QWindowsMediaDeviceReader : public QObject,
public IMFSourceReaderCallback,
public IMFSinkWriterCallback
{
Q_OBJECT
public:
- explicit QWindowsCameraReader(QObject *parent = nullptr);
- ~QWindowsCameraReader();
+ explicit QWindowsMediaDeviceReader(QObject *parent = nullptr);
+ ~QWindowsMediaDeviceReader();
//from IUnknown
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObject);
@@ -174,4 +174,4 @@ private:
QT_END_NAMESPACE
-#endif//QWINDOWSCAMERAREADER_H
+#endif // QWINDOWSMEDIADEVICEREADER_H
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscamerasession.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp
index 2cc305c38..1776f9fe9 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowscamerasession.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp
@@ -37,148 +37,157 @@
**
****************************************************************************/
-#include "qwindowscamerasession_p.h"
+#include "qwindowsmediadevicesession_p.h"
-#include "qwindowscamerareader_p.h"
+#include "qwindowsmediadevicereader_p.h"
#include "qwindowsmultimediautils_p.h"
#include <qvideosink.h>
#include <QtCore/qdebug.h>
+#include <qaudioinput.h>
QT_BEGIN_NAMESPACE
-QWindowsCameraSession::QWindowsCameraSession(QObject *parent)
+QWindowsMediaDeviceSession::QWindowsMediaDeviceSession(QObject *parent)
: QObject(parent)
{
- m_cameraReader = new QWindowsCameraReader(this);
- connect(m_cameraReader, SIGNAL(streamingStarted()), this, SLOT(handleStreamingStarted()));
- connect(m_cameraReader, SIGNAL(streamingStopped()), this, SLOT(handleStreamingStopped()));
- connect(m_cameraReader, SIGNAL(streamingError(int)), this, SLOT(handleStreamingError(int)));
- connect(m_cameraReader, SIGNAL(newVideoFrame(QVideoFrame)), this, SLOT(handleNewVideoFrame(QVideoFrame)));
- connect(m_cameraReader, SIGNAL(recordingStarted()), this, SIGNAL(recordingStarted()));
- connect(m_cameraReader, SIGNAL(recordingStopped()), this, SIGNAL(recordingStopped()));
- connect(m_cameraReader, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64)));
+ m_mediaDeviceReader = new QWindowsMediaDeviceReader(this);
+ connect(m_mediaDeviceReader, SIGNAL(streamingStarted()), this, SLOT(handleStreamingStarted()));
+ connect(m_mediaDeviceReader, SIGNAL(streamingStopped()), this, SLOT(handleStreamingStopped()));
+ connect(m_mediaDeviceReader, SIGNAL(streamingError(int)), this, SLOT(handleStreamingError(int)));
+ connect(m_mediaDeviceReader, SIGNAL(newVideoFrame(QVideoFrame)), this, SLOT(handleNewVideoFrame(QVideoFrame)));
+ connect(m_mediaDeviceReader, SIGNAL(recordingStarted()), this, SIGNAL(recordingStarted()));
+ connect(m_mediaDeviceReader, SIGNAL(recordingStopped()), this, SIGNAL(recordingStopped()));
+ connect(m_mediaDeviceReader, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64)));
}
-QWindowsCameraSession::~QWindowsCameraSession()
+QWindowsMediaDeviceSession::~QWindowsMediaDeviceSession()
{
- delete m_cameraReader;
+ delete m_mediaDeviceReader;
}
-bool QWindowsCameraSession::isActive() const
+bool QWindowsMediaDeviceSession::isActive() const
{
return m_active;
}
-void QWindowsCameraSession::setActive(bool active)
+bool QWindowsMediaDeviceSession::isActivating() const
{
- if (m_active == active)
+ return m_activating;
+}
+
+void QWindowsMediaDeviceSession::setActive(bool active)
+{
+ if ((m_active == active) || (m_activating && active))
return;
if (active) {
- auto camId = QString::fromUtf8(m_activeCameraInfo.id());
- auto micId = QString::fromUtf8(m_audioInput.id());
- if (!camId.isEmpty() || !micId.isEmpty())
- m_cameraReader->activate(camId, m_cameraFormat, micId);
- else
+ auto camId = QString::fromUtf8(m_activeCameraDevice.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);
+ } else {
qWarning() << Q_FUNC_INFO << "Camera ID and Microphone ID both undefined.";
+ }
} else {
- m_cameraReader->deactivate();
+ m_mediaDeviceReader->deactivate();
m_active = false;
+ m_activating = false;
emit activeChanged(m_active);
emit readyForCaptureChanged(m_active);
}
}
-void QWindowsCameraSession::setActiveCamera(const QCameraDevice &info)
+void QWindowsMediaDeviceSession::setActiveCamera(const QCameraDevice &camera)
{
- m_activeCameraInfo = info;
+ m_activeCameraDevice = camera;
}
-void QWindowsCameraSession::setCameraFormat(const QCameraFormat &cameraFormat)
+QCameraDevice QWindowsMediaDeviceSession::activeCamera() const
{
- m_cameraFormat = cameraFormat;
+ return m_activeCameraDevice;
}
-bool QWindowsCameraSession::isReadyForCapture() const
+void QWindowsMediaDeviceSession::setCameraFormat(const QCameraFormat &cameraFormat)
{
- return m_active;
+ m_cameraFormat = cameraFormat;
}
-void QWindowsCameraSession::setVideoSink(QVideoSink *surface)
+void QWindowsMediaDeviceSession::setVideoSink(QVideoSink *surface)
{
m_surface = surface;
}
-void QWindowsCameraSession::handleStreamingStarted()
+void QWindowsMediaDeviceSession::handleStreamingStarted()
{
m_active = true;
+ m_activating = false;
emit activeChanged(m_active);
emit readyForCaptureChanged(m_active);
}
-void QWindowsCameraSession::handleStreamingStopped()
+void QWindowsMediaDeviceSession::handleStreamingStopped()
{
m_active = false;
emit activeChanged(m_active);
emit readyForCaptureChanged(m_active);
}
-void QWindowsCameraSession::handleStreamingError(int errorCode)
+void QWindowsMediaDeviceSession::handleStreamingError(int errorCode)
{
if (m_surface)
emit m_surface->newVideoFrame(QVideoFrame());
emit streamingError(errorCode);
}
-void QWindowsCameraSession::handleNewVideoFrame(const QVideoFrame &frame)
+void QWindowsMediaDeviceSession::handleNewVideoFrame(const QVideoFrame &frame)
{
if (m_surface)
emit m_surface->newVideoFrame(frame);
emit newVideoFrame(frame);
}
-QMediaEncoderSettings QWindowsCameraSession::videoSettings() const
+QMediaEncoderSettings QWindowsMediaDeviceSession::videoSettings() const
{
return m_mediaEncoderSettings;
}
-void QWindowsCameraSession::setVideoSettings(const QMediaEncoderSettings &settings)
+void QWindowsMediaDeviceSession::setVideoSettings(const QMediaEncoderSettings &settings)
{
m_mediaEncoderSettings = settings;
}
-bool QWindowsCameraSession::isMuted() const
+void QWindowsMediaDeviceSession::setAudioInputMuted(bool muted)
{
- return m_cameraReader->isMuted();
+ m_mediaDeviceReader->setMuted(muted);
}
-void QWindowsCameraSession::setMuted(bool muted)
+void QWindowsMediaDeviceSession::setAudioInputVolume(float volume)
{
- m_cameraReader->setMuted(muted);
+ m_mediaDeviceReader->setVolume(volume);
}
-qreal QWindowsCameraSession::volume() const
+void QWindowsMediaDeviceSession::audioInputDeviceChanged()
{
- return m_cameraReader->volume();
+ // ### FIXME: get the new input device from m_audioInput and adjust
+ // the pipeline
}
-void QWindowsCameraSession::setVolume(qreal volume)
+void QWindowsMediaDeviceSession::setAudioInput(QAudioInput *input)
{
- m_cameraReader->setVolume(volume);
-}
-
-QAudioDevice QWindowsCameraSession::audioInput() const
-{
- return m_audioInput;
-}
-
-bool QWindowsCameraSession::setAudioInput(const QAudioDevice &info)
-{
- 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 QWindowsCameraSession::startRecording(const QString &fileName)
+bool QWindowsMediaDeviceSession::startRecording(const QString &fileName, bool audioOnly)
{
GUID container = QWindowsMultimediaUtils::containerForVideoFileFormat(m_mediaEncoderSettings.mediaFormat().fileFormat());
GUID videoFormat = QWindowsMultimediaUtils::videoFormatForCodec(m_mediaEncoderSettings.videoCodec());
@@ -190,12 +199,12 @@ bool QWindowsCameraSession::startRecording(const QString &fileName)
width = UINT32(res.width());
height = UINT32(res.height());
} else {
- width = m_cameraReader->frameWidth();
- height = m_cameraReader->frameHeight();
+ width = m_mediaDeviceReader->frameWidth();
+ height = m_mediaDeviceReader->frameHeight();
}
qreal fps = m_mediaEncoderSettings.videoFrameRate();
- qreal frameRate = (fps > 0) ? fps : m_cameraReader->frameRate();
+ qreal frameRate = (fps > 0) ? fps : m_mediaDeviceReader->frameRate();
auto quality = m_mediaEncoderSettings.quality();
int vbrate = m_mediaEncoderSettings.videoBitRate();
@@ -207,29 +216,29 @@ bool QWindowsCameraSession::startRecording(const QString &fileName)
UINT32 audioBitRate = (abrate > 0) ? UINT32(abrate)
: estimateAudioBitRate(audioFormat, quality);
- return m_cameraReader->startRecording(fileName, container, videoFormat,
- videoBitRate, width, height, frameRate,
- audioFormat, audioBitRate);
+ return m_mediaDeviceReader->startRecording(fileName, container, audioOnly ? GUID_NULL : videoFormat,
+ videoBitRate, width, height, frameRate,
+ audioFormat, audioBitRate);
}
-void QWindowsCameraSession::stopRecording()
+void QWindowsMediaDeviceSession::stopRecording()
{
- m_cameraReader->stopRecording();
+ m_mediaDeviceReader->stopRecording();
}
-bool QWindowsCameraSession::pauseRecording()
+bool QWindowsMediaDeviceSession::pauseRecording()
{
- return m_cameraReader->pauseRecording();
+ return m_mediaDeviceReader->pauseRecording();
}
-bool QWindowsCameraSession::resumeRecording()
+bool QWindowsMediaDeviceSession::resumeRecording()
{
- return m_cameraReader->resumeRecording();
+ return m_mediaDeviceReader->resumeRecording();
}
// empirical estimate of the required video bitrate (for H.264)
-quint32 QWindowsCameraSession::estimateVideoBitRate(const GUID &videoFormat, quint32 width, quint32 height,
- qreal frameRate, QMediaEncoderSettings::Quality quality)
+quint32 QWindowsMediaDeviceSession::estimateVideoBitRate(const GUID &videoFormat, quint32 width, quint32 height,
+ qreal frameRate, QMediaEncoderSettings::Quality quality)
{
Q_UNUSED(videoFormat);
@@ -260,7 +269,7 @@ quint32 QWindowsCameraSession::estimateVideoBitRate(const GUID &videoFormat, qui
return pixelsPerSec * bitsPerPixel;
}
-quint32 QWindowsCameraSession::estimateAudioBitRate(const GUID &audioFormat, QMediaEncoderSettings::Quality quality)
+quint32 QWindowsMediaDeviceSession::estimateAudioBitRate(const GUID &audioFormat, QMediaEncoderSettings::Quality quality)
{
if (audioFormat == MFAudioFormat_AAC) {
// Bitrates supported by the AAC encoder are 96K, 128K, 160K, 192K.
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscamerasession_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h
index 5d6ac5c86..2a2d04f7c 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowscamerasession_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h
@@ -37,8 +37,8 @@
**
****************************************************************************/
-#ifndef QWINDOWSCAMERASESSION_H
-#define QWINDOWSCAMERASESSION_H
+#ifndef QWINDOWSMEDIADEVICESESSION_H
+#define QWINDOWSMEDIADEVICESESSION_H
//
// W A R N I N G
@@ -59,22 +59,24 @@
QT_BEGIN_NAMESPACE
+class QAudioInput;
class QVideoSink;
-class QWindowsCameraReader;
+class QWindowsMediaDeviceReader;
-class QWindowsCameraSession : public QObject
+class QWindowsMediaDeviceSession : public QObject
{
Q_OBJECT
public:
- explicit QWindowsCameraSession(QObject *parent = nullptr);
- ~QWindowsCameraSession();
+ explicit QWindowsMediaDeviceSession(QObject *parent = nullptr);
+ ~QWindowsMediaDeviceSession();
bool isActive() const;
void setActive(bool active);
- bool isReadyForCapture() const;
+ bool isActivating() const;
- void setActiveCamera(const QCameraDevice &info);
+ void setActiveCamera(const QCameraDevice &camera);
+ QCameraDevice activeCamera() const;
void setCameraFormat(const QCameraFormat &cameraFormat);
@@ -83,14 +85,14 @@ 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 startRecording(const QString &fileName, bool audioOnly);
void stopRecording();
bool pauseRecording();
bool resumeRecording();
@@ -115,14 +117,15 @@ private:
qreal frameRate, QMediaEncoderSettings::Quality quality);
quint32 estimateAudioBitRate(const GUID &audioFormat, QMediaEncoderSettings::Quality quality);
bool m_active = false;
- QCameraDevice m_activeCameraInfo;
+ bool m_activating = false;
+ QCameraDevice m_activeCameraDevice;
QCameraFormat m_cameraFormat;
- QWindowsCameraReader *m_cameraReader = nullptr;
+ QWindowsMediaDeviceReader *m_mediaDeviceReader = nullptr;
QMediaEncoderSettings m_mediaEncoderSettings;
- QAudioDevice m_audioInput;
+ QAudioInput *m_audioInput = nullptr;
QVideoSink *m_surface = nullptr;
};
QT_END_NAMESPACE
-#endif // QWINDOWSCAMERASESSION_H
+#endif // QWINDOWSMEDIADEVICESESSION_H
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp
index f12dbd0a2..1ecd8af0b 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp
@@ -39,7 +39,7 @@
#include "qwindowsmediaencoder_p.h"
-#include "qwindowscamerasession_p.h"
+#include "qwindowsmediadevicesession_p.h"
#include "qwindowsmediacapture_p.h"
#include <QtCore/QUrl>
#include <QtCore/QMimeType>
@@ -47,7 +47,7 @@
QT_BEGIN_NAMESPACE
-QWindowsMediaEncoder::QWindowsMediaEncoder(QMediaEncoder *parent)
+QWindowsMediaEncoder::QWindowsMediaEncoder(QMediaRecorder *parent)
: QObject(parent),
QPlatformMediaEncoder(parent)
{
@@ -67,12 +67,12 @@ bool QWindowsMediaEncoder::setOutputLocation(const QUrl &location)
return location.scheme() == QLatin1String("file") || location.scheme().isEmpty();
}
-QMediaEncoder::State QWindowsMediaEncoder::state() const
+QMediaRecorder::RecorderState QWindowsMediaEncoder::state() const
{
return m_state;
}
-QMediaEncoder::Status QWindowsMediaEncoder::status() const
+QMediaRecorder::Status QWindowsMediaEncoder::status() const
{
return m_lastStatus;
}
@@ -84,13 +84,20 @@ qint64 QWindowsMediaEncoder::duration() const
void QWindowsMediaEncoder::applySettings()
{
- if (m_cameraSession)
- m_cameraSession->setVideoSettings(m_settings);
+ if (!m_mediaDeviceSession)
+ return;
+
+ const auto flag = m_mediaDeviceSession->activeCamera().isNull()
+ ? QMediaFormat::NoFlags
+ : QMediaFormat::RequiresVideo;
+
+ m_settings.resolveFormat(flag);
+ m_mediaDeviceSession->setVideoSettings(m_settings);
}
-void QWindowsMediaEncoder::setState(QMediaEncoder::State state)
+void QWindowsMediaEncoder::setState(QMediaRecorder::RecorderState state)
{
- if (!m_captureService || !m_cameraSession) {
+ if (!m_captureService || !m_mediaDeviceSession) {
qWarning() << Q_FUNC_INFO << "Encoder is not set to a capture session";
return;
}
@@ -99,62 +106,66 @@ void QWindowsMediaEncoder::setState(QMediaEncoder::State state)
return;
switch (state) {
- case QMediaEncoder::RecordingState:
+ case QMediaRecorder::RecordingState:
{
- if (!m_cameraSession->isActive()) {
- error(QMediaEncoder::ResourceError, tr("Failed to start recording"));
+ m_mediaDeviceSession->setActive(true);
+
+ if (!m_mediaDeviceSession->isActive() && !m_mediaDeviceSession->isActivating()) {
+ error(QMediaRecorder::ResourceError, tr("Failed to start recording"));
return;
}
- if (m_state == QMediaEncoder::PausedState) {
- if (m_cameraSession->resumeRecording()) {
- m_state = QMediaEncoder::RecordingState;
+ if (m_state == QMediaRecorder::PausedState) {
+ if (m_mediaDeviceSession->resumeRecording()) {
+ m_state = QMediaRecorder::RecordingState;
stateChanged(m_state);
} else {
- error(QMediaEncoder::FormatError, tr("Failed to resume recording"));
+ error(QMediaRecorder::FormatError, tr("Failed to resume recording"));
}
} else {
- const QString path = (m_outputLocation.scheme() == QLatin1String("file") ?
- m_outputLocation.path() : m_outputLocation.toString());
+ applySettings();
- auto encoderSettings = m_settings;
- encoderSettings.resolveFormat(QMediaFormat::ResolveFlags::RequiresVideo);
+ const bool audioOnly = m_settings.videoCodec() == QMediaFormat::VideoCodec::Unspecified;
- QString fileName = m_storageLocation.generateFileName(path, QWindowsStorageLocation::Video,
- QLatin1String("clip_"), encoderSettings.mimeType().preferredSuffix());
+ const QString path = (m_outputLocation.scheme() == QLatin1String("file") ?
+ m_outputLocation.path() : m_outputLocation.toString());
- applySettings();
+ QString fileName = m_storageLocation.generateFileName(path, audioOnly
+ ? QWindowsStorageLocation::Audio
+ : QWindowsStorageLocation::Video,
+ QLatin1String("clip_"),
+ m_settings.mimeType().preferredSuffix());
- if (m_cameraSession->startRecording(fileName)) {
+ if (m_mediaDeviceSession->startRecording(fileName, audioOnly)) {
- m_state = QMediaEncoder::RecordingState;
- m_lastStatus = QMediaEncoder::StartingStatus;
+ m_state = QMediaRecorder::RecordingState;
+ m_lastStatus = QMediaRecorder::StartingStatus;
actualLocationChanged(QUrl::fromLocalFile(fileName));
stateChanged(m_state);
statusChanged(m_lastStatus);
} else {
- error(QMediaEncoder::FormatError, tr("Failed to start recording"));
+ error(QMediaRecorder::FormatError, tr("Failed to start recording"));
}
}
} break;
- case QMediaEncoder::PausedState:
+ case QMediaRecorder::PausedState:
{
- if (m_state == QMediaEncoder::RecordingState) {
- if (m_cameraSession->pauseRecording()) {
- m_state = QMediaEncoder::PausedState;
+ if (m_state == QMediaRecorder::RecordingState) {
+ if (m_mediaDeviceSession->pauseRecording()) {
+ m_state = QMediaRecorder::PausedState;
stateChanged(m_state);
} else {
- error(QMediaEncoder::FormatError, tr("Failed to pause recording"));
+ error(QMediaRecorder::FormatError, tr("Failed to pause recording"));
}
}
} break;
- case QMediaEncoder::StoppedState:
+ case QMediaRecorder::StoppedState:
{
- m_cameraSession->stopRecording();
- m_lastStatus = QMediaEncoder::FinalizingStatus;
+ m_mediaDeviceSession->stopRecording();
+ m_lastStatus = QMediaRecorder::FinalizingStatus;
statusChanged(m_lastStatus);
// state will change in onRecordingStopped()
} break;
@@ -173,21 +184,21 @@ void QWindowsMediaEncoder::setCaptureSession(QPlatformMediaCaptureSession *sessi
return;
if (m_captureService)
- setState(QMediaEncoder::StoppedState);
+ setState(QMediaRecorder::StoppedState);
m_captureService = captureSession;
if (!m_captureService) {
- m_cameraSession = nullptr;
+ m_mediaDeviceSession = nullptr;
return;
}
- m_cameraSession = m_captureService->session();
- Q_ASSERT(m_cameraSession);
+ m_mediaDeviceSession = m_captureService->session();
+ Q_ASSERT(m_mediaDeviceSession);
- connect(m_cameraSession, &QWindowsCameraSession::recordingStarted, this, &QWindowsMediaEncoder::onRecordingStarted);
- connect(m_cameraSession, &QWindowsCameraSession::recordingStopped, this, &QWindowsMediaEncoder::onRecordingStopped);
- connect(m_cameraSession, &QWindowsCameraSession::streamingError, this, &QWindowsMediaEncoder::onStreamingError);
- connect(m_cameraSession, &QWindowsCameraSession::durationChanged, this, &QWindowsMediaEncoder::onDurationChanged);
+ connect(m_mediaDeviceSession, &QWindowsMediaDeviceSession::recordingStarted, this, &QWindowsMediaEncoder::onRecordingStarted);
+ connect(m_mediaDeviceSession, &QWindowsMediaDeviceSession::recordingStopped, this, &QWindowsMediaEncoder::onRecordingStopped);
+ connect(m_mediaDeviceSession, &QWindowsMediaDeviceSession::streamingError, this, &QWindowsMediaEncoder::onStreamingError);
+ connect(m_mediaDeviceSession, &QWindowsMediaDeviceSession::durationChanged, this, &QWindowsMediaEncoder::onDurationChanged);
connect(m_captureService, &QWindowsMediaCaptureService::cameraChanged, this, &QWindowsMediaEncoder::onCameraChanged);
onCameraChanged();
}
@@ -201,13 +212,13 @@ void QWindowsMediaEncoder::onDurationChanged(qint64 duration)
void QWindowsMediaEncoder::onStreamingError(int errorCode)
{
if (errorCode == MF_E_VIDEO_RECORDING_DEVICE_INVALIDATED)
- error(QMediaEncoder::ResourceError, tr("Camera is no longer present"));
+ error(QMediaRecorder::ResourceError, tr("Camera is no longer present"));
else
- error(QMediaEncoder::ResourceError, tr("Streaming error"));
+ error(QMediaRecorder::ResourceError, tr("Streaming error"));
- if (m_state != QMediaEncoder::StoppedState) {
- m_cameraSession->stopRecording();
- m_lastStatus = QMediaEncoder::FinalizingStatus;
+ if (m_state != QMediaRecorder::StoppedState) {
+ m_mediaDeviceSession->stopRecording();
+ m_lastStatus = QMediaRecorder::FinalizingStatus;
statusChanged(m_lastStatus);
}
}
@@ -218,7 +229,7 @@ void QWindowsMediaEncoder::onCameraChanged()
void QWindowsMediaEncoder::onRecordingStarted()
{
- m_lastStatus = QMediaEncoder::RecordingStatus;
+ m_lastStatus = QMediaRecorder::RecordingStatus;
statusChanged(m_lastStatus);
}
@@ -226,8 +237,8 @@ void QWindowsMediaEncoder::onRecordingStopped()
{
auto lastState = m_state;
auto lastStatus = m_lastStatus;
- m_state = QMediaEncoder::StoppedState;
- m_lastStatus = QMediaEncoder::StoppedStatus;
+ m_state = QMediaRecorder::StoppedState;
+ m_lastStatus = QMediaRecorder::StoppedStatus;
if (m_state != lastState)
stateChanged(m_state);
if (m_lastStatus != lastStatus)
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder_p.h
index 31be8e444..ffa73b428 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder_p.h
@@ -60,7 +60,7 @@
QT_BEGIN_NAMESPACE
-class QWindowsCameraSession;
+class QWindowsMediaDeviceSession;
class QPlatformMediaCaptureSession;
class QWindowsMediaCaptureService;
@@ -68,12 +68,12 @@ class QWindowsMediaEncoder : public QObject, public QPlatformMediaEncoder
{
Q_OBJECT
public:
- explicit QWindowsMediaEncoder(QMediaEncoder *parent);
+ explicit QWindowsMediaEncoder(QMediaRecorder *parent);
QUrl outputLocation() const override;
bool setOutputLocation(const QUrl &location) override;
- QMediaEncoder::State state() const override;
- QMediaEncoder::Status status() const override;
+ QMediaRecorder::RecorderState state() const override;
+ QMediaRecorder::Status status() const override;
qint64 duration() const override;
void applySettings() override;
@@ -82,7 +82,7 @@ public:
void setCaptureSession(QPlatformMediaCaptureSession *session);
public Q_SLOTS:
- void setState(QMediaEncoder::State state) override;
+ void setState(QMediaRecorder::RecorderState state) override;
private Q_SLOTS:
void onCameraChanged();
@@ -93,10 +93,10 @@ private Q_SLOTS:
private:
QWindowsMediaCaptureService *m_captureService = nullptr;
- QWindowsCameraSession *m_cameraSession = nullptr;
+ QWindowsMediaDeviceSession *m_mediaDeviceSession = nullptr;
QUrl m_outputLocation;
- QMediaEncoder::State m_state = QMediaEncoder::StoppedState;
- QMediaEncoder::Status m_lastStatus = QMediaEncoder::StoppedStatus;
+ QMediaRecorder::RecorderState m_state = QMediaRecorder::StoppedState;
+ QMediaRecorder::Status m_lastStatus = QMediaRecorder::StoppedStatus;
QMediaEncoderSettings m_settings;
QWindowsStorageLocation m_storageLocation;
qint64 m_duration = 0;
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsstoragelocation.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsstoragelocation.cpp
index 60dc111a6..75a72e795 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsstoragelocation.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsstoragelocation.cpp
@@ -74,8 +74,10 @@ QDir QWindowsStorageLocation::defaultDir(Mode mode) const
if (mode == Video)
dirCandidates << QStandardPaths::writableLocation(QStandardPaths::MoviesLocation);
- else
+ else if (mode == Image)
dirCandidates << QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
+ else if (mode == Audio)
+ dirCandidates << QStandardPaths::writableLocation(QStandardPaths::MusicLocation);
dirCandidates << QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
dirCandidates << QDir::homePath();
@@ -96,7 +98,7 @@ QString QWindowsStorageLocation::generateFileName(const QString &prefix, const Q
if (lastClip == 0) {
//first run, find the maximum clip number during the fist capture
- const auto list = dir.entryList(QStringList() << QString::fromUtf8("%1*.%2").arg(prefix).arg(ext));
+ const auto list = dir.entryList(QStringList() << QString::fromUtf8("%1*.%2").arg(prefix, ext));
for (const QString &fileName : list) {
int imgNumber = QStringView{fileName}.mid(prefix.length(),
fileName.size() - prefix.length() - ext.length() - 1).toInt();
@@ -113,7 +115,7 @@ QString QWindowsStorageLocation::generateFileName(const QString &prefix, const Q
QString path = dir.absoluteFilePath(name);
- if (!QFileInfo(path).exists()) {
+ if (!QFileInfo::exists(path)) {
m_lastUsedIndex[lastClipKey] = lastClip + 1;
return path;
}
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsstoragelocation_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsstoragelocation_p.h
index 54ca1989c..44e27bd62 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsstoragelocation_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsstoragelocation_p.h
@@ -68,7 +68,8 @@ public:
enum Mode {
Image,
- Video
+ Video,
+ Audio
};
QString generateFileName(const QString &requestedName, Mode mode,
diff --git a/src/multimedia/platform/windows/player/mfplayercontrol.cpp b/src/multimedia/platform/windows/player/mfplayercontrol.cpp
index 117cd402c..e6ac343b3 100644
--- a/src/multimedia/platform/windows/player/mfplayercontrol.cpp
+++ b/src/multimedia/platform/windows/player/mfplayercontrol.cpp
@@ -126,14 +126,9 @@ QMediaMetaData MFPlayerControl::metaData() const
return m_session->metaData();
}
-bool MFPlayerControl::setAudioOutput(const QAudioDevice &info)
+void MFPlayerControl::setAudioOutput(QPlatformAudioOutput *output)
{
- return m_session->setAudioOutput(info);
-}
-
-QAudioDevice MFPlayerControl::audioOutput() const
-{
- return m_session->audioOutput();
+ m_session->setAudioOutput(output);
}
void MFPlayerControl::setVideoSink(QVideoSink *sink)
@@ -254,26 +249,6 @@ void MFPlayerControl::setPosition(qint64 position)
m_session->setPosition(position);
}
-int MFPlayerControl::volume() const
-{
- return m_session->volume();
-}
-
-void MFPlayerControl::setVolume(int volume)
-{
- m_session->setVolume(volume);
-}
-
-bool MFPlayerControl::isMuted() const
-{
- return m_session->isMuted();
-}
-
-void MFPlayerControl::setMuted(bool muted)
-{
- m_session->setMuted(muted);
-}
-
float MFPlayerControl::bufferProgress() const
{
return m_session->bufferProgress() / 100.;
diff --git a/src/multimedia/platform/windows/player/mfplayercontrol_p.h b/src/multimedia/platform/windows/player/mfplayercontrol_p.h
index 8433ae58a..995181626 100644
--- a/src/multimedia/platform/windows/player/mfplayercontrol_p.h
+++ b/src/multimedia/platform/windows/player/mfplayercontrol_p.h
@@ -75,12 +75,6 @@ public:
qint64 position() const override;
void setPosition(qint64 position) override;
- int volume() const override;
- void setVolume(int volume) override;
-
- bool isMuted() const override;
- void setMuted(bool muted) override;
-
float bufferProgress() const override;
bool isAudioAvailable() const override;
@@ -105,8 +99,7 @@ public:
QMediaMetaData metaData() const override;
- bool setAudioOutput(const QAudioDevice &) override;
- QAudioDevice audioOutput() const override;
+ void setAudioOutput(QPlatformAudioOutput *output) override;
void setVideoSink(QVideoSink *sink) override;
diff --git a/src/multimedia/platform/windows/player/mfplayersession.cpp b/src/multimedia/platform/windows/player/mfplayersession.cpp
index b2afca6bf..1fa05c33a 100644
--- a/src/multimedia/platform/windows/player/mfplayersession.cpp
+++ b/src/multimedia/platform/windows/player/mfplayersession.cpp
@@ -47,6 +47,9 @@
#include <QtCore/qfile.h>
#include <QtCore/qbuffer.h>
+#include "qplatformaudiooutput_p.h"
+#include "qaudiooutput.h"
+
#include "mfplayercontrol_p.h"
#include "mfevrvideowindowcontrol_p.h"
#include "mfvideorenderercontrol_p.h"
@@ -83,8 +86,6 @@ MFPlayerSession::MFPlayerSession(MFPlayerControl *playerControl)
, m_mediaTypes(0)
, m_pendingRate(1)
, m_status(QMediaPlayer::NoMedia)
- , m_volume(100)
- , m_muted(false)
, m_audioSampleGrabber(0)
, m_audioSampleGrabberNode(0)
, m_videoProbeMFT(0)
@@ -397,34 +398,36 @@ IMFTopologyNode* MFPlayerSession::addOutputNode(MediaType mediaType, IMFTopology
IMFActivate *activate = NULL;
if (mediaType == Audio) {
- HRESULT hr = MFCreateAudioRendererActivate(&activate);
- if (FAILED(hr)) {
- qWarning() << "Failed to create audio renderer activate";
- node->Release();
- return NULL;
- }
+ if (m_audioOutput) {
+ HRESULT hr = MFCreateAudioRendererActivate(&activate);
+ if (FAILED(hr)) {
+ qWarning() << "Failed to create audio renderer activate";
+ node->Release();
+ return NULL;
+ }
- if (!m_audioOutput.id().isEmpty()) {
- QString s = QString::fromUtf8(m_audioOutput.id());
- hr = activate->SetString(MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID, (LPCWSTR)s.utf16());
- } else {
- //This is the default one that has been inserted in updateEndpoints(),
- //so give the activate a hint that we want to use the device for multimedia playback
- //then the media foundation will choose an appropriate one.
-
- //from MSDN:
- //The ERole enumeration defines constants that indicate the role that the system has assigned to an audio endpoint device.
- //eMultimedia: Music, movies, narration, and live music recording.
- hr = activate->SetUINT32(MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE, eMultimedia);
- }
+ auto id = m_audioOutput->device.id();
+ if (!id.isEmpty()) {
+ QString s = QString::fromUtf8(id);
+ hr = activate->SetString(MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID, (LPCWSTR)s.utf16());
+ } else {
+ //This is the default one that has been inserted in updateEndpoints(),
+ //so give the activate a hint that we want to use the device for multimedia playback
+ //then the media foundation will choose an appropriate one.
+
+ //from MSDN:
+ //The ERole enumeration defines constants that indicate the role that the system has assigned to an audio endpoint device.
+ //eMultimedia: Music, movies, narration, and live music recording.
+ hr = activate->SetUINT32(MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE, eMultimedia);
+ }
- if (FAILED(hr)) {
- qWarning() << "Failed to set attribute for audio device" << m_audioOutput.description();
- activate->Release();
- node->Release();
- return NULL;
+ if (FAILED(hr)) {
+ qWarning() << "Failed to set attribute for audio device" << m_audioOutput->device.description();
+ activate->Release();
+ node->Release();
+ return NULL;
+ }
}
-
} else if (mediaType == Video) {
activate = m_videoRendererControl->createActivate();
} else {
@@ -1350,12 +1353,7 @@ void MFPlayerSession::scrub(bool enableScrub)
}
}
-int MFPlayerSession::volume() const
-{
- return m_volume;
-}
-
-void MFPlayerSession::setVolume(int volume)
+void MFPlayerSession::setVolume(float volume)
{
if (m_volume == volume)
return;
@@ -1363,13 +1361,6 @@ void MFPlayerSession::setVolume(int volume)
if (!m_muted)
setVolumeInternal(volume);
-
- emit volumeChanged(m_volume);
-}
-
-bool MFPlayerSession::isMuted() const
-{
- return m_muted;
}
void MFPlayerSession::setMuted(bool muted)
@@ -1379,11 +1370,9 @@ void MFPlayerSession::setMuted(bool muted)
m_muted = muted;
setVolumeInternal(muted ? 0 : m_volume);
-
- emit mutedChanged(m_muted);
}
-void MFPlayerSession::setVolumeInternal(int volume)
+void MFPlayerSession::setVolumeInternal(float volume)
{
if (m_volumeControl) {
quint32 channelCount = 0;
@@ -1391,9 +1380,8 @@ void MFPlayerSession::setVolumeInternal(int volume)
|| channelCount == 0)
return;
- float scaled = volume * 0.01f;
for (quint32 i = 0; i < channelCount; ++i)
- m_volumeControl->SetChannelVolume(i, scaled);
+ m_volumeControl->SetChannelVolume(i, volume);
}
}
@@ -1811,15 +1799,23 @@ void MFPlayerSession::clear()
}
}
-bool MFPlayerSession::setAudioOutput(const QAudioDevice &device)
+void MFPlayerSession::setAudioOutput(QPlatformAudioOutput *device)
{
// ### This doesn't yet update the output routing during playback
// ie. it currently only works before the first play().
if (m_audioOutput == device)
- return true;
+ return;
+
+ if (m_audioOutput)
+ m_audioOutput->q->disconnect(this);
m_audioOutput = device;
- return true;
+ if (m_audioOutput) {
+ // #### Implement device changes: connect(m_audioOutput->q, &QAudioOutput::deviceChanged, this, XXXX);
+ connect(m_audioOutput->q, &QAudioOutput::volumeChanged, this, &MFPlayerSession::setVolume);
+ connect(m_audioOutput->q, &QAudioOutput::mutedChanged, this, &MFPlayerSession::setMuted);
+// connect(m_audioOutput->q, &QAudioOutput::audioRoleChanged, this, &MFPlayerSession::setAudioRole);
+ }
}
void MFPlayerSession::setVideoSink(QVideoSink *sink)
diff --git a/src/multimedia/platform/windows/player/mfplayersession_p.h b/src/multimedia/platform/windows/player/mfplayersession_p.h
index 9f035e4c2..10b424a37 100644
--- a/src/multimedia/platform/windows/player/mfplayersession_p.h
+++ b/src/multimedia/platform/windows/player/mfplayersession_p.h
@@ -112,10 +112,6 @@ public:
void setPosition(qint64 position);
qreal playbackRate() const;
void setPlaybackRate(qreal rate);
- int volume() const;
- void setVolume(int volume);
- bool isMuted() const;
- void setMuted(bool muted);
float bufferProgress();
QMediaTimeRange availablePlaybackRanges();
@@ -124,8 +120,7 @@ public:
void close();
void clearPlayer() { m_playerControl = nullptr; }
- bool setAudioOutput(const QAudioDevice &device);
- QAudioDevice audioOutput() const { return m_audioOutput; }
+ void setAudioOutput(QPlatformAudioOutput *device);
QMediaMetaData metaData() const { return m_metaData; }
@@ -138,12 +133,14 @@ public:
void seekableUpdate(bool seekable) { if (m_playerControl) m_playerControl->handleSeekableUpdate(seekable); }
void error(QMediaPlayer::Error error, QString errorString, bool isFatal) { if (m_playerControl) m_playerControl->handleError(error, errorString, isFatal); }
void playbackRateChanged(qreal rate) { if (m_playerControl) m_playerControl->playbackRateChanged(rate); }
- void volumeChanged(int volume) { if (m_playerControl) m_playerControl->volumeChanged(volume); }
- void mutedChanged(bool muted) { if (m_playerControl) m_playerControl->mutedChanged(muted); }
void bufferProgressChanged(float percentFilled) { if (m_playerControl) m_playerControl->bufferProgressChanged(percentFilled); }
void metaDataChanged() { if (m_playerControl) m_playerControl->metaDataChanged(); }
void positionChanged(qint64 position) { if (m_playerControl) m_playerControl->positionChanged(position); }
+public Q_SLOTS:
+ void setVolume(float volume);
+ void setMuted(bool muted);
+
Q_SIGNALS:
void sessionEvent(IMFMediaEvent *sessionEvent);
@@ -224,13 +221,13 @@ private:
QMediaPlayer::MediaStatus m_status;
bool m_canScrub;
- int m_volume;
- bool m_muted;
+ float m_volume = 1.;
+ bool m_muted = false;
- QAudioDevice m_audioOutput;
+ QPlatformAudioOutput *m_audioOutput = nullptr;
QMediaMetaData m_metaData;
- void setVolumeInternal(int volume);
+ void setVolumeInternal(float volume);
void createSession();
void setupPlaybackTopology(IMFMediaSource *source, IMFPresentationDescriptor *sourcePD);
diff --git a/src/multimedia/platform/windows/qwindowsformatinfo.cpp b/src/multimedia/platform/windows/qwindowsformatinfo.cpp
index 9bfa66f8d..2e308ffbe 100644
--- a/src/multimedia/platform/windows/qwindowsformatinfo.cpp
+++ b/src/multimedia/platform/windows/qwindowsformatinfo.cpp
@@ -81,7 +81,7 @@ QWindowsFormatInfo::QWindowsFormatInfo()
};
// ####
- imageFormats = { QImageEncoderSettings::JPEG, QImageEncoderSettings::PNG };
+ imageFormats = { QCameraImageCapture::JPEG, QCameraImageCapture::PNG };
}
diff --git a/src/multimedia/platform/windows/qwindowsintegration.cpp b/src/multimedia/platform/windows/qwindowsintegration.cpp
index 7a183b43a..7509205a4 100644
--- a/src/multimedia/platform/windows/qwindowsintegration.cpp
+++ b/src/multimedia/platform/windows/qwindowsintegration.cpp
@@ -108,7 +108,7 @@ QPlatformCamera *QWindowsIntegration::createCamera(QCamera *camera)
return new QWindowsCamera(camera);
}
-QPlatformMediaEncoder *QWindowsIntegration::createEncoder(QMediaEncoder *encoder)
+QPlatformMediaEncoder *QWindowsIntegration::createEncoder(QMediaRecorder *encoder)
{
return new QWindowsMediaEncoder(encoder);
}
diff --git a/src/multimedia/platform/windows/qwindowsintegration_p.h b/src/multimedia/platform/windows/qwindowsintegration_p.h
index 03684720f..9d3c9b836 100644
--- a/src/multimedia/platform/windows/qwindowsintegration_p.h
+++ b/src/multimedia/platform/windows/qwindowsintegration_p.h
@@ -75,7 +75,7 @@ public:
QPlatformAudioDecoder *createAudioDecoder(QAudioDecoder *decoder) override;
QPlatformMediaPlayer *createPlayer(QMediaPlayer *parent) override;
QPlatformCamera *createCamera(QCamera *camera) override;
- QPlatformMediaEncoder *createEncoder(QMediaEncoder *encoder) override;
+ QPlatformMediaEncoder *createEncoder(QMediaRecorder *encoder) override;
QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *imageCapture) override;
QPlatformVideoSink *createVideoSink(QVideoSink *sink) override;
diff --git a/src/multimedia/platform/windows/qwindowsmediadevices.cpp b/src/multimedia/platform/windows/qwindowsmediadevices.cpp
index d8af3da9e..2b1a74a44 100644
--- a/src/multimedia/platform/windows/qwindowsmediadevices.cpp
+++ b/src/multimedia/platform/windows/qwindowsmediadevices.cpp
@@ -320,9 +320,9 @@ QWindowsMediaDevices::~QWindowsMediaDevices()
CoUninitialize();
}
-QList<QAudioDevice> QWindowsMediaDevices::availableDevices(QAudio::Mode mode) const
+QList<QAudioDevice> QWindowsMediaDevices::availableDevices(QAudioDevice::Mode mode) const
{
- const auto audioOut = mode == QAudio::AudioOutput;
+ const auto audioOut = mode == QAudioDevice::Output;
const auto defaultAudioDeviceID = [this, audioOut]{
const auto dataFlow = audioOut ? EDataFlow::eRender : EDataFlow::eCapture;
@@ -384,12 +384,12 @@ QList<QAudioDevice> QWindowsMediaDevices::availableDevices(QAudio::Mode mode) co
QList<QAudioDevice> QWindowsMediaDevices::audioInputs() const
{
- return availableDevices(QAudio::AudioInput);
+ return availableDevices(QAudioDevice::Input);
}
QList<QAudioDevice> QWindowsMediaDevices::audioOutputs() const
{
- return availableDevices(QAudio::AudioOutput);
+ return availableDevices(QAudioDevice::Output);
}
QList<QCameraDevice> QWindowsMediaDevices::videoInputs() const
diff --git a/src/multimedia/platform/windows/qwindowsmediadevices_p.h b/src/multimedia/platform/windows/qwindowsmediadevices_p.h
index 30f91d2c1..322324607 100644
--- a/src/multimedia/platform/windows/qwindowsmediadevices_p.h
+++ b/src/multimedia/platform/windows/qwindowsmediadevices_p.h
@@ -55,6 +55,7 @@
#include <private/qwindowsiupointer_p.h>
#include <qset.h>
#include <qaudio.h>
+#include <qaudiodevice.h>
#include <windows.h>
QT_BEGIN_NAMESPACE
@@ -78,7 +79,7 @@ public:
QPlatformAudioSink *createAudioSink(const QAudioDevice &deviceInfo) override;
private:
- QList<QAudioDevice> availableDevices(QAudio::Mode mode) const;
+ QList<QAudioDevice> availableDevices(QAudioDevice::Mode mode) const;
QWindowsIUPointer<IMMDeviceEnumerator> m_deviceEnumerator;
QWindowsIUPointer<CMMNotificationClient> m_notificationClient;
diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp
index 38e8aff0e..4ee85506a 100644
--- a/src/multimedia/playback/qmediaplayer.cpp
+++ b/src/multimedia/playback/qmediaplayer.cpp
@@ -41,6 +41,7 @@
#include <private/qplatformmediaintegration_p.h>
#include <qvideosink.h>
+#include <qaudiooutput.h>
#include <QtCore/qcoreevent.h>
#include <QtCore/qmetaobject.h>
@@ -294,32 +295,6 @@ qint64 QMediaPlayer::position() const
}
/*!
- Returns the playback volume. Valid numbers are between 0 and 100.
-*/
-int QMediaPlayer::volume() const
-{
- Q_D(const QMediaPlayer);
-
- if (d->control != nullptr)
- return d->control->volume();
-
- return 0;
-}
-
-/*!
- Returns true if playback is currently muted.
-*/
-bool QMediaPlayer::isMuted() const
-{
- Q_D(const QMediaPlayer);
-
- if (d->control != nullptr)
- return d->control->isMuted();
-
- return false;
-}
-
-/*!
Returns a number betwee 0 and 1 when buffering data.
0 means that there is no buffered data available, playback is usually
@@ -469,30 +444,6 @@ void QMediaPlayer::setPosition(qint64 position)
d->control->setPosition(qMax(position, 0ll));
}
-void QMediaPlayer::setVolume(int v)
-{
- Q_D(QMediaPlayer);
-
- if (d->control == nullptr)
- return;
-
- int clamped = qBound(0, v, 100);
- if (clamped == volume())
- return;
-
- d->control->setVolume(clamped);
-}
-
-void QMediaPlayer::setMuted(bool muted)
-{
- Q_D(QMediaPlayer);
-
- if (d->control == nullptr || muted == isMuted())
- return;
-
- d->control->setMuted(muted);
-}
-
/*!
If \a autoPlay is set to true, playback will start immediately after calling
setSource() on the media player. Otherwise the media player will enter the
@@ -558,16 +509,20 @@ void QMediaPlayer::setSource(const QUrl &source, QIODevice *stream)
Returns true if the output could be changed, false otherwise.
*/
-bool QMediaPlayer::setAudioOutput(const QAudioDevice &device)
+void QMediaPlayer::setAudioOutput(QAudioOutput *output)
{
Q_D(QMediaPlayer);
- return d->control->setAudioOutput(device);
+ if (d->audioOutput == output)
+ return;
+ d->audioOutput = output;
+ d->control->setAudioOutput(output ? output->handle() : nullptr);
+ emit audioOutputChanged();
}
-QAudioDevice QMediaPlayer::audioOutput() const
+QAudioOutput *QMediaPlayer::audioOutput() const
{
Q_D(const QMediaPlayer);
- return d->control->audioOutput();
+ return d->audioOutput;
}
/*!
@@ -769,45 +724,6 @@ QMediaMetaData QMediaPlayer::metaData() const
return d->control->metaData();
}
-/*!
- Returns the currently set audio role.
-
- Audio roles can be used to tell the system what kind of media is being
- played back, so that it can be associated with a correct mixer channel.
-*/
-QAudio::Role QMediaPlayer::audioRole() const
-{
- Q_D(const QMediaPlayer);
- return d->audioRole;
-}
-
-void QMediaPlayer::setAudioRole(QAudio::Role audioRole)
-{
- Q_D(QMediaPlayer);
- if (d->audioRole == audioRole)
- return;
-
- d->audioRole = audioRole;
- d->control->setAudioRole(audioRole);
- emit audioRoleChanged(audioRole);
-
-}
-
-/*!
- Returns a list of supported audio roles.
-
- If setting the audio role is not supported, an empty list is returned.
-
- \since 5.6
- \sa audioRole
-*/
-QList<QAudio::Role> QMediaPlayer::supportedAudioRoles() const
-{
- Q_D(const QMediaPlayer);
-
- return d->control->supportedAudioRoles();
-}
-
bool QMediaPlayer::autoPlay() const
{
Q_D(const QMediaPlayer);
@@ -910,14 +826,6 @@ bool QMediaPlayer::autoPlay() const
Signals the \a seekable status of the player object has changed.
*/
-/*!
- \fn void QMediaPlayer::audioRoleChanged(QAudio::Role role)
-
- Signals that the audio \a role of the media player has changed.
-
- \since 5.6
-*/
-
// Properties
/*!
\property QMediaPlayer::state
@@ -983,27 +891,6 @@ bool QMediaPlayer::autoPlay() const
*/
/*!
- \property QMediaPlayer::volume
- \brief the current playback volume.
-
- The playback volume is scaled linearly, ranging from \c 0 (silence) to \c 100 (full volume).
- Values outside this range will be clamped.
-
- By default the volume is \c 100.
-
- 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.
-*/
-
-/*!
- \property QMediaPlayer::muted
- \brief the muted state of the current media.
-
- The value will be true if the playback volume is muted; otherwise false.
-*/
-
-/*!
\property QMediaPlayer::bufferProgress
\brief the percentage of the temporary buffer filled before playback begins or resumes, from
\c 0 (empty) to \c 100 (full).
@@ -1063,19 +950,6 @@ bool QMediaPlayer::autoPlay() const
*/
/*!
- \property QMediaPlayer::audioRole
- \brief the role of the audio stream played by the media player.
-
- It can be set to specify the type of audio being played, allowing the system to make
- appropriate decisions when it comes to volume, routing or post-processing.
-
- The audio role must be set before calling setMedia().
-
- \since 5.6
- \sa supportedAudioRoles()
-*/
-
-/*!
\fn void QMediaPlayer::durationChanged(qint64 duration)
Signal the duration of the content has changed to \a duration, expressed in milliseconds.
@@ -1089,18 +963,6 @@ bool QMediaPlayer::autoPlay() const
*/
/*!
- \fn void QMediaPlayer::volumeChanged(int volume)
-
- Signal the playback volume has changed to \a volume.
-*/
-
-/*!
- \fn void QMediaPlayer::mutedChanged(bool muted)
-
- Signal the mute state has changed to \a muted.
-*/
-
-/*!
\fn void QMediaPlayer::videoAvailableChanged(bool videoAvailable)
Signal the availability of visual content has changed to \a videoAvailable.
diff --git a/src/multimedia/playback/qmediaplayer.h b/src/multimedia/playback/qmediaplayer.h
index 1b1ab6e75..7eb66ea1f 100644
--- a/src/multimedia/playback/qmediaplayer.h
+++ b/src/multimedia/playback/qmediaplayer.h
@@ -48,6 +48,7 @@
QT_BEGIN_NAMESPACE
class QVideoSink;
+class QAudioOutput;
class QAudioDevice;
class QMediaMetaData;
class QMediaTimeRange;
@@ -59,8 +60,6 @@ class Q_MULTIMEDIA_EXPORT QMediaPlayer : public QObject
Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged)
Q_PROPERTY(qint64 position READ position WRITE setPosition NOTIFY positionChanged)
- Q_PROPERTY(int volume READ volume WRITE setVolume NOTIFY volumeChanged)
- Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged)
Q_PROPERTY(float bufferProgress READ bufferProgress NOTIFY bufferProgressChanged)
Q_PROPERTY(bool hasAudio READ hasAudio NOTIFY hasAudioChanged)
Q_PROPERTY(bool hasVideo READ hasVideo NOTIFY hasVideoChanged)
@@ -69,14 +68,11 @@ class Q_MULTIMEDIA_EXPORT QMediaPlayer : public QObject
Q_PROPERTY(PlaybackState playbackState READ playbackState NOTIFY playbackStateChanged)
Q_PROPERTY(bool autoPlay READ autoPlay WRITE setAutoPlay NOTIFY autoPlayChanged)
Q_PROPERTY(MediaStatus mediaStatus READ mediaStatus NOTIFY mediaStatusChanged)
- Q_PROPERTY(QAudio::Role audioRole READ audioRole WRITE setAudioRole NOTIFY audioRoleChanged)
Q_PROPERTY(QMediaMetaData metaData READ metaData NOTIFY metaDataChanged)
Q_PROPERTY(Error error READ error NOTIFY errorChanged)
Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged)
Q_PROPERTY(QObject *videoOutput READ videoOutput WRITE setVideoOutput NOTIFY videoOutputChanged)
- Q_ENUMS(PlaybackState)
- Q_ENUMS(MediaStatus)
- Q_ENUMS(Error)
+ Q_PROPERTY(QAudioOutput *audioOutput READ audioOutput WRITE setAudioOutput NOTIFY audioOutputChanged)
public:
enum PlaybackState
@@ -85,6 +81,7 @@ public:
PlayingState,
PausedState
};
+ Q_ENUM(PlaybackState)
enum MediaStatus
{
@@ -97,6 +94,7 @@ public:
EndOfMedia,
InvalidMedia
};
+ Q_ENUM(MediaStatus)
enum Error
{
@@ -106,6 +104,7 @@ public:
NetworkError,
AccessDeniedError
};
+ Q_ENUM(Error)
explicit QMediaPlayer(QObject *parent = nullptr);
~QMediaPlayer();
@@ -114,9 +113,6 @@ public:
// bool enableLowLatencyPlayback(bool tryEnable);
// bool isLowLatencyPlaybackEnabled() const;
- bool setAudioOutput(const QAudioDevice &device);
- QAudioDevice audioOutput() const;
-
QList<QMediaMetaData> audioTracks() const;
QList<QMediaMetaData> videoTracks() const;
QList<QMediaMetaData> subtitleTracks() const;
@@ -129,6 +125,9 @@ public:
void setActiveVideoTrack(int index);
void setActiveSubtitleTrack(int index);
+ void setAudioOutput(QAudioOutput *output);
+ QAudioOutput *audioOutput() const;
+
void setVideoOutput(QObject *);
QObject *videoOutput() const;
#if 0
@@ -147,8 +146,6 @@ public:
qint64 duration() const;
qint64 position() const;
- int volume() const;
- bool isMuted() const;
bool hasAudio() const;
bool hasVideo() const;
@@ -164,10 +161,6 @@ public:
bool isAvailable() const;
QMediaMetaData metaData() const;
- QAudio::Role audioRole() const;
- void setAudioRole(QAudio::Role audioRole);
- QList<QAudio::Role> supportedAudioRoles() const;
-
bool autoPlay() const;
public Q_SLOTS:
@@ -176,8 +169,6 @@ public Q_SLOTS:
void stop();
void setPosition(qint64 position);
- void setVolume(int volume);
- void setMuted(bool muted);
void setAutoPlay(bool autoPlay);
void setPlaybackRate(qreal rate);
@@ -192,8 +183,6 @@ Q_SIGNALS:
void durationChanged(qint64 duration);
void positionChanged(qint64 position);
- void volumeChanged(int volume);
- void mutedChanged(bool muted);
void autoPlayChanged(bool autoPlay);
void hasAudioChanged(bool available);
void hasVideoChanged(bool videoAvailable);
@@ -203,10 +192,9 @@ Q_SIGNALS:
void seekableChanged(bool seekable);
void playbackRateChanged(qreal rate);
- void audioRoleChanged(QAudio::Role role);
-
void metaDataChanged();
void videoOutputChanged();
+ void audioOutputChanged();
void tracksChanged();
void activeTracksChanged();
diff --git a/src/multimedia/playback/qmediaplayer_p.h b/src/multimedia/playback/qmediaplayer_p.h
index ee519fb86..f6b5a3eac 100644
--- a/src/multimedia/playback/qmediaplayer_p.h
+++ b/src/multimedia/playback/qmediaplayer_p.h
@@ -54,6 +54,7 @@
#include "qmediaplayer.h"
#include "qmediametadata.h"
#include "qvideosink.h"
+#include "qaudiooutput.h"
#include <private/qplatformmediaplayer_p.h>
#include "private/qobject_p.h"
@@ -63,7 +64,6 @@
#include <QtCore/qurl.h>
#include <QtCore/qfile.h>
#include <QtCore/qtimer.h>
-
QT_BEGIN_NAMESPACE
class QPlatformMediaPlayer;
@@ -77,6 +77,7 @@ public:
QPlatformMediaPlayer* control = nullptr;
QString errorString;
+ QAudioOutput *audioOutput = nullptr;
QVideoSink *videoSink = nullptr;
QPointer<QObject> videoOutput;
QUrl qrcMedia;
diff --git a/src/multimedia/playback/qmediaplaylist.h b/src/multimedia/playback/qmediaplaylist.h
index 9fee6c10e..734dd07c0 100644
--- a/src/multimedia/playback/qmediaplaylist.h
+++ b/src/multimedia/playback/qmediaplaylist.h
@@ -55,11 +55,12 @@ class Q_MULTIMEDIA_EXPORT QMediaPlaylist : public QObject
Q_PROPERTY(QMediaPlaylist::PlaybackMode playbackMode READ playbackMode WRITE setPlaybackMode NOTIFY playbackModeChanged)
Q_PROPERTY(QUrl currentMedia READ currentMedia NOTIFY currentMediaChanged)
Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
- Q_ENUMS(PlaybackMode Error)
public:
enum PlaybackMode { CurrentItemOnce, CurrentItemInLoop, Sequential, Loop };
+ Q_ENUM(PlaybackMode)
enum Error { NoError, FormatError, FormatNotSupportedError, NetworkError, AccessDeniedError };
+ Q_ENUM(Error)
explicit QMediaPlaylist(QObject *parent = nullptr);
virtual ~QMediaPlaylist();
diff --git a/src/multimedia/qmediaformat.cpp b/src/multimedia/qmediaformat.cpp
index 4c4596cee..c91b23425 100644
--- a/src/multimedia/qmediaformat.cpp
+++ b/src/multimedia/qmediaformat.cpp
@@ -143,7 +143,7 @@ QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QMediaFormatPrivate);
Describes an encoding format for a multimedia file or stream.
You can check whether a certain QMediaFormat can be used for encoding
- or decoding using QMediaDecoderInfo or QMediaEncoderInfo.
+ or decoding using QMediaDecoderInfo or QMediaRecorderInfo.
*/
// these are non inline to make a possible future addition of a d pointer binary compatible
@@ -424,7 +424,7 @@ bool QMediaFormat::operator==(const QMediaFormat &other) const
}
/*!
- Resolves the format to a format that is supported by QMediaEncoder.
+ Resolves the format to a format that is supported by QMediaRecorder.
This method tries to find the best possible match for unspecified settings.
Settings that are not supported by the encoder will be modified to the closest
diff --git a/src/multimedia/qmediaformat.h b/src/multimedia/qmediaformat.h
index 2a3d62917..ad3f7669e 100644
--- a/src/multimedia/qmediaformat.h
+++ b/src/multimedia/qmediaformat.h
@@ -58,9 +58,6 @@ class Q_MULTIMEDIA_EXPORT QMediaFormat
Q_PROPERTY(FileFormat fileFormat READ fileFormat WRITE setFileFormat)
Q_PROPERTY(AudioCodec audioCodec READ audioCodec WRITE setAudioCodec)
Q_PROPERTY(VideoCodec videoCodec READ videoCodec WRITE setVideoCodec)
- Q_ENUMS(FileFormat)
- Q_ENUMS(AudioCodec)
- Q_ENUMS(VideoCodec)
public:
enum FileFormat {
UnspecifiedFormat = -1,
@@ -81,6 +78,7 @@ public:
Wave,
LastFileFormat = Wave
};
+ Q_ENUM(FileFormat)
enum class AudioCodec {
Unspecified = -1,
@@ -96,6 +94,7 @@ public:
ALAC,
LastAudioCodec = ALAC
};
+ Q_ENUM(AudioCodec)
enum class VideoCodec {
Unspecified = -1,
@@ -111,6 +110,7 @@ public:
MotionJPEG,
LastVideoCodec = MotionJPEG
};
+ Q_ENUM(VideoCodec)
enum ConversionMode {
Encode,
diff --git a/src/multimedia/recording/qmediacapturesession.cpp b/src/multimedia/recording/qmediacapturesession.cpp
index 9fd68e0a9..d82800e35 100644
--- a/src/multimedia/recording/qmediacapturesession.cpp
+++ b/src/multimedia/recording/qmediacapturesession.cpp
@@ -40,7 +40,7 @@
#include "qmediacapturesession.h"
#include "qaudiodevice.h"
#include "qcamera.h"
-#include "qmediaencoder.h"
+#include "qmediarecorder.h"
#include "qcameraimagecapture.h"
#include "qvideosink.h"
@@ -48,6 +48,8 @@
#include "qplatformmediaintegration_p.h"
#include "qplatformmediacapture_p.h"
+#include "qaudioinput.h"
+#include "qaudiooutput.h"
QT_BEGIN_NAMESPACE
@@ -56,10 +58,11 @@ class QMediaCaptureSessionPrivate
public:
QMediaCaptureSession *q = nullptr;
QPlatformMediaCaptureSession *captureSession;
- QAudioDevice audioInput;
+ QAudioInput *audioInput = nullptr;
+ QAudioOutput *audioOutput = nullptr;
QCamera *camera = nullptr;
QCameraImageCapture *imageCapture = nullptr;
- QMediaEncoder *encoder = nullptr;
+ QMediaRecorder *encoder = nullptr;
QVideoSink *videoSink = nullptr;
QPointer<QObject> videoOutput;
@@ -75,6 +78,7 @@ public:
captureSession->setVideoPreview(sink);
emit q->videoOutputChanged();
}
+
};
/*!
@@ -91,12 +95,12 @@ public:
and heard by routing the audio to an output device using setAudioOutput().
You can capture still images from a camera by setting a QCameraImageCapture object on the capture session,
- and record audio/video using a QMediaEncoder.
+ and record audio/video using a QMediaRecorder.
If you need a simple class that records media from the default camera and microphone, you can use QMediaRecorder.
That class uses a QMediaCaptureSession behind the scene to support audio and video capture.
- \sa QCamera, QAudioDevice, QMediaEncoder, QCameraImageCapture, QMediaRecorder
+ \sa QCamera, QAudioDevice, QMediaRecorder, QCameraImageCapture, QMediaRecorder
*/
/*!
@@ -108,9 +112,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 +141,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 +155,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 ? device->handle() : nullptr);
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.
@@ -258,16 +220,16 @@ void QMediaCaptureSession::setImageCapture(QCameraImageCapture *imageCapture)
\brief the encoder object used to capture audio/video.
- Add a QMediaEncoder object to the capture session to enable
+ Add a QMediaRecorder object to the capture session to enable
recording of audio and/or video from the capture session.
*/
-QMediaEncoder *QMediaCaptureSession::encoder()
+QMediaRecorder *QMediaCaptureSession::encoder()
{
return d_ptr->encoder;
}
-void QMediaCaptureSession::setEncoder(QMediaEncoder *encoder)
+void QMediaCaptureSession::setEncoder(QMediaRecorder *encoder)
{
if (d_ptr->encoder == encoder)
return;
@@ -321,6 +283,22 @@ QVideoSink *QMediaCaptureSession::videoSink() const
return d->videoSink;
}
+void QMediaCaptureSession::setAudioOutput(QAudioOutput *output)
+{
+ Q_D(QMediaCaptureSession);
+ if (d->audioOutput == output)
+ return;
+ d->audioOutput = output;
+ d->captureSession->setAudioOutput(output ? output->handle() : nullptr);
+ emit audioOutputChanged();
+}
+
+QAudioOutput *QMediaCaptureSession::audioOutput() const
+{
+ Q_D(const QMediaCaptureSession);
+ return d->audioOutput;
+}
+
/*!
\internal
*/
diff --git a/src/multimedia/recording/qmediacapturesession.h b/src/multimedia/recording/qmediacapturesession.h
index 947b964c9..8d662a3bd 100644
--- a/src/multimedia/recording/qmediacapturesession.h
+++ b/src/multimedia/recording/qmediacapturesession.h
@@ -46,10 +46,11 @@
QT_BEGIN_NAMESPACE
class QCamera;
-class QAudioDevice;
+class QAudioInput;
+class QAudioOutput;
class QCameraDevice;
class QCameraImageCapture; // ### rename to QMediaImageCapture
-class QMediaEncoder;
+class QMediaRecorder;
class QPlatformMediaCaptureSession;
class QVideoSink;
@@ -57,12 +58,10 @@ 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)
+ Q_PROPERTY(QMediaRecorder *encoder READ encoder WRITE setEncoder NOTIFY encoderChanged)
Q_PROPERTY(QObject *videoOutput READ videoOutput WRITE setVideoOutput NOTIFY videoOutputChanged)
public:
explicit QMediaCaptureSession(QObject *parent = nullptr);
@@ -70,13 +69,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);
@@ -84,8 +78,8 @@ public:
QCameraImageCapture *imageCapture();
void setImageCapture(QCameraImageCapture *imageCapture);
- QMediaEncoder *encoder();
- void setEncoder(QMediaEncoder *recorder);
+ QMediaRecorder *encoder();
+ void setEncoder(QMediaRecorder *recorder);
void setVideoOutput(QObject *preview);
QObject *videoOutput() const;
@@ -93,16 +87,18 @@ public:
void setVideoSink(QVideoSink *preview);
QVideoSink *videoSink() const;
+ void setAudioOutput(QAudioOutput *output);
+ QAudioOutput *audioOutput() const;
+
QPlatformMediaCaptureSession *platformSession() const;
Q_SIGNALS:
void audioInputChanged();
- void mutedChanged(bool muted);
- void volumeChanged(qreal volume);
void cameraChanged();
void imageCaptureChanged();
void encoderChanged();
void videoOutputChanged();
+ void audioOutputChanged();
private:
QMediaCaptureSessionPrivate *d_ptr;
diff --git a/src/multimedia/recording/qmediaencoder.cpp b/src/multimedia/recording/qmediaencoder.cpp
deleted file mode 100644
index 38bccde8e..000000000
--- a/src/multimedia/recording/qmediaencoder.cpp
+++ /dev/null
@@ -1,484 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qmediaencoder_p.h"
-
-#include <private/qplatformmediaencoder_p.h>
-#include <qaudiodevice.h>
-#include <qcamera.h>
-#include <qmediacapturesession.h>
-#include <private/qplatformcamera_p.h>
-#include <private/qplatformmediaintegration_p.h>
-#include <private/qplatformmediacapture_p.h>
-
-#include <QtCore/qdebug.h>
-#include <QtCore/qurl.h>
-#include <QtCore/qstringlist.h>
-#include <QtCore/qmetaobject.h>
-#include <QtCore/qtimer.h>
-
-#include <qaudioformat.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QMediaEncoder
- \inmodule QtMultimedia
- \ingroup multimedia
- \ingroup multimedia_recording
-
- \brief The QMediaEncoder class is used for the encoding and recording a capture session.
-
- The QMediaEncoder class is a class for encoding and recording media generated in a
- QMediaCaptureSession.
-
- \snippet multimedia-snippets/media.cpp Media encoder
-*/
-
-void QMediaEncoderPrivate::applySettingsLater()
-{
- if (control && !settingsChanged) {
- settingsChanged = true;
- QMetaObject::invokeMethod(q_func(), "_q_applySettings", Qt::QueuedConnection);
- }
-}
-
-void QMediaEncoderPrivate::_q_applySettings()
-{
- if (control && settingsChanged) {
- settingsChanged = false;
- control->applySettings();
- }
-}
-
-/*!
- Constructs a media encoder which records the media produced by a microphone and camera.
-*/
-
-QMediaEncoder::QMediaEncoder(QObject *parent)
- : QMediaEncoderBase(parent),
- d_ptr(new QMediaEncoderPrivate)
-{
- Q_D(QMediaEncoder);
- d->q_ptr = this;
- d->control = QPlatformMediaIntegration::instance()->createEncoder(this);
-}
-
-/*!
- Destroys a media encoder object.
-*/
-
-QMediaEncoder::~QMediaEncoder()
-{
- if (d_ptr->captureSession) {
- if (d_ptr->captureSession->platformSession())
- d_ptr->captureSession->platformSession()->setMediaEncoder(nullptr);
- d_ptr->captureSession->setEncoder(nullptr);
- }
- delete d_ptr->control;
- delete d_ptr;
-}
-
-/*!
- \internal
-*/
-void QMediaEncoder::setCaptureSession(QMediaCaptureSession *session)
-{
- Q_D(QMediaEncoder);
- if (d->captureSession == session)
- return;
-
- d->captureSession = session;
-
- if (!d->captureSession)
- return;
-
- QPlatformMediaCaptureSession *platformSession = session->platformSession();
- if (!platformSession || !d->control)
- return;
-
- platformSession->setMediaEncoder(d->control);
- d->applySettingsLater();
-
-}
-
-/*!
- \property QMediaEncoder::outputLocation
- \brief the destination location of media content.
-
- Setting the location can fail, for example when the service supports only
- local file system locations but a network URL was passed. If the service
- does not support media recording this setting the output location will
- always fail.
-
- The \a location can be relative or empty;
- in this case the encoder uses the system specific place and file naming scheme.
- After recording has stated, QMediaEncoder::outputLocation() returns the actual output location.
-*/
-
-/*!
- \property QMediaEncoder::actualLocation
- \brief the actual location of the last media content.
-
- The actual location is usually available after recording starts,
- and reset when new location is set or new recording starts.
-*/
-
-/*!
- Returns true if media encoder service ready to use.
-
- \sa availabilityChanged()
-*/
-bool QMediaEncoder::isAvailable() const
-{
- return d_func()->control != nullptr && d_func()->captureSession;
-}
-
-QUrl QMediaEncoder::outputLocation() const
-{
- return d_func()->control ? d_func()->control->outputLocation() : QUrl();
-}
-
-bool QMediaEncoder::setOutputLocation(const QUrl &location)
-{
- Q_D(QMediaEncoder);
- if (!d->control)
- return false;
- d->control->clearActualLocation();
- if (d->control && d->captureSession)
- return d->control->setOutputLocation(location);
- return false;
-}
-
-QUrl QMediaEncoder::actualLocation() const
-{
- Q_D(const QMediaEncoder);
- return d->control ? d->control->actualLocation() : QUrl();
-}
-
-/*!
- Returns the current media encoder state.
-
- \sa QMediaEncoder::State
-*/
-
-QMediaEncoder::State QMediaEncoder::state() const
-{
- return d_func()->control ? QMediaEncoder::State(d_func()->control->state()) : StoppedState;
-}
-
-/*!
- Returns the current media encoder status.
-
- \sa QMediaEncoder::Status
-*/
-
-QMediaEncoderBase::Status QMediaEncoder::status() const
-{
- Q_D(const QMediaEncoder);
- return d->control ? d->control->status() : UnavailableStatus;
-}
-
-/*!
- Returns the current error state.
-
- \sa errorString()
-*/
-
-QMediaEncoderBase::Error QMediaEncoder::error() const
-{
- Q_D(const QMediaEncoder);
-
- return d->control ? d->control->error() : QMediaEncoder::ResourceError;
-}
-
-/*!
- Returns a string describing the current error state.
-
- \sa error()
-*/
-
-QString QMediaEncoder::errorString() const
-{
- Q_D(const QMediaEncoder);
-
- return d->control ? d->control->errorString() : tr("QMediaEncoder not supported on this platform");
-}
-
-/*!
- \property QMediaEncoder::duration
-
- \brief the recorded media duration in milliseconds.
-*/
-
-qint64 QMediaEncoder::duration() const
-{
- return d_func()->control ? d_func()->control->duration() : 0;
-}
-
-/*!
- Sets the encoder settings to \a settings.
-
- \sa QMediaEncoderSettings
-*/
-void QMediaEncoder::setEncoderSettings(const QMediaEncoderSettings &settings)
-{
- Q_D(QMediaEncoder);
-
- d->encoderSettings = settings;
- if (d->control && d->captureSession)
- d->control->setEncoderSettings(settings);
- d->applySettingsLater();
-}
-
-/*!
- Returns the current encoder settings.
-
- \sa QMediaEncoderSettings
-*/
-QMediaEncoderSettings QMediaEncoder::encoderSettings() const
-{
- return d_func()->encoderSettings;
-}
-
-/*!
- Start recording.
-
- While the encoder state is changed immediately to QMediaEncoder::RecordingState,
- recording may start asynchronously, with statusChanged(QMediaEncoder::RecordingStatus)
- signal emitted when recording starts.
-
- If recording fails error() signal is emitted
- with encoder state being reset back to QMediaEncoder::StoppedState.
-*/
-
-void QMediaEncoder::record()
-{
- Q_D(QMediaEncoder);
-
- if (!d->control)
- return;
- d->control->clearActualLocation();
-
- if (d->settingsChanged)
- d->control->applySettings();
-
- d->control->clearError();
-
- if (d->control && d->captureSession)
- d->control->setState(QMediaRecorder::RecordingState);
-}
-
-/*!
- Pause recording.
-
- The encoder state is changed to QMediaEncoder::PausedState.
-
- Depending on platform recording pause may be not supported,
- in this case the encoder state stays unchanged.
-*/
-
-void QMediaEncoder::pause()
-{
- Q_D(QMediaEncoder);
- if (d->control && d->captureSession)
- d->control->setState(QMediaRecorder::PausedState);
-}
-
-/*!
- Stop recording.
-
- The encoder state is changed to QMediaEncoder::StoppedState.
-*/
-
-void QMediaEncoder::stop()
-{
- Q_D(QMediaEncoder);
- if (d->control && d->captureSession)
- d->control->setState(QMediaRecorder::StoppedState);
-}
-
-/*!
- \enum QMediaEncoderBase::State
-
- \value StoppedState The recorder is not active.
- If this is the state after recording then the actual created recording has
- finished being written to the final location and is ready on all platforms
- except on Android. On Android, due to platform limitations, there is no way
- to be certain that the recording has finished writing to the final location.
- \value RecordingState The recording is requested.
- \value PausedState The recorder is paused.
-*/
-
-/*!
- \enum QMediaEncoderBase::Status
-
- \value UnavailableStatus
- The recorder is not available or not supported by connected media object.
- \value UnloadedStatus
- The recorder is avilable but not loaded.
- \value LoadingStatus
- The recorder is initializing.
- \value LoadedStatus
- The recorder is initialized and ready to record media.
- \value StartingStatus
- Recording is requested but not active yet.
- \value RecordingStatus
- Recording is active.
- \value PausedStatus
- Recording is paused.
- \value FinalizingStatus
- Recording is stopped with media being finalized.
-*/
-
-/*!
- \enum QMediaEncoderBase::Error
-
- \value NoError No Errors.
- \value ResourceError Device is not ready or not available.
- \value FormatError Current format is not supported.
- \value OutOfSpaceError No space left on device.
-*/
-
-/*!
- \property QMediaEncoder::state
- \brief The current state of the media recorder.
-
- The state property represents the user request and is changed synchronously
- during record(), pause() or stop() calls.
- Recorder state may also change asynchronously when recording fails.
-*/
-
-/*!
- \property QMediaEncoder::status
- \brief The current status of the media recorder.
-
- The status is changed asynchronously and represents the actual status
- of media recorder.
-*/
-
-/*!
- \fn QMediaEncoder::stateChanged(State state)
-
- Signals that a media recorder's \a state has changed.
-*/
-
-/*!
- \fn QMediaEncoder::durationChanged(qint64 duration)
-
- Signals that the \a duration of the recorded media has changed.
-*/
-
-/*!
- \fn QMediaEncoder::actualLocationChanged(const QUrl &location)
-
- Signals that the actual \a location of the recorded media has changed.
- This signal is usually emitted when recording starts.
-*/
-
-/*!
- \fn QMediaEncoder::error(QMediaEncoder::Error error)
-
- Signals that an \a error has occurred.
-*/
-
-/*!
- \fn QMediaEncoder::availabilityChanged(bool available)
-
- Signals that the media recorder is now available (if \a available is true), or not.
-*/
-
-/*!
- \fn QMediaEncoder::mutedChanged(bool muted)
-
- Signals that the \a muted state has changed. If true the recording is being muted.
-*/
-
-/*!
- Returns the metaData associated with the recording.
-*/
-QMediaMetaData QMediaEncoder::metaData() const
-{
- Q_D(const QMediaEncoder);
-
- return d->control ? d->control->metaData() : QMediaMetaData{};
-}
-
-/*!
- Sets the meta data tp \a metaData.
-
- \note To ensure that meta data is set corretly, it should be set before starting the recording.
- Once the recording is stopped, any meta data set will be attached to the next recording.
-*/
-void QMediaEncoder::setMetaData(const QMediaMetaData &metaData)
-{
- Q_D(QMediaEncoder);
-
- if (d->control && d->captureSession)
- d->control->setMetaData(metaData);
-}
-
-void QMediaEncoder::addMetaData(const QMediaMetaData &metaData)
-{
- auto data = this->metaData();
- // merge data
- for (const auto &k : metaData.keys())
- data.insert(k, metaData.value(k));
- setMetaData(data);
-}
-
-/*!
- \fn QMediaEncoder::metaDataChanged()
-
- Signals that a media object's meta-data has changed.
-
- If multiple meta-data elements are changed,
- metaDataChanged(const QString &key, const QVariant &value) signal is emitted
- for each of them with metaDataChanged() changed emitted once.
-*/
-
-QMediaCaptureSession *QMediaEncoder::captureSession() const
-{
- Q_D(const QMediaEncoder);
- return d->captureSession;
-}
-
-QT_END_NAMESPACE
-
-#include "moc_qmediaencoder.cpp"
diff --git a/src/multimedia/recording/qmediaencoder.h b/src/multimedia/recording/qmediaencoder.h
deleted file mode 100644
index 02bc49ee2..000000000
--- a/src/multimedia/recording/qmediaencoder.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QMEDIAENCODER_H
-#define QMEDIAENCODER_H
-
-#include <QtCore/qobject.h>
-#include <QtMultimedia/qtmultimediaglobal.h>
-#include <QtMultimedia/qmediaencodersettings.h>
-#include <QtMultimedia/qmediaenumdebug.h>
-#include <QtMultimedia/qmediametadata.h>
-
-#include <QtCore/qpair.h>
-
-QT_BEGIN_NAMESPACE
-
-class QUrl;
-class QSize;
-class QAudioFormat;
-class QCamera;
-class QCameraDevice;
-class QMediaRecorderService;
-class QAudioEncoderSettings;
-class QVideoEncoderSettings;
-class QAudioDevice;
-class QMediaCaptureSession;
-
-class Q_MULTIMEDIA_EXPORT QMediaEncoderBase : public QObject
-{
- Q_OBJECT
- Q_ENUMS(State)
- Q_ENUMS(Status)
- Q_ENUMS(Error)
-
-public:
- QMediaEncoderBase(QObject *parent) : QObject(parent) {}
- enum State
- {
- StoppedState,
- RecordingState,
- PausedState
- };
-
- enum Status {
- UnavailableStatus,
- StoppedStatus,
- StartingStatus,
- RecordingStatus,
- PausedStatus,
- FinalizingStatus
- };
-
- enum Error
- {
- NoError,
- ResourceError,
- FormatError,
- OutOfSpaceError
- };
-
-};
-
-class QMediaEncoderPrivate;
-class Q_MULTIMEDIA_EXPORT QMediaEncoder : public QMediaEncoderBase
-{
- Q_OBJECT
- Q_PROPERTY(QMediaEncoderBase::State state READ state NOTIFY stateChanged)
- Q_PROPERTY(QMediaEncoderBase::Status status READ status NOTIFY statusChanged)
- 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(QMediaMetaData metaData READ metaData WRITE setMetaData NOTIFY metaDataChanged)
- Q_PROPERTY(QMediaEncoderBase::Error error READ error NOTIFY errorChanged)
- Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged)
-
-public:
- QMediaEncoder(QObject *parent = nullptr);
- ~QMediaEncoder();
-
- bool isAvailable() const;
-
- QUrl outputLocation() const;
- bool setOutputLocation(const QUrl &location);
-
- QUrl actualLocation() const;
-
- QMediaEncoderBase::State state() const;
- QMediaEncoderBase::Status status() const;
-
- QMediaEncoderBase::Error error() const;
- QString errorString() const;
-
- qint64 duration() const;
-
- void setEncoderSettings(const QMediaEncoderSettings &);
- QMediaEncoderSettings encoderSettings() const;
-
- QMediaMetaData metaData() const;
- void setMetaData(const QMediaMetaData &metaData);
- void addMetaData(const QMediaMetaData &metaData);
-
- QMediaCaptureSession *captureSession() const;
-
-public Q_SLOTS:
- void record();
- void pause();
- void stop();
-
-Q_SIGNALS:
- void stateChanged(QMediaEncoder::State state);
- void statusChanged(QMediaEncoder::Status status);
- void durationChanged(qint64 duration);
- void actualLocationChanged(const QUrl &location);
-
- void errorOccurred(QMediaEncoder::Error error, const QString &errorString);
- void errorChanged();
-
- void metaDataChanged();
-
-private:
- QMediaEncoderPrivate *d_ptr;
- friend class QMediaCaptureSession;
- void setCaptureSession(QMediaCaptureSession *session);
- Q_DISABLE_COPY(QMediaEncoder)
- Q_DECLARE_PRIVATE(QMediaEncoder)
- Q_PRIVATE_SLOT(d_func(), void _q_applySettings())
-};
-
-QT_END_NAMESPACE
-
-Q_MEDIA_ENUM_DEBUG(QMediaEncoderBase, State)
-Q_MEDIA_ENUM_DEBUG(QMediaEncoderBase, Status)
-Q_MEDIA_ENUM_DEBUG(QMediaEncoderBase, Error)
-
-#endif // QMEDIAENCODER_H
diff --git a/src/multimedia/recording/qmediaencodersettings.cpp b/src/multimedia/recording/qmediaencodersettings.cpp
index 561a63de9..833155089 100644
--- a/src/multimedia/recording/qmediaencodersettings.cpp
+++ b/src/multimedia/recording/qmediaencodersettings.cpp
@@ -344,233 +344,4 @@ bool QMediaEncoderSettings::operator==(const QMediaEncoderSettings &other) const
d->videoBitRate == other.d->videoBitRate;
}
-
-class QImageEncoderSettingsPrivate : public QSharedData
-{
-public:
- bool isNull = true;
- QImageEncoderSettings::FileFormat format = QImageEncoderSettings::UnspecifiedFormat;
- QSize resolution;
- QImageEncoderSettings::Quality quality = QImageEncoderSettings::NormalQuality;
-};
-
-/*!
- \class QImageEncoderSettings
-
-
- \brief The QImageEncoderSettings class provides a set of image encoder
- settings.
-
- \inmodule QtMultimedia
- \ingroup multimedia
- \ingroup multimedia_camera
-
- A image encoder settings object is used to specify the image encoder
- settings used by QCameraImageCapture. Image encoder settings are selected
- by constructing a QImageEncoderSettings object, setting the desired
- properties and then passing it to a QCameraImageCapture instance using the
- QCameraImageCapture::setImageSettings() function.
-
- \snippet multimedia-snippets/media.cpp Image encoder settings
-
- \sa QImageEncoderControl
-*/
-
-/*!
- Constructs a null image encoder settings object.
-*/
-
-QImageEncoderSettings::QImageEncoderSettings()
- :d(new QImageEncoderSettingsPrivate)
-{
-}
-
-/*!
- Constructs a copy of the image encoder settings object \a other.
-*/
-
-QImageEncoderSettings::QImageEncoderSettings(const QImageEncoderSettings& other) = default;
-
-/*!
- Destroys a image encoder settings object.
-*/
-
-QImageEncoderSettings::~QImageEncoderSettings() = default;
-
-/*!
- Assigns the value of \a other to a image encoder settings object.
-*/
-QImageEncoderSettings &QImageEncoderSettings::operator=(const QImageEncoderSettings &other) = default;
-
-/*!
- Determines if \a other is of equal value to a image encoder settings
- object.
-
- Returns true if the settings objects are of equal value, and false if they
- are not of equal value.
-*/
-bool QImageEncoderSettings::operator==(const QImageEncoderSettings &other) const
-{
- return (d == other.d) ||
- (d->isNull == other.d->isNull &&
- d->quality == other.d->quality &&
- d->format == other.d->format &&
- d->resolution == other.d->resolution);
-
-}
-
-/*!
- Determines if \a other is of equal value to a image encoder settings
- object.
-
- Returns true if the settings objects are not of equal value, and false if
- they are of equal value.
-*/
-bool QImageEncoderSettings::operator!=(const QImageEncoderSettings &other) const
-{
- return !(*this == other);
-}
-
-/*!
- Identifies if a image encoder settings object is uninitalized.
-
- Returns true if the settings are null, and false if they are not.
-*/
-bool QImageEncoderSettings::isNull() const
-{
- return d->isNull;
-}
-
-/*!
- Returns the image format.
-*/
-
-QImageEncoderSettings::FileFormat QImageEncoderSettings::format() const
-{
- return d->format;
-}
-
-/*!
- Sets the image \a format.
-*/
-void QImageEncoderSettings::setFormat(QImageEncoderSettings::FileFormat format)
-{
- d->isNull = false;
- d->format = format;
-}
-
-QList<QImageEncoderSettings::FileFormat> QImageEncoderSettings::supportedFormats()
-{
- return QPlatformMediaIntegration::instance()->formatInfo()->imageFormats;
-}
-
-QString QImageEncoderSettings::fileFormatName(QImageEncoderSettings::FileFormat f)
-{
- const char *name = nullptr;
- switch (f) {
- case UnspecifiedFormat:
- name = "Unspecified image format";
- break;
- case JPEG:
- name = "JPEG";
- break;
- case PNG:
- name = "PNG";
- break;
- case WebP:
- name = "WebP";
- break;
- case Tiff:
- name = "Tiff";
- break;
- }
- return QString::fromUtf8(name);
-}
-
-QString QImageEncoderSettings::fileFormatDescription(QImageEncoderSettings::FileFormat f)
-{
- const char *name = nullptr;
- switch (f) {
- case UnspecifiedFormat:
- name = "Unspecified image format";
- break;
- case JPEG:
- name = "JPEG";
- break;
- case PNG:
- name = "PNG";
- break;
- case WebP:
- name = "WebP";
- break;
- case Tiff:
- name = "Tiff";
- break;
- }
- return QString::fromUtf8(name);
-}
-
-/*!
- Returns the resolution of the encoded image.
-*/
-
-QSize QImageEncoderSettings::resolution() const
-{
- return d->resolution;
-}
-
-/*!
- Sets the \a resolution of the encoded image.
-
- An empty QSize indicates the encoder should make an optimal choice based on
- what is available from the image source and the limitations of the codec.
-*/
-
-void QImageEncoderSettings::setResolution(const QSize &resolution)
-{
- d->isNull = false;
- d->resolution = resolution;
-}
-
-/*!
- Sets the \a width and \a height of the resolution of the encoded image.
-
- \overload
-*/
-
-void QImageEncoderSettings::setResolution(int width, int height)
-{
- d->isNull = false;
- d->resolution = QSize(width, height);
-}
-
-/*!
- \enum QImageEncoderSettings::EncodingQuality
-
- Enumerates quality encoding levels.
-
- \value VeryLowQuality
- \value LowQuality
- \value NormalQuality
- \value HighQuality
- \value VeryHighQuality
-*/
-
-/*!
- Returns the image encoding quality.
-*/
-QImageEncoderSettings::Quality QImageEncoderSettings::quality() const
-{
- return d->quality;
-}
-
-/*!
- Sets the image encoding \a quality.
-*/
-void QImageEncoderSettings::setQuality(Quality quality)
-{
- d->isNull = false;
- d->quality = quality;
-}
-
QT_END_NAMESPACE
diff --git a/src/multimedia/recording/qmediaencodersettings.h b/src/multimedia/recording/qmediaencodersettings.h
index 8a2a1c397..7e24e2018 100644
--- a/src/multimedia/recording/qmediaencodersettings.h
+++ b/src/multimedia/recording/qmediaencodersettings.h
@@ -37,8 +37,8 @@
**
****************************************************************************/
-#ifndef QMEDIAENCODERSETTINGS_H
-#define QMEDIAENCODERSETTINGS_H
+#ifndef QMediaEncoderSettings_H
+#define QMediaEncoderSettings_H
#include <QtCore/qsharedpointer.h>
#include <QtCore/qstring.h>
@@ -55,7 +55,6 @@ class Q_MULTIMEDIA_EXPORT QMediaEncoderSettings
Q_GADGET
Q_PROPERTY(QMediaFormat mediaFormat READ mediaFormat WRITE setMediaFormat)
Q_PROPERTY(Quality quality READ quality WRITE setQuality)
- Q_ENUMS(Quality)
public:
enum Quality
{
@@ -65,6 +64,7 @@ public:
HighQuality,
VeryHighQuality
};
+ Q_ENUM(Quality)
enum EncodingMode
{
@@ -129,57 +129,6 @@ private:
QSharedDataPointer<QMediaEncoderSettingsPrivate> d;
};
-class QImageEncoderSettingsPrivate;
-class Q_MULTIMEDIA_EXPORT QImageEncoderSettings
-{
-public:
- enum Quality
- {
- VeryLowQuality,
- LowQuality,
- NormalQuality,
- HighQuality,
- VeryHighQuality
- };
-
- enum FileFormat {
- UnspecifiedFormat,
- JPEG,
- PNG,
- WebP,
- Tiff,
- LastFileFormat = Tiff
- };
-
- QImageEncoderSettings();
- QImageEncoderSettings(const QImageEncoderSettings& other);
-
- ~QImageEncoderSettings();
-
- QImageEncoderSettings& operator=(const QImageEncoderSettings &other);
- bool operator==(const QImageEncoderSettings &other) const;
- bool operator!=(const QImageEncoderSettings &other) const;
-
- bool isNull() const;
-
- FileFormat format() const;
- void setFormat(FileFormat format);
-
- static QList<FileFormat> supportedFormats();
- static QString fileFormatName(FileFormat c);
- static QString fileFormatDescription(FileFormat c);
-
- QSize resolution() const;
- void setResolution(const QSize &);
- void setResolution(int width, int height);
-
- Quality quality() const;
- void setQuality(Quality quality);
-
-private:
- QSharedDataPointer<QImageEncoderSettingsPrivate> d;
-};
-
QT_END_NAMESPACE
#endif
diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp
index 6986cd2b7..24b1c21b4 100644
--- a/src/multimedia/recording/qmediarecorder.cpp
+++ b/src/multimedia/recording/qmediarecorder.cpp
@@ -37,31 +37,25 @@
**
****************************************************************************/
-#include "qmediarecorder.h"
+#include "qmediarecorder_p.h"
+#include <private/qplatformmediaencoder_p.h>
#include <qaudiodevice.h>
#include <qcamera.h>
#include <qmediacapturesession.h>
-#include <qmediaencoder.h>
-#include <qcamera.h>
+#include <private/qplatformcamera_p.h>
+#include <private/qplatformmediaintegration_p.h>
+#include <private/qplatformmediacapture_p.h>
#include <QtCore/qdebug.h>
#include <QtCore/qurl.h>
#include <QtCore/qstringlist.h>
+#include <QtCore/qmetaobject.h>
+#include <QtCore/qtimer.h>
-QT_BEGIN_NAMESPACE
-
-class QMediaRecorderPrivate
-{
- Q_DECLARE_PUBLIC(QMediaRecorder)
-public:
- QMediaRecorder::CaptureMode mode = QMediaRecorder::AudioOnly;
- QMediaCaptureSession *captureSession = nullptr;
- QCamera *camera = nullptr;
- QMediaEncoder *encoder = nullptr;
+#include <qaudioformat.h>
- QMediaRecorder *q_ptr = nullptr;
-};
+QT_BEGIN_NAMESPACE
/*!
\class QMediaRecorder
@@ -69,56 +63,82 @@ public:
\ingroup multimedia
\ingroup multimedia_recording
- \brief The QMediaRecorder class is used for the recording of media content.
+ \brief The QMediaRecorder class is used for the encoding and recording a capture session.
- The QMediaRecorder class is a high level media recording class. It's
- intended to be used as a simple standalone class to record from the default
- camera and microphone.
+ The QMediaRecorder class is a class for encoding and recording media generated in a
+ QMediaCaptureSession.
- \snippet multimedia-snippets/media.cpp Media recorder
+ \snippet multimedia-snippets/media.cpp Media encoder
+*/
- If you need a more flexible setup, use QMediaCaptureSession.
+void QMediaRecorderPrivate::applySettingsLater()
+{
+ if (control && !settingsChanged) {
+ settingsChanged = true;
+ QMetaObject::invokeMethod(q_func(), "_q_applySettings", Qt::QueuedConnection);
+ }
+}
- \sa QMediaCaptureSession
-*/
+void QMediaRecorderPrivate::_q_applySettings()
+{
+ if (control && settingsChanged) {
+ settingsChanged = false;
+ control->applySettings();
+ }
+}
/*!
- Constructs a media recorder with \a parent and \a mode.
-
- QMediaRecorder will always use the default microphone and camera of the system.
- The CaptureMode \a mode parameter can be used to determine whether the recorder
- should only record audio or also use the camera.
+ Constructs a media encoder which records the media produced by a microphone and camera.
*/
-QMediaRecorder::QMediaRecorder(QObject *parent, CaptureMode mode)
- : QMediaEncoderBase(parent),
+QMediaRecorder::QMediaRecorder(QObject *parent)
+ : QObject(parent),
d_ptr(new QMediaRecorderPrivate)
{
Q_D(QMediaRecorder);
d->q_ptr = this;
-
- d->captureSession = new QMediaCaptureSession(this);
- d->encoder = new QMediaEncoder(this);
- d->captureSession->setEncoder(d->encoder);
- setCaptureMode(mode);
-
- connect(d->encoder, &QMediaEncoder::stateChanged, this, &QMediaRecorder::stateChanged);
- connect(d->encoder, &QMediaEncoder::statusChanged, this, &QMediaRecorder::statusChanged);
- connect(d->captureSession, &QMediaCaptureSession::mutedChanged, this, &QMediaRecorder::mutedChanged);
- connect(d->captureSession, &QMediaCaptureSession::volumeChanged, this, &QMediaRecorder::volumeChanged);
- connect(d->captureSession, &QMediaCaptureSession::videoOutputChanged, this, &QMediaRecorder::videoOutputChanged);
+ d->control = QPlatformMediaIntegration::instance()->createEncoder(this);
}
/*!
- Destroys a media recorder object.
+ Destroys a media encoder object.
*/
QMediaRecorder::~QMediaRecorder()
{
+ if (d_ptr->captureSession) {
+ if (d_ptr->captureSession->platformSession())
+ d_ptr->captureSession->platformSession()->setMediaEncoder(nullptr);
+ d_ptr->captureSession->setEncoder(nullptr);
+ }
+ delete d_ptr->control;
delete d_ptr;
}
/*!
+ \internal
+*/
+void QMediaRecorder::setCaptureSession(QMediaCaptureSession *session)
+{
+ Q_D(QMediaRecorder);
+ if (d->captureSession == session)
+ return;
+
+ d->captureSession = session;
+
+ if (!d->captureSession)
+ return;
+
+ QPlatformMediaCaptureSession *platformSession = session->platformSession();
+ if (!platformSession || !d->control)
+ return;
+
+ platformSession->setMediaEncoder(d->control);
+ d->applySettingsLater();
+
+}
+
+/*!
\property QMediaRecorder::outputLocation
\brief the destination location of media content.
@@ -128,7 +148,7 @@ QMediaRecorder::~QMediaRecorder()
always fail.
The \a location can be relative or empty;
- in this case the recorder uses the system specific place and file naming scheme.
+ in this case the encoder uses the system specific place and file naming scheme.
After recording has stated, QMediaRecorder::outputLocation() returns the actual output location.
*/
@@ -141,87 +161,58 @@ QMediaRecorder::~QMediaRecorder()
*/
/*!
- Returns true if media recorder service ready to use.
+ Returns true if media encoder service ready to use.
\sa availabilityChanged()
*/
bool QMediaRecorder::isAvailable() const
{
- return d_ptr->encoder->isAvailable();
-}
-
-/*!
- \property QMediaRecorder::captureMode
- \brief The current mode the recorder operates in.
-
- The capture mode defines whether QMediaRecorder will record audio and
- video or audio only.
-
- The capture mode can only be changed while nothing is being recorded.
-*/
-
-QMediaRecorder::CaptureMode QMediaRecorder::captureMode() const
-{
- return d_ptr->mode;
-}
-
-void QMediaRecorder::setCaptureMode(QMediaRecorder::CaptureMode mode)
-{
- if (d_ptr->mode == mode)
- return;
- if (mode == AudioAndVideo) {
- Q_ASSERT(!d_ptr->camera);
- d_ptr->camera = new QCamera(this);
- d_ptr->captureSession->setCamera(d_ptr->camera);
- } else { // AudioOnly
- Q_ASSERT(d_ptr->camera);
- d_ptr->captureSession->setCamera(nullptr);
- delete d_ptr->camera;
- d_ptr->camera = nullptr;
- }
-}
-
-/*!
- Returns the camera object associated with this recording session.
- If the current \l captureMode is \l AudioOnly, a nullptr will be
- returned.
- */
-QCamera *QMediaRecorder::camera() const
-{
- return d_ptr->camera;
+ return d_func()->control != nullptr && d_func()->captureSession;
}
QUrl QMediaRecorder::outputLocation() const
{
- return d_ptr->encoder->outputLocation();
+ return d_func()->control ? d_func()->control->outputLocation() : QUrl();
}
bool QMediaRecorder::setOutputLocation(const QUrl &location)
{
Q_D(QMediaRecorder);
- return d->encoder->setOutputLocation(location);
+ if (!d->control)
+ return false;
+ d->control->clearActualLocation();
+ if (d->control && d->captureSession)
+ return d->control->setOutputLocation(location);
+ return false;
+}
+
+QUrl QMediaRecorder::actualLocation() const
+{
+ Q_D(const QMediaRecorder);
+ return d->control ? d->control->actualLocation() : QUrl();
}
/*!
- Returns the current media recorder state.
+ Returns the current media encoder state.
- \sa QMediaRecorder::State
+ \sa QMediaRecorder::RecorderState
*/
-QMediaEncoderBase::State QMediaRecorder::state() const
+QMediaRecorder::RecorderState QMediaRecorder::recorderState() const
{
- return d_ptr->encoder->state();
+ return d_func()->control ? QMediaRecorder::RecorderState(d_func()->control->state()) : StoppedState;
}
/*!
- Returns the current media recorder status.
+ Returns the current media encoder status.
\sa QMediaRecorder::Status
*/
-QMediaEncoderBase::Status QMediaRecorder::status() const
+QMediaRecorder::Status QMediaRecorder::status() const
{
- return d_ptr->encoder->status();
+ Q_D(const QMediaRecorder);
+ return d->control ? d->control->status() : UnavailableStatus;
}
/*!
@@ -230,9 +221,11 @@ QMediaEncoderBase::Status QMediaRecorder::status() const
\sa errorString()
*/
-QMediaEncoderBase::Error QMediaRecorder::error() const
+QMediaRecorder::Error QMediaRecorder::error() const
{
- return d_ptr->encoder->error();
+ Q_D(const QMediaRecorder);
+
+ return d->control ? d->control->error() : QMediaRecorder::ResourceError;
}
/*!
@@ -243,7 +236,9 @@ QMediaEncoderBase::Error QMediaRecorder::error() const
QString QMediaRecorder::errorString() const
{
- return d_ptr->encoder->errorString();
+ Q_D(const QMediaRecorder);
+
+ return d->control ? d->control->errorString() : tr("QMediaRecorder not supported on this platform");
}
/*!
@@ -254,48 +249,7 @@ QString QMediaRecorder::errorString() const
qint64 QMediaRecorder::duration() const
{
- return d_ptr->encoder->duration();
-}
-
-/*!
- \property QMediaRecorder::muted
-
- \brief whether a recording audio stream is muted.
-*/
-
-bool QMediaRecorder::isMuted() const
-{
- return d_ptr->captureSession->isMuted();
-}
-
-void QMediaRecorder::setMuted(bool muted)
-{
- d_ptr->captureSession->setMuted(muted);
-}
-
-/*!
- \property QMediaRecorder::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 QMediaRecorder::volume() const
-{
- return d_ptr->captureSession->volume();
-}
-
-void QMediaRecorder::setVolume(qreal volume)
-{
- d_ptr->captureSession->setVolume(volume);
+ return d_func()->control ? d_func()->control->duration() : 0;
}
/*!
@@ -305,7 +259,16 @@ void QMediaRecorder::setVolume(qreal volume)
*/
void QMediaRecorder::setEncoderSettings(const QMediaEncoderSettings &settings)
{
- d_ptr->encoder->setEncoderSettings(settings);
+ Q_D(QMediaRecorder);
+ if (d->encoderSettings == settings)
+ return;
+
+ d->encoderSettings = settings;
+ if (d->control && d->captureSession)
+ d->control->setEncoderSettings(settings);
+ d->applySettingsLater();
+
+ emit encoderSettingsChanged();
}
/*!
@@ -315,53 +278,110 @@ void QMediaRecorder::setEncoderSettings(const QMediaEncoderSettings &settings)
*/
QMediaEncoderSettings QMediaRecorder::encoderSettings() const
{
- return d_ptr->encoder->encoderSettings();
+ return d_func()->encoderSettings;
}
/*!
Start recording.
- While the recorder state is changed immediately to QMediaRecorder::RecordingState,
+ While the encoder state is changed immediately to QMediaRecorder::RecordingState,
recording may start asynchronously, with statusChanged(QMediaRecorder::RecordingStatus)
signal emitted when recording starts.
If recording fails error() signal is emitted
- with recorder state being reset back to QMediaRecorder::StoppedState.
+ with encoder state being reset back to QMediaRecorder::StoppedState.
*/
void QMediaRecorder::record()
{
- d_ptr->encoder->record();
+ Q_D(QMediaRecorder);
+
+ if (!d->control)
+ return;
+ d->control->clearActualLocation();
+
+ if (d->settingsChanged)
+ d->control->applySettings();
+
+ d->control->clearError();
+
+ if (d->control && d->captureSession)
+ d->control->setState(QMediaRecorder::RecordingState);
}
/*!
Pause recording.
- The recorder state is changed to QMediaRecorder::PausedState.
+ The encoder state is changed to QMediaRecorder::PausedState.
Depending on platform recording pause may be not supported,
- in this case the recorder state stays unchanged.
+ in this case the encoder state stays unchanged.
*/
void QMediaRecorder::pause()
{
- d_ptr->encoder->pause();
+ Q_D(QMediaRecorder);
+ if (d->control && d->captureSession)
+ d->control->setState(QMediaRecorder::PausedState);
}
/*!
Stop recording.
- The recorder state is changed to QMediaRecorder::StoppedState.
+ The encoder state is changed to QMediaRecorder::StoppedState.
*/
void QMediaRecorder::stop()
{
- d_ptr->encoder->stop();
+ Q_D(QMediaRecorder);
+ if (d->control && d->captureSession)
+ d->control->setState(QMediaRecorder::StoppedState);
}
+/*!
+ \enum QMediaRecorder::RecorderState
+
+ \value StoppedState The recorder is not active.
+ If this is the state after recording then the actual created recording has
+ finished being written to the final location and is ready on all platforms
+ except on Android. On Android, due to platform limitations, there is no way
+ to be certain that the recording has finished writing to the final location.
+ \value RecordingState The recording is requested.
+ \value PausedState The recorder is paused.
+*/
+
+/*!
+ \enum QMediaRecorder::Status
+
+ \value UnavailableStatus
+ The recorder is not available or not supported by connected media object.
+ \value UnloadedStatus
+ The recorder is avilable but not loaded.
+ \value LoadingStatus
+ The recorder is initializing.
+ \value LoadedStatus
+ The recorder is initialized and ready to record media.
+ \value StartingStatus
+ Recording is requested but not active yet.
+ \value RecordingStatus
+ Recording is active.
+ \value PausedStatus
+ Recording is paused.
+ \value FinalizingStatus
+ Recording is stopped with media being finalized.
+*/
+
+/*!
+ \enum QMediaRecorder::Error
+
+ \value NoError No Errors.
+ \value ResourceError Device is not ready or not available.
+ \value FormatError Current format is not supported.
+ \value OutOfSpaceError No space left on device.
+*/
/*!
- \property QMediaRecorder::state
+ \property QMediaRecorder::RecorderState
\brief The current state of the media recorder.
The state property represents the user request and is changed synchronously
@@ -378,7 +398,7 @@ void QMediaRecorder::stop()
*/
/*!
- \fn QMediaRecorder::stateChanged(State state)
+ \fn QMediaRecorder::recorderStateChanged(State state)
Signals that a media recorder's \a state has changed.
*/
@@ -419,7 +439,9 @@ void QMediaRecorder::stop()
*/
QMediaMetaData QMediaRecorder::metaData() const
{
- return d_ptr->encoder->metaData();
+ Q_D(const QMediaRecorder);
+
+ return d->control ? d->control->metaData() : QMediaMetaData{};
}
/*!
@@ -430,12 +452,19 @@ QMediaMetaData QMediaRecorder::metaData() const
*/
void QMediaRecorder::setMetaData(const QMediaMetaData &metaData)
{
- d_ptr->encoder->setMetaData(metaData);
+ Q_D(QMediaRecorder);
+
+ if (d->control && d->captureSession)
+ d->control->setMetaData(metaData);
}
void QMediaRecorder::addMetaData(const QMediaMetaData &metaData)
{
- d_ptr->encoder->addMetaData(metaData);
+ auto data = this->metaData();
+ // merge data
+ for (const auto &k : metaData.keys())
+ data.insert(k, metaData.value(k));
+ setMetaData(data);
}
/*!
@@ -448,45 +477,12 @@ void QMediaRecorder::addMetaData(const QMediaMetaData &metaData)
for each of them with metaDataChanged() changed emitted once.
*/
-/*!
- \property QMediaRecorder::audioInput
- \brief the active audio input name.
-
-*/
-
QMediaCaptureSession *QMediaRecorder::captureSession() const
{
Q_D(const QMediaRecorder);
return d->captureSession;
}
-QObject *QMediaRecorder::videoOutput() const
-{
- return d_ptr->captureSession->videoOutput();
-}
-
-void QMediaRecorder::setVideoOutput(QObject *output)
-{
- d_ptr->captureSession->setVideoOutput(output);
-}
-
-void QMediaRecorder::setVideoSink(QVideoSink *output)
-{
- d_ptr->captureSession->setVideoSink(output);
-}
-
-QVideoSink *QMediaRecorder::videoSink() const
-{
- return d_ptr->captureSession->videoSink();
-}
-
-
-/*!
- \fn QMediaRecorder::videoOutputChanged()
-
- This signal is emitted when the active video output changed.
-*/
-
QT_END_NAMESPACE
#include "moc_qmediarecorder.cpp"
diff --git a/src/multimedia/recording/qmediarecorder.h b/src/multimedia/recording/qmediarecorder.h
index e887f58c5..a33988672 100644
--- a/src/multimedia/recording/qmediarecorder.h
+++ b/src/multimedia/recording/qmediarecorder.h
@@ -37,61 +37,87 @@
**
****************************************************************************/
-#ifndef QMEDIARECORDER_H
-#define QMEDIARECORDER_H
+#ifndef QMediaRecorder_H
+#define QMediaRecorder_H
-#include <QtMultimedia/qmediaencoder.h>
+#include <QtCore/qobject.h>
+#include <QtMultimedia/qtmultimediaglobal.h>
+#include <QtMultimedia/qmediaencodersettings.h>
+#include <QtMultimedia/qmediaenumdebug.h>
+#include <QtMultimedia/qmediametadata.h>
+
+#include <QtCore/qpair.h>
QT_BEGIN_NAMESPACE
-class QVideoSink;
+class QUrl;
+class QSize;
+class QAudioFormat;
+class QCamera;
+class QCameraDevice;
+class QAudioDevice;
+class QMediaCaptureSession;
class QMediaRecorderPrivate;
-class Q_MULTIMEDIA_EXPORT QMediaRecorder : public QMediaEncoderBase
+class Q_MULTIMEDIA_EXPORT QMediaRecorder : public QObject
{
Q_OBJECT
- Q_PROPERTY(QMediaEncoderBase::State state READ state NOTIFY stateChanged)
- Q_PROPERTY(QMediaEncoderBase::Status status READ status NOTIFY statusChanged)
+ Q_PROPERTY(QMediaRecorder::RecorderState recorderState READ recorderState NOTIFY recorderStateChanged)
+ Q_PROPERTY(QMediaRecorder::Status status READ status NOTIFY statusChanged)
Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged)
Q_PROPERTY(QUrl outputLocation READ outputLocation WRITE setOutputLocation)
- Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged)
- Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged)
+ Q_PROPERTY(QUrl actualLocation READ actualLocation NOTIFY actualLocationChanged)
Q_PROPERTY(QMediaMetaData metaData READ metaData WRITE setMetaData NOTIFY metaDataChanged)
- Q_PROPERTY(CaptureMode captureMode READ captureMode WRITE setCaptureMode NOTIFY captureModeChanged)
- Q_PROPERTY(QObject *videoOutput READ videoOutput WRITE setVideoOutput NOTIFY videoOutputChanged)
- Q_PROPERTY(QCamera camera READ camera)
-public:
+ Q_PROPERTY(QMediaRecorder::Error error READ error NOTIFY errorChanged)
+ Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged)
+ Q_PROPERTY(QMediaEncoderSettings encoderSettings READ encoderSettings WRITE setEncoderSettings NOTIFY encoderSettingsChanged)
- enum CaptureMode {
- AudioOnly,
- AudioAndVideo
+public:
+ enum RecorderState
+ {
+ StoppedState,
+ RecordingState,
+ PausedState
+ };
+ Q_ENUM(RecorderState)
+
+ enum Status {
+ UnavailableStatus,
+ StoppedStatus,
+ StartingStatus,
+ RecordingStatus,
+ PausedStatus,
+ FinalizingStatus
};
+ Q_ENUM(Status)
+
+ enum Error
+ {
+ NoError,
+ ResourceError,
+ FormatError,
+ OutOfSpaceError
+ };
+ Q_ENUM(Error)
- QMediaRecorder(QObject *parent = nullptr, CaptureMode mode = AudioOnly);
+ QMediaRecorder(QObject *parent = nullptr);
~QMediaRecorder();
bool isAvailable() const;
- CaptureMode captureMode() const;
- void setCaptureMode(CaptureMode mode);
-
- // ### Should we expose this, or restrict it to cameraFormat?
- QCamera *camera() const;
-
QUrl outputLocation() const;
bool setOutputLocation(const QUrl &location);
- QMediaEncoderBase::State state() const;
- QMediaEncoderBase::Status status() const;
+ QUrl actualLocation() const;
- QMediaEncoderBase::Error error() const;
+ RecorderState recorderState() const;
+ Status status() const;
+
+ Error error() const;
QString errorString() const;
qint64 duration() const;
- bool isMuted() const;
- qreal volume() const;
-
void setEncoderSettings(const QMediaEncoderSettings &);
QMediaEncoderSettings encoderSettings() const;
@@ -101,42 +127,36 @@ public:
QMediaCaptureSession *captureSession() const;
- void setVideoOutput(QObject *output);
- QObject *videoOutput() const;
-
- void setVideoSink(QVideoSink *output);
- QVideoSink *videoSink() const;
-
public Q_SLOTS:
void record();
void pause();
void stop();
- void setMuted(bool muted);
- void setVolume(qreal volume);
Q_SIGNALS:
- void stateChanged(QMediaRecorder::State state);
- void statusChanged(QMediaRecorder::Status status);
+ void recorderStateChanged(RecorderState state);
+ void statusChanged(Status status);
void durationChanged(qint64 duration);
- void mutedChanged(bool muted);
- void volumeChanged(qreal volume);
- void captureModeChanged();
- void videoOutputChanged();
+ void actualLocationChanged(const QUrl &location);
+ void encoderSettingsChanged();
- void error(QMediaRecorder::Error error);
+ void errorOccurred(Error error, const QString &errorString);
+ void errorChanged();
void metaDataChanged();
private:
- // This is here to flag an incompatibilities with Qt 5
- QMediaRecorder(QCamera *) = delete;
-
QMediaRecorderPrivate *d_ptr;
friend class QMediaCaptureSession;
+ void setCaptureSession(QMediaCaptureSession *session);
Q_DISABLE_COPY(QMediaRecorder)
Q_DECLARE_PRIVATE(QMediaRecorder)
+ Q_PRIVATE_SLOT(d_func(), void _q_applySettings())
};
QT_END_NAMESPACE
-#endif // QMEDIARECORDER_H
+Q_MEDIA_ENUM_DEBUG(QMediaRecorder, RecorderState)
+Q_MEDIA_ENUM_DEBUG(QMediaRecorder, Status)
+Q_MEDIA_ENUM_DEBUG(QMediaRecorder, Error)
+
+#endif // QMediaRecorder_H
diff --git a/src/multimedia/recording/qmediarecorder_p.h b/src/multimedia/recording/qmediarecorder_p.h
index 878658346..d243b3ace 100644
--- a/src/multimedia/recording/qmediarecorder_p.h
+++ b/src/multimedia/recording/qmediarecorder_p.h
@@ -37,8 +37,8 @@
**
****************************************************************************/
-#ifndef QMEDIARECORDER_P_H
-#define QMEDIARECORDER_P_H
+#ifndef QMediaRecorder_P_H
+#define QMediaRecorder_P_H
//
// W A R N I N G
@@ -64,6 +64,26 @@ class QAudioEncoderSettingsControl;
class QVideoEncoderSettingsControl;
class QTimer;
+class QMediaRecorderPrivate
+{
+ Q_DECLARE_PUBLIC(QMediaRecorder)
+
+public:
+ QMediaRecorderPrivate() = default;
+
+ void applySettingsLater();
+
+ QMediaCaptureSession *captureSession = nullptr;
+ QPlatformMediaEncoder *control = nullptr;
+
+ bool settingsChanged = false;
+
+ QMediaEncoderSettings encoderSettings;
+
+ void _q_applySettings();
+
+ QMediaRecorder *q_ptr = nullptr;
+};
#undef Q_DECLARE_NON_CONST_PUBLIC
diff --git a/src/multimediaquick/Video.qml b/src/multimediaquick/Video.qml
index 886f7ff9b..d39d0921b 100644
--- a/src/multimediaquick/Video.qml
+++ b/src/multimediaquick/Video.qml
@@ -432,7 +432,6 @@ Item {
VideoOutput {
id: videoOut
anchors.fill: video
- source: player
}
MediaPlayer {
@@ -440,6 +439,10 @@ Item {
onPaused: video.paused()
onStopped: video.stopped()
onPlaying: video.playing()
+ videoOutput: videoOut
+ audioOutput: AudioOutput {
+
+ }
}
/*!
diff --git a/src/multimediaquick/multimedia_plugin.cpp b/src/multimediaquick/multimedia_plugin.cpp
index f79ac7827..01b374729 100644
--- a/src/multimediaquick/multimedia_plugin.cpp
+++ b/src/multimediaquick/multimedia_plugin.cpp
@@ -46,7 +46,7 @@
#include "qmediametadata.h"
#include "qcamera.h"
#include "qmediacapturesession.h"
-#include "qmediaencoder.h"
+#include "qmediarecorder.h"
#include <private/qquickimagepreviewprovider_p.h>
diff --git a/src/multimediaquick/qquickplaylist_p.h b/src/multimediaquick/qquickplaylist_p.h
index 1e43a82c9..7c867aa18 100644
--- a/src/multimediaquick/qquickplaylist_p.h
+++ b/src/multimediaquick/qquickplaylist_p.h
@@ -85,8 +85,6 @@ class QQuickPlaylist : public QAbstractListModel, public QQmlParserStatus
Q_PROPERTY(Error error READ error NOTIFY errorChanged)
Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged)
Q_PROPERTY(QQmlListProperty<QQuickPlaylistItem> items READ items DESIGNABLE false)
- Q_ENUMS(PlaybackMode)
- Q_ENUMS(Error)
Q_INTERFACES(QQmlParserStatus)
Q_CLASSINFO("DefaultProperty", "items")
QML_NAMED_ELEMENT(Playlist)
@@ -100,6 +98,8 @@ public:
Loop = QMediaPlaylist::Loop,
// Random = QMediaPlaylist::Random
};
+ Q_ENUM(PlaybackMode)
+
enum Error
{
NoError = QMediaPlaylist::NoError,
@@ -108,6 +108,8 @@ public:
NetworkError = QMediaPlaylist::NetworkError,
AccessDeniedError = QMediaPlaylist::AccessDeniedError
};
+ Q_ENUM(Error)
+
enum Roles
{
SourceRole = Qt::UserRole + 1
diff --git a/src/multimediaquick/qquickvideooutput_p.h b/src/multimediaquick/qquickvideooutput_p.h
index fc9199fe3..dd5f4b29f 100644
--- a/src/multimediaquick/qquickvideooutput_p.h
+++ b/src/multimediaquick/qquickvideooutput_p.h
@@ -77,8 +77,6 @@ class Q_MULTIMEDIAQUICK_EXPORT QQuickVideoOutput : public QQuickItem
Q_PROPERTY(QRectF contentRect READ contentRect NOTIFY contentRectChanged)
Q_PROPERTY(FlushMode flushMode READ flushMode WRITE setFlushMode NOTIFY flushModeChanged REVISION 13)
Q_PROPERTY(QVideoSink* videoSink READ videoSink CONSTANT REVISION 15)
- Q_ENUMS(FlushMode)
- Q_ENUMS(FillMode)
Q_MOC_INCLUDE(qvideosink.h)
Q_MOC_INCLUDE(qvideoframe.h)
QML_NAMED_ELEMENT(VideoOutput)
@@ -91,6 +89,7 @@ public:
FirstFrame,
LastFrame
};
+ Q_ENUM(FlushMode)
enum FillMode
{
@@ -98,6 +97,7 @@ public:
PreserveAspectFit = Qt::KeepAspectRatio,
PreserveAspectCrop = Qt::KeepAspectRatioByExpanding
};
+ Q_ENUM(FillMode)
QQuickVideoOutput(QQuickItem *parent = 0);
~QQuickVideoOutput();
diff --git a/src/multimediaquick/qtmultimediaquicktypes_p.h b/src/multimediaquick/qtmultimediaquicktypes_p.h
index 8275cd29e..dc53f6701 100644
--- a/src/multimediaquick/qtmultimediaquicktypes_p.h
+++ b/src/multimediaquick/qtmultimediaquicktypes_p.h
@@ -92,10 +92,10 @@ struct QCameraImageCaptureForeign
QML_NAMED_ELEMENT(ImageCapture)
};
-struct QMediaEncoderForeign
+struct QMediaRecorderForeign
{
Q_GADGET
- QML_FOREIGN(QMediaEncoder)
+ QML_FOREIGN(QMediaRecorder)
QML_NAMED_ELEMENT(MediaEncoder)
};
@@ -113,6 +113,20 @@ struct QMediaDevicesForeign
QML_NAMED_ELEMENT(MediaDevices)
};
+struct QAudioInputForeign
+{
+ Q_GADGET
+ QML_FOREIGN(QAudioInput)
+ QML_NAMED_ELEMENT(AudioInput)
+};
+
+struct QAudioOutputForeign
+{
+ Q_GADGET
+ QML_FOREIGN(QAudioOutput)
+ QML_NAMED_ELEMENT(AudioOutput)
+};
+
struct QAudioDeviceForeign
{
Q_GADGET
diff --git a/src/multimediawidgets/qvideowidget.cpp b/src/multimediawidgets/qvideowidget.cpp
index 4b0aba7ea..e3ae2ac08 100644
--- a/src/multimediawidgets/qvideowidget.cpp
+++ b/src/multimediawidgets/qvideowidget.cpp
@@ -378,7 +378,7 @@ void QVideoWidget::resizeEvent(QResizeEvent *event)
\reimp
Handles the move \a event.
*/
-void QVideoWidget::moveEvent(QMoveEvent */*event*/)
+void QVideoWidget::moveEvent(QMoveEvent * /*event*/)
{
}
diff --git a/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp b/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp
index b3ccb0a10..8a948e905 100644
--- a/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp
+++ b/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp
@@ -35,6 +35,7 @@
#define TEST_FILE_NAME "testdata/test.wav"
#define TEST_UNSUPPORTED_FILE_NAME "testdata/test-unsupported.avi"
#define TEST_CORRUPTED_FILE_NAME "testdata/test-corrupted.wav"
+#define TEST_INVALID_SOURCE "invalid"
QT_USE_NAMESPACE
@@ -57,6 +58,7 @@ private slots:
void fileTest();
void unsupportedFileTest();
void corruptedFileTest();
+ void invalidSource();
void deviceTest();
private:
@@ -139,8 +141,10 @@ void tst_QAudioDecoderBackend::fileTest()
QCOMPARE(buffer.format().sampleFormat(), QAudioFormat::Int16);
QCOMPARE(buffer.byteCount(), buffer.sampleCount() * 2); // 16bit mono
- // The decoder should still have no format set
- QVERIFY(d.audioFormat() == QAudioFormat());
+ // This does not make a lot of sense
+ // The decoder's audioFormat() should report the actual buffer format?
+ // // The decoder should still have no format set
+ // QVERIFY(d.audioFormat() == QAudioFormat());
QVERIFY(errorSpy.isEmpty());
@@ -425,6 +429,98 @@ void tst_QAudioDecoderBackend::corruptedFileTest()
QVERIFY(!d.bufferAvailable());
}
+void tst_QAudioDecoderBackend::invalidSource()
+{
+ QAudioDecoder d;
+ if (d.error() == QAudioDecoder::NotSupportedError)
+ QSKIP("There is no audio decoding support on this platform.");
+ QAudioBuffer buffer;
+
+ QVERIFY(d.state() == QAudioDecoder::StoppedState);
+ QVERIFY(d.bufferAvailable() == false);
+ QCOMPARE(d.source(), QUrl());
+ QVERIFY(d.audioFormat() == QAudioFormat());
+
+ // Test invalid file source
+ QFileInfo fileInfo(TEST_INVALID_SOURCE);
+ QUrl url = QUrl::fromLocalFile(fileInfo.absoluteFilePath());
+ d.setSource(url);
+ QVERIFY(d.state() == QAudioDecoder::StoppedState);
+ QVERIFY(!d.bufferAvailable());
+ QCOMPARE(d.source(), url);
+
+ QSignalSpy readySpy(&d, SIGNAL(bufferReady()));
+ QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool)));
+ QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error)));
+ QSignalSpy stateSpy(&d, SIGNAL(stateChanged(QAudioDecoder::State)));
+ QSignalSpy durationSpy(&d, SIGNAL(durationChanged(qint64)));
+ QSignalSpy finishedSpy(&d, SIGNAL(finished()));
+ QSignalSpy positionSpy(&d, SIGNAL(positionChanged(qint64)));
+
+ d.start();
+ QTRY_VERIFY(d.state() == QAudioDecoder::StoppedState);
+ QVERIFY(!d.bufferAvailable());
+ QCOMPARE(d.audioFormat(), QAudioFormat());
+ QCOMPARE(d.duration(), qint64(-1));
+ QCOMPARE(d.position(), qint64(-1));
+
+ // Check the error code.
+ QTRY_VERIFY(!errorSpy.isEmpty());
+
+ // Have to use qvariant_cast, toInt will return 0 because unrecognized type;
+ QAudioDecoder::Error errorCode = qvariant_cast<QAudioDecoder::Error>(errorSpy.takeLast().at(0));
+ QCOMPARE(errorCode, QAudioDecoder::ResourceError);
+ QCOMPARE(d.error(), QAudioDecoder::ResourceError);
+
+ // Check all other spies.
+ QVERIFY(readySpy.isEmpty());
+ QVERIFY(bufferChangedSpy.isEmpty());
+ QVERIFY(stateSpy.isEmpty());
+ QVERIFY(finishedSpy.isEmpty());
+ QVERIFY(positionSpy.isEmpty());
+ QVERIFY(durationSpy.isEmpty());
+
+ errorSpy.clear();
+
+ d.stop();
+ QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState);
+ QCOMPARE(d.duration(), qint64(-1));
+ QVERIFY(!d.bufferAvailable());
+
+ QFile file;
+ file.setFileName(TEST_INVALID_SOURCE);
+ file.open(QIODevice::ReadOnly);
+ d.setSourceDevice(&file);
+
+ d.start();
+ QTRY_VERIFY(d.state() == QAudioDecoder::StoppedState);
+ QVERIFY(!d.bufferAvailable());
+ QCOMPARE(d.audioFormat(), QAudioFormat());
+ QCOMPARE(d.duration(), qint64(-1));
+ QCOMPARE(d.position(), qint64(-1));
+
+ // Check the error code.
+ QTRY_VERIFY(!errorSpy.isEmpty());
+ errorCode = qvariant_cast<QAudioDecoder::Error>(errorSpy.takeLast().at(0));
+ QCOMPARE(errorCode, QAudioDecoder::AccessDeniedError);
+ QCOMPARE(d.error(), QAudioDecoder::AccessDeniedError);
+
+ // Check all other spies.
+ QVERIFY(readySpy.isEmpty());
+ QVERIFY(bufferChangedSpy.isEmpty());
+ QVERIFY(stateSpy.isEmpty());
+ QVERIFY(finishedSpy.isEmpty());
+ QVERIFY(positionSpy.isEmpty());
+ QVERIFY(durationSpy.isEmpty());
+
+ errorSpy.clear();
+
+ d.stop();
+ QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState);
+ QCOMPARE(d.duration(), qint64(-1));
+ QVERIFY(!d.bufferAvailable());
+}
+
void tst_QAudioDecoderBackend::deviceTest()
{
if (!isWavSupported())
@@ -462,6 +558,7 @@ void tst_QAudioDecoderBackend::deviceTest()
QVERIFY(d.audioFormat() == QAudioFormat());
d.start();
+
QTRY_VERIFY(d.state() == QAudioDecoder::DecodingState);
QTRY_VERIFY(!stateSpy.isEmpty());
QTRY_VERIFY(!readySpy.isEmpty());
diff --git a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
index 5a653c1f8..428c06dcb 100644
--- a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
+++ b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
@@ -40,7 +40,7 @@
#include <qmediacapturesession.h>
#include <qobject.h>
#include <qmediadevices.h>
-#include <qmediaencoder.h>
+#include <qmediarecorder.h>
QT_USE_NAMESPACE
@@ -446,24 +446,26 @@ void tst_QCameraBackend::testVideoRecording_data()
void tst_QCameraBackend::testVideoRecording()
{
+ if (noCamera)
+ QSKIP("No camera available");
QFETCH(QCameraDevice, device);
QMediaCaptureSession session;
QScopedPointer<QCamera> camera(new QCamera(device));
session.setCamera(camera.data());
- QMediaEncoder recorder;
+ QMediaRecorder recorder;
session.setEncoder(&recorder);
QSignalSpy errorSignal(camera.data(), SIGNAL(errorOccurred(QCamera::Error, const QString &)));
- QSignalSpy recorderErrorSignal(&recorder, SIGNAL(errorOccurred(QMediaEncoder::Error, const QString &)));
- QSignalSpy recorderStatusSignal(&recorder, SIGNAL(statusChanged(QMediaEncoder::Status)));
+ QSignalSpy recorderErrorSignal(&recorder, SIGNAL(errorOccurred(Error, const QString &)));
+ QSignalSpy recorderStatusSignal(&recorder, SIGNAL(statusChanged(Status)));
QMediaEncoderSettings videoSettings;
videoSettings.setVideoResolution(320, 240);
recorder.setEncoderSettings(videoSettings);
- QCOMPARE(recorder.status(), QMediaEncoder::StoppedStatus);
+ QCOMPARE(recorder.status(), QMediaRecorder::StoppedStatus);
camera->start();
if (noCamera || device.isNull()) {
@@ -473,26 +475,26 @@ void tst_QCameraBackend::testVideoRecording()
QTRY_VERIFY(camera->isActive());
QTRY_COMPARE(camera->status(), QCamera::ActiveStatus);
- QTRY_COMPARE(recorder.status(), QMediaEncoder::StoppedStatus);
+ QTRY_COMPARE(recorder.status(), QMediaRecorder::StoppedStatus);
for (int recordings = 0; recordings < 2; ++recordings) {
//record 200ms clip
recorder.record();
- QTRY_COMPARE(recorder.status(), QMediaEncoder::RecordingStatus);
- QCOMPARE(recorderStatusSignal.last().first().value<QMediaEncoder::Status>(), recorder.status());
+ QTRY_COMPARE(recorder.status(), QMediaRecorder::RecordingStatus);
+ QCOMPARE(recorderStatusSignal.last().first().value<QMediaRecorder::Status>(), recorder.status());
QTest::qWait(200);
recorderStatusSignal.clear();
recorder.stop();
bool foundFinalizingStatus = false;
for (auto &list : recorderStatusSignal) {
- if (qvariant_cast<QMediaEncoder::Status>(list.first()) == QMediaEncoder::FinalizingStatus) {
+ if (qvariant_cast<QMediaRecorder::Status>(list.first()) == QMediaRecorder::FinalizingStatus) {
foundFinalizingStatus = true;
break;
}
}
QVERIFY(foundFinalizingStatus);
- QTRY_COMPARE(recorder.status(), QMediaEncoder::StoppedStatus);
- QCOMPARE(recorderStatusSignal.last().first().value<QMediaEncoder::Status>(), recorder.status());
+ QTRY_COMPARE(recorder.status(), QMediaRecorder::StoppedStatus);
+ QCOMPARE(recorderStatusSignal.last().first().value<QMediaRecorder::Status>(), recorder.status());
QVERIFY(errorSignal.isEmpty());
QVERIFY(recorderErrorSignal.isEmpty());
@@ -503,8 +505,8 @@ void tst_QCameraBackend::testVideoRecording()
QVERIFY(QFileInfo(fileName).size() > 0);
QFile(fileName).remove();
- QTRY_COMPARE(recorder.status(), QMediaEncoder::StoppedStatus);
- QCOMPARE(recorderStatusSignal.last().first().value<QMediaEncoder::Status>(), recorder.status());
+ QTRY_COMPARE(recorder.status(), QMediaRecorder::StoppedStatus);
+ QCOMPARE(recorderStatusSignal.last().first().value<QMediaRecorder::Status>(), recorder.status());
}
}
diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
index 5200edb40..0a4897c25 100644
--- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
+++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
@@ -34,6 +34,7 @@
#include <qaudiobuffer.h>
#include <qvideosink.h>
#include <qvideoframe.h>
+#include <qaudiooutput.h>
#include "../shared/mediafileselector.h"
//TESTED_COMPONENT=src/multimedia
@@ -200,6 +201,8 @@ void tst_QMediaPlayerBackend::loadMedia()
QSKIP("Sound format is not supported");
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
QCOMPARE(player.playbackState(), QMediaPlayer::StoppedState);
QCOMPARE(player.mediaStatus(), QMediaPlayer::NoMedia);
@@ -233,6 +236,8 @@ void tst_QMediaPlayerBackend::unloadMedia()
QSKIP("Sound format is not supported");
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
QSignalSpy stateSpy(&player, SIGNAL(playbackStateChanged(QMediaPlayer::PlaybackState)));
QSignalSpy statusSpy(&player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)));
@@ -278,6 +283,8 @@ void tst_QMediaPlayerBackend::loadMediaInLoadingState()
QSKIP("Sound format is not supported");
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
player.setSource(localWavFile2);
QCOMPARE(player.mediaStatus(), QMediaPlayer::LoadingMedia);
QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::LoadedMedia);
@@ -298,6 +305,8 @@ void tst_QMediaPlayerBackend::playPauseStop()
QSKIP("Sound format is not supported");
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
QSignalSpy stateSpy(&player, SIGNAL(playbackStateChanged(QMediaPlayer::PlaybackState)));
QSignalSpy statusSpy(&player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)));
@@ -452,6 +461,8 @@ void tst_QMediaPlayerBackend::processEOS()
QSKIP("Sound format is not supported");
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
QSignalSpy stateSpy(&player, SIGNAL(playbackStateChanged(QMediaPlayer::PlaybackState)));
QSignalSpy statusSpy(&player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)));
@@ -586,6 +597,8 @@ void tst_QMediaPlayerBackend::deleteLaterAtEOS()
QSKIP("Sound format is not supported");
QPointer<QMediaPlayer> player(new QMediaPlayer);
+ QAudioOutput output;
+ player->setAudioOutput(&output);
DeleteLaterAtEos deleter(player);
player->setSource(localWavFile);
@@ -606,46 +619,48 @@ void tst_QMediaPlayerBackend::volumeAndMuted()
{
//volume and muted properties should be independent
QMediaPlayer player;
- QVERIFY(player.volume() > 0);
- QVERIFY(!player.isMuted());
+ QAudioOutput output;
+ player.setAudioOutput(&output);
+ QCOMPARE(output.volume(), 1.);
+ QVERIFY(!output.isMuted());
player.setSource(localWavFile);
player.pause();
- QVERIFY(player.volume() > 0);
- QVERIFY(!player.isMuted());
+ QCOMPARE(output.volume(), 1.);
+ QVERIFY(!output.isMuted());
- QSignalSpy volumeSpy(&player, SIGNAL(volumeChanged(int)));
- QSignalSpy mutedSpy(&player, SIGNAL(mutedChanged(bool)));
+ QSignalSpy volumeSpy(&output, SIGNAL(volumeChanged(float)));
+ QSignalSpy mutedSpy(&output, SIGNAL(mutedChanged(bool)));
//setting volume to 0 should not trigger muted
- player.setVolume(0);
- QTRY_COMPARE(player.volume(), 0);
- QVERIFY(!player.isMuted());
+ output.setVolume(0);
+ QTRY_COMPARE(output.volume(), 0);
+ QVERIFY(!output.isMuted());
QCOMPARE(volumeSpy.count(), 1);
- QCOMPARE(volumeSpy.last()[0].toInt(), player.volume());
+ QCOMPARE(volumeSpy.last()[0].toFloat(), output.volume());
QCOMPARE(mutedSpy.count(), 0);
- player.setVolume(50);
- QTRY_COMPARE(player.volume(), 50);
- QVERIFY(!player.isMuted());
+ output.setVolume(0.5);
+ QTRY_COMPARE(output.volume(), 0.5);
+ QVERIFY(!output.isMuted());
QCOMPARE(volumeSpy.count(), 2);
- QCOMPARE(volumeSpy.last()[0].toInt(), player.volume());
+ QCOMPARE(volumeSpy.last()[0].toFloat(), output.volume());
QCOMPARE(mutedSpy.count(), 0);
- player.setMuted(true);
- QTRY_VERIFY(player.isMuted());
- QVERIFY(player.volume() > 0);
+ output.setMuted(true);
+ QTRY_VERIFY(output.isMuted());
+ QVERIFY(output.volume() > 0);
QCOMPARE(volumeSpy.count(), 2);
QCOMPARE(mutedSpy.count(), 1);
- QCOMPARE(mutedSpy.last()[0].toBool(), player.isMuted());
+ QCOMPARE(mutedSpy.last()[0].toBool(), output.isMuted());
- player.setMuted(false);
- QTRY_VERIFY(!player.isMuted());
- QVERIFY(player.volume() > 0);
+ output.setMuted(false);
+ QTRY_VERIFY(!output.isMuted());
+ QVERIFY(output.volume() > 0);
QCOMPARE(volumeSpy.count(), 2);
QCOMPARE(mutedSpy.count(), 2);
- QCOMPARE(mutedSpy.last()[0].toBool(), player.isMuted());
+ QCOMPARE(mutedSpy.last()[0].toBool(), output.isMuted());
}
@@ -666,40 +681,43 @@ void tst_QMediaPlayerBackend::volumeAcrossFiles()
{
QFETCH(int, volume);
QFETCH(bool, muted);
+ float vol = volume/100.;
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
//volume and muted should not be preserved between player instances
- QVERIFY(player.volume() > 0);
- QVERIFY(!player.isMuted());
+ QVERIFY(output.volume() > 0);
+ QVERIFY(!output.isMuted());
- player.setVolume(volume);
- player.setMuted(muted);
+ output.setVolume(vol);
+ output.setMuted(muted);
- QTRY_COMPARE(player.volume(), volume);
- QTRY_COMPARE(player.isMuted(), muted);
+ QTRY_COMPARE(output.volume(), vol);
+ QTRY_COMPARE(output.isMuted(), muted);
player.setSource(localWavFile);
- QCOMPARE(player.volume(), volume);
- QCOMPARE(player.isMuted(), muted);
+ QCOMPARE(output.volume(), vol);
+ QCOMPARE(output.isMuted(), muted);
player.pause();
//to ensure the backend doesn't change volume/muted
//async during file loading.
- QTRY_COMPARE(player.volume(), volume);
- QCOMPARE(player.isMuted(), muted);
+ QTRY_COMPARE(output.volume(), vol);
+ QCOMPARE(output.isMuted(), muted);
player.setSource(QUrl());
- QTRY_COMPARE(player.volume(), volume);
- QCOMPARE(player.isMuted(), muted);
+ QTRY_COMPARE(output.volume(), vol);
+ QCOMPARE(output.isMuted(), muted);
player.setSource(localWavFile);
player.pause();
- QTRY_COMPARE(player.volume(), volume);
- QCOMPARE(player.isMuted(), muted);
+ QTRY_COMPARE(output.volume(), vol);
+ QCOMPARE(output.isMuted(), muted);
}
void tst_QMediaPlayerBackend::initialVolume()
@@ -709,21 +727,25 @@ void tst_QMediaPlayerBackend::initialVolume()
{
QMediaPlayer player;
- player.setVolume(1);
+ QAudioOutput output;
+ player.setAudioOutput(&output);
+ output.setVolume(1);
player.setSource(localWavFile);
- QCOMPARE(player.volume(), 1);
+ QCOMPARE(output.volume(), 1);
player.play();
QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::EndOfMedia);
- QCOMPARE(player.volume(), 1);
+ QCOMPARE(output.volume(), 1);
}
{
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
player.setSource(localWavFile);
- QCOMPARE(player.volume(), 100);
+ QCOMPARE(output.volume(), 1);
player.play();
QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::EndOfMedia);
- QCOMPARE(player.volume(), 100);
+ QCOMPARE(output.volume(), 1);
}
}
@@ -733,6 +755,8 @@ void tst_QMediaPlayerBackend::seekPauseSeek()
QSKIP("No supported video file");
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
QSignalSpy positionSpy(&player, SIGNAL(positionChanged(qint64)));
@@ -805,6 +829,8 @@ void tst_QMediaPlayerBackend::seekInStoppedState()
QSKIP("No supported video file");
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
QSignalSpy stateSpy(&player, SIGNAL(playbackStateChanged(QMediaPlayer::PlaybackState)));
QSignalSpy positionSpy(&player, SIGNAL(positionChanged(qint64)));
@@ -923,6 +949,8 @@ void tst_QMediaPlayerBackend::subsequentPlayback()
QSKIP("Sound format is not supported");
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
player.setSource(localCompressedSoundFile);
player.setPosition(5000);
player.play();
@@ -961,6 +989,8 @@ void tst_QMediaPlayerBackend::surfaceTest()
TestVideoSink surface(false);
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
player.setVideoOutput(&surface);
player.setSource(localVideoFile);
player.play();
@@ -994,6 +1024,8 @@ void tst_QMediaPlayerBackend::metadata()
QSKIP("No supported media file");
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
QSignalSpy metadataChangedSpy(&player, SIGNAL(metaDataChanged()));
@@ -1019,6 +1051,8 @@ void tst_QMediaPlayerBackend::playerStateAtEOS()
QSKIP("Sound format is not supported");
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
bool endOfMediaReceived = false;
connect(&player, &QMediaPlayer::mediaStatusChanged, [&](QMediaPlayer::MediaStatus status) {
diff --git a/tests/auto/integration/shared/mediafileselector.h b/tests/auto/integration/shared/mediafileselector.h
index b12cb6525..a9699fc0a 100644
--- a/tests/auto/integration/shared/mediafileselector.h
+++ b/tests/auto/integration/shared/mediafileselector.h
@@ -31,6 +31,7 @@
#include <QUrl>
#include <QMediaPlayer>
+#include <QAudioOutput>
#include <qsignalspy.h>
#include <qfileinfo.h>
#include <qtest.h>
@@ -42,6 +43,8 @@ namespace MediaFileSelector {
static QUrl selectMediaFile(const QStringList& mediaCandidates)
{
QMediaPlayer player;
+ QAudioOutput output;
+ player.setAudioOutput(&output);
QSignalSpy errorSpy(&player, SIGNAL(errorOccurred(QMediaPlayer::Error, const QString&)));
diff --git a/tests/auto/unit/mockbackend/CMakeLists.txt b/tests/auto/unit/mockbackend/CMakeLists.txt
index 8f43aafdd..56f2c11aa 100644
--- a/tests/auto/unit/mockbackend/CMakeLists.txt
+++ b/tests/auto/unit/mockbackend/CMakeLists.txt
@@ -14,6 +14,7 @@ target_link_libraries(QtMultimediaMockBackend INTERFACE
)
target_sources(QtMultimediaMockBackend INTERFACE
qmockaudiodecoder.h
+ qmockaudiooutput.h
qmockcamera.h
qmockimagecapture.h qmockimagecapture.cpp
qmockmediaplayer.h
diff --git a/tests/auto/unit/mockbackend/qmockaudiooutput.h b/tests/auto/unit/mockbackend/qmockaudiooutput.h
new file mode 100644
index 000000000..02245a7a3
--- /dev/null
+++ b/tests/auto/unit/mockbackend/qmockaudiooutput.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QMOCKAUDIOOUTPUT_H
+#define QMOCKAUDIOOUTPUT_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qplatformaudiooutput_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QMockAudioOutput : public QPlatformAudioOutput
+{
+public:
+ QMockAudioOutput(QAudioOutput *qq) : QPlatformAudioOutput(qq) {}
+
+ virtual QList<QAudio::Role> supportedAudioRoles() const {
+ if (!hasAudioRole)
+ return {};
+ return QList<QAudio::Role>() << QAudio::MusicRole
+ << QAudio::AlarmRole
+ << QAudio::NotificationRole;
+ }
+
+ bool hasAudioRole = true;
+};
+
+QT_END_NAMESPACE
+
+
+#endif // QMOCKAUDIOOUTPUT_H
diff --git a/tests/auto/unit/mockbackend/qmockintegration.cpp b/tests/auto/unit/mockbackend/qmockintegration.cpp
index 55a92c3c7..614542042 100644
--- a/tests/auto/unit/mockbackend/qmockintegration.cpp
+++ b/tests/auto/unit/mockbackend/qmockintegration.cpp
@@ -45,6 +45,7 @@
#include "qmockmediacapturesession.h"
#include "qmockvideosink.h"
#include "qmockimagecapture.h"
+#include "qmockaudiooutput.h"
QT_BEGIN_NAMESPACE
@@ -98,7 +99,7 @@ QPlatformCameraImageCapture *QMockIntegration::createImageCapture(QCameraImageCa
return new QMockImageCapture(capture);
}
-QPlatformMediaEncoder *QMockIntegration::createEncoder(QMediaEncoder *encoder)
+QPlatformMediaEncoder *QMockIntegration::createEncoder(QMediaRecorder *encoder)
{
return new QMockMediaEncoder(encoder);
}
@@ -118,6 +119,11 @@ QPlatformVideoSink *QMockIntegration::createVideoSink(QVideoSink *sink)
return m_lastVideoSink;
}
+QPlatformAudioOutput *QMockIntegration::createAudioOutput(QAudioOutput *q)
+{
+ return new QMockAudioOutput(q);
+}
+
bool QMockCamera::simpleCamera = false;
QT_END_NAMESPACE
diff --git a/tests/auto/unit/mockbackend/qmockintegration_p.h b/tests/auto/unit/mockbackend/qmockintegration_p.h
index 5f11cb680..e46b35713 100644
--- a/tests/auto/unit/mockbackend/qmockintegration_p.h
+++ b/tests/auto/unit/mockbackend/qmockintegration_p.h
@@ -74,11 +74,13 @@ public:
QPlatformAudioDecoder *createAudioDecoder(QAudioDecoder *decoder) override;
QPlatformMediaPlayer *createPlayer(QMediaPlayer *) override;
QPlatformCamera *createCamera(QCamera *) override;
- QPlatformMediaEncoder *createEncoder(QMediaEncoder *) override;
+ QPlatformMediaEncoder *createEncoder(QMediaRecorder *) override;
QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *) override;
QPlatformMediaCaptureSession *createCaptureSession() override;
QPlatformVideoSink *createVideoSink(QVideoSink *) override;
+ QPlatformAudioOutput *createAudioOutput(QAudioOutput *) override;
+
enum Flag {
NoPlayerInterface = 0x1,
NoAudioDecoderInterface = 0x2,
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;
};
diff --git a/tests/auto/unit/mockbackend/qmockmediaencoder.h b/tests/auto/unit/mockbackend/qmockmediaencoder.h
index ecdf21e61..f49fc5e78 100644
--- a/tests/auto/unit/mockbackend/qmockmediaencoder.h
+++ b/tests/auto/unit/mockbackend/qmockmediaencoder.h
@@ -37,10 +37,10 @@
class QMockMediaEncoder : public QPlatformMediaEncoder
{
public:
- QMockMediaEncoder(QMediaEncoder *parent):
+ QMockMediaEncoder(QMediaRecorder *parent):
QPlatformMediaEncoder(parent),
- m_state(QMediaEncoder::StoppedState),
- m_status(QMediaEncoder::StoppedStatus),
+ m_state(QMediaRecorder::StoppedState),
+ m_status(QMediaRecorder::StoppedStatus),
m_position(0),
m_settingAppliedCount(0)
{
@@ -57,12 +57,12 @@ public:
return true;
}
- QMediaEncoder::State state() const
+ QMediaRecorder::RecorderState state() const
{
return m_state;
}
- QMediaEncoder::Status status() const
+ QMediaRecorder::Status status() const
{
return m_status;
}
@@ -91,8 +91,8 @@ public:
public:
void record()
{
- m_state = QMediaEncoder::RecordingState;
- m_status = QMediaEncoder::RecordingStatus;
+ m_state = QMediaRecorder::RecordingState;
+ m_status = QMediaRecorder::RecordingStatus;
m_position=1;
emit stateChanged(m_state);
emit statusChanged(m_status);
@@ -104,8 +104,8 @@ public:
void pause()
{
- m_state = QMediaEncoder::PausedState;
- m_status = QMediaEncoder::PausedStatus;
+ m_state = QMediaRecorder::PausedState;
+ m_status = QMediaRecorder::PausedStatus;
emit stateChanged(m_state);
emit statusChanged(m_status);
}
@@ -113,22 +113,22 @@ public:
void stop()
{
m_position=0;
- m_state = QMediaEncoder::StoppedState;
- m_status = QMediaEncoder::StoppedStatus;
+ m_state = QMediaRecorder::StoppedState;
+ m_status = QMediaRecorder::StoppedStatus;
emit stateChanged(m_state);
emit statusChanged(m_status);
}
- void setState(QMediaEncoder::State state)
+ void setState(QMediaRecorder::RecorderState state)
{
switch (state) {
- case QMediaEncoder::StoppedState:
+ case QMediaRecorder::StoppedState:
stop();
break;
- case QMediaEncoder::PausedState:
+ case QMediaRecorder::PausedState:
pause();
break;
- case QMediaEncoder::RecordingState:
+ case QMediaRecorder::RecordingState:
record();
break;
}
@@ -137,8 +137,8 @@ public:
public:
QMediaMetaData m_metaData;
QUrl m_sink;
- QMediaEncoder::State m_state;
- QMediaEncoder::Status m_status;
+ QMediaRecorder::RecorderState m_state;
+ QMediaRecorder::Status m_status;
QMediaEncoderSettings m_settings;
qint64 m_position;
int m_settingAppliedCount;
diff --git a/tests/auto/unit/mockbackend/qmockmediaplayer.h b/tests/auto/unit/mockbackend/qmockmediaplayer.h
index 793330f23..81969d256 100644
--- a/tests/auto/unit/mockbackend/qmockmediaplayer.h
+++ b/tests/auto/unit/mockbackend/qmockmediaplayer.h
@@ -45,8 +45,6 @@ public:
, _error(QMediaPlayer::NoError)
, _duration(0)
, _position(0)
- , _volume(100)
- , _muted(false)
, _bufferProgress(0)
, _audioAvailable(false)
, _videoAvailable(false)
@@ -77,12 +75,6 @@ public:
void setPosition(qint64 position) { if (position != _position) emit positionChanged(_position = position); }
- int volume() const { return _volume; }
- void setVolume(int volume) { emit volumeChanged(_volume = volume); }
-
- bool isMuted() const { return _muted; }
- void setMuted(bool muted) { if (muted != _muted) emit mutedChanged(_muted = muted); }
-
float bufferProgress() const { return _bufferProgress; }
void setBufferStatus(float status)
{
@@ -121,23 +113,10 @@ public:
void pause() { if (_isValid && !_media.isEmpty()) setState(QMediaPlayer::PausedState); }
void stop() { if (_state != QMediaPlayer::StoppedState) setState(QMediaPlayer::StoppedState); }
- void setAudioRole(QAudio::Role role)
- {
- if (hasAudioRole)
- m_audioRole = role;
- }
-
- QList<QAudio::Role> supportedAudioRoles() const
- {
- if (!hasAudioRole)
- return {};
- return QList<QAudio::Role>() << QAudio::MusicRole
- << QAudio::AlarmRole
- << QAudio::NotificationRole;
- }
-
void setVideoSink(QVideoSink *) {}
+ void setAudioOutput(QPlatformAudioOutput *output) { m_audioOutput = output; }
+
void emitError(QMediaPlayer::Error err, const QString &errorString)
{
emit error(err, errorString);
@@ -174,8 +153,6 @@ public:
_error = QMediaPlayer::NoError;
_duration = 0;
_position = 0;
- _volume = 0;
- _muted = false;
_bufferProgress = 0;
_videoAvailable = false;
_isSeekable = false;
@@ -184,19 +161,13 @@ public:
_stream = 0;
_isValid = false;
_errorString = QString();
- hasAudioRole = true;
}
- bool hasAudioRole = true;
- QAudio::Role m_audioRole = QAudio::UnknownRole;
-
QMediaPlayer::PlaybackState _state;
QMediaPlayer::Error _error;
qint64 _duration;
qint64 _position;
- int _volume;
- bool _muted;
float _bufferProgress;
bool _audioAvailable;
bool _videoAvailable;
@@ -208,6 +179,7 @@ public:
bool _isValid;
QString _errorString;
bool m_supportsStreamPlayback = false;
+ QPlatformAudioOutput *m_audioOutput = nullptr;
};
QT_END_NAMESPACE
diff --git a/tests/auto/unit/multimedia/CMakeLists.txt b/tests/auto/unit/multimedia/CMakeLists.txt
index 63c459cae..4ed5121f8 100644
--- a/tests/auto/unit/multimedia/CMakeLists.txt
+++ b/tests/auto/unit/multimedia/CMakeLists.txt
@@ -9,7 +9,7 @@ add_subdirectory(qcameradevice)
add_subdirectory(qcameraimagecapture)
add_subdirectory(qmediaplayer)
add_subdirectory(qmediaplaylist)
-add_subdirectory(qmediaencoder)
+add_subdirectory(qmediarecorder)
add_subdirectory(qmediatimerange)
add_subdirectory(qvideoframe)
add_subdirectory(qvideoframeformat)
diff --git a/tests/auto/unit/multimedia/qaudionamespace/tst_qaudionamespace.cpp b/tests/auto/unit/multimedia/qaudionamespace/tst_qaudionamespace.cpp
index 5cd89ec3e..e3e7e17bf 100644
--- a/tests/auto/unit/multimedia/qaudionamespace/tst_qaudionamespace.cpp
+++ b/tests/auto/unit/multimedia/qaudionamespace/tst_qaudionamespace.cpp
@@ -31,6 +31,7 @@
#include <QtTest/QtTest>
#include <QtMultimedia/qaudio.h>
+#include <QtMultimedia/qaudiodevice.h>
// Adds an enum, and the stringized version
#define ADD_ENUM_TEST(x) \
@@ -47,8 +48,6 @@ private slots:
void debugError_data();
void debugState();
void debugState_data();
- void debugMode();
- void debugMode_data();
void debugVolumeScale();
void debugVolumeScale_data();
void convertVolume();
@@ -96,24 +95,6 @@ void tst_QAudioNamespace::debugState()
qDebug() << state;
}
-void tst_QAudioNamespace::debugMode_data()
-{
- QTest::addColumn<QAudio::Mode>("mode");
- QTest::addColumn<QString>("stringized");
-
- ADD_ENUM_TEST(AudioInput);
- ADD_ENUM_TEST(AudioOutput);
-}
-
-void tst_QAudioNamespace::debugMode()
-{
- QFETCH(QAudio::Mode, mode);
- QFETCH(QString, stringized);
-
- QTest::ignoreMessage(QtDebugMsg, stringized.toLatin1().constData());
- qDebug() << mode;
-}
-
void tst_QAudioNamespace::debugVolumeScale_data()
{
QTest::addColumn<QAudio::VolumeScale>("volumeScale");
diff --git a/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp b/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp
index c9b49b2ab..7fe79c36c 100644
--- a/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp
+++ b/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp
@@ -31,7 +31,7 @@
#include <qaudioformat.h>
-#include <qmediaencoder.h>
+#include <qmediarecorder.h>
#include <private/qplatformmediaencoder_p.h>
#include <qaudiodevice.h>
#include <qaudiosource.h>
@@ -53,13 +53,12 @@ public slots:
void cleanup();
private slots:
- void testNullControl();
void testAudioSource();
void testDevices();
void testAvailability();
private:
- QMediaEncoder *encoder = nullptr;
+ QMediaRecorder *encoder = nullptr;
QMockIntegration *mockIntegration;
};
@@ -77,19 +76,10 @@ void tst_QAudioRecorder::cleanup()
encoder = nullptr;
}
-void tst_QAudioRecorder::testNullControl()
-{
- QMediaRecorder source;
- auto *service = mockIntegration->lastCaptureService();
- service->hasControls = false;
-
- QVERIFY(source.isAvailable());
-}
-
void tst_QAudioRecorder::testAudioSource()
{
QMediaCaptureSession session;
- encoder = new QMediaEncoder;
+ encoder = new QMediaRecorder;
session.setEncoder(encoder);
QCOMPARE(session.camera(), nullptr);
@@ -114,7 +104,9 @@ void tst_QAudioRecorder::testDevices()
void tst_QAudioRecorder::testAvailability()
{
+ QMediaCaptureSession session;
QMediaRecorder source;
+ session.setEncoder(&source);
QVERIFY(source.isAvailable());
}
diff --git a/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp
index 682f480a8..5e227f64a 100644
--- a/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp
+++ b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp
@@ -69,7 +69,6 @@ private slots:
void testCameraFocus();
void testCameraCapture();
void testCameraCaptureMetadata();
- void testImageSettings();
void testCameraEncodingProperyChange();
void testConstructor();
@@ -438,98 +437,6 @@ void tst_QCamera::testCameraFocus()
QCOMPARE(camera.customFocusPoint(), QPointF(1.0, 1.0));
}
-void tst_QCamera::testImageSettings()
-{
- QImageEncoderSettings settings;
- QVERIFY(settings.isNull());
- QVERIFY(settings == QImageEncoderSettings());
-
- QCOMPARE(settings.format(), QImageEncoderSettings::UnspecifiedFormat);
- settings.setFormat(QImageEncoderSettings::Tiff);
- QCOMPARE(settings.format(), QImageEncoderSettings::Tiff);
- QVERIFY(!settings.isNull());
- QVERIFY(settings != QImageEncoderSettings());
-
- settings = QImageEncoderSettings();
- QCOMPARE(settings.quality(), QImageEncoderSettings::NormalQuality);
- settings.setQuality(QImageEncoderSettings::HighQuality);
- QCOMPARE(settings.quality(), QImageEncoderSettings::HighQuality);
- QVERIFY(!settings.isNull());
-
- settings = QImageEncoderSettings();
- QCOMPARE(settings.resolution(), QSize());
- settings.setResolution(QSize(320,240));
- QCOMPARE(settings.resolution(), QSize(320,240));
- settings.setResolution(800,600);
- QCOMPARE(settings.resolution(), QSize(800,600));
- QVERIFY(!settings.isNull());
-
- settings = QImageEncoderSettings();
- QVERIFY(settings.isNull());
- QCOMPARE(settings.format(), QImageEncoderSettings::UnspecifiedFormat);
- QCOMPARE(settings.quality(), QImageEncoderSettings::NormalQuality);
- QCOMPARE(settings.resolution(), QSize());
-
- {
- QImageEncoderSettings settings1;
- QImageEncoderSettings settings2;
- QCOMPARE(settings2, settings1);
-
- settings2 = settings1;
- QCOMPARE(settings2, settings1);
- QVERIFY(settings2.isNull());
-
- settings1.setQuality(QImageEncoderSettings::HighQuality);
-
- QVERIFY(settings2.isNull());
- QVERIFY(!settings1.isNull());
- QVERIFY(settings1 != settings2);
- }
-
- {
- QImageEncoderSettings settings1;
- QImageEncoderSettings settings2(settings1);
- QCOMPARE(settings2, settings1);
-
- settings2 = settings1;
- QCOMPARE(settings2, settings1);
- QVERIFY(settings2.isNull());
-
- settings1.setQuality(QImageEncoderSettings::HighQuality);
-
- QVERIFY(settings2.isNull());
- QVERIFY(!settings1.isNull());
- QVERIFY(settings1 != settings2);
- }
-
- QImageEncoderSettings settings1;
- QImageEncoderSettings settings2;
-
- settings1 = QImageEncoderSettings();
- settings1.setResolution(800,600);
- settings2 = QImageEncoderSettings();
- settings2.setResolution(QSize(800,600));
- QVERIFY(settings1 == settings2);
- settings2.setResolution(QSize(400,300));
- QVERIFY(settings1 != settings2);
-
- settings1 = QImageEncoderSettings();
- settings1.setFormat(QImageEncoderSettings::PNG);
- settings2 = QImageEncoderSettings();
- settings2.setFormat(QImageEncoderSettings::PNG);
- QVERIFY(settings1 == settings2);
- settings2.setFormat(QImageEncoderSettings::Tiff);
- QVERIFY(settings1 != settings2);
-
- settings1 = QImageEncoderSettings();
- settings1.setQuality(QImageEncoderSettings::NormalQuality);
- settings2 = QImageEncoderSettings();
- settings2.setQuality(QImageEncoderSettings::NormalQuality);
- QVERIFY(settings1 == settings2);
- settings2.setQuality(QImageEncoderSettings::LowQuality);
- QVERIFY(settings1 != settings2);
-}
-
void tst_QCamera::testCameraEncodingProperyChange()
{
QMediaCaptureSession session;
diff --git a/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp b/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp
index 3fda9b0de..c69af0621 100644
--- a/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp
+++ b/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp
@@ -181,14 +181,10 @@ void tst_QCameraImageCapture::encodingSettings()
session.setImageCapture(&imageCapture);
QVERIFY(imageCapture.isAvailable() == true);
- QVERIFY(imageCapture.encodingSettings() == QImageEncoderSettings());
- QImageEncoderSettings settings;
- settings.setFormat(QImageEncoderSettings::JPEG);
- settings.setQuality(QImageEncoderSettings::NormalQuality);
- imageCapture.setEncodingSettings(settings);
- QVERIFY(!imageCapture.encodingSettings().isNull());
- QVERIFY(imageCapture.encodingSettings().format() == QImageEncoderSettings::JPEG);
- QVERIFY(imageCapture.encodingSettings().quality() == QImageEncoderSettings::NormalQuality);
+ imageCapture.setFileFormat(QCameraImageCapture::JPEG);
+ imageCapture.setQuality(QCameraImageCapture::NormalQuality);
+ QVERIFY(imageCapture.fileFormat() == QCameraImageCapture::JPEG);
+ QVERIFY(imageCapture.quality() == QCameraImageCapture::NormalQuality);
}
void tst_QCameraImageCapture::errors()
diff --git a/tests/auto/unit/multimedia/qmediaplayer/tst_qmediaplayer.cpp b/tests/auto/unit/multimedia/qmediaplayer/tst_qmediaplayer.cpp
index 0a069b664..9e3c30466 100644
--- a/tests/auto/unit/multimedia/qmediaplayer/tst_qmediaplayer.cpp
+++ b/tests/auto/unit/multimedia/qmediaplayer/tst_qmediaplayer.cpp
@@ -41,7 +41,9 @@
#include "qmockintegration_p.h"
#include "qmockmediaplayer.h"
+#include "qmockaudiooutput.h"
#include "qvideosink.h"
+#include "qaudiooutput.h"
QT_USE_NAMESPACE
@@ -123,6 +125,7 @@ private:
QMockIntegration *mockIntegration;
QMockMediaPlayer *mockPlayer;
+ QAudioOutput *audioOutput = nullptr;
QMediaPlayer *player;
};
@@ -214,6 +217,9 @@ void tst_QMediaPlayer::init()
player = new QMediaPlayer;
mockPlayer = mockIntegration->lastPlayer();
Q_ASSERT(mockPlayer);
+ audioOutput = new QAudioOutput;
+ player->setAudioOutput(audioOutput);
+ Q_ASSERT(mockPlayer->m_audioOutput != nullptr);
}
void tst_QMediaPlayer::cleanup()
@@ -326,29 +332,30 @@ void tst_QMediaPlayer::testVolume()
{
QFETCH(bool, valid);
QFETCH(int, volume);
+ float vol = volume/100.;
- mockPlayer->setVolume(volume);
- QVERIFY(player->volume() == volume);
+ audioOutput->setVolume(vol);
+ QVERIFY(audioOutput->volume() == vol);
if (valid) {
- { QSignalSpy spy(player, SIGNAL(volumeChanged(int)));
- player->setVolume(10);
- QCOMPARE(player->volume(), 10);
+ { QSignalSpy spy(audioOutput, SIGNAL(volumeChanged(float)));
+ audioOutput->setVolume(.1f);
+ QCOMPARE(audioOutput->volume(), .1f);
QCOMPARE(spy.count(), 1); }
- { QSignalSpy spy(player, SIGNAL(volumeChanged(int)));
- player->setVolume(-1000);
- QCOMPARE(player->volume(), 0);
+ { QSignalSpy spy(audioOutput, SIGNAL(volumeChanged(float)));
+ audioOutput->setVolume(-1000.f);
+ QCOMPARE(audioOutput->volume(), 0.f);
QCOMPARE(spy.count(), 1); }
- { QSignalSpy spy(player, SIGNAL(volumeChanged(int)));
- player->setVolume(100);
- QCOMPARE(player->volume(), 100);
+ { QSignalSpy spy(audioOutput, SIGNAL(volumeChanged(float)));
+ audioOutput->setVolume(1.f);
+ QCOMPARE(audioOutput->volume(), 1.f);
QCOMPARE(spy.count(), 1); }
- { QSignalSpy spy(player, SIGNAL(volumeChanged(int)));
- player->setVolume(1000);
- QCOMPARE(player->volume(), 100);
+ { QSignalSpy spy(audioOutput, SIGNAL(volumeChanged(float)));
+ audioOutput->setVolume(1000.f);
+ QCOMPARE(audioOutput->volume(), 1.f);
QCOMPARE(spy.count(), 0); }
}
}
@@ -363,16 +370,17 @@ void tst_QMediaPlayer::testMuted()
QFETCH(bool, valid);
QFETCH(bool, muted);
QFETCH(int, volume);
+ float vol = volume/100.;
if (valid) {
- mockPlayer->setMuted(muted);
- mockPlayer->setVolume(volume);
- QVERIFY(player->isMuted() == muted);
-
- QSignalSpy spy(player, SIGNAL(mutedChanged(bool)));
- player->setMuted(!muted);
- QCOMPARE(player->isMuted(), !muted);
- QCOMPARE(player->volume(), volume);
+ audioOutput->setMuted(muted);
+ audioOutput->setVolume(vol);
+ QVERIFY(audioOutput->isMuted() == muted);
+
+ QSignalSpy spy(audioOutput, SIGNAL(mutedChanged(bool)));
+ audioOutput->setMuted(!muted);
+ QCOMPARE(audioOutput->isMuted(), !muted);
+ QCOMPARE(audioOutput->volume(), vol);
QCOMPARE(spy.count(), 1);
}
}
@@ -784,36 +792,36 @@ void tst_QMediaPlayer::testQrc()
void tst_QMediaPlayer::testAudioRole()
{
+ auto *mockAudioOutput = static_cast<QMockAudioOutput *>(mockPlayer->m_audioOutput);
{
- mockPlayer->hasAudioRole = false;
+ mockAudioOutput->hasAudioRole = false;
- QCOMPARE(player->audioRole(), QAudio::UnknownRole);
- QVERIFY(player->supportedAudioRoles().isEmpty());
+ QCOMPARE(audioOutput->audioRole(), QAudio::UnknownRole);
+ QVERIFY(audioOutput->supportedAudioRoles().isEmpty());
- QSignalSpy spy(player, SIGNAL(audioRoleChanged(QAudio::Role)));
- player->setAudioRole(QAudio::MusicRole);
- QCOMPARE(player->audioRole(), QAudio::MusicRole);
- QCOMPARE(spy.count(), 1);
- player->setAudioRole(QAudio::UnknownRole);
+ QSignalSpy spy(audioOutput, SIGNAL(audioRoleChanged(QAudio::Role)));
+ audioOutput->setAudioRole(QAudio::MusicRole);
+ QCOMPARE(audioOutput->audioRole(), QAudio::UnknownRole);
+ QCOMPARE(spy.count(), 0);
}
{
mockPlayer->reset();
- mockPlayer->hasAudioRole = true;
- QSignalSpy spy(player, SIGNAL(audioRoleChanged(QAudio::Role)));
+ mockAudioOutput->hasAudioRole = true;
+ QSignalSpy spy(audioOutput, SIGNAL(audioRoleChanged(QAudio::Role)));
- QCOMPARE(player->audioRole(), QAudio::UnknownRole);
- QVERIFY(!player->supportedAudioRoles().isEmpty());
+ QCOMPARE(audioOutput->audioRole(), QAudio::UnknownRole);
+ QVERIFY(!audioOutput->supportedAudioRoles().isEmpty());
- player->setAudioRole(QAudio::MusicRole);
- QCOMPARE(player->audioRole(), QAudio::MusicRole);
+ audioOutput->setAudioRole(QAudio::MusicRole);
+ QCOMPARE(audioOutput->audioRole(), QAudio::MusicRole);
QCOMPARE(spy.count(), 1);
QCOMPARE(qvariant_cast<QAudio::Role>(spy.last().value(0)), QAudio::MusicRole);
spy.clear();
- player->setProperty("audioRole", QVariant::fromValue(QAudio::AlarmRole));
- QCOMPARE(qvariant_cast<QAudio::Role>(player->property("audioRole")), QAudio::AlarmRole);
+ audioOutput->setProperty("audioRole", QVariant::fromValue(QAudio::AlarmRole));
+ QCOMPARE(qvariant_cast<QAudio::Role>(audioOutput->property("audioRole")), QAudio::AlarmRole);
QCOMPARE(spy.count(), 1);
QCOMPARE(qvariant_cast<QAudio::Role>(spy.last().value(0)), QAudio::AlarmRole);
}
diff --git a/tests/auto/unit/multimedia/qmediaencoder/CMakeLists.txt b/tests/auto/unit/multimedia/qmediarecorder/CMakeLists.txt
index 566b55a95..68234d7ab 100644
--- a/tests/auto/unit/multimedia/qmediaencoder/CMakeLists.txt
+++ b/tests/auto/unit/multimedia/qmediarecorder/CMakeLists.txt
@@ -1,12 +1,12 @@
-# Generated from qmediarecorder.pro.
+# Generated from QMediaRecorder.pro.
#####################################################################
-## tst_qmediarecorder Test:
+## tst_QMediaRecorder Test:
#####################################################################
-qt_internal_add_test(tst_qmediaencoder
+qt_internal_add_test(tst_qmediarecorder
SOURCES
- tst_qmediaencoder.cpp
+ tst_qmediarecorder.cpp
INCLUDE_DIRECTORIES
../../mockbackend
PUBLIC_LIBRARIES
diff --git a/tests/auto/unit/multimedia/qmediaencoder/tst_qmediaencoder.cpp b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
index bca09aca8..ba80f9951 100644
--- a/tests/auto/unit/multimedia/qmediaencoder/tst_qmediaencoder.cpp
+++ b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
@@ -32,7 +32,7 @@
#include <QDebug>
#include <QtMultimedia/qmediametadata.h>
#include <private/qplatformmediaencoder_p.h>
-#include <qmediaencoder.h>
+#include <qmediarecorder.h>
#include <qaudioformat.h>
#include <qmockintegration_p.h>
#include <qmediacapturesession.h>
@@ -42,7 +42,7 @@
QT_USE_NAMESPACE
-class tst_QMediaEncoder : public QObject
+class tst_QMediaRecorder : public QObject
{
Q_OBJECT
@@ -85,22 +85,22 @@ private:
QCamera *object = nullptr;
QMockMediaCaptureSession *service = nullptr;
QMockMediaEncoder *mock;
- QMediaEncoder *encoder;
+ QMediaRecorder *encoder;
};
-void tst_QMediaEncoder::initTestCase()
+void tst_QMediaRecorder::initTestCase()
{
mockIntegration = new QMockIntegration;
captureSession = new QMediaCaptureSession;
object = new QCamera;
- encoder = new QMediaEncoder;
+ encoder = new QMediaRecorder;
captureSession->setCamera(object);
captureSession->setEncoder(encoder);
service = mockIntegration->lastCaptureService();
mock = service->mockControl;
}
-void tst_QMediaEncoder::cleanupTestCase()
+void tst_QMediaRecorder::cleanupTestCase()
{
delete encoder;
delete object;
@@ -108,21 +108,21 @@ void tst_QMediaEncoder::cleanupTestCase()
delete mockIntegration;
}
-void tst_QMediaEncoder::testBasicSession()
+void tst_QMediaRecorder::testBasicSession()
{
QMediaCaptureSession session;
QCamera camera;
- QMediaEncoder recorder;
+ QMediaRecorder recorder;
session.setCamera(&camera);
session.setEncoder(&recorder);
QCOMPARE(recorder.outputLocation(), QUrl());
- QCOMPARE(recorder.state(), QMediaEncoder::StoppedState);
- QCOMPARE(recorder.error(), QMediaEncoder::NoError);
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
QCOMPARE(recorder.duration(), qint64(0));
}
-void tst_QMediaEncoder::testNullControls()
+void tst_QMediaRecorder::testNullControls()
{
// With the new changes, hasControls does not make much sense anymore
// since the session does not own the controls
@@ -131,13 +131,13 @@ void tst_QMediaEncoder::testNullControls()
QMediaCaptureSession session;
// mockIntegration->lastCaptureService()->hasControls = false;
QCamera camera;
- QMediaEncoder recorder;
+ QMediaRecorder recorder;
session.setCamera(&camera);
// session.setEncoder(&recorder);
QCOMPARE(recorder.outputLocation(), QUrl());
- QCOMPARE(recorder.state(), QMediaEncoder::StoppedState);
- QCOMPARE(recorder.error(), QMediaEncoder::NoError);
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
QCOMPARE(recorder.duration(), qint64(0));
recorder.setOutputLocation(QUrl("file://test/save/file.mp4"));
@@ -158,29 +158,29 @@ void tst_QMediaEncoder::testNullControls()
QCOMPARE(recorder.encoderSettings().videoCodec(), QMediaFormat::VideoCodec::VP9);
QCOMPARE(recorder.encoderSettings().fileFormat(), QMediaFormat::MPEG4);
- QSignalSpy spy(&recorder, SIGNAL(stateChanged(QMediaEncoder::State)));
+ QSignalSpy spy(&recorder, SIGNAL(recorderStateChanged(RecorderState)));
recorder.record();
- QCOMPARE(recorder.state(), QMediaEncoder::StoppedState);
- QCOMPARE(recorder.error(), QMediaEncoder::NoError);
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
QCOMPARE(spy.count(), 0);
recorder.pause();
- QCOMPARE(recorder.state(), QMediaEncoder::StoppedState);
- QCOMPARE(recorder.error(), QMediaEncoder::NoError);
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
QCOMPARE(spy.count(), 0);
recorder.stop();
- QCOMPARE(recorder.state(), QMediaEncoder::StoppedState);
- QCOMPARE(recorder.error(), QMediaEncoder::NoError);
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
QCOMPARE(spy.count(), 0);
}
-void tst_QMediaEncoder::testDeleteMediaSource()
+void tst_QMediaRecorder::testDeleteMediaSource()
{
QMediaCaptureSession session;
QCamera *camera = new QCamera;
- QMediaEncoder *recorder = new QMediaEncoder;
+ QMediaRecorder *recorder = new QMediaRecorder;
session.setCamera(camera);
session.setEncoder(recorder);
@@ -195,24 +195,24 @@ void tst_QMediaEncoder::testDeleteMediaSource()
delete recorder;
}
-void tst_QMediaEncoder::testError()
+void tst_QMediaRecorder::testError()
{
const QString errorString(QLatin1String("format error"));
- QSignalSpy spy(encoder, SIGNAL(errorOccurred(QMediaEncoder::Error, const QString&)));
+ QSignalSpy spy(encoder, SIGNAL(errorOccurred(Error, const QString&)));
- QCOMPARE(encoder->error(), QMediaEncoder::NoError);
+ QCOMPARE(encoder->error(), QMediaRecorder::NoError);
QCOMPARE(encoder->errorString(), QString());
- mock->error(QMediaEncoder::FormatError, errorString);
- QCOMPARE(encoder->error(), QMediaEncoder::FormatError);
+ mock->error(QMediaRecorder::FormatError, errorString);
+ QCOMPARE(encoder->error(), QMediaRecorder::FormatError);
QCOMPARE(encoder->errorString(), errorString);
QCOMPARE(spy.count(), 1);
- QCOMPARE(spy.last()[0].value<QMediaEncoder::Error>(), QMediaEncoder::FormatError);
+ QCOMPARE(spy.last()[0].value<QMediaRecorder::Error>(), QMediaRecorder::FormatError);
}
-void tst_QMediaEncoder::testSink()
+void tst_QMediaRecorder::testSink()
{
encoder->setOutputLocation(QUrl("test.tmp"));
QUrl s = encoder->outputLocation();
@@ -235,56 +235,56 @@ void tst_QMediaEncoder::testSink()
QCOMPARE(encoder->actualLocation(), QUrl::fromLocalFile("default_name.mp4"));
}
-void tst_QMediaEncoder::testRecord()
+void tst_QMediaRecorder::testRecord()
{
- QSignalSpy stateSignal(encoder,SIGNAL(stateChanged(QMediaEncoder::State)));
- QSignalSpy statusSignal(encoder,SIGNAL(statusChanged(QMediaEncoder::Status)));
+ QSignalSpy stateSignal(encoder,SIGNAL(recorderStateChanged(RecorderState)));
+ QSignalSpy statusSignal(encoder,SIGNAL(statusChanged(Status)));
QSignalSpy progressSignal(encoder, SIGNAL(durationChanged(qint64)));
encoder->record();
- QCOMPARE(encoder->state(), QMediaEncoder::RecordingState);
- QCOMPARE(encoder->error(), QMediaEncoder::NoError);
+ QCOMPARE(encoder->recorderState(), QMediaRecorder::RecordingState);
+ QCOMPARE(encoder->error(), QMediaRecorder::NoError);
QCOMPARE(encoder->errorString(), QString());
QCOMPARE(stateSignal.count(), 1);
- QCOMPARE(stateSignal.last()[0].value<QMediaEncoder::State>(), QMediaEncoder::RecordingState);
+ QCOMPARE(stateSignal.last()[0].value<QMediaRecorder::RecorderState>(), QMediaRecorder::RecordingState);
QTestEventLoop::instance().enterLoop(1);
- QCOMPARE(encoder->status(), QMediaEncoder::RecordingStatus);
+ QCOMPARE(encoder->status(), QMediaRecorder::RecordingStatus);
QVERIFY(!statusSignal.isEmpty());
- QCOMPARE(statusSignal.last()[0].value<QMediaEncoder::Status>(), QMediaEncoder::RecordingStatus);
+ QCOMPARE(statusSignal.last()[0].value<QMediaRecorder::Status>(), QMediaRecorder::RecordingStatus);
statusSignal.clear();
QVERIFY(progressSignal.count() > 0);
encoder->pause();
- QCOMPARE(encoder->state(), QMediaEncoder::PausedState);
+ QCOMPARE(encoder->recorderState(), QMediaRecorder::PausedState);
QCOMPARE(stateSignal.count(), 2);
QTestEventLoop::instance().enterLoop(1);
- QCOMPARE(encoder->status(), QMediaEncoder::PausedStatus);
+ QCOMPARE(encoder->status(), QMediaRecorder::PausedStatus);
QVERIFY(!statusSignal.isEmpty());
- QCOMPARE(statusSignal.last()[0].value<QMediaEncoder::Status>(), QMediaEncoder::PausedStatus);
+ QCOMPARE(statusSignal.last()[0].value<QMediaRecorder::Status>(), QMediaRecorder::PausedStatus);
statusSignal.clear();
encoder->stop();
- QCOMPARE(encoder->state(), QMediaEncoder::StoppedState);
+ QCOMPARE(encoder->recorderState(), QMediaRecorder::StoppedState);
QCOMPARE(stateSignal.count(), 3);
QTestEventLoop::instance().enterLoop(1);
- QCOMPARE(encoder->status(), QMediaEncoder::StoppedStatus);
+ QCOMPARE(encoder->status(), QMediaRecorder::StoppedStatus);
QVERIFY(!statusSignal.isEmpty());
- QCOMPARE(statusSignal.last()[0].value<QMediaEncoder::Status>(), QMediaEncoder::StoppedStatus);
+ QCOMPARE(statusSignal.last()[0].value<QMediaRecorder::Status>(), QMediaRecorder::StoppedStatus);
statusSignal.clear();
mock->stop();
QCOMPARE(stateSignal.count(), 3);
}
-void tst_QMediaEncoder::testEncodingSettings()
+void tst_QMediaRecorder::testEncodingSettings()
{
QMediaEncoderSettings settings = encoder->encoderSettings();
QCOMPARE(settings.fileFormat(), QMediaFormat::UnspecifiedFormat);
@@ -309,7 +309,7 @@ void tst_QMediaEncoder::testEncodingSettings()
QCOMPARE(encoder->encoderSettings(), settings);
}
-void tst_QMediaEncoder::testAudioSettings()
+void tst_QMediaRecorder::testAudioSettings()
{
QMediaEncoderSettings settings;
QVERIFY(settings == QMediaEncoderSettings());
@@ -420,7 +420,7 @@ void tst_QMediaEncoder::testAudioSettings()
QVERIFY(settings1 != settings2);
}
-void tst_QMediaEncoder::testVideoSettings()
+void tst_QMediaRecorder::testVideoSettings()
{
QMediaEncoderSettings settings;
QVERIFY(settings == QMediaEncoderSettings());
@@ -534,10 +534,10 @@ void tst_QMediaEncoder::testVideoSettings()
QVERIFY(settings1 != settings2);
}
-void tst_QMediaEncoder::testSettingsApplied()
+void tst_QMediaRecorder::testSettingsApplied()
{
QMediaCaptureSession session;
- QMediaEncoder encoder;
+ QMediaRecorder encoder;
session.setEncoder(&encoder);
auto *mock = mockIntegration->lastCaptureService()->mockControl;
@@ -564,11 +564,11 @@ void tst_QMediaEncoder::testSettingsApplied()
encoder.stop();
}
-void tst_QMediaEncoder::metaData()
+void tst_QMediaRecorder::metaData()
{
QMediaCaptureSession session;
QCamera camera;
- QMediaEncoder recorder;
+ QMediaRecorder recorder;
session.setCamera(&camera);
session.setEncoder(&recorder);
@@ -581,7 +581,7 @@ void tst_QMediaEncoder::metaData()
QCOMPARE(recorder.metaData().value(QMediaMetaData::Author).toString(), QString::fromUtf8("John Doe"));
}
-void tst_QMediaEncoder::testAudioSettingsCopyConstructor()
+void tst_QMediaRecorder::testAudioSettingsCopyConstructor()
{
/* create an object for AudioEncodersettings */
QMediaEncoderSettings audiosettings;
@@ -606,7 +606,7 @@ void tst_QMediaEncoder::testAudioSettingsCopyConstructor()
QVERIFY(other.quality() == audiosettings.quality());
}
-void tst_QMediaEncoder::testAudioSettingsOperatorNotEqual()
+void tst_QMediaRecorder::testAudioSettingsOperatorNotEqual()
{
/* create an object for AudioEncodersettings */
QMediaEncoderSettings audiosettings1;
@@ -643,7 +643,7 @@ void tst_QMediaEncoder::testAudioSettingsOperatorNotEqual()
QVERIFY(audiosettings2.encodingMode() != audiosettings1.encodingMode());
}
-void tst_QMediaEncoder::testAudioSettingsOperatorEqual()
+void tst_QMediaRecorder::testAudioSettingsOperatorEqual()
{
/* create an object for AudioEncodersettings */
QMediaEncoderSettings audiosettings1;
@@ -672,7 +672,7 @@ void tst_QMediaEncoder::testAudioSettingsOperatorEqual()
QVERIFY(audiosettings1 != audiosettings2);
}
-void tst_QMediaEncoder::testAudioSettingsOperatorAssign()
+void tst_QMediaRecorder::testAudioSettingsOperatorAssign()
{
/* create an object for AudioEncodersettings */
@@ -697,42 +697,42 @@ void tst_QMediaEncoder::testAudioSettingsOperatorAssign()
QVERIFY(audiosettings2.quality() == audiosettings1.quality());
}
-void tst_QMediaEncoder::testIsAvailable()
+void tst_QMediaRecorder::testIsAvailable()
{
{
QMediaCaptureSession session;
QCamera camera;
- QMediaEncoder recorder;
+ QMediaRecorder recorder;
session.setCamera(&camera);
session.setEncoder(&recorder);
QCOMPARE(recorder.isAvailable(), true);
}
{
- QMediaEncoder recorder;
+ QMediaRecorder recorder;
QCOMPARE(recorder.isAvailable(), false);
}
}
-/* enum QMediaEncoder::ResourceError property test. */
-void tst_QMediaEncoder::testEnum()
+/* enum QMediaRecorder::ResourceError property test. */
+void tst_QMediaRecorder::testEnum()
{
const QString errorString(QLatin1String("resource error"));
- QSignalSpy spy(encoder, SIGNAL(errorOccurred(QMediaEncoder::Error, const QString&)));
+ QSignalSpy spy(encoder, SIGNAL(errorOccurred(Error, const QString&)));
- QCOMPARE(encoder->error(), QMediaEncoder::NoError);
+ QCOMPARE(encoder->error(), QMediaRecorder::NoError);
QCOMPARE(encoder->errorString(), QString());
- emit mock->error(QMediaEncoder::ResourceError, errorString);
- QCOMPARE(encoder->error(), QMediaEncoder::ResourceError);
+ emit mock->error(QMediaRecorder::ResourceError, errorString);
+ QCOMPARE(encoder->error(), QMediaRecorder::ResourceError);
QCOMPARE(encoder->errorString(), errorString);
QCOMPARE(spy.count(), 1);
- QCOMPARE(spy.last()[0].value<QMediaEncoder::Error>(), QMediaEncoder::ResourceError);
+ QCOMPARE(spy.last()[0].value<QMediaRecorder::Error>(), QMediaRecorder::ResourceError);
}
/* Test the QMediaEncoderSettings quality API*/
-void tst_QMediaEncoder::testVideoSettingsQuality()
+void tst_QMediaRecorder::testVideoSettingsQuality()
{
/* Create the instance*/
QMediaEncoderSettings settings;
@@ -756,7 +756,7 @@ void tst_QMediaEncoder::testVideoSettingsQuality()
}
/* Test QMediaEncoderSettings encodingMode */
-void tst_QMediaEncoder::testVideoSettingsEncodingMode()
+void tst_QMediaRecorder::testVideoSettingsEncodingMode()
{
/* Create the instance*/
QMediaEncoderSettings settings;
@@ -774,7 +774,7 @@ void tst_QMediaEncoder::testVideoSettingsEncodingMode()
}
/* Test QMediaEncoderSettings copy constructor */
-void tst_QMediaEncoder::testVideoSettingsCopyConstructor()
+void tst_QMediaRecorder::testVideoSettingsCopyConstructor()
{
/* Create the instance and initialise it*/
QMediaEncoderSettings settings1;
@@ -802,7 +802,7 @@ void tst_QMediaEncoder::testVideoSettingsCopyConstructor()
}
/* Test QMediaEncoderSettings Overloaded Operator assignment*/
-void tst_QMediaEncoder::testVideoSettingsOperatorAssignment()
+void tst_QMediaRecorder::testVideoSettingsOperatorAssignment()
{
/* Create two instances.*/
QMediaEncoderSettings settings1;
@@ -831,7 +831,7 @@ void tst_QMediaEncoder::testVideoSettingsOperatorAssignment()
}
/* Test QMediaEncoderSettings Overloaded OperatorNotEqual*/
-void tst_QMediaEncoder::testVideoSettingsOperatorNotEqual()
+void tst_QMediaRecorder::testVideoSettingsOperatorNotEqual()
{
/* Create the instance and set the bit rate and Verify objects with OperatorNotEqual*/
QMediaEncoderSettings settings1;
@@ -901,7 +901,7 @@ void tst_QMediaEncoder::testVideoSettingsOperatorNotEqual()
}
/* Test QMediaEncoderSettings Overloaded comparison operator*/
-void tst_QMediaEncoder::testVideoSettingsOperatorComparison()
+void tst_QMediaRecorder::testVideoSettingsOperatorComparison()
{
/* Create the instance and set the bit rate and Verify objects with comparison operator*/
QMediaEncoderSettings settings1;
@@ -971,5 +971,5 @@ void tst_QMediaEncoder::testVideoSettingsOperatorComparison()
QCOMPARE(settings1 == settings2, false);
}
-QTEST_GUILESS_MAIN(tst_QMediaEncoder)
-#include "tst_qmediaencoder.moc"
+QTEST_GUILESS_MAIN(tst_QMediaRecorder)
+#include "tst_qmediarecorder.moc"