mmserv/sts/sts/src/sts.cpp
author hgs
Fri, 09 Jul 2010 16:43:35 -0500
changeset 33 5e8b14bae8c3
parent 20 b67dd1fc57c5
child 36 73253677b50a
permissions -rw-r--r--
201027
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:
hgs
parents:
diff changeset
    15
 * This file provides the implementation of System Tone Service used
hgs
parents:
diff changeset
    16
 * by the STS Server.
hgs
parents:
diff changeset
    17
 */
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include "sts.h"
33
hgs
parents: 20
diff changeset
    20
#include <AudioPreference.h>
hgs
parents: 20
diff changeset
    21
#include <MProEngEngine.h>
hgs
parents: 20
diff changeset
    22
#include <MProEngProfile.h>
hgs
parents: 20
diff changeset
    23
#include <MProEngTones.h>
hgs
parents: 20
diff changeset
    24
#include <MProEngToneSettings.h>
hgs
parents: 20
diff changeset
    25
#include <ProEngFactory.h>
hgs
parents: 20
diff changeset
    26
hgs
parents: 20
diff changeset
    27
_LIT(KDefaultFile,"z:\\data\\sounds\\digital\\clock.aac");
hgs
parents: 20
diff changeset
    28
20
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
class CSts::CPlayerNode
hgs
parents:
diff changeset
    31
    {
hgs
parents:
diff changeset
    32
public:
hgs
parents:
diff changeset
    33
    CPlayerNode(CStsPlayer* aPlayer);
hgs
parents:
diff changeset
    34
    CPlayerNode(CStsPlayer* aPlayer, MStsPlayAlarmObserver& aObserver);
hgs
parents:
diff changeset
    35
    ~CPlayerNode();
hgs
parents:
diff changeset
    36
    bool HasObserver();
hgs
parents:
diff changeset
    37
    CStsPlayer* Player();
hgs
parents:
diff changeset
    38
    MStsPlayAlarmObserver& Observer();
hgs
parents:
diff changeset
    39
private:
hgs
parents:
diff changeset
    40
    CStsPlayer* iPlayer;
hgs
parents:
diff changeset
    41
    MStsPlayAlarmObserver* iObserver;
hgs
parents:
diff changeset
    42
    };
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
CSts::CPlayerNode::CPlayerNode(CStsPlayer* aPlayer) :
hgs
parents:
diff changeset
    45
    iPlayer(aPlayer), iObserver(0)
hgs
parents:
diff changeset
    46
    {
hgs
parents:
diff changeset
    47
    }
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
CSts::CPlayerNode::CPlayerNode(CStsPlayer* aPlayer,
hgs
parents:
diff changeset
    50
        MStsPlayAlarmObserver& aObserver) :
hgs
parents:
diff changeset
    51
    iPlayer(aPlayer), iObserver(&aObserver)
hgs
parents:
diff changeset
    52
    {
hgs
parents:
diff changeset
    53
    }
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
CSts::CPlayerNode::~CPlayerNode()
hgs
parents:
diff changeset
    56
    {
hgs
parents:
diff changeset
    57
    delete iPlayer;
hgs
parents:
diff changeset
    58
    }
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
bool CSts::CPlayerNode::HasObserver()
hgs
parents:
diff changeset
    61
    {
hgs
parents:
diff changeset
    62
    return iObserver != 0;
hgs
parents:
diff changeset
    63
    }
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
CStsPlayer* CSts::CPlayerNode::Player()
hgs
parents:
diff changeset
    66
    {
hgs
parents:
diff changeset
    67
    return iPlayer;
hgs
parents:
diff changeset
    68
    }
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
MStsPlayAlarmObserver& CSts::CPlayerNode::Observer()
hgs
parents:
diff changeset
    71
    {
hgs
parents:
diff changeset
    72
    return *iObserver;
hgs
parents:
diff changeset
    73
    }
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
/*static*/CSts* CSts::Create()
hgs
parents:
diff changeset
    76
    {
hgs
parents:
diff changeset
    77
    CSts* self = new CSts();
33
hgs
parents: 20
diff changeset
    78
     
20
hgs
parents:
diff changeset
    79
    if (self != 0)
hgs
parents:
diff changeset
    80
        {
hgs
parents:
diff changeset
    81
        bool successful = self->Init();
33
hgs
parents: 20
diff changeset
    82
       
hgs
parents: 20
diff changeset
    83
        if(successful)
hgs
parents: 20
diff changeset
    84
        {	
hgs
parents: 20
diff changeset
    85
        	TRAPD( err ,self->LoadActiveProfileSettingsL());
hgs
parents: 20
diff changeset
    86
        	if( (err != KErrNone ) && (!successful))
hgs
parents: 20
diff changeset
    87
           {
20
hgs
parents:
diff changeset
    88
            delete self;
hgs
parents:
diff changeset
    89
            self = 0;
33
hgs
parents: 20
diff changeset
    90
           }
20
hgs
parents:
diff changeset
    91
        }
33
hgs
parents: 20
diff changeset
    92
      }
20
hgs
parents:
diff changeset
    93
    return self;
hgs
parents:
diff changeset
    94
    }
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
/*static*/void CSts::Delete(CSts* aSts)
hgs
parents:
diff changeset
    97
    {
hgs
parents:
diff changeset
    98
    delete aSts;
hgs
parents:
diff changeset
    99
    }
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
CSts::CSts() :
hgs
parents:
diff changeset
   102
    iNextContext(1)
hgs
parents:
diff changeset
   103
    {
hgs
parents:
diff changeset
   104
    }
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
bool CSts::Init()
hgs
parents:
diff changeset
   107
    {
33
hgs
parents: 20
diff changeset
   108
    iEngine =  ProEngFactory::NewEngineL();
20
hgs
parents:
diff changeset
   109
    return true;
hgs
parents:
diff changeset
   110
    }
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
CSts::~CSts()
hgs
parents:
diff changeset
   113
    {
hgs
parents:
diff changeset
   114
    CleanUpPlayers();
33
hgs
parents: 20
diff changeset
   115
    if (iProfile)
hgs
parents: 20
diff changeset
   116
        {
hgs
parents: 20
diff changeset
   117
        iProfile->Release();
hgs
parents: 20
diff changeset
   118
        }
hgs
parents: 20
diff changeset
   119
    	if (iEngine)
hgs
parents: 20
diff changeset
   120
        {
hgs
parents: 20
diff changeset
   121
        iEngine->Release();
hgs
parents: 20
diff changeset
   122
        }
hgs
parents: 20
diff changeset
   123
        
20
hgs
parents:
diff changeset
   124
    }
hgs
parents:
diff changeset
   125
33
hgs
parents: 20
diff changeset
   126
hgs
parents: 20
diff changeset
   127
void CSts::LoadActiveProfileSettingsL()
hgs
parents: 20
diff changeset
   128
	{
hgs
parents: 20
diff changeset
   129
		if(!iEngine)
hgs
parents: 20
diff changeset
   130
		   	{
hgs
parents: 20
diff changeset
   131
		   		iEngine =  ProEngFactory::NewEngineL();
hgs
parents: 20
diff changeset
   132
        	}
hgs
parents: 20
diff changeset
   133
		
hgs
parents: 20
diff changeset
   134
        if (iEngine)
hgs
parents: 20
diff changeset
   135
            iProfile = iEngine->ActiveProfileL();
hgs
parents: 20
diff changeset
   136
	    
hgs
parents: 20
diff changeset
   137
	    if (iProfile)
hgs
parents: 20
diff changeset
   138
	        {
hgs
parents: 20
diff changeset
   139
             MProEngToneSettings& settings  = iProfile->ToneSettings();
hgs
parents: 20
diff changeset
   140
             iWarningToneEnabled = settings.WarningAndGameTones();
hgs
parents: 20
diff changeset
   141
	        }
hgs
parents: 20
diff changeset
   142
      
hgs
parents: 20
diff changeset
   143
  }
hgs
parents: 20
diff changeset
   144
20
hgs
parents:
diff changeset
   145
void CSts::PlayTone(CSystemToneService::TToneType aTone)
hgs
parents:
diff changeset
   146
    {
33
hgs
parents: 20
diff changeset
   147
    if(iProfile)
hgs
parents: 20
diff changeset
   148
    
hgs
parents: 20
diff changeset
   149
    {
hgs
parents: 20
diff changeset
   150
    	MProEngTones&         tones = iProfile->ProfileTones();
hgs
parents: 20
diff changeset
   151
		
hgs
parents: 20
diff changeset
   152
			switch (aTone)
hgs
parents: 20
diff changeset
   153
				{
hgs
parents: 20
diff changeset
   154
				case CSystemToneService::EEmailAlert:
hgs
parents: 20
diff changeset
   155
					{
hgs
parents: 20
diff changeset
   156
				    	iFileName.Set(tones.EmailAlertTone());
hgs
parents: 20
diff changeset
   157
				    	iAudioPreference = KAudioPrefNewSMS;
hgs
parents: 20
diff changeset
   158
				    	iAudioPriority = KAudioPriorityRecvMsg ;
hgs
parents: 20
diff changeset
   159
				    	break;
hgs
parents: 20
diff changeset
   160
				    }
hgs
parents: 20
diff changeset
   161
				case CSystemToneService::ESmsAlert:
hgs
parents: 20
diff changeset
   162
					{
hgs
parents: 20
diff changeset
   163
				    	iFileName.Set(tones.MessageAlertTone());
hgs
parents: 20
diff changeset
   164
				    	iAudioPreference = KAudioPrefNewSMS;
hgs
parents: 20
diff changeset
   165
				    	iAudioPriority = KAudioPriorityRecvMsg;
hgs
parents: 20
diff changeset
   166
				    	break; 
hgs
parents: 20
diff changeset
   167
				    }
hgs
parents: 20
diff changeset
   168
				case CSystemToneService::EMmsAlert:
hgs
parents: 20
diff changeset
   169
					{
hgs
parents: 20
diff changeset
   170
				    	iFileName.Set(tones.MessageAlertTone());
hgs
parents: 20
diff changeset
   171
				    	iAudioPreference = KAudioPrefNewSMS;
hgs
parents: 20
diff changeset
   172
				    	iAudioPriority = KAudioPriorityRecvMsg;
hgs
parents: 20
diff changeset
   173
				    	break;
hgs
parents: 20
diff changeset
   174
				  	}
hgs
parents: 20
diff changeset
   175
				case CSystemToneService::EChatAlert:
hgs
parents: 20
diff changeset
   176
					{
hgs
parents: 20
diff changeset
   177
				    	iFileName.Set(tones.MessageAlertTone());
hgs
parents: 20
diff changeset
   178
				    	iAudioPreference = KAudioPrefNewSMS ;
hgs
parents: 20
diff changeset
   179
				    	iAudioPriority = KAudioPriorityRecvMsg;
hgs
parents: 20
diff changeset
   180
				    	break;
hgs
parents: 20
diff changeset
   181
				    } 
hgs
parents: 20
diff changeset
   182
				case CSystemToneService::EWarningBeep:
hgs
parents: 20
diff changeset
   183
				    {
hgs
parents: 20
diff changeset
   184
				    	iAudioPreference = KAudioPrefWarning;
hgs
parents: 20
diff changeset
   185
				    	iAudioPriority =  KAudioPriorityWarningTone ;
hgs
parents: 20
diff changeset
   186
				    	if (iWarningToneEnabled)
hgs
parents: 20
diff changeset
   187
				      	  iFileName.Set(KDefaultFile);
hgs
parents: 20
diff changeset
   188
				    	else
hgs
parents: 20
diff changeset
   189
				      	  iVolume = 0;
hgs
parents: 20
diff changeset
   190
				    
hgs
parents: 20
diff changeset
   191
				    	break;
hgs
parents: 20
diff changeset
   192
				    }
hgs
parents: 20
diff changeset
   193
				default:
hgs
parents: 20
diff changeset
   194
					{
hgs
parents: 20
diff changeset
   195
					  	iFileName.Set(KDefaultFile);
hgs
parents: 20
diff changeset
   196
					  	iAudioPreference = KAudioPrefDefaultTone;
hgs
parents: 20
diff changeset
   197
				        iAudioPriority = KAudioPriorityWarningTone ;
hgs
parents: 20
diff changeset
   198
				      break;
hgs
parents: 20
diff changeset
   199
				    }
hgs
parents: 20
diff changeset
   200
				}
hgs
parents: 20
diff changeset
   201
			}
hgs
parents: 20
diff changeset
   202
			
hgs
parents: 20
diff changeset
   203
		else
hgs
parents: 20
diff changeset
   204
		{			 
hgs
parents: 20
diff changeset
   205
				 iFileName.Set(KDefaultFile);
hgs
parents: 20
diff changeset
   206
				 iAudioPreference = KAudioPrefDefaultTone;
hgs
parents: 20
diff changeset
   207
				 iAudioPriority = KAudioPriorityWarningTone ;
hgs
parents: 20
diff changeset
   208
		}
hgs
parents: 20
diff changeset
   209
		
hgs
parents: 20
diff changeset
   210
		
20
hgs
parents:
diff changeset
   211
    CStsPlayer* player = CStsPlayer::CreateTonePlayer(*this, aTone,
33
hgs
parents: 20
diff changeset
   212
            iNextContext, iFileName, iVolume, 
hgs
parents: 20
diff changeset
   213
            iAudioPreference, iAudioPriority);
20
hgs
parents:
diff changeset
   214
    if (player != 0)
hgs
parents:
diff changeset
   215
        {
hgs
parents:
diff changeset
   216
        iPlayerMap[iNextContext] = new CPlayerNode(player);
hgs
parents:
diff changeset
   217
        iNextContext++;
hgs
parents:
diff changeset
   218
        if (iNextContext == 0)
hgs
parents:
diff changeset
   219
            iNextContext++;
hgs
parents:
diff changeset
   220
        player->Play();
hgs
parents:
diff changeset
   221
        }
hgs
parents:
diff changeset
   222
    else
hgs
parents:
diff changeset
   223
        {
hgs
parents:
diff changeset
   224
        //TODO: Add trace here
hgs
parents:
diff changeset
   225
        }
hgs
parents:
diff changeset
   226
    }
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
void CSts::PlayAlarm(CSystemToneService::TAlarmType aAlarm,
hgs
parents:
diff changeset
   229
        unsigned int& aAlarmContext, MStsPlayAlarmObserver& aObserver)
hgs
parents:
diff changeset
   230
    {
33
hgs
parents: 20
diff changeset
   231
    
hgs
parents: 20
diff changeset
   232
    if(iProfile)
hgs
parents: 20
diff changeset
   233
    
hgs
parents: 20
diff changeset
   234
   		 {
hgs
parents: 20
diff changeset
   235
    		MProEngTones&         tones = iProfile->ProfileTones();
hgs
parents: 20
diff changeset
   236
		 
hgs
parents: 20
diff changeset
   237
		 	switch (aAlarm)
hgs
parents: 20
diff changeset
   238
        	{
hgs
parents: 20
diff changeset
   239
        	case CSystemToneService::EIncomingCall:
hgs
parents: 20
diff changeset
   240
        		{
hgs
parents: 20
diff changeset
   241
            		iFileName.Set(tones.RingingTone1());
hgs
parents: 20
diff changeset
   242
            		iAudioPreference = KAudioPrefIncomingCall ;
hgs
parents: 20
diff changeset
   243
					iAudioPriority = KAudioPriorityRingingTone ;
hgs
parents: 20
diff changeset
   244
            		break;
hgs
parents: 20
diff changeset
   245
            	}
hgs
parents: 20
diff changeset
   246
       		case CSystemToneService::EIncomingCallLine2:
hgs
parents: 20
diff changeset
   247
       			{
hgs
parents: 20
diff changeset
   248
            		iFileName.Set(tones.RingingTone2());
hgs
parents: 20
diff changeset
   249
            		iAudioPreference = KAudioPrefIncomingCall;
hgs
parents: 20
diff changeset
   250
					iAudioPriority = KAudioPriorityRingingTone ;
hgs
parents: 20
diff changeset
   251
            		break;  
hgs
parents: 20
diff changeset
   252
            	}
hgs
parents: 20
diff changeset
   253
            case CSystemToneService::EIncomingDataCall:
hgs
parents: 20
diff changeset
   254
            	{
hgs
parents: 20
diff changeset
   255
            		iFileName.Set(tones.VideoCallRingingTone());
hgs
parents: 20
diff changeset
   256
            		iAudioPreference = KAudioPrefIncomingDataCall;
hgs
parents: 20
diff changeset
   257
		    		iAudioPriority = KAudioPriorityRealOnePlayer;
hgs
parents: 20
diff changeset
   258
            		break;
hgs
parents: 20
diff changeset
   259
            	}
hgs
parents: 20
diff changeset
   260
        	default:
hgs
parents: 20
diff changeset
   261
        		{
hgs
parents: 20
diff changeset
   262
        			iFileName.Set(KDefaultFile);
hgs
parents: 20
diff changeset
   263
        			iAudioPreference = KAudioPrefAlarmClock  ;
hgs
parents: 20
diff changeset
   264
					iAudioPriority = KAudioPriorityAlarm;
hgs
parents: 20
diff changeset
   265
					break;
hgs
parents: 20
diff changeset
   266
            	}
hgs
parents: 20
diff changeset
   267
       		}
hgs
parents: 20
diff changeset
   268
      	}
hgs
parents: 20
diff changeset
   269
      else
hgs
parents: 20
diff changeset
   270
		{		
hgs
parents: 20
diff changeset
   271
			     iFileName.Set(KDefaultFile);	 
hgs
parents: 20
diff changeset
   272
				 iAudioPreference = KAudioPrefDefaultTone;
hgs
parents: 20
diff changeset
   273
				 iAudioPriority = KAudioPriorityWarningTone ;
hgs
parents: 20
diff changeset
   274
				 
hgs
parents: 20
diff changeset
   275
		}  
hgs
parents: 20
diff changeset
   276
    	
20
hgs
parents:
diff changeset
   277
    CStsPlayer* player = CStsPlayer::CreateAlarmPlayer(*this, aAlarm,
33
hgs
parents: 20
diff changeset
   278
             iNextContext, iFileName, iVolume, 
hgs
parents: 20
diff changeset
   279
             iAudioPreference, iAudioPriority);
20
hgs
parents:
diff changeset
   280
    if (player != 0)
hgs
parents:
diff changeset
   281
        {
hgs
parents:
diff changeset
   282
        iPlayerMap[iNextContext] = new CPlayerNode(player, aObserver);
hgs
parents:
diff changeset
   283
        aAlarmContext = iNextContext;
hgs
parents:
diff changeset
   284
        iNextContext++;
hgs
parents:
diff changeset
   285
        if (iNextContext == 0)
hgs
parents:
diff changeset
   286
            iNextContext++;
hgs
parents:
diff changeset
   287
        player->Play();
hgs
parents:
diff changeset
   288
        }
hgs
parents:
diff changeset
   289
    else
hgs
parents:
diff changeset
   290
        {
hgs
parents:
diff changeset
   291
        //TODO: Add trace here
hgs
parents:
diff changeset
   292
        aAlarmContext = 0;
hgs
parents:
diff changeset
   293
        }
hgs
parents:
diff changeset
   294
    }
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
void CSts::StopAlarm(unsigned int aAlarmContext)
hgs
parents:
diff changeset
   297
    {
hgs
parents:
diff changeset
   298
    CPlayerNode* node = iPlayerMap[aAlarmContext];
hgs
parents:
diff changeset
   299
    iPlayerMap.erase(aAlarmContext);
hgs
parents:
diff changeset
   300
    if (node)
hgs
parents:
diff changeset
   301
        {
hgs
parents:
diff changeset
   302
        node->Player()->Stop();
hgs
parents:
diff changeset
   303
        delete node;
hgs
parents:
diff changeset
   304
        }
hgs
parents:
diff changeset
   305
    else
hgs
parents:
diff changeset
   306
        {
hgs
parents:
diff changeset
   307
        //TODO: Add trace here
hgs
parents:
diff changeset
   308
        }
hgs
parents:
diff changeset
   309
    }
hgs
parents:
diff changeset
   310
hgs
parents:
diff changeset
   311
void CSts::CleanUpPlayers()
hgs
parents:
diff changeset
   312
    {
hgs
parents:
diff changeset
   313
        while (!iPlayerMap.empty())
hgs
parents:
diff changeset
   314
            {
hgs
parents:
diff changeset
   315
            //TODO: Add trace here
hgs
parents:
diff changeset
   316
            StopAlarm(iPlayerMap.begin()->first);
hgs
parents:
diff changeset
   317
            }
hgs
parents:
diff changeset
   318
    }
hgs
parents:
diff changeset
   319
hgs
parents:
diff changeset
   320
void CSts::PlayComplete(unsigned int aContext)
hgs
parents:
diff changeset
   321
    {
hgs
parents:
diff changeset
   322
    CPlayerNode* node = iPlayerMap[aContext];
hgs
parents:
diff changeset
   323
    iPlayerMap.erase(aContext);
hgs
parents:
diff changeset
   324
    if (node)
hgs
parents:
diff changeset
   325
        {
hgs
parents:
diff changeset
   326
        CStsPlayer* player = node->Player();
hgs
parents:
diff changeset
   327
        if (node->HasObserver())
hgs
parents:
diff changeset
   328
            {
hgs
parents:
diff changeset
   329
            node->Observer().PlayAlarmComplete(aContext);
hgs
parents:
diff changeset
   330
            }
hgs
parents:
diff changeset
   331
        delete node;
hgs
parents:
diff changeset
   332
        }
hgs
parents:
diff changeset
   333
    else
hgs
parents:
diff changeset
   334
        {
hgs
parents:
diff changeset
   335
        // TODO: log unexpected error
hgs
parents:
diff changeset
   336
        }
hgs
parents:
diff changeset
   337
    }