summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
diff options
context:
space:
mode:
authorGareth Stockwell <ext-gareth.stockwell@nokia.com>2010-04-14 15:03:50 (GMT)
committerGareth Stockwell <ext-gareth.stockwell@nokia.com>2010-04-15 05:40:05 (GMT)
commit7e598398ec161e3fc5df98ea754bd637d0c1ba30 (patch)
treed245106e3cb07d7f13ed1a72f02ee23313b0ee32 /src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
parent4f97cf29e5be9f34341dd99ad4bd8dd3d61b1441 (diff)
downloadQt-7e598398ec161e3fc5df98ea754bd637d0c1ba30.zip
Qt-7e598398ec161e3fc5df98ea754bd637d0c1ba30.tar.gz
Qt-7e598398ec161e3fc5df98ea754bd637d0c1ba30.tar.bz2
Phonon MMF: calling pause() when in StoppedState triggers stateChanged()
Previously, the MMF backend simply swallowed a call to pause() when in StoppedState. However, the stopToPause step in tst_mediaobject requires the backend to emit a stateChanged signal when this happens. Reviewed-by: Frans Englich
Diffstat (limited to 'src/3rdparty/phonon/mmf/abstractmediaplayer.cpp')
-rw-r--r--src/3rdparty/phonon/mmf/abstractmediaplayer.cpp65
1 files changed, 53 insertions, 12 deletions
diff --git a/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp b/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
index ea2d536..7104ebd 100644
--- a/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
+++ b/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
@@ -48,7 +48,7 @@ MMF::AbstractMediaPlayer::AbstractMediaPlayer
(MediaObject *parent, const AbstractPlayer *player)
: AbstractPlayer(player)
, m_parent(parent)
- , m_playPending(false)
+ , m_pending(NothingPending)
, m_positionTimer(new QTimer(this))
, m_bufferStatusTimer(new QTimer(this))
, m_mmfMaxVolume(NullMaxVolume)
@@ -74,7 +74,7 @@ void MMF::AbstractMediaPlayer::play()
break;
case LoadingState:
- m_playPending = true;
+ setPending(PlayPending);
break;
case StoppedState:
@@ -101,14 +101,16 @@ void MMF::AbstractMediaPlayer::pause()
TRACE_CONTEXT(AbstractMediaPlayer::pause, EAudioApi);
TRACE_ENTRY("state %d", privateState());
- m_playPending = false;
stopTimers();
switch (privateState()) {
case GroundState:
case LoadingState:
- case PausedState:
case StoppedState:
+ setPending(PausePending);
+ break;
+
+ case PausedState:
// Do nothing
break;
@@ -133,7 +135,7 @@ void MMF::AbstractMediaPlayer::stop()
TRACE_CONTEXT(AbstractMediaPlayer::stop, EAudioApi);
TRACE_ENTRY("state %d", privateState());
- m_playPending = false;
+ setPending(NothingPending);
stopTimers();
switch (privateState()) {
@@ -363,6 +365,18 @@ void MMF::AbstractMediaPlayer::maxVolumeChanged(int mmfMaxVolume)
doVolumeChanged();
}
+void MMF::AbstractMediaPlayer::loadingComplete(int error)
+{
+ Q_ASSERT(Phonon::LoadingState == state());
+
+ if (KErrNone == error) {
+ updateMetaData();
+ changeState(StoppedState);
+ } else {
+ setError(tr("Loading clip failed"), error);
+ }
+}
+
void MMF::AbstractMediaPlayer::playbackComplete(int error)
{
stopTimers();
@@ -439,6 +453,15 @@ void MMF::AbstractMediaPlayer::resetMarksIfRewound()
m_aboutToFinishSent = false;
}
+void MMF::AbstractMediaPlayer::setPending(Pending pending)
+{
+ const Phonon::State oldState = state();
+ m_pending = pending;
+ const Phonon::State newState = state();
+ if (newState != oldState)
+ emit stateChanged(newState, oldState);
+}
+
void MMF::AbstractMediaPlayer::startPlayback()
{
doPlay();
@@ -451,6 +474,18 @@ void MMF::AbstractMediaPlayer::bufferStatusTick()
emit MMF::AbstractPlayer::bufferStatus(bufferStatus());
}
+Phonon::State MMF::AbstractMediaPlayer::phononState(PrivateState state) const
+{
+ Phonon::State result = AbstractPlayer::phononState(state);
+
+ if (PausePending == m_pending) {
+ Q_ASSERT(Phonon::StoppedState == result || Phonon::LoadingState == result);
+ result = Phonon::PausedState;
+ }
+
+ return result;
+}
+
void MMF::AbstractMediaPlayer::changeState(PrivateState newState)
{
TRACE_CONTEXT(AbstractMediaPlayer::changeState, EAudioInternal);
@@ -462,15 +497,21 @@ void MMF::AbstractMediaPlayer::changeState(PrivateState newState)
// Ensure initial volume is set on MMF API before starting playback
doVolumeChanged();
- // Check whether play() was called while clip was being loaded. If so,
- // playback should be started now
- if (m_playPending) {
- TRACE_0("play was called while loading; starting playback now");
- m_playPending = false;
- startPlayback();
- } else {
+ switch (m_pending) {
+ case NothingPending:
AbstractPlayer::changeState(newState);
+ break;
+
+ case PlayPending:
+ startPlayback();
+ break;
+
+ case PausePending:
+ AbstractPlayer::changeState(PausedState);
+ break;
}
+
+ setPending(NothingPending);
} else {
AbstractPlayer::changeState(newState);
}