summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-06-07 12:21:09 +0200
committerLars Knoll <lars.knoll@qt.io>2021-06-11 15:12:36 +0200
commitfc9cc90818a56b919ea1e50838bd13376b268bfe (patch)
treea18fb6dddd5e873d1e9fdf2bb944132070833a42
parent923a000261717ba6c898205bc4a5973b34bed2c5 (diff)
Use QAudioOutput in QMediaPlayer
Adjust QMediaPlayer to the new audio output architecture. One now needs to explicitly add a QAudioOutput to the media player to get audio playback. While this requires two more lines of code to set up the media player, it does make the API consistent between audio and video and also consistent with what we have in QMediaCaptureSession. Adjusted auto tests where required and ported all platforms. Change-Id: I247e915e4862dee6d6bce367b83664b1d1d69726 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-rw-r--r--examples/multimedia/declarative-camera/VideoPreview.qml2
-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/player/player.cpp29
-rw-r--r--examples/multimediawidgets/player/player.h3
-rw-r--r--src/multimedia/CMakeLists.txt1
-rw-r--r--src/multimedia/audio/qaudioinput.cpp1
-rw-r--r--src/multimedia/audio/qaudiooutput.cpp42
-rw-r--r--src/multimedia/audio/qaudiooutput.h6
-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/platform/android/common/qandroidaudiooutput_p.h79
-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/qandroidintegration.cpp6
-rw-r--r--src/multimedia/platform/android/qandroidintegration_p.h2
-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/gstreamer/common/qgstreameraudiooutput.cpp3
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp50
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamermediaplayer_p.h11
-rw-r--r--src/multimedia/platform/qplatformaudiooutput_p.h3
-rw-r--r--src/multimedia/platform/qplatformmediaplayer_p.h15
-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/playback/qmediaplayer.cpp156
-rw-r--r--src/multimedia/playback/qmediaplayer.h24
-rw-r--r--src/multimedia/playback/qmediaplayer_p.h3
-rw-r--r--src/multimediaquick/Video.qml5
-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.cpp6
-rw-r--r--tests/auto/unit/mockbackend/qmockintegration_p.h2
-rw-r--r--tests/auto/unit/mockbackend/qmockmediaplayer.h34
-rw-r--r--tests/auto/unit/multimedia/qmediaplayer/tst_qmediaplayer.cpp84
40 files changed, 553 insertions, 572 deletions
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/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/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/multimedia/CMakeLists.txt b/src/multimedia/CMakeLists.txt
index 9c30e29fa..0a1cf86ab 100644
--- a/src/multimedia/CMakeLists.txt
+++ b/src/multimedia/CMakeLists.txt
@@ -304,6 +304,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
diff --git a/src/multimedia/audio/qaudioinput.cpp b/src/multimedia/audio/qaudioinput.cpp
index 671cec4ee..c8e4a1bfc 100644
--- a/src/multimedia/audio/qaudioinput.cpp
+++ b/src/multimedia/audio/qaudioinput.cpp
@@ -126,6 +126,7 @@ float QAudioInput::volume() const
void QAudioInput::setVolume(float volume)
{
+ volume = qBound(0., volume, 1.);
if (d->volume == volume)
return;
d->volume = volume;
diff --git a/src/multimedia/audio/qaudiooutput.cpp b/src/multimedia/audio/qaudiooutput.cpp
index c2590533b..c29251533 100644
--- a/src/multimedia/audio/qaudiooutput.cpp
+++ b/src/multimedia/audio/qaudiooutput.cpp
@@ -49,6 +49,7 @@
\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
@@ -86,6 +87,16 @@
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)
{}
@@ -112,7 +123,7 @@ QAudioDevice QAudioOutput::device() const
void QAudioOutput::setDevice(const QAudioDevice &device)
{
- if (device.mode() != QAudio::AudioOutput)
+ if (!device.isNull() && device.mode() != QAudio::AudioOutput)
return;
if (d->device == device)
return;
@@ -128,6 +139,7 @@ float QAudioOutput::volume() const
void QAudioOutput::setVolume(float volume)
{
+ volume = qBound(0., volume, 1.);
if (d->volume == volume)
return;
d->volume = volume;
@@ -140,6 +152,23 @@ 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)
@@ -149,4 +178,15 @@ void QAudioOutput::setMuted(bool 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
index 0f1461a55..9a4cf3998 100644
--- a/src/multimedia/audio/qaudiooutput.h
+++ b/src/multimedia/audio/qaudiooutput.h
@@ -55,6 +55,7 @@ class Q_MULTIMEDIA_EXPORT QAudioOutput : public QObject
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);
@@ -64,16 +65,21 @@ public:
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; }
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/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/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/qandroidintegration.cpp b/src/multimedia/platform/android/qandroidintegration.cpp
index d7fe2b3bc..167caea43 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
@@ -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..b1ab26cfe 100644
--- a/src/multimedia/platform/android/qandroidintegration_p.h
+++ b/src/multimedia/platform/android/qandroidintegration_p.h
@@ -72,6 +72,8 @@ public:
QPlatformMediaEncoder *createEncoder(QMediaEncoder *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/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/gstreamer/common/qgstreameraudiooutput.cpp b/src/multimedia/platform/gstreamer/common/qgstreameraudiooutput.cpp
index da0ffce72..a7a531e7f 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreameraudiooutput.cpp
+++ b/src/multimedia/platform/gstreamer/common/qgstreameraudiooutput.cpp
@@ -96,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/qgstreamermediaplayer.cpp b/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp
index 08ca8f23b..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(nullptr);
- gstAudioOutput->setPipeline(playerPipeline);
- connect(gstAudioOutput, &QGstreamerAudioOutput::mutedChanged, this, &QGstreamerMediaPlayer::mutedChangedHandler);
- connect(gstAudioOutput, &QGstreamerAudioOutput::volumeChanged, this, &QGstreamerMediaPlayer::volumeChangedHandler);
-
gstVideoOutput = new QGstreamerVideoOutput(this);
gstVideoOutput->setPipeline(playerPipeline);
@@ -101,7 +96,6 @@ QGstreamerMediaPlayer::~QGstreamerMediaPlayer()
playerPipeline.removeMessageFilter(this);
playerPipeline.setStateSync(GST_STATE_NULL);
topology.free();
- delete gstAudioOutput;
}
qint64 QGstreamerMediaPlayer::position() const
@@ -122,16 +116,6 @@ float QGstreamerMediaPlayer::bufferProgress() const
return m_bufferProgress/100.;
}
-int QGstreamerMediaPlayer::volume() const
-{
- return qRound(gstAudioOutput->volume*100.);
-}
-
-bool QGstreamerMediaPlayer::isMuted() const
-{
- return gstAudioOutput->muted;
-}
-
bool QGstreamerMediaPlayer::isSeekable() const
{
return true;
@@ -232,25 +216,6 @@ void QGstreamerMediaPlayer::stopOrEOS(bool eos)
mediaStatusChanged(eos ? QMediaPlayer::EndOfMedia : QMediaPlayer::LoadedMedia);
}
-void QGstreamerMediaPlayer::setVolume(int vol)
-{
- float v = vol/100.;
- if (v == gstAudioOutput->volume)
- return;
- gstAudioOutput->volume = v;
- gstAudioOutput->setVolume(vol/100.);
- volumeChanged(vol);
-}
-
-void QGstreamerMediaPlayer::setMuted(bool muted)
-{
- if (muted == gstAudioOutput->muted)
- return;
- gstAudioOutput->muted = muted;
- gstAudioOutput->setMuted(muted);
- mutedChanged(muted);
-}
-
bool QGstreamerMediaPlayer::processBusMessage(const QGstreamerMessage &message)
{
if (message.isNull())
@@ -434,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 {
@@ -611,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/qplatformaudiooutput_p.h b/src/multimedia/platform/qplatformaudiooutput_p.h
index 594d59ed0..9979a6d5e 100644
--- a/src/multimedia/platform/qplatformaudiooutput_p.h
+++ b/src/multimedia/platform/qplatformaudiooutput_p.h
@@ -66,11 +66,14 @@ public:
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
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/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/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 5903356b8..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,11 +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_PROPERTY(QAudioOutput *audioOutput READ audioOutput WRITE setAudioOutput NOTIFY audioOutputChanged)
public:
enum PlaybackState
@@ -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/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/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..69e5c8e05 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
@@ -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..1625c021f 100644
--- a/tests/auto/unit/mockbackend/qmockintegration_p.h
+++ b/tests/auto/unit/mockbackend/qmockintegration_p.h
@@ -79,6 +79,8 @@ public:
QPlatformMediaCaptureSession *createCaptureSession() override;
QPlatformVideoSink *createVideoSink(QVideoSink *) override;
+ QPlatformAudioOutput *createAudioOutput(QAudioOutput *) override;
+
enum Flag {
NoPlayerInterface = 0x1,
NoAudioDecoderInterface = 0x2,
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/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);
}