mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/AdvancedAudioController/Inc/AdvancedAudioPlayController.h
changeset 0 71ca22bcf22a
child 18 2eb3b066cc7d
child 31 8dfd592727cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/AdvancedAudioController/Inc/AdvancedAudioPlayController.h	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,1055 @@
+/*
+* Copyright (c) 2006 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:  This file contains the base class from which specific audio
+*                play controllers are derived. This class encapsulates common
+*                behavior for all audio play controllers.
+*
+*/
+
+
+#ifndef CADVANCEDAUDIOPLAYCONTROLLER_H
+#define CADVANCEDAUDIOPLAYCONTROLLER_H
+
+// INCLUDES
+#include "AdvancedAudioController.h"
+#include "AdvancedAudioOutput.h"
+#include "AdvancedAudioUtility.h"   // for CAdvancedAudioUtility, MAdvancedAudioUtilityObserver
+#include <mmf/common/mmfdrmcustomcommands.h>
+#include <mmffile.h>
+#include <MultimediaDataSource.h>
+#include <StreamControlCustomCommandsParser.h>
+#include <StreamControlEvents.h>
+#include "DataSourceAdapter.h"
+//#include <s32file.h>
+
+// CONSTANTS
+const TUint KAAPSampleRate8000Hz        = 8000;
+const TUint KAAPSampleRate11025Hz       = 11025;
+const TUint KAAPSampleRate12000Hz       = 12000;
+const TUint KAAPSampleRate16000Hz       = 16000;
+const TUint KAAPSampleRate22050Hz       = 22050;
+const TUint KAAPSampleRate24000Hz       = 24000;
+const TUint KAAPSampleRate32000Hz       = 32000;
+const TUint KAAPSampleRate44100Hz       = 44100;
+const TUint KAAPSampleRate48000Hz       = 48000;
+const TUint KAAPSampleRate64000Hz       = 64000;
+const TUint KAAPSampleRate88200Hz       = 88200;
+const TUint KAAPSampleRate96000Hz       = 96000;
+
+
+enum TStopCondition
+	{
+	ECommanded,
+	EPlayComplete,
+	EErr
+	};
+			
+class MTrailingSilenceObserver
+    {
+public:
+    /**
+    * From MTrailingSilenceObserver
+    * * Call back function indicating that that trailing silence timer has expired during loop play
+    *
+    * @since 5.x
+    * @param none
+    * @return  void
+    */
+    virtual void TrailingSilenceTimerComplete() = 0;
+    };
+
+// FORWARD DECLARATIONS
+class CAdvancedAudioResource;
+class CMultimediaDataSource;
+class CDataSourceAdapter;
+class CTrailingSilenceTimer;
+
+// CLASS DECLARATION
+/**
+*  This is the base class CAdvancedAudioPlayController.
+*  All specific audio play controllers derive from this class.
+*
+*  @lib AdvancedAudioController.lib
+*  @since 3.0
+*/
+class CAdvancedAudioPlayController : public CAdvancedAudioController,
+									 public MAdvancedAudioOutputObserver,
+									 public MMMFAudioPlayControllerCustomCommandImplementor,
+									 public MAdvancedAudioUtilityObserver,
+ 									 public MMultimediaDataSourceObserver,
+ 									 public MStreamControlCustomCommandImplementor,
+ 									 public MMMFAudioPlayControllerSetRepeatsCustomCommandImplementor,
+#ifndef SYMBIAN_CAF_V2
+
+                                     public MMMFAudioPlayDeviceCustomCommandImplementor
+#else
+                                     public MMMFAudioPlayDeviceCustomCommandImplementor,
+							         public MMMFDRMCustomCommandImplementor,
+							         public MTrailingSilenceObserver
+#endif
+    {
+    protected:	// Constructors and destructor
+
+		/**
+		* Destructor
+		*/
+		IMPORT_C virtual ~CAdvancedAudioPlayController();
+
+        /**
+        * C++ default constructor.
+        */
+        IMPORT_C CAdvancedAudioPlayController();
+
+        IMPORT_C virtual void ConstructL();
+
+	protected: // New functions
+
+        /**
+        * Format specific initialization for Data Source
+        * @since 3.0
+        * @return void
+        */
+        virtual void DoAddDataSourceL() = 0;
+
+        /**
+        * Format specific initialization for Data Sink
+        * @since 3.0
+        * @return void
+        */
+        virtual void DoAddDataSinkL() = 0;
+        
+        /**
+        * Instantiates codec
+        * @since 5.0
+        * @return CAdvancedAudioDecoder*
+        */
+        virtual CAdvancedAudioDecoder* BuildDecoderL() = 0;
+
+        /**
+        * Format specific initialization for Data Sink
+        * @since 5.0
+        * @return void
+        */
+        IMPORT_C virtual void DoInitializeSinkL();
+
+		/**
+        * Stops playback.
+        * @since 3.0
+        * @return void
+        */
+        IMPORT_C virtual void DoStopL(TInt aError);
+        
+        /**
+        * Format specific header scanning
+        * @since 3.0
+        * @return void
+        */
+        IMPORT_C virtual void DoReadHeaderL(CMMFDataBuffer* aBuffer);
+        
+        /**
+        * support functionality for SetPositionL
+        * @since 3.2
+        * @param aTimePos Position given by its time interval in micro secs
+        * @return void
+        */
+        IMPORT_C virtual void DoSetPositionL(const TTimeIntervalMicroSeconds& aTimePos);
+        
+        /**
+        * Fills source buffer from clip
+        * @since 3.0
+        * @return void
+        */
+        IMPORT_C virtual void InitSharedBuffersL();
+        
+        /**
+        * Stops the source and sink
+        * @since 3.0
+        * @return void
+        */
+        IMPORT_C virtual void SourceSinkStopL();
+        
+        /**
+        * Fills shared buffer from source
+        * @since 3.0
+        * @return void
+        */
+        IMPORT_C virtual void FillSharedBufferL(CMMFBuffer* aBuffer);
+        
+        /**
+        * Find the index of buffer which contain a given position
+        * @since 3.2
+        * @param aPos the position to find
+        * @return TInt the buffer index which recorded the position
+        */
+        IMPORT_C virtual TInt FindBufferFromPos(TUint aPos);
+        
+        /**
+        * Prepare shared buffers and its current index
+        * @since 3.2
+        * @param aStreaming whether SharedBuffers contain streaming source
+        * @return void
+        */
+        IMPORT_C virtual TInt SetPositionInSharedBuffers(TUint aTimeMs, TInt& aFoundPosition, TInt& aFoundTimeMs);
+        
+        /**
+        * Update duration, should be called everytime source size changes
+        * @since 3.2
+        * @param aLimitInMilliSecond, the limit of difference of the new duration in millisec for a callback
+        *        to occur, -1 would mean no callback
+        * @return void
+        */
+        IMPORT_C virtual TInt UpdateDuration(TInt aLimitInMilliSecond = -1);
+        IMPORT_C virtual TInt UpdateBitRate();
+        
+        /**
+        * Handle AutoPaused event during SendEvent callback
+        * @since 3.2
+        * @return void
+        */
+        IMPORT_C virtual void HandleAutoPauseEvent();
+        
+        /**
+        * Handle Preemption event during SendEvent callback
+        * @since 3.2
+        * @return void
+        */
+        IMPORT_C virtual void HandlePreemptionEvent(TInt aError);
+        
+        /**
+        * Handle General event during SendEvent callback
+        * @since 3.2
+        * @return void
+        */
+        IMPORT_C virtual void HandleGeneralEvent(const TMMFEvent& aEvent);
+        
+        /**
+		* Set the playback window boundaries
+		* @since 3.2
+		* @param aStart start of the window, in microseconds
+		* @param aEnd end of the window, in microseconds
+		* @return void
+		*/
+		IMPORT_C virtual void SetPlaybackWindowBoundariesL(const TTimeIntervalMicroSeconds& aStart,
+			const TTimeIntervalMicroSeconds& aEnd);
+
+        IMPORT_C virtual TInt GetCodecConfigData(RArray<TInt>& aCodecConfigData);
+        
+		IMPORT_C void RefillPreceedingBuffersL();
+		
+
+
+    protected:	// Functions from base classes (CMMFController)
+
+        /**
+        * From CMMFController
+        * Handles creation of the data source
+        *
+        * @since 3.0
+        * @param aSource data source
+        * @return void
+        */
+        IMPORT_C virtual void AddDataSourceL(MDataSource& aSource);
+
+        /**
+        * From CMMFController
+        * Handles creation of the data output
+        *
+        * @since 3.0
+        * @param aSing data output
+        * @return void
+        */
+        IMPORT_C virtual void AddDataSinkL(MDataSink& aSink);
+
+        /**
+        * From CMMFController
+        * Deletes the data source
+        *
+        * @since 3.0
+        * @param aDataSource the address of this source must be same as
+        *                    the existing datasource
+        * @return void
+        */
+        IMPORT_C virtual void RemoveDataSourceL(MDataSource& aDataSource);
+
+        /**
+        * From CMMFController
+        * Deletes the data output
+        *
+        * @since 3.0
+        * @param aDataSource the address of this output must be same as
+        *                    the existing output
+        * @return void
+        */
+        IMPORT_C virtual void RemoveDataSinkL(MDataSink& aDataSink);
+
+        /**
+        * From CMMFController
+        * Resets the controller object, removes datasource/sink, resets the datapath.
+        *
+        * @since 3.0
+        * @param none
+        * @return void
+        */
+        IMPORT_C virtual void ResetL();
+
+        /**
+        * From CMMFController
+        * Prepares the resources for play. Source and sink must have been added before
+        * calling PrimeL().
+        *
+        * @since 3.0
+        * @param none
+        * @return void
+        */
+        IMPORT_C virtual void PrimeL();
+
+        /**
+        * From CMMFController
+        * Will leave with if PrimeL() has not been called.
+        *
+        * @since 3.0
+        * @param none
+        * @return void
+        */
+        IMPORT_C virtual void PlayL();
+
+        /**
+        * From CMMFController
+        * Will leave with if Play() has not been called.
+        *
+        * @since 3.0
+        * @param none
+        * @return void
+        */
+        IMPORT_C virtual void PauseL();
+
+        /**
+        * From CMMFController
+        * Will leave if controller state is already stopped.
+        *
+        * @since 3.0
+        * @param none
+        * @return void
+        */
+        IMPORT_C virtual void StopL();
+
+        /**
+        * From CMMFController
+        * Calculates the current position in microseconds.
+        *
+        * @since 3.0
+        * @param none
+        * @return TTimeIntervalMicroSeconds The current position in microseconds.
+        */
+        IMPORT_C virtual TTimeIntervalMicroSeconds PositionL() const;
+        
+        /**
+        * From CMMFController
+        * Sets the play position.
+        *
+        * @since 3.0
+        * @param aTimePos Position given by its time interval in micro secs
+        * @return void
+        */
+        IMPORT_C virtual void SetPositionL(const TTimeIntervalMicroSeconds& aTimePos);
+        
+        /**
+        * From CMMFController
+        * Method to set the source priority settings if
+        * a priority mechanism is required to arbitrate between multiple clients
+        * trying to access the same resource. Sets the priority for the source
+        * and the sink (provided they are defined).
+        *
+        * @since 3.0
+        * @param aPrioritySettings
+        * @return void
+        */
+        IMPORT_C virtual void SetPrioritySettings(const TMMFPrioritySettings& aPrioritySettings);
+
+		/**
+		* From CMMFController
+		* Gets the number of meta data entries in the clip.
+        *
+        * @since 3.0
+        * @param aNumberOfEntries the number of meta data entries
+		* @return void
+		*/
+		IMPORT_C virtual void GetNumberOfMetaDataEntriesL(TInt& aNumberOfEntries);
+
+		/**
+		* From CMMFController
+		* Gets the specified meta data entry.
+        *
+        * @since 3.0
+        * @param aIndex zero based meta data entry index to retrieve.
+		* @return pointer to the meta data entry.
+		*/
+		IMPORT_C virtual CMMFMetaDataEntry* GetMetaDataEntryL(TInt aIndex);
+
+		/**
+        * From CMMFController
+		* Returns the duration of source (or the sink if the source is not defined)
+		* If neither source nor sink are defined, it returns 0.
+		* @param none
+		* @return duration in microseconds
+		*/
+		IMPORT_C virtual TTimeIntervalMicroSeconds DurationL() const;
+
+    protected:  // functions from base classes (CAdvancedAudioController)
+
+        /**
+        * Send StateChanged vent to client
+        * @since 3.2
+        * @return error code. KErrNone if successful
+        */
+        IMPORT_C virtual TInt SendEventToClient(const TMMFEvent& aEvent);
+
+    protected:	// Functions from base classes (MMMFAudioControllerCustomCommandImplementor)
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Sets the sample rate of the data sink in samples/second.
+		* @param aSampleRate The sample rate, in samples/second.
+		* @return void
+		*/
+		IMPORT_C virtual void MacSetSinkSampleRateL(TUint aSampleRate);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Sets the bit rate of the data sink in bits/second.
+		* @param aRate bit rate, in bits/second.
+		* @return void
+		*/
+		IMPORT_C virtual void MacSetSinkBitRateL(TUint aRate);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Sets the number of channels in the data sink.
+		* For example, one channel for mono, two channels for stereo, etc.
+		* @param aNumChannels number of channels
+		* @return void
+		*/
+		IMPORT_C virtual void MacSetSinkNumChannelsL(TUint aNumChannels);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Sets the format of the data sink.
+		* The UID corresponds to the UID of the CMMFFormat-derived ECOM plugin to be used.
+		* @param aFormatUid format plugin to be used
+		* @return void
+		*/
+        IMPORT_C virtual void MacSetSinkFormatL(TUid aFormatUid);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Sets the fourCC multimedia data type code of the sink.
+		* @param aDataType fourCC code
+		* @return void
+		*/
+		IMPORT_C virtual void MacSetSinkDataTypeL(TFourCC aDataType);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the sample rate of the data source in samples/second.
+		* @param aRate source sample rate, in samples/second
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSourceSampleRateL(TUint& aRate);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the bit rate of the data source in bits/second.
+		* @param aRate source bit rate, in samples/second
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSourceBitRateL(TUint& aRate);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the number of channels in the data source.
+		* @param aNumChannels number of channels
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSourceNumChannelsL(TUint& aNumChannels);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the format of the data source.
+		* The UID corresponds to the UID of the CMMFFormat-derived ECOM plugin being used.
+		* @param aFormat format plugin being used
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSourceFormatL(TUid& aFormat);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the fourCC code of the source.
+		* @param aDataType fourCC code
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSourceDataTypeL(TFourCC& aDataType);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the sample rate of the data sink in samples/second.
+		* @param aRate sample rate, in samples/second
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSinkSampleRateL(TUint& aRate);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the bit rate of the data sink in bits/second.
+		* @param aRate bit rate, in bits/second.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSinkBitRateL(TUint& aRate);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the number of channels in the data sink.
+		* @param aNumChannels number of channels.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSinkNumChannelsL(TUint& aNumChannels);
+
+        /**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the format of the data sink.
+		* The UID corresponds to the uid of the CMMFFormat-derived ECOM plugin being used.
+		*
+		* @param aFormat format plugin being used.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSinkFormatL(TUid& aFormat);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the fourCC code of the sink.
+		* @param aDataType fourCC code.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSinkDataTypeL(TFourCC& aDataType);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the list of sample rates supported by the data source.
+		* @param aSupportedRates supported rates.
+		*        Warning: Existing objects in this array will be removed by this method.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSupportedSourceSampleRatesL(RArray<TUint>& aSupportedRates);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the list of bit rates supported by the data source.
+		* @param aSupportedRates supported rates.
+		*        Warning: Existing objects in this array will be removed by this method.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSupportedSourceBitRatesL(RArray<TUint>& aSupportedRates);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the list of channels supported by the data source L(ie mono, stereo etc).
+		* @param aSupportedChannels supported channels.
+		*        Warning: Existing objects in this array will be removed by this method.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSupportedSourceNumChannelsL(RArray<TUint>& aSupportedChannels);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the list of fourCC codes supported by the data source.
+		* @param aSupportedDataTypes supported data types.
+		*        Warning: Existing objects in this array will be removed by this method.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSupportedSourceDataTypesL(RArray<TFourCC>& aSupportedDataTypes);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the list of sample rates supported by the data sink.
+		* @param aSupportedRates supported rates.
+		*        Warning: Existing objects in this array will be removed by this method.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSupportedSinkSampleRatesL(RArray<TUint>& aSupportedRates);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the list of bit rates supported by the data sink.
+		* @param aSupportedRates supported rates.
+		*        Warning: Existing objects in this array will be removed by this method.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSupportedSinkBitRatesL(RArray<TUint>& aSupportedRates);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the list of channels supported by the data sink L(ie mono, stereo etc).
+		* @param aSupportedChannels supported channels.
+		*        Warning: Existing objects in this array will be removed by this method.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSupportedSinkNumChannelsL(RArray<TUint>& aSupportedChannels);
+
+		/**
+		* From MMMFAudioControllerCustomCommandImplementor
+		* Gets the list of fourCC codes supported by the data sink.
+		* @param aSupportedDataTypes supported data types.
+		*        Warning: Existing objects in this array will be removed by this method.
+		* @return void
+		*/
+		IMPORT_C virtual void MacGetSupportedSinkDataTypesL(RArray<TFourCC>& aSupportedDataTypes);
+
+    protected:	// Functions from base classes (MMMFAudioPlayControllerCustomCommandImplementor)
+
+		/**
+		* From MMMFAudioPlayControllerCustomCommandImplementor
+		* Sets a playback window. The controller will start playing from the start of the window,
+		* and finish playing at the end of the window.
+		* @param aStart start of the window, in microseconds
+		* @param aEnd end of the window, in microseconds
+		* @return void
+		*/
+		IMPORT_C virtual void MapcSetPlaybackWindowL(const TTimeIntervalMicroSeconds& aStart,
+			const TTimeIntervalMicroSeconds& aEnd);
+
+		/**
+		* From MMMFAudioPlayControllerCustomCommandImplementor
+		* Removes a previously defined playback window.
+		* @param none
+		* @return void
+		*/
+		IMPORT_C virtual void MapcDeletePlaybackWindowL();
+
+		/**
+		* From MMMFAudioPlayControllerCustomCommandImplementor
+		* Gets the completion status of loading/rebuffering the current audio clip
+		* @param aPercentageComplete status of loading as a percentage completed
+		* @return void
+		*/
+		IMPORT_C virtual void MapcGetLoadingProgressL(TInt& aPercentageComplete);
+
+    protected:	// Functions from base classes (MMMFAudioPlayDeviceCustomCommandImplementor)
+
+		/**
+		* From MMMFAudioPlayDeviceCustomCommandImplementor
+		* Sets the volume of the sound device.
+		* @param aVolume new volume
+		* @return void
+		*/
+		IMPORT_C virtual void MapdSetVolumeL(TInt aVolume);
+
+		/**
+		* From MMMFAudioPlayDeviceCustomCommandImplementor
+		* Gets the max volume of the sound device
+		* @param aMaxVolume contains the max volume on return
+		* @return void
+		*/
+		IMPORT_C virtual void MapdGetMaxVolumeL(TInt& aMaxVolume);
+
+		/**
+		* From MMMFAudioPlayDeviceCustomCommandImplementor
+		* Gets the current playback volume
+		* @param aVolume contains the current volume on return
+		* @return void
+		*/
+		IMPORT_C virtual void MapdGetVolumeL(TInt& aVolume);
+
+		/**
+		* From MMMFAudioPlayDeviceCustomCommandImplementor
+		* Sets a volume ramp.
+		* This will cause the sound device to start playing with zero volume,
+		* increasing the volume over aRampDuration microseconds.
+		* The volume ramp can be removed by setting the ramp duration to zero.
+		* @param aRampDuration duration over which the volume is to be increased,
+		*					in microseconds
+		* @return void
+		*/
+		IMPORT_C virtual void MapdSetVolumeRampL(const TTimeIntervalMicroSeconds& aRampDuration);
+
+		/**
+		* From MMMFAudioPlayDeviceCustomCommandImplementor
+		* Sets the balance between the left and right stereo audio channels.
+		* @param aBalance Use a value between KMMFBalanceMaxLeft and KMMFBalanceMaxRight.
+		*                 Center balance can be restored by using KMMFBalanceCenter.
+		* @return void
+		*/
+		IMPORT_C virtual void MapdSetBalanceL(TInt aBalance);
+
+		/**
+		* From MMMFAudioPlayDeviceCustomCommandImplementor
+		* Retrieves the balance between the left and right stereo audio channels.
+		*
+		* @param aBalande The current balance, filled in by the controller.
+		* @return void
+		*/
+		IMPORT_C virtual void MapdGetBalanceL(TInt& aBalance);
+
+    protected:  // Functions from base classes (MMMFAudioPlayControllerSetRepeatsCustomCommandImplementor)
+        
+        /**
+        * From MMMFAudioPlayControllerSetRepeatsCustomCommandImplementor
+        * Sets the number of times the playback of the audio file is to be repeated and the trailing silence value in ms.
+        *
+        * @param aRepeatNumberOfTimes Number of times playback is to be repeated .
+        * @param aTrailingSilence Period of silence to follow each playback of the audio file
+        * @return KErrNone if success, KErrNotSupported and System-wide errors otherwise.
+        */
+        IMPORT_C virtual TInt MapcSetRepeats(TInt aRepeatNumberOfTimes, const TTimeIntervalMicroSeconds& aTrailingSilence);
+
+    protected: // Functions from base classes (MDataSink)
+
+        /**
+        * From MDataSink
+        * Callback for ReadBufferL()
+        *
+        * @since 3.0
+        * @param    aBuffer The filled buffer
+        * @return    void
+        */
+        IMPORT_C virtual void BufferFilledL(CMMFBuffer* aBuffer);
+
+    protected: // Functions from base classes (MAdvancedAudioOutputObserver)
+
+        /**
+        * From MAdvancedAudioOutputObserver
+        * Request to refill the buffer
+        *
+        * @since 3.0
+        * @param    The buffer to be filled
+        * @return   TInt
+        */
+        IMPORT_C virtual TInt RefillBuffer(CMMFBuffer* refillBuffer);
+
+        /**
+        * From MAdvancedAudioOutputObserver
+        * Handles playback complete
+        *
+        * @since 3.0
+        * @param
+        * @return   void
+        */
+        IMPORT_C virtual void PlaybackComplete();
+
+        /**
+        * From MAdvancedAudioOutputObserver
+        * Sends event to client;
+        *
+        * @since 3.0
+        * @param aEvent event to propagate to client
+        * @return   void
+        */
+        IMPORT_C virtual void SendEvent(const TMMFEvent& aEvent);
+
+        /**
+        * From MAdvancedAudioOutputObserver
+        * Callback when lastbuffer is sent to DevSound during loop play by setting the Last Buffer flag to EFalse
+        *
+        * @since 5.x
+        * @param  none
+        * @return   void
+        */
+        IMPORT_C virtual void LastBufferSent();
+
+    protected:  // from MAdvancedAudioUtilityObserver
+        
+        /**
+        * Noticifaction of BitRate Changes, occurs when bitrate changes and EnableBitRateChangedEventL is enabled
+        * @since 3.2
+        * @return void
+        */
+        IMPORT_C virtual void BitRateChanged();
+        IMPORT_C virtual void SeekPositionReached(TUint aTimeMs);
+		IMPORT_C virtual void PlayWindowEndPositionReached();
+		
+    protected:  // functions from MMultimediaDataSourceObserver
+
+        IMPORT_C virtual void BufferFilled(CMMFBuffer* aBuffer);
+        IMPORT_C virtual void Event(TUid aEvent);
+        IMPORT_C virtual TInt GetBitRate(TUint& aBitRate);
+        
+    protected:  // functions from MStreamControlCustomCommandImplementor
+
+        IMPORT_C virtual TInt MscEnableEvents(TBool aEnable);
+        IMPORT_C virtual TInt MscGetSeekingSupported(TBool& aSupported);
+        IMPORT_C virtual TInt MscGetRandomSeekingSupported(TBool& aSupported);
+        
+    private:
+
+        /**
+        * Calculates the percentage of balance in left and right channels.
+        * @since 3.0
+        * @param aLeft on return, left balance value
+        * @param aRight on return, right balance value
+        * @param aBalance current balance value
+        * @return void
+        */
+		void CalculateLeftRightBalanceL(TInt& aLeft, TInt& aRight, TInt aBalance);
+
+        /**
+        * Calculates the balance based on the left and right balance values.
+        * @since 3.0
+        * @param aBalance on return, the balance value
+        * @param aLeft left balance value
+        * @param aRight right balance value
+        * @return void
+        */
+        void CalculateBalanceL(TInt& aBalance, TInt aLeft, TInt aRight);
+
+        void GoToInitPositionL();
+		
+		void ResetPositionVariables();
+		void DoPlayL();
+		void DoInitializeL();
+		void DoPauseL(TBool aPreemption = EFalse);
+		void DoBufferFilledL(CMMFBuffer* aBuffer);
+		void DoResume(TInt aResumePosition = -1);
+		TBool AllBuffersFilled();
+		TBool AllBuffersEmpty();
+        void RefillSharedBuffersL();
+        void ClearSharedBuffersL();
+        void SeekToTimeMsL(TUint aTimeMs);
+        void PlayForDurationL();
+        void PlayForInitPositionL();
+        void PlayForPauseSeekL();
+		void PauseForSetPosL();
+		TInt CleanupForStop();
+		void ClearRepeatFlag();
+		// sets the repeat count and trailing silence timer value supplied by the client
+        TInt DoSetRepeats(TInt aRepeatNumberOfTimes, const TTimeIntervalMicroSeconds& aTrailingSilence);
+        // handles the loop play of seekable and non-seekable sources
+        void DoRepeat();
+        TBool IsLoopPlayEnabled() const;
+        
+    public: // Functions from base classes (MTrailingSilenceObserver)
+        /**
+        * From MTrailingSilenceObserver
+        * Call back function indicating that that trailing silence timer has expired during loop play
+        *
+        * @since 5.x
+        * @param none
+        * @return  void
+        */
+        IMPORT_C virtual void TrailingSilenceTimerComplete();
+
+    protected:	// Functions from base classes (MMMFDRMCustomCommandImplementor)
+
+#ifdef SYMBIAN_CAF_V2
+		/**
+		* From MMMFDRMCustomCommandImplementor
+		* Returns the result of MdcEvaluateIntent() when DataSourceType is KUidMmfFileSource.
+		*
+		* @param aIntent The generic DRM intent specified by client.
+		* @return TInt
+		*/
+		IMPORT_C virtual TInt MdcEvaluateIntent(ContentAccess::TIntent aIntent);
+
+		/**
+		* From MMMFDRMCustomCommandImplementor
+		* Returns the result of ExecuteIntent() when DataSourceType is KUidMmfFileSource.
+		*
+		* @param aIntent The generic DRM intent specified by client.
+		* @return TInt
+		*/
+		IMPORT_C virtual TInt MdcExecuteIntent(ContentAccess::TIntent aIntent);
+
+		/**
+		* From MMMFDRMCustomCommandImplementor
+		* Setting the iDisableAutoIntent based on the client request to disable
+		* or enable the automatic intent.
+		*
+		* @param aIntent The generic DRM intent specified by client.
+		* @return TInt
+		*/
+		IMPORT_C virtual TInt MdcDisableAutomaticIntent(TBool aDisableAutoIntent);
+
+		/**
+		* From MMMFDRMCustomCommandImplementor
+		* Returns the result of SetAgentProperty() when DataSourceType is KUidMmfFileSource.
+		*
+		* @param aIntent The generic DRM intent specified by client.
+		* @return TInt
+		*/
+		IMPORT_C virtual TInt MdcSetAgentProperty(ContentAccess::TAgentProperty aProperty, TInt aValue);
+		
+#endif
+
+	protected: // Data
+
+        enum TPlayControllerState
+        {
+            EStopped,
+            EInitializing,
+            EInitialized,
+            EPlaying,
+            EPaused,
+            EAutoPaused
+        };
+
+        // Holds the controller state
+        TPlayControllerState iState;
+        // Holds the requested state
+        TPlayControllerState iRequestState;
+        TPlayControllerState iReturnState;
+        // Indicates if the clip is DRM protected
+        TBool iIsDRMProtected;
+
+		// Pointer to audio output
+		CAdvancedAudioOutput* iAudioOutput;
+		// Pointer to audio resource
+		CAdvancedAudioResource* iAudioResource;
+		// Pointer to audio utility
+		CAdvancedAudioUtility* iAudioUtility;
+
+        // Data source type - used by metadata functions
+        TUid iSourceType;
+		
+        // Holds the current byte position in the clip
+        TUint iSourceReadPosition;
+        // 1st or 2nd header offset
+        TInt iHeaderOffset;
+        // 1st header offset
+        TInt iSyncOffset;
+        // Write position for file sink
+        TInt iSinkWritePosition;
+        // Holds the source format
+        TUid iSourceFormat;
+        // Sink number of channels
+        TInt iSinkNumChannels;
+        // Sink sample rate
+        TInt iSinkSampleRate;
+
+		// Play window - start position in microseconds
+		TTimeIntervalMicroSeconds iPlayWindowStartPosition;
+		// Play window - end position in microseconds
+		TTimeIntervalMicroSeconds iPlayWindowEndPosition;
+		// Indication whether metadata is supported or not
+		TBool iMetaDataSupport;
+		// Metadata entries, if supported
+		RPointerArray<CMMFMetaDataEntry> iMetaDataEntries;
+    	// Flag indicating whether metadata has been ready already
+    	TBool iMetaDataRead;
+	    // Drive number
+        TDriveNumber iDriveNumber;
+        
+#ifdef SYMBIAN_CAF_V2
+ 		TBool iDisableAutoIntent;
+#endif
+
+ 		TBool iSourceUnreadable;
+ 		TBool iSinkInitDataReady;
+		TBool iReadHeader;                  // indicate whether the header is waited to be read
+		TUint iCurrentPosition;             // to keep track with current position related to source on streaming situation
+
+		TInt64 iPDTimePositionInMicroSecs;
+		
+    	TBool iEventsEnabled;               // indicate whether StreamControlEvent is enabled
+        TBool iDecoderExists;
+    	
+    	TBool iSourceIsPosSeekable;
+    	TBool iSourceIsTimeSeekable;
+    	TBool iBitRateFrozen;
+    	TBool iDurationFrozen;
+    	TBool iPlayingForDuration;
+    	TBool iPlayingForInitPos;
+        TBool iPausingForSetPos;
+    	TBool iPlayingForPauseSeek;
+    	TBool iPlaySeeking;
+    	TTimeIntervalMicroSeconds iInitPosition;
+    	TTimeIntervalMicroSeconds iPreSeekTime;
+    	
+        CDataSourceAdapter* iDataSourceAdapter;
+        
+        mutable CActiveSchedulerWait* iWait;
+        mutable CActiveSchedulerWait* iBlockSetPos;
+
+        TUint32 iPlayStartTime;
+        TUint32 iZeroTime;
+        TUint32 iAfterTime;
+        
+		mutable TBool iBlockDuration;
+		TBool iEnablePrimedStateChangedEvent;
+		
+		// Decoder type
+		TInt iDecoderType;
+		
+		TInt iSharedBufferCnt;
+
+		TInt iResumePosition;
+
+		TInt iRepeatCount;    // Repeat count set by the client
+		TInt iCurrentRepeatCount;  // index to track the current repeat count during loop play
+		TBool iLoopPlayEnabled;   // flag indicating if loop play is enabled or not
+		TBool iRepeatForever;     // flag indicating that loop play forever is enabled
+		TTimeIntervalMicroSeconds32 iTrailingSilenceMs;   // Trailing silence value set by the client
+		CTrailingSilenceTimer* iTrailingSilenceTimer;     // Trailing silence timer class
+		TBool iIntentStopped;     // flag indicating that rights are consumed during the end of each repeat in loop play
+		TUint iSavedTimePositionInMicroSecs;      // saved position to adjust the position during loop play
+		TTimeIntervalMicroSeconds iSavedSetPosition;
+    };
+
+class CTrailingSilenceTimer: public CTimer
+    {
+    public:
+
+         /**
+          * First phase constructor in the Two Phase Construction.
+          */  
+         // static CTrailingSilenceTimer* NewL(CAdvancedAudioPlayController &aAdvancedAudioPlayController);
+        static CTrailingSilenceTimer* NewL(MTrailingSilenceObserver &aobserver);
+
+         /**
+          * Default Destructor.
+          */
+         virtual ~CTrailingSilenceTimer();
+        
+    private:
+        
+         /**
+          * Default Constructor.
+          */
+        // CTrailingSilenceTimer(CAdvancedAudioPlayController &aAdvancedAudioPlayController);
+        CTrailingSilenceTimer(MTrailingSilenceObserver &aobserver);
+
+         /**
+          * Second phase constructor in the Two Phase Construction.
+          */
+         void ConstructL();
+
+         /**
+          * Default RunL() from CActive 
+          */
+         void RunL();
+
+         /**
+          * Implements cancellation of an outstanding request. 
+          */
+          void DoCancel();
+
+          /**
+           * Handles a leave occurring in the request completion event handler RunL()
+           */
+          void RunError();
+          
+    private:
+          // CAdvancedAudioPlayController* iAdvancedAudioPlayController;
+        MTrailingSilenceObserver* iObserver;
+    };
+	
+#endif 		// CADVANCEDAUDIOPLAYCONTROLLER_H
+
+// End of File