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 EnvironmentalReverb effect message handler class. sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: // INCLUDE FILES sl@0: #include "EnvironmentalReverbMessageHandler.h" sl@0: #include "EnvironmentalReverbMessageTypes.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: CEnvironmentalReverbMessageHandler::CEnvironmentalReverbMessageHandler( sl@0: CEnvironmentalReverb* aEnvironmentalReverb ) sl@0: : CMMFObject(KUidEnvironmentalReverbEffect), sl@0: iEnvironmentalReverb(NULL), sl@0: iMessage(NULL), sl@0: iRegistered(EFalse), sl@0: iEffectDataQue(NULL) sl@0: { sl@0: iEnvironmentalReverb = aEnvironmentalReverb; sl@0: } sl@0: sl@0: sl@0: EXPORT_C CEnvironmentalReverbMessageHandler* CEnvironmentalReverbMessageHandler::NewL( sl@0: TAny* aCustomInterface ) sl@0: { sl@0: CEnvironmentalReverb* environmentalReverb = (CEnvironmentalReverb*)aCustomInterface; sl@0: CEnvironmentalReverbMessageHandler* self = new (ELeave) CEnvironmentalReverbMessageHandler(environmentalReverb); sl@0: self->ConstructL(); sl@0: return self; sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CEnvironmentalReverbMessageHandler::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 CEnvironmentalReverbMessageHandler::ConstructL() sl@0: { sl@0: iEffectDataQue = new(ELeave) TSglQue(_FOFF(CEffectDataQueItem, iLink)); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CEnvironmentalReverbMessageHandler::~CEnvironmentalReverbMessageHandler sl@0: // Before going away, unregister with the CI EnvironmentalReverb 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: CEnvironmentalReverbMessageHandler::~CEnvironmentalReverbMessageHandler() sl@0: { sl@0: sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CEnvironmentalReverbMessageHandler::~CEnvironmentalReverbMessageHandler")); sl@0: #endif sl@0: if(iEnvironmentalReverb) sl@0: iEnvironmentalReverb->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 iEnvironmentalReverb; sl@0: sl@0: } sl@0: sl@0: sl@0: // --------------------------------------------------------- sl@0: // CEnvironmentalReverbMessageHandler::HandleRequest sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CEnvironmentalReverbMessageHandler::HandleRequest( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: ASSERT(aMessage.Destination().InterfaceId() == KUidEnvironmentalReverbEffect); 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: // CEnvironmentalReverbMessageHandler::DoHandleRequestL sl@0: // Dispatches the message to the appropriate handler. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CEnvironmentalReverbMessageHandler::DoHandleRequestL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: switch( aMessage.Function() ) sl@0: { sl@0: case EErfInitialize: sl@0: { sl@0: DoInitializeL(aMessage); sl@0: break; sl@0: } sl@0: case EErfApply: sl@0: { sl@0: DoApplyL(aMessage); sl@0: break; sl@0: } sl@0: case EErfObserve: sl@0: { sl@0: DoObserveL(aMessage); sl@0: break; sl@0: } sl@0: sl@0: sl@0: sl@0: default: sl@0: { sl@0: aMessage.Complete(KErrNotSupported); sl@0: } sl@0: } sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CEnvironmentalReverbMessageHandler::DoInitializeL sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CEnvironmentalReverbMessageHandler::DoInitializeL(TMMFMessage& aMessage) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CEnvironmentalReverbMessageHandler::DoInitializeL")); sl@0: #endif sl@0: aMessage.WriteDataToClient(iEnvironmentalReverb->DoEffectData()); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: sl@0: sl@0: // --------------------------------------------------------- sl@0: // CEnvironmentalReverbMessageHandler::DoApplyL sl@0: // Extracts the data from the message. The client EnvironmentalReverb sl@0: // data is applied to the CI EnvironmentalReverb object. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CEnvironmentalReverbMessageHandler::DoApplyL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CEnvironmentalReverbMessageHandler::DoApplyL")); sl@0: #endif sl@0: TEfEnvReverbDataPckg environmentalReverbPckgFromClient; sl@0: aMessage.ReadData1FromClient(environmentalReverbPckgFromClient); sl@0: iEnvironmentalReverb->SetEffectData(environmentalReverbPckgFromClient); sl@0: iEnvironmentalReverb->ApplyL(); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CEnvironmentalReverbMessageHandler::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 CEnvironmentalReverbMessageHandler::DoObserveL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CEnvironmentalReverbMessageHandler::DoObserveL")); sl@0: #endif sl@0: sl@0: if ( !iRegistered ) sl@0: { sl@0: iEnvironmentalReverb->RegisterObserverL(*this); sl@0: iRegistered = ETrue; sl@0: } sl@0: sl@0: if ( iEffectDataQue->IsEmpty() ) sl@0: { sl@0: //iMessage = &aMessage; sl@0: iMessage = new(ELeave) TMMFMessage(aMessage); sl@0: } sl@0: else sl@0: { sl@0: TEfEnvReverbDataPckg 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: // CEnvironmentalReverbMessageHandler::EffectChanged sl@0: // The CI EnvironmentalReverb object has changed state. sl@0: // The observation message is completed if no data has been sl@0: // queued up. Otherwise, the CI EnvironmentalReverb object's data is sl@0: // packaged and queued. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CEnvironmentalReverbMessageHandler::EffectChanged( sl@0: const CAudioEffect* aAudioEffect, sl@0: TUint8 /*aEvent*/ ) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CEnvironmentalReverbMessageHandler::EffectChanged")); sl@0: #endif sl@0: sl@0: if ( iMessage && !iMessage->IsCompleted() && iEffectDataQue->IsEmpty() ) sl@0: { sl@0: iMessage->WriteDataToClient(((CEnvironmentalReverb*)aAudioEffect)->DoEffectData()); sl@0: iMessage->Complete(KErrNone); sl@0: delete iMessage; sl@0: iMessage = NULL; sl@0: } sl@0: else sl@0: { sl@0: // Saves the data and complete an observation message next time around. sl@0: HBufC8* data = NULL; sl@0: TRAPD(err1,data = ((CEnvironmentalReverb*)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("CEnvironmentalReverbMessageHandler::EffectChanged Error Allocating Memory %d"),err1); sl@0: #endif sl@0: } sl@0: } sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ========================== OTHER EXPORTED FUNCTIONS ========================= sl@0: sl@0: sl@0: // End of File