mmlibs/mmfw/inc/mmf/ControllerFramework/mmfstandardcustomcommands.h
changeset 0 40261b775718
child 31 ae0addfe117e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/inc/mmf/ControllerFramework/mmfstandardcustomcommands.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,3772 @@
+// Copyright (c) 2002-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:
+//
+
+#ifndef __MMFSTANDARDCUSTOMCOMMANDS_H
+#define __MMFSTANDARDCUSTOMCOMMANDS_H
+
+#include <mmf/common/mmfcontroller.h>
+#include <mmf/common/mmfvideo.h>
+#include "mmf/common/mmcaf.h"
+
+class CMMFVideoFrameMessage;
+class CFbsBitmap;
+class CDesC8Array;
+
+/**
+@publishedAll
+@released
+*/
+const TInt KPlaybackRateNormal = 1;
+
+/**
+@publishedAll
+@released
+
+Balance value for centre
+*/
+const TInt KMMFBalanceCenter = 0;
+
+/**
+@publishedAll
+@released
+
+Balance value for max left
+*/
+const TInt KMMFBalanceMaxLeft = -100;
+
+/**
+@publishedAll
+@released
+
+Balance value for max right
+*/
+const TInt KMMFBalanceMaxRight = 100;
+
+/**
+@publishedAll
+@released
+*/
+const TInt KMMFVideoCurrentFrame = -1;
+
+/**
+@publishedAll
+@released
+*/
+enum TMMFDSAEvent
+	{
+	EAbortDSA,
+	EResumeDSA
+	};
+
+/**
+@publishedAll
+@released
+
+Interface UID and messages for the Audio Resource Notification API.
+*/
+const TUid KMMFEventCategoryAudioResourceAvailable = {0x101FD9F2};
+
+
+/**
+@publishedAll
+@released
+
+Interface UID and messages for the Audio Play Device API.
+*/
+const TUid KUidInterfaceMMFAudioPlayDevice = {0x101F76D6};
+
+/**
+@publishedAll
+@released
+
+Interface UID and messages for the Audio Record Device API.
+*/
+const TUid KUidInterfaceMMFAudioRecordDevice = {0x101F76D7};
+
+/**
+@publishedAll
+@released
+
+Interface UID and messages for the Audio Play Controller API.
+*/
+const TUid KUidInterfaceMMFAudioPlayController = {0x101F76D8};
+
+/**
+@publishedAll
+@released
+
+Interface UID and messages for the Audio Record Controller API.
+*/
+const TUid KUidInterfaceMMFAudioRecordController = {0x101F76D9};
+
+/**
+@publishedAll
+@released
+
+Interface UID and messages for the Audio Controller API.
+*/
+const TUid KUidInterfaceMMFAudioController = {0x101F76DA};
+
+/**
+@publishedAll
+@released
+*/
+const TUid KUidInterfaceMMFVideoController = {0x101F76DB};
+
+/**
+@publishedAll
+@released
+*/
+const TUid KUidInterfaceMMFVideoPlayController = {0x101F7B73};
+
+/**
+@publishedAll
+@released
+*/
+const TUid KUidInterfaceMMFVideoRecordController = {0x101F7B74};
+
+/**
+@publishedAll
+@released
+*/
+const TUid KUidInterfaceMMFVideoDRMExt = {0x101F7C23};
+
+/**
+@publishedAll
+@released
+
+Interface UID for the custom command that supports setting the initial screen for video on the controller.
+*/
+const TUid KUidInterfaceMMFVideoSetInitScreen = {0x102825F7};
+
+/**
+@publishedAll
+@released
+*/
+const TUid KUidInterfaceMMFVideoPixelAspectRatio = {0x102831EF};
+
+
+/**
+@publishedAll
+@released
+*/
+const TUid KUidInterfaceMMFVideoAudioSamplingRateAndChannelConfig = {0x102831F0};
+
+/**
+@publishedAll
+@released
+
+Client class to access Audio Play Device functionality.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+@since 7.0s
+*/
+class RMMFAudioPlayDeviceCustomCommands : public RMMFCustomCommandsBase
+	{
+public:
+
+	/**
+	Constructor.
+
+	@param  aController
+	        The client side controller object to be used by this custom command interface.
+
+	@since 7.0s
+	*/
+	IMPORT_C RMMFAudioPlayDeviceCustomCommands(RMMFController& aController);
+
+	/**
+	Sets the volume of the sound device.
+
+	@param  aVolume
+	        The new volume.
+
+	@return	One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetVolume(TInt aVolume) const;
+
+	/**
+	Gets the maximum volume supported by the sound device.
+
+	@param  aMaxVolume
+	        The maximum volume, filled in by the controller.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetMaxVolume(TInt& aMaxVolume) const;
+
+	/**
+	Gets the current playback volume.
+
+	@param  aVolume
+	        On return contains the current playback volume.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetVolume(TInt& aVolume) const;
+
+	/**
+	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
+	        The duration over which the volume is to be increased, in microseconds.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration) const;
+
+	/**
+	Sets the balance between the left and right stereo audio channels.
+
+	@param  aBalance
+	        Use a value between KMMFBalanceMaxLeft and KMMFBalanceMaxRight. Centre balance can be
+	        restored by using KMMFBalanceCenter.
+
+	@return	One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetBalance(TInt aBalance) const;
+
+	/**
+	Gets the balance between the left and right stereo audio channels.
+
+	@param  aBalance
+	        The current balance, filled in by the controller.
+
+	@return One of the system-wide error codes.
+	
+	@since 7.0s
+	*/
+	IMPORT_C TInt GetBalance(TInt& aBalance) const;
+	};
+
+/**
+@publishedAll
+@released
+
+Mixin class to be derived from controller plugins that could support the audio play device
+custom commands.
+*/
+class MMMFAudioPlayDeviceCustomCommandImplementor
+	{
+public:
+
+	/**
+	Sets the volume of the sound device.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aVolume
+	        The new volume.
+
+	@since 7.0s
+	*/
+	virtual void MapdSetVolumeL(TInt aVolume) = 0;
+
+	/**
+	Gets the maximum volume supported by the sound device.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aMaxVolume
+	        The maximum volume, to be filled in by the controller plugin.
+
+	@since 7.0s
+	*/
+	virtual void MapdGetMaxVolumeL(TInt& aMaxVolume) = 0;
+
+	/**
+	Gets the current playback volume.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aVolume
+	        The volume, to be filled in by the controller.
+
+	@since 7.0s
+	*/
+	virtual void MapdGetVolumeL(TInt& aVolume) = 0;
+
+	/**
+	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.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aRampDuration
+	        The duration over which the volume is to be increased, in microseconds.
+
+	@since 7.0s
+	*/
+	virtual void MapdSetVolumeRampL(const TTimeIntervalMicroSeconds& aRampDuration) = 0;
+
+	/**
+	Sets the balance between the left and right stereo audio channels.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aBalance
+	        Use a value between KMMFBalanceMaxLeft and KMMFBalanceMaxRight. Centre balance can be
+	        restored by using KMMFBalanceCenter.
+
+	@since 7.0s
+	*/
+	virtual void MapdSetBalanceL(TInt aBalance) = 0;
+
+	/**
+	Gets the balance between the left and right stereo audio channels.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aBalance
+	        The current balance, filled in by the controller.
+
+	@since 7.0s
+	*/
+	virtual void MapdGetBalanceL(TInt& aBalance) = 0;
+	};
+
+/**
+@publishedAll
+@released
+
+Custom command parser class to be used by controller plugins wishing to support
+audio play device commands.
+
+The controller plugin must be derived from MMMFAudioPlayDeviceCustomCommandImplementor
+to use this class.
+
+The controller plugin should create an object of this type and add it to the list of custom
+command parsers in the controller framework. See the following example code for details.
+
+@code
+void CMMFAudioController::ConstructL()
+	{
+	// Construct custom command parsers
+	CMMFAudioPlayDeviceCustomCommandParser* audPlayDevParser = CMMFAudioPlayDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audPlayDevParser);
+	AddCustomCommandParserL(*audPlayDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audPlayDevParser
+
+	CMMFAudioRecordDeviceCustomCommandParser* audRecDevParser = CMMFAudioRecordDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audRecDevParser);
+	AddCustomCommandParserL(*audRecDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audRecDevParser
+
+etc.
+	}
+@endcode
+
+@since 7.0s
+*/
+class CMMFAudioPlayDeviceCustomCommandParser : public CMMFCustomCommandParserBase
+	{
+public:
+
+	/**
+	Creates a new custom command parser capable of handling audio play device commands.
+
+	This function may leave with one of the system-wide error codes.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@return	A pointer to the object created.
+
+	@since  7.0s
+	*/
+	IMPORT_C static CMMFAudioPlayDeviceCustomCommandParser* NewL(MMMFAudioPlayDeviceCustomCommandImplementor& aImplementor);
+
+	/**
+	Destructor.
+
+	@since  7.0s
+	*/
+	IMPORT_C ~CMMFAudioPlayDeviceCustomCommandParser();
+
+	/**
+	Handles a request from the client. Called by the controller framework.
+
+	@param  aMessage
+	        The message to be handled.
+
+	@since  7.0s
+	*/
+	void HandleRequest(TMMFMessage& aMessage);
+private:
+
+	/**
+	Constructor.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@since	7.0s
+	*/
+	CMMFAudioPlayDeviceCustomCommandParser(MMMFAudioPlayDeviceCustomCommandImplementor& aImplementor);
+	// Internal request handling methods.
+	void DoHandleRequestL(TMMFMessage& aMessage);
+	TBool DoSetVolumeL(TMMFMessage& aMessage);
+	TBool DoGetMaxVolumeL(TMMFMessage& aMessage);
+	TBool DoGetVolumeL(TMMFMessage& aMessage);
+	TBool DoSetVolumeRampL(TMMFMessage& aMessage);
+	TBool DoSetBalanceL(TMMFMessage& aMessage);
+	TBool DoGetBalanceL(TMMFMessage& aMessage);
+private:
+	/** The object that implements the audio play device interface */
+	MMMFAudioPlayDeviceCustomCommandImplementor& iImplementor;
+	};
+
+/**
+@publishedAll
+@released
+
+Client class to access Audio Record Device functionality.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+
+@since 7.0s
+*/
+class RMMFAudioRecordDeviceCustomCommands : public RMMFCustomCommandsBase
+	{
+public:
+	
+	/**
+	Constructor.
+
+	@param  aController
+	        The client side controller object to be used by this custom command interface.
+
+	@since 7.0s
+	*/
+	IMPORT_C RMMFAudioRecordDeviceCustomCommands(RMMFController& aController);
+
+	/**
+	Sets the gain of the sound device.
+
+	@param  aGain
+	        The new gain.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetGain(TInt aGain) const;
+
+	/**
+	Gets the maximum gain supported by the sound device.
+
+	@param  aMaxGain
+	        The maximum gain, filled in by the controller.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt GetMaxGain(TInt& aMaxGain) const;
+
+	/**
+	Gets the current recording gain.
+
+	@param  aGain
+	        The gain, filled in by the controller.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetGain(TInt& aGain) const;
+
+	/**
+	Sets the balance between the left and right stereo microphone channels.
+
+	@param  aBalance
+	        Use a value between KMMFBalanceMaxLeft and KMMFBalanceMaxRight. Centre balance can be 
+	        restored by using KMMFBalanceCenter.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetBalance(TInt aBalance) const;
+
+	/**
+	Gets the balance between the left and right stereo microphone channels.
+
+	@param  aBalance
+	        The current balance, filled in by the controller.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetBalance(TInt& aBalance) const;
+	};
+
+/**
+@publishedAll
+@released
+
+Mixin class to be derived from controller plugins that could support the audio record device
+custom commands.
+*/
+class MMMFAudioRecordDeviceCustomCommandImplementor
+	{
+public:
+
+	/**
+	Sets the gain of the sound device.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aGain
+	        The new gain.
+
+	@since 7.0s
+	*/
+	virtual void MardSetGainL(TInt aGain) = 0;
+
+	/**
+	Gets the maximum gain supported by the sound device.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aMaxGain
+	        The maximum gain, to be filled in by the controller plugin.
+
+	@since 7.0s
+	*/
+	virtual void MardGetMaxGainL(TInt& aMaxGain) = 0;
+
+	/**
+	Gets the current recording gain.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aGain
+	        The gain, to be filled in by the controller.
+
+	@since 7.0s
+	*/
+	virtual void MardGetGainL(TInt& aGain) = 0;
+
+	/**
+	Sets the balance between the left and right stereo microphone channels.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aBalance
+	        Use a value between KMMFBalanceMaxLeft and KMMFBalanceMaxRight. Centre balance can be
+	        restored by using KMMFBalanceCenter.
+
+	@since 7.0s
+	*/
+	virtual void MardSetBalanceL(TInt aBalance) = 0;
+
+	/**
+	Gets the balance between the left and right stereo microphone channels.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aBalance
+	        The current balance, filled in by the controller.
+
+	@since 7.0s
+	*/
+	virtual void MardGetBalanceL(TInt& aBalance) = 0;
+	};
+
+/**
+@publishedAll
+@released
+
+Custom command parser class to be used by controller plugins wishing to support
+audio record device commands.
+
+The controller plugin must be derived from MMMFAudioRecordDeviceCustomCommandImplementor
+to use this class.
+
+The controller plugin should create an object of this type and add it to the list of custom
+command parsers in the controller framework.  See the following example code for details.
+
+@code
+void CMMFAudioController::ConstructL()
+	{
+	// Construct custom command parsers
+	CMMFAudioPlayDeviceCustomCommandParser* audPlayDevParser = CMMFAudioPlayDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audPlayDevParser);
+	AddCustomCommandParserL(*audPlayDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audPlayDevParser
+
+	CMMFAudioRecordDeviceCustomCommandParser* audRecDevParser = CMMFAudioRecordDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audRecDevParser);
+	AddCustomCommandParserL(*audRecDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audRecDevParser
+
+etc.
+	}
+@endcode
+
+@since 7.0s
+*/
+class CMMFAudioRecordDeviceCustomCommandParser : public CMMFCustomCommandParserBase
+	{
+public:
+
+	/**
+	Creates a new custom command parser capable of handling audio record device commands.
+
+	This function may leave with one of the system-wide error codes.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@return A pointer to the object created.
+
+	@since	7.0s
+	*/
+	IMPORT_C static CMMFAudioRecordDeviceCustomCommandParser* NewL(MMMFAudioRecordDeviceCustomCommandImplementor& aImplementor);
+
+	/**
+	Destructor.
+
+	@since  7.0s
+	*/
+	IMPORT_C ~CMMFAudioRecordDeviceCustomCommandParser();
+
+	/**
+	Handles a request from the client. Called by the controller framework.
+
+	@param  aMessage
+	        The message to be handled.
+
+	@since	7.0s
+	*/
+	void HandleRequest(TMMFMessage& aMessage);
+private:
+
+	/**
+	Constructor.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@since	7.0s
+	*/
+	CMMFAudioRecordDeviceCustomCommandParser(MMMFAudioRecordDeviceCustomCommandImplementor& aImplementor);
+	// Internal request handling methods.
+	void DoHandleRequestL(TMMFMessage& aMessage);
+	TBool DoSetGainL(TMMFMessage& aMessage);
+	TBool DoGetMaxGainL(TMMFMessage& aMessage);
+	TBool DoGetGainL(TMMFMessage& aMessage);
+	TBool DoSetBalanceL(TMMFMessage& aMessage);
+	TBool DoGetBalanceL(TMMFMessage& aMessage);
+private:
+	/** The object that implements the audio record device interface */
+	MMMFAudioRecordDeviceCustomCommandImplementor& iImplementor;
+	};
+
+
+/**
+@publishedAll
+@released
+
+Client class to access functionality specific to an audio play controller.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+
+@since 7.0s
+*/
+class RMMFAudioPlayControllerCustomCommands : public RMMFCustomCommandsBase
+	{
+public:
+	
+	/**
+	Constructor.
+
+	@param  aController
+	        The client side controller object to be used by this custom command interface.
+
+	@since  7.0s
+	*/
+	IMPORT_C RMMFAudioPlayControllerCustomCommands(RMMFController& aController);
+
+	/**
+	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
+	        The start of the window, in microseconds.
+	@param  aEnd
+	        The end of the window, in microseconds.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetPlaybackWindow(const TTimeIntervalMicroSeconds& aStart, const TTimeIntervalMicroSeconds& aEnd) const;
+
+	/**
+	Removes a previously defined playback window.
+
+	@return One of the system-wide error codes.
+	@since 7.0s
+	*/
+	IMPORT_C TInt DeletePlaybackWindow();
+
+	/**
+	Gets the audio loading progress as a percentage.
+
+	@param  aPercentageProgress
+	        The progress loading the clip, as a percentage.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt GetLoadingProgress(TInt& aPercentageProgress) const;
+	};
+
+
+/**
+@publishedAll
+@released
+
+Mixin class to be derived from controller plugins that could support the audio play controller
+custom commands.
+*/
+class MMMFAudioPlayControllerCustomCommandImplementor
+	{
+public:
+
+	/**
+	Sets a playback window. The controller will start playing from the start of the window,
+	and finish playing at the end of the window.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aStart
+	        The start of the window, in microseconds.
+	@param  aEnd
+	        The end of the window, in microseconds.
+
+	@since 7.0s
+	*/
+	virtual void MapcSetPlaybackWindowL(const TTimeIntervalMicroSeconds& aStart, const TTimeIntervalMicroSeconds& aEnd) = 0;
+
+	/**
+	Removes a previously defined playback window.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@since 7.0s
+	*/
+	virtual void MapcDeletePlaybackWindowL() = 0;
+
+	/**
+	Gets the completion status of loading/rebuffering the current audio clip.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aPercentageComplete
+	        The status of loading as a percentage completed.
+
+	@since 7.0s
+	*/
+	virtual void MapcGetLoadingProgressL(TInt& aPercentageComplete) = 0;
+	};
+
+/**
+@publishedAll
+@released
+
+Custom command parser class to be used by controller plugins wishing to support
+audio play controller commands.
+
+The controller plugin must be derived from MMMFAudioPlayControllerCustomCommandImplementor to use 
+this class.
+
+The controller plugin should create an object of this type and add it to the list of custom
+command parsers in the controller framework. See the following example code for details.
+
+@code
+void CMMFAudioController::ConstructL()
+	{
+	// Construct custom command parsers
+	CMMFAudioPlayDeviceCustomCommandParser* audPlayDevParser = CMMFAudioPlayDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audPlayDevParser);
+	AddCustomCommandParserL(*audPlayDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audPlayDevParser
+
+	CMMFAudioRecordDeviceCustomCommandParser* audRecDevParser = CMMFAudioRecordDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audRecDevParser);
+	AddCustomCommandParserL(*audRecDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audRecDevParser
+
+etc.
+	}
+@endcode
+
+@since  7.0s
+*/
+class CMMFAudioPlayControllerCustomCommandParser : public CMMFCustomCommandParserBase
+	{
+public:
+
+	/**
+	Creates a new custom command parser capable of handling audio play controller commands.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@return A pointer to the object created.
+
+	@since	7.0s
+	*/
+	IMPORT_C static CMMFAudioPlayControllerCustomCommandParser* NewL(MMMFAudioPlayControllerCustomCommandImplementor& aImplementor);
+
+	/**
+	Destructor.
+
+	@since 7.0s
+	*/
+	IMPORT_C ~CMMFAudioPlayControllerCustomCommandParser();
+
+	/**
+	Handles a request from the client. Called by the controller framework.
+
+	@param  aMessage
+	        The message to be handled.
+
+	@since  7.0s
+	*/
+	void HandleRequest(TMMFMessage& aMessage);
+private:
+
+	/**
+	Constructor.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@since	7.0s
+	*/
+	CMMFAudioPlayControllerCustomCommandParser(MMMFAudioPlayControllerCustomCommandImplementor& aImplementor);
+	// Internal request handling methods.
+	void DoHandleRequestL(TMMFMessage& aMessage);
+	TBool DoSetPlaybackWindowL(TMMFMessage& aMessage);
+	TBool DoDeletePlaybackWindowL(TMMFMessage& aMessage);
+	TBool DoGetLoadingProgressL(TMMFMessage& aMessage);
+private:
+	/** 
+	The object that implements the audio play controller interface 
+	*/
+	MMMFAudioPlayControllerCustomCommandImplementor& iImplementor;
+	};
+
+
+
+
+/**
+@publishedAll
+@released
+
+Client class to access functionality specific to an audio record controller.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+
+@since  7.0s
+*/
+class RMMFAudioRecordControllerCustomCommands : public RMMFCustomCommandsBase
+	{
+public:
+
+	/**
+	Constructor.
+
+	@param  aController
+	        The client side controller object to be used by this custom command	interface.
+
+	@since  7.0s
+	*/
+	IMPORT_C RMMFAudioRecordControllerCustomCommands(RMMFController& aController);
+
+	/**
+	Gets the (possibly estimated) record time left in the clip.
+
+	@param  aTime
+	        The record time available, in microseconds.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt GetRecordTimeAvailable(TTimeIntervalMicroSeconds& aTime) const;
+
+	/**
+	Sets the maximum duration of the recorded clip, in microseconds.
+
+	@param  aMaxDuration
+	        The maximum duration of the recorded clip, in microseconds.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetMaxDuration(const TTimeIntervalMicroSeconds& aMaxDuration) const;
+
+	/**
+	Sets the maximum size of the recorded clip, in bytes.
+
+	@param  aMaxSize
+	        The maximum size of the recorded clip, in bytes.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetMaxFileSize(TInt aMaxSize) const;
+
+	/**
+	Removes a portion from the clip, either from the current position to the beginning or the 
+	current position to the end.
+
+	@param  aToEnd
+	        A boolean indicating whether to crop to the end. Crops to the end if set to ETrue, to 
+			the beginning set to EFalse.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt Crop(TBool aToEnd);
+
+	/**
+	Adds meta data to the clip.
+
+	@param  aNewEntry
+	        The details of the new entry to be added.
+
+	@since 7.0s
+	*/
+	IMPORT_C void AddMetaDataEntryL(const CMMFMetaDataEntry& aNewEntry);
+
+	/**
+	Removes a meta data entry from the clip.
+
+	@param  aIndex
+	        The ID of the meta data entry to delete.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt RemoveMetaDataEntry(TInt aIndex);
+
+	/**
+	Replaces a meta data in the clip.
+
+	@param  aIndex
+	        The ID of the meta data entry to replace.
+	@param  aNewEntry
+	        The details of the new entry to be added.
+
+	@since 7.0s
+	*/
+	IMPORT_C void ReplaceMetaDataEntryL(TInt aIndex, const CMMFMetaDataEntry& aNewEntry);
+	};
+
+/**
+@publishedAll
+@released
+
+Mixin class to be derived from controller plugins that could support the audio record controller
+custom commands.
+*/
+class MMMFAudioRecordControllerCustomCommandImplementor
+	{
+public:
+
+	/**
+	Gets the (possibly estimated) record time left in the clip.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aTime
+	        The record time available, in microseconds.
+
+	@since 7.0s
+	*/
+	virtual void MarcGetRecordTimeAvailableL(TTimeIntervalMicroSeconds& aTime) = 0;
+
+	/**
+	Sets the maximum duration of the recorded clip, in microseconds.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aMaxDuration
+	        The maximum duration of the recorded clip, in microseconds.
+
+	@since 7.0s
+	*/
+	virtual void MarcSetMaxDurationL(const TTimeIntervalMicroSeconds& aMaxDuration) = 0;
+
+	/**
+	Sets the maximum size of the recorded clip, in bytes.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aMaxSize
+	        The maximum size of the recorded clip, in bytes.
+
+	@since 7.0s
+	*/
+	virtual void MarcSetMaxFileSizeL(TInt aMaxSize) = 0;
+
+	/**
+	Removes a portion from the clip, either from the current position to the beginning
+	or the current position to the end.
+
+	This function can leave with one of the system-wide error codes. The request will be
+	completed with the leave code.
+
+	@param  aToEnd
+	        A boolean indicating whether to crop to the end or the beginning. ETrue to crop to the
+	        end, EFalse to the beginning.
+
+	@since 7.0s
+	*/
+	virtual void MarcCropL(TBool aToEnd) = 0;
+
+	/**
+	Adds meta data to the clip.
+
+	@param  aNewEntry
+	        The details of the new entry to be added.
+
+	@since 7.0s
+	*/
+	virtual void MarcAddMetaDataEntryL(const CMMFMetaDataEntry& aNewEntry) = 0;
+
+	/**
+	Removes a meta data entry from the clip.
+
+	@param  aIndex
+	        The ID of the meta data entry to delete.
+
+	@since 7.0s
+	*/
+	virtual void MarcRemoveMetaDataEntryL(TInt aIndex) = 0;
+
+	/**
+	Replaces a meta data entry in the clip.
+
+	@param  aIndex
+	        The ID of the meta data entry to replace.
+	@param  aNewEntry
+	        The details of the new entry to be added.
+
+	@since 7.0s
+	*/
+	virtual void MarcReplaceMetaDataEntryL(TInt aIndex, const CMMFMetaDataEntry& aNewEntry) = 0;
+	};
+
+/**
+@publishedAll
+@released
+
+Custom command parser class to be used by controller plugins wishing to support
+audio record controller commands.
+
+The controller plugin must be derived from MMMFAudioRecordControllerCustomCommandImplementor
+to use this class.
+
+The controller plugin should create an object of this type and add it to the list of custom
+command parsers in the controller framework.  See the following example code for details.
+
+@code
+void CMMFAudioController::ConstructL()
+	{
+	// Construct custom command parsers
+	CMMFAudioPlayDeviceCustomCommandParser* audPlayDevParser = CMMFAudioPlayDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audPlayDevParser);
+	AddCustomCommandParserL(*audPlayDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audPlayDevParser
+
+	CMMFAudioRecordDeviceCustomCommandParser* audRecDevParser = CMMFAudioRecordDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audRecDevParser);
+	AddCustomCommandParserL(*audRecDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audRecDevParser
+
+etc.
+	}
+@endcode
+
+@since 7.0s
+*/
+class CMMFAudioRecordControllerCustomCommandParser : public CMMFCustomCommandParserBase
+	{
+public:
+
+	/**
+	Creates a new custom command parser capable of handling audio record controller commands.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@return A pointer to the object created.
+
+	@since  7.0s
+	*/
+	IMPORT_C static CMMFAudioRecordControllerCustomCommandParser* NewL(MMMFAudioRecordControllerCustomCommandImplementor& aImplementor);
+
+	/**
+	Destructor.
+
+	@since  7.0s
+	*/
+	IMPORT_C ~CMMFAudioRecordControllerCustomCommandParser();
+
+	/**
+	Handles a request from the client. Called by the controller framework.
+	
+	@param  aMessage
+	        The message to be handled.
+
+	@since	7.0s
+	*/
+	void HandleRequest(TMMFMessage& aMessage);
+private:
+
+	/**
+	Constructor.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@since  7.0s
+	*/
+	CMMFAudioRecordControllerCustomCommandParser(MMMFAudioRecordControllerCustomCommandImplementor& aImplementor);
+	// Internal request handling methods.
+	void DoHandleRequestL(TMMFMessage& aMessage);
+	TBool DoGetRecordTimeAvailableL(TMMFMessage& aMessage);
+	TBool DoSetMaxDurationL(TMMFMessage& aMessage);
+	TBool DoSetMaxFileSizeL(TMMFMessage& aMessage);
+	TBool DoCropL(TMMFMessage& aMessage);
+	TBool DoAddMetaDataEntryL(TMMFMessage& aMessage);
+	TBool DoRemoveMetaDataEntryL(TMMFMessage& aMessage);
+	TBool DoReplaceMetaDataEntryL(TMMFMessage& aMessage);
+private:
+	/**	
+	The object that implements the audio record controller interface.
+	*/
+	MMMFAudioRecordControllerCustomCommandImplementor& iImplementor;
+	};
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <mmf/common/mmfstandardcustomcommandsenums.h>
+#include <mmf/common/mmfstandardcustomcommandsimpl.h>
+#endif
+
+/**
+@publishedAll
+@released
+*/
+
+	enum TMMFAudioControllerMessages
+		{
+		EMMFAudioControllerSetSourceSampleRate,
+		EMMFAudioControllerSetSourceNumChannels,
+		EMMFAudioControllerSetSourceFormat,
+		EMMFAudioControllerSetSourceBitRate,
+		EMMFAudioControllerSetSourceDataType,
+		EMMFAudioControllerSetSinkSampleRate,
+		EMMFAudioControllerSetSinkNumChannels,
+		EMMFAudioControllerSetSinkFormat,
+		EMMFAudioControllerSetSinkBitRate,
+		EMMFAudioControllerSetSinkDataType,
+		EMMFAudioControllerGetSourceSampleRate,
+		EMMFAudioControllerGetSourceBitRate,
+		EMMFAudioControllerGetSourceNumChannels,
+		EMMFAudioControllerGetSourceFormat,
+		EMMFAudioControllerGetSourceDataType,
+		EMMFAudioControllerGetSinkSampleRate,
+		EMMFAudioControllerGetSinkBitRate,
+		EMMFAudioControllerGetSinkNumChannels,
+		EMMFAudioControllerGetSinkFormat,
+		EMMFAudioControllerGetSinkDataType,
+		EMMFAudioControllerGetSupportedSourceSampleRates,
+		EMMFAudioControllerGetSupportedSourceBitRates,
+		EMMFAudioControllerGetSupportedSourceNumChannels,
+		EMMFAudioControllerGetSupportedSourceDataTypes,
+		EMMFAudioControllerGetSupportedSinkSampleRates,
+		EMMFAudioControllerGetSupportedSinkBitRates,
+		EMMFAudioControllerGetSupportedSinkNumChannels,
+		EMMFAudioControllerGetSupportedSinkDataTypes,
+		EMMFAudioControllerCopyArrayData,
+		EMMFAudioControllerSetCodec
+		};
+
+
+/**
+@publishedAll
+@released
+
+Client class to access functionality specific to an audio controller.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+
+@since  7.0s
+*/
+class RMMFAudioControllerCustomCommands : public RMMFCustomCommandsBase
+	{
+public:
+
+	/**
+	Constructor.
+
+	@param  aController
+	        The client side controller object to be used by this custom command
+	        interface.
+
+	@since  7.0s
+	*/
+	IMPORT_C RMMFAudioControllerCustomCommands(RMMFController& aController);
+
+	/**
+	Sets the sample rate of the data source in samples per second.
+
+	@param  aSampleRate
+	        The sample rate, in samples per second.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetSourceSampleRate(TUint aSampleRate) const;
+
+	/**
+	Sets the bit rate of the data source in bits per second.
+
+	@param  aRate
+	        The bit rate, in bits per second.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetSourceBitRate(TUint aRate) const;
+
+	/**
+	Sets the number of channels in the data source.	For example, one channel for mono, two channels 
+	for stereo etc.
+
+	@param  aNumChannels
+	        The number of channels.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetSourceNumChannels(TUint aNumChannels) const;
+
+	/**
+	Sets the format of the data source.
+
+	The UID corresponds to the UID of the CMMFFormat-derived ECOM plugin to be used.
+
+	@param  aFormatUid
+	        The format plugin to be used.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetSourceFormat(TUid aFormatUid) const;
+
+	/**
+	Sets the fourCC code of the source.
+
+	@param  aDataType
+	        The fourCC code.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetSourceDataType(TFourCC aDataType) const;
+
+	/**
+	Sets the sample rate of the data sink in samples per second.
+
+	@param  aSampleRate
+	        The sample rate, in samples per second.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetSinkSampleRate(TUint aSampleRate) const;
+
+	/**
+	Set the bit rate of the data sink in bits per second.
+
+	@param  aRate
+	        The bit rate, in bits per second.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetSinkBitRate(TUint aRate) const;
+
+	/**
+	Sets the number of channels in the data sink. For example, one channel for mono, two channels 
+	for stereo etc.
+
+	@param  aNumChannels
+	        The number of channels.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetSinkNumChannels(TUint aNumChannels) const;
+
+	/**
+	Sets the format of the data sink.
+
+	The UID corresponds to the UID of the CMMFFormat-derived ECOM plugin to be used.
+
+	@param  aFormatUid
+	        The format plugin to be used.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetSinkFormat(TUid aFormatUid) const;
+
+	/**
+	Set the fourCC code of the sink.
+
+	@param  aDataType
+	        The fourCC code.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetSinkDataType(TFourCC aDataType) const;
+
+	/**
+	Sets the codec to be used. Useful when recording data.
+
+	@param  aSourceDataType
+	        The data type of the source of the codec.
+	@param  aSinkDataType
+	        The data type of the sink of the codec.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetCodec(TFourCC aSourceDataType, TFourCC aSinkDataType) const;
+
+	/**
+	Gets the sample rate of the data source in samples per second.
+
+	@param  aRate
+	        The sample rate, in samples per second.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetSourceSampleRate(TUint& aRate) const;
+
+	/**
+	Gets the bit rate of the data source in bits per second.
+
+	@param  aRate
+	        The bit rate, in bits per second.
+	
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetSourceBitRate(TUint& aRate) const;
+
+	/**
+	Gets the number of channels in the data source. For example, one channel for mono, two channels 
+	for stereo etc.
+
+	@param  aNumChannels
+	        The number of channels.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetSourceNumChannels(TUint& aNumChannels) const;
+
+	/**
+	Gets the format of the data source.
+
+	The UID corresponds to the UID of the CMMFFormat-derived ECOM plugin being used.
+
+	@param  aFormat
+	        The format plugin being used.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetSourceFormat(TUid& aFormat) const;
+
+	/**
+	Get the fourCC code of the source.
+
+	@param  aDataType
+	        The fourCC code.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetSourceDataType(TFourCC& aDataType) const;
+
+	/**
+	Gets the sample rate of the data sink in samples per second.
+
+	@param  aRate
+	        The sample rate, in samples per second.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetSinkSampleRate(TUint& aRate) const;
+
+	/**
+	Gets the bit rate of the data sink in bits per second.
+
+	@param  aRate
+	        The bit rate, in bits per second.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetSinkBitRate(TUint& aRate) const;
+
+	/**
+	Gets the number of channels in the data sink. For example, one channel for mono, two channels 
+	for stereo etc.
+
+	@param  aNumChannels
+	        The number of channels.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetSinkNumChannels(TUint& aNumChannels) const;
+
+	/**
+	Gets the format of the data sink.
+
+	The UID corresponds to the UID of the CMMFFormat-derived ECOM plugin being used.
+
+	@param  aFormat
+	        The format plugin being used.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetSinkFormat(TUid& aFormat) const;
+
+	/**
+	Gets the fourCC code of the sink.
+
+	@param  aDataType
+	        The fourCC code.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt GetSinkDataType(TFourCC& aDataType) const;
+
+	/**
+	Gets the list of sample rates supported by the data source.
+
+	Warning: Existing objects in this array will be removed by this function.
+
+	@param  aSupportedRates
+	        The supported rates.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C void GetSupportedSourceSampleRatesL(RArray<TUint>& aSupportedRates) const;
+
+	/**
+	Gets the list of bit rates supported by the data source.
+
+	Warning: Existing objects in this array will be removed by this function.
+
+	@param  aSupportedRates
+	        The supported rates.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C void GetSupportedSourceBitRatesL(RArray<TUint>& aSupportedRates) const;
+
+	/**
+	Gets the list of channels supported by the data source (ie mono, stereo etc).
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedChannels
+	        The supported channels.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C void GetSupportedSourceNumChannelsL(RArray<TUint>& aSupportedChannels) const;
+
+	/**
+	Gets the list of fourCC codes supported by the data source.
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedDataTypes
+	        The supported data types.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C void GetSupportedSourceDataTypesL(RArray<TFourCC>& aSupportedDataTypes) const;
+
+	/**
+	Gets the list of sample rates supported by the data sink.
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedRates
+	        The supported rates.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C void GetSupportedSinkSampleRatesL(RArray<TUint>& aSupportedRates) const;
+
+	/**
+	Gets the list of bit rates supported by the data sink.
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedRates
+	        The supported rates.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C void GetSupportedSinkBitRatesL(RArray<TUint>& aSupportedRates) const;
+
+	/**
+	Gets the list of channels supported by the data sink (ie mono, stereo etc).
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedChannels
+	        The supported channels.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C void GetSupportedSinkNumChannelsL(RArray<TUint>& aSupportedChannels) const;
+
+	/**
+	Gets the list of fourCC codes supported by the data sink.
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedDataTypes
+	        The supported data types.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C void GetSupportedSinkDataTypesL(RArray<TFourCC>& aSupportedDataTypes) const;
+
+private:
+	void DoGetUintArrayL(RArray<TUint>& aArray, TMMFAudioControllerMessages aIpc) const;
+	void DoGetFourCCArrayL(RArray<TFourCC>& aArray, TMMFAudioControllerMessages aIpc) const;
+	};
+
+
+/**
+@publishedAll
+@released
+
+Mixin class to be derived from controller plugins that could support the audio record controller
+custom commands.
+*/
+class MMMFAudioControllerCustomCommandImplementor
+	{
+public:
+
+	/**
+	Sets the sample rate of the data source in samples per second.
+
+	@param  aSampleRate
+	        The sample rate, in samples per second.
+
+	@since 7.0s
+	*/
+	virtual void MacSetSourceSampleRateL(TUint aSampleRate) = 0;
+
+	/**
+	Sets the bit rate of the data source in bits per second.
+
+	@param  aBitRate
+	        The bit rate, in bits per second.
+
+	@since  7.0s
+	*/
+	virtual void MacSetSourceBitRateL(TUint aBitRate) = 0;
+
+	/**
+	Sets the number of channels in the data source.	For example, one channel for mono, two channels 
+	for stereo etc.
+
+	@param  aNumChannels
+	        The number of channels.
+
+	@since  7.0s
+	*/
+	virtual void MacSetSourceNumChannelsL(TUint aNumChannels) = 0;
+
+	/**
+	Sets the format of the data source.	The UID corresponds to the UID of the CMMFFormat-derived 
+	ECOM plugin to be used.
+
+	@param  aFormatUid
+	        The format plugin to be used.
+
+	@since 7.0s
+	*/
+	virtual void MacSetSourceFormatL(TUid aFormatUid) = 0;
+
+	/**
+	Sets the fourCC code of the source.
+
+	@param  aDataType
+	        The fourCC code.
+
+	@since 7.0s
+	*/
+	virtual void MacSetSourceDataTypeL(TFourCC aDataType) = 0;
+
+	/**
+	Sets the sample rate of the data sink in samples per second.
+
+	@param  aSampleRate
+	        The sample rate, in samples per second.
+
+	@since  7.0s
+	*/
+	virtual void MacSetSinkSampleRateL(TUint aSampleRate) = 0;
+
+	/**
+	Sets the bit rate of the data sink in bits per second.
+
+	@param  aRate
+	        The bit rate, in bits per second.
+
+	@since  7.0s
+	*/
+	virtual void MacSetSinkBitRateL(TUint aRate) = 0;
+
+	/**
+	Sets the number of channels in the data sink. For example, one channel for mono, two channels 
+	for stereo etc.
+
+	@param  aNumChannels
+	        The number of channels.
+
+	@since  7.0s
+	*/
+	virtual void MacSetSinkNumChannelsL(TUint aNumChannels) = 0;
+
+	/**
+	Sets the format of the data sink. The UID corresponds to the uid of the CMMFFormat-derived ECOM 
+	plugin to be used.
+
+	@param  aFormatUid
+	        The format plugin to be used.
+
+	@since  7.0s
+	*/
+	virtual void MacSetSinkFormatL(TUid aFormatUid) = 0;
+
+	/**
+	Sets the fourCC code of the sink.
+
+	@param  aDataType
+	        The fourCC code.
+
+	@since  7.0s
+	*/
+	virtual void MacSetSinkDataTypeL(TFourCC aDataType) = 0;
+
+	/**
+	Sets the codec to be used.  Useful when recording data.
+
+	@param  aSourceDataType
+	        The data type of the source of the codec.
+	@param  aSinkDataType
+	        The data type of the sink of the codec.
+
+	@since  7.0s
+	*/
+	virtual void MacSetCodecL(TFourCC aSourceDataType, TFourCC aSinkDataType) = 0;
+
+
+	/**
+	Gets the sample rate of the data source in samples per second.
+
+	@param  aRate	
+	        The sample rate, in samples per second.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSourceSampleRateL(TUint& aRate) = 0;
+
+	/**
+	Gets the bit rate of the data source in bits per second.
+
+	@param  aRate
+	        The bit rate, in bits per second.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSourceBitRateL(TUint& aRate) = 0;
+
+	/**
+	Gets the number of channels in the data source.	For example, one channel for mono, two channels 
+	for stereo etc.
+
+	@param  aNumChannels
+	        The number of channels.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSourceNumChannelsL(TUint& aNumChannels) = 0;
+
+	/**
+	Gets the format of the data source.	The UID corresponds to the uid of the CMMFFormat-derived 
+	ECOM plugin being used.
+
+	@param  aFormat
+	        The format plugin being used.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSourceFormatL(TUid& aFormat) = 0;
+
+	/**
+	Gets the fourCC code of the source.
+
+	@param  aDataType
+	        The fourCC code.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSourceDataTypeL(TFourCC& aDataType) = 0;
+
+	/**
+	Gets the sample rate of the data sink in samples per second.
+
+	@param  aRate
+	        The sample rate, in samples per second.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSinkSampleRateL(TUint& aRate) = 0;
+
+	/**
+	Gets the bit rate of the data sink in bits per second.
+
+	@param  aRate
+	        The bit rate, in bits per second.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSinkBitRateL(TUint& aRate) = 0;
+
+	/**
+	Gets the number of channels in the data sink. For example, one channel for mono, two channels 
+	for stereo etc.
+
+	@param  aNumChannels
+	        The number of channels.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSinkNumChannelsL(TUint& aNumChannels) = 0;
+
+	/**
+	Gets the format of the data sink. The UID corresponds to the uid of the CMMFFormat-derived ECOM 
+	plugin being used.
+
+	@param  aFormat
+	        The format plugin being used.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSinkFormatL(TUid& aFormat) = 0;
+
+	/**
+	Gets the fourCC code of the sink.
+
+	@param  aDataType
+	        The fourCC code.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSinkDataTypeL(TFourCC& aDataType) = 0;
+
+	/**
+	Gets the list of sample rates supported by the data source.
+
+	@param  aSupportedRates
+	        The supported rates.  Warning: Existing objects in this array will be removed by this method.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSupportedSourceSampleRatesL(RArray<TUint>& aSupportedRates) = 0;
+
+	/**
+	Gets the list of bit rates supported by the data source.
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedRates
+	        The supported rates.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSupportedSourceBitRatesL(RArray<TUint>& aSupportedRates) = 0;
+
+	/**
+	Gets the list of channels supported by the data source (ie mono, stereo etc).
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedChannels
+	        The supported channels.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSupportedSourceNumChannelsL(RArray<TUint>& aSupportedChannels) = 0;
+
+	/**
+	Gets the list of fourCC codes supported by the data source.
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedDataTypes
+	        The supported data types.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSupportedSourceDataTypesL(RArray<TFourCC>& aSupportedDataTypes) = 0;
+
+	/**
+	Gets the list of sample rates supported by the data sink.
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedRates
+	        The supported rates.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSupportedSinkSampleRatesL(RArray<TUint>& aSupportedRates) = 0;
+
+	/**
+	Gets the list of bit rates supported by the data sink.
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedRates
+	        The supported rates.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSupportedSinkBitRatesL(RArray<TUint>& aSupportedRates) = 0;
+
+	/**
+	Gets the list of channels supported by the data sink (ie mono, stereo etc).
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedChannels
+	        The supported channels.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSupportedSinkNumChannelsL(RArray<TUint>& aSupportedChannels) = 0;
+
+	/**
+	Gets the list of fourCC codes supported by the data sink.
+
+	Warning: Existing objects in this array will be removed by this method.
+
+	@param  aSupportedDataTypes
+	        The supported data types.
+
+	@since  7.0s
+	*/
+	virtual void MacGetSupportedSinkDataTypesL(RArray<TFourCC>& aSupportedDataTypes) = 0;
+	};
+
+/**
+@publishedAll
+@released
+
+Custom command parser class to be used by controller plugins wishing to support
+audio controller commands.
+
+The controller plugin must be derived from MMMFAudioControllerCustomCommandImplementor
+to use this class.
+
+The controller plugin should create an object of this type and add it to the list of custom
+command parsers in the controller framework. See the following example code for details.
+
+@code
+void CMMFAudioController::ConstructL()
+	{
+	// Construct custom command parsers
+	CMMFAudioPlayDeviceCustomCommandParser* audPlayDevParser = CMMFAudioPlayDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audPlayDevParser);
+	AddCustomCommandParserL(*audPlayDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audPlayDevParser
+
+	CMMFAudioRecordDeviceCustomCommandParser* audRecDevParser = CMMFAudioRecordDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audRecDevParser);
+	AddCustomCommandParserL(*audRecDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audRecDevParser
+
+etc.
+	}
+@endcode
+
+@since  7.0s
+*/
+class CMMFAudioControllerCustomCommandParser : public CMMFCustomCommandParserBase
+	{
+public:
+
+	/**
+	Creates a new custom command parser capable of handling audio controller commands.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@return A pointer to the object created.
+
+	@since  7.0s
+	*/
+	IMPORT_C static CMMFAudioControllerCustomCommandParser* NewL(MMMFAudioControllerCustomCommandImplementor& aImplementor);
+
+	/**
+	Destructor.
+
+	@since 7.0s
+	*/
+	IMPORT_C ~CMMFAudioControllerCustomCommandParser();
+
+	/**
+	Handles a request from the client. Called by the controller framework.
+
+	@param  aMessage
+	        The message to be handled.
+
+	@since  7.0s
+	*/
+	void HandleRequest(TMMFMessage& aMessage);
+private:
+	/**
+	Constructor.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@since  7.0s
+	*/
+	CMMFAudioControllerCustomCommandParser(MMMFAudioControllerCustomCommandImplementor& aImplementor);
+	// Internal request handling methods.
+	void DoHandleRequestL(TMMFMessage& aMessage);
+
+	TBool DoSetSourceSampleRateL(TMMFMessage& aMessage);
+	TBool DoSetSourceNumChannelsL(TMMFMessage& aMessage);
+	TBool DoSetSourceFormatL(TMMFMessage& aMessage);
+	TBool DoSetSinkSampleRateL(TMMFMessage& aMessage);
+	TBool DoSetSinkNumChannelsL(TMMFMessage& aMessage);
+	TBool DoSetSinkFormatL(TMMFMessage& aMessage);
+	TBool DoSetCodecL(TMMFMessage& aMessage);
+	TBool DoSetSourceBitRateL(TMMFMessage& aMessage);
+	TBool DoSetSourceDataTypeL(TMMFMessage& aMessage);
+	TBool DoSetSinkBitRateL(TMMFMessage& aMessage);
+	TBool DoSetSinkDataTypeL(TMMFMessage& aMessage);
+	TBool DoGetSourceSampleRateL(TMMFMessage& aMessage);
+	TBool DoGetSourceBitRateL(TMMFMessage& aMessage);
+	TBool DoGetSourceNumChannelsL(TMMFMessage& aMessage);
+	TBool DoGetSourceFormatL(TMMFMessage& aMessage);
+	TBool DoGetSourceDataTypeL(TMMFMessage& aMessage);
+	TBool DoGetSinkSampleRateL(TMMFMessage& aMessage);
+	TBool DoGetSinkBitRateL(TMMFMessage& aMessage);
+	TBool DoGetSinkNumChannelsL(TMMFMessage& aMessage);
+	TBool DoGetSinkFormatL(TMMFMessage& aMessage);
+	TBool DoGetSinkDataTypeL(TMMFMessage& aMessage);
+	TBool DoGetSupportedSourceSampleRatesL(TMMFMessage& aMessage);
+	TBool DoGetSupportedSourceBitRatesL(TMMFMessage& aMessage);
+	TBool DoGetSupportedSourceNumChannelsL(TMMFMessage& aMessage);
+	TBool DoGetSupportedSourceDataTypesL(TMMFMessage& aMessage);
+	TBool DoGetSupportedSinkSampleRatesL(TMMFMessage& aMessage);
+	TBool DoGetSupportedSinkBitRatesL(TMMFMessage& aMessage);
+	TBool DoGetSupportedSinkNumChannelsL(TMMFMessage& aMessage);
+	TBool DoGetSupportedSinkDataTypesL(TMMFMessage& aMessage);
+	TBool DoCopyArrayDataL(TMMFMessage& aMessage);
+
+	void DoCreateBufFromUintArrayL(RArray<TUint>& aArray);
+	void DoCreateBufFromFourCCArrayL(RArray<TFourCC>& aArray);
+private:
+	/** 
+	The object that implements the audio record controller interface 
+	*/
+	MMMFAudioControllerCustomCommandImplementor& iImplementor;
+
+	CBufFlat* iDataCopyBuffer;
+	};
+
+
+class RWindow;
+
+/**
+@publishedAll
+@released
+
+Client class to access functionality specific to a video controller.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+
+@since  7.0s
+*/
+class RMMFVideoControllerCustomCommands : public RMMFCustomCommandsBase
+	{
+public:
+
+	/**
+	Constructor.
+
+	@param  aController
+	        The client side controller object to be used by this custom command interface.
+
+	@since  7.0s
+	*/
+	IMPORT_C RMMFVideoControllerCustomCommands(RMMFController& aController);
+
+	/**
+	Gets the frame size of the clip.
+
+	@param  aVideoFrameSize
+	        The frame size, in pixels.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt GetVideoFrameSize(TSize& aVideoFrameSize) const;
+
+	/**
+	Gets the audio type.
+
+	@param  aCodec
+	        The FourCC of the audio codec.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetAudioCodec(TFourCC& aCodec) const;
+
+	/**
+	Gets the video bit rate.
+
+	@param  aBitRate	
+	        The bit rate of the video stream. If this value is KMMFVariableVideoBitRate it signifies
+	        a variable bit rate.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetVideoBitRate(TInt& aBitRate) const;
+
+	/**
+	Gets the audio bit rate.
+
+	@param aBitRate
+	       The bit rate of the audio stream.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetAudioBitRate(TInt& aBitRate) const;
+
+	/**
+	Sets the frame rate of the clip.
+
+	@param  aFramesPerSecond
+	        The number of frames per second.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetFrameRate(TReal32 aFramesPerSecond) const;
+
+	/**
+	Gets the frame rate of the clip.
+
+	@param  aFramesPerSecond
+	        The number of frames per second, filled in by the controller plugin.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetFrameRate(TReal32& aFramesPerSecond) const;
+
+	/**
+	Gets the video clip MIME type.
+
+	@param  aMimeType
+	        The Mime type of the current clip.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetVideoMimeType(TDes8& aMimeType) const;
+	};
+
+/**
+@publishedAll
+@released
+
+Client class to access functionality specific to a video playback controller.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+
+@since  7.0s
+*/
+class RMMFVideoPlayControllerCustomCommands : public RMMFCustomCommandsBase
+	{
+public:
+
+	/**
+	Constructor.
+
+	@param  aController
+	        The client side controller object to be used by this custom command interface.
+
+	@since  7.0s
+	*/
+	IMPORT_C RMMFVideoPlayControllerCustomCommands(RMMFController& aController);
+
+	/**
+	Prepares the video clip to be accessed.
+
+	A call to this function tells the loaded controller plugin to finalise its configuration
+	and to prepare to start reading the video clip.  It is not possible to play the video clip
+	or query any of its properties (e.g. duration, meta data etc.) until the controller plugin
+	has signified the completion of this method by generating a KMMFEventCategoryVideoPrepareComplete
+	event.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt Prepare();
+
+	/**
+	Asks the controller to store the current frame to a bitmap. 
+
+	The video play controller will send an event to the client on completion of the task.
+
+	@param  aBitmap
+	        The handle of the CFbsBitmap object to retrieve the frame to.
+	@param  aStatus
+	        The active object to call back on.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C void GetFrame(CFbsBitmap& aBitmap, TRequestStatus& aStatus);
+
+	/**
+	Sets the screen region to be used to display the video.
+
+	@param  aWindowRect
+	        The window rectangle.
+	@param  aClipRect
+	        The clip rectangle.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetDisplayWindow(const TRect& aWindowRect, const TRect& aClipRect) const;
+
+	/**
+	Updates the display region.
+
+	@param  aRegion
+	        The valid region to display to.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt UpdateDisplayRegion(const TRegion& aRegion) const;
+
+	/**
+	Queries whether audio is enabled.
+
+	@param  aEnabled
+	        A boolean indicating whether audio is enabled.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetAudioEnabled(TBool& aEnabled) const;
+
+	/**
+	Sends a direct screen access event to controller.
+
+	@param  aDSAEvent
+	        The direct screen access event.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt DirectScreenAccessEvent(const TMMFDSAEvent aDSAEvent) const;
+
+	/**
+ 	Sets a time window for video playback.
+
+ 	@param  aStart
+	        The start time in milliseconds relative to the start of the video clip.
+  	@param  aEnd
+	        The end time in milliseconds relative to the start of the video clip.
+
+  	@return One of the system-wide error codes.
+
+  	@since  7.0s
+	*/
+	IMPORT_C TInt Play(const TTimeIntervalMicroSeconds& aStart, const TTimeIntervalMicroSeconds& aEnd) const;
+
+	/**
+  	Requests the controller to redraw the current frame.
+
+  	@return One of the system-wide error codes.
+
+  	@since  7.0s
+	*/
+	IMPORT_C TInt RefreshFrame() const;
+
+	/**
+	Gets the video loading progress as a percentage.
+
+	@param  aPercentageProgress
+	        The progress loading the clip, as a percentage.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetLoadingProgress(TInt& aPercentageProgress) const;
+
+	/**
+	Rotates the video image on the screen.
+
+	@param  aRotation
+	        The desired rotation to apply.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetRotation(TVideoRotation aRotation) const;
+
+	/**
+	Queries the rotation that is currently applied to the video image.
+
+	@param  aRotation
+	        The applied rotation.
+
+	@return One of the system wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetRotation(TVideoRotation& aRotation) const;
+
+	/**
+	Scales the video image to a specified percentage of its original size.
+
+	@param  aWidthPercentage
+	        The percentage (100 = original size) to be used to scale the width of the video image.
+	@param  aHeightPercentage
+	        The percentage (100 = original size) to be used to scale the height of the video image. 
+	        If this is not equal to aWidthPercentage then the image may be distorted.
+	@param  aAntiAliasFiltering
+	        True if anti-aliasing filtering should be used. If the plugin does not
+	        support this kind of processing, this value will be ignored.
+
+	@return One of the system wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetScaleFactor(TReal32 aWidthPercentage, TReal32 aHeightPercentage, TBool aAntiAliasFiltering) const;
+
+	/**
+	Gets the scale factor currently applied to the video image.
+
+	@param  aWidthPercentage
+	        On return, will contain the percentage (100 = original size) used to scale the width
+	        of the video image.
+	@param  aHeightPercentage
+	        On return. will contain the percentage (100 = original size) used to scale the height 
+	        of the video image.
+	@param  aAntiAliasFiltering
+	        True if anti-aliasing filtering is being used
+
+	@return One of the system wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetScaleFactor(TReal32& aWidthPercentage, TReal32& aHeightPercentage, TBool& aAntiAliasFiltering) const;
+
+	/**
+	Selects a region of the video image to be displayed.
+
+	@param  aCropRegion
+	        The dimensions of the crop region, relative to the video image.
+
+	@return One of the system wide error codes.
+
+	@since 7.0s
+	*/
+	IMPORT_C TInt SetCropRegion(const TRect& aCropRegion) const;
+
+	/**
+	Gets the crop region currently applied to the image.
+
+	@param  aCropRegion
+	        The dimensions of the crop region, relative to the video image. If no crop region has
+	        been applied, the full dimensions of the video image will be returned.
+	
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetCropRegion(TRect& aCropRegion) const;
+
+
+private:
+	TPckgBuf<TMMFVideoConfig> iConfigPackage;
+	};
+
+/**
+@publishedAll
+@released
+*/
+
+	enum TMMFVideoRecordControllerMessages
+		{
+		EMMFVideoRecordControllerSetVideoFormat,
+		EMMFVideoRecordControllerSetVideoCodec,
+		EMMFVideoRecordControllerSetAudioCodec,
+		EMMFVideoRecordControllerSetVideoBitRate,
+		EMMFVideoRecordControllerSetAudioBitRate,
+		EMMFVideoRecordControllerSetVideoFrameSize,
+		EMMFVideoRecordControllerSetMaxFileSize,
+		EMMFVideoRecordControllerAddMetaDataEntry,
+		EMMFVideoRecordControllerRemoveMetaDataEntry,
+		EMMFVideoRecordControllerReplaceMetaDataEntry,
+		EMMFVideoRecordControllerSetAudioEnabled,
+		EMMFVideoRecordControllerPrepare,
+		EMMFVideoRecordControllerSetCameraHandle,
+		EMMFVideoRecordControllerGetRecordTimeAvailable,
+		EMMFVideoRecordControllerGetSupportedSinkAudioTypes,
+		EMMFVideoRecordControllerGetSupportedSinkVideoTypes,
+		EMMFVideoRecordControllerCopyDescriptorArrayData,
+		EMMFVideoRecordControllerCopyFourCCArrayData,
+		EMMFVideoRecordControllerGetAudioEnabled // INC23777
+		};
+
+
+/**
+@publishedAll
+@released
+
+Client class to access functionality specific to a video recorder controller.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+
+@since  7.0s
+*/
+class RMMFVideoRecordControllerCustomCommands : public RMMFCustomCommandsBase
+	{
+public:
+
+	/**
+	Constructor.
+
+	@param  aController
+	        The client side controller object to be used by this custom command interface.
+
+	@since 7.0s
+	*/
+	IMPORT_C RMMFVideoRecordControllerCustomCommands(RMMFController& aController);
+
+	/**
+	Sets the format for the video to record.
+
+	@param  aVideoFormatUid
+	        The UID of the video format.
+
+	@return This method will return with one of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetVideoFormat(TUid aVideoFormatUid) const;
+
+	/**
+	Sets the video codec for recording.
+
+	@param  aVideoCodec
+	        The MIME type of the video codec.
+
+	@return	One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetVideoCodec(const TDesC8& aVideoCodec) const;
+
+	/**
+	Sets the video bit rate.
+
+	@param  aBitRate
+	        The bit rate of the video stream.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetVideoBitRate(TInt aBitRate) const;
+
+	/**
+	Sets the audio bit rate.
+
+	@param  aBitRate
+	        The bit rate of the audio stream.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetAudioBitRate(TInt aBitRate) const;
+
+	/**
+	Sets the audio codec for recording.
+
+	@param  aAudioCodec
+	        The FourCC code of the audio codec.
+
+	@return	One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetAudioCodec(TFourCC aAudioCodec) const;
+
+	/**
+	Sets the frame size of the clip.
+
+	@param  aVideoFrameSize
+	        The frame size, in pixels.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetVideoFrameSize(TSize aVideoFrameSize) const;
+
+	/**
+	Sets the maximum size of the recorded clip, in bytes.
+
+	@param  aMaxSize
+	        The maximum size of the recorded clip, in bytes. This can be called with the parameter 
+	        KMMFNoMaxClipSize which signifies no maximum file size.
+
+	@return	One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetMaxFileSize(TInt aMaxSize) const;
+
+	/**
+	Adds meta data to the clip.
+
+	@param  aNewEntry
+	        The details of the new entry to be added.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C void AddMetaDataEntryL(const CMMFMetaDataEntry& aNewEntry)const;
+
+	/**
+	Removes a meta data entry from the clip.
+
+	@param  aIndex
+	        The ID of the meta data entry to delete.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt RemoveMetaDataEntry(TInt aIndex)const;
+
+	/**
+	Replaces a meta data in the clip.
+
+	@param  aIndex
+	        The ID of the meta data entry to replace.
+	@param  aNewEntry
+	        The details of the new entry to be added.
+
+	@since  7.0s
+	*/
+	IMPORT_C void ReplaceMetaDataEntryL(TInt aIndex, const CMMFMetaDataEntry& aNewEntry)const;
+
+	/**
+	Sets whether audio is enabled.
+
+	@param  aEnable
+	        A boolean indicating if audio should be enabled.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetAudioEnabled(TBool aEnable) const;
+
+	/**
+	Prepares the controller for recording. This should be called before the first attempt to record 
+	with the controller.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt Prepare() const;
+
+	/**
+	Sets the handle of the camera to use.
+
+	@param  aCameraHandle
+	        The handle of the camera to use.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt SetCameraHandle(TInt aCameraHandle) const;
+
+	/**
+	Gets the (possibly estimated) record time left in the clip.
+
+	@param  aTime
+	        The record time available, in microseconds.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetRecordTimeAvailable(TTimeIntervalMicroSeconds& aTime) const;
+
+	/**
+	Gets the supported sink audio types.
+
+	@param  aSupportedDataTypes
+	        The supported data types.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetSupportedSinkAudioTypes(RArray<TFourCC>& aSupportedDataTypes) const;
+
+	/**
+	Gets the supported sink video types.
+
+	@param  aDataTypes
+	        The supported data types.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetSupportedSinkVideoTypes(CDesC8Array& aDataTypes) const;
+
+	// INC23777
+	/**
+	Retrieves whether audio is enabled.
+
+	@param  aEnabled
+	        A boolean indicating whether audio is enabled.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	IMPORT_C TInt GetAudioEnabled(TBool& aEnabled) const;
+
+private:
+	void DoGetCDesC8ArrayL(CDesC8Array& aArray, TMMFVideoRecordControllerMessages aIpc) const;
+	void DoGetFourCCArrayL(RArray<TFourCC>& aArray) const;
+	};
+
+
+/**
+@publishedAll
+@released
+
+Mixin class to be derived from controller plugins that could support the video record controller 
+custom commands.
+*/
+class MMMFVideoRecordControllerCustomCommandImplementor
+	{
+public:
+
+	/**
+	Sets the format for the video to record.
+
+	@param  aVideoFormatUid
+	        The UID of the video format.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	virtual void MvrcSetVideoFormatL(TUid aVideoFormatUid)=0;
+
+	/**
+	Sets the video codec for recording.
+
+	@param  aVideoCodec
+	        The MIME type of the video codec.
+
+	@return One of the system-wide error codes.
+
+	@since 7.0s
+	*/
+	virtual void MvrcSetVideoCodecL(const TDesC8& aVideoCodec)=0;
+
+	/**
+	Sets the audio codec for recording.
+
+	@param  aAudioCodec
+	        The FourCC code of the audio codec.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	virtual void MvrcSetAudioCodecL(TFourCC aAudioCodec)=0;
+
+	/**
+	Sets the video bit rate.
+
+	@param  aBitRate
+	        The bit rate of the video stream. This can be called with the parameter 
+	        KMMFVariableVideoBitRate which specifies a variable bit rate.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	virtual void MvrcSetVideoBitRateL(TInt& aBitRate)=0;
+
+	/**
+	Sets the audio bit rate.
+
+	@param  aBitRate
+	        The bit rate of the audio stream.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	virtual void MvrcSetAudioBitRateL(TInt& aBitRate)=0;
+
+	/**
+	Adds meta data to the clip.
+
+	@param  aNewEntry
+	        The details of the new entry to be added.
+
+	@since  7.0s
+	*/
+	virtual void MvrcAddMetaDataEntryL(const CMMFMetaDataEntry& aNewEntry)=0;
+
+	/**
+	Removes a meta data entry from the clip.
+
+	@param  aIndex
+	        The ID of the meta data entry to delete.
+
+	@since  7.0s
+	*/
+	virtual void MvrcRemoveMetaDataEntryL(TInt aIndex)=0;
+
+	/**
+	Replaces a meta data in the clip.
+
+	@param  aIndex
+	        The ID of the meta data entry to replace.
+	@param  aNewEntry
+	        The details of the new entry to be added.
+
+	@since  7.0s
+	*/
+	virtual void MvrcReplaceMetaDataEntryL(TInt aIndex, const CMMFMetaDataEntry& aNewEntry)=0;
+
+	/**
+	Sets the maximum file size.
+
+	@param  aMaxFileSize
+	        The maximum file size allowed for recording. This can be called with the parameter
+	        KMMFNoMaxClipSize which signifies no maximum file size.
+
+	@since  7.0s
+	*/
+	virtual void MvrcSetMaxFileSizeL(TInt aMaxFileSize)=0;
+
+	/**
+	Sets whether audio is enabled.
+
+	@param  aEnable
+	        A boolean indicating if audio is enabled.
+
+	@since  7.0s
+	*/
+	virtual void MvrcSetAudioEnabledL(TBool aEnable)=0;
+
+	/**
+	Sets the frame size for the video recording.
+
+	@param  aFrameSize
+	        The frame size for recording.
+
+	@since  7.0s
+	*/
+	virtual void MvrcSetVideoFrameSizeL(TSize aFrameSize)=0;
+
+	/**
+	Prepares the controller for recording. This needs to be called before
+	the first call to Record().
+
+	@since  7.0s
+	*/
+	virtual void MvrcPrepareL()=0;
+
+	/**
+	Sets the handle of the camera to use for recording.
+
+	@since  7.0s
+	*/
+	virtual void MvrcSetCameraHandleL(TInt aCameraHandle)=0;
+
+	/**
+	Gets the (possibly estimated) record time left in the clip.
+
+	@param  aTime
+	        The record time available, in microseconds.
+
+	@since  7.0s
+	*/
+	virtual void MvrcGetRecordTimeAvailableL(TTimeIntervalMicroSeconds& aTime) = 0;
+
+	/**
+	Gets the supported sink audio types.
+
+	@param  aDataTypes
+	        The supported data types.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	virtual void MvrcGetSupportedSinkAudioTypesL(RArray<TFourCC>& aDataTypes)=0;
+
+	/**
+	Gets the supported sink video types.
+
+	@param  aDataTypes
+	        The supported data types.
+
+	@return One of the system-wide error codes.
+
+	@since  7.0s
+	*/
+	virtual void MvrcGetSupportedSinkVideoTypesL(CDesC8Array& aDataTypes)=0;
+
+	//INC23777
+	/**
+	Indicates if the audio is enabled.
+
+	@param  aEnabled
+	        A boolean indicating if the audio is enabled.
+
+	@since  7.0s
+	*/
+	virtual void MvrcGetAudioEnabledL(TBool& aEnabled)=0;
+	};
+
+
+/**
+@publishedAll
+@released
+
+Client class to access functionality specific to a video playback controller.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+
+@since  7.0s
+*/
+class MMMFVideoPlayControllerCustomCommandImplementor
+	{
+public:
+
+	/**
+	Prepares the video clip to be accessed.
+
+	A call to this method tells the controller plugin to finalise its configuration
+	and to prepare to start reading the video clip.  It is not possible to play the video clip
+	or query any of its properties (e.g. duration, meta data etc.) until the controller plugin
+	has signified the completion of this method by generating a 
+	KMMFEventCategoryVideoPrepareComplete event.
+
+	@since  7.0s
+	*/
+	virtual void MvpcPrepare()=0;
+
+	/**
+	Gets a frame previously requested from the controller.
+
+	@param  aVideoFrame
+	        The handle of bitmap to retrieve frame to.
+
+	@since  7.0s
+	*/
+	virtual void MvpcGetFrameL(MMMFVideoFrameMessage& aVideoFrame)=0;
+
+	/**
+	Indicates whether audio is enabled.
+
+	@param  aEnabled
+	        On return, contains a boolean indicating whether audio is enabled.
+
+	@since  7.0s
+	*/
+	virtual void MvpcGetAudioEnabledL(TBool& aEnabled)=0;
+
+	/**
+	Sets the screen region to be used to display the video.
+
+	@param  aClipRect
+	        The clip rect used to display the video.
+
+	@since  7.0s
+	*/
+	virtual void MvpcSetDisplayWindowL(const TRect& aWindowRect, const TRect& aClipRect) = 0;
+
+	/**
+	Updates the region to display.
+
+	@param  aRegion
+	        A TRegion containing the current display regions, ownership of the TRegion is not
+	        transferred.
+
+	@since  7.0s
+	*/
+	virtual void MvpcUpdateDisplayRegionL(const TRegion& aRegion) = 0;
+
+	/**
+	Pauses/Resumes video playback. This is to be used with direct screen access
+	to indicate that the display has changed and should not be written to. This
+	does not affect audio playback.
+
+	@param  aDSAEvent
+	        Whether the video display should be active.
+
+	@since  7.0s
+	*/
+	virtual void MvpcDirectScreenAccessEventL(const TMMFDSAEvent aDSAEvent) = 0;
+
+	/**
+ 	Sets a time window for video playback.
+
+ 	@param  aStart
+	        Start time in milliseconds relative to the start of the video clip.
+  	@param  aEnd
+	        End time in milliseconds relative to the start of the video clip.
+
+  	@since 7.0s
+	*/
+	virtual void MvpcPlayL(const TTimeIntervalMicroSeconds& aStart, const TTimeIntervalMicroSeconds& aEnd) = 0;
+	
+	/**
+  	Requests the controller to redraw the current frame.
+
+  	@since  7.0s
+	*/
+	virtual void MvpcRefreshFrameL() = 0;
+
+	/**
+	Gets the progress of loading a video clip.
+
+	@param  aPercentageComplete
+	        The progress loading the clip, as a percentage.
+
+	@since  7.0s
+	*/
+	virtual void MvpcGetLoadingProgressL(TInt& aPercentageComplete) = 0;
+
+	/**
+	Rotates the video image on the screen.
+
+	@param  aRotation
+	        The desired rotation to apply.
+
+	@since  7.0s
+	*/
+	virtual void MvpcSetRotationL(TVideoRotation aRotation) = 0;
+
+	/**
+	Queries the rotation that is currently applied to the video image.
+
+	@param  aRotation
+	        The applied rotation.
+
+	@since  7.0s
+	*/
+	virtual void MvpcGetRotationL(TVideoRotation& aRotation) = 0;
+
+	/**
+	Scales the video image to a specified percentage of its original size.
+
+	@param  aWidthPercentage
+	        The percentage (100 = original size) to be used to scale the width of the video image.
+	@param  aHeightPercentage
+	        The percentage (100 = original size) to be used to scale the height of the video image. 
+	        If this is not equal to aWidthPercentage then the image may be distorted.
+	@param  aAntiAliasFiltering
+	        A boolean indicating if anit-aliasing filtering should be used. ETrue if anti-aliasing 
+	        should be used.  If the plugin does not support this kind of processing, this value will 
+	        be ignored.
+
+	@since  7.0s
+	*/
+	virtual void MvpcSetScaleFactorL(TReal32 aWidthPercentage, TReal32 aHeightPercentage, TBool aAntiAliasFiltering) = 0;
+
+	/**
+	Gets the scale factor currently applied to the video image.
+
+	@param  aWidthPercentage
+	        The percentage (100 = original size) used to scale the width of the video image will be 
+	        copied into here.
+	@param  aHeightPercentage
+	        The percentage (100 = original size) used to scale the height of the video image will be 
+	        copied into here.
+	@param  aAntiAliasFiltering
+	        A boolean indicating if anti-aliasing filtering should be used. ETrue if anti-aliasing 
+	        filtering is being used, EFalse if not.
+
+	@since 7.0s
+	*/
+	virtual void MvpcGetScaleFactorL(TReal32& aWidthPercentage, TReal32& aHeightPercentage, TBool& aAntiAliasFiltering) = 0;
+
+	/**
+	Selects a region of the video image to be displayed.
+
+	@param  aCropRegion
+	        The dimensions of the crop region, relative to the video image.
+
+	@since  7.0s
+	*/
+	virtual void MvpcSetCropRegionL(const TRect& aCropRegion) = 0;
+
+	/**
+	Gets the crop region currently applied to the image
+
+	@param  aCropRegion
+	        The dimensions of the crop region, relative to the video image. If no crop region has 
+	        been applied, the full dimensions of the video image will be returned.
+
+	@since  7.0s
+	*/
+	virtual void MvpcGetCropRegionL(TRect& aCropRegion) = 0;
+	};
+
+/**
+@publishedAll
+@released
+
+Mixin class to be derived from controller plugins that could support the video record controller
+custom commands.
+*/
+class MMMFVideoControllerCustomCommandImplementor
+	{
+public:
+
+	/**
+	Gets the frame size of the clip.
+
+	@param  aVideoFrameSize
+	        The frame size, in pixels.
+
+	@since  7.0s
+	*/
+	virtual void MvcGetVideoFrameSizeL(TSize& aVideoFrameSize)=0;
+
+	/**
+	Gets the audio type.
+
+	@param  aCodec
+	        The FourCC of the audio codec.
+
+	@since  7.0s
+	*/
+	virtual void MvcGetAudioCodecL(TFourCC& aCodec)=0;
+
+	/**
+	Gets the video bit rate.
+
+	@param  aBitRate
+	        The bit rate of the video stream. If this value is KMMFVariableVideoBitRate it signifies
+	        a variable bit rate.
+
+	@since  7.0s
+	*/
+	virtual void MvcGetVideoBitRateL(TInt& aBitRate)=0;
+
+	/**
+	Gets the audio bit rate.
+
+	@param  aBitRate
+	        The bit rate of the audio stream.
+
+	@since  7.0s
+	*/
+	virtual void MvcGetAudioBitRateL(TInt& aBitRate)=0;
+
+	/**
+	Sets the frame rate of the clip.
+
+	@param  aFramesPerSecond
+	        The number of frames per second.
+
+	@since  7.0s
+	*/
+	virtual void MvcSetFrameRateL(TReal32 aFramesPerSecond)=0;
+
+	/**
+	Gets the frame rate of the clip.
+
+	@param  aFramesPerSecond
+	        The number of frames per second, filled in by the controller plugin.
+
+	@since  7.0s
+	*/
+	virtual void MvcGetFrameRateL(TReal32& aFramesPerSecond)=0;
+
+	/**
+	Gets the supported sink video types.
+
+	@param  aMimeType
+	        The supported data types.
+
+	@since  7.0s
+	*/
+	virtual void MvcGetVideoMimeTypeL(TDes8& aMimeType)=0;
+	};
+
+
+/**
+@publishedAll
+@released
+
+Custom command parser class to be used by controller plugins wishing to support
+video controller commands.
+
+The controller plugin must be derived from MMMFVideoControllerCustomCommandImplementor
+to use this class.
+
+The controller plugin should create an object of this type and add it to the list of custom
+command parsers in the controller framework.  See the following example code for details.
+
+@code
+void CMMFAudioController::ConstructL()
+	{
+	// Construct custom command parsers
+	CMMFAudioPlayDeviceCustomCommandParser* audPlayDevParser = CMMFAudioPlayDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audPlayDevParser);
+	AddCustomCommandParserL(*audPlayDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audPlayDevParser
+
+	CMMFAudioRecordDeviceCustomCommandParser* audRecDevParser = CMMFAudioRecordDeviceCustomCommandParser::NewL(*this);
+	CleanupStack::PushL(audRecDevParser);
+	AddCustomCommandParserL(*audRecDevParser); //parser now owned by controller framework
+	CleanupStack::Pop();//audRecDevParser
+
+etc.
+	}
+@endcode
+
+@since 7.0s
+
+*/
+class CMMFVideoControllerCustomCommandParser : public CMMFCustomCommandParserBase
+	{
+public:
+
+	/**
+	Creates a new custom command parser capable of handling video controller commands.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@return	A pointer to the object created.
+
+	@since  7.0s
+	*/
+	IMPORT_C static CMMFVideoControllerCustomCommandParser* NewL(MMMFVideoControllerCustomCommandImplementor& aImplementor);
+
+	/**
+	Destructor.
+
+	@since  7.0s
+	*/
+	IMPORT_C ~CMMFVideoControllerCustomCommandParser();
+
+	/**
+	Handles a request from the client. Called by the controller framework.
+
+	@param  aMessage
+	        The message to be handled.
+
+	@since  7.0s
+	*/
+	void HandleRequest(TMMFMessage& aMessage);
+private:
+
+	/**
+	Constructor.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@since  7.0s
+	*/
+	CMMFVideoControllerCustomCommandParser(MMMFVideoControllerCustomCommandImplementor& aImplementor);
+	// Internal request handling methods.
+	void DoHandleRequestL(TMMFMessage& aMessage);
+	TBool DoGetAudioCodecL(TMMFMessage& aMessage);
+
+	TBool DoGetAudioBitRateL(TMMFMessage& aMessage);
+	TBool DoGetVideoBitRateL(TMMFMessage& aMessage);
+	TBool DoGetVideoFrameSizeL(TMMFMessage& aMessage);
+	TBool DoSetFrameRateL(TMMFMessage& aMessage);
+	TBool DoGetFrameRateL(TMMFMessage& aMessage);
+	TBool DoGetVideoMimeTypeL(TMMFMessage& aMessage);
+private:
+	/** 
+	The object that implements the video record controller interface 
+	*/
+	MMMFVideoControllerCustomCommandImplementor& iImplementor;
+	};
+
+/**
+@publishedAll
+@released
+
+Custom command parser class to be used by controller plugins wishing to support video play 
+controller commands.
+
+The controller plugin must be derived from MMMFVideoPlayControllerCustomCommandImplementor to use 
+this class. The controller plugin should create an object of this type and add it to the list of 
+custom command parsers in the controller framework.
+*/
+class CMMFVideoPlayControllerCustomCommandParser : public CMMFCustomCommandParserBase
+	{
+public:
+
+	/**
+	Creates a new custom command parser capable of handling video controller commands.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@return A pointer to the object created.
+
+	@since  7.0s
+	*/
+	IMPORT_C static CMMFVideoPlayControllerCustomCommandParser* NewL(MMMFVideoPlayControllerCustomCommandImplementor& aImplementor);
+
+	/**
+	Destructor.
+
+	@since  7.0s
+	*/
+	IMPORT_C ~CMMFVideoPlayControllerCustomCommandParser();
+
+	/**
+	Handles a request from the client. Called by the controller framework.
+
+	@param  aMessage
+	        The message to be handled.
+
+	@since  7.0s
+	*/
+	void HandleRequest(TMMFMessage& aMessage);
+private:
+	/**
+	Constructor.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@since  7.0s
+	*/
+	CMMFVideoPlayControllerCustomCommandParser(MMMFVideoPlayControllerCustomCommandImplementor& aImplementor);
+	// Internal request handling methods.
+	void DoHandleRequestL(TMMFMessage& aMessage);
+	TBool DoRequestFrameL(TMMFMessage& aMessage);
+	TBool DoGetFrameL(TMMFMessage& aMessage);
+	TBool DoSetDisplayWindowL(TMMFMessage& aMessage);
+	TBool DoUpdateDisplayRegionL(TMMFMessage& aMessage);
+	TBool DoGetAudioEnabledL(TMMFMessage& aMessage);
+	TBool DoDirectScreenAccessEventL(TMMFMessage& aMessage);
+	TBool DoPlayL(TMMFMessage& aMessage);
+	TBool DoRefreshFrameL(TMMFMessage& aMessage);
+	TBool DoGetLoadingProgressL(TMMFMessage& aMessage);
+	TBool DoPrepareL(TMMFMessage& aMessage);
+	TBool DoSetRotationL(TMMFMessage& aMessage);
+	TBool DoGetRotationL(TMMFMessage& aMessage);
+	TBool DoSetScaleFactorL(TMMFMessage& aMessage);
+	TBool DoGetScaleFactorL(TMMFMessage& aMessage);
+	TBool DoSetCropRegionL(TMMFMessage& aMessage);
+	TBool DoGetCropRegionL(TMMFMessage& aMessage);
+
+
+private:
+	/** 
+	The object that implements the video record controller interface 
+	*/
+	MMMFVideoPlayControllerCustomCommandImplementor& iImplementor;
+	CMMFVideoFrameMessage* iVideoFrameMessage;
+	};
+
+/**
+@publishedAll
+@released
+
+Custom command parser class to be used by controller plugins wishing to support video record 
+controller commands.
+
+The controller plugin must be derived from MMMFVideoRecordControllerCustomCommandImplementor to use 
+this class. The controller plugin should create an object of this type and add it to the list of 
+custom command parsers in the controller framework.
+*/
+class CMMFVideoRecordControllerCustomCommandParser : public CMMFCustomCommandParserBase
+	{
+public:
+
+	/**
+	Creates a new custom command parser capable of handling video controller commands.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@return A pointer to the object created.
+
+	@since  7.0s
+	*/
+	IMPORT_C static CMMFVideoRecordControllerCustomCommandParser* NewL(MMMFVideoRecordControllerCustomCommandImplementor& aImplementor);
+
+	/**
+	Destructor.
+
+	@since  7.0s
+	*/
+	IMPORT_C ~CMMFVideoRecordControllerCustomCommandParser();
+
+	/**
+	Handles a request from the client. Called by the controller framework.
+
+	@param  aMessage
+	        The message to be handled.
+
+	@since  7.0s
+	*/
+	void HandleRequest(TMMFMessage& aMessage);
+private:
+	/**
+	Constructor.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@since  7.0s
+	*/
+	CMMFVideoRecordControllerCustomCommandParser(MMMFVideoRecordControllerCustomCommandImplementor& aImplementor);
+	// Internal request handling methods.
+	void DoHandleRequestL(TMMFMessage& aMessage);
+	TBool DoSetVideoFormatL(TMMFMessage& aMessage);
+	TBool DoSetAudioBitRateL(TMMFMessage& aMessage);
+	TBool DoSetVideoBitRateL(TMMFMessage& aMessage);
+	TBool DoSetVideoCodecL(TMMFMessage& aMessage);
+	TBool DoSetAudioCodecL(TMMFMessage& aMessage);
+	TBool DoAddMetaDataEntryL(TMMFMessage& aMessage);
+	TBool DoRemoveMetaDataEntryL(TMMFMessage& aMessage);
+	TBool DoReplaceMetaDataEntryL(TMMFMessage& aMessage);
+	TBool DoSetMaxFileSizeL(TMMFMessage& aMessage);
+	TBool DoSetAudioEnabledL(TMMFMessage& aMessage);
+	TBool DoSetVideoFrameSizeL(TMMFMessage& aMessage);
+	TBool DoPrepareL(TMMFMessage& aMessage);
+	TBool DoSetCameraHandleL(TMMFMessage& aMessage);
+	TBool DoGetRecordTimeAvailableL(TMMFMessage& aMessage);
+
+	TBool DoGetSupportedSinkAudioTypesL(TMMFMessage& aMessage);
+	TBool DoGetSupportedSinkVideoTypesL(TMMFMessage& aMessage);
+
+	TInt32 DoCreateBufFromCDesC8ArrayL(CDesC8Array& aArray);
+	TBool DoCopyCDesC8ArrayDataL(TMMFMessage& aMessage);
+
+	TBool DoCopyFourCCArrayDataL(TMMFMessage& aMessage);
+	void DoCreateBufFromFourCCArrayL(RArray<TFourCC>& aArray);
+	TBool DoGetAudioEnabledL(TMMFMessage& aMessage); // (INC23777)
+
+private:
+	/** 
+	The object that implements the video record controller interface 
+	*/
+	MMMFVideoRecordControllerCustomCommandImplementor& iImplementor;
+	CBufFlat* iDataCopyBuffer;
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+Client class to allow the client to specify DRM Intent.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+
+@since  7.0s
+*/
+class RMMFVideoDRMExtCustomCommands : public RMMFCustomCommandsBase
+	{
+public:
+
+	/**
+	Constructor.
+
+	@param  aController
+	        The client side controller object to be used by this custom command interface.
+
+	@since  7.0s
+	*/
+	IMPORT_C RMMFVideoDRMExtCustomCommands(RMMFController& aController);
+
+	/**
+	Gets a frame previously requested from the controller.
+
+	@param  aBitmap
+	        The handle of bitmap to retrieve frame to.
+	@param  aIntent
+	        The DRM Intent to pass in.
+	@param  aStatus
+	        The active object to call back on.
+	*/
+	IMPORT_C void GetFrame(CFbsBitmap& aBitmap, ContentAccess::TIntent aIntent, TRequestStatus& aStatus);
+
+private:
+	TPckgBuf<TMMFVideoConfig> iConfigPackage;
+	TPckgBuf<ContentAccess::TIntent> iIntentPackage;
+	};
+
+
+
+/**
+@publishedAll
+@released
+
+Mixin class to be derived from controller plugins that could support the DRM Intent
+custom commands.
+*/
+class MMMFVideoDRMExtCustomCommandImplementor
+	{
+public:
+
+	/**
+	Gets a frame previously requested from the controller.
+
+	@param  aVideoFrame
+	        The callback interface to allow the caller to retrieve a bitmap.
+	@param  aIntent
+	        The DRM Intent to supply.
+	*/
+	virtual void MvdeGetFrameL(MMMFVideoFrameMessage& aVideoFrame, ContentAccess::TIntent aIntent)=0;
+	};
+
+
+/**
+@publishedAll
+@released
+
+Client class to provide DRM extensions to video controllers.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+*/
+class CMMFVideoDRMExtCustomCommandParser : public CMMFCustomCommandParserBase
+	{
+public:
+
+	/**
+	Creates a new custom command parser capable of DRM Intent controller commands.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@return A pointer to the object created.
+
+	@since  7.0s
+	*/
+	IMPORT_C static CMMFVideoDRMExtCustomCommandParser* NewL(MMMFVideoDRMExtCustomCommandImplementor& aImplementor);
+
+	/**
+	Destructor.
+
+	@since  7.0s
+	*/
+	IMPORT_C ~CMMFVideoDRMExtCustomCommandParser();
+
+	/**
+	Handles a request from the client. Called by the controller framework.
+
+	@param  aMessage
+	        The message to be handled.
+
+	@since  7.0s
+	*/
+	void HandleRequest(TMMFMessage& aMessage);
+
+private:
+	/**
+	Constructor.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+	@since  7.0s
+	*/
+	CMMFVideoDRMExtCustomCommandParser(MMMFVideoDRMExtCustomCommandImplementor& aImplementor);
+	// Internal request handling methods.
+
+	void DoGetFrameL(TMMFMessage& aMessage);
+
+private:
+	MMMFVideoDRMExtCustomCommandImplementor& iImplementor;
+	CMMFVideoFrameMessage* iVideoFrameMessage;
+	};
+
+/**
+@publishedAll
+@released
+
+Client class to allow the client to register notification .
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+
+@since  7.0s
+*/
+class RMMFResourceNotificationCustomCommands : public RMMFCustomCommandsBase
+	{
+public:
+	/**
+	Constructor.
+
+	@param  aController
+	        The client side controller object to be used by this custom command interface.
+
+	@since  7.0s
+	*/
+	IMPORT_C RMMFResourceNotificationCustomCommands(RMMFController& aController);
+	
+	/**
+	Registers the Event for Notification when resource is avaliable.
+
+	@param aEventType
+		The Event to notify the client.
+		
+	@param aNotificationRegistrationData
+		Notification registration specific data.
+
+	@return An error code indicating if the registration was successful. KErrNone on success, 
+		otherwise another of the system-wide error codes.
+	*/
+	IMPORT_C TInt RegisterAsClient(TUid aEventType,const TDesC8& aNotificationRegistrationData);
+	
+	/**
+	Cancels the registered notification event.
+
+	@param  aEventType
+		The Event to notify the client.
+		
+	@return An error code indicating if the cancel registration was successful. KErrNone on success, 
+		otherwise another of the system-wide error codes.
+	*/
+	IMPORT_C TInt CancelRegisterAsClient(TUid aEventType);
+	
+	/**
+	Gets the notification data for the event.
+	
+	@param  aEventType
+		The Event to notify the client.
+		
+	@param aNotificationData
+		The Notification data for the client to resume the play.
+		
+	@return An error code indicating if the get notification data was successful. KErrNone on success, 
+		otherwise another of the system-wide error codes.
+	*/
+	IMPORT_C TInt GetResourceNotificationData(TUid aEventType,TDes8& aNotificationData);
+	
+	/**
+	Waits for the client to resume the play even after the default timer expires.
+
+	@return An error code indicating if the registration was successful. KErrNone on success, 
+			otherwise any of the system-wide error codes.
+	*/
+	IMPORT_C TInt WillResumePlay();
+	};
+
+/**
+@publishedAll
+@released
+
+Mixin class to be derived from controller plugins that could support the audio resource notification
+custom commands.
+*/
+class MMMFResourceNotificationCustomCommandImplementor
+	{
+public:
+	/**
+	Registers the Event for Notification when resource is available.
+
+	@param aEventType
+		The event which the client is notified of.
+		
+	@param aNotificationRegistrationData
+		Notification registration specific data, which has been reserved for future use.
+		
+	@leave	This method may leave with one of the system-wide error codes.  KErrNotReady if there is no
+			data sink.
+	*/
+	virtual void MarnRegisterAsClientL(TUid aEventType,const TDesC8& aNotificationRegistrationData) = 0;
+	
+	/**
+	Cancels the registered notification event.
+
+	@param  aEventType
+		The event to cancel.
+		
+	@leave This method may leave with one of the system-wide error codes.  KErrNotReady if there is no
+			data sink.
+	*/
+	virtual void MarnCancelRegisterAsClientL(TUid aEventType) = 0;
+	
+	/**
+	Gets the notification data for the event.
+	
+	@param  aEventType
+		The event which the client is notified of.
+		
+	@param aNotificationData
+		The Notification data for the client to resume playing.
+		
+	@leave This method may leave with one of the system-wide error codes.  KErrNotReady if there is no
+			data sink, KErrArgument if unable to provide the notification data.
+	*/
+	virtual void MarnGetResourceNotificationDataL(TUid aEventType,TDes8& aNotificationData) = 0;
+	
+	/**
+	Waits for the client to resume the play even after the default timer expires.
+		
+	@leave This method may leave with one of the system-wide error codes.  KErrNotReady if there is no
+			data sink.
+	*/
+	virtual void MarnWillResumePlayL() = 0;
+	};
+
+/**
+@publishedAll
+@released
+
+Client class to provide Audio resource notification controllers.
+
+The class uses the custom command function of the controller plugin, and removes the necessity
+for the client to formulate the custom commands.
+*/
+class CMMFResourceNotificationCustomCommandParser: public CMMFCustomCommandParserBase
+	{
+public:	
+	/**
+	Creates a new custom command parser capable of handling resource notification controller commands.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@return A pointer to the object created.
+
+	@since  7.0s
+	*/
+	IMPORT_C static CMMFResourceNotificationCustomCommandParser* NewL(MMMFResourceNotificationCustomCommandImplementor& aImplementor);
+	
+	/**
+	Destructor.
+
+	@since  7.0s
+	*/
+	IMPORT_C ~CMMFResourceNotificationCustomCommandParser();
+	
+	/**
+	Handles a request from the client. Called by the controller framework.
+
+	@param  aMessage
+	        The message to be handled.
+
+	@since  7.0s
+	*/
+	void HandleRequest(TMMFMessage& aMessage);
+
+private:
+	/**
+	Constructor.
+
+	@param  aImplementor
+	        A reference to the controller plugin that owns this new object.
+
+	@since  7.0s
+	*/
+	CMMFResourceNotificationCustomCommandParser(MMMFResourceNotificationCustomCommandImplementor& aImplementor);
+	void DoHandleRequestL(TMMFMessage& aMessage);
+	// Internal request handling methods.
+	TBool DoRegisterAsClientL(TMMFMessage& aMessage);
+	TBool DoCancelRegisterAsClientL(TMMFMessage& aMessage);
+	TBool DoGetResourceNotificationDataL(TMMFMessage& aMessage);
+	TBool DoWillResumePlayL(TMMFMessage& aMessage);
+private:
+    MMMFResourceNotificationCustomCommandImplementor& iImplementor;
+	};
+
+
+
+#endif