diff -r 8ee96d21d9bf -r 7e0eff37aedb profilesservices/MediaFileList/Src/mediafilepreview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/profilesservices/MediaFileList/Src/mediafilepreview.cpp Wed Sep 01 12:20:44 2010 +0100 @@ -0,0 +1,1539 @@ +/* +* Copyright (c) 2007 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: Class for preview audio and video +* +*/ + + + + +// INCLUDE FILES + +#include "mediafilepreview.h" +#include "mediafiledialogutils.h" +#include "mediafilelist.h" +#include "mediafilelistdebug.h" + +#include // KPSUidScreenSaver +#include // KAudioPriorityPreview +#include // C3DRingingToneInterface + +#include // for phone call states + +// for reading active profile settings +#include +#include +#include +#include "TProfileToneSettings.h" +#include +#include +#include +#include // KProEngDefaultRingingTone + + +/****************************************************************************** + * class CMFPreviewHandlerBase + ******************************************************************************/ + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::CMFPreviewHandlerBase +// +// ----------------------------------------------------------------------------- +// +CMFPreviewHandlerBase::CMFPreviewHandlerBase() + { + iMediaType = KErrNotFound; + iRingingVolume = KErrNotFound; + iRingingType = KErrNotFound; + iVibra = KErrNotFound; + i3DEffect = KErrNotFound; + i3DEcho = KErrNotFound; + iFileSize = KErrNotFound; + + iFullName = NULL; + + iActiveProfileRead = EFalse; + iPlayerStatus = EPlayerNotCreated; + + iObserver = NULL; + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::CMFPreviewHandlerBase +// +// ----------------------------------------------------------------------------- +// +void CMFPreviewHandlerBase::ConstructL() + { + // To allow/not allow screensaver + // Errors ignored, no actions needed if API is not available + iProperty.Attach( KPSUidScreenSaver, KScreenSaverAllowScreenSaver ); + + User::LeaveIfError( iApaSession.Connect() ); + + TRAP_IGNORE( ReadDefaultToneL() ); + // To keep backlight on while a video is being previewed + iBacklightTimer = CPeriodic::NewL( EPriorityLow ); + } + + +// ---------------------------------------------------------------------------- +// Destructor +// +// ---------------------------------------------------------------------------- +// +CMFPreviewHandlerBase::~CMFPreviewHandlerBase() + { + delete iFullName; + iProperty.Close(); + + iApaSession.Close(); + + if ( iBacklightTimer ) + { + delete iBacklightTimer; + iBacklightTimer = NULL; + } + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::SetAttr +// +// ----------------------------------------------------------------------------- +void CMFPreviewHandlerBase::SetAttrL( TInt aAttr, TInt aValue ) + { + switch ( aAttr ) + { + case CMediaFileList::EAttrVolume: + { + iRingingVolume = aValue; + break; + } + case CMediaFileList::EAttrRingingType: + { + iRingingType = aValue; + break; + } + case CMediaFileList::EAttrVibra: + { + iVibra = aValue; + break; + } + case CMediaFileList::EAttr3DEffect: + { + i3DEffect = aValue; + break; + } + case CMediaFileList::EAttr3DEcho: + { + i3DEcho = aValue; + break; + } + case CMediaFileList::EAttrFileSize: + { + iFileSize = aValue; + break; + } + default: + { + break; + } + } + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::Attr +// +// ----------------------------------------------------------------------------- +TInt CMFPreviewHandlerBase::Attr( TInt aAttr ) + { + TInt ret = KErrNotFound; + + switch ( aAttr ) + { + case CMediaFileList::EAttrVolume: + { + ret = iRingingVolume; + break; + } + case CMediaFileList::EAttrRingingType: + { + ret = iRingingType; + break; + } + case CMediaFileList::EAttrVibra: + { + ret = iVibra; + break; + } + case CMediaFileList::EAttr3DEffect: + { + ret = i3DEffect; + break; + } + case CMediaFileList::EAttr3DEcho: + { + ret = i3DEcho; + break; + } + case CMediaFileList::EAttrFileSize: + { + ret = iFileSize; + break; + } + default: + { + break; + } + } + + return ret; + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::SetAttrL +// +// ----------------------------------------------------------------------------- +void CMFPreviewHandlerBase::SetAttrL( TInt aAttr, const TDesC& aValue ) + { + if ( aAttr == TMFDialogUtil::EAttrFileName ) + { + delete iFullName; + iFullName = NULL; + iFullName = aValue.AllocL(); + } + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::SetAttr +// +// ----------------------------------------------------------------------------- +// +void CMFPreviewHandlerBase::SetAttrL( TInt aAttr, TAny* aValue ) + { + if ( aAttr == TMFDialogUtil::EAttrDrawingWindow ) + { + iWindow = static_cast( aValue ); + } + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::SetObserver +// +// ----------------------------------------------------------------------------- +// +void CMFPreviewHandlerBase::SetObserver( MPreviewHandlerObserver* aObserver ) + { + iObserver = aObserver; + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::IsCallOngoing +// +// ----------------------------------------------------------------------------- +// +TBool CMFPreviewHandlerBase::IsCallOngoing() + { + TInt err = KErrNone; + TInt callState = EPSCTsyCallStateUninitialized; + + err = RProperty::Get( KPSUidCtsyCallInformation, KCTsyCallState, callState ); + if ( err == KErrNone ) + { + if( callState != EPSCTsyCallStateUninitialized && + callState != EPSCTsyCallStateNone && + callState != EPSCTsyCallStateDisconnecting ) + { + // There was call ongoing + return ETrue; + } + } + + return EFalse; + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::RingingVolume +// +// ----------------------------------------------------------------------------- +// +TInt CMFPreviewHandlerBase::RingingVolume() + { + const TInt KDefaultVolumeLevel = 7; // see profile.hrh for volume levels + + if ( iRingingVolume != KErrNotFound ) + { + return iRingingVolume; + } + + if ( iActiveProfileRead ) + { + return iActiveProfileRingingVolume; + } + + return KDefaultVolumeLevel; + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::RingingType +// +// ----------------------------------------------------------------------------- +// +TInt CMFPreviewHandlerBase::RingingType() + { + if ( iRingingType != KErrNotFound ) + { + return iRingingType; + } + + if ( iActiveProfileRead ) + { + return iActiveProfileRingingType; + } + + return ERingingTypeRinging; + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::Vibra +// +// ----------------------------------------------------------------------------- +// +TInt CMFPreviewHandlerBase::Vibra() + { + if ( iVibra != KErrNotFound ) + { + return iVibra; + } + + if ( iActiveProfileRead ) + { + return iActiveProfileVibra; + } + + return 0; // in case of error vibra is off + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::Echo3D +// +// ----------------------------------------------------------------------------- +// +TInt CMFPreviewHandlerBase::Echo3D() + { + if ( i3DEcho != KErrNotFound ) + { + return i3DEcho; + } + + if ( iActiveProfileRead ) + { + return iActiveProfile3DEcho; + } + + return EProfile3DEchoOff; // from ProfileInternal.hrh + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::Effect3D +// +// ----------------------------------------------------------------------------- +// +TInt CMFPreviewHandlerBase::Effect3D() + { + if ( i3DEffect != KErrNotFound ) + { + return i3DEffect; + } + + if ( iActiveProfileRead ) + { + return iActiveProfile3DEffect; + } + + return EProfile3DEffectOff; + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::ConvertVolume +// +// ----------------------------------------------------------------------------- +// +TInt CMFPreviewHandlerBase::ConvertVolume( TInt aVolume, TInt aMaxVolume ) + { + const TInt KMinVolumeLevel = 1; + const TInt KMaxVolumeLevel = 10; + + TInt result = aMaxVolume * aVolume / KMaxVolumeLevel; + + // if user has selected minimum volume level set HW volume 1 + if ( aVolume == KMinVolumeLevel && result == 0 ) + { + result = 1; + } + + return result; + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::ReadActiveProfileL +// ----------------------------------------------------------------------------- +// +void CMFPreviewHandlerBase::ReadActiveProfileL() + { + iActiveProfileRead = EFalse; + + MProfileEngine* profileEngine = CreateProfileEngineL(); + CleanupReleasePushL( *profileEngine ); + + MProfile* activeProfile = profileEngine->ActiveProfileL(); + CleanupReleasePushL( *activeProfile ); + + const MProfileTones& profileTones = activeProfile->ProfileTones(); + + const TProfileToneSettings& toneSettings = profileTones.ToneSettings(); + iActiveProfileVibra = toneSettings.iVibratingAlert; + iActiveProfileRingingVolume = toneSettings.iRingingVolume; + iActiveProfileRingingType = toneSettings.iRingingType; + + const MProfileExtraSettings& extra = activeProfile->ProfileExtraSettings(); + const MProfile3DToneSettings& threeD = extra.Profile3DToneSettings(); + + iActiveProfile3DEffect = threeD.Effect(); + iActiveProfile3DEcho = threeD.Echo(); + + CleanupStack::PopAndDestroy( activeProfile ); + CleanupStack::PopAndDestroy( profileEngine ); + + iActiveProfileRead = ETrue; + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::ReadDefaultToneL +// ----------------------------------------------------------------------------- +// +void CMFPreviewHandlerBase::ReadDefaultToneL() + { + CRepository* cenrep = CRepository::NewLC( KCRUidProfileEngine ); + + User::LeaveIfError( cenrep->Get( KProEngDefaultRingingTone, iDefaultTone ) ); + CleanupStack::PopAndDestroy( cenrep ); + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::EnableScreenSaver +// +// ----------------------------------------------------------------------------- +// +void CMFPreviewHandlerBase::EnableScreenSaver( TBool aEnable ) + { + if ( aEnable ) + { + // allow screen saver, unless there's a call ongoing + if( !IsCallOngoing() ) + { + // ignore error, no actions needed if API is not available + iProperty.Set( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, + EFLScreenSaverAllowed ); + } + } + else + { + iProperty.Set( KPSUidScreenSaver, + KScreenSaverAllowScreenSaver, EFLScreenSaverNotAllowed ); + } + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::GetDataType +// +// ----------------------------------------------------------------------------- +// +TInt CMFPreviewHandlerBase::GetDataType( const TDesC& aFileName, TDataType& aDataType ) + { + TUid dummyUid( KNullUid ); + return iApaSession.AppForDocument( aFileName, dummyUid, aDataType ); + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::Panic +// +// ----------------------------------------------------------------------------- +// +void CMFPreviewHandlerBase::Panic( TInt aReason ) + { + _LIT( KPanicCategory, "CMFPreviewHandlerBase" ); + + User::Panic( KPanicCategory, aReason ); + } + + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::DoResetInactivityTimer() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CMFPreviewHandlerBase::DoResetInactivityTimer( TAny* /*aObject*/ ) + { + User::ResetInactivityTime(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMFPreviewHandlerBase::DisableBackLight() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CMFPreviewHandlerBase::DisableBackLight() + { + const TInt KResetInactivityTimerDelay = 2000000; + iBacklightTimer->Cancel(); // Just in case + // Disable backlight turn off during video preview + iBacklightTimer->Start( KResetInactivityTimerDelay, + KResetInactivityTimerDelay, + TCallBack( DoResetInactivityTimer, NULL ) ); + + } + + +/****************************************************************************** + * class CMFVideoPreviewHandler + ******************************************************************************/ + + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::NewL +// +// ----------------------------------------------------------------------------- +CMFVideoPreviewHandler* CMFVideoPreviewHandler::NewL() + { + CMFVideoPreviewHandler* self = new (ELeave) CMFVideoPreviewHandler(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::CMFVideoPreviewHandler +// +// ----------------------------------------------------------------------------- +// +CMFVideoPreviewHandler::CMFVideoPreviewHandler() + { + iPlayerStatus = EPlayerNotCreated; + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CMFVideoPreviewHandler::ConstructL() + { + CMFPreviewHandlerBase::ConstructL(); + } + + +// ---------------------------------------------------------------------------- +// Destructor +// +// ---------------------------------------------------------------------------- +// +CMFVideoPreviewHandler::~CMFVideoPreviewHandler() + { + Cancel(); + + if( iVolumeRampTimer ) + { + delete iVolumeRampTimer; + } + + if( iVideoPlayer ) + { + delete iVideoPlayer; + } + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::IsPlaying +// +// ----------------------------------------------------------------------------- +TBool CMFVideoPreviewHandler::IsPlaying() + { + if ( iPlayerStatus == EPlayerNotCreated ) + { + return EFalse; + } + + return ETrue; + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::SetDisplayWindowL +// +// ----------------------------------------------------------------------------- +void CMFVideoPreviewHandler::SetDisplayWindowL() + { + if ( !iVideoPlayer ) + { + return; + } + + if ( !iWindow ) + { + return; // no screen for showing video + } + + // Screen and clip rectangles to window dimensions + TPoint wndPosition( iWindow->AbsPosition() ); + TSize wndSize( iWindow->Size() ); + + TRect wndRect( wndPosition, wndSize ); + + iVideoPlayer->SetDisplayWindowL( CCoeEnv::Static()->WsSession(), + *(CCoeEnv::Static()->ScreenDevice()), + *iWindow, + wndRect, + wndRect ); + } + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::PlayL +// +// ----------------------------------------------------------------------------- +void CMFVideoPreviewHandler::PlayL() + { + Cancel(); // stop previous playing + + if ( !iFullName || iFullName->Des().Length() == 0 ) + { + User::Leave( KErrNotFound ); + } + + if ( !iWindow ) + { + return; // no screen for showing video + } + + TRAP_IGNORE( ReadActiveProfileL() ); + + // Screen and clip rectangles to window dimensions + TPoint wndPosition( iWindow->AbsPosition() ); + TSize wndSize( iWindow->Size() ); + + // iY and iHeight should be even numbers + if( wndPosition.iY % 2 ) + { + wndPosition.iY = wndPosition.iY + 1; + wndSize.iHeight = wndSize.iHeight - 1; + } + if( wndSize.iHeight % 2 ) + { + wndSize.iHeight = wndSize.iHeight - 1; + } + + TRect wndRect( wndPosition, wndSize ); + + + // check video file + TDataType dataType; + TInt err = GetDataType( iFullName->Des(), dataType ); + if ( err != KErrNone ) + { + User::Leave( err ); + } + + TInt vibra = Vibra(); + TMdaPriorityPreference pref = (TMdaPriorityPreference) KAudioPrefRingFilePreview; + if ( vibra ) + { + pref = (TMdaPriorityPreference) KAudioPrefRingFilePreviewVibra; + } + + delete iVideoPlayer; + iVideoPlayer = NULL; + + iVideoPlayer = CVideoPlayerUtility::NewL ( *this, KAudioPriorityPreview, pref, + CCoeEnv::Static()->WsSession(), + *(CCoeEnv::Static()->ScreenDevice()), + *iWindow, + wndRect, + wndRect ); + + iVideoPlayer->OpenFileL( iFullName->Des() ); + + iPlayerStatus = EPlayerInitializing; + + EnableScreenSaver( EFalse ); // do not allow screen saver while playing + DisableBackLight(); + +#ifdef _DEBUG + User::InfoPrint( iFullName->Des() ); + FLOG( _L("CMFVideoPreviewHandler::PlayL '%S'"), &iFullName->Des() ); +#endif + + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::Stop +// +// ----------------------------------------------------------------------------- +void CMFVideoPreviewHandler::Stop() + { + Cancel(); + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::Cancel +// +// ----------------------------------------------------------------------------- +// +void CMFVideoPreviewHandler::Cancel() + { + TBool isPlaying = EFalse; + + if( iVolumeRampTimer ) + { + iVolumeRampTimer->Cancel(); + } + + if( iVideoPlayer ) + { + isPlaying = ETrue; + + if ( iPlayerStatus == EPlayerPlaying ) + { + iVideoPlayer->Stop(); + } + iVideoPlayer->Close(); + + delete iVideoPlayer; + iVideoPlayer = NULL; + } + + if ( isPlaying ) + { + User::InfoPrint( _L("cancel video") ); + + EnableScreenSaver( ETrue ); + iBacklightTimer->Cancel(); + } + + iPlayerStatus = EPlayerNotCreated; + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::SetRingingType +// +// ----------------------------------------------------------------------------- +// +void CMFVideoPreviewHandler::SetRingingType( TInt aRingingType ) + { + const TInt KMinVolumeLevel = 1; + const TInt KAscendingVolumeRampInterval = 3000000; // 3 seconds + + if ( aRingingType == ERingingTypeAscending ) + { + if ( !iVolumeRampTimer ) + { + iVolumeRampTimer = CPeriodic::New( CActive::EPriorityStandard ); + } + + if ( iVolumeRampTimer && !iVolumeRampTimer->IsActive() ) + { + TCallBack cb( VolumeRampTimerCallback, this ); + iRampedVolume = KMinVolumeLevel; + iVolumeRampTimer->Start( KAscendingVolumeRampInterval, + KAscendingVolumeRampInterval, cb ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::ConvertVolume +// +// ----------------------------------------------------------------------------- +// +TInt CMFVideoPreviewHandler::ConvertVolume( TInt aVolume ) + { + if ( !iVideoPlayer ) + { + return 0; + } + + TInt result = 0; + TBool audioEnabled = EFalse; + + TRAP_IGNORE( audioEnabled = iVideoPlayer->AudioEnabledL() ); + + if ( audioEnabled ) + { + result = CMFPreviewHandlerBase::ConvertVolume( aVolume, iVideoPlayer->MaxVolume() ); + + // if user has selected silent ringing type or beeb once, set volume off + TInt ringingType = RingingType(); + if ( ringingType == ERingingTypeSilent || ringingType == ERingingTypeBeepOnce ) + { + result = 0; + } + } + + return result; + } + + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::VolumeRampTimerCallback +// +// ----------------------------------------------------------------------------- +// +TInt CMFVideoPreviewHandler::VolumeRampTimerCallback( TAny* aObj ) + { + return static_cast( aObj )->VolumeRamp(); + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::VolumeRamp +// +// ----------------------------------------------------------------------------- +// +TInt CMFVideoPreviewHandler::VolumeRamp() + { + const TInt KPhoneVideoVolumeRampStep = 1; + + TInt ringingVolume = RingingVolume(); + if ( iRampedVolume < ringingVolume ) + { + iRampedVolume = iRampedVolume + KPhoneVideoVolumeRampStep; + if ( iRampedVolume >= ringingVolume ) + { + // target volume level reached + iRampedVolume = ringingVolume; + iVolumeRampTimer->Cancel(); + } + } + + TRAP_IGNORE( iVideoPlayer->SetVolumeL( ConvertVolume( iRampedVolume ) ) ); + + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::MvpuoOpenComplete (from MVidePlayerUtilityObserver) +// +// ----------------------------------------------------------------------------- +// +void CMFVideoPreviewHandler::MvpuoOpenComplete( TInt aError ) + { + __ASSERT_DEBUG( iPlayerStatus == EPlayerInitializing, Panic( KErrGeneral ) ); + + if ( aError ) + { + Cancel(); + + if ( iObserver ) + { + TInt event = MPreviewHandlerObserver::EPreviewError; + TRAP_IGNORE( iObserver->HandlePreviewEventL( event, aError ) ); + } + } + else + { + iVideoPlayer->Prepare(); + } + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::MvpuoPrepareComplete (from MVidePlayerUtilityObserver) +// +// ----------------------------------------------------------------------------- +// +void CMFVideoPreviewHandler::MvpuoPrepareComplete( TInt aError ) + { + const TInt KMinVolumeLevel = 1; + + __ASSERT_DEBUG( iPlayerStatus == EPlayerInitializing, Panic( KErrGeneral ) ); + + if ( aError != KErrNone ) + { + Cancel(); + + if ( iObserver ) + { + TInt event = MPreviewHandlerObserver::EPreviewError; + TRAP_IGNORE( iObserver->HandlePreviewEventL( event, aError ) ); + } + return; + } + + iPlayerStatus = EPlayerInitialized; + + TInt ringingType = RingingType(); + TInt ringingVolume = RingingVolume(); + TInt vibra = Vibra(); + + + SetRingingType( ringingType ); + + TInt startVolume = KMinVolumeLevel; + if ( ringingType != ERingingTypeAscending ) + { + startVolume = ConvertVolume( ringingVolume ); + } + else + { + // Ascending starts from minimum volume level + startVolume = ConvertVolume( KMinVolumeLevel ); + } + TRAP_IGNORE( iVideoPlayer->SetVolumeL( startVolume ) ); + + TMdaPriorityPreference pref = (TMdaPriorityPreference) KAudioPrefRingFilePreview; + if ( vibra ) + { + pref = (TMdaPriorityPreference) KAudioPrefRingFilePreviewVibra; + } + + // Unfortunately SetPriorityL uses always priority/preference + // settings which are given in videoPlayer constructor and ONLY + // after that sets SetPriorityL parameter to its member data + // which leads to a situation that we need to make SetPriorityL + // call twice to make new settings effect. + TRAP_IGNORE( iVideoPlayer->SetPriorityL( KAudioPriorityPreview, pref ) ); + TRAP_IGNORE( iVideoPlayer->SetPriorityL( KAudioPriorityPreview, pref ) ); + + iVideoPlayer->Play(); + iPlayerStatus = EPlayerPlaying; + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::MvpuoPlayComplete (from MVidePlayerUtilityObserver) +// +// ----------------------------------------------------------------------------- +// +void CMFVideoPreviewHandler::MvpuoPlayComplete( TInt aError ) + { + __ASSERT_DEBUG( iPlayerStatus == EPlayerPlaying, Panic( KErrGeneral ) ); + + if ( aError != KErrNone ) + { + Cancel(); + + if ( iObserver ) + { + TInt event = MPreviewHandlerObserver::EVideoPreviewComplete; + TRAP_IGNORE( iObserver->HandlePreviewEventL( event, aError ) ); + } + return; + } + + TInt ringingType = RingingType(); + if( ringingType != ERingingTypeRingOnce ) + { + iVideoPlayer->Play(); + } + else + { + Cancel(); + if ( iObserver ) + { + TInt event = MPreviewHandlerObserver::EVideoPreviewComplete; + TRAP_IGNORE( iObserver->HandlePreviewEventL( event, aError ) ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::MvpuoFrameReady (from MVidePlayerUtilityObserver) +// +// ----------------------------------------------------------------------------- +// +void CMFVideoPreviewHandler::MvpuoFrameReady( CFbsBitmap& /*aFrame*/,TInt /*aError*/ ) + { + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::MvpuoEvent (from MVidePlayerUtilityObserver) +// +// ----------------------------------------------------------------------------- +// +void CMFVideoPreviewHandler::MvpuoEvent( const TMMFEvent& /*aEvent*/ ) + { + } + + +// ----------------------------------------------------------------------------- +// CMFVideoPreviewHandler::GetRectData +// +// ----------------------------------------------------------------------------- +void CMFVideoPreviewHandler::GetRectData( TRect aRect, TDes& aText ) + { + _LIT( KFormat, "top left (%d,%d) bottom right (%d,%d)" ); + + TPoint p1 = aRect.iTl; + TPoint p2 = aRect.iBr; + + aText.Format( KFormat, p1.iX, p1.iY, p2.iX, p2.iY ); + } + + + + +/****************************************************************************** + * class CMFAudioPreviewHandler + ******************************************************************************/ + + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::NewL +// +// ----------------------------------------------------------------------------- +CMFAudioPreviewHandler* CMFAudioPreviewHandler::NewL() + { + CMFAudioPreviewHandler* self = new (ELeave) CMFAudioPreviewHandler(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::CMFAudioPreviewHandler +// +// ----------------------------------------------------------------------------- +// +CMFAudioPreviewHandler::CMFAudioPreviewHandler() + { + iAudioPlayerStatus = EPlayerNotCreated; + iTonePlayerStatus = EPlayerNotCreated; + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::CMFAudioPreviewHandler +// +// ----------------------------------------------------------------------------- +// +void CMFAudioPreviewHandler::ConstructL() + { + CMFPreviewHandlerBase::ConstructL(); + } + + +// ---------------------------------------------------------------------------- +// Destructor +// +// ---------------------------------------------------------------------------- +// +CMFAudioPreviewHandler::~CMFAudioPreviewHandler() + { + Cancel(); + + delete iAudioPlayer; + delete iTonePlayer; + delete i3dRingingTonePlugin; + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::IsPlaying +// +// ----------------------------------------------------------------------------- +TBool CMFAudioPreviewHandler::IsPlaying() + { + if ( iAudioPlayerStatus != EPlayerNotCreated ) + { + return ETrue; + } + + if ( iTonePlayerStatus != EPlayerNotCreated ) + { + return ETrue; + } + + return EFalse; + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::PlayL +// +// ----------------------------------------------------------------------------- +void CMFAudioPreviewHandler::PlayL() + { + //sequence for playing a beep once sound + _LIT8( KFileListBeepSequence, "\x00\x11\x06\x0A\x08\x73\x0A\x40\x28\x0A\xF7\ + \x05\xFC\x40\x64\x0A\x08\x40\x32\x0A\xF7\x06\x0B" ); + + // rng mime type + _LIT( KFileListRngMimeType, "application/vnd.nokia.ringing-tone" ); + + Cancel(); // stop previous play + + if ( !iFullName || iFullName->Des().Length() == 0 ) + { + User::Leave( KErrNotFound ); + } + + TRAP_IGNORE( ReadActiveProfileL() ); + + TPtrC fileName( iFullName->Des() ); + TDataType dataType; + TInt err = GetDataType( fileName, dataType ); + if ( err == KErrNotFound ) + { + fileName.Set( iDefaultTone ); + if ( fileName.Length() == 0 ) + { + User::Leave( KErrNotFound ); + } + } + else if ( err != KErrNone ) + { + User::Leave( err ); + } + + TBool mimeTypeRng = EFalse; + + if ( err == KErrNone ) + { + if( dataType.Des().CompareF( KFileListRngMimeType ) == 0 ) + { + mimeTypeRng = ETrue; + } + } + + TInt ringingType = RingingType(); + if ( ringingType == ERingingTypeBeepOnce ) + { + // Active profile ringing tone is set to Beep Once + // Don't initialize a FileSequence but use DesSequence instead + iTonePlayer = CMdaAudioToneUtility::NewL( *this ); + iTonePlayer->PrepareToPlayDesSequence( KFileListBeepSequence() ); + iTonePlayerStatus = EPlayerInitializing; + } + else + { + if( mimeTypeRng ) + { + //Ringingtone is a RNG-file + iTonePlayer = CMdaAudioToneUtility::NewL( *this ); + iTonePlayer->PrepareToPlayFileSequence( fileName ); + iTonePlayerStatus = EPlayerInitializing; + } + else + { + delete iAudioPlayer; + iAudioPlayer = NULL; + + iAudioPlayer = CDrmPlayerUtility::NewFilePlayerL( + fileName, *this, KAudioPriorityRingingTonePreview, + ( TMdaPriorityPreference )KAudioPrefRingFilePreview ); + + iAudioPlayerStatus = EPlayerInitializing; + } + } + + EnableScreenSaver( EFalse ); + DisableBackLight(); + +#ifdef _DEBUG + User::InfoPrint( iFullName->Des() ); + FLOG( _L("CMFAudioPreviewHandler::PlayL '%S'"), &iFullName->Des() ); +#endif + + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::Stop +// +// ----------------------------------------------------------------------------- +void CMFAudioPreviewHandler::Stop() + { + Cancel(); + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::ConvertVolume +// +// ----------------------------------------------------------------------------- +// +TInt CMFAudioPreviewHandler::ConvertVolume( TInt aVolume ) + { + TInt result = 0; + if ( iAudioPlayer ) + { + result = CMFPreviewHandlerBase::ConvertVolume( aVolume, iAudioPlayer->MaxVolume() ); + } + else if ( iTonePlayer ) + { + result = CMFPreviewHandlerBase::ConvertVolume( aVolume, iTonePlayer->MaxVolume() ); + } + + //if user has selected silent ringing type, set volume off + TInt ringingType = RingingType(); + if( ringingType == ERingingTypeSilent ) + { + result = 0; + } + + return result; + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::SetToneRingingType +// +// ----------------------------------------------------------------------------- +// +void CMFAudioPreviewHandler::SetToneRingingType( TInt aRingingType ) + { + const TInt KToneInterval = 1000000; // 1 second pause between tones + const TInt KAscendingVolumeInterval = 3000000; // 3 seconds + + if ( !iTonePlayer ) + { + return; + } + + __ASSERT_DEBUG( iTonePlayerStatus == EPlayerInitialized, Panic( KErrGeneral ) ); + + + TInt ringingVolume = RingingVolume(); + + switch( aRingingType ) + { + case ERingingTypeRinging: + case ERingingTypeSilent: + { + iTonePlayer->SetRepeats( KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds( KToneInterval ) ); + break; + } + case ERingingTypeAscending: + { + iTonePlayer->SetRepeats( KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds( KToneInterval ) ); + + TInt volRamp = KAscendingVolumeInterval * ringingVolume; + iTonePlayer->SetVolumeRamp( TTimeIntervalMicroSeconds( volRamp ) ); + break; + } + case ERingingTypeRingOnce: + case ERingingTypeBeepOnce: + { + iTonePlayer->SetRepeats( 0, TTimeIntervalMicroSeconds( KToneInterval ) ); + break; + } + default: + { + break; + } + } + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::SetAudioRingingType +// +// ----------------------------------------------------------------------------- +// +void CMFAudioPreviewHandler::SetAudioRingingType( TInt aRingingType ) + { + const TInt KToneInterval = 1000000; // 1 second pause between tones + const TInt KAscendingVolumeInterval = 3000000; // 3 seconds + + if ( !iAudioPlayer ) + { + return; + } + + __ASSERT_DEBUG( iAudioPlayerStatus == EPlayerInitialized, Panic( KErrGeneral ) ); + + + TInt ringingVolume = RingingVolume(); + + switch( aRingingType ) + { + case ERingingTypeRinging: + case ERingingTypeSilent: + { + iAudioPlayer->SetRepeats( KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds( KToneInterval ) ); + break; + } + case ERingingTypeAscending: + { + iAudioPlayer->SetRepeats( KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds( KToneInterval ) ); + TInt volRamp = KAscendingVolumeInterval * ringingVolume; + iAudioPlayer->SetVolumeRamp( TTimeIntervalMicroSeconds( volRamp ) ); + break; + } + case ERingingTypeRingOnce: + { + iAudioPlayer->SetRepeats( 0, TTimeIntervalMicroSeconds( KToneInterval ) ); + break; + } + + default: + { + break; + } + } + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::Cancel +// +// ----------------------------------------------------------------------------- +// +void CMFAudioPreviewHandler::Cancel() + { + TBool isPlaying = EFalse; + + if ( iAudioPlayer ) + { + isPlaying = ETrue; + if ( iAudioPlayerStatus == EPlayerPlayingWith3DEffect ) + { + i3dRingingTonePlugin->Stop(); + // plugin calls AudioPlayer->Stop() + iAudioPlayer->Close(); + } + if ( iAudioPlayerStatus == EPlayerPlaying ) + { + iAudioPlayer->Stop(); + iAudioPlayer->Close(); + } + + delete iAudioPlayer; + iAudioPlayer = NULL; + iAudioPlayerStatus = EPlayerNotCreated; + } + + if ( iTonePlayer ) + { + isPlaying = ETrue; + if ( iTonePlayerStatus == EPlayerPlaying ) + { + iTonePlayer->CancelPlay(); + } + + delete iTonePlayer; + iTonePlayer = NULL; + iTonePlayerStatus = EPlayerNotCreated; + } + + + if ( isPlaying ) + { + //User::InfoPrint(_L("cancel")); + EnableScreenSaver( ETrue ); + iBacklightTimer->Cancel(); + } + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::MatoPlayComplete (from MMdaAudioToneObserver) +// +// ----------------------------------------------------------------------------- +// +void CMFAudioPreviewHandler::MatoPlayComplete( TInt aError ) + { + if ( iObserver ) + { + TInt event = MPreviewHandlerObserver::EAudioPreviewComplete; + TRAP_IGNORE( iObserver->HandlePreviewEventL( event, aError ) ); + } + + Cancel(); + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::MatoPrepareComplete (from MMdaAudioToneObserver) +// +// ----------------------------------------------------------------------------- +// +void CMFAudioPreviewHandler::MatoPrepareComplete( TInt aError ) + { + __ASSERT_DEBUG( iTonePlayerStatus == EPlayerInitializing, Panic( KErrGeneral ) ); + + if ( aError != KErrNone ) + { + Cancel(); + + if ( iObserver ) + { + TInt event = MPreviewHandlerObserver::EPreviewError; + TRAP_IGNORE( iObserver->HandlePreviewEventL( event, aError ) ); + } + + return; + } + + TInt ringingVolume = RingingVolume(); + TInt ringingType = RingingType(); + TInt vibra = Vibra(); + + iTonePlayerStatus = EPlayerInitialized; + SetToneRingingType( ringingType ); + iTonePlayer->SetVolume( ConvertVolume( ringingVolume ) ); + + TMdaPriorityPreference pref = (TMdaPriorityPreference) KAudioPrefRingFilePreview; + if ( vibra ) + { + pref = (TMdaPriorityPreference) KAudioPrefRingFilePreviewVibra; + } + iTonePlayer->SetPriority( KAudioPriorityPreview, pref ); + + iTonePlayer->Play(); + iTonePlayerStatus = EPlayerPlaying; + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::MdapcInitComplete (from MDrmAudioPlayerCallback) +// +// ----------------------------------------------------------------------------- +// +void CMFAudioPreviewHandler::MdapcInitComplete( TInt aError, + const TTimeIntervalMicroSeconds& /* aDuration */ ) + { + __ASSERT_DEBUG( iAudioPlayer, Panic( KErrGeneral ) ); + + if ( aError != KErrNone ) + { + Cancel(); + + if ( iObserver ) + { + TInt event = MPreviewHandlerObserver::EPreviewError; + TRAP_IGNORE( iObserver->HandlePreviewEventL( event, aError ) ); + } + return; + } + + + TInt ringingVolume = RingingVolume(); + TInt ringingType = RingingType(); + TInt vibra = Vibra(); + TInt echo3D = Echo3D(); + TInt effect3D = Effect3D(); + + __ASSERT_DEBUG( ringingType != ERingingTypeBeepOnce, + TMFDialogUtil::Panic( KErrGeneral ) ); + + iAudioPlayerStatus = EPlayerInitialized; + SetAudioRingingType( ringingType ); + iAudioPlayer->SetVolume( ConvertVolume( ringingVolume ) ); + + TMdaPriorityPreference pref = (TMdaPriorityPreference) KAudioPrefRingFilePreview; + if ( vibra ) + { + pref = (TMdaPriorityPreference) KAudioPrefRingFilePreviewVibra; + } + iAudioPlayer->SetPriority( KAudioPriorityPreview, pref ); + + iAudioPlayerStatus = EPlayerPlaying; + + if ( effect3D == EProfile3DEffectOff ) + { + iAudioPlayer->Play(); // 3D not used + return; + } + + if ( !i3dRingingTonePlugin ) + { + TUid emptyUid = { 0 }; + TRAPD( err, i3dRingingTonePlugin = C3DRingingToneInterface::NewL( emptyUid ) ); + if ( err != KErrNone || !i3dRingingTonePlugin ) + { + iAudioPlayer->Play(); + return; + } + } + + i3dRingingTonePlugin->SetAttr( E3DRTIAttr3DEffect, effect3D ); + i3dRingingTonePlugin->SetAttr( E3DRTIAttr3DEcho, echo3D ); + i3dRingingTonePlugin->SetAttr( E3DRTIAttrDrmPlayerUtility, iAudioPlayer ); + TRAP_IGNORE( i3dRingingTonePlugin->PlayL() ); + + iAudioPlayerStatus = EPlayerPlayingWith3DEffect; + } + + +// ----------------------------------------------------------------------------- +// CMFAudioPreviewHandler::MdapcPlayComplete (from MDrmAudioPlayerCallback) +// +// ----------------------------------------------------------------------------- +// +void CMFAudioPreviewHandler::MdapcPlayComplete( TInt aError ) + { + if ( iObserver ) + { + TInt event = MPreviewHandlerObserver::EAudioPreviewComplete; + TRAP_IGNORE( iObserver->HandlePreviewEventL( event, aError ) ); + } + + Cancel(); + } + + + +// End of File