sl@0: /* sl@0: * Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: Implementation of the bassboost effect message handler class. sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: // INCLUDE FILES sl@0: #include "SourceOrientationMessageHandler.h" sl@0: #include "SourceOrientationMessageTypes.h" sl@0: #include sl@0: #include "EffectDataQueItem.h" sl@0: #ifdef _DEBUG sl@0: #include sl@0: #endif sl@0: sl@0: // ================= MEMBER FUNCTIONS ======================= sl@0: sl@0: // C++ default constructor can NOT contain any code, that sl@0: // might leave. sl@0: // sl@0: CSourceOrientationMessageHandler::CSourceOrientationMessageHandler( sl@0: CSourceOrientation* aSourceOrientation ) sl@0: : CMMFObject(KUidSourceOrientationEffect), sl@0: iSourceOrientation(NULL), sl@0: iMessage(NULL), sl@0: iRegistered(EFalse), sl@0: iEffectDataQue(NULL) sl@0: { sl@0: iSourceOrientation = aSourceOrientation; sl@0: } sl@0: sl@0: sl@0: EXPORT_C CSourceOrientationMessageHandler* CSourceOrientationMessageHandler::NewL( sl@0: TAny* aCustomInterface ) sl@0: { sl@0: CSourceOrientation* bassboost = (CSourceOrientation*)aCustomInterface; sl@0: CSourceOrientationMessageHandler* self = new (ELeave) CSourceOrientationMessageHandler(bassboost); sl@0: self->ConstructL(); sl@0: return self; sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CSourceOrientationMessageHandler::ConstructL sl@0: // Symbian 2nd phase constructor can leave. sl@0: // Create and initializes the effect data queue. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CSourceOrientationMessageHandler::ConstructL() sl@0: { sl@0: iEffectDataQue = new(ELeave) TSglQue(_FOFF(CEffectDataQueItem, iLink)); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CSourceOrientationMessageHandler::~CSourceOrientationMessageHandler sl@0: // Before going away, unregister with the CI SourceOrientation object. sl@0: // The observation message must be completed if outstanding. sl@0: // The effect data queue must be emptied and destroyed. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: CSourceOrientationMessageHandler::~CSourceOrientationMessageHandler() sl@0: { sl@0: sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CSourceOrientationMessageHandler::~CSourceOrientationMessageHandler")); sl@0: #endif sl@0: if(iSourceOrientation) sl@0: iSourceOrientation->UnRegisterObserver(*this); sl@0: iRegistered = EFalse; sl@0: sl@0: if(iMessage) sl@0: { sl@0: if ( !iMessage->IsCompleted() ) sl@0: { sl@0: iMessage->Complete(KErrCancel); sl@0: delete iMessage; sl@0: } sl@0: } sl@0: sl@0: if ( iEffectDataQue ) sl@0: { sl@0: CEffectDataQueItem* queItem; sl@0: while ( !iEffectDataQue->IsEmpty() ) sl@0: { sl@0: queItem = iEffectDataQue->First(); sl@0: iEffectDataQue->Remove(*queItem); sl@0: delete queItem; sl@0: } sl@0: sl@0: delete iEffectDataQue; sl@0: } sl@0: sl@0: delete iSourceOrientation; sl@0: sl@0: } sl@0: sl@0: sl@0: // --------------------------------------------------------- sl@0: // CSourceOrientationMessageHandler::HandleRequest sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CSourceOrientationMessageHandler::HandleRequest( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: ASSERT(aMessage.Destination().InterfaceId() == KUidSourceOrientationEffect); sl@0: TRAPD(error,DoHandleRequestL(aMessage)); sl@0: if ( error ) sl@0: { sl@0: aMessage.Complete(error); sl@0: } sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CSourceOrientationMessageHandler::DoHandleRequestL sl@0: // Dispatches the message to the appropriate handler. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CSourceOrientationMessageHandler::DoHandleRequestL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: switch( aMessage.Function() ) sl@0: { sl@0: case ESofInitialize: // Request to initialize the bassboost sl@0: { sl@0: DoInitializeL(aMessage); sl@0: break; sl@0: } sl@0: case ESofApply: // Request to apply the bassboost settings sl@0: { sl@0: DoApplyL(aMessage); sl@0: break; sl@0: } sl@0: case ESofObserve: // Observation request sl@0: { sl@0: DoObserveL(aMessage); sl@0: break; sl@0: } sl@0: default: sl@0: { sl@0: aMessage.Complete(KErrNotSupported); sl@0: } sl@0: } sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CSourceOrientationMessageHandler::DoInitializeL sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CSourceOrientationMessageHandler::DoInitializeL(TMMFMessage& aMessage) sl@0: { sl@0: aMessage.WriteDataToClient(iSourceOrientation->DoEffectData()); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CSourceOrientationMessageHandler::DoApplyL sl@0: // Extracts the data from the message. The client bassboost data sl@0: // is applied to the CI bassboost object. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CSourceOrientationMessageHandler::DoApplyL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: TEfOrientationDataPckg orientationPckgFromClient; sl@0: aMessage.ReadData1FromClient(orientationPckgFromClient); sl@0: sl@0: iSourceOrientation->SetEffectData(orientationPckgFromClient); sl@0: iSourceOrientation->ApplyL(); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CSourceOrientationMessageHandler::DoObserveL sl@0: // Receives the observation request message and depending sl@0: // on the status of the effect data queue, the message is sl@0: // completed immediately or saved for later completion. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CSourceOrientationMessageHandler::DoObserveL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CSourceOrientationMessageHandler::DoObserveL")); sl@0: #endif sl@0: sl@0: if ( !iRegistered ) // Don't register again if we're registered. sl@0: { sl@0: iSourceOrientation->RegisterObserverL(*this); sl@0: iRegistered = ETrue; sl@0: } sl@0: sl@0: if ( iEffectDataQue->IsEmpty() ) sl@0: { sl@0: // Message is saved and completed when an event occurs sl@0: iMessage = new(ELeave) TMMFMessage(aMessage); sl@0: } sl@0: else sl@0: { sl@0: TEfOrientationDataPckg dataPckg; sl@0: CEffectDataQueItem* item = iEffectDataQue->First(); sl@0: dataPckg.Copy(item->EffectData()); sl@0: aMessage.WriteDataToClient(dataPckg); sl@0: aMessage.Complete(KErrNone); sl@0: iEffectDataQue->Remove(*item); sl@0: delete item; sl@0: } sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CSourceOrientationMessageHandler::EffectChanged sl@0: // The CI bassboost object has changed state. sl@0: // The observation message is completed if no data has been sl@0: // queued up. Otherwise, the CI bassboost object's data is sl@0: // packaged and queued. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CSourceOrientationMessageHandler::EffectChanged( sl@0: const CAudioEffect* aAudioEffect, sl@0: TUint8 /*aEvent*/ ) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CSourceOrientationMessageHandler::EffectChanged")); sl@0: #endif sl@0: sl@0: if ( iMessage && !iMessage->IsCompleted() && iEffectDataQue->IsEmpty() ) sl@0: { sl@0: iMessage->WriteDataToClient(((CSourceOrientation*)aAudioEffect)->DoEffectData()); sl@0: iMessage->Complete(KErrNone); sl@0: delete iMessage; sl@0: iMessage = NULL; sl@0: } sl@0: else // no message pending and there is no event queued up sl@0: { sl@0: // Saves the data and complete an observation message next time when sl@0: // there is a pending message. sl@0: HBufC8* data = NULL; sl@0: TRAPD(err1,data = ((CSourceOrientation*)aAudioEffect)->DoEffectData().AllocL()); sl@0: if(!err1) sl@0: { sl@0: //CleanupStack::PushL(data); sl@0: CEffectDataQueItem* item = NULL; sl@0: TRAPD(err2,item = CEffectDataQueItem::NewL(data)); sl@0: if(!err2) sl@0: { sl@0: iEffectDataQue->AddLast(*item); sl@0: } sl@0: else sl@0: { sl@0: delete data; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CSourceOrientationMessageHandler::EffectChanged Error Allocating Memory %d"),err1); sl@0: #endif sl@0: } sl@0: } sl@0: } sl@0: sl@0: sl@0: // ========================== OTHER EXPORTED FUNCTIONS ========================= sl@0: sl@0: sl@0: sl@0: // End of File