summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVal Doroshchuk <valentyn.doroshchuk@qt.io>2017-11-02 09:08:37 +0100
committerVaL Doroshchuk <valentyn.doroshchuk@qt.io>2017-12-20 12:03:48 +0000
commitbfebd23f150fa660177fff6aa372ae46e42038c3 (patch)
tree7a1a681af725d0d9a30febeb3b88d723f6ba66d0
parent13363975133c2a213daf4b05989cdc24a74d6c15 (diff)
downloadqtmultimedia-bfebd23f150fa660177fff6aa372ae46e42038c3.tar.gz
Update player state after QMediaPlayer::EndOfMedia
Return up-to-date player state if mediaStatusChanged() with QMediaPlayer::EndOfMedia is already received but stateChanged() is not. mediaStatusChanged() is always emitted first which could cause the player to keep outdated state before stateChanged() is received. Task-number: QTBUG-57197 Change-Id: I0706069d2f4875076442fdf8ac7e938272ab843c Reviewed-by: Christian Stromme <christian.stromme@qt.io>
-rw-r--r--src/multimedia/playback/qmediaplayer.cpp12
-rw-r--r--tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp23
2 files changed, 34 insertions, 1 deletions
diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp
index 16fdec8ea..a3484a6ff 100644
--- a/src/multimedia/playback/qmediaplayer.cpp
+++ b/src/multimedia/playback/qmediaplayer.cpp
@@ -718,7 +718,17 @@ void QMediaPlayer::setNetworkConfigurations(const QList<QNetworkConfiguration> &
QMediaPlayer::State QMediaPlayer::state() const
{
- return d_func()->state;
+ Q_D(const QMediaPlayer);
+
+ // In case if EndOfMedia status is already received
+ // but state is not.
+ if (d->control != 0
+ && d->status == QMediaPlayer::EndOfMedia
+ && d->state != d->control->state()) {
+ return d->control->state();
+ }
+
+ return d->state;
}
QMediaPlayer::MediaStatus QMediaPlayer::mediaStatus() const
diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
index 082e81b34..3deb534eb 100644
--- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
+++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
@@ -77,6 +77,7 @@ private slots:
void surfaceTest_data();
void surfaceTest();
void metadata();
+ void playerStateAtEOS();
private:
QMediaContent selectVideoFile(const QStringList& mediaCandidates);
@@ -1412,6 +1413,28 @@ void tst_QMediaPlayerBackend::metadata()
QVERIFY(player.availableMetaData().isEmpty());
}
+void tst_QMediaPlayerBackend::playerStateAtEOS()
+{
+ if (!isWavSupported())
+ QSKIP("Sound format is not supported");
+
+ QMediaPlayer player;
+
+ bool endOfMediaReceived = false;
+ connect(&player, &QMediaPlayer::mediaStatusChanged, [&](QMediaPlayer::MediaStatus status) {
+ if (status == QMediaPlayer::EndOfMedia) {
+ QCOMPARE(player.state(), QMediaPlayer::StoppedState);
+ endOfMediaReceived = true;
+ }
+ });
+
+ player.setMedia(localWavFile);
+ player.play();
+
+ QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::EndOfMedia);
+ QVERIFY(endOfMediaReceived);
+}
+
TestVideoSurface::TestVideoSurface(bool storeFrames):
m_totalFrames(0),
m_storeFrames(storeFrames)