summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@digia.com>2014-04-04 18:43:30 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-04-07 11:51:22 +0200
commitbfccbcfc4edf65e31fe4b086013e1bf132e9b047 (patch)
treeb3837833bb602a010df80be42b5abb17668b1346
parentd3ba2d6f3f7cbdd8a4e41a7967874f53a2caaec3 (diff)
downloadqtmultimedia-bfccbcfc4edf65e31fe4b086013e1bf132e9b047.tar.gz
DirectShow: fix media seeking while stopped.
When changing the position of a media player while stopped, playback was automatically resuming. We now cache the value and actually set the position only when starting playback. Task-number: QTBUG-38068 Change-Id: Ib35302e01967d70350125f9ad920551df2a3c25b Reviewed-by: Christian Stromme <christian.stromme@digia.com>
-rw-r--r--src/plugins/directshow/player/directshowplayercontrol.cpp13
-rw-r--r--src/plugins/directshow/player/directshowplayercontrol.h1
2 files changed, 14 insertions, 0 deletions
diff --git a/src/plugins/directshow/player/directshowplayercontrol.cpp b/src/plugins/directshow/player/directshowplayercontrol.cpp
index 553ccb43b..179f635ec 100644
--- a/src/plugins/directshow/player/directshowplayercontrol.cpp
+++ b/src/plugins/directshow/player/directshowplayercontrol.cpp
@@ -83,6 +83,7 @@ DirectShowPlayerControl::DirectShowPlayerControl(DirectShowPlayerService *servic
, m_streamTypes(0)
, m_muteVolume(-1)
, m_position(0)
+ , m_pendingPosition(-1)
, m_duration(0)
, m_playbackRate(0)
, m_seekable(false)
@@ -112,12 +113,22 @@ qint64 DirectShowPlayerControl::duration() const
qint64 DirectShowPlayerControl::position() const
{
+ if (m_pendingPosition != -1)
+ return m_pendingPosition;
+
return const_cast<qint64 &>(m_position) = m_service->position();
}
void DirectShowPlayerControl::setPosition(qint64 position)
{
+ if (m_state == QMediaPlayer::StoppedState && m_pendingPosition != position) {
+ m_pendingPosition = position;
+ emit positionChanged(m_pendingPosition);
+ return;
+ }
+
m_service->seek(position);
+ m_pendingPosition = -1;
}
int DirectShowPlayerControl::volume() const
@@ -253,6 +264,8 @@ void DirectShowPlayerControl::play()
return;
}
m_service->play();
+ if (m_pendingPosition != -1)
+ setPosition(m_pendingPosition);
emit stateChanged(m_state = QMediaPlayer::PlayingState);
}
diff --git a/src/plugins/directshow/player/directshowplayercontrol.h b/src/plugins/directshow/player/directshowplayercontrol.h
index 478389de6..19dcb5a88 100644
--- a/src/plugins/directshow/player/directshowplayercontrol.h
+++ b/src/plugins/directshow/player/directshowplayercontrol.h
@@ -135,6 +135,7 @@ private:
int m_streamTypes;
int m_muteVolume;
qint64 m_position;
+ qint64 m_pendingPosition;
qint64 m_duration;
qreal m_playbackRate;
bool m_seekable;