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