phoneapp/phoneringingtoneplayer/src/cphonetoneserverplaybackcontroller.cpp
changeset 78 baacf668fe89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneapp/phoneringingtoneplayer/src/cphonetoneserverplaybackcontroller.cpp	Fri Oct 15 12:58:46 2010 +0300
@@ -0,0 +1,417 @@
+
+/*
+* Copyright (c) 2010 - 2010 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:  Playback controller class for phone ringingtone server.
+*
+*/
+#include <e32base.h>
+#include <e32svr.h>
+#include <utf.h>
+#include <cntdef.h>
+#include <apgcli.h>
+#include <audiopreference.h>
+#include <profile.hrh>
+
+#include "cphonetoneserverplaybackcontroller.h"
+#include "cphonetoneserver.h"
+#include "cphonetoneserversession.h"
+#include "mphonetoneserver.h"
+#include "phoneconstants.h"
+#include "phoneringingtonetrace.h"
+
+const TInt KMinVolumeLevel = 1;
+const TInt KMaxVolumeLevel = 10;
+
+#if defined( __WINS__ )
+
+_LIT( KFileListRngMimeType, "rng" );
+_LIT8( KPhoneNoSoundSequence, "\x00\x11\x06\x05\xFC\x0A\x08\x40\x32\x0A\xF7\x40\x64\x06\x0B" );
+
+#else
+
+_LIT( KFileListRngMimeType, "application/vnd.nokia.ringing-tone" );
+
+#endif
+
+_LIT( KDefaultTone, "z:\\data\\sounds\\digital\\Nokia tune.aac" );
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::NewL
+// -----------------------------------------------------------------------------
+//
+CPhoneToneServerPlaybackController* CPhoneToneServerPlaybackController::NewL()
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::NewL <");
+    CPhoneToneServerPlaybackController* self = 
+            new( ELeave )CPhoneToneServerPlaybackController;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::NewL >");
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CPhoneToneServerPlaybackController::ConstructL()
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::ConstructL <");
+    CTimer::ConstructL();
+    iRingingType = EProfileRingingTypeSilent;
+    iSilentPlayer = CMdaAudioToneUtility::NewL( *this );
+    iSilentPlayer->PrepareToPlayDesSequence( KPhoneNoSoundSequence() );
+    iDefaultPlayer = CMdaAudioPlayerUtility::NewFilePlayerL( 
+        KDefaultTone(),
+        *this,
+        KAudioPriorityPhoneCall,
+        static_cast< TMdaPriorityPreference >( KAudioPrefIncomingCall ) );
+    
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::ConstructL >");
+    }
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::CPhoneToneServerPlaybackController
+// -----------------------------------------------------------------------------
+//
+CPhoneToneServerPlaybackController::CPhoneToneServerPlaybackController():
+        CTimer(EPriorityHigh),
+        iRingingType( EProfileRingingTypeSilent )
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::CPhoneToneServerPlaybackController <");
+    CActiveScheduler::Add(this);
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::CPhoneToneServerPlaybackController <");
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::~CPhoneToneServerPlaybackController
+// -----------------------------------------------------------------------------
+//
+CPhoneToneServerPlaybackController::~CPhoneToneServerPlaybackController()
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::~CPhoneToneServerPlaybackController <");
+    delete iSilentPlayer;
+    delete iDefaultPlayer;
+    delete iProfileSamplePlayer;
+    delete iProfileTonePlayer;
+    Cancel();
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::~CPhoneToneServerPlaybackController <");
+    }
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::RunL
+// -----------------------------------------------------------------------------
+//
+void CPhoneToneServerPlaybackController::RunL()
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::RunL <");
+    StopAndDeleteProfilePlayer();
+    PlayDefaultTone();
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::RunL >");
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::ConvertVolume
+// -----------------------------------------------------------------------------
+//
+TInt CPhoneToneServerPlaybackController::ConvertVolume( TInt aMaxVolume, TInt aVolume )
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::ConvertVolume <");
+    TInt result = aMaxVolume * aVolume / KMaxVolumeLevel;
+    if ( aVolume == KMinVolumeLevel && result == 0 )
+        {
+        result = 1;
+        }
+    PHONERINGINGTONE_PRINTF("CPhoneToneServerPlaybackController::ConvertVolume - result(%d)", result);
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::ConvertVolume >");
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::PlayProfileTone
+// -----------------------------------------------------------------------------
+//
+void CPhoneToneServerPlaybackController::PlayProfileTone()
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::PlayProfileTone <");
+    if ( iProfileSamplePlayer )
+        {
+        iProfileSamplePlayer->SetVolume( 
+            ConvertVolume( iProfileSamplePlayer->MaxVolume(), iVolume ) );
+        iProfileSamplePlayer->SetRepeats(KPhoneMdaAudioToneRepeatForever,
+            TTimeIntervalMicroSeconds( KPhoneRingingRepeatsTrailPause ));
+        iProfileSamplePlayer->Play();
+        }
+    else if ( iProfileTonePlayer )
+        {
+        iProfileTonePlayer->SetVolume( 
+        ConvertVolume( iProfileTonePlayer->MaxVolume(), iVolume ) );    
+        iProfileTonePlayer->SetRepeats(KPhoneMdaAudioToneRepeatForever,
+            TTimeIntervalMicroSeconds( KPhoneRingingRepeatsTrailPause ));
+        iProfileTonePlayer->Play();
+        }
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::PlayProfileTone >");
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::StopAndDeleteProfilePlayer
+// -----------------------------------------------------------------------------
+//
+void CPhoneToneServerPlaybackController::StopAndDeleteProfilePlayer()
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::DeleteProfilePlayer() <");
+    if ( iProfileSamplePlayer )
+        {
+        iProfileSamplePlayer->Stop();
+        iProfileSamplePlayer->Close();
+        delete iProfileSamplePlayer;
+        iProfileSamplePlayer = NULL;
+        }
+    else if ( iProfileTonePlayer )
+        {
+        if ( EMdaAudioToneUtilityPlaying == iProfileTonePlayer->State() )
+            {
+            iProfileTonePlayer->CancelPlay();
+            }
+        else if (EMdaAudioToneUtilityNotReady == iProfileTonePlayer->State() )
+            {
+            iProfileTonePlayer->CancelPrepare();
+            } 
+        delete iProfileTonePlayer;
+        iProfileTonePlayer = NULL;
+        }
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::DeleteProfilePlayer() >");
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::IsRngL
+// -----------------------------------------------------------------------------
+//
+TBool CPhoneToneServerPlaybackController::IsRngL( const TDesC& aFile )
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::IsRng <");
+#if defined( __WINS__ )
+
+    TInt index = aFile.Find( KFileListRngMimeType() );
+
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::IsRng >");
+    return ( KErrNotFound != index );
+
+#else
+
+    RApaLsSession apaLsSession;
+    User::LeaveIfError( apaLsSession.Connect() );
+    CleanupClosePushL( apaLsSession );
+    TUid dummyUid = { 0 };
+    TDataType dataType( dummyUid );
+    User::LeaveIfError(
+        apaLsSession.AppForDocument( aFile, dummyUid, dataType ) );
+    CleanupStack::PopAndDestroy( &apaLsSession );
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::IsRng >");
+    return ( dataType.Des().CompareF( KFileListRngMimeType ) == 0 );
+
+#endif
+    }
+    
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::MapcInitComplete
+// -----------------------------------------------------------------------------
+//
+void CPhoneToneServerPlaybackController::MapcInitComplete( TInt aError, 
+        const TTimeIntervalMicroSeconds& /*aDuration*/ )
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::MapcInitComplete <");
+    PHONERINGINGTONE_PRINTF("CPhoneToneServerPlaybackController::MapcInitComplete - aError(%d)",aError);
+    if ( !iDefaultPlayerInitialized && !aError )
+        {
+        // This player will be initialized first.
+        iDefaultPlayerInitialized = ETrue;
+        iDefaultPlayer->SetRepeats(KPhoneMdaAudioToneRepeatForever,
+                TTimeIntervalMicroSeconds( KPhoneRingingRepeatsTrailPause ));
+        return;
+        }
+    // Player is initialized at startup 
+    if ( EProfileRingingTypeSilent == iRingingType )
+        {
+        return;
+        }
+    
+    // Cancel backup player timer.
+    Cancel();
+   
+    if ( !aError )
+        {
+        PlayProfileTone();
+        }
+    else if ( iDefaultPlayerInitialized )
+        {
+        PlayDefaultTone();
+        }
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::MapcInitComplete >");
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::MatoPrepareComplete
+// -----------------------------------------------------------------------------
+//
+void CPhoneToneServerPlaybackController::MatoPrepareComplete( TInt aError )
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::MatoPrepareComplete <");
+    PHONERINGINGTONE_PRINTF("CPhoneToneServerPlaybackController::MatoPrepareComplete - aError(%d)",aError);
+    
+    // Player is initialized at startup 
+    if ( EProfileRingingTypeSilent == iRingingType  )
+        {
+        return;
+        }
+    
+    // Cancel backup player timer.
+    Cancel();
+    
+    if ( !aError )
+        {
+        PlayProfileTone();
+        }
+    else if ( iDefaultPlayerInitialized )
+        {
+        PlayDefaultTone();
+        }
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::MatoPrepareComplete >");
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::MapcPlayComplete
+// -----------------------------------------------------------------------------
+//
+void CPhoneToneServerPlaybackController::MapcPlayComplete( TInt aError )
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::MapcPlayComplete <");
+    PHONERINGINGTONE_PRINTF("CPhoneToneServerPlaybackController::MapcPlayComplete - aError(%d)",aError);
+#if defined (__WINS__)
+    
+    // S^4 onwards MdaAudioPlayer returns -5 (Not Supported)
+    // for audio files in emulator. 
+    // Error code is ignored to avoid unwanted situation.
+    if ( aError == KErrNotSupported )
+        {
+        aError = KErrNone;
+        }
+#endif     
+    
+    if ( aError && iDefaultPlayerInitialized )
+        {
+        PlayDefaultTone();
+        }
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::MapcPlayComplete >");
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::MatoPlayComplete
+// -----------------------------------------------------------------------------
+//
+void CPhoneToneServerPlaybackController::MatoPlayComplete( TInt aError )
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::MatoPlayComplete <");
+    PHONERINGINGTONE_PRINTF("CPhoneToneServerPlaybackController::MatoPlayComplete - aError(%d)",aError);
+    if ( aError && iDefaultPlayerInitialized )
+        {
+        PlayDefaultTone();
+        }
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::MatoPlayComplete >");
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::PlaySilentTone
+// -----------------------------------------------------------------------------
+
+void CPhoneToneServerPlaybackController::PlaySilentTone()
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::PlaySilentTone <");
+    iSilentPlayer->Play();
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::PlaySilentTone >");
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerPlaybackController::PlayNormalTone
+// -----------------------------------------------------------------------------
+//
+void CPhoneToneServerPlaybackController::PlayNormalToneL( 
+        const TFileName& aName, 
+        TInt aVolume, 
+        TProfileRingingType aType )
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::PlayNormalTone <");
+    PHONERINGINGTONE_PRINTF3("CPhoneToneServerPlaybackController::PlayNormalTone - aName(%S), aVolume(%d), aType(%d)",&aName, aVolume, aType );
+    
+    iVolume = aVolume;
+    iRingingType = aType;
+    
+    StopAndDeleteProfilePlayer();
+    Cancel();
+    After( KPhoneMaxRingingWaiting );
+    
+    if ( !aName.Length() )
+        {
+        PlayDefaultTone();
+        }
+    // RNG file types have to be played with CMdaAudioToneUtility player.
+    // Otherwise use sample player
+    else if ( IsRngL( aName ) )
+        {               
+        PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::PlayNormalTone - toneplayer");
+        iProfileTonePlayer = CMdaAudioToneUtility::NewL( *this );
+        iProfileTonePlayer->PrepareToPlayFileSequence( aName );
+        }
+    else
+        {
+        PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::PlayNormalTone - sampleplayer");
+        iProfileSamplePlayer = CMdaAudioPlayerUtility::NewFilePlayerL( 
+            aName,  
+            *this, 
+            KAudioPriorityPhoneCall,
+            static_cast< TMdaPriorityPreference >( KAudioPrefIncomingCall ));
+        }
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::PlayNormalTone >");    
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerSession::PlayDefaultTone
+// -----------------------------------------------------------------------------
+//
+void CPhoneToneServerPlaybackController::PlayDefaultTone()
+    {
+    Cancel();
+    iDefaultPlayer->SetVolume( 
+            ConvertVolume( iDefaultPlayer->MaxVolume(), iVolume ) );
+    iDefaultPlayer->Play();
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneToneServerSession::StopTone
+// -----------------------------------------------------------------------------
+//
+void CPhoneToneServerPlaybackController::StopTone()
+    {
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::StopTone() <");
+
+    Cancel();
+    StopAndDeleteProfilePlayer();
+    
+    iDefaultPlayer->Stop();
+
+    iSilentPlayer->CancelPlay();
+    PHONERINGINGTONE_PRINT("CPhoneToneServerPlaybackController::StopTone() >");
+    }
+
+// End of file