multimediacommscontroller/mmccmultiplexer/inc/mccmultiplexer.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccmultiplexer/inc/mccmultiplexer.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,327 @@
+/*
+* Copyright (c) 2004 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:    
+*  Interface   : 
+*
+*/
+
+
+
+
+#ifndef MCCMULTIPLEXER_H
+#define MCCMULTIPLEXER_H
+
+// INCLUDES
+#include <mmf/common/mmfcontrollerframework.h>
+#include "formatstatemachine.h"
+#include "mmccevents.h"
+
+// CLASS DECLARATION
+class CMMFBuffer;
+class CMccSinkItem;
+class CMMFDataBuffer;
+
+
+/**
+*
+*/ 
+class CMccMultiplexer : public CPayloadFormatRead, public MAsyncEventHandler
+    {
+    public:
+    
+        enum TMccMultiplexerState
+            {
+            ENotSet,
+            EPrepared,
+            EPlaying,
+            EResourcePaused,
+            EResourceStopped
+            };
+            
+    public:  // Constructors and destructor
+        /**
+        * Two-phased constructor.
+        * @param aSource Source of the data for the multiplexer
+        */
+        IMPORT_C static CMccMultiplexer* NewL( MDataSource* aSource );
+
+        /**
+        * Destructor.
+        */
+        IMPORT_C ~CMccMultiplexer();
+
+    public:  // New functions
+
+        IMPORT_C TInt MultiplexerSourceThreadLogon( MAsyncEventHandler& aEventHandler, 
+                                         MDataSink& aSink, 
+                                         TBool aSinkIsDecoder,
+                                         TUid aMediaType,
+                                         TBool aPassAllBuffersSink = EFalse );
+        
+        IMPORT_C TInt MultiplexerSourceThreadLogoff( MDataSink* aSink );
+        
+        IMPORT_C void SetCurrentUserL( MDataSink& aSink );
+        
+        IMPORT_C void RegClientForPayloadsL( MDataSink& aClient, 
+            const RArray<TUint>& aPayloadTypes );
+        
+    public: // From CMMFFormatDecode
+
+        /**
+        * From CMMFFormatDecode. Return number of audio streams for the given
+        * media
+        *
+        * @param    aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo
+        * @return   Number of audio streams
+        */
+        TUint Streams( TUid aMediaType ) const;
+
+        /**
+        * Return the frame time interval for the given media
+        *
+        * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo
+        *
+        * @return           Time interval in micro seconds
+        */
+        TTimeIntervalMicroSeconds FrameTimeInterval( TMediaId aMediaType ) const;
+
+        /**
+        * Return the clip duration for the given media
+        *
+        * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo
+        *
+        * @return           Clip duration in micro seconds
+        */
+        TTimeIntervalMicroSeconds Duration( TMediaId aMediaType ) const;
+        
+        TBool CanCreateSourceBuffer();
+
+        CMMFBuffer* CreateSourceBufferL( TMediaId aMediaId, TBool &aReference );
+        
+        void SuggestSourceBufferSize( TUint aSuggestedBufferSize );
+        
+    public: // From MDataSource.
+
+        TUid DataSourceType() const;
+        
+        /**
+        * From MDataSource. Read the next block of data into the
+        * given buffer.
+        *
+        * @param aBuffer    source data buffer for the data read
+        * @param aConsumer  data sink pointer
+        * @param aMediaId   contains the media type KUidMediaTypeAudio or KUidMediaTypeVideo
+        *
+        * @return
+        */
+        void FillBufferL( CMMFBuffer* aBuffer, 
+                          MDataSink* aConsumer,
+                          TMediaId aMediaId );
+
+        /**
+        * From MDataSource. Primes the source.
+        * @since Series 60 3.0
+        * @return None
+        */
+        void SourcePrimeL();
+
+        /**
+        * From MDataSource. Plays the source.
+        * @since Series 60 3.0
+        * @return None
+        */
+        void SourcePlayL();
+        
+        /**
+        * From MDataSource. Pauses the source.
+        * @since Series 60 3.0
+        * @return None
+        */
+        void SourcePauseL();
+        
+        /**
+        * From MDataSource. Stops the source.
+        * @since Series 60 3.0
+        * @return None
+        */
+        void SourceStopL();
+
+        /**
+        * Return the four CC code for the given media
+        *
+        * @param aMediaId    contains the media type KUidMediaTypeAudio or KUidMediaTypeVideo
+        *
+        * @return            FourCC code
+        */
+        TFourCC SourceDataTypeCode( TMediaId aMediaId );
+
+        /**
+        * Set the source data type to the given four CC code for the given media
+        *
+        * @param aSourceFourCC    fourCC code
+        * @param aMediaId         contains the media type KUidMediaTypeAudio or KUidMediaTypeVideo
+        *
+        * @return                 error code KErrNotSupported if invalid media ID, else return KErrNone
+        */
+        TInt SetSourceDataTypeCode( TFourCC aSourceFourCC, 
+                                    TMediaId aMediaId ); 
+
+        /**
+        * Log in to the source thread - this funtion merely passes the command to 
+        * its source clip data source object. The source clip object will handle 
+        * the thread log on procedures.
+        *
+        * @param aEventHandler    address of event handler
+        *
+        * @return                 error code returned by source clip
+        */
+        TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler );
+
+        /**
+        * Log out of the source thread - this funtion merely passes the command to 
+        * its source clip data source object. The source clip object will handle 
+        * the thread log off procedures.
+        *
+        * @return None
+        */
+        void SourceThreadLogoff();
+
+        /**
+        * Negotiate source settings ( buffer size ) to match 
+        * given source object
+        *
+        * @param aDataSink          address of sink object
+        *
+        * @return None
+        */
+        void NegotiateSourceL( MDataSink& aDataSink );
+
+
+    public: // From CPayloadFormatRead
+
+        /**
+        * Called after the data buffer is filled. Update the number of bytes read
+        * and the current read position for the next read operation. 
+        *
+        * @param    aBuffer         data buffer filled
+        * @param    aHeaderInfo     RTP packet header information
+        * @return None
+        */
+        void DataBufferFilledL( CMMFBuffer* aBuffer, 
+                            const TRtpRecvHeader& aHeaderInfo );
+        
+        /**
+        * Configures payload format with format spesific parameters.
+        * Leaves with KErrArgument if parameters are invalid.
+        * @param    aConfigParams       Configuration parameters
+        * @return   void
+        */                    
+        void ConfigurePayloadFormatL( const TDesC8& aConfigParams );
+        
+    public: // MDataSink
+    
+        void BufferFilledL( CMMFBuffer* aBuffer );
+    
+    public: // From MAsyncEventHandler
+    
+        TInt SendEventToClient( const TMMFEvent& aEvent );
+    
+    private:
+        /**
+        * C++ default constructor.
+        */
+        CMccMultiplexer();
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        *
+        * @param aSource    Source of the data for the payload format plugin
+        */
+        void ConstructL( MDataSource* aSource );
+        
+    private:
+    
+        CMccSinkItem* FindSinkItemL( MDataSink* aSink );
+    
+        TInt FindSinkItemIndex( MDataSink* aSink );
+        
+        TBool CanCommandSource( MDataSink* aSink );
+        
+        TBool IsPrimarySink( MDataSink* aSink );
+        
+        void DoBufferFilledL( CMMFBuffer* aBuffer, 
+                              const TRtpRecvHeader* aHeaderInfo );
+                                      
+        void AddSinkL( MDataSink* aSink, 
+                       TBool aSinkIsDecoder, 
+                       TUid aMediaType,
+                       TBool aPassAllBuffersSink );
+        
+        TBool SetMultiplexerState( TMccMultiplexerState aState );
+        
+        void SendStreamEventToClient( TMccEventType& aEventType );
+        
+        void UpdateSinkModes();
+        
+        TBool PassAllRequestsToSource( CMccSinkItem& aItem ) const;
+        
+        TBool IsSupportedMediaType( TUid aMediaType ) const;
+        
+        void SendEventToAllClients( const TMMFEvent& aEvent );
+        
+        void HandleCleanup( CMccSinkItem* aSinkItem, 
+                            TBool aPassedAllRequests );
+    
+        void HandleCleanupL( CMccSinkItem* aSinkItem, 
+                             TBool aPassedAllRequests );
+                             
+        TBool IsActiveState( TMccMultiplexerState aState ) const;
+
+    private: // data
+        
+        MAsyncEventHandler* iEventHandler;
+        
+        MDataSource* iSource;
+        
+        // First item is always the primary sink
+        RPointerArray<CMccSinkItem> iSinkItems;
+        
+        TBool iSourceLogonDone;
+        TBool iSourceNegotiationDone;
+        
+        TMccMultiplexerState iState;
+        
+        CMccSinkItem* iCurrentUser;
+        
+        TBool iPassAllRequestsToClient;
+        
+        TBool iResolveFilledBufferMediaType;
+
+        CMMFDataBuffer* iDataBuf;
+        
+        // Client suggestion for needed source buffer size
+        TInt iSuggestedBufSize;
+
+        TMccEvent iStreamControlEvent;
+        
+   private:    // Friend classes
+    
+   #ifdef EUNIT_TEST
+        friend class UT_CMccMultiplexer;
+   #endif
+    };
+
+#endif  //MCCMULTIPLEXER_H
+
+// End of File