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 AudioEqualizer effect message handler class. sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: // INCLUDE FILES sl@0: #include "AudioEqualizerMessageHandler.h" sl@0: #include "AudioEqualizerMessageTypes.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: CAudioEqualizerMessageHandler::CAudioEqualizerMessageHandler( sl@0: CAudioEqualizer* aAudioEqualizer ) sl@0: : CMMFObject(KUidAudioEqualizerEffect), sl@0: iAudioEqualizer(NULL), sl@0: iMessage(NULL), sl@0: iRegistered(EFalse), sl@0: iEffectDataQue(NULL) sl@0: { sl@0: iAudioEqualizer = aAudioEqualizer; sl@0: } sl@0: sl@0: sl@0: EXPORT_C CAudioEqualizerMessageHandler* CAudioEqualizerMessageHandler::NewL( sl@0: TAny* aCustomInterface ) sl@0: { sl@0: CAudioEqualizer* audioEqualizer = (CAudioEqualizer*)aCustomInterface; sl@0: CAudioEqualizerMessageHandler* self = new (ELeave) CAudioEqualizerMessageHandler(audioEqualizer); sl@0: self->ConstructL(); sl@0: return self; sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CAudioEqualizerMessageHandler::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 CAudioEqualizerMessageHandler::ConstructL() sl@0: { sl@0: iEffectDataQue = new(ELeave) TSglQue(_FOFF(CEffectDataQueItem, iLink)); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CAudioEqualizerMessageHandler::~CAudioEqualizerMessageHandler sl@0: // Before going away, unregister with the CI AudioEqualizer 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: CAudioEqualizerMessageHandler::~CAudioEqualizerMessageHandler() sl@0: { sl@0: sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CAudioEqualizerMessageHandler::~CAudioEqualizerMessageHandler")); sl@0: #endif sl@0: sl@0: if(iAudioEqualizer) sl@0: iAudioEqualizer->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 iAudioEqualizer; sl@0: sl@0: } sl@0: sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioEqualizerMessageHandler::HandleRequest sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioEqualizerMessageHandler::HandleRequest( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: ASSERT(aMessage.Destination().InterfaceId() == KUidAudioEqualizerEffect); 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: // CAudioEqualizerMessageHandler::DoHandleRequestL sl@0: // Dispatches the message to the appropriate handler. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioEqualizerMessageHandler::DoHandleRequestL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: switch( aMessage.Function() ) sl@0: { sl@0: case EAefInitialize: sl@0: { sl@0: DoInitializeL(aMessage); sl@0: break; sl@0: } sl@0: case EAefInitializeBand: sl@0: { sl@0: DoInitializeBandL(aMessage); sl@0: break; sl@0: } sl@0: case EAefGetNumberOfBands: sl@0: { sl@0: DoGetNumberOfBandsL(aMessage); sl@0: break; sl@0: } sl@0: case EAefApply: sl@0: { sl@0: DoApplyL(aMessage); sl@0: break; sl@0: } sl@0: case EAefApplyBand: sl@0: { sl@0: DoApplyBandL(aMessage); sl@0: break; sl@0: } sl@0: case EAefObserve: 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: // CAudioEqualizerMessageHandler::DoInitializeL sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioEqualizerMessageHandler::DoInitializeL(TMMFMessage& aMessage) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CAudioEqualizerMessageHandler::DoInitializeL")); sl@0: #endif sl@0: aMessage.WriteDataToClient(iAudioEqualizer->DoEffectData()); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioEqualizerMessageHandler::DoInitializeBandL sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioEqualizerMessageHandler::DoInitializeBandL(TMMFMessage& aMessage) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CAudioEqualizerMessageHandler::DoInitializeBandL")); sl@0: #endif sl@0: TUint8 band = 0; sl@0: TPckgBuf bandPckg; sl@0: aMessage.ReadData1FromClient(bandPckg); sl@0: band = bandPckg(); sl@0: aMessage.WriteDataToClient(iAudioEqualizer->DoBandDataL(band, EFalse)); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioEqualizerMessageHandler::DoGetNumberOfBandsL sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioEqualizerMessageHandler::DoGetNumberOfBandsL(TMMFMessage& aMessage) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CAudioEqualizerMessageHandler::DoGetNumberOfBandsL")); sl@0: #endif sl@0: TUint8 band = iAudioEqualizer->NumberOfBands(); sl@0: TPckgBuf bandPckg(band); sl@0: aMessage.WriteDataToClient(bandPckg); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioEqualizerMessageHandler::DoApplyL sl@0: // Extracts the data from the message. The client AudioEqualizer sl@0: // data is applied to the CI AudioEqualizer object. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioEqualizerMessageHandler::DoApplyL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CAudioEqualizerMessageHandler::DoApplyL")); sl@0: #endif sl@0: TEfAudioEqualizerDataPckg audioEqualizerPckgFromClient; sl@0: aMessage.ReadData1FromClient(audioEqualizerPckgFromClient); sl@0: iAudioEqualizer->SetEffectData(audioEqualizerPckgFromClient); sl@0: // iAudioEqualizer->ApplyL(); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioEqualizerMessageHandler::DoApplyBandL sl@0: // Extracts the data from the message. The client Audio Equalizer sl@0: // band data is applied to the CI AudioEqualizer object. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioEqualizerMessageHandler::DoApplyBandL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CAudioEqualizerMessageHandler::DoApplyBandL")); sl@0: #endif sl@0: TEfAudioEqualizerBandDataPckg audioEqualizerBandDataPckgFromClient; sl@0: HBufC8* bandDataBuf = HBufC8::NewL(iAudioEqualizer->NumberOfBands() * sizeof(TEfAudioEqualizerBand)); sl@0: TPtr8 des = bandDataBuf->Des(); sl@0: des.SetLength(bandDataBuf->Size()); sl@0: sl@0: aMessage.ReadData1FromClient(des); sl@0: //aMessage.ReadData1FromClient(audioEqualizerBandDataPckgFromClient); sl@0: //iAudioEqualizer->SetBandDataL(1,audioEqualizerBandDataPckgFromClient); sl@0: iAudioEqualizer->SetBandDataL(2,des); sl@0: delete bandDataBuf; sl@0: iAudioEqualizer->ApplyL(); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: // --------------------------------------------------------- sl@0: // CAudioEqualizerMessageHandler::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 CAudioEqualizerMessageHandler::DoObserveL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CAudioEqualizerMessageHandler::DoObserveL")); sl@0: #endif sl@0: sl@0: if ( !iRegistered ) sl@0: { sl@0: iAudioEqualizer->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: TEfAudioEqualizerCombinedDataPckg 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: // CAudioEqualizerMessageHandler::EffectChanged sl@0: // The CI AudioEqualizer object has changed state. sl@0: // The observation message is completed if no data has been sl@0: // queued up. Otherwise, the CI AudioEqualizer object's data is sl@0: // packaged and queued. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioEqualizerMessageHandler::EffectChanged( sl@0: const CAudioEffect* aAudioEffect, sl@0: TUint8 aEvent ) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CAudioEqualizerMessageHandler::EffectChanged")); sl@0: #endif sl@0: sl@0: TEfAudioEqualizerCombined data; sl@0: data.iAudioEqualizerDataValid = EFalse; sl@0: data.iAudioEqualizerBandDataValid = EFalse; sl@0: sl@0: if ( aEvent < MAudioEffectObserver::KSpecificEffectBase ) sl@0: { sl@0: data.iEnabled = ((CAudioEqualizer*)aAudioEffect)->IsEnabled(); sl@0: data.iHaveUpdateRights = ((CAudioEqualizer*)aAudioEffect)->HaveUpdateRights(); sl@0: data.iEnforced = ((CAudioEqualizer*)aAudioEffect)->IsEnforced(); sl@0: data.iAudioEqualizerDataValid = ETrue; sl@0: } sl@0: else sl@0: { sl@0: TUint8 band = aEvent - MAudioEffectObserver::KSpecificEffectBase; sl@0: data.iBandId = band; sl@0: data.iBandLevel = ((CAudioEqualizer*)aAudioEffect)->BandLevel(band); sl@0: data.iBandWidth = ((CAudioEqualizer*)aAudioEffect)->BandWidth(band); sl@0: data.iCenterFrequency = ((CAudioEqualizer*)aAudioEffect)->CenterFrequency(band); sl@0: data.iCrossoverFrequency = ((CAudioEqualizer*)aAudioEffect)->CrossoverFrequency(band); sl@0: data.iAudioEqualizerBandDataValid = ETrue; sl@0: } sl@0: sl@0: TEfAudioEqualizerCombinedDataPckg dataPckg(data); sl@0: sl@0: if ( iMessage && !iMessage->IsCompleted() && iEffectDataQue->IsEmpty() ) sl@0: { sl@0: iMessage->WriteDataToClient(dataPckg); 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 = dataPckg.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("CAudioEqualizerMessageHandler::EffectChanged Error Allocating Memory %d"),err1); sl@0: #endif sl@0: } 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