devsoundextensions/globalaudiosettings/src/GlobalAudioSettingsImpl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:56:55 +0200
changeset 0 40261b775718
child 38 4269ca484c7b
child 43 98aa3ecc14d2
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* 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