diff -r 000000000000 -r f63038272f30 bluetoothengine/btaudiostreamer/inc/btaudiostreamsendersbc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btaudiostreamer/inc/btaudiostreamsendersbc.h Mon Jan 18 20:28:57 2010 +0200 @@ -0,0 +1,187 @@ +/* +* 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: This class implements the SBC codec specific data handling. +* +*/ + + + + +#ifndef __BTAUDIOSTREAMSENDERSBC_H__ +#define __BTAUDIOSTREAMSENDERSBC_H__ + +#include "btaudiostreamsender.h" + +/** + * SBC codec specific implementation of CBTAudioStreamSender base class + * + * This class wraps the handling of SBC frames and it can place the + * media packet header in place. + + * @lib btaudiostreamer.lib + * @since S60 v3.1 + */ +NONSHARABLE_CLASS(CBTAudioStreamSenderSBC) : public CBTAudioStreamSender + { + public: + static CBTAudioStreamSenderSBC* NewL(MBTAudioStreamSenderObserver& aObserver, RRtpSession& aSession); + virtual ~CBTAudioStreamSenderSBC(); + + private: + CBTAudioStreamSenderSBC(MBTAudioStreamSenderObserver& aObserver, RRtpSession& aSession); + + /** + * From CBTAudioStreamSender. + * This method places to received buffer into the send packet in SBC specific way. + * + * @since S60 v3.1 + * @param aBuffer contains the SBC frames. + */ + virtual TInt AddBufferToSendPacket(const TDesC8& aBuffer); + + /** + * From CBTAudioStreamSender. + * This method places the SBC codec specific media packet header in its place. + * + * @since S60 v3.1 + * @param void. + * @return a Symbian OS wide error code. + */ + virtual TInt AddHeaderToSendPacket(TPtr8& aPayloadDesC); + + /** + * From CBTAudioStreamSender. + * This method does the cleanup work after the packet has been sent. + * + * @since S60 v3.1 + * @param void. + * @return a Symbian OS wide error code. + */ + virtual TInt PacketSendingCompleted(TPtr8& aPayloadDesC); + + /** + * From CBTAudioStreamSender. + * This method is used for calculating the required packet length. + * It takes the header's into account and tries to fit as many frames + * to the packet that can fit to the outgoing MTU. + * + * @since S60 v3.1 + * @param aOutboundMTUSize The MTU size for outgoing L2CAP link. + * @param aFrameLength The length of one SBC frame. + */ + virtual TInt CalculatePacketLength(TUint aOutboundMTUSize, TUint aFrameLength); + + /** + * From CBTAudioStreamSender. + * This method prepares the class for sending packets. + * + * @since S60 v3.1 + * @param void. + * @return a Symbian OS wide error code. + */ + virtual TInt InitSender(RRtpSendPacket& aSendPacket, TPtr8& aPayloadDesC, const TUint aTargetBitrate); + + /** + * From CBTAudioStreamSender. + * This method corrects the timestamp value when incoming buffers can't fit in one sendpacket. + * + * @since S60 v5.0 + * @param void. + * @return void. + */ + virtual void AdjustTimestamp(TInt64 &aTimestamp); + + /** + * + * This method calculates the playing time of one frame in microseconds. + * Information is used also internally for correcting the timestamp values. + * + * @since S60 v5.0 + * @param void. + * @return a duration of one frame. + */ + virtual TUint CalculateFrameDuration(const TUint aFrameLength, const TUint aTargetBitrate); + + /** + * This method returns the maximum number of frames in one outgoing packet. + * + * @since S60 Timebox 9.2 + * @return number of frames in one send packet. + */ + virtual TUint MaxFramesPerPacket(); + + + private: + + /** + * Stores the corrected timestamp value. + */ + TInt64 iTimestampOfFirstFrameInSendPacket; + + /** + * Stores the length of one SBC frame. + */ + TInt iFrameLength; + + /** + * Stores the length of one SBC frame. Used when the frame length changes. + */ + TInt iNewFrameLength; + + /** + * Stores the duration of one SBC frame in microseconds. Used for correcting the timestamps in long buffers. + */ + TInt iDurationOfFrame; + + /** + * Used for calculating how many frames can fit in one SendPacket. + */ + TInt iSpaceNeededForBuffer; + + /** + * Stores the number of frames we have moved from buffer to packet so far. + * This variable is needed when the whole buffer can't fit in the current packet. + */ + TInt iNumOfFramesAlreadyMoved; + + /** + * Stores the maximum number of frames that we can place in one packet. + */ + TInt iMaxNumOfFrames; + + /** + * This stores the number of frames in send packet. + * This information is needed for A2DP media packet header. + */ + TInt iNumOfFramesInSendPacket; + + /** + * This stores the end position of the SendPacket's payload. + */ + const TUint8 *iPtrEndOfPayload; + + /** + * This stores the number of frames that haven't been sent yet. It's needed if + * there's more incoming frames than can fit in single SendPacket. + */ + TInt iNumOfFramesLeftInBuffer; + + /** + * This tells if it is time to start using the passed in timestamp as reference. + */ + TBool iTimestampChangeFlag; + + }; + +#endif // __BTAUDIOSTREAMSENDERSBC_H__