diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccdtmfpayloadformat/inc/dtmfpayloadformatread.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccdtmfpayloadformat/inc/dtmfpayloadformatread.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,419 @@ +/* +* Copyright (c) 2006-2007 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 functionality for DTMF decoding and playing. +* +*/ + + + + +#ifndef __CDTMFPAYLOADFORMATREAD_H__ +#define __CDTMFPAYLOADFORMATREAD_H__ + +// INCLUDES +#include +#include +#include "rtpheader.h" +#include "formatstatemachine.h" +#include "dtmfpayloadformatdefs.h" +#include "mccinternalcodecs.h" + +// FORWARD DECLARATIONS +class MDataSource; +class CDTMFPayloadDecoder; +class TDTMFEventPayloadInfo; +class TDTMFTonePayloadInfo; + + +// CLASS DECLARATION + +/** + * Handles DTMF reading from RTP payload and playing out DTMFs. + * Supported DTMF payload format is telephone-event payload. + * + * @lib mmccdtmfplformat.dll + * @since Series 60 3.2 + */ +class CDTMFPayloadFormatRead : public CPayloadFormatRead, + public MPayloadFormatRead, + public MMdaAudioToneObserver + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CDTMFPayloadFormatRead* NewL( MDataSource* aSource ); + + /** + * Destructor. + */ + virtual ~CDTMFPayloadFormatRead(); + + public: // New functions + + /** + * Sets payload format to be used in DTMF decoding. + * + * @since Series 60 3.2 + * @param aPayloadFormat Payload format assumed in RTP payload + * @return System wide error code + */ + virtual TInt SetPayloadFormat( TDTMFPayloadFormat aPayloadFormat ); + + /** + * Indicates the RTP data source has filled the buffer. + * + * @since Series 60 3.2 + * @param aBuffer The filled buffer + * @param aRtpHeader RTP header relating to passed buffer + */ + virtual void DataBufferFilledL( CMMFBuffer* aBuffer, + const TRtpRecvHeader& aRtpHeader ); + + public: // Functions from CMMFFormatDecode + + /** + * From CMMFFormatDecode. Tests whether a source + * buffer can be created. + * + * @since Series 60 3.2 + * @return ETrue if a source buffer can be + * created. EFalse otherwise. + */ + TBool CanCreateSourceBuffer(); + + /** + * From CMMFFormatDecode. Not applicable for DTMF payload formatter. + * + * @since Series 60 3.2 + * @param aMediaType The UID of the media type + * @return The number of streams + */ + TUint Streams( TUid aMediaType ) const; + + /** + * From CMMFFormatDecode. Not applicable for DTMF payload format read. + * + * @since Series 60 3.2 + * @param aMediaType The media type ID. + * @return The time interval for one frame, in microseconds. + */ + TTimeIntervalMicroSeconds FrameTimeInterval( + TMediaId aMediaType ) const; + + /** + * From CMMFFormatDecode. Not applicable for DTMF payload format read. + * + * @since Series 60 3.2 + * @param aMediaType Media type ID. + * @return Duration of the sink clip. + */ + TTimeIntervalMicroSeconds Duration( TMediaId aMediaType ) const; + + /** + * From CMMFFormatDecode. Not used, because there is no need for data + * exchange with DataPath. DTMF receiving and processing cycle is + * managed by SourcePrimeL(), SourcePlayL(), SourcePauseL(), + * SourceStopL() -methods. + * + * @since Series 60 3.2 + * @param aBuffer + * @param aConsumer + * @param aMediaId + */ + void FillBufferL( CMMFBuffer* aBuffer, + MDataSink* aConsumer, + TMediaId aMediaId ); + + /** + * From CMMFFormatDecode. Not used. + * + * @since Series 60 3.2 + * @param aMediaId + * @param aReference + * @return NULL or KErrNotSupported + */ + CMMFBuffer* CreateSourceBufferL( TMediaId aMediaId, + TBool& aReference ); + + /** + * From CMMFFormatDecode. Gets the FourCC code for the + * specified media ID. + * + * @since Series 60 3.2 + * @param aMediaId Media ID + * @return The source data type code. + */ + TFourCC SourceDataTypeCode( TMediaId aMediaId ); + + /** + * Gets the data type code for the sink specified by the media ID. + * Format decode may act in role of MDataSink. + * + * @since Series 60 3.2 + * @param aMediaId Media ID + * @return The data sink type code + */ + TFourCC SinkDataTypeCode( TMediaId aMediaId ); + + /** + * Sets the source's priority settings. + * + * @since Series 60 3.2 + * @param aPrioritySettings Source priority settings. + */ + void SetSourcePrioritySettings( + const TMMFPrioritySettings &aPrioritySettings ); + + public: + + /** + * Configures payload format with format spesific parameters. + * Leaves with KErrArgument if parameters are invalid. + * + * @since Series 60 3.2 + * @param aConfigParams Configuration parameters + */ + virtual void ConfigurePayloadFormatL( const TDesC8& aConfigParams ); + + public: // From MDataSource + + /** + * From MDataSource. Primes the source. + * + * @since Series 60 3.2 + */ + void SourcePrimeL(); + + /** + * From MDataSource. Plays the source. + * + * @since Series 60 3.2 + */ + void SourcePlayL(); + + /** + * From MDataSource. Pauses the source. + * + * @since Series 60 3.2 + */ + void SourcePauseL(); + + /** + * From MDataSource. Stops the source. + * + * @since Series 60 3.2 + */ + void SourceStopL(); + + /** + * From MDataSource. Logs on the source thread. + * + * @since Series 60 3.2 + * @param aEventHandler Used to send events back to the data path + */ + TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * From MDataSource. Logs off from the source thread. + * + * @since Series 60 3.2 + */ + void SourceThreadLogoff( ); + + public: // MPayloadFormatRead + + /** + * Send decoded Events or Tones to further processing. + * Called by the state machine. + * + * @since Series 60 3.2 + */ + void SendDataToSinkL(); + + /** + * Fill the sink buffer by decoding the RTP payload into + * DTMF events or Tones. Called by the state machine. + * + * @since Series 60 3.2 + */ + void FillSinkBufferL(); + + /** + * Request the RTP source to fill the source buffer with RTP payload. + * Source buffer is decided by the RTP source. + * Called by the state machine. + * + * @since Series 60 3.2 + */ + void FillSourceBufferL(); + + /** + * From MPayloadFormatRead. Error notification if one of the + * statechange callbacks leaved. + * + * @since Series 60 3.2 + * @param aError Leave error code + * @param aState State that caused the leave + * @return TInt System wide error code from error handling + */ + TInt HandleError( TInt aError, TFormatDecodeState aState ); + + public: // From MMdaAudioToneObserver + + /** + * From MMdaAudioToneObserver + */ + void MatoPrepareComplete( TInt aError ); + + /** + * From MMdaAudioToneObserver + */ + void MatoPlayComplete( TInt aError ); + + private: + + /** + * C++ default constructor. + */ + CDTMFPayloadFormatRead(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL( MDataSource* aSource ); + + /** + * Handle and play events using DevSound API. + * + * @since Series 60 3.2 + */ + void HandleDTMFEventsL(); + + /** + * Handle and play tones using DevSound API. + * + * @since Series 60 3.2 + */ + void HandleDTMFTones(); + + /** + * Creates a buffer used in data transfer between format read and + * its datasource. + * + * @since Series 60 3.2 + * @return void + */ + void CreateClipBufferL(); + + /** + * Compares received RTP header to last received when marker bits are + * set. Function returns ETrue if headers match so that only sequence + * number is incremented in aRtpheader. + * + * @since S60 v3.2 + * @param aRtpheader RTP header to compare. + * @return TBool ETrue if headers match. + */ + TBool CompareFirstPacketRtpHeaders( const TRtpRecvHeader& aRtpheader ); + + private: // Data + + /** + * Pointer to format decoding state machine + * Own. + */ + CFormatDecodeStateMachine* iStateMachine; + +// *** Relating to decoding functionality *** // + + /** + * Pointer to payload decoder + * Own. + */ + CDTMFPayloadDecoder* iPayloadDecoder; + + /** + * Pointer to buffer to hold payload got from data source + */ + CMMFDataBuffer* iSourceBuffer; + + // Indicates whether payload read has ownership of source buffer + TBool iSourceBufOwnership; + + /** + * Indicates do we have payload buffer from data source + */ + TBool iBufferToReadExists; + + /** + * Array containing Event Payload field values + */ + RArray iEventPayloadInfo; + + /** + * Array containing Tone Payload field values + */ + RArray iTonePayloadInfo; + + /** + * Current event ongoing. Needed for final packet loss detection. + */ + TChar iCurrentEvent; + + /** + * Info about is M(arker) bit set in a RTP packet + */ + TBool iFirstPacket; + + /** + * Time stamp of previous event + */ + TTimeIntervalMicroSeconds32 iTimeStampOfPrevEvent; + + /** + * Payload format (Event, Tone) used in RTP packets + */ + TDTMFPayloadFormat iPayloadFormat; + +// *** Relating to DTMF playback *** // + + /** + * Pointer to tone player for local/inband DTMF playing + * Own. + */ + CMdaAudioToneUtility* iTonePlayer; + + /** + * Parameters relating to RTP data encoding + */ + TMccCodecInfo iCInfo; + + /** + * Receive header from previous packet. + */ + TRtpRecvHeader iReceivedHeader; + + private: // Friend classes + + #ifdef TEST_EUNIT + friend class UT_CDTMFPayloadFormatRead; + #endif + + }; + +#endif // __CDTMFPAYLOADFORMATREAD_H__ + +// End of File