/*
* Copyright (c) 2004 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:  This file contains definitions of GlobalAudioSettings.
*
*/



#ifndef GLOBALAUDIOSETTINGS_H
#define GLOBALAUDIOSETTINGS_H

#include <e32base.h>

class CGlobalAudioSettingsImpl;
class MAudioSettingsObserver;
class MAudioClientsListObserver;

/**
*  API for accessing global settings that affects Audio behavior.
*
*  This is API is intended to be used by Adaptation to read system attributes
*  that affect audio behavior. This API also provides notification when any
*  of these attribute values change.
*
*  @lib GlobalAudioSettings.lib
*  @since S60 3.2
*/
class CGlobalAudioSettings : public CBase
    {
    public:
        enum TAudioClientListType
            {
            EActiveAudioClients,
            EPausedAudioClients
            };
        
        enum TGASRingingType
            {
        /** The tone is played in a loop.
            */
            EGASRingingTypeRinging      = 0,
            /**
            * The tone is played in a loop. On the 1st round, the volume is gradually
            * increment from the lowest level to the set level.
            */
            EGASRingingTypeAscending    = 1,
            /** The tone is played only once.
            */
            EGASRingingTypeRingingOnce  = 2,
            /**
            * The phone only beeps once instead of playing the tone if one has been set.
            */
            EGASRingingTypeBeepOnce     = 3,
            /** The phone is silent.
            */
            EGASRingingTypeSilent       = 4
            };
        
        enum TGASKeypadVolume
                   {
                   EGASKeypadVolumeOff    = 0,
                   EGASKeypadVolumeLevel1 = 1,
                   EGASKeypadVolumeLevel2 = 2,
                   EGASKeypadVolumeLevel3 = 3
                   };
    public:
        /**
        * function for creating the GlobalAudioSettings
        *
        */
        IMPORT_C static CGlobalAudioSettings* NewL(MAudioSettingsObserver& aAudioSettingsObserver);

        /**
        * Destructor.
        *
        */
        IMPORT_C ~CGlobalAudioSettings();

        /**
        * Returns warning tones status set in the current profile.
        *
        * If warning tones are disabled in the current profile, Adaptation
        * should reject play requests having preferences mapped to warning tones.
        *
        * @since S60 3.2
        * @return TBool aEnable. ETrue if warning tones are enabled else EFalse.
        */
        IMPORT_C TBool IsWarningTonesEnabled();

        /**
        * Returns message tones status set in the current profile.
        *
        * If message tones are disabled in the current profile, Adaptation
        * should reject play requests having preferences mapped to message tones.
        *
        * @since S60 3.2
        * @return TBool aEnable. ETrue if message tones are enabled else EFalse.
        */
        IMPORT_C TBool IsMessageTonesEnabled();

        /**
        * Returns current silent profile status.
        *
        * @since S60 3.2
        * @return TBool aEnable. ETrue if current profile is silent profile
        * else EFalse.
        */
        IMPORT_C TBool IsSilentProfileEnabled();

        /**
        * Returns vibra status set in the current profile..
        *
        * If vibra is enabled in the current profile and vibra is not part of the
        * content, Adaptation should play vibra periodically for play requests
        * having preferences mapped to vibra settings.
        *
        * @since S60 3.2
        * @return TBool aEnable. ETrue if current profile vibra active else EFalse.
        */
        IMPORT_C TBool IsVibraEnabled();

        /**
        * Returns PublicSilence feature.
        *
        * If PublicSilence feature is enabled and if current profile is Silent
        * Profile, For all play requests having preferences mapped to Public
        * Silence setting, audio should only be played out via private accessory.
        * If no private accessory is connected, then playback should be rejected.
        *
        * @since S60 3.2
        * @return TBool aEnable. ETrue if PublicSilentMode is set else EFalse.
        */
        IMPORT_C TBool IsPublicSilenceEnabled();
        
        /**
        * Returns Message Alert Tone 
        *
        * 
        * The filename selected as the message alert tone in the
        * current profile.
        * 
        *
        * 
        * @return TDesC& aMessageAlertToneName. z:\\resource\\No_Sound.wav is returned if sound is off,else selected filename 
        * is returned
        */
        IMPORT_C TDesC& MessageAlertTone();
        
        /**
        * Returns Email Alert Tone status
        *
        * 
        * The filename selected as the email alert tone in the
        * current profile 
        * 
        *
        * 
        *  @return TBool aEnable. ETrue if current profile message tone is on else EFalse.
        */
        IMPORT_C TBool IsMessageAlertToneEnabled();
        /**
        * Returns Email Alert Tone 
        *
        * 
        * The filename selected as the email alert tone in the
        * current profile 
        * 
        *
        * 
        * @return TDesC& aEmailAlertToneName. z:\\resource\\No_Sound.wav is returned if sound is off,else selected filename 
        * is returned
        */
        IMPORT_C TDesC& EmailAlertTone();
        
        /**
       * Returns Email Alert Tone status
       *
       * 
       * The filename selected as the email alert tone in the
       * current profile 
       * 
       *
       * 
       *  @return TBool aEnable. ETrue if current profile email alert tone is on else EFalse.
       */
        IMPORT_C TBool IsEmailAlertToneEnabled();
        /**
        * Returns the RingingType
        *
        * 
        * Ringing type set in the current profile
        * 
        * 
        *
        * 
        * @return TGASRingingType aRingingType. 
        */
        
        IMPORT_C  TGASRingingType RingingType();
        
        /**
        * Returns Videocall Alert Tone 
        *
        * 
        * The filename selected as the video call alert tone in the
        * current profile 
        * 
        *
        * 
        * @return TDesC& aVideoCallAlertToneName. z:\\resource\\No_Sound.wav is returned if sound is off,else selected filename 
        * is returned
        */
        
        IMPORT_C TDesC& VideoCallAlertTone();
        /**
        * Returns Videocall Alert Tone status
        *
        * 
        * The filename selected as the video call alert tone in the
        * current profile 
        * 
        *
        * 
        * @return TBool aEnable. ETrue if current profile videocall alert tone is on else EFalse.
        */
        IMPORT_C TBool IsVideoCallAlertToneEnabled();
        /**
        * Returns Ringing Alert Tone 
        *
        * 
        * The filename selected as the ringing alert tone in the
        * current profile 
        * 
        *
        * @return TDesC& aRingingAlertTone1Name. z:\\resource\\No_Sound.wav is returned if sound is off,else selected filename 
        * is returned
        * 
        */
        
        IMPORT_C TDesC& RingingAlertTone1();
        /**
        * Returns Ringing Alert Tone1 status
        *
        * 
        * The filename selected as the ringing alert tone in the
        * current profile 
        * 
        *
        * 
        * @return TBool aEnable. ETrue if current profile ringing alert tone is on else EFalse.
        */
        IMPORT_C TBool IsRingingAlertTone1Enabled();
                
        /**
        * Returns Ringing Alert Tone 2
        *
        * 
        * The filename selected as the ringing alert tone in the
        * current profile for the alternate line
        * 
        *
        * 
        * @return TDesC& aRingingAlertTone2Name. z:\\resource\\No_Sound.wav is returned if sound is off,else selected filename 
        * is returned
        */
        
        IMPORT_C TDesC& RingingAlertTone2();
        /**
        * Returns Ringing Alert Tone 2
        *
        * 
        * The filename selected as the ringing alert tone in the
        * current profile for the alternate line
        * 
        *
        * 
        * @return TBool aEnable. ETrue if current profile ringing alert tone of alternate line is on else EFalse.
        */
        IMPORT_C TBool IsRingingAlertTone2Enabled();
                
        /**
        * Returns Ringing Keypad Volume
        *
        * 
        * The key tone volume selected  in the
        * current profile 
        * 
        *
        * 
        * @return TGASKeypadVolume aKeypadToneVolume.returns EGASKeypadVolumeOff sound is off,else selected volume level 
        * is returned
        */
        
        IMPORT_C TGASKeypadVolume KeyPadToneVolume();
        
        /**
        * Registers audio clients list observer.
        *
        * When registered successfully, the observer will start receiveing
        * callback defined in MAudioClientsListObserver when audio clients list
        * changes.
        *
        * @since S60 3.2
        * @param MAudioClientsListObserver& aObserver. A reference to class
        *           implementing MAudioClientsListObserver interface.
        * @return TInt. KErrNone if successful. KErrAlreadyExists if the observer
        *           is already registered. Otherwise a systemwide error code.
        */
        IMPORT_C TInt RegisterAudioClientsListObserver(
                                    MAudioClientsListObserver& aObserver );
                
        /**
        * Unregisters audio clients list observer.
        *
        * When unregistered, the observer will no longer receive callback when
        * audio clients list changes.
        *
        * @since S60 3.2
        * @param MAudioClientsListObserver& aObserver. A reference to class
        *           implementing MAudioClientsListObserver interface.
        * @return TInt. KErrNone if successful. KErrNotFound if the observer
        *           is not registered.
        */
        IMPORT_C TInt UnregisterAudioClientsListObserver(
                                    MAudioClientsListObserver& aObserver);

        /**
        * Gets audio clients list.
        *
        * On return of this function, the parameter aList will contain active
        * audio client application process ids.
        *
        * The parameter aList will be reset in the case
        *
        * @since S60 3.2
        * @param TAudioClientListType aFilter. Type of client list.
        * @param RArray<TProcessId>& aList. A reference to RArray.
        * @return TInt. KErrNone if successful. KErrBadName if
        *           aType is not one of the TAudioClientListType enumeration.
        *           Otherwise a systemwide error code.
        *           In case of error, the array aList will be reset.
        */
        IMPORT_C TInt GetAudioClientsList(
                                TAudioClientListType aType,
                                RArray<TProcessId>& aList );

    private:
        CGlobalAudioSettings();
        /**
        * Second Phase Costructor for GlobalAudioSettings Instance
        * @since 3.2
        * @param void
        */
        void ConstructL( MAudioSettingsObserver& aAudioSettingsObserver );
    
    private:
        CGlobalAudioSettingsImpl* iBody;
    };

#endif
// End of file
