devsoundextensions/globalaudiosettings/src/GlobalAudioSettingsImpl.cpp
changeset 0 40261b775718
child 38 4269ca484c7b
child 43 98aa3ecc14d2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devsoundextensions/globalaudiosettings/src/GlobalAudioSettingsImpl.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,593 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   Implementation of the Phone Profile Settings API
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "GlobalAudioSettingsImpl.h"
+#include <e32std.h>
+#include <GlobalAudioSettingsPSKeys.h>
+#include <MGlobalAudioSettingsObserver.h>
+#include <centralrepository.h>
+#include "AudioClientsListManagerAO.h"
+#include <AudioClientsListPSKeys.h>
+
+#ifdef _DEBUG
+#define PRINT_MESSAGE
+#endif // _DEBUG
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CGlobalAudioSettingsImpl::NewL();
+// 
+// -----------------------------------------------------------------------------
+//
+CGlobalAudioSettingsImpl::CGlobalAudioSettingsImpl(
+                            CGlobalAudioSettings &aGlobalAudioSettings,
+                            MAudioSettingsObserver& aAudioSettingsObserver)
+:iGlobalAudioSettings(aGlobalAudioSettings),
+ iAudioSettingsObserver(aAudioSettingsObserver)
+	{
+	}
+	
+// -----------------------------------------------------------------------------
+// CGlobalAudioSettingsImpl::NewL();
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CGlobalAudioSettingsImpl* CGlobalAudioSettingsImpl::NewL(
+                                        CGlobalAudioSettings &aGlobalAudioSettings,
+                                        MAudioSettingsObserver& aAudioSettingsObserver)
+	{
+	CGlobalAudioSettingsImpl* self = new (ELeave) CGlobalAudioSettingsImpl(
+	                                    aGlobalAudioSettings,aAudioSettingsObserver);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+	}
+	
+// -----------------------------------------------------------------------------
+// CGlobalAudioSettingsImpl::ConstructL();
+// 
+// -----------------------------------------------------------------------------
+//
+void CGlobalAudioSettingsImpl::ConstructL()
+	{
+	iWarningTonesObserverAO = CWarningTonesObserverAO::NewL(
+                	                                        iGlobalAudioSettings,
+                	                                        iAudioSettingsObserver,
+                	                                        iGlobalAudioSettingsData);
+	iWarningTonesObserverAO->Subscribe();
+	
+	iMessagingTonesObserverAO = CMessagingTonesObserverAO::NewL(
+                                        	                iGlobalAudioSettings,
+                                        	                iAudioSettingsObserver,
+                                        	                iGlobalAudioSettingsData);
+	iMessagingTonesObserverAO->Subscribe();
+
+	iSilentProfileObserverAO = CSilentProfileObserverAO::NewL(
+                                        	                iGlobalAudioSettings,
+                                        	                iAudioSettingsObserver,
+                                        	                iGlobalAudioSettingsData);
+	iSilentProfileObserverAO->Subscribe();
+
+	iVibraObserverAO = CVibraObserverAO::NewL(
+                        	                iGlobalAudioSettings,
+                        	                iAudioSettingsObserver,
+                        	                iGlobalAudioSettingsData);
+	iVibraObserverAO->Subscribe();
+
+    RProperty publicSilenceProperty;
+	User::LeaveIfError(publicSilenceProperty.Attach(KGASPSUidGlobalAudioSettings, KGASPublicSilence));
+	User::LeaveIfError(publicSilenceProperty.Get(iGlobalAudioSettingsData.iPublicSilence));
+	publicSilenceProperty.Close();
+
+    iCAudioClientsListManagerAO = CAudioClientsListManagerAO::NewL( iGlobalAudioSettings,iAudioClientsListObserverArray,KAudioPolicyAudioClients);
+            
+    iPausedClientsListManagerAO = CAudioClientsListManagerAO::NewL( iGlobalAudioSettings,iAudioClientsListObserverArray,KAudioPolicyApplicationAudioStatePaused );
+    }
+    
+// Destructor
+EXPORT_C CGlobalAudioSettingsImpl::~CGlobalAudioSettingsImpl()
+    {
+        delete iWarningTonesObserverAO;
+        delete iMessagingTonesObserverAO;
+        delete iSilentProfileObserverAO;
+        delete iVibraObserverAO;
+        delete iCAudioClientsListManagerAO;
+        delete iPausedClientsListManagerAO;
+        iAudioClientsListObserverArray.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CGlobalAudioSettingsImpl::NewL
+// Static function for creating an instance of the EnvironmentalReverb object.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CGlobalAudioSettingsImpl::IsWarningTonesEnabled()
+	{
+	if(iGlobalAudioSettingsData.iWarningTones)
+	    return(ETrue);
+	else
+	    return(EFalse);
+	}
+
+// -----------------------------------------------------------------------------
+// CGlobalAudioSettingsImpl::IsMessageTonesEnabled
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CGlobalAudioSettingsImpl::IsMessageTonesEnabled()
+	{
+	if(iGlobalAudioSettingsData.iMessageTones)
+	    return(ETrue);
+	else
+	    return(EFalse);
+	}
+
+// -----------------------------------------------------------------------------
+// CGlobalAudioSettingsImpl::IsSilentProfileEnabled
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CGlobalAudioSettingsImpl::IsSilentProfileEnabled()
+	{
+	if(iGlobalAudioSettingsData.iSilentProfile)
+	    return(ETrue);
+	else
+	    return(EFalse);
+	}
+
+// -----------------------------------------------------------------------------
+// CGlobalAudioSettingsImpl::IsVibraEnabled
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CGlobalAudioSettingsImpl::IsVibraEnabled()
+	{
+	if(iGlobalAudioSettingsData.iVibra)
+	    return(ETrue);
+	else
+	    return(EFalse);
+	}
+
+// -----------------------------------------------------------------------------
+// CGlobalAudioSettingsImpl::IsPublicSilenceEnabled
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CGlobalAudioSettingsImpl::IsPublicSilenceEnabled()
+	{
+	if(iGlobalAudioSettingsData.iPublicSilence)
+	    return(ETrue);
+	else
+	    return(EFalse);
+	}
+
+// -----------------------------------------------------------------------------
+// CGlobalAudioSettingsImpl::RegisterAudioClientsListObserver
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CGlobalAudioSettingsImpl::RegisterAudioClientsListObserver(
+                            MAudioClientsListObserver& aObserver )
+	{
+	TInt status(KErrAlreadyExists);
+	if ( iAudioClientsListObserverArray.Find( &aObserver ) == KErrNotFound )
+	    {
+	    status = iAudioClientsListObserverArray.Append( &aObserver);
+	    if ( ( status == KErrNone ) && (iAudioClientsListObserverArray.Count() == 1 ) )
+	        {  	       
+	 	    iCAudioClientsListManagerAO->MonitorStart();
+	        iPausedClientsListManagerAO->MonitorStart();
+	        }
+	    }
+	return status;
+	}
+        
+// -----------------------------------------------------------------------------
+// CGlobalAudioSettingsImpl::UnregisterAudioClientsListObserver
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CGlobalAudioSettingsImpl::UnregisterAudioClientsListObserver(
+                            MAudioClientsListObserver& aObserver)
+	{
+	TInt status(KErrNone);
+	status = iAudioClientsListObserverArray.Find( &aObserver );
+	if ( status != KErrNotFound )
+	    {
+	    iAudioClientsListObserverArray.Remove( status );
+	    if ( iAudioClientsListObserverArray.Count() == 0 )
+	        {
+	        iCAudioClientsListManagerAO->MonitorStop();
+	        iPausedClientsListManagerAO->MonitorStop();	
+	        }
+	    }
+	return status;
+	}
+
+// -----------------------------------------------------------------------------
+// CGlobalAudioSettingsImpl::GetAudioClientsList
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CGlobalAudioSettingsImpl::GetAudioClientsList(
+                        CGlobalAudioSettings::TAudioClientListType aType,
+                        RArray<TProcessId>& aList )
+	{
+	TInt status(KErrNone);
+	
+	switch(aType)
+		{
+		case CGlobalAudioSettings::EActiveAudioClients:
+			{
+			status = iCAudioClientsListManagerAO->GetAudioClientsList( aType, aList );	
+			}
+			break;
+        case CGlobalAudioSettings::EPausedAudioClients:
+        	{
+        	status = iPausedClientsListManagerAO->GetAudioClientsList( aType, aList );     	
+        	}
+        	break;
+		default:		
+			break;
+			
+		}
+	 return status;
+	
+
+	}
+
+//////////////////////////////////////////////////////////////////////
+//	CWarningTonesObserverAO											//
+//////////////////////////////////////////////////////////////////////
+CWarningTonesObserverAO::CWarningTonesObserverAO(
+                            CGlobalAudioSettings &aGlobalAudioSettings,
+                            MAudioSettingsObserver& aAudioSettingsObserver,
+                            TGlobalAudioSettings& aGlobalAudioSettingsData)
+:CActive(EPriorityStandard),
+ iGlobalAudioSettings(aGlobalAudioSettings),
+ iAudioSettingsObserver(aAudioSettingsObserver),
+ iGlobalAudioSettingsData(aGlobalAudioSettingsData)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CWarningTonesObserverAO::~CWarningTonesObserverAO()
+	{
+	Cancel();
+	iWarningTonesProperty.Close();
+	}
+
+CWarningTonesObserverAO* CWarningTonesObserverAO::NewL(
+                        CGlobalAudioSettings &aGlobalAudioSettings,
+                        MAudioSettingsObserver& aAudioSettingsObserver,
+                        TGlobalAudioSettings& aGlobalAudioSettingsData)
+	{
+	CWarningTonesObserverAO* self = new (ELeave) CWarningTonesObserverAO(
+	                                                    aGlobalAudioSettings, 
+	                                                    aAudioSettingsObserver,
+	                                                    aGlobalAudioSettingsData);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CWarningTonesObserverAO::ConstructL()
+	{
+	User::LeaveIfError(iWarningTonesProperty.Attach(KGASPSUidGlobalAudioSettings, KGASWarningTones));
+    User::LeaveIfError(iWarningTonesProperty.Get(iGlobalAudioSettingsData.iWarningTones));
+	}
+	
+void CWarningTonesObserverAO::Subscribe()
+	{
+	if (!IsActive())
+	    {
+    	SetActive();
+    	iWarningTonesProperty.Subscribe(iStatus);
+	    }
+	}
+
+void CWarningTonesObserverAO::RunL()
+	{
+	TInt status(iStatus.Int());
+#ifdef PRINT_MESSAGE
+    RDebug::Print(_L(" CWarningTonesObserverAO::RunL:iStatus[%d]"), status);
+#endif // PRINT_MESSAGE
+    if ( status == KErrNone )
+        {
+        Subscribe();
+        status = iWarningTonesProperty.Get(iGlobalAudioSettingsData.iWarningTones);
+        if(status == KErrNone)
+            {
+            iAudioSettingsObserver.SettingsChanged(iGlobalAudioSettings, MAudioSettingsObserver::KWarningTones );
+            }
+#ifdef PRINT_MESSAGE
+        else
+            {
+            RDebug::Print(_L(" CWarningTonesObserverAO::RunL:Property.Get Error[%d]"), status);            
+            }
+#endif // PRINT_MESSAGE
+        }
+	}
+
+void CWarningTonesObserverAO::DoCancel()
+	{
+	iWarningTonesProperty.Cancel();
+	}
+
+TInt CWarningTonesObserverAO::RunError(TInt /*aError*/)
+	{
+	return KErrNone;
+	}
+
+//////////////////////////////////////////////////////////////////////
+//	CMessagingTonesObserverAO											//
+//////////////////////////////////////////////////////////////////////
+CMessagingTonesObserverAO::CMessagingTonesObserverAO(
+                                CGlobalAudioSettings &aGlobalAudioSettings,
+                                MAudioSettingsObserver& aAudioSettingsObserver,
+                                TGlobalAudioSettings& aGlobalAudioSettingsData)
+:CActive(EPriorityStandard),
+ iGlobalAudioSettings(aGlobalAudioSettings),
+ iAudioSettingsObserver(aAudioSettingsObserver),
+ iGlobalAudioSettingsData(aGlobalAudioSettingsData)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CMessagingTonesObserverAO::~CMessagingTonesObserverAO()
+	{
+	Cancel();
+	iMessagingTonesProperty.Close();
+	}
+
+CMessagingTonesObserverAO* CMessagingTonesObserverAO::NewL(
+                                               CGlobalAudioSettings &aGlobalAudioSettings,
+                                               MAudioSettingsObserver& aAudioSettingsObserver,
+                                               TGlobalAudioSettings& aGlobalAudioSettingsData)
+	{
+	CMessagingTonesObserverAO* self = new (ELeave) CMessagingTonesObserverAO(
+                    	                        aGlobalAudioSettings, aAudioSettingsObserver, 
+                    	                        aGlobalAudioSettingsData);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CMessagingTonesObserverAO::ConstructL()
+	{
+	User::LeaveIfError(iMessagingTonesProperty.Attach(KGASPSUidGlobalAudioSettings, KGASMessageTones));
+	User::LeaveIfError(iMessagingTonesProperty.Get(iGlobalAudioSettingsData.iMessageTones));
+	}
+	
+void CMessagingTonesObserverAO::Subscribe()
+	{
+	if (!IsActive())
+	    {
+    	SetActive();
+    	iMessagingTonesProperty.Subscribe(iStatus);
+	    }
+	}
+
+void CMessagingTonesObserverAO::RunL()
+	{
+	TInt status(iStatus.Int());
+#ifdef PRINT_MESSAGE
+    RDebug::Print(_L(" CMessagingTonesObserverAO::RunL:iStatus[%d]"), status);
+#endif // PRINT_MESSAGE
+    if ( status == KErrNone )
+        {
+        Subscribe();
+        status = iMessagingTonesProperty.Get(iGlobalAudioSettingsData.iMessageTones);
+        if(status == KErrNone)
+            {
+            iAudioSettingsObserver.SettingsChanged(iGlobalAudioSettings, MAudioSettingsObserver::KMessageTones);
+            }
+#ifdef PRINT_MESSAGE
+        else
+            {
+            RDebug::Print(_L(" CMessagingTonesObserverAO::RunL:Property.Get Error[%d]"), status);
+            }
+#endif // PRINT_MESSAGE
+        }
+	}
+
+void CMessagingTonesObserverAO::DoCancel()
+	{
+	iMessagingTonesProperty.Cancel();
+	}
+
+TInt CMessagingTonesObserverAO::RunError(TInt /*aError*/)
+	{
+	return KErrNone;
+	}
+	
+//////////////////////////////////////////////////////////////////////
+//	CSilentProfileObserverAO											//
+//////////////////////////////////////////////////////////////////////
+CSilentProfileObserverAO::CSilentProfileObserverAO(
+                                CGlobalAudioSettings &aGlobalAudioSettings,
+                                MAudioSettingsObserver& aAudioSettingsObserver,
+                                TGlobalAudioSettings& aGlobalAudioSettingsData)
+:CActive(EPriorityStandard),
+ iGlobalAudioSettings(aGlobalAudioSettings),
+ iAudioSettingsObserver(aAudioSettingsObserver),
+ iGlobalAudioSettingsData(aGlobalAudioSettingsData)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CSilentProfileObserverAO::~CSilentProfileObserverAO()
+	{
+	Cancel();
+	iSilentProfileProperty.Close();
+	}
+
+CSilentProfileObserverAO* CSilentProfileObserverAO::NewL(
+                                        CGlobalAudioSettings &aGlobalAudioSettings,
+                                        MAudioSettingsObserver& aAudioSettingsObserver,
+                                        TGlobalAudioSettings& aGlobalAudioSettingsData)
+	{
+	CSilentProfileObserverAO* self = new (ELeave) CSilentProfileObserverAO(
+                    	                        aGlobalAudioSettings, aAudioSettingsObserver, 
+                    	                        aGlobalAudioSettingsData);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CSilentProfileObserverAO::ConstructL()
+	{
+	User::LeaveIfError(iSilentProfileProperty.Attach(KGASPSUidGlobalAudioSettings, KGASSilentProfile));
+	User::LeaveIfError(iSilentProfileProperty.Get(iGlobalAudioSettingsData.iSilentProfile));
+	}
+	
+void CSilentProfileObserverAO::Subscribe()
+	{
+	if (!IsActive())
+	    {
+    	SetActive();
+    	iSilentProfileProperty.Subscribe(iStatus);
+	    }
+	}
+
+void CSilentProfileObserverAO::RunL()
+	{
+	TInt status(iStatus.Int());
+#ifdef PRINT_MESSAGE
+    RDebug::Print(_L(" CSilentProfileObserverAO::RunL:iStatus[%d]"), status);
+#endif // PRINT_MESSAGE
+    if ( status == KErrNone )
+        {
+        Subscribe();
+        status = iSilentProfileProperty.Get(iGlobalAudioSettingsData.iSilentProfile);
+        if(status == KErrNone)
+            {
+            iAudioSettingsObserver.SettingsChanged(iGlobalAudioSettings, MAudioSettingsObserver::KSilentProfile);
+            }
+#ifdef PRINT_MESSAGE
+        else
+            {
+            RDebug::Print(_L(" CSilentProfileObserverAO::RunL:Property.Get Error[%d]"), status);
+            }
+#endif // PRINT_MESSAGE
+        }
+	}
+
+void CSilentProfileObserverAO::DoCancel()
+	{
+	iSilentProfileProperty.Cancel();
+	}
+
+TInt CSilentProfileObserverAO::RunError(TInt /*aError*/)
+	{
+	return KErrNone;
+	}
+	
+//////////////////////////////////////////////////////////////////////
+//	CVibraObserverAO											    //
+//////////////////////////////////////////////////////////////////////
+CVibraObserverAO::CVibraObserverAO(
+                        CGlobalAudioSettings &aGlobalAudioSettings,
+                        MAudioSettingsObserver& aAudioSettingsObserver,
+                        TGlobalAudioSettings& aGlobalAudioSettingsData)
+:CActive(EPriorityStandard),
+ iGlobalAudioSettings(aGlobalAudioSettings),
+ iAudioSettingsObserver(aAudioSettingsObserver),
+ iGlobalAudioSettingsData(aGlobalAudioSettingsData)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CVibraObserverAO::~CVibraObserverAO()
+	{
+	Cancel();
+	iVibraProperty.Close();
+	}
+
+CVibraObserverAO* CVibraObserverAO::NewL(
+                            CGlobalAudioSettings &aGlobalAudioSettings,
+                            MAudioSettingsObserver& aAudioSettingsObserver,
+                            TGlobalAudioSettings& aGlobalAudioSettingsData)
+	{
+	CVibraObserverAO* self = new (ELeave) CVibraObserverAO(
+                	                        aGlobalAudioSettings,
+                	                        aAudioSettingsObserver, 
+                	                        aGlobalAudioSettingsData);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CVibraObserverAO::ConstructL()
+	{
+	User::LeaveIfError(iVibraProperty.Attach(KGASPSUidGlobalAudioSettings, KGASVibra));
+	User::LeaveIfError(iVibraProperty.Get(iGlobalAudioSettingsData.iVibra));
+	}
+	
+void CVibraObserverAO::Subscribe()
+	{
+	if (!IsActive())
+	    {
+    	SetActive();
+    	iVibraProperty.Subscribe(iStatus);
+	    }
+	}
+
+void CVibraObserverAO::RunL()
+	{
+	TInt status(iStatus.Int());
+#ifdef PRINT_MESSAGE
+    RDebug::Print(_L(" CVibraObserverAO::RunL:iStatus[%d]"), status);
+#endif // PRINT_MESSAGE
+    if ( status == KErrNone )
+        {
+        Subscribe();
+        status = iVibraProperty.Get(iGlobalAudioSettingsData.iVibra);
+        if( status == KErrNone)
+            {
+            iAudioSettingsObserver.SettingsChanged(iGlobalAudioSettings, MAudioSettingsObserver::KVibra);
+            }
+#ifdef PRINT_MESSAGE
+        else
+            {
+            RDebug::Print(_L(" CVibraObserverAO::RunL:Property.Get Error[%d]"), status);
+            }
+#endif // PRINT_MESSAGE
+        }
+	}
+
+void CVibraObserverAO::DoCancel()
+	{
+	iVibraProperty.Cancel();
+	}
+
+TInt CVibraObserverAO::RunError(TInt /*aError*/)
+	{
+	return KErrNone;
+	}
+
+//End of file