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 RoomLevel 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 "RoomLevelProxy.h" sl@0: #include "RoomLevelEventObserver.h" sl@0: #include sl@0: #include "EnvironmentalReverbProxy.h" sl@0: sl@0: sl@0: // ============================ MEMBER FUNCTIONS =============================== sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CRoomLevelProxy::CRoomLevelProxy sl@0: // C++ default constructor can NOT contain any code, that sl@0: // might leave. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: CRoomLevelProxy::CRoomLevelProxy( 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: CRoomLevelProxy::~CRoomLevelProxy() sl@0: { sl@0: sl@0: // Remove the custom interface message handler before we destroy the proxy. sl@0: if (iClientReverb) sl@0: ((CEnvironmentalReverbProxy*)iClientReverb)->RoomLevelDetached(*this); sl@0: if (iCustomInterfaceUtility) sl@0: iCustomInterfaceUtility->RemoveCustomInterface(iMessageHandler); sl@0: delete iRoomLevelEventObserver; sl@0: delete iCustomInterfaceUtility; sl@0: sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CRoomLevelProxy::NewL sl@0: // Static function for creating an instance of the Environmental RoomLevel object. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: EXPORT_C CRoomLevelProxy* CRoomLevelProxy::NewL( sl@0: TMMFMessageDestinationPckg aMessageHandler, sl@0: MCustomCommand& aCustomCommand, sl@0: CCustomInterfaceUtility* aCustomInterfaceUtility ) sl@0: { sl@0: CRoomLevelProxy* self = new (ELeave) CRoomLevelProxy(aMessageHandler, aCustomCommand, aCustomInterfaceUtility); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(self); sl@0: sl@0: return self; sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CRoomLevelProxy::ConstructL sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CRoomLevelProxy::ConstructL() sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CRoomLevelProxy::ConstructL")); sl@0: #endif sl@0: iRoomLevelEventObserver = CRoomLevelEventObserver::NewL(iMessageHandler, *iCustomCommand, *this); sl@0: StartObserver(); sl@0: // sends a message to fetch initial data. sl@0: TEfRoomLevelDataPckg dataPckgFrom; sl@0: iCustomCommand->CustomCommandSync(iMessageHandler, (TInt)ERoomInitialize, KNullDesC8, KNullDesC8, dataPckgFrom); sl@0: SetEffectData(dataPckgFrom); sl@0: sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CRoomLevelProxy::ApplyL sl@0: // Apply the Environmental RoomLevel settings. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: EXPORT_C void CRoomLevelProxy::ApplyL() sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CRoomLevelProxy::Apply")); sl@0: #endif sl@0: sl@0: if ( !iHaveUpdateRights ) sl@0: { sl@0: User::Leave(KErrAccessDenied); sl@0: } sl@0: sl@0: iRoomLevelData.iEnabled = iEnabled; sl@0: iRoomLevelData.iEnforced = iEnforced; sl@0: iRoomLevelData.iHaveUpdateRights = iHaveUpdateRights; sl@0: iCustomCommand->CustomCommandSync(iMessageHandler, (TInt)ERoomApply, DoEffectData(), KNullDesC8); sl@0: sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CRoomLevelProxy::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 CRoomLevelProxy::StartObserver() sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CRoomLevelProxy::StartObserver")); sl@0: #endif sl@0: sl@0: iRoomLevelEventObserver->Start(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CRoomLevelProxy::RoomLevelEvent sl@0: // Checks which data member has changed and notify the observers. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CRoomLevelProxy::RoomLevelEvent( sl@0: const TDesC8& aBuffer ) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CRoomLevelProxy::RoomLevelEvent")); sl@0: #endif sl@0: sl@0: TEfRoomLevelDataPckg dataPckgFrom; sl@0: dataPckgFrom.Copy(aBuffer); sl@0: TEfRoomLevel newRoomLevelData = dataPckgFrom(); sl@0: sl@0: TUint8 event = 0; sl@0: sl@0: if ( newRoomLevelData.iEnabled != iRoomLevelData.iEnabled ) sl@0: { sl@0: iRoomLevelData.iEnabled = newRoomLevelData.iEnabled; sl@0: iEnabled = newRoomLevelData.iEnabled; sl@0: if ( iRoomLevelData.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 ( newRoomLevelData.iEnforced != iRoomLevelData.iEnforced ) sl@0: { sl@0: iRoomLevelData.iEnforced = newRoomLevelData.iEnforced; sl@0: iEnforced = newRoomLevelData.iEnforced; sl@0: if ( iRoomLevelData.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 ( newRoomLevelData.iHaveUpdateRights != iRoomLevelData.iHaveUpdateRights ) sl@0: { sl@0: iRoomLevelData.iHaveUpdateRights = newRoomLevelData.iHaveUpdateRights; sl@0: iHaveUpdateRights = newRoomLevelData.iHaveUpdateRights; sl@0: if ( iRoomLevelData.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: sl@0: else if ( newRoomLevelData.iEnvironmentalReverbId != iRoomLevelData.iEnvironmentalReverbId ) sl@0: { sl@0: iRoomLevelData.iEnvironmentalReverbId = newRoomLevelData.iEnvironmentalReverbId; sl@0: // event = MRoomLevelObserver::KRoomLevelChanged; sl@0: } sl@0: sl@0: else if ( newRoomLevelData.iStreamRoomLevel != iRoomLevelData.iStreamRoomLevel ) sl@0: { sl@0: iRoomLevelData.iStreamRoomLevel = newRoomLevelData.iStreamRoomLevel; sl@0: event = MRoomLevelObserver::KRoomLevelChanged; sl@0: } sl@0: else if ( newRoomLevelData.iStreamMinRoomLevel != iRoomLevelData.iStreamMinRoomLevel ) sl@0: { sl@0: iRoomLevelData.iStreamMinRoomLevel = newRoomLevelData.iStreamMinRoomLevel; sl@0: // event = MRoomLevelObserver::KMinRoomLevelChanged; sl@0: } sl@0: else if ( newRoomLevelData.iStreamMaxRoomLevel != iRoomLevelData.iStreamMaxRoomLevel ) sl@0: { sl@0: iRoomLevelData.iStreamMaxRoomLevel = newRoomLevelData.iStreamMaxRoomLevel; sl@0: // event = MRoomLevelObserver::KMinRoomLevelChanged; 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: // ----------------------------------------------------------------------------- sl@0: // CRoomLevelProxy::AttachReverb sl@0: // Set room level's reverb ID sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CRoomLevelProxy::AttachReverb(CEnvironmentalReverb& aReverb) sl@0: { sl@0: TInt err(KErrNone); sl@0: iRoomLevelData.iEnvironmentalReverbId = ((CEnvironmentalReverbProxy&)aReverb).GetUniqueId(); sl@0: TRAP(err,(((CEnvironmentalReverbProxy&)(aReverb)).RoomLevelAttached(*this))); sl@0: sl@0: return err; sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CRoomLevelProxy::DettachReverb sl@0: // sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CRoomLevelProxy::DettachReverb(CEnvironmentalReverb& aReverb) sl@0: { sl@0: TInt status(KErrNone); sl@0: iClientReverb = NULL; sl@0: if ( iCustomInterfaceUtility ) sl@0: { sl@0: iCustomInterfaceUtility->RemoveCustomInterface(iMessageHandler); sl@0: } sl@0: TRAP(status,(((CEnvironmentalReverbProxy&)(aReverb)).RoomLevelDetached(*this))); sl@0: return status; sl@0: } sl@0: sl@0: // ========================== OTHER EXPORTED FUNCTIONS ========================= sl@0: sl@0: // End of File sl@0: sl@0: