phoneapp/phoneringingtoneplayer/src/cphonetoneserverplaybackcontroller.cpp
author hgs
Fri, 15 Oct 2010 12:58:46 +0300
changeset 78 baacf668fe89
permissions -rw-r--r--
201041


/*
* 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