phoneapp/phoneuiview/src/cphoneaudioplayer.cpp
changeset 0 5f000ab63145
child 9 8871b09be73b
equal deleted inserted replaced
-1:000000000000 0:5f000ab63145
       
     1 /*
       
     2 * Copyright (c) 2002-2005 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:  Audio player implementation.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <e32std.h>
       
    21 #include <eikenv.h>
       
    22 #include <apgcli.h>
       
    23 #include <apmrec.h>
       
    24 #include <AudioPreference.h>
       
    25 #include <utf.h>    // For converting data for TTS
       
    26 #include <c3dringingtoneinterface.h>
       
    27 #include <AudioOutput.h>
       
    28 
       
    29 #include "cphoneaudioplayer.h"
       
    30 #include "cphoneringingtone.h"
       
    31 #include "mphoneaudioplayerobserver.h"
       
    32 #include "phoneconstants.h"
       
    33 #include "phonelogger.h"
       
    34 #include "phoneui.pan"
       
    35 
       
    36 
       
    37 // CONSTANTS
       
    38 
       
    39 
       
    40 _LIT( KFileListRngMimeType, "application/vnd.nokia.ringing-tone" );
       
    41 //Min volume level
       
    42 const TInt KMinVolumeLevel = 1;
       
    43 //Max volume level
       
    44 const TInt KMaxVolumeLevel = 10;
       
    45 // ============================ MEMBER FUNCTIONS ===============================
       
    46 
       
    47 // -----------------------------------------------------------------------------
       
    48 // CPhoneAudioPlayer::CPhoneAudioPlayer
       
    49 // -----------------------------------------------------------------------------
       
    50 //
       
    51 CPhoneAudioPlayer::CPhoneAudioPlayer( TAudioDataFormat aDataFormat,
       
    52     MPhoneAudioPlayerObserver& aObserver, 
       
    53     TInt aPriority, 
       
    54     TUint aPreference,
       
    55     TInt aId )
       
    56     : iFormat( aDataFormat ),
       
    57     iObserver( aObserver ),
       
    58     iPriority( aPriority ),
       
    59     iPreference( aPreference ),
       
    60     iId( aId )
       
    61     {
       
    62     }
       
    63 
       
    64 // -----------------------------------------------------------------------------
       
    65 // CPhoneAudioPlayer::ConstructL
       
    66 // -----------------------------------------------------------------------------
       
    67 //
       
    68 void CPhoneAudioPlayer::ConstructL(
       
    69     const TDesC& aFileName,
       
    70     CMdaServer* aMdaServer )
       
    71     {
       
    72     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::ConstructL()" );
       
    73     if ( iFormat == EFormatTone )
       
    74         {
       
    75         iTonePlayer = CMdaAudioToneUtility::NewL( *this, aMdaServer );
       
    76         iTonePlayer->PrepareToPlayFileSequence( aFileName );
       
    77         iPlayerStatus = EToneLoading;
       
    78         }
       
    79     else
       
    80         {
       
    81         //audio sample player
       
    82         __PHONELOG3( 
       
    83             EBasic, 
       
    84             EPhoneUIView, 
       
    85             "CPhoneAudioPlayer::ConstructL - aFileName(%S), iPriority(%d), iPreference(%d)",
       
    86             &aFileName, 
       
    87             iPriority, 
       
    88             iPreference );
       
    89 
       
    90         iSamplePlayer = CMdaAudioPlayerUtility::NewFilePlayerL( 
       
    91             aFileName,
       
    92             *this, 
       
    93             iPriority,
       
    94             static_cast< TMdaPriorityPreference >( iPreference ),
       
    95             aMdaServer );            
       
    96         iPlayerStatus = EToneLoading;
       
    97         
       
    98         }
       
    99     }
       
   100 
       
   101 // -----------------------------------------------------------------------------
       
   102 // CPhoneAudioPlayer::ConstructSeqL
       
   103 // -----------------------------------------------------------------------------
       
   104 //
       
   105 void CPhoneAudioPlayer::ConstructSeqL( 
       
   106     const TDesC8& aSequence,
       
   107         CMdaServer* aMdaServer )
       
   108     {
       
   109     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::ConstructSeqL()" );
       
   110     iTonePlayer = CMdaAudioToneUtility::NewL( *this, aMdaServer );
       
   111     iSequence = aSequence.AllocL();
       
   112     iTonePlayer->PrepareToPlayDesSequence( *iSequence );
       
   113     iPlayerStatus = EToneLoading;
       
   114     }
       
   115 
       
   116 // -----------------------------------------------------------------------------
       
   117 // CPhoneAudioPlayer::ConstructTtsL
       
   118 // -----------------------------------------------------------------------------
       
   119 //
       
   120 void CPhoneAudioPlayer::ConstructTtsL( 
       
   121     const TDesC& aTtsText, 
       
   122     TInt aPriority,
       
   123     TUint aPreference )
       
   124     {
       
   125     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::ConstructTtsL()" );
       
   126     delete iTtsPlayer; // if any
       
   127     iTtsPlayer = NULL;
       
   128     iTtsPlayer = 
       
   129         CMdaAudioPlayerUtility::NewL( 
       
   130             *this, aPriority, 
       
   131             static_cast< TMdaPriorityPreference >( aPreference ) );
       
   132     
       
   133     delete iTtsText;  // if any
       
   134     iTtsText = NULL;
       
   135     // UTF-8 strings can take up to 4 bytes per character
       
   136     iTtsText = HBufC8::NewL( aTtsText.Length() << KTimesToMultiply ); 
       
   137     
       
   138     TPtr8 refText = iTtsText->Des(); 
       
   139     User::LeaveIfError( 
       
   140         CnvUtfConverter::ConvertFromUnicodeToUtf8( refText, aTtsText ) );
       
   141 
       
   142     // UTF-8 chars can be up to 4 bytes long, but usually 
       
   143     // take 1-2 bytes, 3 for asian chars.
       
   144     HBufC8* oldText = iTtsText;
       
   145     iTtsText = iTtsText->ReAlloc( iTtsText->Length() );
       
   146     if ( !iTtsText )
       
   147         {
       
   148         // ReAlloc failed, set back to original.
       
   149         iTtsText = oldText;
       
   150         }
       
   151     
       
   152     iTtsPlayer->OpenDesL( *iTtsText );
       
   153     }
       
   154 
       
   155 // -----------------------------------------------------------------------------
       
   156 // CPhoneAudioPlayer::New
       
   157 // -----------------------------------------------------------------------------
       
   158 //
       
   159 CPhoneAudioPlayer* CPhoneAudioPlayer::New( 
       
   160     const CPhoneRingingTone& aRingingTone, 
       
   161     TInt aPriority, 
       
   162     TUint aPreference,
       
   163     MPhoneAudioPlayerObserver& aObserver, 
       
   164     TInt aId,
       
   165     CMdaServer* aMdaServer,
       
   166     TBool aExtSecNeeded )
       
   167     {
       
   168     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::New()" );
       
   169     CPhoneAudioPlayer* self = NULL;
       
   170     TRAPD( err, self = CPhoneAudioPlayer::NewL( 
       
   171         aRingingTone,
       
   172         aPriority,
       
   173         aPreference,
       
   174         aObserver,
       
   175         aId,
       
   176         aMdaServer,
       
   177         aExtSecNeeded ) );
       
   178     if ( err != KErrNone )
       
   179         {
       
   180         return NULL;
       
   181         }
       
   182     return self;
       
   183     }
       
   184 
       
   185 // -----------------------------------------------------------------------------
       
   186 // CPhoneAudioPlayer::NewL
       
   187 // -----------------------------------------------------------------------------
       
   188 //
       
   189 CPhoneAudioPlayer* CPhoneAudioPlayer::NewL( 
       
   190     const CPhoneRingingTone& aRingingTone, 
       
   191     TInt aPriority,
       
   192     TUint aPreference,
       
   193     MPhoneAudioPlayerObserver& aObserver,
       
   194     TInt aId,
       
   195     CMdaServer* aMdaServer,
       
   196     TBool aExtSecNeeded )
       
   197     {
       
   198     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::NewL()" );
       
   199     __PHONELOG1( EBasic, EPhoneUIView, "CPhoneAudioPlayer::NewL - aExtSecNeeded(%d)",
       
   200         aExtSecNeeded );
       
   201     
       
   202     // Check the file DRM property if extend secure is needed.
       
   203     if ( aExtSecNeeded )
       
   204         {
       
   205         if ( !aRingingTone.IsFileInRom() &&
       
   206              !aRingingTone.IsFileDrmProtected() )
       
   207             {
       
   208             __PHONELOG( EBasic, EPhoneUIView, "CPhoneAudioPlayer::NewL - DRM extend security check permission denied" );
       
   209             User::Leave( KErrPermissionDenied );
       
   210             }
       
   211         __PHONELOG( EBasic, EPhoneUIView, "CPhoneAudioPlayer::NewL - DRM extend security check ok" );
       
   212         }
       
   213 	// RNG file types have to be played with CMdaAudioToneUtility player.
       
   214 	// Otherwise use sample player
       
   215     TAudioDataFormat format = 
       
   216     ( aRingingTone.MimeType().CompareF( KFileListRngMimeType ) == KErrNone ) 
       
   217     ? EFormatTone :EFormatSample;
       
   218 
       
   219     CPhoneAudioPlayer* self = 
       
   220         new (ELeave) CPhoneAudioPlayer( 
       
   221             format,
       
   222             aObserver, 
       
   223             aPriority,
       
   224             aPreference,
       
   225             aId );
       
   226     
       
   227     CleanupStack::PushL( self );
       
   228     self->ConstructL( aRingingTone.FileName(), aMdaServer );
       
   229     CleanupStack::Pop( self );
       
   230 
       
   231     return self;
       
   232     }
       
   233 
       
   234 // -----------------------------------------------------------------------------
       
   235 // CPhoneAudioPlayer::NewL
       
   236 // -----------------------------------------------------------------------------
       
   237 //
       
   238 CPhoneAudioPlayer* CPhoneAudioPlayer::NewL( 
       
   239     const TDesC& aFileName, 
       
   240     TInt aPriority,
       
   241     TUint aPreference,
       
   242     MPhoneAudioPlayerObserver& aObserver,
       
   243     TInt aId,
       
   244     CMdaServer* aMdaServer,
       
   245     TBool aExtSecNeeded )
       
   246     {
       
   247     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::NewL()" );
       
   248     CPhoneRingingTone* tone = CPhoneRingingTone::NewL( aFileName );
       
   249     CleanupStack::PushL( tone );
       
   250 
       
   251     CPhoneAudioPlayer* player = CPhoneAudioPlayer::NewL( *tone,
       
   252                                                          aPriority,
       
   253                                                          aPreference,
       
   254                                                          aObserver,
       
   255                                                          aId,
       
   256                                                          aMdaServer,
       
   257                                                          aExtSecNeeded );
       
   258 
       
   259     CleanupStack::PopAndDestroy( tone );
       
   260     
       
   261     return player;        
       
   262     }
       
   263 
       
   264 // -----------------------------------------------------------------------------
       
   265 // CPhoneAudioPlayer::NewSeqL
       
   266 // -----------------------------------------------------------------------------
       
   267 //
       
   268 CPhoneAudioPlayer* CPhoneAudioPlayer::NewSeqL(
       
   269     const TDesC8& aSequence,
       
   270     TInt aPriority,
       
   271     TUint aPreference,
       
   272     MPhoneAudioPlayerObserver& aObserver, 
       
   273     TInt aId,
       
   274     CMdaServer* aMdaServer )
       
   275     {
       
   276     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::NewSeqL()" );
       
   277     CPhoneAudioPlayer* self = 
       
   278         new (ELeave) CPhoneAudioPlayer( 
       
   279             EFormatTone, 
       
   280             aObserver, 
       
   281             aPriority,
       
   282             aPreference,
       
   283             aId );
       
   284     
       
   285     CleanupStack::PushL( self );
       
   286     self->ConstructSeqL( aSequence, aMdaServer  );
       
   287     CleanupStack::Pop( self );
       
   288 
       
   289     return self;
       
   290     }
       
   291 
       
   292 // -----------------------------------------------------------------------------
       
   293 // CPhoneAudioPlayer::NewTtsL
       
   294 // -----------------------------------------------------------------------------
       
   295 //
       
   296 CPhoneAudioPlayer* CPhoneAudioPlayer::NewTtsL(
       
   297     const TDesC& aText,
       
   298     TInt aPriority,
       
   299     TUint aPreference,
       
   300     MPhoneAudioPlayerObserver& aObserver, 
       
   301     TInt aId )
       
   302     {
       
   303     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::NewTtsL()" );
       
   304     CPhoneAudioPlayer* self = 
       
   305         new (ELeave) CPhoneAudioPlayer( 
       
   306             EFormatTts, 
       
   307             aObserver, 
       
   308             aPriority,
       
   309             aPreference,
       
   310             aId );
       
   311     
       
   312     CleanupStack::PushL( self );
       
   313     self->ConstructTtsL( aText, aPriority, aPreference );
       
   314     CleanupStack::Pop( self );
       
   315 
       
   316     return self;
       
   317     }
       
   318 
       
   319 // -----------------------------------------------------------------------------
       
   320 // CPhoneAudioPlayer::~CPhoneAudioPlayer
       
   321 // -----------------------------------------------------------------------------
       
   322 //
       
   323 CPhoneAudioPlayer::~CPhoneAudioPlayer()
       
   324     {
       
   325     
       
   326     if ( iAudioOutput )
       
   327         {
       
   328     	delete iAudioOutput;    
       
   329         }  
       
   330     if ( iTonePlayer )  
       
   331         {
       
   332         delete iTonePlayer;  
       
   333         } 
       
   334     if ( i3DPlugin )
       
   335        {
       
   336         i3DPlugin->Stop();
       
   337         delete i3DPlugin;
       
   338         }
       
   339     // ECom cleanup
       
   340     REComSession::FinalClose();
       
   341     if ( iSamplePlayer )    
       
   342         {
       
   343         delete iSamplePlayer; 
       
   344         }
       
   345     if ( iTtsPlayer )
       
   346         {
       
   347         delete iTtsPlayer;   
       
   348         }
       
   349     if ( iSequence )
       
   350         {
       
   351         delete iSequence; 
       
   352         }
       
   353     if ( iTtsText )  
       
   354         {
       
   355         delete iTtsText;
       
   356         }   
       
   357     }
       
   358 
       
   359 // -----------------------------------------------------------------------------
       
   360 // CPhoneAudioPlayer::Play
       
   361 // -----------------------------------------------------------------------------
       
   362 //
       
   363 void CPhoneAudioPlayer::Play( TRingingType aRingType, TInt aVolume, TInt aTTsToBePlayed )
       
   364     {
       
   365     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::Play()" );
       
   366     __PHONELOG2( 
       
   367         EBasic, 
       
   368         EPhoneUIView, 
       
   369         "CPhoneAudioPlayer::Play - iFormat(%d), iPlayerStatus(%d)",
       
   370         iFormat, 
       
   371         iPlayerStatus );
       
   372     __PHONELOG3( 
       
   373         EBasic, 
       
   374         EPhoneUIView, 
       
   375         "CPhoneAudioPlayer::Play - aRingType(%d), aVolume(%d), aTTsToBePlayed(%d)",
       
   376         aRingType, 
       
   377         aVolume,
       
   378         aTTsToBePlayed );
       
   379     iRingType = aRingType;
       
   380     iVolume = aVolume;
       
   381     iTTsToBePlayed = aTTsToBePlayed;
       
   382     
       
   383     if ( iFormat == EFormatTone )
       
   384         {
       
   385         switch ( iPlayerStatus )
       
   386             {
       
   387             case ETonePlaying:
       
   388                 iTonePlayer->CancelPlay();
       
   389                 DoPlay();
       
   390                 break;
       
   391 
       
   392             case EToneReady:
       
   393                 iPlayerStatus = ETonePlaying;
       
   394                 DoPlay();
       
   395                 break;
       
   396 
       
   397             case EToneLoading:
       
   398                 iToBePlaying = ETrue;
       
   399                 break;
       
   400 
       
   401             default:
       
   402                 __ASSERT_DEBUG( EFalse, 
       
   403 
       
   404                       Panic( EPhoneViewCaseNotHandled ) );
       
   405             }
       
   406         }
       
   407     else if ( iFormat == EFormatTts )
       
   408         {
       
   409         switch ( iPlayerStatus )
       
   410             {
       
   411             case ETonePlaying:
       
   412                 //stop previous playing
       
   413                 iTtsPlayer->Stop();
       
   414                 DoPlay();
       
   415                 break;
       
   416 
       
   417             case EToneReady:
       
   418                 iPlayerStatus = ETonePlaying;
       
   419                 DoPlay();
       
   420                 break;
       
   421 
       
   422             case EToneLoading:
       
   423                 iToBePlaying = ETrue;
       
   424                 break;
       
   425 
       
   426             default:
       
   427                 __ASSERT_DEBUG( EFalse, 
       
   428                         Panic( EPhoneViewCaseNotHandled ) );
       
   429             }
       
   430         }
       
   431     else
       
   432         {
       
   433         switch ( iPlayerStatus )
       
   434             {
       
   435             case ETonePlaying:
       
   436                 //stop previous playing
       
   437                 StopPlaying();
       
   438                 iPlayerStatus = ETonePlaying;
       
   439                 DoPlay();
       
   440                 break;
       
   441 
       
   442             case EToneReady:
       
   443                 iPlayerStatus = ETonePlaying;
       
   444                 DoPlay();
       
   445                 break;
       
   446 
       
   447             case EToneLoading:
       
   448                 iToBePlaying = ETrue;
       
   449                 break;
       
   450 
       
   451             default:
       
   452                 __ASSERT_DEBUG( EFalse, 
       
   453 
       
   454                         Panic( EPhoneViewCaseNotHandled ) );
       
   455             }
       
   456         }
       
   457     }
       
   458     
       
   459 // -----------------------------------------------------------------------------
       
   460 // CPhoneAudioPlayer::ReStartPlaying
       
   461 // -----------------------------------------------------------------------------
       
   462 //    
       
   463 void CPhoneAudioPlayer::ReStartPlaying()
       
   464     {
       
   465     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::ReStartPlaying()" );
       
   466     __PHONELOG3( 
       
   467         EBasic, 
       
   468         EPhoneUIView, 
       
   469         "CPhoneAudioPlayer::ReStartPlaying - iFormat(%d), iRingType(%d), iVolume(%d)",
       
   470         iFormat, 
       
   471         iRingType, 
       
   472         iVolume );
       
   473         
       
   474     if ( iFormat == EFormatTone )
       
   475         {
       
   476         iTonePlayer->Play();
       
   477         iPlayerStatus = ETonePlaying;
       
   478         }
       
   479     else if ( iFormat == EFormatTts )
       
   480         {
       
   481         iTtsPlayer->Play();
       
   482         iPlayerStatus = ETonePlaying;
       
   483         }        
       
   484     else
       
   485         {
       
   486         iSamplePlayer->Play();
       
   487         iPlayerStatus = ETonePlaying;
       
   488         }    
       
   489     }
       
   490 
       
   491 // -----------------------------------------------------------------------------
       
   492 // CPhoneAudioPlayer::StopPlaying
       
   493 // -----------------------------------------------------------------------------
       
   494 //
       
   495 void CPhoneAudioPlayer::StopPlaying()
       
   496     {
       
   497     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::StopPlaying()" );
       
   498     iToBePlaying = EFalse;
       
   499     
       
   500     if ( iFormat == EFormatTone )
       
   501         {
       
   502         if ( EMdaAudioToneUtilityPrepared == iTonePlayer->State() )
       
   503             {
       
   504             iTonePlayer->CancelPrepare();
       
   505             }
       
   506         else if ( EMdaAudioToneUtilityPlaying == iTonePlayer->State() )
       
   507             {
       
   508             iTonePlayer->CancelPlay();
       
   509             }
       
   510         }
       
   511     else if ( iFormat == EFormatTts )
       
   512         {
       
   513         iTtsPlayer->Stop();
       
   514         }
       
   515     else
       
   516         {
       
   517         if ( i3DPlugin )
       
   518             {
       
   519             i3DPlugin->Stop();
       
   520             delete i3DPlugin;
       
   521             i3DPlugin = NULL;
       
   522             }
       
   523         else
       
   524             {
       
   525             iSamplePlayer->Stop();        
       
   526             }
       
   527         }
       
   528     
       
   529     iPlayerStatus = EToneReady;
       
   530     }
       
   531 
       
   532 // -----------------------------------------------------------------------------
       
   533 // CPhoneAudioPlayer::MapcInitComplete
       
   534 // -----------------------------------------------------------------------------
       
   535 //
       
   536 void CPhoneAudioPlayer::MapcInitComplete(
       
   537     TInt aError, 
       
   538     const TTimeIntervalMicroSeconds& /*aDuration*/ )
       
   539     {
       
   540     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::MapcInitComplete()" );
       
   541     __PHONELOG1( EBasic, EPhoneUIView, "CPhoneAudioPlayer::MapcInitComplete - aError(%d)",
       
   542         aError );
       
   543     __ASSERT_DEBUG( ( ( iFormat == EFormatSample ) || ( iFormat == EFormatTts ) ) && 
       
   544         ( iPlayerStatus == EToneLoading ), Panic( EPhoneViewGeneralError ) );
       
   545     if ( aError == KErrNone )
       
   546         {
       
   547         if ( iToBePlaying )
       
   548             {
       
   549             iPlayerStatus = ETonePlaying;
       
   550             iToBePlaying = EFalse;
       
   551             DoPlay();
       
   552             }
       
   553         else
       
   554             {
       
   555             iPlayerStatus = EToneReady;
       
   556             }
       
   557         iObserver.HandleAudioPlayerInitComplete( iId );
       
   558         }
       
   559     else
       
   560         {
       
   561         iObserver.HandleAudioPlayerError( 
       
   562             MPhoneAudioPlayerObserver::EAudioPlayerInitializingFailure, 
       
   563             aError, iId );
       
   564         }
       
   565     }
       
   566 
       
   567 // -----------------------------------------------------------------------------
       
   568 // CPhoneAudioPlayer::MapcPlayComplete
       
   569 // -----------------------------------------------------------------------------
       
   570 //
       
   571 void CPhoneAudioPlayer::MapcPlayComplete( TInt aError )
       
   572     {
       
   573     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::MapcPlayComplete()" );
       
   574     __PHONELOG2( EBasic, EPhoneUIView, "CPhoneAudioPlayer::MapcPlayComplete - iFormat(%d), aError(%d)",
       
   575         iFormat, aError );
       
   576     iPlayerStatus = EToneReady;
       
   577 
       
   578     //Destruct 3D plugin before player itself gets destructed.
       
   579     //In case of continuous ringing type, stopplaying() handles
       
   580     //3d plugin destruction
       
   581     if ( i3DPlugin )
       
   582         {
       
   583         i3DPlugin->Stop();
       
   584         delete i3DPlugin;
       
   585         i3DPlugin = NULL;            
       
   586         }
       
   587 
       
   588     if ( aError != KErrNone )
       
   589         {
       
   590         iObserver.HandleAudioPlayerError( 
       
   591             MPhoneAudioPlayerObserver::EAudioPlayerPlayingFailure, 
       
   592             aError, iId );
       
   593         }
       
   594     else
       
   595         {
       
   596         iObserver.HandlePlayingComplete( iId );
       
   597         }
       
   598     }
       
   599 
       
   600 // -----------------------------------------------------------------------------
       
   601 // CPhoneAudioPlayer::MatoPrepareComplete
       
   602 // -----------------------------------------------------------------------------
       
   603 //
       
   604 void CPhoneAudioPlayer::MatoPrepareComplete( TInt aError )
       
   605     {
       
   606     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::MatoPrepareComplete()" );
       
   607     __PHONELOG1( EBasic, EPhoneUIView, "CPhoneAudioPlayer::MatoPrepareComplete - aError(%d)",
       
   608         aError );
       
   609         
       
   610 	__ASSERT_DEBUG( ( iFormat == EFormatTone ) && ( iPlayerStatus == EToneLoading ), 
       
   611         Panic( EPhoneViewGeneralError ) );
       
   612     if ( aError == KErrNone )
       
   613         {
       
   614         if ( iToBePlaying )
       
   615             {
       
   616             iPlayerStatus = ETonePlaying;
       
   617             iToBePlaying = EFalse;
       
   618             DoPlay();
       
   619             }
       
   620         else
       
   621             {
       
   622             iPlayerStatus = EToneReady;
       
   623             }
       
   624         iObserver.HandleAudioPlayerInitComplete( iId );
       
   625         }
       
   626     else
       
   627         {
       
   628         iObserver.HandleAudioPlayerError( 
       
   629             MPhoneAudioPlayerObserver::EAudioPlayerInitializingFailure, 
       
   630             aError, iId );
       
   631         }
       
   632     }
       
   633 
       
   634 // -----------------------------------------------------------------------------
       
   635 // CPhoneAudioPlayer::MatoPlayComplete
       
   636 // -----------------------------------------------------------------------------
       
   637 //
       
   638 void CPhoneAudioPlayer::MatoPlayComplete(TInt aError)
       
   639     {
       
   640     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::MatoPlayComplete()" );
       
   641     __PHONELOG1( EBasic, EPhoneUIView, "CPhoneAudioPlayer::MatoPlayComplete - aError(%d)",
       
   642         aError );
       
   643     if ( aError != KErrNone )
       
   644         {
       
   645         iObserver.HandleAudioPlayerError( 
       
   646             MPhoneAudioPlayerObserver::EAudioPlayerPlayingFailure, 
       
   647             aError, iId );
       
   648         }
       
   649     else
       
   650         {
       
   651         iObserver.HandlePlayingComplete( iId );
       
   652         }
       
   653     }
       
   654 
       
   655 // -----------------------------------------------------------------------------
       
   656 // CPhoneAudioPlayer::DoPlay
       
   657 // -----------------------------------------------------------------------------
       
   658 //
       
   659 void CPhoneAudioPlayer::DoPlay()
       
   660     {
       
   661     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::DoPlay()" );
       
   662     __ASSERT_DEBUG( iPlayerStatus == ETonePlaying, 
       
   663         Panic( EPhoneViewGeneralError ) );
       
   664         
       
   665     SetRingingTypeProperties();
       
   666     
       
   667     TInt err(KErrNone);
       
   668     if ( iFormat == EFormatTone )
       
   669         {
       
   670         iTonePlayer->Play();
       
   671         }
       
   672     else if ( iFormat == EFormatTts )
       
   673         {
       
   674         iTtsPlayer->Play();
       
   675         }        
       
   676     else
       
   677         {
       
   678         TRAP( err,i3DPlugin = C3DRingingToneInterface::NewL( KNullUid ) );
       
   679         if ( !err && i3DPlugin )
       
   680             {
       
   681             i3DPlugin->SetAttr( E3DRTIAttrAudioPlayerUtility, iSamplePlayer );
       
   682             TRAP( err,i3DPlugin->PlayL() )
       
   683             }
       
   684         if ( err || !i3DPlugin )
       
   685             {
       
   686             if ( !iAudioOutput )
       
   687                  {
       
   688                  __PHONELOG( EBasic, EPhoneUIView, "CPhoneAudioPlayer::DoPlay c aud ");
       
   689                  TRAP (err, iAudioOutput = CAudioOutput::NewL( *iSamplePlayer ) );
       
   690                 if ( err )
       
   691                     {
       
   692                     __PHONELOG1(EBasic, EPhoneUIView, 
       
   693                         "P.AudPlayer.DoPlay.iAudioOutput.err ", err );
       
   694                     }                      	        
       
   695                }
       
   696             if ( !err && iAudioOutput )
       
   697                  {
       
   698                  __PHONELOG( EBasic, EPhoneUIView, "CPhoneAudioPlayer::DoPlay EALL ");
       
   699                  TRAP (err, iAudioOutput->SetAudioOutputL( CAudioOutput::EAll ) );
       
   700                  if ( err )
       
   701                      {
       
   702                      __PHONELOG1( EBasic, EPhoneUIView, 
       
   703                          "P.AudPlayer.DoPlay.SetAudioOutputL.err ", err );   
       
   704                      }
       
   705 
       
   706                  }
       
   707             iSamplePlayer->Play();
       
   708             }
       
   709         }
       
   710     }
       
   711 
       
   712 // -----------------------------------------------------------------------------
       
   713 // CPhoneAudioPlayer::SetRingingTypeProperties
       
   714 // -----------------------------------------------------------------------------
       
   715 //
       
   716 void CPhoneAudioPlayer::SetRingingTypeProperties()
       
   717     {
       
   718     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::SetRingingTypeProperties()" );
       
   719     __PHONELOG2( EBasic, EPhoneUIView, "CPhoneAudioPlayer::SetRingingTypeProperties - iFormat(%d), iRingType(%d)",
       
   720         iFormat, iRingType );
       
   721     TInt rampTime( 0 );     
       
   722     if ( iFormat == EFormatTone )
       
   723         {
       
   724         switch ( iRingType )
       
   725             {
       
   726             case ETypeRinging:
       
   727                 //If we have TTS activated and ringingtype is ringing:
       
   728                 //We need to play TTS sequence again when ringingtone restarts.
       
   729                 //Thats why we need to set ringingtype to ETypeRingingOnce because  
       
   730                 //it is the only way of knowing when ringingtone is completed. 
       
   731                 //Then we can restart it with new TTS iterations.
       
   732                 if ( iTTsToBePlayed )
       
   733                     {
       
   734                      //play only once
       
   735                     iTonePlayer->SetRepeats( 0, 
       
   736                         TTimeIntervalMicroSeconds(
       
   737                         KPhoneRingingRepeatsTrailPause ) ); 
       
   738                     iTonePlayer->SetVolume( ConvertVolume( iVolume ) );
       
   739                     __PHONELOG1( 
       
   740                         EBasic, 
       
   741                         EPhoneUIView, 
       
   742                         "CPhoneAudioPlayer::SetRingingTypeProperties - Ringing tone with TTS, Set volume(%d) and ring once",
       
   743                         iVolume );
       
   744                     }
       
   745                 else
       
   746                     {
       
   747                     iTonePlayer->SetRepeats( KPhoneMdaAudioToneRepeatForever,
       
   748                         TTimeIntervalMicroSeconds( 
       
   749                          KPhoneRingingRepeatsTrailPause ) );
       
   750                     iTonePlayer->SetVolume( ConvertVolume( iVolume ) );
       
   751                     __PHONELOG1( 
       
   752                         EBasic, 
       
   753                         EPhoneUIView, 
       
   754                         "CPhoneAudioPlayer::SetRingingTypeProperties - Ringing tone, Set volume(%d)",
       
   755                         iVolume );
       
   756                     }
       
   757                 break;
       
   758 
       
   759             case ETypeRingingOnce:
       
   760                 //play only once
       
   761                 iTonePlayer->SetRepeats( 0, 
       
   762                     TTimeIntervalMicroSeconds(
       
   763                     KPhoneRingingRepeatsTrailPause ) ); 
       
   764                 iTonePlayer->SetVolume( ConvertVolume( iVolume ) );
       
   765                 __PHONELOG1( 
       
   766                     EBasic, 
       
   767                     EPhoneUIView, 
       
   768                     "CPhoneAudioPlayer::SetRingingTypeProperties - Ring once tone, set volume(%d)",
       
   769                     iVolume );
       
   770                 break;
       
   771 
       
   772             case ETypeAscending:
       
   773                 iTonePlayer->SetRepeats( KPhoneMdaAudioToneRepeatForever,
       
   774                     TTimeIntervalMicroSeconds(
       
   775                     KPhoneRingingRepeatsTrailPause ) );
       
   776 
       
   777                 //Special case for TTs + ascending profile. Volume 
       
   778                 //and ramptime needs to be different as usual
       
   779                 if ( iTTsToBePlayed )
       
   780                     {
       
   781                     //rampTime in this case is only 3 seconds and volume is 1.
       
   782                     rampTime = KPhoneAudioAscendingRampDuration;
       
   783                     __PHONELOG1( 
       
   784                         EBasic, 
       
   785                         EPhoneUIView, 
       
   786                         "CPhoneAudioPlayer::SetRingingTypeProperties - Ascending tone with TTS, Start from lowest volume, rampTime(%d)",
       
   787                         rampTime );
       
   788                     iTonePlayer->SetVolumeRamp( 
       
   789                         TTimeIntervalMicroSeconds( rampTime ) ); 
       
   790 
       
   791                     iCurrentVolume = 1; //we start from the lowest volume
       
   792                     iTonePlayer->SetVolume( ConvertVolume( iCurrentVolume ) );
       
   793                     }
       
   794                 else
       
   795                     {
       
   796                     //rampTime: time for one step * volume level
       
   797                     rampTime = KPhoneAudioAscendingRampDuration*iVolume;
       
   798                     __PHONELOG2( 
       
   799                         EBasic, 
       
   800                         EPhoneUIView, 
       
   801                         "CPhoneAudioPlayer::SetRingingTypeProperties - Ascending tone, Set volume(%d), rampTime(%d)",
       
   802                         iVolume, rampTime );
       
   803                     iTonePlayer->SetVolumeRamp( 
       
   804                         TTimeIntervalMicroSeconds( rampTime ) );
       
   805                         
       
   806                     iCurrentVolume = 1; //we start from the lowest volume
       
   807                     iTonePlayer->SetVolume( ConvertVolume( iVolume ) );       
       
   808                     }
       
   809                 break;
       
   810 
       
   811             default:
       
   812                 Panic( EPhoneViewGeneralError );
       
   813                 break;
       
   814             }
       
   815 
       
   816         __PHONELOG3( 
       
   817             EBasic, 
       
   818             EPhoneUIView, 
       
   819             "CPhoneAudioPlayer::SetRingingTypeProperties - Tone, iPriority(%d), iPreference(%d), iVolume(%d)",
       
   820             iPriority, iPreference, iVolume );
       
   821 
       
   822         //Set priority and preference
       
   823         iTonePlayer->SetPriority( iPriority, 
       
   824             static_cast< TMdaPriorityPreference >( iPreference ) );
       
   825         }
       
   826     else if ( iFormat == EFormatTts )
       
   827         {
       
   828         switch ( iRingType )
       
   829             {
       
   830             case ETypeRinging:
       
   831             case ETypeAscending:
       
   832                 // Not possible iRingType for TTS.
       
   833                 break;
       
   834 
       
   835             case ETypeRingingOnce:
       
   836                 iTtsPlayer->SetRepeats( 0, // play only once
       
   837                     TTimeIntervalMicroSeconds( 
       
   838                     KPhoneRingingRepeatsTrailPause ) );
       
   839                 iTtsPlayer->SetVolume( ConvertVolume( iVolume ) );
       
   840                 __PHONELOG1( 
       
   841                     EBasic, 
       
   842                     EPhoneUIView, 
       
   843                     "CPhoneAudioPlayer::SetRingingTypeProperties - TTS, Set volume(%d)",
       
   844                     iVolume );
       
   845                 break;
       
   846             
       
   847             default:
       
   848                 __ASSERT_DEBUG( EFalse, 
       
   849                         Panic( EPhoneViewCaseNotHandled ) );
       
   850             }
       
   851         __PHONELOG( 
       
   852             EBasic, 
       
   853             EPhoneUIView, 
       
   854             "CPhoneAudioPlayer::SetRingingTypeProperties - TTS" );
       
   855         }
       
   856     else
       
   857         {
       
   858         switch ( iRingType )
       
   859             {
       
   860             case ETypeRinging:
       
   861                 //If we have TTS activated and ringingtype is ringing:
       
   862                 //We need to play TTS sequence again when ringingtone restarts.
       
   863                 //Thats why we need to set ringingtype to ETypeRingingOnce because  
       
   864                 //it is theonly way of knowing when ringingtone is completed. 
       
   865                 //Then we can restartit with new TTS iterations.
       
   866                 if ( iTTsToBePlayed )
       
   867                     {
       
   868                      //play only once
       
   869                     iSamplePlayer->SetRepeats( 0, 
       
   870                         TTimeIntervalMicroSeconds(
       
   871                         KPhoneRingingRepeatsTrailPause ) ); 
       
   872                     iSamplePlayer->SetVolume( ConvertVolume( iVolume ) );
       
   873                     __PHONELOG1( 
       
   874                         EBasic, 
       
   875                         EPhoneUIView, 
       
   876                         "CPhoneAudioPlayer::SetRingingTypeProperties - Ringing sample with TTS, Ring only once, Set volume(%d)",
       
   877                         iVolume );
       
   878                     }
       
   879                 else
       
   880                     {
       
   881                     iSamplePlayer->SetRepeats( KPhoneMdaAudioToneRepeatForever,
       
   882                         TTimeIntervalMicroSeconds( 
       
   883                         KPhoneRingingRepeatsTrailPause ) );
       
   884                     iSamplePlayer->SetVolume( ConvertVolume( iVolume ) );
       
   885                     __PHONELOG1( 
       
   886                         EBasic, 
       
   887                         EPhoneUIView, 
       
   888                         "CPhoneAudioPlayer::SetRingingTypeProperties - Ringing sample, Set volume(%d)",
       
   889                         iVolume );
       
   890                     }
       
   891                 break;
       
   892 
       
   893             case ETypeRingingOnce:
       
   894                 iSamplePlayer->SetRepeats( 0,//play only once
       
   895                     TTimeIntervalMicroSeconds( 
       
   896                     KPhoneRingingRepeatsTrailPause ) ); 
       
   897                 iSamplePlayer->SetVolume( ConvertVolume( iVolume ) );
       
   898                 __PHONELOG1( 
       
   899                     EBasic, 
       
   900                     EPhoneUIView, 
       
   901                     "CPhoneAudioPlayer::SetRingingTypeProperties - Ring once sample, set volume(%d)",
       
   902                     iVolume );
       
   903                 break;
       
   904 
       
   905             case ETypeAscending:
       
   906                 iSamplePlayer->SetRepeats( KPhoneMdaAudioToneRepeatForever,
       
   907                     TTimeIntervalMicroSeconds(
       
   908                     KPhoneRingingRepeatsTrailPause ) );
       
   909 
       
   910                 //Special case for TTs + ascending profile. Volume 
       
   911                 //and ramptime needs to be different as usual
       
   912                 if ( iTTsToBePlayed )
       
   913                     {
       
   914                     //rampTime in this case is only 3 seconds and volume is 1.
       
   915                     rampTime = KPhoneAudioAscendingRampDuration;
       
   916                     __PHONELOG1( 
       
   917                         EBasic, 
       
   918                         EPhoneUIView, 
       
   919                         "CPhoneAudioPlayer::SetRingingTypeProperties - Ascending sample with TTS, Start from lowest volume, rampTime(%d)",
       
   920                         rampTime );
       
   921                     iSamplePlayer->SetVolumeRamp( 
       
   922                         TTimeIntervalMicroSeconds( rampTime ) ); 
       
   923 
       
   924                     iCurrentVolume = 1; //we start from the lowest volume
       
   925                     iSamplePlayer->SetVolume( ConvertVolume( iCurrentVolume ) );
       
   926                     }
       
   927                 else
       
   928                     {
       
   929                     //rampTime: time for one step * volume level
       
   930                     rampTime = KPhoneAudioAscendingRampDuration*iVolume;
       
   931                     __PHONELOG2( 
       
   932                         EBasic, 
       
   933                         EPhoneUIView, 
       
   934                         "CPhoneAudioPlayer::SetRingingTypeProperties - Ascending sample, Set volume(%d), rampTime(%d)",
       
   935                         iVolume, rampTime );
       
   936                     iSamplePlayer->SetVolumeRamp( 
       
   937                         TTimeIntervalMicroSeconds( rampTime ) );
       
   938                         
       
   939                     iCurrentVolume = 1; //we start from the lowest volume
       
   940                     iSamplePlayer->SetVolume( ConvertVolume( iVolume ) );
       
   941                     }
       
   942                 break;
       
   943 
       
   944             default:
       
   945                 Panic( EPhoneViewGeneralError );
       
   946                 break;
       
   947             }
       
   948 
       
   949         __PHONELOG( 
       
   950             EBasic, 
       
   951             EPhoneUIView, 
       
   952             "CPhoneAudioPlayer::SetRingingTypeProperties - Sample" );
       
   953         }
       
   954     }
       
   955 
       
   956 // -----------------------------------------------------------------------------
       
   957 // CPhoneAudioPlayer::SetNewVolumeAndRamptime
       
   958 // -----------------------------------------------------------------------------
       
   959 //    
       
   960 void CPhoneAudioPlayer::SetNewVolumeAndRamptime( TInt aVolume, TInt aRamptime )
       
   961     {
       
   962     __LOGMETHODSTARTEND( EPhoneUIView, "CPhoneAudioPlayer::SetNewVolumeAndRamptime()" );
       
   963    
       
   964     //Check that volume is in valid range.
       
   965    TInt volume = aVolume<1 ? 1:aVolume;
       
   966     __PHONELOG1( EBasic, EPhoneUIView, "CPhoneAudioPlayer::SetNewVolumeAndRamptime - aVolume(%d)",
       
   967         aVolume ); 
       
   968             
       
   969     if ( iFormat == EFormatTone && iTonePlayer )
       
   970         {
       
   971         iTonePlayer->SetVolumeRamp(TTimeIntervalMicroSeconds( aRamptime ) );
       
   972         iTonePlayer->SetVolume( ConvertVolume( volume ) );
       
   973         __PHONELOG( EBasic, EPhoneUIView, "CPhoneAudioPlayer::SetNewVolumeAndRamptime - Tone player" );
       
   974         }
       
   975     else if ( iFormat == EFormatTts && iTtsPlayer )
       
   976         {
       
   977         iTtsPlayer->SetVolumeRamp(TTimeIntervalMicroSeconds( aRamptime ) );
       
   978         iTtsPlayer->SetVolume( ConvertVolume( volume ) );
       
   979         __PHONELOG( EBasic, EPhoneUIView, "CPhoneAudioPlayer::SetNewVolumeAndRamptime - TTS player" );
       
   980         }
       
   981     else 
       
   982         {
       
   983         iSamplePlayer->SetVolumeRamp(TTimeIntervalMicroSeconds( aRamptime ) );
       
   984         iSamplePlayer->SetVolume( ConvertVolume( volume ) );
       
   985         __PHONELOG( EBasic, EPhoneUIView, "CPhoneAudioPlayer::SetNewVolumeAndRamptime - Sample player" );
       
   986         }
       
   987    
       
   988     }
       
   989    
       
   990 
       
   991 // -----------------------------------------------------------------------------
       
   992 // CPhoneAudioPlayer::ConvertVolume
       
   993 // -----------------------------------------------------------------------------
       
   994 //  
       
   995 TInt CPhoneAudioPlayer::ConvertVolume( TInt aVolume )
       
   996     {
       
   997     //_DDPRINT( 5, "P.AudPlayer.ConvertVolume.aVolume", aVolume );
       
   998 
       
   999     TInt result( 0 );    
       
  1000     
       
  1001     if ( iFormat == EFormatTone )
       
  1002         {
       
  1003         result = iTonePlayer->MaxVolume() * aVolume / KMaxVolumeLevel;
       
  1004         }
       
  1005     else if ( iFormat == EFormatTts )
       
  1006         {
       
  1007         result = iTtsPlayer->MaxVolume() * aVolume / KMaxVolumeLevel;    
       
  1008         }
       
  1009     else
       
  1010         {
       
  1011         result = iSamplePlayer->MaxVolume() * aVolume / KMaxVolumeLevel;       
       
  1012         }
       
  1013         
       
  1014 	// if user has selected minimum volume level
       
  1015 	// set HW volume 1
       
  1016     if ( aVolume == KMinVolumeLevel && result == 0 )
       
  1017         {
       
  1018         result = 1; 
       
  1019         }
       
  1020        
       
  1021     //_DDPRINT( 5, "P.AudPlayer.ConvertVolume.result", result );       
       
  1022     return result;    
       
  1023     }
       
  1024 
       
  1025        
       
  1026 // -----------------------------------------------------------------------------
       
  1027 // CPhoneAudioPlayer::SetTTsToBePlayed
       
  1028 // -----------------------------------------------------------------------------
       
  1029 //  
       
  1030 void CPhoneAudioPlayer::SetTTsToBePlayed( TBool aTTsToBePlayed )
       
  1031 	{
       
  1032 	iTTsToBePlayed = aTTsToBePlayed;
       
  1033 	}  
       
  1034 
       
  1035 // -----------------------------------------------------------------------------
       
  1036 // CPhoneAudioPlayer::MutePlaying
       
  1037 // -----------------------------------------------------------------------------
       
  1038 //	
       
  1039 void CPhoneAudioPlayer::MutePlaying()
       
  1040     {
       
  1041     //_DPRINT( 5, "P.Aud.Mute" );
       
  1042     if ( iPlayerStatus == ETonePlaying )
       
  1043         {
       
  1044         if ( iFormat == EFormatTone )
       
  1045             {
       
  1046             iTonePlayer->SetVolume(0);
       
  1047             }
       
  1048         else if ( iFormat == EFormatTts )
       
  1049             {
       
  1050             iTtsPlayer->SetVolume(0);
       
  1051             }
       
  1052         else // EFormatSample
       
  1053             {
       
  1054             iSamplePlayer->SetVolume(0);        
       
  1055             }
       
  1056         }
       
  1057     else
       
  1058         {
       
  1059         // Mute called during EToneLoading state.
       
  1060         iToBePlaying = EFalse;    
       
  1061         }                   
       
  1062     }
       
  1063    
       
  1064 //  End of File