multimediacommscontroller/mmccsubcontroller/inc/mccsymstreambase.h
changeset 0 1bce908db942
child 49 64c62431ac08
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccsubcontroller/inc/mccsymstreambase.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,565 @@
+/*
+* Copyright (c) 2004-2008 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:    Provides a baseclass for symmetric subthread streams
+*
+*/
+
+
+
+#ifndef MCCSYMSTREAMBASE_H
+#define MCCSYMSTREAMBASE_H
+
+//  INCLUDES
+#include <e32base.h>
+
+#include "mccinternalcodecs.h"
+#include "mmccevents.h"
+
+
+// FORWARD DECLARATIONS
+class TMMFPrioritySettings;
+class CMccDataPathBase;
+class MDataSink;
+class MDataSource;
+class CMccRtpManager;
+class CMMFDevSound;
+class MMccResources;
+class CMccMultiplexer;
+class CMccRtpMediaClock;
+class TMccCryptoContext;
+
+// CLASS DECLARATION
+
+/**
+*  Mcc Symmetric subthread stream baseclass
+*
+*  @lib Mccsubthreads.lib
+*  @since Series 60 3.0
+*/
+NONSHARABLE_CLASS( CMccSymStreamBase ) : public CBase, 
+        public MAsyncEventHandler
+    {
+    public: // Enumerations
+    
+        enum TStreamState
+            {
+            EStateNone = 0,
+            EStatePrepared = 1,
+            EStateStreaming = 2,
+            EStatePaused = 3,
+            EStateStopped = 4
+            };
+    
+        enum TCodecState
+            {
+            EStateCodecNone = 0,
+            EStateCodecNegotiated = 1,
+            EStateCodecPrepared = 2,
+            EStateCodecLoaded = 3,
+            EStateCodecLoadedAndUpdating = 4
+            };
+            
+    public: // Constructors and destructor
+
+        /**
+        * Destructor.
+        */
+        virtual ~CMccSymStreamBase();
+        
+    public: // Functions from MAsyncEventHandler
+        
+		TInt SendEventToClient( const TMMFEvent& aEvent );
+
+    public: // New functions
+    
+        /**
+        * Returns the streams identifier
+        * @since Series 60 3.0
+        * @param None
+        * @return TInt stream identifier
+        */
+        inline TUint32 MccStreamId()
+            {
+            return iMccStreamId;
+            };
+    
+        /**
+        * Sets the priority settings for this stream
+        * @since Series 60 3.0
+        * @param aPriority MMF Priority settings
+        * @return void
+        */
+        virtual void SetPrioritySettingsL( 
+                const TMMFPrioritySettings& aPriority ) = 0;
+                
+        /**
+        * Adds the sink and source to the stream
+        * @since Series 60 3.0
+        * @param aDatasink MDataSink
+        * @param aDatasource MDataSource
+        * @return void
+        */
+        virtual void AddSinkAndSourceL( MDataSink* aDatasink, 
+                MDataSource* aDatasource ) = 0;
+                
+        /**
+        * Loads a codec in the stream
+        * @since Series 60 3.0
+        * @param aCodecInfo TMccCodecInfo
+        * @return void
+        */
+        virtual void LoadCodecL( const TMccCodecInfo& aCodecInfo,
+                                 const TDesC8& aFmtp ) = 0;
+        
+        /**
+        * Primes the audio stream ready
+        * @since Series 60 3.0
+        * @param None
+        * @return void
+        */
+        virtual void PrimeL( const TUint32 aEndpointId ) = 0;
+        
+        /**
+        * Starts the audio streaming
+        * @since Series 60 3.0
+        * @param None
+        * @return void
+        */
+        virtual void PlayL( const TUint32 aEndpointId,
+        					TBool aStreamPaused, 
+                            TBool aEnableRtcp ) = 0;
+        
+        /**
+        * Pauses the audio streaming
+        * @since Series 60 3.0
+        * @param None
+        * @return void
+        */
+        virtual void PauseL( const TUint32 aEndpointId,
+        					 TBool aEnableRtcp ) = 0;
+        
+        /**
+        * Resumes the audio streaming
+        * @since Series 60 3.0
+        * @param None
+        * @return void
+        */
+        virtual void ResumeL( const TUint32 aEndpointId,
+        					  TBool aEnableRtcp ) = 0;
+        
+        /**
+        * Stops the audio streaming
+        * @since Series 60 3.0
+        * @param None
+        * @return void
+        */
+        virtual void StopL( const TUint32 aEndpointId ) = 0;
+        
+        /**
+        * Sets the current record gain
+        * @since Series 60 3.0
+        * @param aGain New gain
+        * @return void
+        */
+        void SetGainL( TInt aGain );
+        
+        /**
+        * Sets the current playback volume
+        * @since Series 60 3.0
+        * @param aVolume New volume
+        * @return void
+        */
+        void SetVolumeL( TInt aVolume );
+        
+        /**
+        * Returns the maximum volume
+        * @since Series 60 3.0
+        * @param None
+        * @return TInt
+        */
+        TInt MaxVolumeL();
+        
+        /**
+        * Returns the maximum gain
+        * @since Series 60 3.0
+        * @param None
+        * @return TInt
+        */
+        TInt MaxGainL();
+        
+        /**
+        * Returns the current volume
+        * @since Series 60 3.0
+        * @param None
+        * @return TInt
+        */
+        TInt VolumeL();
+        
+        /**
+        * Returns the current gain
+        * @since Series 60 3.0
+        * @param None
+        * @return TInt
+        */
+        TInt GainL();
+        
+        /**
+        * Resets Jitterbuffer
+        * @since Series 60 3.0
+        * @param None
+        * @return void
+        */
+        virtual void ResetCountersL() = 0;
+        
+        /**
+        * Sets the current record/play balance depending on the stream type
+        * @since Series 60 3.0
+        * @param aLeftbal Left balance
+        * @param aRightbal Right balance
+        * @return void
+        */
+        virtual void SetBalanceL( TInt aLeftbal, TInt aRightbal ) = 0;
+        
+        /**
+        * Reuturns the current record/play balance depending on the stream type
+        * @since Series 60 3.0
+        * @param aLeftbal Left balance
+        * @param aRightbal Right balance
+        * @return void
+        */
+        virtual void GetBalanceL( TInt& aLeftbal, TInt& aRightbal ) = 0;
+        
+        /**
+        * Sends a media event in a uplink stream. Default implementation will
+        * leave with error code KErrNotSupported
+        * @since Series 60 3.0
+        * @param aEvent Event to be sent
+        * @return void
+        */
+        virtual void SendMediaSignalL( const TMccEvent& aEvent );
+
+        /**
+        * Sends RTCP receiver report to uplink if possible.
+        * @param none
+        * @return One of the standard system-wide error codes.
+        */
+        virtual void SendRTCPReceiverReportL();
+
+        /**
+        * Sends RTCP sender report to uplink if possible.
+        * @param none
+        * @return One of the standard system-wide error codes.
+        */
+        virtual void SendRTCPSenderReportL();
+
+        /**
+        * Sends Non-RTCP data to uplink if possible.
+        * @param aData - [input] Data to send
+        * @return One of the standard system-wide error codes.
+        */
+        virtual void SendRTCPDataL( const TDesC8& aData );
+        
+        /**
+        * Starts inactivity timer for a stream in a given session.
+        * @since Series 60 3.0
+        * @param aMessage Message from client
+        * @return TBool Was function Sync/Async
+        */
+        virtual void StartInactivityTimerL( TUint32 aTimeoutTime );
+
+        /**
+        * Stops inactivity timer for a stream in a given session.
+        * @since Series 60 3.0
+        * @param aMessage Message from client
+        * @return TBool Was function Sync/Async
+        */
+        virtual void StopInactivityTimerL();
+        
+        virtual void GetSSRCL( TUint32& aSSRCValue ) = 0;
+
+        /**
+        * Function for dynamic bitrate change. This is used only for AMR
+        * encoder, but this will trap the call to DoChangeBitrateL() function
+        * which will be inherited by subclasses.
+        * @param aBitrate New encoder bitrate
+        * @return TInt System-wide error code
+        */
+        TInt ChangeBitrate( TInt aBitrate );
+        
+        /**
+        * Fetches FMTP
+        * @since Series 60 3.0
+        */
+        void GetFmtpL( TDes8& aFmtp );
+
+        /**
+        * Fetches codec info
+        * @since Series 60 3.0
+        */
+        virtual void GetCodecL( TMccCodecInfo& aCodec );
+        
+        /**
+        *
+        */
+        virtual TBool IsUplink() = 0;
+        
+        /**
+        *
+        */
+        virtual void StandByL() = 0;
+        
+        /**
+        *
+        */
+        virtual void SetAudioRouteL( TUint32 aRoutingDestination );
+        
+        /**
+        *
+        */
+        virtual void GetAudioRouteL( TUint32& aRoutingDestination );
+
+        /**
+        *
+        */
+        MDataSink* DataSink() { return iDatasink; };
+
+        /**
+        *
+        */
+        MDataSource* DataSource() { return iDatasource; };
+        
+        /**
+        *
+        */
+        const TUid Type();
+        
+        /**
+        *
+        */
+        TBool LocalStream() const;
+        
+        /**
+        *
+        */
+        TBool StandbyStream() const;
+        
+        /**
+        *
+        */
+        void InformStreamStateChange( TMccEventType aEventType,
+                                      TUint32 aEndpointId );
+
+        /**
+         * Bind context into stream.
+         * @since Series 60 3.2
+         * @param aEndpointId The endpoint id
+         * @param aContextParams Crypto context
+         * @return void
+         */	
+        virtual void BindContextIntoStreamL( TUint32 aEndpointId,
+                                             const TMccCryptoContext& aContextParams );
+        
+        /**
+         * Remove crypto context.
+         * @since Series 60 3.2
+         * @param aEndpointId The endpoint id, If 0
+         * will remove context from all existing endpoints
+         * @return Error code.
+         */                                     
+        virtual TInt RemoveContext( TUint32 aEndpointId );
+
+    protected:  // New functions 
+    
+        /**
+        * Gets sink of the multiplexer
+        */
+        virtual MDataSink* MultiplexerSink();
+    
+        /**
+        * Sets the state of the stream
+        * @since Series 60 3.0
+        * @param TStreamState New state
+        * @return void
+        */
+        TBool SetStateL( TStreamState aState, TUint32 aEndpointId );
+
+        /**
+        * Worker function for dynamic bitrate change
+        * @since Series 60 3.0
+        * @param aBitrate New bitrate
+        * @return void
+        */
+        virtual void DoChangeBitrateL( TInt aBitrate );
+        
+        /**
+        * Returns the current state of the stream
+        * @since Series 60 3.0
+        * @param None
+        * @return TStreamState
+        */
+        TStreamState CurrentState();
+        
+        /**
+        * Standby activation/deactivation
+        */
+        void HandleStandby( TUint32 aEndpointId, TBool aStreamPaused );
+        
+        /**
+        * Send streaming events of uncontrolled/MMF endpoints.
+        */
+        TInt SendStreamEventToClient( TMccEventType aEventType, 
+                                      TUint32 aEndpointId,
+                                      TInt aError = KErrNone );
+        
+        /**
+        * Updates multiplexer.
+        */
+        void HandleMultiplexerL();
+        
+        /**
+        * Updates sink/source if needed.
+        */
+        void HandleSpecialSinksAndSources();
+        
+        /**
+        *
+        */
+        void MultiplexerCleanup();
+        
+        void DoPrimeL();
+        
+        void DoPlayL();
+        
+        void DoPauseL();
+        
+        void DoResumeL();
+        
+        void DoStopL();
+
+        void ParsePayloadTypesL( RArray<TUint>& aPayloadTypes,
+            const TMccCodecInfo& aCodecInfo ) const;
+            
+        TBool IsControllingMmfEndpoint() const;
+        
+        TCodecState CurrentCodecState() const;
+        
+        void SetCodecState( TCodecState aState );
+        
+        void UpdateCodecLoadingPermission( TBool aLoadingAllowed );
+        
+        TBool CodecLoadingAllowed() const;
+        
+        TBool IsControlled( TUint32 aEndpointId ) const;
+        
+        TBool IsCodecOperationAllowed() const;
+        
+        void ClearStateChangeEvent();
+
+        
+    public: // Functions from base classes
+		 // Set priority settings  
+    	void SetMMFPriority (
+                const TMMFPrioritySettings& aPriority );
+
+    protected:  // Constructor
+
+        /**
+        * Constructor
+        */
+        CMccSymStreamBase( TUint32 aMccStreamId, 
+                MAsyncEventHandler* aEventhandler, 
+                MMccResources* aMccResources,
+                CMccRtpManager* aManager, 
+                TInt aStreamType );
+        
+    private:    // Consturctor
+        
+        /**
+        * Private constructor
+        */
+        inline CMccSymStreamBase() : iDatapath( NULL ), iEventhandler( NULL ),
+            iDatasink( NULL ), iDatasource( NULL ), 
+            iCodecInfo( TMccCodecInfo() ), iRtpmanager( NULL ), 
+            iSoundDevice( NULL ), iMccStreamId( (TUint) KErrNotFound ), 
+            iState ( EStateNone )
+            {   };
+
+    protected:  // Data
+    
+        // Streams datapath
+        CMccDataPathBase* iDatapath;
+        
+        // Eventhandler for the stream
+        MAsyncEventHandler* iEventhandler;
+        
+        MMccResources* iMccResources;
+        
+        // Datasink
+        MDataSink* iDatasink;
+        
+        // Datasource
+        MDataSource* iDatasource;
+        
+        // Codec information
+        TMccCodecInfo iCodecInfo;
+
+        // fmtp string
+        HBufC8* iFmtpAttr;
+        
+        // RTP Manager instance
+        CMccRtpManager* iRtpmanager;
+        
+        // Devsound instance used by this stream
+        CMMFDevSound* iSoundDevice;
+
+        // Identifier of this stream
+        TUint32 iMccStreamId;
+
+        // Type of the stream        
+        TUint8 iType;
+        
+        RArray<TUint32> iControlledEndpoints;
+        
+        RArray<TUint32> iUncontrolledEndpoints;
+        
+        // Multiplexer, not owned
+        CMccMultiplexer* iMultiplexer;
+        
+        // Rtp media clock
+        CMccRtpMediaClock* iRtpMediaClock;
+        
+        TMMFPrioritySettings iPrioritySettings;
+        
+    private:    // Data
+        // Current state
+        TStreamState iState;
+        
+        TCodecState iCodecState;
+        
+        TBool iCodecLoadingAllowed;
+        
+        // Currently used state change event
+        TMccEvent iStreamStateChangeEvent;
+
+    private:    // Friend classes
+        #if defined( TEST_EUNIT )
+        friend class UT_CMccSymDlStream;
+        friend class UT_CMccSymUlStream;
+        friend class UT_CMccSymSimpleDlStream;
+        #endif
+    };
+
+#endif      // MCCSYMSTREAMBASE_H
+
+// End of File