diff options
author | Gareth Stockwell <ext-gareth.stockwell@nokia.com> | 2010-04-14 15:03:50 (GMT) |
---|---|---|
committer | Gareth Stockwell <ext-gareth.stockwell@nokia.com> | 2010-04-15 05:40:05 (GMT) |
commit | 7e598398ec161e3fc5df98ea754bd637d0c1ba30 (patch) | |
tree | d245106e3cb07d7f13ed1a72f02ee23313b0ee32 /src/3rdparty/phonon/mmf/abstractmediaplayer.cpp | |
parent | 4f97cf29e5be9f34341dd99ad4bd8dd3d61b1441 (diff) | |
download | Qt-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.cpp | 65 |
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); } |