mmserv/tms/tmsserver/src/tmsrtplayer.cpp
branchRCL_3
changeset 19 095bea5f582e
equal deleted inserted replaced
18:a36789189b53 19:095bea5f582e
       
     1 /*
       
     2  * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3  * All rights reserved.
       
     4  * This component and the accompanying materials are made available
       
     5  * under the terms of "Eclipse Public License v1.0"
       
     6  * which accompanies this distribution, and is available
       
     7  * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8  *
       
     9  * Initial Contributors:
       
    10  * Nokia Corporation - initial contribution.
       
    11  *
       
    12  * Contributors:
       
    13  *
       
    14  * Description: Telephony Multimedia Service
       
    15  *
       
    16  */
       
    17 
       
    18 // INCLUDE FILES
       
    19 #include <AudioPreference.h>
       
    20 #include <MProEngTones.h>
       
    21 #include <MProEngToneSettings.h>
       
    22 #include <ProEngFactory.h>
       
    23 #include "tmsshared.h"
       
    24 #include "tmsutility.h"
       
    25 #include "tmsrtplayerobsrv.h"
       
    26 #include "tmsrtcontainer.h"
       
    27 #include "tmsrtplayer.h"
       
    28 
       
    29 using namespace TMS;
       
    30 
       
    31 // CONSTANTS
       
    32 const TInt KTMSMaxRingingWaiting = 3000000;
       
    33 const TInt KTMSTtsAscendingStep = 3000000;
       
    34 const TInt KRTDefaultVolume = 2;
       
    35 //const TInt KTtsVolumeBoost = 9;
       
    36 const TInt KTtsVolumeMin = 2;
       
    37 const TInt KTtsVolumeAscendingRepeat = 4;
       
    38 const TInt KPlayerVolumeAscendingRepeat = 3;
       
    39 const TInt KTtsVolumeAscendingDecrease = 2;
       
    40 
       
    41 // Delays between periods of Text-To-Speech playback
       
    42 // {3000000, 4000000} means the following order of playing:
       
    43 // 3 secs tone, then TTS, then 4 secs of tone, then TTS, then tone forever.
       
    44 const TInt KTMSTtsDelays[] = {3000000, 4000000};
       
    45 // Number of elements in KTMSTtsDelays array.
       
    46 const TInt KTMSTtsDelaysCount = sizeof(KTMSTtsDelays) / sizeof (TInt);
       
    47 const TInt Kkilo = 1024;
       
    48 
       
    49 _LIT(KTMSTtsHeader, "(tts)");
       
    50 
       
    51 #ifdef __WINSCW__
       
    52 //_LIT(KTMSDefaultSoundFile, "z:\\data\\sounds\\digital\\Nokia_tune.aac");
       
    53 _LIT(KTMSDefaultSoundFile, "Z:\\Data\\Sounds\\Digital\\Nokia tune.aac");
       
    54 //_LIT(KTMSDefaultSoundFile, "c:\\data\\sounds\\digital\\test_8khz.wav");
       
    55 _LIT(KTMSNoSoundSequence,  "z:\\data\\sounds\\digital\\clock.aac");
       
    56 //_LIT(KTMSNoSoundSequence, "c:\\data\\sounds\\digital\\test_8khz.wav");
       
    57 _LIT(KTMSBeepSequence,     "z:\\data\\sounds\\digital\\clock.aac");
       
    58 //_LIT(KTMSBeepSequence, "c:\\data\\sounds\\digital\\test_8khz.wav");
       
    59 _LIT(KTMSUnsecureVoIPCall, "z:\\data\\sounds\\digital\\alarm.aac");
       
    60 //_LIT(KTMSUnsecureVoIPCall, "c:\\data\\sounds\\digital\\test_8khz.wav");
       
    61 #else
       
    62 // DO NOT change these sequences!
       
    63 _LIT(KTMSDefaultSoundFile, "\\System\\Sounds\\Simple\\Nokia tune.wav");
       
    64 _LIT8(KTMSBeepSequence, "\x00\x11\x0A\x0A\x08\x73\x0A\x40\x28\x0A\xF7\x05\
       
    65 \xFC\x40\x64\x0A\x08\x40\x32\x0A\xF7\x06\x0B");
       
    66 _LIT8(KTMSNoSoundSequence, "\x00\x11\x0A\x05\xFC\x0A\x08\x40\x32\x0A\xF7\
       
    67 \x40\x64\x06\x0B");
       
    68 _LIT8(KTMSUnsecureVoIPCall, "\x00\x11\x0B\x67\x04\x40\x04\x67\x04\x40\x04\
       
    69 \x6C\x04\x40\x04\x6D\x04\x0B");
       
    70 #endif // __WINSCW__
       
    71 
       
    72 // -----------------------------------------------------------------------------
       
    73 // TMSRingTonePlayer::NewL
       
    74 // -----------------------------------------------------------------------------
       
    75 //
       
    76 TMSRingTonePlayer* TMSRingTonePlayer::NewL(TMSRtPlayerObsrv& aObserver)
       
    77     {
       
    78     TMSRingTonePlayer* self = new (ELeave) TMSRingTonePlayer(aObserver);
       
    79     CleanupStack::PushL(self);
       
    80     self->ConstructL();
       
    81     CleanupStack::Pop(self);
       
    82     return self;
       
    83     }
       
    84 
       
    85 // -----------------------------------------------------------------------------
       
    86 // TMSRingTonePlayer::TMSRingTonePlayer
       
    87 // -----------------------------------------------------------------------------
       
    88 //
       
    89 TMSRingTonePlayer::TMSRingTonePlayer(TMSRtPlayerObsrv& aObserver) :
       
    90     iRtObserver(aObserver)
       
    91     {
       
    92     }
       
    93 
       
    94 // -----------------------------------------------------------------------------
       
    95 // TMSRingTonePlayer::ConstructL
       
    96 // -----------------------------------------------------------------------------
       
    97 //
       
    98 void TMSRingTonePlayer::ConstructL()
       
    99     {
       
   100     TRACE_PRN_FN_ENT;
       
   101 
       
   102     for (TInt i = EPlayerFirst; i <= EPlayerLast; i++)
       
   103         {
       
   104         User::LeaveIfError(iAsyncDeletePlayers.Append(NULL));
       
   105         }
       
   106 
       
   107     // Construct timer.
       
   108     iTimer = TMSTimer::NewL();
       
   109     iTtsDelayTimer = TMSTimer::NewL();
       
   110     iAsyncReqAO = TMSAsyncReqAO::NewL(this);
       
   111 
       
   112     // TODO:
       
   113     // Checks if DRM extend security is needed
       
   114     // Check video player configuration.
       
   115 
       
   116     iEngine =  ProEngFactory::NewEngineL();
       
   117 
       
   118     InitRtParams(EPlayerBackup);
       
   119     //CreateDefaultRingToneL();
       
   120     CreateBkpRtPlayerL();
       
   121     //GetMaxToneFileSizeL(iToneFileSizeLimitKB);
       
   122 
       
   123     TRACE_PRN_FN_EXT;
       
   124     }
       
   125 
       
   126 // -----------------------------------------------------------------------------
       
   127 // TMSRingTonePlayer::~TMSRingTonePlayer
       
   128 // -----------------------------------------------------------------------------
       
   129 //
       
   130 TMSRingTonePlayer::~TMSRingTonePlayer()
       
   131     {
       
   132     TRACE_PRN_FN_ENT;
       
   133 
       
   134     iAsyncDeletePlayers.ResetAndDestroy();
       
   135     iAsyncDeletePlayers.Close();
       
   136     if (iProfile)
       
   137         {
       
   138         iProfile->Release();
       
   139         }
       
   140     if (iEngine)
       
   141         {
       
   142         iEngine->Release();
       
   143         }
       
   144     RemovePlayers();
       
   145     delete iBackupPlayer;
       
   146     delete iAsyncReqAO;
       
   147     delete iTimer;
       
   148     delete iTtsDelayTimer;
       
   149     delete iRtContainer;
       
   150 
       
   151     TRACE_PRN_FN_EXT;
       
   152     }
       
   153 
       
   154 // -----------------------------------------------------------------------------
       
   155 // TMSRingTonePlayer::InitRtParams
       
   156 // -----------------------------------------------------------------------------
       
   157 //
       
   158 void TMSRingTonePlayer::InitRtParams(TRtPlayerType aPlayerType)
       
   159     {
       
   160     TRACE_PRN_FN_ENT;
       
   161 
       
   162     iRtParam.iType = aPlayerType;
       
   163     iRtParam.iPriority = KAudioPriorityPhoneCall;
       
   164     iRtParam.iPreference = KAudioPrefIncomingCall;
       
   165     iRtParam.iRingingType = EProfileRingingTypeRinging;
       
   166     iRtParam.iVolume = KRTDefaultVolume;
       
   167     iRtParam.iTextToSay.Set(KNullDesC());
       
   168 
       
   169     if (aPlayerType == EPlayerUnsecureVoIP)
       
   170         {
       
   171         iRtParam.iPriority = KAudioPrioritySpecialInformationTone;
       
   172         iRtParam.iPreference = KAudioPrefSpecialInformation;
       
   173         }
       
   174 
       
   175     TRACE_PRN_FN_EXT;
       
   176     }
       
   177 
       
   178 // -----------------------------------------------------------------------------
       
   179 // TMSRingTonePlayer::CreateDefaultPlayerL
       
   180 // -----------------------------------------------------------------------------
       
   181 //
       
   182 void TMSRingTonePlayer::CreateDefaultRingToneL()
       
   183     {
       
   184     TRACE_PRN_FN_ENT;
       
   185 
       
   186     InitRtParams(EPlayerDefault);
       
   187     LoadProfileRingToneL();
       
   188 
       
   189     TRACE_PRN_FN_EXT;
       
   190     }
       
   191 
       
   192 // -----------------------------------------------------------------------------
       
   193 // TMSRingTonePlayer::LoadActiveProfileSettingsL
       
   194 // -----------------------------------------------------------------------------
       
   195 //
       
   196 void TMSRingTonePlayer::LoadActiveProfileSettingsL()
       
   197     {
       
   198     if (!iEngine)
       
   199         {
       
   200         iEngine =  ProEngFactory::NewEngineL();
       
   201         }
       
   202     if (iProfile)
       
   203         {
       
   204         iProfile->Release();
       
   205         iProfile = NULL;
       
   206         }
       
   207     __ASSERT_ALWAYS(iEngine, PANIC(TMS_RESULT_UNINITIALIZED_OBJECT));
       
   208 
       
   209     iProfile = iEngine->ActiveProfileL();
       
   210     if (iProfile)
       
   211         {
       
   212         MProEngToneSettings& settings = iProfile->ToneSettings();
       
   213         iRtParam.iVolume = settings.RingingVolume();
       
   214         iRtParam.iRingingType = settings.RingingType();
       
   215         iRtParam.iCallerText = settings.TextToSpeech();
       
   216         }
       
   217     }
       
   218 
       
   219 // -----------------------------------------------------------------------------
       
   220 // TMSRingTonePlayer::LoadProfileRingToneL
       
   221 // -----------------------------------------------------------------------------
       
   222 //
       
   223 void TMSRingTonePlayer::LoadProfileRingToneL()
       
   224     {
       
   225     TRACE_PRN_FN_ENT;
       
   226 
       
   227     LoadActiveProfileSettingsL();
       
   228     __ASSERT_ALWAYS(iProfile, PANIC(TMS_RESULT_UNINITIALIZED_OBJECT));
       
   229 
       
   230     MProEngTones& tones = iProfile->ProfileTones();
       
   231     // Get alternate line RT: tones.RingingTone2()
       
   232     // Get default video RT: tones.VideoCallRingingTone()
       
   233 
       
   234     if (!iRtContainer)
       
   235         {
       
   236         iRtContainer = TMSRtContainer::NewL(tones.RingingTone1());
       
   237         }
       
   238     else
       
   239         {
       
   240         if (tones.RingingTone1().CompareF(iRtContainer->FileName()) != KErrNone)
       
   241             {
       
   242             // Profile changed - update RT
       
   243             iRtContainer->SetFileName(tones.RingingTone1());
       
   244             iRtContainer->RefreshMime();
       
   245             }
       
   246         }
       
   247 
       
   248     TRACE_PRN_FN_EXT;
       
   249     }
       
   250 
       
   251 // -----------------------------------------------------------------------------
       
   252 // TMSRingTonePlayer::CreateBkpRtPlayerL
       
   253 // -----------------------------------------------------------------------------
       
   254 //
       
   255 void TMSRingTonePlayer::CreateBkpRtPlayerL()
       
   256     {
       
   257     TRACE_PRN_FN_ENT;
       
   258 
       
   259     delete iBackupPlayer;
       
   260     iBackupPlayer = NULL;
       
   261     TFileName file(KTMSDefaultSoundFile);
       
   262     iBackupPlayer = TMSRtAudioHdlr::NewL(file, KAudioPriorityPhoneCall,
       
   263             KAudioPrefIncomingCall, *this, EPlayerBackup);
       
   264 
       
   265     TRACE_PRN_FN_EXT;
       
   266     }
       
   267 
       
   268 // -----------------------------------------------------------------------------
       
   269 // TMSRingTonePlayer::CreateDefaultRtPlayerL
       
   270 // -----------------------------------------------------------------------------
       
   271 //
       
   272 void TMSRingTonePlayer::CreateDefaultRtPlayerL()
       
   273     {
       
   274     TRACE_PRN_FN_ENT;
       
   275 
       
   276     // Fresh start for the default tone.
       
   277     CreateDefaultRingToneL();
       
   278 
       
   279     delete iDefaultPlayer;
       
   280     iDefaultPlayer = NULL;
       
   281     iDefaultPlayer = TMSRtAudioHdlr::NewL(*iRtContainer,
       
   282             KAudioPriorityPhoneCall, KAudioPrefIncomingCall, *this,
       
   283             EPlayerDefault, EFalse);
       
   284 
       
   285     TRACE_PRN_FN_EXT;
       
   286     }
       
   287 
       
   288 // -----------------------------------------------------------------------------
       
   289 // TMSRingTonePlayer::CreateAudioPlayerL
       
   290 // -----------------------------------------------------------------------------
       
   291 //
       
   292 void TMSRingTonePlayer::CreateAudioPlayerL()
       
   293     {
       
   294     TRACE_PRN_FN_ENT;
       
   295 
       
   296     delete iAudioPlayer;
       
   297     iAudioPlayer = NULL;
       
   298     iAudioPlayer = TMSRtAudioHdlr::NewL(*iRtContainer, iRtParam.iPriority,
       
   299             iRtParam.iPreference, *this, iRtParam.iType,
       
   300             iRtParam.iType == EPlayerDefault ? EFalse : iExtSecNeeded);
       
   301 
       
   302     TRACE_PRN_FN_EXT;
       
   303     }
       
   304 
       
   305 // -----------------------------------------------------------------------------
       
   306 // TMSRingTonePlayer::CreateRingTonePlayerL
       
   307 // -----------------------------------------------------------------------------
       
   308 //
       
   309 void TMSRingTonePlayer::CreateRingTonePlayerL(const TRtPlayerType aPlayer,
       
   310         const TDesC& aFile)
       
   311     {
       
   312     TRACE_PRN_FN_ENT;
       
   313 
       
   314     TInt len = aFile.Length();
       
   315     if (!len || aPlayer == EPlayerDefault)
       
   316         {
       
   317         CreateDefaultRtPlayerL();
       
   318         }
       
   319     else
       
   320         {
       
   321         if (!iRtContainer)
       
   322             {
       
   323             CreateDefaultRingToneL();
       
   324             }
       
   325         if (len && iRtContainer)
       
   326             {
       
   327             iRtContainer->SetFileName(aFile);
       
   328             iRtContainer->RefreshMime();
       
   329             iRtParam.iType = aPlayer;
       
   330             }
       
   331         CreateAudioPlayerL();
       
   332         }
       
   333 
       
   334     TRACE_PRN_FN_EXT;
       
   335     }
       
   336 
       
   337 // -----------------------------------------------------------------------------
       
   338 // TMSRingTonePlayer::CreateSequencePlayerL
       
   339 // -----------------------------------------------------------------------------
       
   340 //
       
   341 void TMSRingTonePlayer::CreateSequencePlayerL(const TRtPlayerType aPlayer)
       
   342     {
       
   343     TRACE_PRN_FN_ENT;
       
   344 
       
   345     switch (aPlayer)
       
   346         {
       
   347         case EPlayerBeepOnce:
       
   348             CreateBeepOncePlayerL();
       
   349             break;
       
   350         case EPlayerSilent:
       
   351             CreateSilentPlayerL();
       
   352             break;
       
   353         case EPlayerUnsecureVoIP:
       
   354             CreateUnsecureVoipPlayerL();
       
   355             break;
       
   356         default:
       
   357             break;
       
   358         }
       
   359 
       
   360     TRACE_PRN_FN_EXT;
       
   361     }
       
   362 
       
   363 // -----------------------------------------------------------------------------
       
   364 // TMSRingTonePlayer::CreateBeepOncePlayerL
       
   365 // -----------------------------------------------------------------------------
       
   366 //
       
   367 void TMSRingTonePlayer::CreateBeepOncePlayerL()
       
   368     {
       
   369     TRACE_PRN_FN_ENT;
       
   370 
       
   371     delete iBeepOncePlayer;
       
   372     iBeepOncePlayer = NULL;
       
   373 
       
   374 #ifdef __WINSCW__
       
   375     TParse* fp = new (ELeave) TParse();
       
   376     fp->Set(KTMSBeepSequence, NULL, NULL);
       
   377     TFileName fileName(fp->FullName());
       
   378     delete fp;
       
   379     iBeepOncePlayer = TMSRtAudioHdlr::NewL(fileName, iRtParam.iPriority,
       
   380             iRtParam.iPreference, *this, EPlayerBeepOnce);
       
   381 #else
       
   382     iBeepOncePlayer = TMSRtAudioHdlr::NewSeqL(KTMSBeepSequence(),
       
   383             iRtParam.iPriority, iRtParam.iPreference, *this, EPlayerBeepOnce);
       
   384 #endif // __WINSCW__
       
   385 
       
   386     iRtParam.iType = EPlayerBeepOnce;
       
   387     TRACE_PRN_FN_EXT;
       
   388     }
       
   389 
       
   390 // -----------------------------------------------------------------------------
       
   391 // TMSRingTonePlayer::CreateSilentPlayerL
       
   392 // -----------------------------------------------------------------------------
       
   393 //
       
   394 void TMSRingTonePlayer::CreateSilentPlayerL()
       
   395     {
       
   396     TRACE_PRN_FN_ENT;
       
   397 
       
   398     iRtParam.iVolume = 0;
       
   399     delete iSilentPlayer;
       
   400     iSilentPlayer = NULL;
       
   401 
       
   402 #ifdef __WINSCW__
       
   403     TParse* fp = new (ELeave) TParse();
       
   404     fp->Set(KTMSNoSoundSequence, NULL, NULL);
       
   405     TFileName fileName(fp->FullName());
       
   406     delete fp;
       
   407     iSilentPlayer = TMSRtAudioHdlr::NewL(fileName, iRtParam.iPriority,
       
   408             iRtParam.iPreference, *this, EPlayerSilent);
       
   409 #else
       
   410     iSilentPlayer = TMSRtAudioHdlr::NewSeqL(KTMSNoSoundSequence(),
       
   411             iRtParam.iPriority, iRtParam.iPreference, *this, EPlayerSilent);
       
   412 #endif // __WINSCW__
       
   413 
       
   414     iRtParam.iType = EPlayerSilent;
       
   415     TRACE_PRN_FN_EXT;
       
   416     }
       
   417 
       
   418 // -----------------------------------------------------------------------------
       
   419 // TMSRingTonePlayer::CreateUnsecureVoipPlayerL
       
   420 // -----------------------------------------------------------------------------
       
   421 //
       
   422 void TMSRingTonePlayer::CreateUnsecureVoipPlayerL()
       
   423     {
       
   424     TRACE_PRN_FN_ENT;
       
   425 
       
   426     delete iUnsecureVoIPTonePlayer;
       
   427     iUnsecureVoIPTonePlayer = NULL;
       
   428 
       
   429 #ifdef __WINSCW__
       
   430     TParse* fp = new (ELeave) TParse();
       
   431     fp->Set(KTMSUnsecureVoIPCall, NULL, NULL);
       
   432     TFileName fileName(fp->FullName());
       
   433     delete fp;
       
   434     iUnsecureVoIPTonePlayer = TMSRtAudioHdlr::NewL(fileName,
       
   435             iRtParam.iPriority, iRtParam.iPreference, *this,
       
   436             EPlayerUnsecureVoIP);
       
   437 #else
       
   438     iUnsecureVoIPTonePlayer = TMSRtAudioHdlr::NewSeqL(KTMSUnsecureVoIPCall(),
       
   439             iRtParam.iPriority, iRtParam.iPreference, *this,
       
   440             EPlayerUnsecureVoIP);
       
   441 #endif // __WINSCW__
       
   442 
       
   443     iRtParam.iType = EPlayerUnsecureVoIP;
       
   444     TRACE_PRN_FN_EXT;
       
   445     }
       
   446 
       
   447 // -----------------------------------------------------------------------------
       
   448 // TMSRingTonePlayer::CreateCustomSequencePlayerL
       
   449 // -----------------------------------------------------------------------------
       
   450 //
       
   451 void TMSRingTonePlayer::CreateCustomSequencePlayerL(const TDesC8&
       
   452 #ifdef __WINSCW__
       
   453         /*aSequence*/)
       
   454 #else
       
   455         aSequence)
       
   456 #endif
       
   457     {
       
   458     TRACE_PRN_FN_ENT;
       
   459 
       
   460     delete iSequencePlayer;
       
   461     iSequencePlayer = NULL;
       
   462 
       
   463 #ifdef __WINSCW__
       
   464     TParse* fp = new (ELeave) TParse();
       
   465     fp->Set(KTMSBeepSequence, NULL, NULL);
       
   466     TFileName fileName(fp->FullName());
       
   467     delete fp;
       
   468     iSequencePlayer = TMSRtAudioHdlr::NewL(fileName, iRtParam.iPriority,
       
   469             iRtParam.iPreference, *this, EPlayerSequence);
       
   470 #else
       
   471     iSequencePlayer = TMSRtAudioHdlr::NewSeqL(aSequence, iRtParam.iPriority,
       
   472             iRtParam.iPreference, *this, EPlayerSequence);
       
   473 #endif // __WINSCW__
       
   474 
       
   475     iRtParam.iType = EPlayerSequence;
       
   476     TRACE_PRN_FN_EXT;
       
   477     }
       
   478 
       
   479 // -----------------------------------------------------------------------------
       
   480 // TMSRingTonePlayer::CreateTTSPlayerL
       
   481 // -----------------------------------------------------------------------------
       
   482 //
       
   483 void TMSRingTonePlayer::CreateTTSPlayerL(const TDesC& aTextToSay)
       
   484     {
       
   485     TRACE_PRN_FN_ENT;
       
   486 
       
   487     RemoveTTSPlayer();
       
   488     TPtrC ttsHeader(KTMSTtsHeader);
       
   489     HBufC* buf = HBufC::New(aTextToSay.Length() + ttsHeader.Length());
       
   490     if (buf)
       
   491         {
       
   492         TPtr ptr = buf->Des();
       
   493         ptr.Append(ttsHeader);
       
   494         ptr.Append(aTextToSay);
       
   495         TRACE_PRN_N1(_L("TMS->CreateTTSPlayerL: Text:[%S]"), &ptr);
       
   496         TRAPD(err, iTtsPlayer = TMSRtAudioHdlr::NewTtsL(*buf,
       
   497                 KAudioPriorityTextToSpeechCall, KAudioPrefTextToSpeechCall,
       
   498                 *this, EPlayerTts));
       
   499         if (err == TMS_RESULT_SUCCESS)
       
   500             {
       
   501             iTtsToneToBePlayed = ETrue;
       
   502             iRtParam.iTextToSay.Set(aTextToSay);
       
   503             }
       
   504         }
       
   505     delete buf;
       
   506 
       
   507     TRACE_PRN_FN_EXT;
       
   508     }
       
   509 
       
   510 // -----------------------------------------------------------------------------
       
   511 // TMSRingTonePlayer::RemoveTTSPlayer
       
   512 // -----------------------------------------------------------------------------
       
   513 //
       
   514 void TMSRingTonePlayer::RemoveTTSPlayer()
       
   515     {
       
   516     TRACE_PRN_FN_ENT;
       
   517 
       
   518     delete iTtsPlayer;
       
   519     iTtsPlayer = NULL;
       
   520     iTtsToneToBePlayed = EFalse;
       
   521     iRtParam.iTextToSay.Set(KNullDesC());
       
   522 
       
   523     TRACE_PRN_FN_EXT;
       
   524     }
       
   525 
       
   526 // -----------------------------------------------------------------------------
       
   527 // TMSRingTonePlayer::PlayRingToneL
       
   528 // -----------------------------------------------------------------------------
       
   529 //
       
   530 void TMSRingTonePlayer::PlayRingToneL()
       
   531     {
       
   532     TRACE_PRN_FN_ENT;
       
   533 
       
   534     // Check active Profile for any changes since Init()
       
   535     // TODO: To improve perfomrance, instead of polling Profile settings,
       
   536     //       consider subscribing to ProfilEngine P&S keys in CenRep.
       
   537     LoadActiveProfileSettingsL();
       
   538 
       
   539     switch (iRtParam.iType)
       
   540         {
       
   541         case EPlayerAudio:
       
   542             {
       
   543             PlayTtsTone();
       
   544             PlayAudioRingToneL();
       
   545             break;
       
   546             }
       
   547         case EPlayerBeepOnce:
       
   548             BeepOnceL();
       
   549             break;
       
   550         case EPlayerSilent:
       
   551             PlaySilentToneL();
       
   552             break;
       
   553         case EPlayerUnsecureVoIP:
       
   554             PlayUnsecureVoIPToneL();
       
   555             break;
       
   556         case EPlayerDefault:
       
   557             PlayTtsTone();
       
   558             PlayDefaultToneL();
       
   559             break;
       
   560         case EPlayerBackup:
       
   561             PlayBackupToneL();
       
   562             break;
       
   563         case EPlayerSequence:
       
   564             PlaySequenceToneL();
       
   565             break;
       
   566         default:
       
   567             break;
       
   568         }
       
   569     TRACE_PRN_FN_EXT;
       
   570     }
       
   571 
       
   572 // -----------------------------------------------------------------------------
       
   573 // TMSRingTonePlayer::PlayAudioRingToneL
       
   574 // -----------------------------------------------------------------------------
       
   575 //
       
   576 void TMSRingTonePlayer::PlayAudioRingToneL()
       
   577     {
       
   578     TRACE_PRN_FN_ENT;
       
   579 
       
   580     if (!iRtContainer || !CheckAndHandleToneSizeLimit(iRtContainer))
       
   581         {
       
   582         PlayDefaultToneL();
       
   583         }
       
   584     else if (iRtParam.iRingingType == EProfileRingingTypeSilent)
       
   585         {
       
   586         PlaySilentToneL();
       
   587         }
       
   588     else if (iRtParam.iRingingType == EProfileRingingTypeBeepOnce)
       
   589         {
       
   590         BeepOnceL();
       
   591         }
       
   592     else
       
   593         {
       
   594         if (!iAudioPlayer)
       
   595             {
       
   596             CreateAudioPlayerL();
       
   597             if (!iTimer->IsRunning())
       
   598                 {
       
   599                 // If InitComplete event doesn't occur within permittable time,
       
   600                 // this will trigger fallback routine.
       
   601                 iTimer->NotifyAfter(KTMSMaxRingingWaiting, *this);
       
   602                 }
       
   603             }
       
   604 
       
   605         // Start playing.
       
   606         if (!iAudioPlayer)
       
   607             {
       
   608             iTimer->CancelNotify();
       
   609             PlayDefaultToneL();
       
   610             }
       
   611         else
       
   612             {
       
   613             iTonePlayingStatus = EAudioTonePlaying;
       
   614             iAudioPlayer->Play(ConvertRingingType(iRtParam.iRingingType),
       
   615                     iRtParam.iVolume, iTtsToneToBePlayed);
       
   616             }
       
   617         }
       
   618 
       
   619     TRACE_PRN_FN_EXT;
       
   620     }
       
   621 
       
   622 // -----------------------------------------------------------------------------
       
   623 // TMSRingTonePlayer::BeepOnceL
       
   624 // -----------------------------------------------------------------------------
       
   625 //
       
   626 void TMSRingTonePlayer::BeepOnceL()
       
   627     {
       
   628     TRACE_PRN_FN_ENT;
       
   629 
       
   630     if (!iBeepOncePlayer)
       
   631         {
       
   632         CreateBeepOncePlayerL();
       
   633         }
       
   634     if (iBeepOncePlayer)
       
   635         {
       
   636         iTonePlayingStatus = EBeepOnce;
       
   637         iBeepOncePlayer->Play(TMSRtAudioHdlr::ETypeRingingOnce,
       
   638                 iRtParam.iVolume, EFalse);
       
   639         }
       
   640     else
       
   641         {
       
   642         PlayDefaultToneL();
       
   643         }
       
   644 
       
   645     TRACE_PRN_FN_EXT;
       
   646     }
       
   647 
       
   648 // -----------------------------------------------------------------------------
       
   649 // TMSRingTonePlayer::PlaySilentToneL
       
   650 // -----------------------------------------------------------------------------
       
   651 //
       
   652 void TMSRingTonePlayer::PlaySilentToneL()
       
   653     {
       
   654     TRACE_PRN_FN_ENT;
       
   655 
       
   656     if (!iSilentPlayer)
       
   657         {
       
   658         CreateSilentPlayerL();
       
   659         }
       
   660     if (iSilentPlayer)
       
   661         {
       
   662         iTonePlayingStatus = ESilentTonePlaying;
       
   663         iSilentPlayer->Play(TMSRtAudioHdlr::ETypeRinging, 0, EFalse);
       
   664         }
       
   665     else
       
   666         {
       
   667         PlayDefaultToneL();
       
   668         }
       
   669 
       
   670     TRACE_PRN_FN_EXT;
       
   671     }
       
   672 
       
   673 // -----------------------------------------------------------------------------
       
   674 // TMSRingTonePlayer::PlayUnsecureVoIPToneL
       
   675 // -----------------------------------------------------------------------------
       
   676 //
       
   677 void TMSRingTonePlayer::PlayUnsecureVoIPToneL()
       
   678     {
       
   679     TRACE_PRN_FN_ENT;
       
   680 
       
   681     if (!iUnsecureVoIPTonePlayer)
       
   682         {
       
   683         CreateUnsecureVoipPlayerL();
       
   684         }
       
   685     if (iUnsecureVoIPTonePlayer)
       
   686         {
       
   687         iTonePlayingStatus = EUnsecureVoIPTonePlaying;
       
   688         iUnsecureVoIPTonePlayer->Play(TMSRtAudioHdlr::ETypeRingingOnce,
       
   689                 KRTDefaultVolume, EFalse);
       
   690         }
       
   691     else
       
   692         {
       
   693         PlayDefaultToneL();
       
   694         }
       
   695 
       
   696     TRACE_PRN_FN_EXT;
       
   697     }
       
   698 
       
   699 // -----------------------------------------------------------------------------
       
   700 // TMSRingTonePlayer::PlaySequenceToneL
       
   701 // -----------------------------------------------------------------------------
       
   702 //
       
   703 void TMSRingTonePlayer::PlaySequenceToneL()
       
   704     {
       
   705     TRACE_PRN_FN_ENT;
       
   706 
       
   707     if (iSequencePlayer)
       
   708         {
       
   709         iTonePlayingStatus = ESequenceTonePlaying;
       
   710         iSequencePlayer->Play(ConvertRingingType(iRtParam.iRingingType),
       
   711                 iRtParam.iVolume, EFalse);
       
   712         }
       
   713     else
       
   714         {
       
   715         PlayDefaultToneL();
       
   716         }
       
   717 
       
   718     TRACE_PRN_FN_EXT;
       
   719     }
       
   720 
       
   721 // -----------------------------------------------------------------------------
       
   722 // TMSRingTonePlayer::PlayTtsTone
       
   723 // Schedule TTS to play, if text has been provided
       
   724 // -----------------------------------------------------------------------------
       
   725 //
       
   726 void TMSRingTonePlayer::PlayTtsTone()
       
   727     {
       
   728     TRACE_PRN_FN_ENT;
       
   729 
       
   730     TInt err = TMS_RESULT_SUCCESS;
       
   731 
       
   732     if (iRtParam.iTextToSay.Length() && !iTtsPlayer)
       
   733         {
       
   734         TRAP(err, CreateTTSPlayerL(iRtParam.iTextToSay));
       
   735         }
       
   736     if (err == TMS_RESULT_SUCCESS && iTtsPlayer && iTtsToneToBePlayed)
       
   737         {
       
   738         iTtsDelayIndex = 0;
       
   739         iTtsDelaysCount = KTMSTtsDelaysCount;
       
   740 
       
   741         // Start TTS timer just before RT
       
   742         if (!iTtsDelayTimer->IsRunning())
       
   743             {
       
   744             iTtsDelayTimer->NotifyAfter(KTMSTtsDelays[iTtsDelayIndex],
       
   745                     TCallBack(HandleTtsDelayTimeout, this));
       
   746             }
       
   747         iTtsVolume = iRtParam.iVolume;
       
   748         iTtsRingingType = iRtParam.iRingingType;
       
   749         }
       
   750 
       
   751     TRACE_PRN_FN_EXT;
       
   752     }
       
   753 
       
   754 // -----------------------------------------------------------------------------
       
   755 // TMSRingTonePlayer::PlayBackupToneL
       
   756 // -----------------------------------------------------------------------------
       
   757 //
       
   758 void TMSRingTonePlayer::PlayBackupToneL()
       
   759     {
       
   760     TRACE_PRN_FN_ENT;
       
   761 
       
   762     TInt err = TMS_RESULT_SUCCESS;
       
   763 
       
   764     if (!iBackupPlayer)
       
   765         {
       
   766         TRAP(err, CreateBkpRtPlayerL());
       
   767         }
       
   768 
       
   769     if (iBackupPlayer && err == TMS_RESULT_SUCCESS)
       
   770         {
       
   771         iTonePlayingStatus = EBackupTonePlaying;
       
   772         iTtsToneToBePlayed = EFalse;
       
   773         iTTsTimeOutCounter = 0;
       
   774         iTtsDelayTimer->CancelNotify();
       
   775         if (iTtsPlayer)
       
   776             {
       
   777             iTtsPlayer->StopPlaying();
       
   778             delete iTtsPlayer;
       
   779             iTtsPlayer = NULL;
       
   780             }
       
   781         iBackupPlayer->Play(ConvertRingingType(iRtParam.iRingingType),
       
   782                 iRtParam.iVolume, EFalse);
       
   783         }
       
   784 
       
   785     TRACE_PRN_FN_EXT;
       
   786     }
       
   787 
       
   788 // -----------------------------------------------------------------------------
       
   789 // TMSRingTonePlayer::PlayDefaultToneL
       
   790 // -----------------------------------------------------------------------------
       
   791 //
       
   792 void TMSRingTonePlayer::PlayDefaultToneL()
       
   793     {
       
   794     TRACE_PRN_FN_ENT;
       
   795 
       
   796     if (iRtParam.iRingingType == EProfileRingingTypeSilent ||
       
   797             iRtParam.iRingingType == EProfileRingingTypeBeepOnce)
       
   798         {
       
   799         return;
       
   800         }
       
   801 
       
   802     if (!iRtContainer)
       
   803         {
       
   804         // Default tone does not exist, play backup.
       
   805         PlayBackupToneL();
       
   806         return;
       
   807         }
       
   808 
       
   809     if (!iDefaultPlayer)
       
   810         {
       
   811         CreateDefaultRtPlayerL();
       
   812         if (!iTimer->IsRunning())
       
   813             {
       
   814             // If InitComplete event doesn't occur within permittable time,
       
   815             // this will trigger fallback routine.
       
   816             iTimer->NotifyAfter(KTMSMaxRingingWaiting, *this);
       
   817             }
       
   818         }
       
   819 
       
   820     // Start playing.
       
   821     if (!iDefaultPlayer)
       
   822         {
       
   823         // Default player not ready, play backup.
       
   824         iTimer->CancelNotify();
       
   825         PlayBackupToneL();
       
   826         }
       
   827     else
       
   828         {
       
   829         iTonePlayingStatus = EDefaultTonePlaying;
       
   830         iDefaultPlayer->Play(ConvertRingingType(iRtParam.iRingingType),
       
   831                 iRtParam.iVolume, iTtsToneToBePlayed);
       
   832         }
       
   833 
       
   834     TRACE_PRN_FN_EXT;
       
   835     }
       
   836 
       
   837 // -----------------------------------------------------------------------------
       
   838 // TMSRingTonePlayer::StopPlaying
       
   839 // -----------------------------------------------------------------------------
       
   840 //
       
   841 void TMSRingTonePlayer::StopPlaying()
       
   842     {
       
   843     TRACE_PRN_FN_ENT;
       
   844 
       
   845     iTtsToneToBePlayed = EFalse;
       
   846     iTTsTimeOutCounter = 0;
       
   847     iTtsDelayTimer->CancelNotify();
       
   848     if (iTtsPlayer)
       
   849         {
       
   850         iTtsPlayer->StopPlaying();
       
   851         delete iTtsPlayer;
       
   852         iTtsPlayer = NULL;
       
   853         }
       
   854     iTimer->CancelNotify();
       
   855 
       
   856     switch (iTonePlayingStatus)
       
   857         {
       
   858         case EAudioTonePlaying:
       
   859             if (iAudioPlayer)
       
   860                 {
       
   861                 // Commented out to correct screen jamming after
       
   862                 // REComSession::FinalClose(). Audio player will be stopped
       
   863                 // in its destructor. Fixes EKKI-7WYG2G and JKAN-7XNGQU.
       
   864                 // iAudioPlayer->StopPlaying();
       
   865                 delete iAudioPlayer;
       
   866                 iAudioPlayer = NULL;
       
   867                 }
       
   868             break;
       
   869         case EDefaultTonePlaying:
       
   870             if (iDefaultPlayer)
       
   871                 {
       
   872                 iDefaultPlayer->StopPlaying();
       
   873                 delete iDefaultPlayer;
       
   874                 iDefaultPlayer = NULL;
       
   875                 }
       
   876             break;
       
   877         case EBeepOnce:
       
   878             if (iBeepOncePlayer)
       
   879                 {
       
   880                 iBeepOncePlayer->StopPlaying();
       
   881                 delete iBeepOncePlayer;
       
   882                 iBeepOncePlayer = NULL;
       
   883                 }
       
   884             break;
       
   885         case EBackupTonePlaying:
       
   886             if (iBackupPlayer)
       
   887                 {
       
   888                 iBackupPlayer->StopPlaying();
       
   889                 }
       
   890             break;
       
   891         case ESilentTonePlaying:
       
   892             if (iSilentPlayer)
       
   893                 {
       
   894                 iSilentPlayer->StopPlaying();
       
   895                 delete iSilentPlayer;
       
   896                 iSilentPlayer = NULL;
       
   897                 }
       
   898             break;
       
   899         case EUnsecureVoIPTonePlaying:
       
   900             if (iUnsecureVoIPTonePlayer)
       
   901                 {
       
   902                 iUnsecureVoIPTonePlayer->StopPlaying();
       
   903                 delete iUnsecureVoIPTonePlayer;
       
   904                 iUnsecureVoIPTonePlayer = NULL;
       
   905                 }
       
   906             break;
       
   907         case ESequenceTonePlaying:
       
   908             if (iSequencePlayer)
       
   909                 {
       
   910                 iSequencePlayer->StopPlaying();
       
   911                 delete iSequencePlayer;
       
   912                 iSequencePlayer = NULL;
       
   913                 }
       
   914             break;
       
   915         case EVideoTonePlaying: // video ringing tone
       
   916         case EPersonalVideoTonePlaying:
       
   917         case ESilentVideoTonePlaying:
       
   918             if (iBeepOncePlayer != NULL)
       
   919                 {
       
   920                 iBeepOncePlayer->StopPlaying();
       
   921                 delete iBeepOncePlayer;
       
   922                 iBeepOncePlayer = NULL;
       
   923                 }
       
   924             if (iSilentPlayer != NULL)
       
   925                 {
       
   926                 iSilentPlayer->StopPlaying();
       
   927                 delete iSilentPlayer;
       
   928                 iSilentPlayer = NULL;
       
   929                 }
       
   930             if (iRtContainer)
       
   931                 {
       
   932                 delete iRtContainer;
       
   933                 iRtContainer = NULL;
       
   934                 }
       
   935             break;
       
   936         case EIdle:
       
   937             // Do nothing here.
       
   938             return;
       
   939         default:
       
   940             break;
       
   941         }
       
   942 
       
   943     iTonePlayingStatus = EIdle;
       
   944 
       
   945     TRACE_PRN_FN_EXT;
       
   946     }
       
   947 
       
   948 // -----------------------------------------------------------------------------
       
   949 // TMSRingTonePlayer::DeinitRingTonePlayer
       
   950 // -----------------------------------------------------------------------------
       
   951 //
       
   952 void TMSRingTonePlayer::DeinitRingTonePlayer()
       
   953     {
       
   954     StopPlaying();
       
   955     RemovePlayers();
       
   956     }
       
   957 
       
   958 // -----------------------------------------------------------------------------
       
   959 // TMSRingTonePlayer::RemovePlayers
       
   960 // -----------------------------------------------------------------------------
       
   961 //
       
   962 void TMSRingTonePlayer::RemovePlayers()
       
   963     {
       
   964     delete iAudioPlayer;
       
   965     iAudioPlayer = NULL;
       
   966 
       
   967     delete iDefaultPlayer;
       
   968     iDefaultPlayer = NULL;
       
   969 
       
   970     delete iBeepOncePlayer;
       
   971     iBeepOncePlayer = NULL;
       
   972 
       
   973     delete iSilentPlayer;
       
   974     iSilentPlayer = NULL;
       
   975 
       
   976     delete iUnsecureVoIPTonePlayer;
       
   977     iUnsecureVoIPTonePlayer = NULL;
       
   978 
       
   979     delete iSequencePlayer;
       
   980     iSequencePlayer = NULL;
       
   981 
       
   982     delete iTtsPlayer;
       
   983     iTtsPlayer = NULL;
       
   984     }
       
   985 
       
   986 // -----------------------------------------------------------------------------
       
   987 // TMSRingTonePlayer::DeletePlayer
       
   988 // -----------------------------------------------------------------------------
       
   989 //
       
   990 void TMSRingTonePlayer::DeletePlayer()
       
   991     {
       
   992     switch (iTonePlayingStatus)
       
   993         {
       
   994         case EAudioTonePlaying:
       
   995             DeletePlayerAsync(EPlayerAudio);
       
   996             iAudioPlayer = NULL;
       
   997             break;
       
   998         case EDefaultTonePlaying:
       
   999             DeletePlayerAsync(EPlayerDefault);
       
  1000             iDefaultPlayer = NULL;
       
  1001             break;
       
  1002         case ESilentTonePlaying:
       
  1003             DeletePlayerAsync(EPlayerSilent);
       
  1004             iSilentPlayer = NULL;
       
  1005             break;
       
  1006         case EUnsecureVoIPTonePlaying:
       
  1007             DeletePlayerAsync(EPlayerUnsecureVoIP);
       
  1008             iUnsecureVoIPTonePlayer = NULL;
       
  1009             break;
       
  1010         case EBeepOnce:
       
  1011             DeletePlayerAsync(EPlayerBeepOnce);
       
  1012             iBeepOncePlayer = NULL;
       
  1013             break;
       
  1014         case ESequenceTonePlaying:
       
  1015             DeletePlayerAsync(EPlayerSequence);
       
  1016             iSequencePlayer = NULL;
       
  1017             break;
       
  1018         case EBackupTonePlaying:
       
  1019         default:
       
  1020             break;
       
  1021         }
       
  1022     }
       
  1023 
       
  1024 // -----------------------------------------------------------------------------
       
  1025 // TMSRingTonePlayer::DeletePlayerAsync
       
  1026 // -----------------------------------------------------------------------------
       
  1027 //
       
  1028 void TMSRingTonePlayer::DeletePlayerAsync(TRtPlayerType aPlayer)
       
  1029     {
       
  1030     TRACE_PRN_FN_ENT;
       
  1031 
       
  1032     __ASSERT_DEBUG(aPlayer >= EPlayerFirst &&
       
  1033             aPlayer < iAsyncDeletePlayers.Count(),
       
  1034             PANIC(TMS_RESULT_INVALID_ARGUMENT));
       
  1035 
       
  1036     // Player is deleted in HandleAsyncReq.
       
  1037 
       
  1038     if (iAsyncDeletePlayers[aPlayer])
       
  1039         {
       
  1040         delete iAsyncDeletePlayers[aPlayer];
       
  1041         iAsyncDeletePlayers[aPlayer] = NULL;
       
  1042         }
       
  1043 
       
  1044     TMSRtAudioHdlr** players[] = {
       
  1045         &iAudioPlayer,
       
  1046         &iBeepOncePlayer,
       
  1047         &iSilentPlayer,
       
  1048         &iUnsecureVoIPTonePlayer,
       
  1049         &iDefaultPlayer,
       
  1050         &iSequencePlayer,
       
  1051         &iBackupPlayer,
       
  1052         &iTtsPlayer
       
  1053         };
       
  1054 
       
  1055     __ASSERT_DEBUG(iAsyncDeletePlayers.Count() > aPlayer,
       
  1056             PANIC(TMS_RESULT_ILLEGAL_OPERATION));
       
  1057 
       
  1058     iAsyncDeletePlayers[aPlayer] = *(players[aPlayer]);
       
  1059     *(players[aPlayer]) = NULL;
       
  1060     iAsyncReq = ETrue;
       
  1061     if (!iAsyncReqAO->IsActive())
       
  1062         iAsyncReqAO->Start(); //Start async request
       
  1063 
       
  1064     TRACE_PRN_FN_ENT;
       
  1065     }
       
  1066 
       
  1067 // -----------------------------------------------------------------------------
       
  1068 // TMSRingTonePlayer::HandleError
       
  1069 // From TMSAsyncReqObsrv
       
  1070 // -----------------------------------------------------------------------------
       
  1071 //
       
  1072 void TMSRingTonePlayer::HandleError(TInt /*aError*/)
       
  1073     {
       
  1074     // TODO: should we kill/restart a/o?
       
  1075     }
       
  1076 
       
  1077 // -----------------------------------------------------------------------------
       
  1078 // TMSRingTonePlayer::HandleAsyncReq
       
  1079 // From TMSAsyncReqObsrv
       
  1080 // -----------------------------------------------------------------------------
       
  1081 //
       
  1082 void TMSRingTonePlayer::HandleAsyncReq()
       
  1083     {
       
  1084     TRACE_PRN_FN_ENT;
       
  1085 
       
  1086     if (iAsyncReq)
       
  1087         {
       
  1088         for (TInt i = EPlayerFirst; i <= EPlayerLast; i++)
       
  1089             {
       
  1090             delete iAsyncDeletePlayers[i];
       
  1091             iAsyncDeletePlayers[i] = NULL;
       
  1092             }
       
  1093         }
       
  1094     iAsyncReq = EFalse;
       
  1095 
       
  1096     TRACE_PRN_FN_EXT;
       
  1097     }
       
  1098 
       
  1099 // -----------------------------------------------------------------------------
       
  1100 // TMSRingTonePlayer::HandleTtsDelayTimeout
       
  1101 // -----------------------------------------------------------------------------
       
  1102 //
       
  1103 TInt TMSRingTonePlayer::HandleTtsDelayTimeout(TAny* object)
       
  1104     {
       
  1105     static_cast<TMSRingTonePlayer*> (object)->DoHandleTtsDelayTimeout();
       
  1106     return TMS_RESULT_SUCCESS;
       
  1107     }
       
  1108 
       
  1109 // -----------------------------------------------------------------------------
       
  1110 // TMSRingTonePlayer::DoHandleTtsDelayTimeout
       
  1111 // -----------------------------------------------------------------------------
       
  1112 //
       
  1113 void TMSRingTonePlayer::DoHandleTtsDelayTimeout()
       
  1114     {
       
  1115     TRACE_PRN_FN_ENT;
       
  1116 
       
  1117     TMSRtAudioHdlr* currPlayer = NULL;
       
  1118     currPlayer = GetCurrentlyActiveAudioPlayerWithTTS();
       
  1119 
       
  1120     if (!currPlayer || !iTtsPlayer)
       
  1121         {
       
  1122         return;
       
  1123         }
       
  1124 
       
  1125     TInt volume(0);
       
  1126 
       
  1127     // Ascending case. TTS player needs to be ascending.
       
  1128     if (iTtsRingingType == EProfileRingingTypeAscending)
       
  1129         {
       
  1130         // Adjust volume for each ascending step
       
  1131         if (!iTTsTimeOutCounter)
       
  1132             {
       
  1133             // Playing caller's name for the first time in ascending mode.
       
  1134             volume = KTtsVolumeMin;
       
  1135             iTtsPlayer->Play(ConvertRingingType(EProfileRingingTypeRingingOnce),
       
  1136                     volume, iTtsToneToBePlayed);
       
  1137             }
       
  1138         else
       
  1139             {
       
  1140             // Checks the case that ringingtone is very quiet. Then do not play
       
  1141             // TTS too loud
       
  1142             volume = iTtsVolume < KTtsVolumeMin ?
       
  1143                 KTtsVolumeMin : KTtsVolumeAscendingRepeat;
       
  1144 
       
  1145             // We are saying callers name for the second time in ascending mode.
       
  1146             // Say callers name by volume level KTtsVolumeAscendingRepeat and
       
  1147             // decrease current players volume
       
  1148             // to KPlayerVolumeAscendingRepeat. RampTime is zero
       
  1149             currPlayer->SetNewVolumeAndRamptime(
       
  1150                     KPlayerVolumeAscendingRepeat, 0);
       
  1151             iTtsPlayer->Play(ConvertRingingType(EProfileRingingTypeRingingOnce),
       
  1152                     volume, iTtsToneToBePlayed);
       
  1153             }
       
  1154         }
       
  1155     else //Normal ringing case.
       
  1156         {
       
  1157         currPlayer->SetNewVolumeAndRamptime(iTtsVolume - 5, 0);
       
  1158         iTtsPlayer->Play(ConvertRingingType(EProfileRingingTypeRingingOnce),
       
  1159                 iTtsVolume, iTtsToneToBePlayed);
       
  1160         }
       
  1161 
       
  1162     iTTsTimeOutCounter++;
       
  1163 
       
  1164     TRACE_PRN_FN_EXT;
       
  1165     }
       
  1166 
       
  1167 // -----------------------------------------------------------------------------
       
  1168 // TMSRingTonePlayer::MuteRingTone
       
  1169 // -----------------------------------------------------------------------------
       
  1170 //
       
  1171 void TMSRingTonePlayer::MuteRingTone()
       
  1172     {
       
  1173     TMSRtAudioHdlr* activePlayer = ActiveAudioPlayer();
       
  1174     if (activePlayer != NULL)
       
  1175         {
       
  1176         activePlayer->MutePlaying();
       
  1177         }
       
  1178     }
       
  1179 
       
  1180 // -----------------------------------------------------------------------------
       
  1181 // TMSRingTonePlayer::RtAudioHdlrEvent
       
  1182 // -----------------------------------------------------------------------------
       
  1183 //
       
  1184 void TMSRingTonePlayer::RtAudioHdlrEvent(TInt aEvent, TInt aError, TInt aPlayer)
       
  1185     {
       
  1186     if (aError == TMS_RESULT_SUCCESS)
       
  1187         {
       
  1188         switch (aEvent)
       
  1189             {
       
  1190             case ECmdRingToneOpenComplete:
       
  1191                 if (aPlayer != EPlayerBackup && aPlayer != EPlayerTts)
       
  1192                     {
       
  1193                     HandleRtAudioInitComplete(aEvent, aError, aPlayer);
       
  1194                     }
       
  1195                 break;
       
  1196             case ECmdRingTonePlayComplete:
       
  1197                 HandleRtAudioPlayComplete(aEvent, aError, aPlayer);
       
  1198                 break;
       
  1199             default:
       
  1200                 //not possible
       
  1201                 break;
       
  1202             }
       
  1203         }
       
  1204      else
       
  1205          {
       
  1206          HandleRtAudioError(aEvent, aError, aPlayer);
       
  1207          }
       
  1208     }
       
  1209 
       
  1210 // -----------------------------------------------------------------------------
       
  1211 // TMSRingTonePlayer::HandleRtAudioError
       
  1212 // -----------------------------------------------------------------------------
       
  1213 //
       
  1214 void TMSRingTonePlayer::HandleRtAudioError(TInt aEvent, TInt aError,
       
  1215         TInt aPlayer)
       
  1216     {
       
  1217     TRACE_PRN_N1(_L("TMS->HandleRtAudioError [%d]"), aError);
       
  1218 
       
  1219     // Backup player events don't need to be propagated
       
  1220     if (aPlayer == EPlayerBackup)
       
  1221         {
       
  1222         return;
       
  1223         }
       
  1224     if (aPlayer == EPlayerTts && aEvent == ECmdRingTonePlayComplete)
       
  1225         {
       
  1226         // Remove TTS and keep playing RT
       
  1227         DeletePlayerAsync(EPlayerTts);
       
  1228         return;
       
  1229         }
       
  1230     const TBool deleteAll = (aError == KErrServerTerminated);
       
  1231     if (deleteAll)
       
  1232         {
       
  1233         // KErrServerTerminated is considered fatal error - delete all.
       
  1234         for (TInt i = EPlayerFirst; i <= EPlayerLast; i++)
       
  1235             {
       
  1236             DeletePlayerAsync(static_cast<TRtPlayerType> (i));
       
  1237             }
       
  1238         // Recreate backup player
       
  1239         TRAPD(ignore, CreateBkpRtPlayerL());
       
  1240         if (ignore) ;
       
  1241         }
       
  1242 
       
  1243     iTimer->CancelNotify();
       
  1244     DoHandlePlayerError(!deleteAll, EFalse);
       
  1245     iRtObserver.RtPlayerEvent(aEvent, aError);
       
  1246     }
       
  1247 
       
  1248 // -----------------------------------------------------------------------------
       
  1249 // TMSRingTonePlayer::HandleRtAudioInitComplete
       
  1250 // -----------------------------------------------------------------------------
       
  1251 //
       
  1252 void TMSRingTonePlayer::HandleRtAudioInitComplete(TInt aEvent, TInt aError,
       
  1253         TInt aPlayer)
       
  1254     {
       
  1255     if ((iTonePlayingStatus == EAudioTonePlaying && aPlayer == EPlayerAudio) ||
       
  1256             (iTonePlayingStatus == EDefaultTonePlaying &&
       
  1257             aPlayer == EPlayerDefault))
       
  1258         {
       
  1259         iTimer->CancelNotify();
       
  1260         }
       
  1261     else
       
  1262         {
       
  1263         iRtObserver.RtPlayerEvent(aEvent, aError);
       
  1264         }
       
  1265     }
       
  1266 
       
  1267 // -----------------------------------------------------------------------------
       
  1268 // TMSRingTonePlayer::HandleRtAudioPlayComplete
       
  1269 // -----------------------------------------------------------------------------
       
  1270 //
       
  1271 void TMSRingTonePlayer::HandleRtAudioPlayComplete(TInt aEvent, TInt aError,
       
  1272         TInt aPlayer)
       
  1273     {
       
  1274     TRACE_PRN_N2(_L("TMS->HandleRtAudioPlayComplete: player=[%d], err=[%d]"),
       
  1275             aPlayer, aError);
       
  1276 
       
  1277     if (aPlayer == EPlayerTts)
       
  1278         {
       
  1279         ResumeTTS();
       
  1280         return;
       
  1281         }
       
  1282     // RT playback has completed: ring once and TTS is activated
       
  1283     else if (iRtParam.iRingingType == EProfileRingingTypeRingingOnce &&
       
  1284             iTtsToneToBePlayed)
       
  1285         {
       
  1286         // Ring once and TTS
       
  1287         if (iTtsDelayIndex < iTtsDelaysCount)
       
  1288             {
       
  1289             ReStartRingTonePlayer();
       
  1290             return;
       
  1291             }
       
  1292         }
       
  1293     // RT has completed: ringing and TTS is activated.
       
  1294     // We need to restart RT and new TTS iterations are required.
       
  1295     else if (iRtParam.iRingingType == EProfileRingingTypeRinging &&
       
  1296             iTtsToneToBePlayed)
       
  1297         {
       
  1298         // Ringing and TTS
       
  1299         if (iTtsDelayIndex == iTtsDelaysCount)
       
  1300             {
       
  1301             // Ringingtype is "Ringing". New TTS iterations are required.
       
  1302             // Need to restart TTS sequence TTS has completed its iterations,
       
  1303             // set index to zero.
       
  1304             iTtsDelayIndex = 0;
       
  1305             if (!iTtsDelayTimer->IsRunning())
       
  1306                 {
       
  1307                 // Restart TTS sequence
       
  1308                 iTtsDelayTimer->NotifyAfter(KTMSTtsDelays[iTtsDelayIndex],
       
  1309                         TCallBack(HandleTtsDelayTimeout, this));
       
  1310                 }
       
  1311             }
       
  1312 
       
  1313         ReStartRingTonePlayer();
       
  1314         return;
       
  1315         }
       
  1316 
       
  1317     DeletePlayer();
       
  1318     iTonePlayingStatus = EIdle;
       
  1319     iRtObserver.RtPlayerEvent(aEvent, aError);
       
  1320     }
       
  1321 
       
  1322 // -----------------------------------------------------------------------------
       
  1323 // TMSRingTonePlayer::ResumeTTS
       
  1324 // -----------------------------------------------------------------------------
       
  1325 //
       
  1326 void TMSRingTonePlayer::ResumeTTS()
       
  1327     {
       
  1328     // TTS playing complete, normal tone player should volume up.
       
  1329     if ((iTtsToneToBePlayed) && (++iTtsDelayIndex < iTtsDelaysCount))
       
  1330         {
       
  1331         // Resuming after TTS first time
       
  1332         // Caller name is said once. Increase tone player volume.
       
  1333         SolveNewVolumeAndRamptime(ESaidOnce);
       
  1334 
       
  1335         if (!iTtsDelayTimer->IsRunning())
       
  1336             {
       
  1337             // There are more TTS iterations to be played.
       
  1338             iTtsDelayTimer->NotifyAfter(KTMSTtsDelays[iTtsDelayIndex],
       
  1339                     TCallBack(HandleTtsDelayTimeout, this));
       
  1340             }
       
  1341         }
       
  1342     else
       
  1343         {
       
  1344         // Resuming after TTS second time.
       
  1345         SolveNewVolumeAndRamptime(ESaidTwice);
       
  1346         }
       
  1347     }
       
  1348 
       
  1349 // -----------------------------------------------------------------------------
       
  1350 // TMSRingTonePlayer::TimerEvent
       
  1351 // -----------------------------------------------------------------------------
       
  1352 //
       
  1353 void TMSRingTonePlayer::TimerEvent()
       
  1354     {
       
  1355     DoHandlePlayerError(ETrue, ETrue);
       
  1356     }
       
  1357 
       
  1358 // -----------------------------------------------------------------------------
       
  1359 // TMSRingTonePlayer::DoHandlePlayerError
       
  1360 // -----------------------------------------------------------------------------
       
  1361 //
       
  1362 void TMSRingTonePlayer::DoHandlePlayerError(TBool aDelete, TBool aSync)
       
  1363     {
       
  1364     switch (iTonePlayingStatus)
       
  1365         {
       
  1366         case EAudioTonePlaying:
       
  1367             {
       
  1368             if (aDelete)
       
  1369                 {
       
  1370                 if (aSync)
       
  1371                     {
       
  1372                     delete iAudioPlayer;
       
  1373                     }
       
  1374                 else
       
  1375                     {
       
  1376                     DeletePlayerAsync(EPlayerAudio);
       
  1377                     }
       
  1378                 iAudioPlayer = NULL;
       
  1379                 }
       
  1380 
       
  1381 #ifdef __WINSCW__
       
  1382             TRAP_IGNORE(PlayAudioRingToneL());
       
  1383             iTonePlayingStatus = EDefaultTonePlaying;
       
  1384 #else
       
  1385             TRAP_IGNORE(PlayDefaultToneL());
       
  1386 #endif //__WINSCW__
       
  1387             break;
       
  1388             }
       
  1389         case EDefaultTonePlaying:
       
  1390             {
       
  1391             if (aDelete)
       
  1392                 {
       
  1393                 if (aSync)
       
  1394                     {
       
  1395                     delete iDefaultPlayer;
       
  1396                     }
       
  1397                 else
       
  1398                     {
       
  1399                     DeletePlayerAsync(EPlayerDefault);
       
  1400                     }
       
  1401                 iDefaultPlayer = NULL;
       
  1402                 }
       
  1403 
       
  1404             TRAPD(ignore, PlayBackupToneL());
       
  1405             if (ignore) ;
       
  1406             break;
       
  1407             }
       
  1408         case ESilentTonePlaying:
       
  1409         case EBeepOnce:
       
  1410         case EBackupTonePlaying:
       
  1411         case EIdle:
       
  1412         default:
       
  1413             break;
       
  1414         }
       
  1415     }
       
  1416 
       
  1417 // -----------------------------------------------------------------------------
       
  1418 // TMSRingTonePlayer::ConvertRingingType
       
  1419 // -----------------------------------------------------------------------------
       
  1420 //
       
  1421 TMSRtAudioHdlr::TRingingType TMSRingTonePlayer::ConvertRingingType(
       
  1422         TProfileRingingType aRingingType)
       
  1423     {
       
  1424     TMSRtAudioHdlr::TRingingType ringingType = TMSRtAudioHdlr::ETypeRinging;
       
  1425     switch (aRingingType)
       
  1426         {
       
  1427         case EProfileRingingTypeRinging:
       
  1428             ringingType = TMSRtAudioHdlr::ETypeRinging;
       
  1429             break;
       
  1430         case EProfileRingingTypeAscending:
       
  1431             ringingType = TMSRtAudioHdlr::ETypeAscending;
       
  1432             break;
       
  1433         case EProfileRingingTypeRingingOnce:
       
  1434             ringingType = TMSRtAudioHdlr::ETypeRingingOnce;
       
  1435             break;
       
  1436         default:
       
  1437             break;
       
  1438         }
       
  1439     return ringingType;
       
  1440     }
       
  1441 
       
  1442 // -----------------------------------------------------------------------------
       
  1443 // TMSRingTonePlayer::ExtendedSecurity
       
  1444 // -----------------------------------------------------------------------------
       
  1445 //
       
  1446 TBool TMSRingTonePlayer::ExtendedSecurity() const
       
  1447     {
       
  1448     return iExtSecNeeded;
       
  1449     }
       
  1450 
       
  1451 // -----------------------------------------------------------------------------
       
  1452 // TMSRingTonePlayer::SolveNewVolumeAndRamptime
       
  1453 // -----------------------------------------------------------------------------
       
  1454 //
       
  1455 void TMSRingTonePlayer::SolveNewVolumeAndRamptime(TTtsStatus aStatus)
       
  1456     {
       
  1457     TMSRtAudioHdlr* currPlayer = NULL;
       
  1458     currPlayer = GetCurrentlyActiveAudioPlayerWithTTS();
       
  1459     if (!currPlayer)
       
  1460         {
       
  1461         return;
       
  1462         }
       
  1463 
       
  1464     TInt ramptime(0);
       
  1465 
       
  1466     // Handle TTS volume. TTS sequence is as follows:
       
  1467     // 3 sec, tone + name + 4 sec, tone + name + the tone until the end.
       
  1468     switch (aStatus)
       
  1469         {
       
  1470         case ESaidOnce:
       
  1471             {
       
  1472             if (iTtsRingingType == EProfileRingingTypeAscending)
       
  1473                 {
       
  1474                 // The ramptime could be (4)* KTMSTtsAscendingStep but now
       
  1475                 // we are setting this to 0 because when caller's name is played
       
  1476                 // for the first time: play ringing tone on level 3 for 4 secs.
       
  1477                 ramptime = 0;
       
  1478                 // Played once ascending
       
  1479                 currPlayer->SetNewVolumeAndRamptime(
       
  1480                         KPlayerVolumeAscendingRepeat, ramptime);
       
  1481                 }
       
  1482             else
       
  1483                 {
       
  1484                 // Normal ringtone case. Adjust volume back to profile level.
       
  1485                 // Played once normal
       
  1486                 currPlayer->SetNewVolumeAndRamptime(iTtsVolume, 0);
       
  1487                 }
       
  1488             break;
       
  1489             }
       
  1490         case ESaidTwice:
       
  1491             {
       
  1492             if (iTtsRingingType == EProfileRingingTypeAscending)
       
  1493                 {
       
  1494                 TInt vol = iTtsVolume;
       
  1495                 if (vol > KPlayerVolumeAscendingRepeat)
       
  1496                     {
       
  1497                     vol = vol - KTtsVolumeAscendingDecrease;
       
  1498                     }
       
  1499 
       
  1500                 // TTS playing complete for the second time. Increase volume.
       
  1501                 ramptime = (vol) * KTMSTtsAscendingStep;
       
  1502                 // Played twice ascending
       
  1503                 currPlayer->SetNewVolumeAndRamptime(iTtsVolume, ramptime);
       
  1504                 }
       
  1505             else
       
  1506                 {
       
  1507                 // Normal ringtone case. Adjust volume back to profile level.
       
  1508                 // Played twice normal
       
  1509                 currPlayer->SetNewVolumeAndRamptime(iTtsVolume, 0);
       
  1510                 }
       
  1511             break;
       
  1512             }
       
  1513         default:
       
  1514             break;
       
  1515         }
       
  1516     }
       
  1517 
       
  1518 // -----------------------------------------------------------------------------
       
  1519 // TMSRingTonePlayer::PlayerType
       
  1520 // -----------------------------------------------------------------------------
       
  1521 //
       
  1522 TRtPlayerType TMSRingTonePlayer::PlayerType() const
       
  1523     {
       
  1524     return iRtParam.iType;
       
  1525     }
       
  1526 
       
  1527 // -----------------------------------------------------------------------------
       
  1528 // TMSRingTonePlayer::GetCurrentlyActiveAudioPlayerWithTTS
       
  1529 // -----------------------------------------------------------------------------
       
  1530 //
       
  1531 TMSRtAudioHdlr* TMSRingTonePlayer::GetCurrentlyActiveAudioPlayerWithTTS()
       
  1532     {
       
  1533     TMSRtAudioHdlr* player = NULL;
       
  1534 
       
  1535     if (iAudioPlayer)
       
  1536         {
       
  1537         player = iAudioPlayer;
       
  1538         }
       
  1539     else if (iDefaultPlayer)
       
  1540         {
       
  1541         player = iDefaultPlayer;
       
  1542         }
       
  1543     else if (iBackupPlayer)
       
  1544         {
       
  1545         player = iBackupPlayer;
       
  1546         }
       
  1547     return player;
       
  1548     }
       
  1549 
       
  1550 // -----------------------------------------------------------------------------
       
  1551 // TMSRingTonePlayer::ReStartRingTonePlayer
       
  1552 // -----------------------------------------------------------------------------
       
  1553 //
       
  1554 void TMSRingTonePlayer::ReStartRingTonePlayer()
       
  1555     {
       
  1556     // Find active player which plays along with TTS.
       
  1557     TMSRtAudioHdlr* currPlayer = NULL;
       
  1558     currPlayer = GetCurrentlyActiveAudioPlayerWithTTS();
       
  1559     if (currPlayer)
       
  1560         {
       
  1561         currPlayer->ReStartPlaying();
       
  1562         }
       
  1563     }
       
  1564 
       
  1565 // -----------------------------------------------------------------------------
       
  1566 // TMSRingTonePlayer::CheckAndHandleToneSizeLimit
       
  1567 // -----------------------------------------------------------------------------
       
  1568 //
       
  1569 TBool TMSRingTonePlayer::CheckAndHandleToneSizeLimit(
       
  1570         TMSRtContainer* aRingingTone)
       
  1571     {
       
  1572     TBool bValidSize = ETrue;
       
  1573 
       
  1574     // If RT size is too large, will play default tone instead.
       
  1575     if (iToneFileSizeLimitKB)
       
  1576         {
       
  1577         if (CheckToneFileSize(aRingingTone->FileName(), iToneFileSizeLimitKB)
       
  1578                 != TMS_RESULT_SUCCESS)
       
  1579             {
       
  1580             bValidSize = EFalse;
       
  1581             }
       
  1582         }
       
  1583     return bValidSize;
       
  1584     }
       
  1585 
       
  1586 // -----------------------------------------------------------------------------
       
  1587 // TMSRingTonePlayer::CheckToneFileSize
       
  1588 // -----------------------------------------------------------------------------
       
  1589 //
       
  1590 TInt TMSRingTonePlayer::CheckToneFileSize(const TDesC& aFile, TInt aSizeLimitKB)
       
  1591     {
       
  1592     // Get file size
       
  1593     TInt size = 0;
       
  1594     TInt error = TMS_RESULT_SUCCESS;
       
  1595 
       
  1596     RFs fs;
       
  1597     error = fs.Connect();
       
  1598 
       
  1599     if (error == TMS_RESULT_SUCCESS)
       
  1600         {
       
  1601         TEntry entry;
       
  1602         if (TMS_RESULT_SUCCESS == fs.Entry(aFile, entry))
       
  1603             {
       
  1604             size = entry.iSize;
       
  1605             }
       
  1606         }
       
  1607     fs.Close();
       
  1608 
       
  1609     aSizeLimitKB *= Kkilo;
       
  1610     if (aSizeLimitKB && size > aSizeLimitKB)
       
  1611         {
       
  1612         error = KErrTooBig;
       
  1613         }
       
  1614 
       
  1615     TRACE_PRN_N1(_L("TMS->CheckToneFileSize: [%d]"), size);
       
  1616     return error;
       
  1617     }
       
  1618 
       
  1619 // -----------------------------------------------------------------------------
       
  1620 // TMSRingTonePlayer::GetMaxToneFileSizeL
       
  1621 // -----------------------------------------------------------------------------
       
  1622 //
       
  1623 void TMSRingTonePlayer::GetMaxToneFileSizeL(TInt& /*aMaxSizeKB*/) const
       
  1624     {/*
       
  1625      const TInt error = CPhoneCenRepProxy::Instance()->GetInt(
       
  1626      KCRUidProfileEngine, KProEngRingingToneMaxSize, aMaxSizeKB);
       
  1627 
       
  1628      if (error != TMS_RESULT_SUCCESS)
       
  1629      {
       
  1630      aMaxSizeKB = 0;
       
  1631      }
       
  1632      if (aMaxSizeKB < 0)
       
  1633      {
       
  1634      aMaxSizeKB = 0;
       
  1635      }
       
  1636      */
       
  1637     //TRACE_PRN_N1("TMS->GetMaxToneFileSizeL: [%d]", aMaxSizeKB);
       
  1638     }
       
  1639 
       
  1640 // -----------------------------------------------------------------------------
       
  1641 // TMSRingTonePlayer::ActiveAudioPlayer
       
  1642 // -----------------------------------------------------------------------------
       
  1643 //
       
  1644 TMSRtAudioHdlr* TMSRingTonePlayer::ActiveAudioPlayer()
       
  1645     {
       
  1646     TMSRtAudioHdlr* audioHdlr = NULL;
       
  1647 
       
  1648     switch (iTonePlayingStatus)
       
  1649         {
       
  1650         case EAudioTonePlaying:
       
  1651             {
       
  1652             if (iAudioPlayer != NULL)
       
  1653                 {
       
  1654                 audioHdlr = iAudioPlayer;
       
  1655                 }
       
  1656             break;
       
  1657             }
       
  1658         case EDefaultTonePlaying:
       
  1659             {
       
  1660             if (iDefaultPlayer != NULL)
       
  1661                 {
       
  1662                 audioHdlr = iDefaultPlayer;
       
  1663                 }
       
  1664             break;
       
  1665             }
       
  1666         case EBeepOnce:
       
  1667             {
       
  1668             if (iBeepOncePlayer != NULL)
       
  1669                 {
       
  1670                 audioHdlr = iBeepOncePlayer;
       
  1671                 }
       
  1672             break;
       
  1673             }
       
  1674         case ESequenceTonePlaying:
       
  1675             {
       
  1676             if (iSequencePlayer != NULL)
       
  1677                 {
       
  1678                 audioHdlr = iSequencePlayer;
       
  1679                 }
       
  1680             break;
       
  1681             }
       
  1682          case EBackupTonePlaying:
       
  1683              {
       
  1684             if (iBackupPlayer != NULL)
       
  1685                 {
       
  1686                 audioHdlr = iBackupPlayer;
       
  1687                 }
       
  1688             break;
       
  1689              }
       
  1690         case ESilentTonePlaying:
       
  1691             {
       
  1692             if (iSilentPlayer != NULL)
       
  1693                 {
       
  1694                 audioHdlr = iSilentPlayer;
       
  1695                 }
       
  1696             break;
       
  1697             }
       
  1698         case EUnsecureVoIPTonePlaying:
       
  1699             {
       
  1700             if (iUnsecureVoIPTonePlayer != NULL)
       
  1701                 {
       
  1702                 audioHdlr = iUnsecureVoIPTonePlayer;
       
  1703                 }
       
  1704             break;
       
  1705             }
       
  1706         default:
       
  1707             break;
       
  1708         }
       
  1709 
       
  1710     return audioHdlr;
       
  1711     }
       
  1712