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 Environmental Reverb proxy class sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: sl@0: // INCLUDE FILES sl@0: sl@0: #ifdef _DEBUG sl@0: #include sl@0: #endif sl@0: sl@0: #include "EnvironmentalReverbProxy.h" sl@0: #include "EnvironmentalReverbEventObserver.h" sl@0: #include "RoomLevelProxy.h" sl@0: #include sl@0: sl@0: sl@0: sl@0: // ============================ MEMBER FUNCTIONS =============================== sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CEnvironmentalReverbProxy::CEnvironmentalReverbProxy sl@0: // C++ default constructor can NOT contain any code, that sl@0: // might leave. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: CEnvironmentalReverbProxy::CEnvironmentalReverbProxy( sl@0: TMMFMessageDestinationPckg aMessageHandler, sl@0: MCustomCommand& aCustomCommand, sl@0: CCustomInterfaceUtility* aCustomInterfaceUtility ) sl@0: : iCustomCommand(&aCustomCommand), sl@0: iMessageHandler(aMessageHandler), sl@0: iCustomInterfaceUtility(aCustomInterfaceUtility) sl@0: sl@0: { sl@0: } sl@0: sl@0: // Destructor sl@0: CEnvironmentalReverbProxy::~CEnvironmentalReverbProxy() sl@0: { sl@0: // Remove the custom interface message handler before we destroy the proxy. sl@0: sl@0: TInt numOfRoomLevel = iCRoomLevelProxyList.Count(); sl@0: if (numOfRoomLevel > 0) sl@0: { sl@0: for (TInt i = 0; i < numOfRoomLevel; ++i) sl@0: { sl@0: iCRoomLevelProxyList[i]->DettachReverb(*this); sl@0: } sl@0: }; sl@0: iCRoomLevelProxyList.Close(); sl@0: if(iCustomInterfaceUtility) sl@0: iCustomInterfaceUtility->RemoveCustomInterface(iMessageHandler); sl@0: delete iEnvironmentalReverbEventObserver; sl@0: delete iCustomInterfaceUtility; sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CEnvironmentalReverbProxy::NewL sl@0: // Static function for creating an instance of the Environmental Reverb object. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: EXPORT_C CEnvironmentalReverbProxy* CEnvironmentalReverbProxy::NewL( sl@0: TMMFMessageDestinationPckg aMessageHandler, sl@0: MCustomCommand& aCustomCommand, sl@0: CCustomInterfaceUtility* aCustomInterfaceUtility ) sl@0: { sl@0: CEnvironmentalReverbProxy* self = new (ELeave) CEnvironmentalReverbProxy(aMessageHandler, aCustomCommand, aCustomInterfaceUtility); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CEnvironmentalReverbProxy::ConstructL sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CEnvironmentalReverbProxy::ConstructL() sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CEnvironmentalReverbProxy::ConstructL")); sl@0: #endif sl@0: iEnvironmentalReverbEventObserver = CEnvironmentalReverbEventObserver::NewL(iMessageHandler, *iCustomCommand, *this); sl@0: StartObserver(); sl@0: // sends a message to fetch initial data. sl@0: TEfEnvReverbDataPckg dataPckgFrom; sl@0: iCustomCommand->CustomCommandSync(iMessageHandler, (TInt)EErfInitialize, KNullDesC8, KNullDesC8, dataPckgFrom); sl@0: SetEffectData(dataPckgFrom); sl@0: sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CEnvironmentalReverbProxy::GetUniqueId sl@0: // return a TInt 32 integer sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TUint32 CEnvironmentalReverbProxy::GetUniqueId() const sl@0: { sl@0: return iReverbData.iEnvironmentalReverbId; sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CEnvironmentalReverbProxy::AttachRoomLevel sl@0: // Add the reference of aProxy to array sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CEnvironmentalReverbProxy::RoomLevelAttached(CRoomLevelProxy& aProxy) sl@0: { sl@0: sl@0: TInt error = iCRoomLevelProxyList.Find(&aProxy); sl@0: if (error == KErrNotFound) sl@0: { sl@0: error = iCRoomLevelProxyList.Append(&aProxy); sl@0: } sl@0: sl@0: sl@0: return error; sl@0: sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CEnvironmentalReverbImpl::DetachRoomLevel sl@0: // Remove the reference of aProxy from array sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CEnvironmentalReverbProxy::RoomLevelDetached(CRoomLevelProxy& aProxy) sl@0: { sl@0: TInt found = iCRoomLevelProxyList.Find(&aProxy); sl@0: if (found != KErrNotFound) sl@0: { sl@0: iCRoomLevelProxyList.Remove(found); sl@0: found = KErrNone; sl@0: } sl@0: return found; sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CEnvironmentalReverbProxy::ApplyL sl@0: // Apply the Environmental Reverb settings. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: EXPORT_C void CEnvironmentalReverbProxy::ApplyL() sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CEnvironmentalReverbProxy::Apply")); sl@0: #endif sl@0: sl@0: if ( !iHaveUpdateRights ) sl@0: { sl@0: User::Leave(KErrAccessDenied); sl@0: } sl@0: sl@0: iReverbData.iEnabled = iEnabled; sl@0: iReverbData.iEnforced = iEnforced; sl@0: iReverbData.iHaveUpdateRights = iHaveUpdateRights; sl@0: iCustomCommand->CustomCommandSync(iMessageHandler, (TInt)EErfApply, DoEffectData(), KNullDesC8); sl@0: sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CEnvironmentalReverbProxy::StartObserver sl@0: // Starts the event observer. The event observer monitors asynchronous events sl@0: // from the message handler. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CEnvironmentalReverbProxy::StartObserver() sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CEnvironmentalReverbProxy::StartObserver")); sl@0: #endif sl@0: sl@0: iEnvironmentalReverbEventObserver->Start(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CEnvironmentalReverbProxy::EnvironmentalReverbEvent sl@0: // Checks which data member has changed and notify the observers. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CEnvironmentalReverbProxy::EnvironmentalReverbEvent( sl@0: const TDesC8& aBuffer ) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CEnvironmentalReverbProxy::EnvironmentalReverbEvent")); sl@0: #endif sl@0: sl@0: TEfEnvReverbDataPckg dataPckgFrom; sl@0: dataPckgFrom.Copy(aBuffer); sl@0: TEfEnvironmentalReverb newReverbData = dataPckgFrom(); sl@0: sl@0: TUint8 event = 0; sl@0: sl@0: if ( newReverbData.iEnabled != iReverbData.iEnabled ) sl@0: { sl@0: iReverbData.iEnabled = newReverbData.iEnabled; sl@0: iEnabled = newReverbData.iEnabled; sl@0: if ( iReverbData.iEnabled ) sl@0: { sl@0: event = MAudioEffectObserver::KEnabled; sl@0: } sl@0: else sl@0: { sl@0: event = MAudioEffectObserver::KDisabled; sl@0: } sl@0: } sl@0: else if ( newReverbData.iEnforced != iReverbData.iEnforced ) sl@0: { sl@0: iReverbData.iEnforced = newReverbData.iEnforced; sl@0: iEnforced = newReverbData.iEnforced; sl@0: if ( iReverbData.iEnforced ) sl@0: { sl@0: event = MAudioEffectObserver::KEnforced; sl@0: } sl@0: else sl@0: { sl@0: event = MAudioEffectObserver::KNotEnforced; sl@0: } sl@0: } sl@0: else if ( newReverbData.iHaveUpdateRights != iReverbData.iHaveUpdateRights ) sl@0: { sl@0: iReverbData.iHaveUpdateRights = newReverbData.iHaveUpdateRights; sl@0: iHaveUpdateRights = newReverbData.iHaveUpdateRights; sl@0: if ( iReverbData.iHaveUpdateRights ) sl@0: { sl@0: event = MAudioEffectObserver::KGainedUpdateRights; sl@0: } sl@0: else sl@0: { sl@0: event = MAudioEffectObserver::KLostUpdateRights; sl@0: } sl@0: } sl@0: else if ( newReverbData.iDecayTime != iReverbData.iDecayTime ) sl@0: { sl@0: iReverbData.iDecayTime = newReverbData.iDecayTime; sl@0: event = MEnvironmentalReverbObserver::KDecayTimeChanged; sl@0: } sl@0: else if ( newReverbData.iDecayHFRatio != iReverbData.iDecayHFRatio ) sl@0: { sl@0: iReverbData.iDecayHFRatio = newReverbData.iDecayHFRatio; sl@0: event = MEnvironmentalReverbObserver::KDecayHFRatioChanged; sl@0: } sl@0: else if ( newReverbData.iDensity != iReverbData.iDensity ) sl@0: { sl@0: iReverbData.iDensity = newReverbData.iDensity; sl@0: event = MEnvironmentalReverbObserver::KDensityChanged; sl@0: } sl@0: else if ( newReverbData.iDiffusion != iReverbData.iDiffusion ) sl@0: { sl@0: iReverbData.iDiffusion = newReverbData.iDiffusion; sl@0: event = MEnvironmentalReverbObserver::KDiffusionChanged; sl@0: } sl@0: else if ( newReverbData.iReflectionsDelay != iReverbData.iReflectionsDelay ) sl@0: { sl@0: iReverbData.iReflectionsDelay = newReverbData.iReflectionsDelay; sl@0: event = MEnvironmentalReverbObserver::KReflectionsDelayChanged; sl@0: } sl@0: else if ( newReverbData.iReflectionsLevel != iReverbData.iReflectionsLevel ) sl@0: { sl@0: iReverbData.iReflectionsLevel = newReverbData.iReflectionsLevel; sl@0: event = MEnvironmentalReverbObserver::KReflectionsLevelChanged; sl@0: } sl@0: else if ( newReverbData.iReverbDelay != iReverbData.iReverbDelay ) sl@0: { sl@0: iReverbData.iReverbDelay = newReverbData.iReverbDelay; sl@0: event = MEnvironmentalReverbObserver::KReverbDelayChanged; sl@0: } sl@0: else if ( newReverbData.iReverbLevel != iReverbData.iReverbLevel ) sl@0: { sl@0: iReverbData.iReverbLevel = newReverbData.iReverbLevel; sl@0: event = MEnvironmentalReverbObserver::KReverbLevelChanged; sl@0: } sl@0: else if ( newReverbData.iRoomLevel != iReverbData.iRoomLevel ) sl@0: { sl@0: iReverbData.iRoomLevel = newReverbData.iRoomLevel; sl@0: event = MEnvironmentalReverbObserver::KRoomLevelChanged; sl@0: } sl@0: else if ( newReverbData.iRoomHFLevel != iReverbData.iRoomHFLevel ) sl@0: { sl@0: iReverbData.iRoomHFLevel = newReverbData.iRoomHFLevel; sl@0: event = MEnvironmentalReverbObserver::KRoomHFLevelChanged; sl@0: } sl@0: else if ( newReverbData.iEnvironmentalReverbId != iReverbData.iEnvironmentalReverbId ) sl@0: { sl@0: iReverbData.iEnvironmentalReverbId = newReverbData.iEnvironmentalReverbId; sl@0: // event = MEnvironmentalReverbObserver::KRoomHFLevelChanged; sl@0: } sl@0: sl@0: sl@0: sl@0: if (!event) sl@0: return; sl@0: sl@0: for ( TInt i = 0; i < iObservers.Count(); i++ ) sl@0: { sl@0: iObservers[i]->EffectChanged(this, event); sl@0: } sl@0: } sl@0: sl@0: sl@0: // ========================== OTHER EXPORTED FUNCTIONS ========================= sl@0: sl@0: // End of File sl@0: sl@0: