diff -r cfea66083b62 -r baacf668fe89 phoneapp/phoneringingtoneplayer/src/cphonetoneserverplaybackcontroller.cpp --- /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 +#include +#include +#include +#include +#include +#include + +#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