devsoundextensions/mmfcustominterfaces/WmaDecoderIntfc/WmaDecoderIntfcMsgHdlr/src/WmaDecoderIntfcMsgHdlr.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devsoundextensions/mmfcustominterfaces/WmaDecoderIntfc/WmaDecoderIntfcMsgHdlr/src/WmaDecoderIntfcMsgHdlr.cpp Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,485 @@
+/*
+* 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: Message handler for WMA 10 Pro decoder custom interface.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "WmaDecoderIntfcMsgs.h"
+#include "WmaDecoderIntfcMsgHdlr.h"
+//#include "WmaDecoderIntfc.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::CWmaDecoderIntfcMsgHdlr
+// C++ default constructor can NOT contain any code, that might leave.
+//------------------------------------------------------------------------------
+CWmaDecoderIntfcMsgHdlr::CWmaDecoderIntfcMsgHdlr(
+ CWmaDecoderIntfc* aWmaDecoderConfigCI) :
+ CMMFObject(KUidWmaDecoderIntfc)
+ {
+ iWmaDecoderIntfcCI = aWmaDecoderConfigCI;
+ }
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::ConstructL
+// Symbian 2nd phase constructor can leave.
+//------------------------------------------------------------------------------
+void CWmaDecoderIntfcMsgHdlr::ConstructL()
+ {
+ }
+
+//------------------------------------------------------------------------------
+// WmaDecoderIntfcMsgHdlr::NewL
+// Two-phased constructor.
+//------------------------------------------------------------------------------
+EXPORT_C CWmaDecoderIntfcMsgHdlr* CWmaDecoderIntfcMsgHdlr::NewL(
+ TAny* aWmaDecoderConfigCI)
+ {
+ CWmaDecoderIntfc* WmaDecoderConfigCI =
+ (CWmaDecoderIntfc*)aWmaDecoderConfigCI;
+ CWmaDecoderIntfcMsgHdlr* self =
+ new (ELeave) CWmaDecoderIntfcMsgHdlr(WmaDecoderConfigCI);
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+//------------------------------------------------------------------------------
+// Destructor
+//------------------------------------------------------------------------------
+EXPORT_C CWmaDecoderIntfcMsgHdlr::~CWmaDecoderIntfcMsgHdlr()
+ {
+ iSupportedFormats.Close();
+ iSupportedTools.Close();
+ iControllableTools.Close();
+
+ delete iDataCopyBuffer;
+ delete iWmaDecoderIntfcCI;
+ }
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::HandleRequest
+// Handles the messages from the proxy.
+//------------------------------------------------------------------------------
+EXPORT_C void CWmaDecoderIntfcMsgHdlr::HandleRequest(
+ TMMFMessage& aMessage)
+ {
+ ASSERT(aMessage.Destination().InterfaceId() == KUidWmaDecoderIntfc);
+
+ TRAPD(error, DoHandleRequestL(aMessage));
+
+ if(error)
+ {
+ aMessage.Complete(error);
+ }
+ }
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoHandleRequestL
+// Determines which custom interface to call.
+//------------------------------------------------------------------------------
+void CWmaDecoderIntfcMsgHdlr::DoHandleRequestL(TMMFMessage& aMessage)
+ {
+ switch(aMessage.Function())
+ {
+ case EWmaGetSupportedFormats:
+ {
+ DoGetSupportedFormatsL(aMessage);
+ break;
+ }
+ case EWmaGetSupportedTools:
+ {
+ DoGetSupportedToolsL(aMessage);
+ break;
+ }
+ case EWmaGetSupportedMaxChannels:
+ {
+ DoGetSupportedMaxChannelsL(aMessage);
+ break;
+ }
+ case EWmaGetSupportedMaxBitrate:
+ {
+ DoGetSupportedMaxBitrateL(aMessage);
+ break;
+ }
+ case EWmaGetSupportedMaxSampleRate:
+ {
+ DoGetSupportedMaxSampleRateL(aMessage);
+ break;
+ }
+ case EWmaGetControllableTools:
+ {
+ DoGetControllableToolsL(aMessage);
+ break;
+ }
+ case EWmaGetAllMsg:
+ {
+ DoGetAllL(aMessage);
+ break;
+ }
+ case EWmaApplyConfig:
+ {
+ DoApplyConfigL(aMessage);
+ break;
+ }
+ case EWmaGetNumOfSupportedFormats:
+ {
+ DoGetNumOfSupportedFormatsL(aMessage);
+ break;
+ }
+ case EWmaGetNumOfSupportedTools:
+ {
+ DoGetNumOfSupportedToolsL(aMessage);
+ break;
+ }
+ case EWmaGetNumOfControllableTools:
+ {
+ DoGetNumOfControllableToolsL(aMessage);
+ break;
+ }
+
+ default:
+ {
+ aMessage.Complete(KErrNotSupported);
+ break;
+ }
+ }
+ }
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoGetSupportedFormatsL
+// Get supported formats.
+//------------------------------------------------------------------------------
+void CWmaDecoderIntfcMsgHdlr::DoGetSupportedFormatsL(TMMFMessage& aMessage)
+ {
+ if (!iDataCopyBuffer)
+ {
+ User::Leave(KErrNotReady);
+ }
+ aMessage.WriteDataToClientL(iDataCopyBuffer->Ptr(0));
+ aMessage.Complete(KErrNone);
+ }
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoGetSupportedToolsL
+// Get supported tools.
+//------------------------------------------------------------------------------
+void CWmaDecoderIntfcMsgHdlr::DoGetSupportedToolsL(TMMFMessage& aMessage)
+ {
+ if (!iDataCopyBuffer)
+ {
+ User::Leave(KErrNotReady);
+ }
+ aMessage.WriteDataToClientL(iDataCopyBuffer->Ptr(0));
+ aMessage.Complete(KErrNone);
+ }
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoGetSupportedMaxChannelsL
+// Get max number of channels.
+//------------------------------------------------------------------------------
+void CWmaDecoderIntfcMsgHdlr::DoGetSupportedMaxChannelsL(TMMFMessage& aMessage)
+ {
+ TUint maxChannels = 0;
+ TInt status = iWmaDecoderIntfcCI->GetSupportedMaxChannelsIn(maxChannels);
+
+ TPckgBuf<TUint> pckg;
+ pckg() = maxChannels;
+ aMessage.WriteDataToClientL(pckg);
+
+ aMessage.Complete(status);
+ }
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoGetSupportedMaxBitrateL
+// Get supported max bit rates.
+//------------------------------------------------------------------------------
+void CWmaDecoderIntfcMsgHdlr::DoGetSupportedMaxBitrateL(TMMFMessage& aMessage)
+ {
+ TUint maxBitrate = 0;
+ TInt status = iWmaDecoderIntfcCI->GetSupportedMaxBitrate(maxBitrate);
+
+ TPckgBuf<TUint> pckg;
+ pckg() = maxBitrate;
+ aMessage.WriteDataToClientL(pckg);
+
+ aMessage.Complete(status);
+ }
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoGetSupportedMaxSampleRateL
+// Get supported max sample rate.
+//------------------------------------------------------------------------------
+void CWmaDecoderIntfcMsgHdlr::DoGetSupportedMaxSampleRateL(TMMFMessage& aMessage)
+ {
+ TUint maxSamplerate = 0;
+ TInt status = iWmaDecoderIntfcCI->GetSupportedMaxSampleRate(maxSamplerate);
+
+ TPckgBuf<TUint> pckg;
+ pckg() = maxSamplerate;
+ aMessage.WriteDataToClientL(pckg);
+
+ aMessage.Complete(status);
+
+ }
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoGetControllableToolsL
+// Get supported controllable tools.
+//------------------------------------------------------------------------------
+void CWmaDecoderIntfcMsgHdlr::DoGetControllableToolsL(TMMFMessage& aMessage)
+ {
+ if (!iDataCopyBuffer)
+ {
+ User::Leave(KErrNotReady);
+ }
+ aMessage.WriteDataToClientL(iDataCopyBuffer->Ptr(0));
+ aMessage.Complete(KErrNone);
+ }
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoGetAllL
+// Get all configure parameters.
+//------------------------------------------------------------------------------
+void CWmaDecoderIntfcMsgHdlr::DoGetAllL(TMMFMessage& aMessage)
+ {
+ TPckgBuf<TAllParams> pckg;
+ CWmaDecoderIntfc::TFormat format;
+ TInt status = iWmaDecoderIntfcCI->GetFormat(format);
+ pckg().iCurrentFormat = format;
+ pckg().iCurrentFormatStatus = status;
+
+ TUint bitsPerSample = 0;
+ status = iWmaDecoderIntfcCI->GetBitsPerSampleIn(bitsPerSample);
+ pckg().iCurrentBitsPerSample = bitsPerSample;
+ pckg().iCurrentBitsPerSampleStatus = status;
+
+ TUint numOfChannels = 0;
+ status = iWmaDecoderIntfcCI->GetNumOfChannelsIn(numOfChannels);
+ pckg().iCurrentNumChannelsIn = numOfChannels;
+ pckg().iCurrentNumChannelsInStatus = status;
+
+ TUint samplesPerSec = 0;
+ status = iWmaDecoderIntfcCI->GetSamplesPerSec (samplesPerSec);
+ pckg().iCurrentSamplesPerSec = samplesPerSec;
+ pckg().iCurrentSamplesPerSecStatus = status;
+
+ TUint avgBytesPerSec = 0;
+ status = iWmaDecoderIntfcCI->GetAvgBytesPerSec (avgBytesPerSec);
+ pckg().iCurrentAvgBytesPerSec = avgBytesPerSec;
+ pckg().iCurrentAvgBytesPerSecStatus = status;
+
+ TUint blockAlign = 0;
+ status = iWmaDecoderIntfcCI->GetBlockAlign (blockAlign) ;
+ pckg().iCurrentBlockAlign = blockAlign;
+ pckg().iCurrentBlockAlignStatus = status;
+
+ TUint encodeOpts = 0;
+ status = iWmaDecoderIntfcCI->GetEncodeOptions (encodeOpts);
+ pckg().iCurrentEncodeOptions = encodeOpts;
+ pckg().iCurrentEncodeOptionsStatus = status;
+
+ TUint encodeOpts1 = 0;
+ status = iWmaDecoderIntfcCI->GetEncodeOptions1 (encodeOpts1);
+ pckg().iCurrentEncodeOptions1 = encodeOpts1;
+ pckg().iCurrentEncodeOptions1Status = status;
+
+ TUint encodeOpts2 = 0;
+ status = iWmaDecoderIntfcCI->GetEncodeOptions2(encodeOpts2);
+ pckg().iCurrentEncodeOptions2 = encodeOpts2;
+ pckg().iCurrentEncodeOptions2Status = status;
+
+ TUint channelMask = 0;
+ status = iWmaDecoderIntfcCI->GetChannelMaskIn (channelMask);
+ pckg().iCurrentChannelMask = channelMask;
+ pckg().iCurrentChannelMaskStatus = status;
+
+ CWmaDecoderIntfc::TTool tool = CWmaDecoderIntfc::EToolOutput32Bit;
+ TBool able = EFalse;
+ status = iWmaDecoderIntfcCI->GetTool(tool, able);
+ pckg().iCurrentToolOutPut32Bit = able;
+ pckg().iCurrentToolOutPut32BitStatus = status;
+
+ tool = CWmaDecoderIntfc::EDownMixToStereo;
+ status = iWmaDecoderIntfcCI->GetTool(tool, able);
+ pckg().iCurrentToolDownMixToStereo = able;
+ pckg().iCurrentToolDownMixToStereoStatus = status;
+
+ tool = CWmaDecoderIntfc::ELostDataConcealment;
+ status = iWmaDecoderIntfcCI->GetTool(tool, able);
+ pckg().iCurrentToolLostDataConcealment = able;
+ pckg().iCurrentToolLostDataConcealmentStatus = status;
+
+ aMessage.WriteDataToClientL(pckg);
+
+ aMessage.Complete(KErrNone);
+ }
+
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoApplyConfigL
+// Handles the message from the proxy and calls the custom interface method
+// to commit configuration settings to the decoder.
+//------------------------------------------------------------------------------
+void CWmaDecoderIntfcMsgHdlr::DoApplyConfigL(TMMFMessage& aMessage)
+ {
+ TInt status = KErrNone;
+ TPckgBuf<TWmaDecoderConfig> pckgBuf;
+
+ aMessage.ReadData1FromClientL(pckgBuf);
+
+ iWmaDecoderIntfcCI->SetFormat(pckgBuf().iFormat);
+ iWmaDecoderIntfcCI->SetBitsPerSampleIn(pckgBuf().iBitsPerSample);
+ iWmaDecoderIntfcCI->SetNumChannelsIn(pckgBuf().iNumChannelsIn);
+ iWmaDecoderIntfcCI->SetSamplesPerSec(pckgBuf().iSamplesPerSec);
+ iWmaDecoderIntfcCI->SetAvgBytesPerSec(pckgBuf().iAvgBytesPerSec);
+ iWmaDecoderIntfcCI->SetBlockAlign(pckgBuf().iBlockAlign);
+ iWmaDecoderIntfcCI->SetEncodeOptions(pckgBuf().iEncodeOptions);
+ iWmaDecoderIntfcCI->SetEncodeOptions1(pckgBuf().iEncodeOptions1);
+ iWmaDecoderIntfcCI->SetEncodeOptions2(pckgBuf().iEncodeOptions2);
+ iWmaDecoderIntfcCI->SetChannelMaskIn(pckgBuf().iChannelMask);
+
+ TBool able = pckgBuf().iToolOutPut32Bit;
+ if (able)
+ {
+ iWmaDecoderIntfcCI->EnableTool(CWmaDecoderIntfc::EToolOutput32Bit);
+ }
+ else
+ {
+ iWmaDecoderIntfcCI->DisableTool(CWmaDecoderIntfc::EToolOutput32Bit);
+ }
+
+ able = pckgBuf().iToolDownMixToStereo;
+ if (able)
+ {
+ iWmaDecoderIntfcCI->EnableTool(CWmaDecoderIntfc::EDownMixToStereo);
+ }
+ else
+ {
+ iWmaDecoderIntfcCI->DisableTool(CWmaDecoderIntfc::EDownMixToStereo);
+ }
+
+ able = pckgBuf().iToolLostDataConcealment;
+ if (able)
+ {
+ iWmaDecoderIntfcCI->EnableTool(CWmaDecoderIntfc::ELostDataConcealment);
+ }
+ else
+ {
+ iWmaDecoderIntfcCI->DisableTool(CWmaDecoderIntfc::ELostDataConcealment);
+ }
+
+ status = iWmaDecoderIntfcCI->ApplyConfig();
+ aMessage.Complete(status);
+ }
+
+//------------------------------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::CreateBufFromUintArrayL
+// Utility function used to create a buffer and fill it with data from the
+// array passed in.
+//------------------------------------------------------------------------------
+void CWmaDecoderIntfcMsgHdlr::CreateBufFromUintArrayL(RArray<TUint>& aArray)
+ {
+ delete iDataCopyBuffer;
+ iDataCopyBuffer = NULL;
+ iDataCopyBuffer = CBufFlat::NewL(8);
+
+ RBufWriteStream stream;
+ stream.Open(*iDataCopyBuffer);
+ CleanupClosePushL(stream);
+
+ for (TInt i = 0; i < aArray.Count(); i++)
+ {
+ stream.WriteUint32L(aArray[i]);
+ }
+
+ CleanupStack::PopAndDestroy(&stream);
+ }
+
+// ---------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoGetNumOfSupportedFormatsL
+//
+// ---------------------------------------------------------
+//
+void CWmaDecoderIntfcMsgHdlr::DoGetNumOfSupportedFormatsL(TMMFMessage& aMessage)
+ {
+ iSupportedFormats.Reset();
+ TInt status = iWmaDecoderIntfcCI->GetSupportedFormats(iSupportedFormats);
+
+ CreateBufFromUintArrayL(reinterpret_cast<RArray<TUint>&>(iSupportedFormats));
+ TPckgBuf<TUint> pckg;
+ pckg() = iSupportedFormats.Count();
+ aMessage.WriteDataToClientL(pckg);
+
+ aMessage.Complete(status);
+ }
+
+// ---------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoGetNumOfSupportedToolsL(
+// ---------------------------------------------------------
+//
+void CWmaDecoderIntfcMsgHdlr::DoGetNumOfSupportedToolsL(TMMFMessage& aMessage)
+ {
+ iSupportedTools.Reset();
+ TInt status = iWmaDecoderIntfcCI->GetSupportedTools(iSupportedTools);
+ CreateBufFromUintArrayL(reinterpret_cast<RArray<TUint>&>(iSupportedTools));
+
+ TPckgBuf<TUint> pckg;
+ pckg() = iSupportedTools.Count();
+ aMessage.WriteDataToClientL(pckg);
+ aMessage.Complete(status);
+ }
+
+// ---------------------------------------------------------
+// CWmaDecoderIntfcMsgHdlr::DoGetNumOfControllableToolsL
+// ---------------------------------------------------------
+//
+void CWmaDecoderIntfcMsgHdlr::DoGetNumOfControllableToolsL(TMMFMessage& aMessage)
+ {
+ iControllableTools.Reset();
+ TInt status = iWmaDecoderIntfcCI->GetControllableTools(iControllableTools);
+ CreateBufFromUintArrayL(reinterpret_cast<RArray<TUint>&>(iControllableTools));
+ TPckgBuf<TUint> pckg;
+ pckg() = iControllableTools.Count();
+ aMessage.WriteDataToClientL(pckg);
+ aMessage.Complete(status);
+ }
+
+
+
+// End of File