ipappsrv_plat/media_control_api/inc/mmccinterface.h
author Stefan Karlsson <stefan.karlsson@nokia.com>
Sun, 28 Mar 2010 16:37:26 +0100
branchCompilerCompatibility
changeset 9 5d1d815214a5
parent 0 1bce908db942
child 49 64c62431ac08
permissions -rw-r--r--
Fixed "extra qualification" syntax errors.

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




#ifndef MMCCINTERFACE_H
#define MMCCINTERFACE_H

//  INCLUDES
#include <e32base.h>
#include <mmf/common/mmffourcc.h>
#include <mmf/common/mmfstandardcustomcommands.h>
#include <mmccnetworksettings.h>
#include <mmccinterfacedef.h>
#include <mmccevents.h>

// FORWARD DECLARATIONS
class CMccCodecInformation;
class CMccEvent;
class TCameraInfo;

// CONSTANTS
const TUid KUidMccInterface     = { 0x102073F7 };
const TUid KUidMccFileSink      = { 0x102747D7 };
const TUid KUidMccFileSource    = { 0x102747D5 };
const TUid KUidMccRtpSource     = { 0x1020740B };
const TUid KUidMccRtpSink       = { 0x1020740C };
const TUid KUidMccVideoSource   = { 0x102747D6 };
const TUid KUidMccVideoSink     = { 0x102747D8 };
const TUid KUidMccTranscoder    = { 0x10282897 };
const TUid KUidMccAnySource     = { 0x10283394 };
const TUid KUidMccAnySink       = { 0x10283395 };

// MACROS

// DATA TYPES

// FUNCTION PROTOTYPES

// CLASS DECLARATION

/**
*  MCC subsystem client interface. Class is used for setting up and controlling
*  multimedia streams. Details of resources needed by the cleint are unknown, 
*  hence specified in details in every session.
*
*  MCC interface is based on four components: Session, link, stream and endpoint
*  (sink or source). In order to create multimedia streams, client need to
*  construct it by using these four components. 
*
*  @lib mmccinterface.lib
*/
class CMccInterface : public CBase
{
public:  // Constructors and destructor
    /**
    * Two-phased constructor.
    * @param aObserver A callback object to receive and handle
    *                    event notifications from MCC subsystem.
    * @return CMccInterface* Pointer to the interface object created
    */
    IMPORT_C static CMccInterface* NewL( MMccCtrlObserver& aObserver );

    /**
    * Destructor.
    */
    virtual ~CMccInterface();

public: // New functions

    /**
    * Creates a new MCC session. The session is needed to create
    * links and streams into MCC. A single session may have any
    * number of links.
    * @param aSessionID ID of the new session if successful
    * @return KErrNone if success; otherwise system wide error code.
    */
    IMPORT_C TInt CreateSession( TUint32& aSessionId );

    /**
    * Closes MCC session. All links and streams of the session are also
    * closed.
    * @param aSessionId session ID
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt CloseSession( TUint32 aSessionId );

    /**
    * Creates a new MCC link with a remote participant. Link creates
    * new RTP session with given network settings.
    * @param aSessionId session ID
    * @param aLinkType Defines is stream Up- or Downlink
    * @param aLinkId ID of new link
    * @param aNetSettings network settings for the link
    * @return KErrNone if success; otherwise system wide error code.
    */
    IMPORT_C TInt CreateLink( TUint32 aSessionId,
                              TInt aLinkType,
                              TUint32& aLinkId,
                              TMccNetSettings& aNetSettings );

    /**
    * Closes MCC link. All streams of the link are also closed.
    * @param aSessionId session ID
    * @param aLinkId link ID
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt CloseLink( TUint32 aSessionId, TUint32 aLinkId );

    /**
    * Creates a stream into a MCC link. Constructs the datapath
    * for stream, but no media resources reserved yet.
    * @param aSessionId session where stream is created to
    * @param aLinkId link ID where stream is created to
    * @param aStreamId Stream ID for the stream created.
    * @param aStreamType type of the stream
    * @param aCodecInformation Codec information for the stream.
    * @return KErrNone if success; otherwise system wide error code.
    */
    IMPORT_C TInt CreateStream( TUint32 aSessionId, TUint32 aLinkId,
                                TUint32& aStreamId, TInt aStreamType,
                                CMccCodecInformation& aCodecInformation );

    /**
    * Prepares a stream so that it is ready to be started. Media resources
    * are reserved and RTP stream is created.
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID where stream belongs to
    * @param aStreamId ID identifying stream to be prepared
    * @param aEndpointId ID identifying endpoint of the stream to be prepared.
    *         If value 0, both endpoints prepared.
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt PrepareStream( TUint32 aSessionId, TUint32 aLinkId, 
                                 TUint32 aStreamId, TUint32 aEndpointId = 0 );

    /**
    * Starts to send/receive media stream in a given session.
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId ID identifying stream to be started
    * @param aPaused ETrue, if stream paused after start
    * @param aEndpointId ID identifying endpoint of the stream to be started.
    *         If value 0, both endpoints started.
    * @param aEnableRTCP ETrue, if RTCP sent.
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt StartStream( TUint32 aSessionId, TUint32 aLinkId, 
                               TUint32 aStreamId, TUint32 aEndpointId = 0,
                               TBool aPaused = EFalse, TBool aEnableRTCP = ETrue );

    /**
    * Pauses media stream in a given session. No RTP packets are 
    * sent/received anymore. However, RTCP packets may still be sent and
    * received.
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId ID identifying stream to be paused
    * @param aEndpointId ID identifying endpoint of the stream to be paused.
    *         If value 0, both endpoints paused.
    * @param aEnableRTCP ETrue, if RTCP sent while paused.
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt PauseStream( TUint32 aSessionId, TUint32 aLinkId, 
                               TUint32 aStreamId, TUint32 aEndpointId = 0,
                               TBool aEnableRTCP = ETrue );

    /**
    * Resumes paused media stream in a given session.
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId Stream ID identifying stream to be resumed
    * @param aEndpointId ID identifying endpoint of the stream to be resumed.
    *         If value 0, both endpoints resumed.
    * @param aEnableRTCP ETrue, if RTCP sent while playing.
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt ResumeStream( TUint32 aSessionId, TUint32 aLinkId, 
                                TUint32 aStreamId, TUint32 aEndpointId = 0,
                                TBool aEnableRTCP = ETrue );

    /**
    * Stops sending/receiving media stream in a given session.
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId Stream ID identifying stream to be stopped
    * @param aEndpointId ID identifying endpoint of the stream to be stopped.
    *         If value 0, both endpoints stopped.
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt StopStream( TUint32 aSessionId, TUint32 aLinkId, 
                               TUint32 aStreamId, TUint32 aEndpointId = 0 );

    /**
    * Deletes media stream in a given session.
    * @param aSessionId  session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId  Stream ID identifying stream to be deleted
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt DeleteStream( TUint32 aSessionId, TUint32 aLinkId, 
                                TUint32 aStreamId  );

    /**
    * Starts inactivity timer for a stream in a given session.
    * If RTP data is not received in given tive, inactivy
    * event is sent to client. In case of timeout, inactivity
    * timer is stopped. Client may restart the timer is needed.
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId Stream ID identifying stream
    * @param aTimeoutTime timeout value in microseconds
    * @param aEndpointId ID identifying endpoint of the stream to be monitored.
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt StartInactivityTimer( TUint32 aSessionId,
                                        TUint32 aLinkId, TUint32 aStreamId,
                                        TUint32 aTimeoutTime, TUint32 aEndpointId = 0 );

    /**
    * Stops inactivity timer for a stream in a given session.
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId Stream ID identifying stream
    * @param aEndpointId ID identifying endpoint of the stream where monitoring stopped.
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt StopInactivityTimer( TUint32 aSessionId, TUint32 aLinkId,
                                       TUint32 aStreamId, TUint32 aEndpointId = 0 );

    /**
    * Set remote IP address and port number for a given session.
    * @param aSessionId session ID
    * @param aLinkId link ID
    * @param aRemoteAddr Remote address to set
    * @param aRemoteRtcpPort Remote RTCP port to set, if not RTP port +1
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt SetRemoteAddress( TUint32 aSessionId, TUint32 aLinkId,
                                    const TInetAddr& aRemoteAddr, TUint aRemoteRtcpPort = 0 );


    /**
    * Gets current codec used in a given stream.
    * @param aSessionId session ID
    * @param aLinkId Link ID
    * @param aStreamId Stream ID
    * @return Current codec used with the specified stream, ownership is transferred.
    */
    IMPORT_C CMccCodecInformation* CodecL( TUint32 aSessionId,
                                           TUint32 aLinkId,
                                           TUint32 aStreamId );

    /**
    * Sets codec to be used in a given stream.
    * @param aSessionId session ID
    * @param aLinkId Link ID
    * @param aStreamId Stream ID
    * @param aCodec Codec to be used
    * @return One of the standard system-wide error codes.
    */
    IMPORT_C TInt SetCodec( TUint32 aSessionId, TUint32 aLinkId,
                            TUint32 aStreamId,
                            CMccCodecInformation& aCodecInformation );
    
    
    /**
    * Get supported codecs by the system. Certain sinks and sources
    * however may have limitations on which codecs they support, hence
    * all these codecs may not allowed in all streams.
    * @param aCodecs An array to be filled with FourCC codes
    * @return One of the standard system-wide error codes.
    */
    TInt GetSupportedCodecs( RArray<TFourCC>& aCodecs );
                            
    /**
    * Returns array of supported codecs in the system with their default values.
    * Note that data that the aCapabilities contains before calling this function 
    * will be lost during the excecution of this function. Note also that the client
    * is responsible for the destruction of the objects contained in the
    * parameter array.
    * @param aCapabilities Codec capabilities
    * @return KErrNone if successful
    */
    IMPORT_C TInt GetCapabilities(
            RPointerArray<CMccCodecInformation>& aCapabilities ) const;

    /**
    * Returns array of supported codecs of specific sink or source. Note that data that
    * the aCapabilities contains before calling this function will be
    * lost during the excecution of this function. Note also that the client
    * is responsible for the destruction of the objects contained in the
    * parameter array.
    * @param aType, type identifier of source or sink
    * @param aStreamType type of the stream
    * @param aParam, source or sink specific param
    * @param aCapabilities Codec capabilities
    * @return KErrNone if successful
    */
    IMPORT_C TInt GetCapabilities( const TUid aType, TInt aStreamType, const TDesC8& aParam,
            RPointerArray<CMccCodecInformation>& aCapabilities );
         
    /**
    * Get Synchronization source identifier.
    * @param aSessionId session ID
    * @param aLinkId Link ID
    * @param aStreamId Stream ID
    * @param aEndpointId ID identifying endpoint of the stream.
    * @param aSSRC SSRC value
    * @return One of the standard system-wide error codes.
    */   
    IMPORT_C TInt GetSSRC ( TUint32 aSessionId,
                            TUint32 aLinkId,
                            TUint32 aStreamId,
                            TUint32 aEndpointId,
                            TUint32& aSSRC );

    /**
    * Sends media signal (e.g. DTMF,RTCP) to uplink if possible.
    * @param aEvent Event to be sent
    * @return void
    */
    IMPORT_C void SendMediaSignalL( const TMccEvent& aEvent );
    
    /**
    * Adds new sink to the session. User must later
    * call CreateStream to connect this sink to some stream.
    * @param aSinkType type identifier of the sink.
    * @param aParam initialization parameters of the sink.
    * @param aEndpointId idenfier of the created sink on return.
    * @return KErrNotFound, if sink type not found
    */
    IMPORT_C TInt AddDataSink( const TUid aSinkType, const TDesC8& aParam, 
                               TUint32& aEndpointId );

    /**
    * Adds new source to the session. User must later
    * call CreateStream to connect this source to some stream.
    * @param aSourceType type identifier of the source.
    * @param aParam initialization parameters of the source.
    * @param aEndpointId idenfier of the created source on return.
    * @return KErrNotFound, if source type not found
    */
    IMPORT_C TInt AddDataSource( const TUid aSourceType, const TDesC8& aParam,
                                 TUint32& aEndpointId );
    
    /**
    * Checks if link already exists based on local port
    * @param aSessionId session ID
    * @param aLinkId ID of the link
    * @param aNetSettings network settings for the link
    * @return ETrue if found; otherwise EFalse.
    */
    IMPORT_C TBool LinkExists( TUint32 aSessionId,
                               TUint32& aLinkId,
                               const TMccNetSettings& aNetSettings );

    /**
    * Checks if link contains streams
    * @param aSessionId session ID
    * @param aLinkId ID of the link
    * @return ETrue if found; otherwise EFalse.
    */
    IMPORT_C TBool StreamsExists( TUint32 aSessionId,
                                  TUint32 aLinkId );

    /** 
    * Gets sink or source parameter
    * @param aSessionId session where sink or source belongs to
    * @param aLinkId link ID where sink or source belongs to
    * @param aStreamId stream ID where sink or source belongs to
    * @param aEndpointId endpoint ID identifying sink or source.
    * @param aParam a parameter to get
    * @param aVal on return will contain parameter value in TPkgBuf structure
    * @return KErrNotFound if parameter was not found, KErrNone otherwise
    */
    IMPORT_C TInt GetParameter( TUint32 aSessionId, TUint32 aLinkId, 
                                TUint32 aStreamId, TUint32 aEndpointId,
                                TUint32 aParam, TDes8& aVal );

    /** 
    * Sets sink or source parameter
    * @param aSessionId session where sink or source belongs to
    * @param aLinkId link ID where sink or source belongs to
    * @param aStreamId stream ID where sink or source belongs to
    * @param aEndpointId endpoint ID identifying sink or source.
    * @param aParam a parameter to get
    * @param aVal on return will contain parameter value in TPkgBuf structure
    * @return KErrNotFound if parameter was not found, KErrNone otherwise
    */
    IMPORT_C TInt SetParameter( TUint32 aSessionId, TUint32 aLinkId, 
                                TUint32 aStreamId, TUint32 aEndpointId,
                                TUint32 aParam, const TDesC8& aVal );

    /**
    * Updates sink of the stream.
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId ID identifying stream to be updated
    * @param aEndpointId ID identifying endpoint of the stream to be updated.
    * @param aParam initialization parameters of the sink.
    * @return KErrNotFound, if sink type not found
    */
    IMPORT_C TInt UpdateDataSink( TUint32 aSessionId, TUint32 aLinkId, 
                               TUint32 aStreamId, TUint32 aEndpointId,
                               const TDesC8& aParam );

    /**
    * Updates source of the stream. 
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId ID identifying stream to be updated
    * @param aEndpointId ID identifying endpoint of the stream to be updated.
    * @param aParam initialization parameters of the source.
    * @return KErrNotFound, if source type not found
    */
    IMPORT_C TInt UpdateDataSource( TUint32 aSessionId, TUint32 aLinkId, 
                                 TUint32 aStreamId, TUint32 aEndpointId,
                                 const TDesC8& aParam );

    /**
    * Removes sink from MCC.
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId ID identifying stream to be updated
    * @param aEndpointId ID identifying endpoint of the stream to be updated.
    * @return KErrNotFound, if sink type not found
    */
    IMPORT_C TInt RemoveDataSink( TUint32 aSessionId, TUint32 aLinkId, 
                                  TUint32 aStreamId, TUint32 aEndpointId );

    /**
    * Removes source from MCC. 
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId ID identifying stream to be updated
    * @param aEndpointId ID identifying endpoint of the stream to be updated.
    * @return KErrNotFound, if source type not found
    */
    IMPORT_C TInt RemoveDataSource( TUint32 aSessionId, TUint32 aLinkId, 
                                    TUint32 aStreamId, TUint32 aEndpointId );

    /**
    * Reuses sink or source of the stream. Reused sink or source may be
    * simultaneously shared by two or more stream. It is also possible,that only one stream 
    * can use it at a time. User must later call CreateStream to connect this sink or source
    * to some stream.
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId ID identifying stream to be updated
    * @param aEndpointId ID identifying endpoint of the stream to be reused.
    * @return KErrNotFound, if endpoint not found
    */
    IMPORT_C TInt Reuse( TUint32 aSessionId, TUint32 aLinkId, 
                         TUint32 aStreamId, TUint32 aEndpointId );

    /**
    * Get the reference count of given sink or source. 
    * @param aSessionId session where stream belongs to
    * @param aLinkId link ID
    * @param aStreamId ID identifying stream to be updated
    * @param aEndpointId ID identifying endpoint of the stream to be updated.
    * @param aCount number of references using this sink or source.
    * @return KErrNotFound, if endpoint not found
    */
    IMPORT_C TInt ReferenceCount( TUint32 aSessionId, TUint32 aLinkId, 
                                  TUint32 aStreamId, TUint32 aEndpointId,
                                  TUint& aCount );

    /**
    * Get the reference count of given sink or source. 
    * @param aSessionId session where stream belongs to
    * @param aBundle new bundle to be added in the session.
    * @param aBundleId identifier of the added bundle on return.
    * @return KErrNone if successful
    */
    IMPORT_C TInt AddBundle( TUint32 aSessionId, TMccStreamBundle& aBundle, TUint32& aBundleId );

    /**
    * Get the reference count of given sink or source. 
    * @param aSessionId session where stream belongs to
    * @param aBundleId identifier of the removed bundle.
    * @return KErrNotFound, if bundle not found
    */
    IMPORT_C TInt RemoveBundle( TUint32 aSessionId, TUint32 aBundleId );

    /**
    * Get the reference count of given sink or source. 
    * @param aSessionId session where stream belongs to
    * @param aBundles an array of bundles in given session.
    * @return KErrNone if successful
    */
    IMPORT_C TInt GetBundles( TUint32 aSessionId, RArray<TMccStreamBundle>& aBundles);

    /**
    * Transcodes media file in non-realtime. Progress of transcoding
    * can be monitored through MMccCtrlObserver::MccEventReceived.
    * @param aSourceFile source file for transcoding
    * @param aDestFile destination file for transcoding
    * @param aQuality requested quality for transcoding
    * @param aSessionId session identifier for transcoding
    * @param aVideoCodec requested video parameters for transcoding, overrides aQuality parameter.
    *         Ownership is not transferred.    
    * @param aAudioCodec requested audio parameters for transcoding, overrides aQuality parameter.
    *         Ownership is not transferred.    
    * @return ETrue if succesfull; otherwise EFalse.
    */
    IMPORT_C TInt TranscodeFile( const TDesC8& aSourceFile, const TDesC8& aDestFile,
                                 TUint32 aQuality, TUint32& aSessionId,  
                                 const CMccCodecInformation* aVideoCodec = 0,
                                 const CMccCodecInformation* aAudioCodec = 0 );

    /**
    * Cancels transcoding of media file.
    * @param aSessionId session identifier for transcoding
    * @return ETrue if succesfull; otherwise EFalse.
    */
    IMPORT_C TInt CancelTranscodeFile( TUint32 aSessionId );
        
    /**
     * Requests media quality reports from an endpoint. 
     * This request is synchronous. When given media quality level triggers
     * in specified endpoint the client receives media quality report via
     * asynchronous event.
     * If the given config is not valid, KErrArgument is returned.
     * The request can be cancelled with function CancelMediaQualityRequestL,
     * @since Series 60 3.2
     * @param aConfig Media quality request configuration
     * @return Error code
     */
    IMPORT_C TInt MediaQualityRequest( const TMccMediaQualityConfig& aConfig );

    /**
     * Cancels an outstanding media quality report.
     * If the given media quality request data contains false data, this
     * function will return KErrArgument.
     * @since Series 60 3.2
     * @param aConfig Configuration to find a outstanding media quality 
     *                request
     * @return Error code
     */
    IMPORT_C TInt CancelMediaQualityRequest( 
        const TMccMediaQualityConfig& aConfig );
     
    /**
     * Returns the reference to handle to controller plugin which interface
     * use for sending custom commands.
     * Client representation of a controller plugin for
     * the Multimedia Framework.
     * @since Series 60 3.2
     * @param aController  Controller. 
     * @return void
     */
    void GetController( RMMFController& aController );
      
private:

    /**
    * C++ default constructor.
    */
    CMccInterface();

    /**
    * By default Symbian 2nd phase constructor is private.
    */
    void ConstructL( MMccCtrlObserver& aObserver );

private:   

   /**
    * Open controller.
    * @param aControllerUid Controller uid to open.
    * @return One of the standard system-wide error codes.
    */
    void OpenControllerL( const TUid& aControllerUid );
    
    /**
    * Gets supported codecs from controller.
    * @return One of the standard system-wide error codes.
    */
    void CapabilitiesL();

    /**
    * Gets supported bit rates from the codec of the specified stream
    * @return One of the standard system-wide error codes.
    */
    TInt GetSupportedBitrates( TUint32 aSessionId,
                               TUint32 aLinkId,
                               TUint32 aStreamId,
                               RArray<TUint>& aBitrates );
                               
    /**
    */
    TInt SendRTCPReceiverReport( TUint32 aSessionId,
                                 TUint32 aLinkId,
                                 TUint32 aStreamId );
    /**
    */
    TInt SendRTCPSenderReport( TUint32 aSessionId,
                               TUint32 aLinkId,
                               TUint32 aStreamId );

    /**
    */
    TInt SendRTCPAnyData( TUint32 aSessionId,
                          TUint32 aLinkId,
                          TUint32 aStreamId,
                          const TDesC8& aData );
                          
    /**
    */
    TInt EnableViewFinder( const TDesC8& aParam );
    
    /**
    */
    TInt DisableViewFinder();
	
	/**
    */
	TInt GetViewFinderSettings( TUint32 aParam, TUint32 aEndPointId, TDes8& aVal );
                          
    /**
    */
    TCameraInfo GetCameraInfoL(TInt aDeviceIndex );
    
    /**
    */
    TInt GetNumOfCamerasL();
    
    /**
    */
    TInt GetCameraParameter( TUint32 aParam, TInt& aVal );

    /**
    */
    TInt SetCameraParameter( TUint32 aParam, TInt aVal );
    
    /**
    */
    TInt GetCameraParameter( TUint32 aParam, TReal& aVal );
    
    /**
    */
    TInt SetCameraParameter(TUint32 aParam, TReal aVal);
    
    /**
    */
	TInt SetEndpointParameter( TUint32 aParam, 
	                           TUint32 aSessionId,
                               TUint32 aLinkId,
                               TUint32 aStreamId,
                               TUint32 aEndPointId, 
                               const TDesC8& aVal );
	
	/**
	*/
	TInt GetEndpointParameter( TUint32 aParam, 
	                           TUint32 aSessionId,
                               TUint32 aLinkId,
                               TUint32 aStreamId,
                               TUint32 aEndPointId, 
                               TDes8& aVal );

    /**
    */
    TInt SetAudioRouting( TUint32 aSessionId, TUint32 aLinkId, 
                          TUint32 aStreamId, TUint32 aRoutingDestination );


    /**
    */
    TInt AudioRouting( TUint32 aSessionId, TUint32 aLinkId, 
                       TUint32 aStreamId, TUint32& aRoutingDestination );
                       
    /**
    */
    TInt Volume( TInt& aVolume ) const;


    /**
    */
    TInt MaxVolume( TUint32 aSessionId, 
                    TUint32 aLinkId, 
                    TUint32 aStreamId, 
                    TInt& aMaxVolume );
                    
    /**
    */
    TInt SetVolume( TInt aVolume );

    /**
    */
	TInt Balance( TUint32 aSessionId, 
                  TUint32 aLinkId, 
                  TUint32 aStreamId, 
                  TInt& aBalance,
                  TMccDevice aStreamType ); 

    /**
    */
	TInt SetBalance( TUint32 aSessionId, 
                     TUint32 aLinkId, 
                     TUint32 aStreamId, 
                     TInt aBalance,
                     TMccDevice aStreamType );
          
          
          
    /**
    */
	TInt GetGain( TInt& aGain ) const;

    /**
    */
	TInt SetGain( TInt aGain );

    /**
    */
	TInt MaxGain( TUint32 aSessionId, 
	              TUint32 aLinkId, 
	              TUint32 aStreamId, 
	              TInt& aMaxGain );
	              
	TInt StoreEndpointInfo( TUint32 aEndpointId, 
	                        const TMMFMessageDestination& aHandleInfo );
	
	TMMFMessageDestination FindEndpointInfo( TUint32 aEndpointId, TInt& aError );
	                       
	TInt RemoveEndpointInfo( TUint32 aEndpointId ); 
                                                                    
private:    // Data

    class TMccEndpointInfo
        {
        public:
        
            TUint32 iEndpointId;
            TMMFMessageDestination iHandleInfo;
        };
        
    static TBool EndpointInfoMatch( const TMccEndpointInfo& aInfo1, 
                                    const TMccEndpointInfo& aInfo2 );

    // Reserved for future extensions
    TAny* iReserved1;
    TInt  iReserved2;    

private:    // Data

    // Notifies about events happened in MCC plugin
    CMccEvent* iMccEvent;

    // Handle to the controller plugin for sending custom commands
    RMMFController iController;

    // Contains unique ID of controller interface
    TMMFMessageDestinationPckg iMessageDest;

    // For easier access to Audio Play Device functionality
    RMMFAudioPlayDeviceCustomCommands iAudioPlayDeviceCustomCommands;

    // For easier access to Audio Record Device functionality
    RMMFAudioRecordDeviceCustomCommands iAudioRecordDeviceCustomCommands;

    // Array for codec capabilities
    RPointerArray<CMccCodecInformation> iCodecInformation;    
    
    // Array for endpoint infos
    RArray<TMccEndpointInfo> iEndpointInfos;

private:
    #ifdef TEST_EUNIT
    friend class UT_CMccInterface;
    #endif
};

#endif /* MMCCINTERFACE_H */

// End of File