Ignore:
Timestamp:
Aug 2, 2010, 9:27:30 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.3 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp

    r561 r769  
    4949        :   AbstractPlayer(player)
    5050        ,   m_parent(parent)
    51         ,   m_playPending(false)
     51        ,   m_pending(NothingPending)
    5252        ,   m_positionTimer(new QTimer(this))
    5353        ,   m_bufferStatusTimer(new QTimer(this))
     
    7575
    7676    case LoadingState:
    77         m_playPending = true;
     77        setPending(PlayPending);
    7878        break;
    7979
    8080    case StoppedState:
    8181    case PausedState:
    82         doPlay();
    83         startPositionTimer();
    84         changeState(PlayingState);
     82        startPlayback();
    8583        break;
    8684
     
    104102    TRACE_ENTRY("state %d", privateState());
    105103
    106     m_playPending = false;
    107104    stopTimers();
    108105
     
    110107    case GroundState:
    111108    case LoadingState:
     109    case StoppedState:
     110        setPending(PausePending);
     111        break;
     112
    112113    case PausedState:
    113     case StoppedState:
    114114        // Do nothing
    115115        break;
     
    136136    TRACE_ENTRY("state %d", privateState());
    137137
    138     m_playPending = false;
     138    setPending(NothingPending);
    139139    stopTimers();
    140140
     
    366366}
    367367
     368void MMF::AbstractMediaPlayer::loadingComplete(int error)
     369{
     370    Q_ASSERT(Phonon::LoadingState == state());
     371
     372    if (KErrNone == error) {
     373        updateMetaData();
     374        changeState(StoppedState);
     375    } else {
     376        setError(tr("Loading clip failed"), error);
     377    }
     378}
     379
    368380void MMF::AbstractMediaPlayer::playbackComplete(int error)
    369381{
    370382    stopTimers();
    371383
     384    if (KErrNone == error && !m_aboutToFinishSent) {
     385        const qint64 total = totalTime();
     386        emit MMF::AbstractPlayer::tick(total);
     387        m_aboutToFinishSent = true;
     388        emit aboutToFinish();
     389    }
     390
    372391    if (KErrNone == error) {
    373         changeState(StoppedState);
     392        changeState(PausedState);
    374393
    375394        // MediaObject::switchToNextSource deletes the current player, so we
     
    380399    else {
    381400        setError(tr("Playback complete"), error);
     401        emit finished();
    382402    }
    383403}
     
    394414void MMF::AbstractMediaPlayer::positionTick()
    395415{
    396     emitMarksIfReached();
    397 
    398416    const qint64 current = currentTime();
     417    emitMarksIfReached(current);
    399418    emit MMF::AbstractPlayer::tick(current);
    400419}
    401420
    402 void MMF::AbstractMediaPlayer::emitMarksIfReached()
    403 {
    404     const qint64 current = currentTime();
     421void MMF::AbstractMediaPlayer::emitMarksIfReached(qint64 current)
     422{
    405423    const qint64 total = totalTime();
    406424    const qint64 remaining = total - current;
     
    436454}
    437455
     456void MMF::AbstractMediaPlayer::setPending(Pending pending)
     457{
     458    const Phonon::State oldState = state();
     459    m_pending = pending;
     460    const Phonon::State newState = state();
     461    if (newState != oldState)
     462        emit stateChanged(newState, oldState);
     463}
     464
     465void MMF::AbstractMediaPlayer::startPlayback()
     466{
     467    doPlay();
     468    startPositionTimer();
     469    changeState(PlayingState);
     470}
     471
    438472void MMF::AbstractMediaPlayer::bufferStatusTick()
    439473{
    440474    emit MMF::AbstractPlayer::bufferStatus(bufferStatus());
     475}
     476
     477Phonon::State MMF::AbstractMediaPlayer::phononState(PrivateState state) const
     478{
     479    Phonon::State result = AbstractPlayer::phononState(state);
     480
     481    if (PausePending == m_pending) {
     482        Q_ASSERT(Phonon::StoppedState == result || Phonon::LoadingState == result);
     483        result = Phonon::PausedState;
     484    }
     485
     486    return result;
    441487}
    442488
     
    448494    const Phonon::State newPhononState = phononState(newState);
    449495
    450     // TODO: add some invariants to check that the transition is valid
    451     AbstractPlayer::changeState(newState);
    452 
    453496    if (LoadingState == oldPhononState && StoppedState == newPhononState) {
    454         // Ensure initial volume is set on MMF API before starting playback
    455         doVolumeChanged();
    456 
    457         // Check whether play() was called while clip was being loaded.  If so,
    458         // playback should be started now
    459         if (m_playPending) {
    460             TRACE_0("play was called while loading; starting playback now");
    461             m_playPending = false;
    462             play();
    463         }
     497        switch (m_pending) {
     498        case NothingPending:
     499            AbstractPlayer::changeState(newState);
     500            break;
     501
     502        case PlayPending:
     503            changeState(PlayingState); // necessary in order to apply initial volume
     504            doVolumeChanged();
     505            startPlayback();
     506            break;
     507
     508        case PausePending:
     509            AbstractPlayer::changeState(PausedState);
     510            break;
     511        }
     512
     513        setPending(NothingPending);
     514    } else {
     515        AbstractPlayer::changeState(newState);
    464516    }
    465517}
Note: See TracChangeset for help on using the changeset viewer.