phoneapp/phoneringingtoneplayer/src/cphoneringingtonecontroller.cpp
changeset 21 92ab7f8d0eab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneapp/phoneringingtoneplayer/src/cphoneringingtonecontroller.cpp	Fri Mar 19 09:28:42 2010 +0200
@@ -0,0 +1,588 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+// INCLUDE FILES
+#include <telephonyvariant.hrh>
+#include "cphoneringingtonecontroller.h"
+#include "phonelogger.h"
+#include "cphoneringingtone.h"
+#include "tphonecmdparamringtone.h"
+#include "cphonecenrepproxy.h"
+#include "cphoneringingtoneplayer.h"
+#include "cphonettsplayer.h"
+
+// CONSTANTS
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CPhoneRingingToneController* CPhoneRingingToneController::NewL()
+    {
+    CPhoneRingingToneController* self = 
+        new ( ELeave ) CPhoneRingingToneController();
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::CPhoneRingingToneController
+// -----------------------------------------------------------------------------
+//
+CPhoneRingingToneController::CPhoneRingingToneController()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingToneController::ConstructL()
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::ConstructL()" );
+    //iMediatorSender = CPhoneMediatorSender::NewL();
+    //iMediatorSender->AttachCoverUiObserverL( this );
+    
+    iRingingtonePlayer = CPhoneRingingtonePlayer::NewL(); 
+
+    // Check video player configuration.
+    iArbitraryVideoScaling = 
+    CPhoneCenRepProxy::Instance()->IsTelephonyFeatureSupported( 
+            KTelephonyLVFlagArbitraryVideoScaling );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::~CPhoneRingingToneController
+// -----------------------------------------------------------------------------
+//
+CPhoneRingingToneController::~CPhoneRingingToneController()
+    {
+    /*if ( iMediatorSender )
+        {
+        iMediatorSender->DetachCoverUiObserver( this );
+        }*/
+
+    //delete iMediatorSender;
+    //iMediatorSender = NULL
+    
+    
+    delete iAudioVideoRingingTone;
+    iAudioVideoRingingTone = NULL;
+    delete iTTSPlayer;
+    iTTSPlayer = NULL;
+    delete iRingingtonePlayer;
+    iRingingtonePlayer = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::PlayRingToneL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPhoneRingingToneController::PlayRingToneL( 
+                                         TPhoneCommandParam* aCommandParam )
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::PlayRingToneL()" );
+
+    if ( aCommandParam->ParamId() == TPhoneCommandParam::EPhoneParamIdRingTone )
+        {
+        TPhoneCmdParamRingTone* ringToneParam = 
+            static_cast<TPhoneCmdParamRingTone*>( aCommandParam );
+
+        const TInt volume = ringToneParam->Volume();
+        TProfileRingingType ringingType = 
+        static_cast<TProfileRingingType>( ringToneParam->RingingType() );
+        
+        if ( !iAudioVideoRingingTone )
+            {
+            iAudioVideoRingingTone = CPhoneRingingTone::NewL(
+                ringToneParam->RingTone() );
+            }
+
+        // Store pofile based parameters.
+        iAudioVideoRingingTone->SetFileName( ringToneParam->RingTone() );
+        iAudioVideoRingingTone->SetVolume( volume );
+        iAudioVideoRingingTone->SetRingingType ( ringingType );
+        iAudioVideoRingingTone->SetTtsToneToBePlayed(
+                ringToneParam->TextToSay().Length()? ETrue : EFalse);
+
+        
+        // Caller contact text and image and image has
+        // higher priority than video ringing tone set for caller.
+        if ( iAudioVideoRingingTone->IsVideoRingingTone() )
+            {
+            if ( ringToneParam->IsCallerImage() )
+                {
+                // Play only audio from video ringingtone
+                PlayAudioRingTone(
+                        volume,
+                        ringingType );
+                }
+            else
+                {
+                // Play video ring tone
+                const TBool ringToneIsPersonal = ringToneParam->Type() ==
+                    EPhoneRingTonePersonal;
+                PlayVideoRingingTone( 
+                    *iAudioVideoRingingTone, 
+                    volume, 
+                    ringingType,
+                    ringToneIsPersonal );
+                }
+            }
+        else
+            {
+            // Play text to speech, if available
+            if ( ringToneParam->TextToSay().Length() )
+                {
+                if (iTTSPlayer) 
+                    {
+                    delete iTTSPlayer;
+                    iTTSPlayer = NULL;
+                    }
+                iTTSPlayer = CPhoneTTSPlayer::NewL(iRingingtonePlayer); 
+                iTTSPlayer->AddTtsPlaybackIfNeeded();
+                iTTSPlayer->PlayTtsTone(
+                    ringToneParam->TextToSay(),
+                    iAudioVideoRingingTone );
+                }
+            // Play audio ring tone
+            PlayAudioRingTone( 
+                volume, 
+                ringingType );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::PlayAudioRingTone
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingToneController::PlayAudioRingTone( 
+    TInt aVolume, 
+    TProfileRingingType aRingingType )
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::PlayAudioRingTone()" );
+    __PHONELOG2( 
+        EBasic,
+        EPhoneControl, 
+        "CPhoneRingingToneController::PlayAudioRingTone - aVolume(%d), aRingingType(%d)",
+        aVolume,
+        aRingingType );
+ 
+    if ( !iAudioVideoRingingTone ||
+         !iAudioVideoRingingTone->CheckAndHandleToneSizeLimit() )
+        {
+        iRingingtonePlayer->PlayDefaultTone( aVolume, aRingingType );
+        }
+    else if ( aRingingType == EProfileRingingTypeSilent )
+        {
+        iRingingtonePlayer->PlaySilentTone();
+        }
+    else if ( aRingingType == EProfileRingingTypeBeepOnce )
+        {
+        iRingingtonePlayer->PlayBeepOnce( aVolume );
+        }
+    else
+        {
+        iRingingtonePlayer->PlayProfileBasedTone(iAudioVideoRingingTone);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::MuteRingingToneOnAnswer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPhoneRingingToneController::MuteRingingToneOnAnswer()
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::MuteRingingToneOnAnswer()" );
+    
+  /*  if ( iVideoPlayer && iTonePlayingStatus == EVideoTonePlaying ||
+         iTonePlayingStatus == EPersonalVideoTonePlaying )
+        {
+        // Mute the video audio
+        iVideoPlayer->MuteVideoRingTone();
+        iTonePlayingStatus = ESilentVideoTonePlaying;
+        iVolume = 0;
+        }
+    else
+        {*/
+        DoMuteRingingTone();
+        //}
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::MuteRingingTone
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPhoneRingingToneController::MuteRingingTone()
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::MuteRingingTone()" );
+    
+ /*   if ( iVideoPlayer && iTonePlayingStatus == EVideoTonePlaying ||
+         iTonePlayingStatus == EPersonalVideoTonePlaying )
+        {
+        // Mute the video audio
+        iVideoPlayer->MuteVideoRingTone();
+        iTonePlayingStatus = ESilentVideoTonePlaying;
+        iVolume = 0;
+        }
+    else
+        {*/
+        StopPlaying();
+        //}
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::StopPlaying
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPhoneRingingToneController::StopPlaying()
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::StopPlaying()" );
+    if ( iTTSPlayer )
+        {
+        iTTSPlayer->StopPlaying();
+        delete iTTSPlayer;
+        iTTSPlayer = NULL;
+        }
+    iRingingtonePlayer->StopPlaying();
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::DoMuteRingingTone
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingToneController::DoMuteRingingTone()
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::DoMuteRingingTone()" );
+    
+  /*  switch( iTonePlayingStatus )
+        {
+        case EVideoTonePlaying: // video ringing tone, fall through
+        case EPersonalVideoTonePlaying: // fall through
+        case ESilentVideoTonePlaying:
+            if ( iVideoPlayer )
+                {
+                iVideoPlayer->MuteVideoRingTone();
+                return;                 
+                }
+            break;
+            
+        default:
+            break;
+        }*/
+    
+    iRingingtonePlayer->MuteActiveAudioPlayer();
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::ConvertVideoRingingType
+// -----------------------------------------------------------------------------
+//
+MPhoneVideoPlayer::TPlayMode CPhoneRingingToneController::ConvertVideoRingingType(
+    TProfileRingingType aRingingType )
+    {
+    MPhoneVideoPlayer::TPlayMode playMode;
+        
+    switch ( aRingingType )
+        {
+        case EProfileRingingTypeAscending:
+            playMode = MPhoneVideoPlayer::EPlayAscending;
+            break;
+        case EProfileRingingTypeRingingOnce:
+            playMode = MPhoneVideoPlayer::EPlayOnce;
+            break;
+        case EProfileRingingTypeRinging:
+        default:
+            playMode = MPhoneVideoPlayer::EPlayInLoop;
+            break;
+        }
+    
+    return playMode;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::SetVideoPlayer
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingToneController::SetVideoPlayer( 
+    MPhoneVideoPlayer* aVideoPlayer )
+    {
+    iVideoPlayer = aVideoPlayer;    
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::PlayVideoRingingTone
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingToneController::PlayVideoRingingTone( 
+    const CPhoneRingingTone& /*aRingingTone*/, 
+    TInt /*aVolume*/, 
+    TProfileRingingType /*aRingingType*/,
+    TBool /*aPersonalTone*/ )
+    {
+    /*
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::PlayVideoRingingTone()" );
+    
+    __ASSERT_DEBUG( iVideoPlayer, Panic( EPhoneViewGeneralError ) );
+    
+    iVolume = aVolume;
+    iRingingType = aRingingType;
+    TBool startTimer( ETrue );
+    
+     // Extended security check
+    if ( ExtendedSecurity() )
+        {
+        if ( !aRingingTone.IsFileInRom() &&
+             !aRingingTone.IsFileDrmProtected() )
+            {
+            __PHONELOG( EBasic, 
+                        EPhoneControl, 
+                        "CPhoneRingingToneController::HandleVideoPlayerError - PermissionDenied" );
+            iRingingtonePlayer->PlayDefaultTone( iVolume, iRingingType );
+            return;
+            }
+        __PHONELOG( EBasic, 
+                    EPhoneControl, 
+                    "CPhoneRingingToneController::HandleVideoPlayerError - ExtSecChk ok" );            
+            }
+         
+    // If flip is closed then show video on Cover UI
+    TBool videoPlaySentToCoverUi( EFalse );
+    TInt leaveCode( KErrNone );
+    if ( FeatureManager::FeatureSupported( KFeatureIdCoverDisplay ) )
+        {
+        const TInt flipOpen = CPhonePubSubProxy::Instance()->Value(
+            KPSUidUikon, KUikFlipStatus );
+        if( !flipOpen ) 
+            {
+            TRAP( leaveCode, videoPlaySentToCoverUi = CoverUIPlayVideoRingingToneL( 
+                aRingingTone ) );
+            }
+        }
+    // Play ringing tone here if video play sending did leave or
+    // video playing wasn't delegated to Cover UI   
+    if( !leaveCode && videoPlaySentToCoverUi )
+        {
+        iTimer->After( KPhoneMaxRingingWaiting, this );
+        return;
+        }
+ 
+    __PHONELOG( EBasic, EPhoneControl, "CPhoneRingingToneController::PlayVideoRingingTone - play" );
+    switch( aRingingType )
+        {
+        case EProfileRingingTypeSilent:
+            iVideoPlayer->PlayVideoRingTone( 
+                aRingingTone.FileName(),
+                ConvertVideoRingingType( aRingingType ),
+                0,
+                iArbitraryVideoScaling,
+                this );
+            iRingingtonePlayer->PlaySilentTone();
+            iVolume = 0; // for repeat
+            startTimer = EFalse; // no need for fallback
+            break;
+        
+        case EProfileRingingTypeBeepOnce:
+            iVideoPlayer->PlayVideoRingTone( 
+                aRingingTone.FileName(),
+                ConvertVideoRingingType( aRingingType ),
+                0,
+                iArbitraryVideoScaling,
+                this );
+            iRingingtonePlayer->BeepOnce( aVolume );
+            iVolume = 0; // for repeat
+            startTimer = EFalse; // no need for fallback
+            break;
+        default:
+            iVideoPlayer->PlayVideoRingTone( 
+                aRingingTone.FileName(),
+                ConvertVideoRingingType( aRingingType ),
+                iVolume,
+                iArbitraryVideoScaling,
+                this );
+            break;                
+        }
+
+    if ( aPersonalTone )
+        {
+        iTonePlayingStatus = EPersonalVideoTonePlaying;
+        }
+    else
+        {
+        iTonePlayingStatus = EVideoTonePlaying;
+        }
+
+    if ( startTimer && !iTimer->IsActive() )
+        {
+        // Start timer to guard video opening
+        iTimer->After( KPhoneMaxRingingWaiting, this );
+        }
+    */
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::HandleVideoPlayerError
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingToneController::HandleVideoPlayerError( 
+    TPhoneVideoPlayerErrorEvent /*aEvent*/,
+    TInt /*aError*/ )
+    {
+   /* __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::HandleVideoPlayerError()" );
+
+    if ( aError )
+        {
+        __PHONELOG1( EBasic, 
+                     EPhoneControl, 
+                     "CPhoneRingingToneController::HandleVideoPlayerError - error (%d)",
+                     aError );        
+        }
+  
+    // cancel guarding timer
+    iTimer->Cancel();
+
+    // to remove video window
+    iVideoPlayer->CancelVideoRingTone();
+
+    if ( iTonePlayingStatus == EPersonalVideoTonePlaying )
+        {
+        // Play default tone (active profile tone).
+        if ( iAudioVideoRingingTone &&
+             !iAudioVideoRingingTone->IsVideoRingingTone() )
+            {
+            PlayAudioRingTone( iVolume, iRingingType );
+            }
+        else // audio/video tone is video
+            {
+            PlayDefaultVideoAsync();
+            }
+        }
+    else
+        {
+        // Play backup tone
+        iRingingtonePlayer->PlayDefaultTone( iVolume, iRingingType );
+        }
+*/
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::HandleVideoPlayerInitComplete
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingToneController::HandleVideoPlayerInitComplete()
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::HandleVideoPlayerInitComplete()" );
+    
+    // cancel guarding timer
+    //iTimer->Cancel();
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::HandleVideoPlayerPlayingComplete
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingToneController::HandleVideoPlayerPlayingComplete()
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::HandleVideoPlayerPlayingComplete()" );
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::PlayDefaultVideoAsync
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingToneController::PlayDefaultVideoAsync()
+    {
+  /*  __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::PlayDefaultVideoAsync()" );    
+     
+    Cancel();
+
+    iState = EPlayingDefaultVideo; 
+
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );
+    SetActive();*/
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::ExtendedSecurity
+// -----------------------------------------------------------------------------
+//    
+TBool CPhoneRingingToneController::ExtendedSecurity() const
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::ExtendedSecurity()" );
+    return EFalse;
+    //return iExtSecNeeded;        
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::CoverUIPlayVideoRingingToneL
+// -----------------------------------------------------------------------------
+//   
+TBool CPhoneRingingToneController::CoverUIPlayVideoRingingToneL( 
+    const CPhoneRingingTone& aRingingTone )
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::CoverUIPlayVideoRingingToneL()" );
+
+    TBool showVideo( EFalse );
+
+    RBuf8 data;
+    CleanupClosePushL( data );
+    data.CreateL( aRingingTone.FileName().Length() );
+    data.Copy( aRingingTone.FileName() );
+    /*TInt err = iMediatorSender->IssueCommand( 
+        EPhoneCmdCoverUiShowMultimediaRingingTone, 
+        data );
+    if ( err == KErrNone )
+        {
+        showVideo = ETrue;
+        iActiveCoverUICommand = ETrue;
+        }*/
+    CleanupStack::PopAndDestroy(); //data 
+
+    return showVideo;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingToneController::ShowMultimediaRingingToneResponseL
+// -----------------------------------------------------------------------------
+//   
+void CPhoneRingingToneController::ShowMultimediaRingingToneResponseL( 
+    TInt aStatus )
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingToneController::ShowMultimediaRingingToneResponseL()" );
+
+    //iTimer->Cancel();
+    if( aStatus != KErrNone && iActiveCoverUICommand )
+        {
+        iRingingtonePlayer->PlayDefaultTone( iVolume, iRingingType );           
+        }
+    iActiveCoverUICommand = EFalse;
+    }
+
+
+    
+//  End of File