williamr@4: // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@4: // All rights reserved. williamr@4: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@4: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@4: // williamr@4: // Initial Contributors: williamr@4: // Nokia Corporation - initial contribution. williamr@4: // williamr@4: // Contributors: williamr@4: // williamr@4: // Description: williamr@4: // williamr@4: williamr@4: /** williamr@4: @file williamr@4: @internalTechnology williamr@4: */ williamr@4: williamr@4: #ifndef MMFDATAPATH2_H williamr@4: #define MMFDATAPATH2_H williamr@4: williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: williamr@4: /** williamr@4: williamr@4: This class is an extended version of CMMFDataPath. CMMFDataPath is extended to implement the loop play williamr@4: functionality in the controller. This class overrides some of the virual functions of CMMFDataPath in order to williamr@4: implement the loop play functionality. All the controller plugins that require loop play functionality should williamr@4: use CMMFDataPath2 in place of CMMFDataPath. williamr@4: williamr@4: @see CMMFDataPath williamr@4: */ williamr@4: class CMMFDataPath2 : public CMMFDataPath williamr@4: { williamr@4: public: williamr@4: //CMMFDataPath2 constructor if codec Uid is not already known by CMMFController williamr@4: //and there is no data path ambiguity - ie only one data path is possible williamr@4: IMPORT_C static CMMFDataPath2* NewL(MAsyncEventHandler& aEventHandler); williamr@4: williamr@4: //CMMFDataPath2 constructor if codec Uid is not already known by CMMFController williamr@4: //and there is ambiguity ie more than one possible data path TMediaId used to select path williamr@4: IMPORT_C static CMMFDataPath2* NewL(TMediaId aMediaId, MAsyncEventHandler& aEventHandler); williamr@4: williamr@4: //CMMFDataPath2 constructor if codec Uid is already known by CMMFController williamr@4: //and there is no data path ambiguity - ie only one data path is possible williamr@4: IMPORT_C static CMMFDataPath2* NewL(TUid aCodecUid, MAsyncEventHandler& aEventHandler); williamr@4: williamr@4: //CMMFDataPath2 constructor if codec Uid is already known by CMMFController williamr@4: //and there is ambiguity ie more than one possible data path TMediaId used to select path williamr@4: IMPORT_C static CMMFDataPath2* NewL(TUid aCodecUid, TMediaId aMediaId, MAsyncEventHandler& aEventHandler); williamr@4: williamr@4: virtual ~CMMFDataPath2(); williamr@4: virtual void BufferFilledL(CMMFBuffer* aBuffer); //called by the CMMFDataPath's MDataSource when it has filled the buffer williamr@4: williamr@4: virtual void PrimeL(); williamr@4: virtual void PlayL(); williamr@4: virtual void Pause(); williamr@4: virtual void Stop(); williamr@4: virtual void SetPositionL(const TTimeIntervalMicroSeconds& aPosition); williamr@4: virtual TTimeIntervalMicroSeconds Position() const; williamr@4: // Called when source and sink needs to be de-referenced williamr@4: virtual void ResetL(); williamr@4: void RunL(); williamr@4: // Set Repeats. williamr@4: IMPORT_C void SetRepeats(TInt aRepeatNumberOfTimes, const TTimeIntervalMicroSeconds& aTrailingSilence); williamr@4: IMPORT_C void SetDrmProperties(MDataSource* iDrmSource, TBool *aDisableAutoIntent); williamr@4: IMPORT_C void RetainRepeatInfo(); williamr@4: IMPORT_C void PreEmptionPause(); williamr@4: williamr@4: protected: williamr@4: CMMFDataPath2(TMediaId aMediaId, MAsyncEventHandler& aEventHandler); williamr@4: void ConstructL(TUid aCodecUid = KNullUid); williamr@4: void FillSourceBufferL(); williamr@4: void DoFillSourceBufferL(); williamr@4: TTimeIntervalMicroSeconds CalculateAudioOutputPosition() const; williamr@4: //called when trailing silence playback is complete williamr@4: static TInt RepeatTrailingSilenceTimerComplete(TAny* aDataPath); williamr@4: TInt DoRepeatTrailingSilenceTimerCompleteL(); williamr@4: void PlaySilence(); williamr@4: void DoStopL(); williamr@4: void DoPauseL(); williamr@4: void DoCancel(); williamr@4: TTimeIntervalMicroSeconds OutputPosition() const; williamr@4: void DoPreEmptionPauseL(); williamr@4: williamr@4: williamr@4: protected: williamr@4: /** williamr@4: The number of times to repeat the audio sample. williamr@4: */ williamr@4: TInt iNumberOfTimesToRepeat; williamr@4: williamr@4: /** williamr@4: The number of times played. williamr@4: */ williamr@4: TInt iNumberOfTimesPlayed; williamr@4: /** williamr@4: The time interval of the trailing silence in microseconds. williamr@4: */ williamr@4: TTimeIntervalMicroSeconds iTrailingSilence; williamr@4: williamr@4: /** williamr@4: The time interval of the trailing silence left to play in microseconds. williamr@4: */ williamr@4: TTimeIntervalMicroSeconds iTrailingSilenceLeftToPlay; williamr@4: williamr@4: /** williamr@4: The time left for the play to be completed in a particular repeat williamr@4: */ williamr@4: TTimeIntervalMicroSeconds iTimeLeftToPlayComplete; williamr@4: williamr@4: /** williamr@4: Timer used for trailing silences when repeating williamr@4: */ williamr@4: CPeriodic* iRepeatTrailingSilenceTimer; williamr@4: //This variable stores the devsound time played when the play is repositioned williamr@4: TTimeIntervalMicroSeconds iDevSoundRepositionTime; williamr@4: //states when the silence period between repeats needs to be verified williamr@4: TBool iVerifyPlayComplete; williamr@4: williamr@4: //For Drm implementation during repeats williamr@4: MDataSource* iDrmSource; williamr@4: TBool* iDisableAutoIntent; williamr@4: TBool iRetainRepeatInfo; williamr@4: TBool iGetTimePlayedSupported; williamr@4: TBool iIsResumeSupported; williamr@4: TBool iIsUsingResumeSupport; williamr@4: }; williamr@4: williamr@4: #endif