mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/amraudioplaycontroller/Src/AMRAudioPlayControllerHwDecoder.cpp
changeset 0 71ca22bcf22a
child 12 5a06f39ad45b
child 18 2eb3b066cc7d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/amraudioplaycontroller/Src/AMRAudioPlayControllerHwDecoder.cpp	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,273 @@
+/*
+* 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:  The functions in this module implements the specific behavior
+*                for the advanced audio converter class for configuration of
+*				 hardware accelerated codec.
+*
+*/
+
+
+// INCLUDE FILES
+#include "AMRAudioPlayControllerDecoder.h"
+#include "DebugMacros.h"
+//#include <AmrDecHwDeviceTICIM.h>
+#include <MmfPanicCodes.h>
+
+// The size of AMR header, header must include bits for determining frame length
+const TInt KAmrFrameHeaderSize1 = 1;
+
+// Frame length table (number of frame bytes)
+const TInt KAmrFrameLength[16] = {13,14,16,18,20,21,27,32,6,0,0,0,0,0,0,1};
+
+// Maximum number of PCM samples in one AMR frame
+const TInt KAmrSamplesPerFrame160 = 160;
+
+const TInt KAmrSampleRate8K = 8000;
+const TInt KAmrChannels1 = 1;
+
+const TInt KAmrMaxFrameSize = 32;
+const TUint KSizeOfInBuffer   = 2*KAmrMaxFrameSize;
+
+class TAudioFrameInfo
+    {
+	public:
+		TInt iMode;            // encoding mode
+		TInt iBitRate;         // bitrate (bit/s)
+		TInt iSamplingRate;    // sampling frequency (Hz)
+		TInt iChannels;        // number of channels
+		TInt iFrameSize;       // encoded size (bytes)
+		TInt iFrameSamples;    // samples per frame
+		TInt iSamplingRateOut; // sampling frequency after conversion (Hz)
+		TInt iChannelsOut;     // number of audio channels after conversion (1 or 2)
+		TInt iFrameSamplesOut; // decoded size after conversion (samples per frame)
+		TInt iPadding;         // padding flag (TRUE or FALSE, TRUE if p slot exists)
+		TInt iId;              // id of algorithm (1 MPEG-1, 0 MPEG-2)
+    };
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAMRAudioPlayControllerDecoder::CAMRAudioPlayControllerDecoder()
+    :   CAdvancedAudioDecoder(CActive::EPriorityStandard)
+    {
+    DP0(_L("CAMRAudioPlayControllerDecoder::CAMRAudioPlayControllerDecoder - Hardware Accelerated"));
+    iMaxFrameSize = KAmrMaxFrameSize;
+   	iSizeOfInBuffer = KSizeOfInBuffer;
+    }
+
+// -----------------------------------------------------------------------------
+// CAMRAudioPlayControllerDecoder::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAMRAudioPlayControllerDecoder::ConstructL()
+    {
+    DP1(_L("CAMRAudioPlayControllerDecoder::ConstructL"), this);
+    iFrameTable = CFrameTable::NewL();
+    
+	RenderEnable();
+	UnMarkPlayEnd();
+	Enable();
+
+    CActiveScheduler::Add(this);
+    }
+
+// -----------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAMRAudioPlayControllerDecoder* CAMRAudioPlayControllerDecoder::NewL()
+    {
+    DP0(_L("CAMRAudioPlayControllerDecoder::NewL"));
+    CAMRAudioPlayControllerDecoder* self = new(ELeave) CAMRAudioPlayControllerDecoder();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// Destructor
+CAMRAudioPlayControllerDecoder::~CAMRAudioPlayControllerDecoder()
+	{
+    DP0(_L("CAMRAudioPlayControllerDecoder::~CAMRAudioPlayControllerDecoder"));
+    delete iFrameTable;
+	}
+
+TInt CAMRAudioPlayControllerDecoder::CodecConfig(RArray<TInt>& /*aConfigData*/)
+	{
+	TInt status = KErrNone;
+	iFrameTable->InitFrameTable(KAmrSampleRate8K, KAmrSamplesPerFrame160);
+	return status;
+	}
+
+// -----------------------------------------------------------------------------
+// CAMRAudioPlayControllerDecoder::ResetL
+// Resets configuration data and configures the codec.
+// -----------------------------------------------------------------------------
+//
+void CAMRAudioPlayControllerDecoder::ResetL()
+	{
+    DP0(_L ("CAMRAudioPlayControllerDecoder::Reset - Enter"));
+
+	delete[] iOutBuffer;
+   	delete[] iInBuffer;
+   	
+   	iInBuffer = NULL;
+   	iOutBuffer = NULL;
+   	iInBufferCount = 0;
+   	iOutBufferCount = 0;
+   	iOutBufferPtr = NULL;
+   	iOutFrameLength = KAmrMaxFrameSize; // since data is not decoded
+   	iInBuffer = new (ELeave) TUint8[KSizeOfInBuffer];
+
+    iOutBuffer = new (ELeave) TUint8[iOutFrameLength];
+    iOutBufferPtr = iOutBuffer;
+
+    iAccLen = 0;
+    iEnabled = ETrue;
+
+    DP0(_L ("CAMRAudioPlayControllerDecoder::Reset - Exit"));
+	}
+
+TCodecProcessResult CAMRAudioPlayControllerDecoder::ProcessL(CMMFBuffer& aSrc, CMMFBuffer& aDst)
+	{
+    DP0(_L ("CAMRAudioPlayControllerDecoder::ProcessL"));
+	return CAdvancedAudioDecoder::ProcessHwL(aSrc, aDst);
+	}
+
+TInt CAMRAudioPlayControllerDecoder::FrameLength(const TUint8* aBuf, TInt aBufLen, TInt& aFrameLength)
+	{
+	TInt stat = KErrNone;
+	TAudioFrameInfo info;
+	TInt len = FrameInfo(aBuf, aBufLen, info);
+	if (len > 0)
+		{
+		aFrameLength = len;
+		}
+	else
+		{
+		stat = KErrUnknown;
+		}
+	return stat;
+	}
+
+TInt CAMRAudioPlayControllerDecoder::FrameInfo(
+	const TUint8* aBuf,
+	TInt aBufLen,
+	TAudioFrameInfo& aInfo)
+    {
+    TInt length = 0;
+    aInfo.iBitRate = 0;
+    if (aBufLen >= KAmrFrameHeaderSize1)
+    	{
+        // extract mode information
+        const TInt mode = (aBuf[0] & 0x78) >> 3; // 1st byte 0b.MODE...
+        // get length
+        length = KAmrFrameLength[mode];
+
+        // check start stuffing bits
+        if ((aBuf[0] & 0x83) != 0)
+	        {
+            length = 0; // syntax error
+	        }
+
+// SKIP CHECKING FOR STUFFING BITS
+/*
+        // check end stuffing bits
+        if (length > 0  &&  aBufLen >= length)
+        	{
+            TUint32 stuffBits = aBuf[length-1];
+            stuffBits <<= (11 - KAmrStuffLength[mode]);
+            if ((stuffBits & 0x0000FF) != 0)
+            	{
+                length = 0; // syntax error
+            	}
+        	}
+*/
+        // update frame parameters
+        aInfo.iMode = mode;
+        aInfo.iBitRate = length * 400;
+        aInfo.iSamplingRate = KAmrSampleRate8K;
+        aInfo.iChannels = KAmrChannels1;
+        aInfo.iFrameSize = length;
+        aInfo.iFrameSamples = KAmrSamplesPerFrame160;
+        aInfo.iSamplingRateOut = aInfo.iSamplingRate;
+        aInfo.iChannelsOut = aInfo.iChannels;
+        aInfo.iFrameSamplesOut= aInfo.iFrameSamples;
+    	}
+    return length;
+    }
+
+// -----------------------------------------------------------------------------
+// CAMRAudioControllerUtility::SeekSync
+// -----------------------------------------------------------------------------
+//
+TInt CAMRAudioPlayControllerDecoder::SeekSync(TUint8* aBuf, TInt aBufLen)
+    {
+    const TInt KMaxFrames = 3;          // number of frames to check
+    const TInt KNotFound = aBufLen;     // sync not found position
+    TAudioFrameInfo frameInfo;			// frame parameters
+    TInt i = 0;
+    TInt syncPos = KNotFound;
+    TInt maxSeek = KMaxFrames;
+    const TUint8* endPtr = aBuf + aBufLen;
+
+    // Seek a valid frame candidate byte by byte until a valid frame
+    // is found or all bytes have been checked.
+    while (aBuf < endPtr  &&  syncPos == KNotFound)
+    	{
+        TInt seekCount = 0;
+        const TUint8* framePtr = aBuf;
+        TInt frameBufLen = aBufLen;
+        syncPos = i;
+        // Check the validity of this frame candidate and the nearest next
+        // frames. If they are not OK, syncPos will be set to KNotFound.
+        while (framePtr < endPtr  &&  syncPos != KNotFound  &&  seekCount < maxSeek)
+        	{
+            TInt length = FrameInfo(framePtr, frameBufLen, frameInfo);
+            if (frameBufLen >= KAmrFrameHeaderSize1  &&  length == 0)
+            	{
+				syncPos = KNotFound;
+				}
+            framePtr += length;
+            frameBufLen -= length;
+            seekCount++;
+        	}
+        aBuf++; aBufLen--; i++;
+    	}
+    return syncPos;
+    }
+
+// -----------------------------------------------------------------------------
+// CAMRAudioPlayControllerDecoder::IsHwAccelerated
+// Always return true when no soft codec is used.
+// -----------------------------------------------------------------------------
+//
+TBool CAMRAudioPlayControllerDecoder::IsHwAccelerated()
+	{
+	return ETrue;
+	}
+
+TInt CAMRAudioPlayControllerDecoder::CodecCmd(TCodecCmd /*aCmd*/)
+	{
+	return KErrNotSupported;
+	}
+
+
+// End of file