upnpavcontroller/upnprenderingstatemachine/inc/upnprenderingplaytimecalculator.h
author Sampo Huttunen <sampo.huttunen@nokia.com>
Wed, 03 Nov 2010 11:45:09 +0200
branchIOP_Improvements
changeset 40 08b5eae9f9ff
permissions -rw-r--r--
merge from Nokia's internal development branch

/*
* Copyright (c) 2007,2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  Calculates playback time for rendering state machine
*
*/

#ifndef UPNPRENDERINGPLAYTIMECALCULATOR_H
#define UPNPRENDERINGPLAYTIMECALCULATOR_H

//  INCLUDES
#include <e32base.h>

// FORWARD DECLARATIONS

// CLASS DECLARATION


/**
* A class that keeps track of playback time by setting a timestamp at given
* play, pause, resume and stop events and maybe also comparing that to given
* fixed progress positions along the way. By doing that we will be able to
* tell how long the track has been playing when a stop signal arrives. This
* is important so that we can tell if it is a natural "track complete" stop
* or an "user interrupt" type of stop.
*/
NONSHARABLE_CLASS( CUpnpRenderingPlaytimeCalculator )
    {
public: // the interface

    /**
     * Default constructor
     */
    CUpnpRenderingPlaytimeCalculator();

    /**
     * Marks START timestamp.
     * Calling Start() will reset the calculator.
     */
    void Start();

    /**
     * Marks PAUSE timestamp.
     * Can be called multiple times, ceach Pause will replace previous mark.
     */
    void Pause();

    /**
     * Marks RESUME timestamp.
     * Can NOT be called multiple times.
     */
    void Resume();

    /**
     * Marks STOP timestamp.
     * Can be called multiple times.
     */
    void Stop();

    /**
     * Sets the track duration as it is represented in the media server.
     * This method should be used to set the initial duration so that
     * the calculator works even if renderer NEVER sends position info.
     * @param aDuration track duration in milliseconds
     */
    void SetDuration( TInt aDuration );

    /**
     * Returns the track duration if it is known, otherwise KErrNotFound.
     */
    TInt Duration() const;

    /**
     * Acknowledges track duration and position info that was received from
     * the renderer. Following things are done here:
     * 1. The renderer's understanding of duration might be different from
     * media server's understanding. If it is, we MAY modify it.
     * 2. The position is compared to the calculated position and if it is
     * different, an offset is calculated and used in future Position calls.
     */
    void AcknowledgePositionInfo( TInt aDuration, TInt aPosition );

    /**
     * Estimates position now, or returns total playtime of previous track.
     */
    TInt Position() const;

    /**
     * returns true if last track track playtime would indicate that it was
     * played back entirely.
     */
    TBool IsTrackComplete() const;
        
    /**
     * Returns true if calculator is in playing state.
     */
    TBool IsPlaying() const;
    
    /**
     * Adjust the start mark according to the new postion; use case is seek
     */
   void RestartAt( TInt aNewPosition );

private:

    /**
     * calculates playtime estimate starting from PLAY mark until given time,
     * tacking in account all time spent in PAUSE and also cinsidering offset.
     */
    TInt PositionAt( TTime& aTime ) const;

    /**
     * calculates time spent in pause
     */
    TInt PausetimeAt( TTime& aTime ) const;
    
    /**
     * calculates the offset from current time and the position
     */
    TInt OffsetFromNow( TInt aPosition ) const;

private:

    // duration of the track
    TInt iDuration;

    // the start timestamp
    TTime iStartMark;

    // the stop timestamp
    TTime iStopMark;

    // the pause mark
    TTime iPauseMark;

    // total time spent in pause
    TInt iPauseTime;

    // the offset to real position
    TInt iOffset;

    // is a track playing
    TBool iPlaying;

    // is track paused
    TBool iPaused;

    };



#endif  // UPNPRENDERINGPLAYTIMECALCULATOR_H

// End of File