--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/awbaudioplaycontroller/Src/AWBAudioPlayControllerHwDecoder.cpp Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,279 @@
+/*
+* 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 "AWBAudioPlayControllerDecoder.h"
+#include "DebugMacros.h"
+
+//#include <AmrWbDecHwDeviceTICIM.h>
+#include <MmfPanicCodes.h>
+
+const TInt KAwbFrameHeaderSize1 = 1;
+
+// Frame length table (number of frame bytes)
+const TInt KAwbFrameLength[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61,
+ 6, 6, 0, 0, 0, 1, 1};
+// Stuffing length table (number of stuffing bits)
+const TInt KAwbStuffLength[16] = {7, 10, 6, 6, 6, 6, 6, 6, 6,3,3,0,0,0,3,3};
+
+// Sampling rate
+const TInt KAwbSampleRate16k = 16000;
+
+// Number of channels
+const TInt KAwbChannels1 = 1;
+
+// PCM samples per frame
+const TInt KAwbSamplesPerFrame320 = 320;
+
+const TInt KAwbMaxFrameSize = 61;
+const TUint KSizeOfInBuffer = 2*KAwbMaxFrameSize;
+
+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.
+// -----------------------------------------------------------------------------
+//
+CAWBAudioPlayControllerDecoder::CAWBAudioPlayControllerDecoder()
+ : CAdvancedAudioDecoder(CActive::EPriorityStandard)
+ {
+ DP0(_L("CAWBAudioPlayControllerDecoder::CAWBAudioPlayControllerDecoder - Hardware Accelerated"));
+ iMaxFrameSize = KAwbMaxFrameSize;
+ iSizeOfInBuffer = KSizeOfInBuffer;
+ }
+
+// -----------------------------------------------------------------------------
+// CAWBAudioPlayControllerDecoder::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAWBAudioPlayControllerDecoder::ConstructL()
+ {
+ DP1(_L("CAWBAudioPlayControllerDecoder::ConstructL"), this);
+ iFrameTable = CFrameTable::NewL();
+
+ RenderEnable();
+ UnMarkPlayEnd();
+ Enable();
+
+ CActiveScheduler::Add(this);
+ }
+
+// -----------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAWBAudioPlayControllerDecoder* CAWBAudioPlayControllerDecoder::NewL()
+ {
+ DP0(_L("CAWBAudioPlayControllerDecoder::NewL"));
+ CAWBAudioPlayControllerDecoder* self = new(ELeave) CAWBAudioPlayControllerDecoder();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// Destructor
+CAWBAudioPlayControllerDecoder::~CAWBAudioPlayControllerDecoder()
+ {
+ DP0(_L("CAWBAudioPlayControllerDecoder::~CAWBAudioPlayControllerDecoder"));
+ delete iFrameTable;
+ }
+
+TInt CAWBAudioPlayControllerDecoder::CodecConfig(RArray<TInt>& /*aConfigData*/)
+ {
+ TInt status = KErrNone;
+ iFrameTable->InitFrameTable(KAwbSampleRate16k, KAwbSamplesPerFrame320);
+ return status;
+ }
+
+// -----------------------------------------------------------------------------
+// CAWBAudioPlayControllerDecoder::ResetL
+// Resets configuration data and configures the codec.
+// -----------------------------------------------------------------------------
+//
+void CAWBAudioPlayControllerDecoder::ResetL()
+ {
+ DP0(_L ("CAWBAudioPlayControllerDecoder::Reset - Enter"));
+
+ delete[] iOutBuffer;
+ delete[] iInBuffer;
+
+ iInBuffer = NULL;
+ iOutBuffer = NULL;
+ iInBufferCount = 0;
+ iOutBufferCount = 0;
+ iOutBufferPtr = NULL;
+ iOutFrameLength = KAwbMaxFrameSize; // since data is not decoded
+ iInBuffer = new (ELeave) TUint8[KSizeOfInBuffer];
+
+ iOutBuffer = new (ELeave) TUint8[iOutFrameLength];
+ iOutBufferPtr = iOutBuffer;
+
+ iAccLen = 0;
+ iEnabled = ETrue;
+ DP0(_L ("CAWBAudioPlayControllerDecoder::Reset - Exit"));
+ }
+
+TCodecProcessResult CAWBAudioPlayControllerDecoder::ProcessL(CMMFBuffer& aSrc, CMMFBuffer& aDst)
+ {
+ DP0(_L ("CAWBAudioPlayControllerDecoder::ProcessL"));
+ return CAdvancedAudioDecoder::ProcessHwL(aSrc, aDst);
+ }
+
+TInt CAWBAudioPlayControllerDecoder::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;
+ }
+
+// -----------------------------------------------------------------------------
+// CAWBAudioPlayControllerDecoder::SeekSync
+// -----------------------------------------------------------------------------
+TInt CAWBAudioPlayControllerDecoder::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 >= KAwbFrameHeaderSize1 && length == 0)
+ {
+ syncPos = KNotFound;
+ }
+ framePtr += length;
+ frameBufLen -= length;
+ seekCount++;
+ }
+ aBuf++; aBufLen--; i++;
+ }
+ return syncPos;
+ }
+
+// -----------------------------------------------------------------------------
+// CAWBAudioControllerUtility::FrameInfo
+// -----------------------------------------------------------------------------
+//
+TInt CAWBAudioPlayControllerDecoder::FrameInfo(
+ const TUint8* aBuf,
+ TInt aBufLen,
+ TAudioFrameInfo& aInfo)
+ {
+ TInt length = 0;
+ aInfo.iBitRate = 0;
+ if (aBufLen >= KAwbFrameHeaderSize1)
+ {
+ // extract mode information
+ const TInt mode = (aBuf[0] & 0x78) >> 3; // 1st byte 0b.MODE...
+ // get length
+ length = KAwbFrameLength[mode];
+
+ // check start stuffing bits
+ if((aBuf[0] & 0x83) != 0)
+ {
+ length = 0; // syntax error
+ }
+
+ // check end stuffing bits
+ if (length > 0 && aBufLen >= length)
+ {
+ TUint32 stuffBits = aBuf[length-1];
+ stuffBits <<= (11 - KAwbStuffLength[mode]);
+ if ((stuffBits & 0x0000FF) != 0)
+ {
+ length = 0; // syntax error
+ }
+ }
+
+ // update frame parameters
+ aInfo.iMode = mode;
+ aInfo.iBitRate = length * 400;
+ aInfo.iSamplingRate = KAwbSampleRate16k;
+ aInfo.iChannels = KAwbChannels1;
+ aInfo.iFrameSize = length;
+ aInfo.iFrameSamples = KAwbSamplesPerFrame320;
+ aInfo.iSamplingRateOut = aInfo.iSamplingRate;
+ aInfo.iChannelsOut = aInfo.iChannels;
+ aInfo.iFrameSamplesOut= aInfo.iFrameSamples;
+ }
+ return length;
+ }
+
+// -----------------------------------------------------------------------------
+// CAWBAudioPlayControllerDecoder::IsHwAccelerated
+// Always return true when no soft codec is used.
+// -----------------------------------------------------------------------------
+//
+TBool CAWBAudioPlayControllerDecoder::IsHwAccelerated()
+ {
+ return ETrue;
+ }
+
+TInt CAWBAudioPlayControllerDecoder::CodecCmd(TCodecCmd /*aCmd*/)
+ {
+ return KErrNotSupported;
+ }
+
+
+// End of file