--- a/camerauis/cameraapp/generic/src/CamAppController.cpp Thu Aug 19 09:36:57 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11672 +0,0 @@
-/*
-* Copyright (c) 2007-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: Class for managing intercommunication between Camera UI*
-*/
-
-
-
-// ===========================================================================
-// INCLUDE FILES
-
-#include <bldvariant.hrh> // for feature definitions
-
-#include <e32property.h>
-#include <apparc.h>
-#include <fbs.h>
-#include <eikenv.h>
-
-#include <hal.h>
-#include <hal_data.h>
-#include <pathinfo.h>
-#include <barsread.h>
-#include <AknUtils.h>
-#include <akntoolbar.h>
-#include <akntoolbarextension.h>
-#include <centralrepository.h>
-
-#include <ctsydomainpskeys.h>
-#include <ProfileEngineSDKCRKeys.h>
-#include <sysutildomaincrkeys.h>
-#include <ScreensaverInternalPSKeys.h>
-#include <musresourceproperties.h>
-#include <cameraplatpskeys.h>
-#include <bitmaptransforms.h>
-#include <sensrvorientationsensor.h>
-#include <sensrvchannel.h>
-#include <sensrvchannelfinder.h>
-
-#include <UsbWatcherInternalPSKeys.h>
-#include <usbpersonalityids.h>
-
-#include <UikonInternalPSKeys.h>
-
-#include <cameraapp.rsg>
-#include <vgacamsettings.rsg>
-#include "CamSettingsInternal.hrh"
-#include "CamProductSpecificSettings.hrh"
-#include "CameraappPrivateCRKeys.h"
-#include "CamAppController.h"
-#include "CamUtility.h"
-#include "CamLogger.h"
-#include "CamSettings.hrh"
-#include "CamSettingsModel.h"
-#include "CamPanic.h"
-#include "CamBurstCaptureArray.h"
-#include "CamTimer.h"
-#include "CamImageSaveActive.h"
-#include "CamAppUi.h"
-#include "CamObserverHandler.h"
-#include "CamSelfTimer.h"
-#include "camflashstatus.h"
-
-#include "CamPerformance.h"
-#include "OstTraceDefinitions.h"
-#ifdef OST_TRACE_COMPILER_IN_USE
-#include "CamAppControllerTraces.h"
-#endif
-
-#include "CamVideoQualityLevel.h"
-#include "CamCallStateAo.h"
-#include "CamPropertyWatcher.h"
-#include <avkondomainpskeys.h>
-#include <ProfileEngineInternalPSKeys.h>
-#include <ProfileEnginePrivatePSKeys.h>
-
-#ifndef __WINSCW__
- #include "rlocationtrail.h"
- #include "locationtrailpskeys.h"
-#endif
-//#include "camconstantsettingprovider.h"
-#include "camsettingprovider.h"
-#include "camsettingconversion.h"
-#include "camcamerarequests.h"
-#include "camcameraevents.h"
-#include "camcameracontrollertypes.h"
-#include "camcameracontroller.h"
-#include "cambuffershare.h"
-#include "cambuffersharecleanup.h"
-#include "camaudioplayercontroller.h"
-#include "camuidconstants.h"
-#include "camconfiguration.h"
-#include "CamPreCaptureViewBase.h"
-#include "CamPostCaptureViewBase.h"
-
-#include <cfclient.h>
-#include <cfcontextobject.h>
-#include <cfcontextquery.h>
-
-#include "camvideotime.h"
-#include "CamGSInterface.h"
-#include "CameraUiConfigManager.h"
-#include "camsnapshotrotator.h"
-#include "CamVideoPreCaptureView.h"
-
-#include <bitmaptransforms.h>
-
-#ifdef _DEBUG
-#ifdef _AO_TRACKING
-struct CFakeActiveScheduler : public CActiveScheduler {
- virtual TInt Extension_( TUint, TAny *&, TAny* ) { return 0; }
-};
-#endif // _AO_TRACKING
-#endif // _DEBUG
-
-// ===========================================================================
-// Local constants
-
-// Sequence mode related constants that define the amount of pictures taken
-// with sequence mode.
-const TInt KShortBurstCount = 18; // number of images captured during burst
-const TInt KMinBurstCount = 2; // minimum of images captured
-const TInt KBurstEstimate = 10; // Correction of underestimated file size
-
-const TUint32 KCamLatestFilePath = 0x00000001;
-
-
-// temporary constants until image naming is implemented
-_LIT( KImageExtension, ".jpg" );
-_LIT( KVideo3GPExtension, ".3gp" );
-#ifndef __WINS__
-_LIT( KVideoMP4Extension, ".mp4" );
-#endif
-
-const TInt KMaxExtension = 4;
-//const TInt64 KBurstInterval = 0;
-
-const TInt KIdleTimeout = 1000000 * 60; // 60 seconds
-const TInt KDeepSleepTimeout = KIdleTimeout*2; // Measuring time is two minutes
-const TInt KVideoArrayUsers = 1;
-const TInt KImageArrayUsers = 2;
-
-const TInt KVideoNameRetryCount = 1; // Maximum number of video naming retries
-
-// UID for central repository file
-const TInt KCRCamShutterSound = 0x7; // key for shutter sound
-
-const TInt KMicroSecsInMilliSec = 1000;
-const TInt KSecondInMicSec = 1000000;
-#if defined(RD_MDS_2_5) && !defined(__WINSCW__)
-const TInt KLocTrailCloseRetryTime = 5 * KSecondInMicSec;
-#endif // defined(RD_MDS_2_5) && !defined(__WINSCW__)
-
-// Estimated time needed to complete autofocus
-const TInt KFocusingDurationSeconds = 2;
-
-const TInt KCCorFocused = 0x00000002;
-
-const TInt KCamMaxDateLen = 8;
-
-static const TInt KTimelapseArrayGranularity = 6;
-
-// Backlight / Inactivity timer related
-// Callback interval is set to 4s.
-// Smallest value that the user can select from Phone Settings is 5s.
-static const TInt KBacklighTimerPriority = CActive::EPriorityHigh;
-static const TInt KBacklighTimerInterval = 4*1000*1000;
-
-// Camera Controller events interest.
-// Want to receive all events.
-// Vf frames needed for correct zoom handling (should be left out otherwise).
-static const TUint KCamEventInterest = ( ECamCameraEventClassAll );
-
-static const TInt KLensCoverDelay = 500*1000;
-
-_LIT( KCamContextSource, "Application" );
-_LIT( KCamContextType, "Camera.Zoom" );
-_LIT( KCamContextValueEnable, "Enabled" );
-_LIT( KCamContextValueDisable, "Disabled" );
-_LIT_SECURITY_POLICY_PASS( KCamContextSecurity );
-
-static const TInt KCriticalMemoryLevel = 5*1000*1000;
-// ===========================================================================
-// Local namespace
-namespace NCamAppController
- {
- // -------------------------------------------------------
- // Request sequences
-// static const TCamCameraRequestId KCamSequencePowerOffOn[] =
-// {
-// ECamRequestPowerOff,
-// ECamRequestPowerOn
-// };
-
- // -------------------------------------------------------
- // Local methods
-
- inline TInt ResetBitmap( CFbsBitmap*& aBitmap )
- {
- if( aBitmap )
- {
- aBitmap->Reset();
- return KErrNone;
- }
- else
- {
- TRAPD( create, aBitmap = new (ELeave) CFbsBitmap() );
- return create;
- }
- };
-
- inline void ClearSequenceBusyFlag( TAny* aBusyFlags )
- {
- TUint* flags = static_cast<TUint*>( aBusyFlags );
- if( flags )
- {
- *flags &= ~EBusySequence;
- }
- };
-
- inline void ClearRequestBusyFlag( TAny* aBusyFlags )
- {
- TUint* flags = static_cast<TUint*>( aBusyFlags );
- if( flags )
- {
- *flags &= ~EBusyRequest;
- }
- };
- }
-
-#include "camflagutility.inl"
-#include "campointerutility.inl"
-
-using namespace NCamAppController;
-using namespace NCamCameraController;
-// ===========================================================================
-
-
-// ===========================================================================
-// Member functions
-
-// ---------------------------------------------------------------------------
-// CCamAppController::NewL
-// Two-phased constructor.
-// ---------------------------------------------------------------------------
-//
-CCamAppController* CCamAppController::NewL()
- {
- CCamAppController* self = new( ELeave ) CCamAppController();
- CleanupStack::PushL( self );
- self->ConstructL();
- CleanupStack::Pop( self );
- return self;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CompleteConstructionL
-// The camera engine cannot be instantiated until the application orientation has
-// been set by the CCamAppUi. This does not exist when the CCamAppController is
-// constructed. CompleteConstructionL must be called in CCamAppUi::ConstructL()
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::CompleteConstructionL()
- {
- PRINT( _L("Camera => CCamAppController::CompleteConstructionL" ))
-
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
-
- // Memory critical levels reading moved to the point when
- // those values are actually needed for the first time.
-
- TInt index = 0;
- iInfo.iActiveCamera = ECamActiveCameraPrimary;
- PRINT1( _L("Camera <> Cameras available: %d"), CamerasAvailable() )
-
- PRINT( _L("Camera <> Store primary camera settings"))
- iSettingsModel->StorePrimaryCameraSettingsL();
-
-
- PRINT1( _L("Camera <> CCamAppController::CompleteConstructionL iSlideState initial value = %d" ), iSlideState)
- if ( iConfigManager->IsLensCoverSupported() )
- {
- // Request notification of slide state changes
- iSlideStateWatcher->Subscribe();
-
- // Read the current slider status - use the front camera (if there is one) as default if
- // there are any errors.
- TInt slideErr = iSlideStateWatcher->Get( iSlideState );
- PRINT1( _L("Camera <> CCamAppController::CompleteConstructionL setting iSlideState to %d" ), iSlideState)
- TInt requiredOrientation;
- if ( ( appUi->CamOrientation() == ECamOrientationCamcorderLeft && iSlideState == CameraPlatPSKeys::EClosed ) ||
- ( appUi->CamOrientation() == ECamOrientationCamcorder && iSlideState == CameraPlatPSKeys::EClosed ) )
- {
- if ( appUi->IsQwerty2ndCamera() )
- {
- PRINT( _L("Camera <> Do not exit. Reload landscape 2nd camera settings") )
- index = 1;
- iInfo.iActiveCamera = ECamActiveCameraSecondary;
- CCamAppUi* appUi = static_cast<CCamAppUi*>(
- CEikonEnv::Static()->AppUi() );
- // We may have primary camera settings loaded
- LoadStaticSettingsL( appUi->IsEmbedded() );
- CamUtility::GetPsiInt( ECamPsiSecondaryCameraOrientation,
- requiredOrientation );
- }
- else
- {
- PRINT( _L("Camera <> Lens cover has been closed during camera construction. Exit camera.") )
- appUi->HandleCommandL( EEikCmdExit);
- }
- }
- else
- {
- // if the slide is closed or there is an error, then use the front camera
- // check that there is more than 1 camera and that the current orientation is correct
- if ( ( iSlideState == CameraPlatPSKeys::EClosed
- || slideErr != KErrNone )
- && CamerasAvailable() > 1 )
- {
- PRINT( _L("Camera <> CCamAppController::CompleteConstructionL slider is not open" ))
- index = 1;
- iInfo.iActiveCamera = ECamActiveCameraSecondary;
- CamUtility::GetPsiInt( ECamPsiSecondaryCameraOrientation, requiredOrientation );
- }
- else // slide is open or using primary camera as default
- {
- PRINT( _L("Camera <> CCamAppController::CompleteConstructionL slider is open- primary camera in use" ))
- index = 0;
- iInfo.iActiveCamera = ECamActiveCameraPrimary;
-
- //when active camera is primary camera,orientation must be landscape,
- //so need to fix orientation
- if ( ECamOrientationPortrait == appUi->CamOrientation() )
- {
- TInt primaryOrientation;
- CamUtility::GetPsiInt( ECamPsiPrimaryCameraOrientation,
- primaryOrientation );
- appUi->SetOrientationL( ( CAknAppUiBase::TAppUiOrientation ) primaryOrientation );
- appUi->SetCamOrientationToLandscape();
- }
- }
- }
- }
-
- ConstructCameraControllerL( index );
-
- // Send startup sequence ?
-
- /**
- * Removed all custom interfaces requested from engine
- */
- iAccSensorListening = EFalse;
-
- iCallStateAo = CCamCallStateAo::NewL( this );
-
- // Use backlight timer instead of every Nth vf frame event
- // to reset inactivity timer. This is to avoid adding load
- // when higher VF frame rates are used (and overall load is
- // already higher).
- iBacklightTimer = CPeriodic::NewL( KBacklighTimerPriority );
-
-#ifdef _DEBUG
-#ifdef _AO_TRACKING
- TAny *iAoBacklightTimer = (TAny *)iBacklightTimer;
- PRINT2( _L("Camera <> CCamAppController: BacklightTimer=%x, %d"),iBacklightTimer, iAoBacklightTimer );
- CActiveScheduler *pAS = CActiveScheduler::Current();
- CFakeActiveScheduler *pFAS = static_cast<CFakeActiveScheduler*>(pAS);
- pFAS->Extension_( 0, iAoBacklightTimer, (TAny *)("iBacklightTimer") );
-#endif // _AO_TRACKING
-#endif // _DEBUG
-
-#ifdef _DEBUG
-#ifdef _AO_TRACKING
- TAny *iAoDeepSleepTimer = (TAny *)iDeepSleepTimer;
- PRINT2( _L("Camera <> CCamAppController: DeepSleepTimer=%x, %d"),iDeepSleepTimer, iAoDeepSleepTimer );
- CActiveScheduler *pAS2 = CActiveScheduler::Current();
- CFakeActiveScheduler *pFAS2 = static_cast<CFakeActiveScheduler*>(pAS2);
- pFAS2->Extension_( 0, iAoDeepSleepTimer, (TAny *)("iDeepSleepTimer") );
-#endif // _AO_TRACKING
-#endif // _DEBUG
-
-
- if ( UiConfigManagerPtr()->IsXenonFlashSupported() )
- {
- PRINT( _L("Camera <> CCamAppController: Create flash status observer..") );
- iFlashStatus = CCamFlashStatus::NewL( *this );
- }
-
- PRINT( _L("Camera <= CCamAppController::CompleteConstructionL" ))
- }
-
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::GetCriticalMemoryLevelL( const TCamMediaStorage& aStorage )
- {
- PRINT( _L("Camera => CCamAppController::GetCriticalMemoryLevelL" ) )
-
- // If this is the first call here, get the critical levels from
- // Central repository. Later the cached values will be used.
- if( KErrNotFound == iRamDiskCriticalLevel
- || KErrNotFound == iDiskCriticalLevel )
- {
- CRepository* repository = CRepository::NewLC( KCRUidDiskLevel );
- TInt err;
- err = repository->Get( KDiskCriticalThreshold , iDiskCriticalLevel );
- if ( KErrNone != err )
- {
- CamPanic( ECamPanicDefaultNotFoundInIniFile );
- }
- err = repository->Get( KRamDiskCriticalLevel , iRamDiskCriticalLevel );
- if ( KErrNone != err )
- {
- CamPanic( ECamPanicDefaultNotFoundInIniFile );
- }
- CleanupStack::PopAndDestroy( repository );
- }
-
- TInt level = ( aStorage == ECamMediaStoragePhone )
- ? iRamDiskCriticalLevel
- : iDiskCriticalLevel;
-
- PRINT1( _L("Camera <= CCamAppController::GetCriticalMemoryLevelL, level:%d" ), level )
- return level;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::~CCamAppController
-// Destructor
-// ---------------------------------------------------------------------------
-//
-CCamAppController::~CCamAppController()
- {
- PRINT( _L("Camera => ~CCamAppController") );
- // As a precaution, make sure the screen saver is never left in a disabled state
- EnableScreenSaver( ETrue );
-
- RProperty::Set( KPSUidCamcorderNotifier, KCCorFocused, 0 );
-
- if ( iFlashStatus )
- {
- delete iFlashStatus;
- }
-
- delete iSoundPlayer;
-
- PRINT( _L("Camera <> close observers array..") );
- __ASSERT_DEBUG( iControllerObservers.Count() == 0, CamPanic( ECamPanicResourceLeak ) );
- iControllerObservers.Close();
-
- delete iCallStateAo;
-
- delete iBurstTimer;
-
-// Using timer also on bitmap mode.
- if( iBacklightTimer )
- {
- iBacklightTimer->Cancel();
- delete iBacklightTimer;
- }
-
- if( iConfigManager && iConfigManager->IsOrientationSensorSupported() &&
- iAccSensorListening )
- {
- iAccSensorChannel->StopDataListening();
- iAccSensorChannel->CloseChannel();
- }
- delete iAccSensorChannel;
-
- if ( iSlideStateWatcher )
- {
- iSlideStateWatcher->Cancel();
- delete iSlideStateWatcher;
- }
-
- if ( iSliderCallBack )
- {
- iSliderCallBack->Cancel();
- delete iSliderCallBack;
- iSliderCallBack = NULL;
- }
-
- if ( iKeyLockStatusWatcher && iConfigManager && iConfigManager->IsKeyLockWatcherSupported() )
- {
- iKeyLockStatusWatcher->Cancel();
- delete iKeyLockStatusWatcher;
- }
-
- if ( iProfileStatusWatcher )
- {
- iProfileStatusWatcher->Cancel();
- delete iProfileStatusWatcher;
- }
-
- if ( iConfigManager && iConfigManager->IsPublishZoomStateSupported() )
- {
- TRAP_IGNORE ( PublishZoomStateL( EFalse ) );
- delete iContextFwClient;
- }
-
- if ( iConfigManager && iConfigManager->IsLocationSupported() )
- {
- if( iLocationTrailTimer )
- {
- iLocationTrailTimer->Cancel();
- delete iLocationTrailTimer;
- iLocationTrailTimer = NULL;
- }
- }
-
- if ( iConfigManager && iConfigManager->IsLocationSupported() )
- {
- // stop trail and close session
- StopLocationTrail( ETrue );
- }
-
- if ( iImageSaveActive )
- {
- iImageSaveActive->ForceCancel();
- delete iImageSaveActive;
- }
-
- PRINT( _L("Camera <> delete settingsmodel..") );
- delete iSettingsModel; // Must be before iEngine deleted
- iSettingsPreviewHandler = NULL; // Currently the Settings Model object.
- iPreviewRollbacks.Close();
-
-
- delete iCaptureArray;
- delete iRotationArray;
- if ( iSequenceFilenameArray )
- {
- iSequenceFilenameArray->Reset();
- delete iSequenceFilenameArray;
- }
-
- if( iDeepSleepTimer )
- {
- iDeepSleepTimer->Cancel();
- delete iDeepSleepTimer;
- }
-
- if( iIdleTimer )
- {
- iIdleTimer->Cancel();
- delete iIdleTimer;
- }
-
- if ( iTimeLapseTimer )
- {
- iTimeLapseTimer->Cancel();
- delete iTimeLapseTimer;
- }
-
- if( iCaptureToneDelayTimer )
- {
- iCaptureToneDelayTimer->Cancel();
- delete iCaptureToneDelayTimer;
- }
-
- delete iCaptureCompletionObserverHandler;
- delete iSnapShotCopy;
-
- iJpegDataSizes.Close();
- iSequencePostProcessDataSizes.Close();
-
- // Close the arrays
- iPendingObserversArray.Close();
- iCameraEventInterested.Close();
-
- // Controller handles releasing CCamera if needed.
- PRINT( _L("Camera <> delete camera controller..") );
- delete iCameraController;
- PRINT( _L("Camera <> delete setting provider..") );
- delete iSettingProvider;
- PRINT( _L("Camera <= ~CCamAppController") );
-
- PRINT( _L("Camera <> delete Configuration Manager..") );
- delete iConfiguration;
- iConfiguration = NULL;
-
- RProperty::Delete( KPSUidCamcorderNotifier, KCCorFocused );
- if( iPlugin )
- {
- // Destroy Ecom plugin
- iPlugin->DestroyPlugin();
- }
- iPlugin = NULL;
- delete iDriveChangeNotifier;
- iFs.Close();
-
- if( iRotatorAo )
- {
- delete iRotatorAo;
- }
-
- delete iSnapShotRotator;
-
- if( iTvAccessoryMonitor )
- {
- delete iTvAccessoryMonitor;
- iTvAccessoryMonitor = NULL;
- }
-
- PRINT( _L("Camera <= ~CCamAppController") );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SavedCurrentImage
-// Returns whether the last requested captured image has been saved or not.
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::SavedCurrentImage() const
- {
- PRINT( _L("Camera => CCamAppController::SavedCurrentImage") );
- TBool saved( ETrue );
-
- // If we are waiting for a save request then image has not been saved.
- if( iImageSaveRequestPending )
- {
- PRINT( _L("Camera <> CCamAppController::SavedCurrentImage: iImageSaveRequestPending") )
- saved = EFalse;
- }
- else if( CurrentFullFileName() == KNullDesC )
- {
- saved = EFalse;
- PRINT( _L("Camera <> CCamAppController::SavedCurrentImage: filename not yet reserved") )
- }
- else if( !iCaptureArray->AlreadySavedFile( CurrentFullFileName() ) ||
- iCaptureArray->CurrentlySavingFile( CurrentFullFileName() ) )
- {
- PRINT( _L("Camera <> CCamAppController::SavedCurrentImage: capture array not saved file or currently saving file") )
- saved = EFalse;
- }
- else if ( iInfo.iOperation == ECamCapturing || iInfo.iOperation == ECamCompleting )
- {
- PRINT(_L("Camera CCamAppController::SavedCurrentImage returning false, capturing/completing") )
- saved = EFalse;
- }
- else
- {
- // empty
- }
-
- PRINT1( _L("Camera <= CCamAppController::SavedCurrentImage, return %d"), saved );
- return saved;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RenameCurrentFileL
-// Rename image/video.
-// ---------------------------------------------------------------------------
-//
-TBool
-CCamAppController::RenameCurrentFileL( const TDesC& aNewName,
- const TCamCameraMode& /*aMode*/ )
- {
- TBool status = EFalse;
-
- // If file to rename has already been saved then remove from album,
- // rename the file and add the renamed file to the album.
- if ( BurstCaptureArray()->AlreadySavedFile( CurrentFullFileName() ) )
- {
- // Rename the file.
- TFileName filePath = CurrentFullFileName();
- CamUtility::RenameStillImageL( filePath, aNewName, filePath );
-
- // Update capture array with new name and path.
- BurstCaptureArray()->SetNameL( filePath, aNewName, iCurrentImageIndex );
-
- status = ETrue;
- }
- // Otherwise, if the file is not currently being saved, modify the names
- // in the capture array before it is saved.
- else if ( !BurstCaptureArray()->CurrentlySavingFile( CurrentFullFileName() ) )
- {
- // Update capture array with new name and path.
- // ...determine new path.
- TParsePtrC parse( CurrentFullFileName() );
- TFileName fullNewPath;
- fullNewPath = parse.DriveAndPath();
- fullNewPath.Append( aNewName );
- fullNewPath.Append( parse.Ext() );
-
- BurstCaptureArray()->SetNameL( fullNewPath, aNewName, iCurrentImageIndex );
-
- status = ETrue;
- }
- // Otherwise, the file is in the process of being saved, and
- // so that renaming must wait until completed.
- else
- {
- // Leave status to EFalse
- }
-
- return status;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::AddControllerObserverL
-// Add a controller observer.
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::AddControllerObserverL( const MCamControllerObserver* aObserver )
- {
- if( aObserver &&
- KErrNotFound == iControllerObservers.Find( aObserver ) )
- {
- User::LeaveIfError( iControllerObservers.Append( aObserver ) );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RemoveControllerObserver
-// Remove a controller observer.
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::RemoveControllerObserver( const MCamControllerObserver* aObserver )
- {
- // Errors ignored
- if( aObserver )
- {
- TInt index = iControllerObservers.Find( aObserver );
- if( KErrNotFound != index )
- {
- iControllerObservers.Remove( index );
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// AddCameraObserverL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController
-::AddCameraObserverL( const MCamCameraObserver* aObserver,
- const TUint& aEventInterest )
- {
- PRINT1( _L("Camera => CCamAppController::AddCameraObserverL aObserver=%d"), aObserver );
-
- // First check that observer is not in array already
- if( KErrNotFound == iPendingObserversArray.Find( aObserver ) )
- {
- PRINT(_L("Camera <> CCamAppController::AddCameraObserverL add Observer") );
-
- iPendingObserversArray.AppendL( aObserver );
- iCameraEventInterested.AppendL( aEventInterest );
- }
-
- if( iCameraController )
- {
- PRINT(_L("Camera <> CCamAppController::AddCameraObserverL camera controller available") );
- while ( iPendingObserversArray.Count() > 0 &&
- iCameraEventInterested.Count() > 0 )
- {
- const MCamCameraObserver* camEventObserver = iPendingObserversArray[0];
- TUint eventInterest = iCameraEventInterested[0];
- iCameraController->AttachObserverL( camEventObserver, eventInterest );
- iPendingObserversArray.Remove( 0 );
- iCameraEventInterested.Remove( 0 );
- }
- }
- PRINT(_L("Camera <= CCamAppController::AddCameraObserverL") );
- }
-
-// ---------------------------------------------------------------------------
-// RemoveCameraObserver
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController
-::RemoveCameraObserver( const MCamCameraObserver* aObserver )
- {
- if( iCameraController )
- iCameraController->DetachObserver( aObserver );
- }
-
-// ---------------------------------------------------------------------------
-// AddSettingsObserverL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController
-::AddSettingsObserverL( const MCamSettingsModelObserver* aObserver )
- {
- if( iSettingsModel )
- iSettingsModel->AttachObserverL( aObserver );
- else
- User::Leave( KErrNotReady );
- }
-
-// ---------------------------------------------------------------------------
-// RemoveCameraObserver
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController
-::RemoveSettingsObserver( const MCamSettingsModelObserver* aObserver )
- {
- if( iSettingsModel )
- iSettingsModel->DetachObserver( aObserver );
- }
-
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::ConstructCameraControllerL( TInt aCameraIndex )
- {
- OstTrace0( CAMERAAPP_PERFORMANCE_DETAIL, CCAMAPPCONTROLLER_CONSTRUCTCAMERACONTROLLERL, "e_CCamAppController_ConstructCameraControllerL 1" );
- PRINT( _L("Camera => CCamAppController::ConstructCameraControllerL") )
- PERF_EVENT_START_L2( EPerfEventCAEConstruction );
-
- if( !iCameraController )
- {
- iCameraController = CCamCameraController::NewL( *iSettingProvider, *this,
- aCameraIndex );
- //If uiorientationoverride feature is not supported, the camera switch has
- // to be finished here
- if( !( iConfigManager && iConfigManager->IsUIOrientationOverrideSupported() ) )
- {
- iCameraController->CompleteSwitchCameraL();
- }
- }
-
- // Attach as Camera Controller observer to get events
- PRINT1( _L("Camera <> Attaching as camera observer with interest:%032b"), KCamEventInterest );
- iCameraController->AttachObserverL( this, KCamEventInterest );
-
-
- PERF_EVENT_END_L2( EPerfEventCAEConstruction );
- PRINT( _L("Camera <= CCamAppController::ConstructCameraControllerL") )
- OstTrace0( CAMERAAPP_PERFORMANCE_DETAIL, DUP1_CCAMAPPCONTROLLER_CONSTRUCTCAMERACONTROLLERL, "e_CCamAppController_ConstructCameraControllerL 0" );
- }
-
-// #################################################################################################
-
-// ---------------------------------------------------------------------------
-// Returns the current camera controller state
-// (Bitfield of type TCamCameraStateFlags )
-// ---------------------------------------------------------------------------
-//
-TUint
-CCamAppController::CameraControllerState() const
- {
- TUint state( ECamIdle );
- if( iCameraController )
- {
- state = iCameraController->State();
- }
- PRINT1( _L("Camera =><= CCamAppController::CameraControllerState(): %032b"), state );
- return state;
- }
-
-// ---------------------------------------------------------------------------
-// Returns the current camera state
-// (TCamCameraState)
-// ---------------------------------------------------------------------------
-//
-TCamCameraState
-CCamAppController::CameraState() const
- {
- TCamCameraState state( ECamCameraIdle );
-
- TUint controllerState = CameraControllerState();
-
- // Convert controller state to TCamCameraState
- // Use the state represented by the "most significant"
- // bit in the bitfield. Ignore VF state.
- if( IsFlagOn( controllerState, ECamImageOn ) )
- {
- state = ECamCameraPreparedImage;
- }
- else if( IsFlagOn( controllerState, ECamVideoOn ) )
- {
- state = ECamCameraPreparedVideo;
- }
- else if( IsFlagOn( controllerState, ECamPowerOn ) )
- {
- state = ECamCameraPowerOn;
- }
- else if( IsFlagOn( controllerState, ECamReserved ) )
- {
- state = ECamCameraReserved;
- }
-
- PRINT1( _L("Camera =><= CCamAppController::CameraState(): %d"), state );
- return state;
- }
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TCamCameraMode
-CCamAppController::CurrentMode() const
- {
- PRINT1( _L("Camera <> CCamAppController::CurrentMode:%d"), iInfo.iMode );
- return iInfo.iMode;
- }
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TCamCameraMode
-CCamAppController::TargetMode() const
- {
- return iInfo.iTargetMode;
- }
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-// CCamAppController::CurrentCaptureModeSetup()
-TCamImageCaptureMode
-CCamAppController::CurrentImageModeSetup() const
- {
- TCamImageCaptureMode captureMode = ECamImageCaptureSingle;
- if( IsAppUiAvailable() )
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if ( appUi->IsBurstEnabled() )
- {
- captureMode = appUi->CurrentBurstMode();
- }
- }
- return captureMode;
- }
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TCamCaptureOperation
-CCamAppController::CurrentOperation() const
- {
- return iInfo.iOperation;
- }
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TCamCaptureOperation
-CCamAppController::CurrentImageOperation() const
- {
- if( ECamControllerImage == iInfo.iMode )
- return iInfo.iOperation;
- else
- return ECamNoOperation;
- }
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TCamCaptureOperation
-CCamAppController::CurrentVideoOperation() const
- {
- if( ECamControllerVideo == iInfo.iMode )
- return iInfo.iOperation;
- else
- return ECamNoOperation;
- }
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TCamImageCaptureMode CCamAppController::CurrentImageMode() const
- {
- return iInfo.iImageMode;
- }
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TCamCameraTriState CCamAppController::ViewfinderTargetState() const
- {
- return iInfo.iTargetVfState;
- }
-
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetMode( const TCamCameraMode& aNewMode )
- {
- PRINT3( _L("Camera => CCamAppController::SetMode old[%s] new[%s] target[%s]"),
- KCamModeNames[iInfo.iMode],
- KCamModeNames[aNewMode],
- KCamModeNames[iInfo.iTargetMode] );
-
- if( aNewMode != iInfo.iMode )
- {
- // In shutdown mode will not accept leaving ECamControllerShutdown state.
- TBool newModeNotAccepted = ( IsInShutdownMode()
- && ECamControllerShutdown == iInfo.iMode
- && ECamControllerShutdown != aNewMode );
- if( !newModeNotAccepted )
- {
- iInfo.iMode = aNewMode;
- NotifyControllerObservers( ECamEventEngineStateChanged );
- }
- else
- {
- PRINT( _L("Camera <> this mode change not acceptable in shutdown mode!") );
- }
- }
- PRINT( _L("Camera <= CCamAppController::SetMode") );
- }
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetTargetMode( const TCamCameraMode& aNewMode )
- {
- PRINT2( _L("Camera =><= CCamAppController::SetTargetMode [%s] -> [%s]"),
- KCamModeNames[iInfo.iTargetMode],
- KCamModeNames[aNewMode ] );
-
- iInfo.iTargetMode = aNewMode;
- }
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetImageMode( const TCamImageCaptureMode& aNewMode )
- {
- PRINT2( _L("Camera =><= CCamAppController::SetImageMode [%s] -> [%s]"),
- KCamImageModeNames[iInfo.iImageMode],
- KCamImageModeNames[aNewMode ] );
-
- iInfo.iImageMode = aNewMode;
- // Notify ??
- }
-
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetTargetImageMode( const TCamImageCaptureMode& aNewMode )
- {
- PRINT2( _L("Camera =><= CCamAppController::SetTargetImageMode [%s] -> [%s]"),
- KCamImageModeNames[iInfo.iTargetImageMode],
- KCamImageModeNames[aNewMode ] );
-
- iInfo.iTargetImageMode = aNewMode;
- }
-
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetOperation( TCamCaptureOperation aNewOperation,
- TInt aError /*= KErrNone*/ )
- {
- PRINT2( _L("Camera => CCamAppController::SetOperation: [%s] -> [%s]"),
- KCamCaptureOperationNames[iInfo.iOperation],
- KCamCaptureOperationNames[aNewOperation ] );
- PERF_OPERATION_STATE_CHANGE( aNewOperation );
-
- if( iInfo.iOperation != aNewOperation
- || aError != KErrNone )
- {
- iInfo.iOperation = aNewOperation;
- NotifyControllerObservers( ECamEventOperationStateChanged, aError );
- if( aNewOperation == ECamStandby )
- {
- ClearSequenceBusyFlag( &iBusyFlags );
- TCamControllerInfo& info = const_cast<TCamControllerInfo&>( iCameraController->ControllerInfo() );
- ClearFlags( info.iBusy , ECamBusySequence );
- }
- }
-
- PRINT( _L("Camera <= CCamAppController::SetOperation") );
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ImagesRemaining
-// Return the number of images that can still be saved
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::ImagesRemaining( TCamMediaStorage aStorage,
- TBool aBurstActive )
- {
- TCamPhotoSizeId size = static_cast<TCamPhotoSizeId>
- ( iSettingsModel->IntegerSettingValue( ECamSettingItemPhotoSize ) );
-
- return ImagesRemaining( aStorage, aBurstActive, size );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ImagesRemaining
-// Return the number of images that can still be saved
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::ImagesRemaining( TCamMediaStorage aStorage,
- TBool aBurstActive,
- TInt aQualityIndex )
- {
- TCamPhotoSizeId size = static_cast<TCamPhotoSizeId>
- ( iSettingsModel->PhotoResolution( aQualityIndex ) );
-
- return ImagesRemaining( aStorage, aBurstActive, size );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ImagesRemaining
-// Return the number of images that can still be saved
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::ImagesRemaining( TCamMediaStorage aStorage,
- TBool aBurstActive,
- TCamPhotoSizeId aSize )
- {
- PRINT( _L("Camera => CCamAppController::ImagesRemaining" ))
- if ( ECamMediaStorageCurrent == aStorage )
- {
- TCamMediaStorage store_unfiltered = static_cast<TCamMediaStorage>
- ( IntegerSettingValueUnfiltered( ECamSettingItemPhotoMediaStorage ) );
-
- // check to see if the MMC has been removed and we are waiting on a storage switch note
- // before we start returning the values for phone memory
- if( ECamMediaStorageCard == store_unfiltered
- && static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() )->IsMMCRemovedNotePending()
- )
- {
- PRINT( _L("Camera <= CCamAppController::ImagesRemaining mmc removed - returning 0" ))
- return 0;// UI Behaves as if MMC is still memory in use, thus we return zero images remaining as MMC is removed
- }
-
- // use current storage location
- aStorage = static_cast<TCamMediaStorage>
- ( IntegerSettingValue( ECamSettingItemPhotoMediaStorage ) );
- }
- else
- {
- // use specified location
- }
-
-
- TInt remaining = 0;
- TInt criticalLevel = 0;
-
- PRINT( _L("Camera <> Get critical memory level.." ))
- TRAPD( err, criticalLevel = GetCriticalMemoryLevelL( aStorage ) );
- if( !err )
- remaining = iConfiguration->ImagesRemaining( aStorage, aSize, criticalLevel, aBurstActive );
-
- // There is a factor in cenrep that defined a correction factor in percent.
- // This feature makes possible to define separate file size estimates in
- // burst capture mode. 100 = 100%, 50 = half of single capture size etc.
- if ( aBurstActive )
- {
- TInt corrFactor = iConfigManager->BurstFileSizeEstimateFactor();
- PRINT1( _L("Camera <> CCamAppController::ImagesRemaining, factor: %d"), corrFactor )
- remaining = TInt( remaining * corrFactor / 100 );
- }
-
- PRINT1( _L("Camera <= CCamAppController::ImagesRemaining, return:%d"), remaining )
- return remaining;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RecordTimeElapsed
-// Return the length of video that has been recorded
-// ---------------------------------------------------------------------------
-//
-TTimeIntervalMicroSeconds CCamAppController::RecordTimeElapsed() const
- {
- return iVideoTimeElapsed;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RecordTimeElapsed
-// Return the length of video that has been recorded
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::RecordTimeElapsed(TTimeIntervalMicroSeconds aElapsed )
- {
- iVideoTimeElapsed=aElapsed;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RecordTimeRemaining
-// Return the length of video that can still be saved
-// ---------------------------------------------------------------------------
-//
-TTimeIntervalMicroSeconds
-CCamAppController::RecordTimeRemaining()
- {
- PRINT( _L("Camera => CCamAppController::RecordTimeRemaining" ));
- TTimeIntervalMicroSeconds remain( 0 );
-
- // All the time we get this information from the CaeEngine which is thru camera controller.
-
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if( appUi->SettingsLaunchedFromCamera() || iDismountPending )
- {
- // In case settings plugin is being run or mmc dismount is pending
- // due to usb activation, we calculate the remaining time here,
- // instead of repreparing the engine and getting it from there
- TRAPD( err, iVideoTimeRemaining = CalculateVideoTimeRemainingL() );
- if( KErrNone != err )
- {
- iVideoTimeRemaining = 0;
- }
- }
- else
- {
- if( iInfo.iOperation == ECamCapturing ||
- iInfo.iOperation == ECamPausing ||
- iInfo.iOperation == ECamPaused ||
- iInfo.iOperation == ECamResuming ||
- iInfo.iOperation == ECamCompleting )
- {
- iVideoTimeRemaining = RemainingVideoRecordingTime();
- }
- else
- {
- PRINT( _L("Camera <> CCamAppController::RecordTimeRemaining - video mode not yet initialized" ));
- TRAPD( err, iVideoTimeRemaining = CalculateVideoTimeRemainingL() );
- if( KErrNone != err )
- {
- iVideoTimeRemaining = 0;
- }
- }
- }
- if ( ECamControllerVideo == CurrentMode() &&
- iInfo.iOperation == ECamNoOperation &&
- ECamMediaStorageCard == IntegerSettingValue( ECamSettingItemVideoMediaStorage ) &&
- appUi->IsMemoryFullOrUnavailable( ECamMediaStorageCard ) )
- {
- iVideoTimeRemaining = 0;
- }
-
- // if the storage location is MMC but the MMC is not accessible then
- // return 0 time remaining
- if ( appUi->IsMMCRemovedNotePending() )
- {
- // Return remaining time of zero, it will be reset when
- // a card is reinserted or storage location is changed
- PRINT( _L("Camera <> MMC note pending, return 0") );
- }
- else
- {
- // If the time we have is greater than the maximum allowed, return the
- // maximum
- TTimeIntervalMicroSeconds maxRecordingLength( static_cast<TInt64>(KMaxRecordingLength) );
-
- if ( iVideoTimeRemaining > maxRecordingLength )
- {
- remain = maxRecordingLength;
- }
- else
- {
- remain = iVideoTimeRemaining;
- }
- }
-
- PRINT1( _L("Camera <= CCamAppController::RecordTimeRemaining, %Ld" ), remain.Int64() );
- return remain;
- }
-
-// ---------------------------------------------------------------------------
-// SetNoBurstCancel
-//
-//Set iNoBurstCancel flag which is used to prevent stopping burst
-// when actual burst capture has started after focusing. Flag is
-// used in CancelFocusAndCapture method.
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetNoBurstCancel(TBool aValue )
- {
- PRINT1 ( _L("Camera =><= CCamAppController::SetNoBurstCancel, aValue=%d"),aValue );
- iNoBurstCancel=aValue;
- }
-
-
-// ---------------------------------------------------------------------------
-// SoftStopBurstL
-//
-// Stop burst as soon as possible given the following constrains:
-// - if quick burst is ongoing, it's continued to the end, unless
-// aFastStop is true. Then the minimum of 2 images is allowed.
-// For "immediate" stop, StopSequenceCapture should be used.
-// - if press and hold burst is ongoing, stop after next image.
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SoftStopBurstL( TBool aFastStop /*=EFalse*/ )
- {
- PRINT ( _L("Camera => CCamAppController::SoftStopBurstL") );
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
-
- // Still in short burst mode, if
- // a) no burst timer at all (long burst not supported)
- // b) burst timer still ticking
- // c) in self-timer initiated burst, which is always short burst.
- TBool shortBurst = ( !iBurstTimer
- || iBurstTimer->IsActive()
- || appUi->SelfTimerEnabled() );
-
- PRINT1( _L("Camera <> CCamAppController::SoftStopBurstL .. is short burst: %d"), shortBurst );
-
- StopBurstTimer();
-
- if( iSequenceCaptureInProgress )
- {
- PRINT ( _L("Camera <> CCamAppController::SoftStopBurstL .. burst ongoing") );
- if( aFastStop || !shortBurst )
- {
- // Camera controller takes care of setting "high enough" limit.
- // SetCaptureLimitL takes care of setting right count to
- // stop as early as possible.
- SetCaptureLimitL( 0 );
- }
- }
- else if( ECamFocusing != iInfo.iOperation &&
- !iAutoFocusRequested )
- {
- PRINT ( _L("Camera <> CCamAppController::SoftStopBurstL .. burst NOT ongoing, just cancel pending..") );
- iCaptureRequested = EFalse;
- }
- PRINT ( _L("Camera <= CCamAppController::SoftStopBurstL") );
- }
-
-// ---------------------------------------------------------------------------
-// StartBurstTimerL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::StartBurstTimerL()
- {
- PRINT ( _L("Camera => CCamAppController::StartBurstTimerL") );
- if( iBurstTimer )
- {
- StopBurstTimer();
- }
- else
- {
- TInt timeout( 0 );
- User::LeaveIfError( CamUtility::GetPsiInt( ECamPsiLongCaptureKeyPressInterval, timeout ) );
-
- PRINT1( _L("Camera <> CCamAppController::StartBurstTimerL .. Creating timer with timeout value of [%d ms]"), timeout );
-
- // Multiply timeout by 1000 to get microseconds
- TCallBack cb( CCamAppController::ShortBurstTimeout, this );
- iBurstTimer = CCamTimer::NewL( timeout*1000, cb );
- }
-
- PRINT ( _L("Camera <> CCamAppController::StartBurstTimerL .. Starting timer..") );
- iBurstTimer->StartTimer();
-
- PRINT ( _L("Camera <= CCamAppController::StartBurstTimerL") );
- }
-
-// ---------------------------------------------------------------------------
-// StopBurstTimer
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::StopBurstTimer()
- {
- PRINT( _L("Camera => CCamAppController::StopBurstTimer") );
- if( iBurstTimer )
- {
- iBurstTimer->Cancel();
- }
- PRINT( _L("Camera <= CCamAppController::StopBurstTimer") );
- }
-
-// ---------------------------------------------------------------------------
-// ShortBurstTimeout
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::ShortBurstTimeout( TAny* aController )
- {
- PRINT( _L("Camera => CCamAppController::ShortBurstTimeout") );
-
- CCamAppController* self = static_cast<CCamAppController*>( aController );
- TRAP_IGNORE( self->DoShortBurstTimeoutL() );
-
- PRINT( _L("Camera <= CCamAppController::ShortBurstTimeout") );
- return KErrNone; // no more callbacks
- }
-
-
-// ---------------------------------------------------------------------------
-// DoShortBurstTimeoutL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::DoShortBurstTimeoutL()
- {
- PRINT( _L("Camera => CCamAppController::DoShortBurstTimeoutL") );
- PRINT2( _L("Camera <> CCamAppController::DoShortBurstTimeoutL iInfo.iImageMode: %d, iSequenceCaptureInProgress: %d"), iInfo.iImageMode, iSequenceCaptureInProgress );
- if( ECamImageCaptureBurst == iInfo.iImageMode
- && iSequenceCaptureInProgress )
- {
- TInt longBurstLimit( 0 );
- CamUtility::GetPsiInt( ECamPsiMaxBurstCapture, longBurstLimit );
-
- PRINT1( _L("Camera <> CCamAppController::DoShortBurstTimeoutL .. product long burst limit: %d"), longBurstLimit );
-
- SetCaptureLimitL( longBurstLimit );
- }
-
- PRINT( _L("Camera <= CCamAppController::DoShortBurstTimeoutL") );
- }
-
-// ---------------------------------------------------------------------------
-// Actual capture limit value.
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::CaptureLimit() const
- {
- TInt limit( 1 );
-
- if( iCameraController && ECamImageCaptureBurst == iInfo.iImageMode )
- {
- limit = iCameraController->ControllerInfo().iCaptureLimit;
- }
-
- return limit;
- }
-
-// ---------------------------------------------------------------------------
-// CaptureLimitSetting
-//
-// Stored for Setting Provider to give to Camera Controller.
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::CaptureLimitSetting() const
- {
- TInt limit( 1 );
-
- if( ECamImageCaptureBurst == iInfo.iTargetImageMode )
- {
- limit = iRequestedCaptureCount;
- }
-
- return limit;
- }
-
-// ---------------------------------------------------------------------------
-// SetCaptureLimitL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetCaptureLimitL( TInt aLimit )
- {
- PRINT1( _L("Camera => CCamAppController::SetCaptureLimitL .. requested limit: %d"), aLimit );
-
- if( ECamImageCaptureBurst == iInfo.iTargetImageMode )
- {
- PRINT ( _L("Camera <> CCamAppController::SetCaptureLimitL .. burst mode active") );
- // We give the total amount of images during burst, not the remaining ones.
- // Need to subtract captures that have already been taken,
- // before comparing to the disk limit.
- if( iSequenceCaptureInProgress )
- {
- //TInt captured = iCameraController->ControllerInfo().iCaptureCount;
- TInt captured = iCameraController->ControllerInfo().iSnapshotCount;
- PRINT1( _L("Camera <> CCamAppController::SetCaptureLimitL .. captured already: %d"), captured );
-
- if( aLimit > captured )
- {
- PRINT ( _L("Camera <> CCamAppController::SetCaptureLimitL .. some more captures requested..") );
-
- // Check which is more restrictive - disk space or given limit.
- TInt diskLimit = ImagesRemaining( ECamMediaStorageCurrent, ETrue );
- TInt remaining = Min( aLimit - captured, diskLimit );
-
- PRINT1( _L("Camera <> CCamAppController::SetCaptureLimitL .. disk limit: %d"), diskLimit );
-
- iRequestedCaptureCount = Max( KMinBurstCount, captured + remaining );
- if ( diskLimit - KMinBurstCount < iRequestedCaptureCount )
- {
- // Estimated file size is not worst case estimate and long burst
- // sequence accumulates error, thus critical disk space limit may
- // be reached. Requested capture count is decreased here if needed.
- iRequestedCaptureCount -=
- (iRequestedCaptureCount+KMinBurstCount)/KBurstEstimate;
- PRINT( _L("Camera <> CCamAppController::SetCaptureLimitL .. Near to critical level, adjust iRequestedCaptureCount"));
- }
- }
- else
- {
- PRINT ( _L("Camera <> CCamAppController::SetCaptureLimitL .. capturing should be stopped as soon as possible..") );
- // Stop as fast as possible requested.
- // Still need to request minimum of 2.
- iRequestedCaptureCount = Max( KMinBurstCount, captured + 1 );
- }
- }
- // Not capturing - adjust freely
- else
- {
- TInt diskLimit = ImagesRemaining( ECamMediaStorageCurrent, ETrue );
- PRINT1( _L("Camera <> CCamAppController::SetCaptureLimitL .. disk limit: %d"), diskLimit );
-
- iRequestedCaptureCount = Max( KMinBurstCount, Min( aLimit, diskLimit ) );
- }
-
- PRINT1( _L("Camera <> CCamAppController::SetCaptureLimitL .. setting the request limit to: %d"), iRequestedCaptureCount );
-
- // In burst mode camera needs to be updated with the limit.
- iCameraController->DirectSettingsChangeL( ECameraSettingCaptureLimit );
- }
- else
- {
- PRINT ( _L("Camera <> CCamAppController::SetCaptureLimitL .. single / timelapse mode active") );
- TInt diskLimit = ImagesRemaining( ECamMediaStorageCurrent, EFalse );
- PRINT1( _L("Camera <> CCamAppController::SetCaptureLimitL .. disk limit: %d"), diskLimit );
-
- iRequestedCaptureCount = Min( aLimit, diskLimit );
-
- PRINT1( _L("Camera <> CCamAppController::SetCaptureLimitL .. setting the request limit to: %d"), iRequestedCaptureCount );
- }
- PRINT ( _L("Camera <= CCamAppController::SetCaptureLimitL") );
- }
-// ---------------------------------------------------------------------------
-// CCamAppController::SetTimeLapseInterval
-// Updates the interval used in next TimeLapse capture
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetTimeLapseInterval( TTimeIntervalMicroSeconds aInterval )
- {
- iTimeLapseInterval = aInterval;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::TimeLapseInterval
-// Returns the interval used in next TimeLapse capture
-// ---------------------------------------------------------------------------
-//
-TTimeIntervalMicroSeconds CCamAppController::TimeLapseInterval()
- {
- return iTimeLapseInterval;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::TimeLapseCountdown
-// Returns the remaining time lapse interval until the next capture
-// ---------------------------------------------------------------------------
-//
-TTimeIntervalMicroSeconds CCamAppController::TimeLapseCountdown()
- {
- TInt64 remainingTime( 0 ); // Assume uninitialised start time
-
- // If the start time is uninitialised then the first capture is about to be initiated
- if ( iTimeLapseStartTime == remainingTime )
- {
- return remainingTime;
- }
- // Otherwise, work out how much time is left before the next capture
- TTime now;
- now.HomeTime();
- TTimeIntervalMicroSeconds elapsedTime = now.MicroSecondsFrom( iTimeLapseStartTime );
- remainingTime = Max ( remainingTime, iTimeLapseInterval.Int64() - elapsedTime.Int64() );
- return remainingTime;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StartAutoFocus
-// Start the autofocus procedure
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::StartAutoFocus()
- {
- PRINT (_L("Camera => CCamAppController::StartAutoFocus"));
- PRINT1(_L("Camera <> CCamAppController::StartAutoFocus - CurrentOperation() = [%s]"), KCamCaptureOperationNames[iInfo.iOperation] );
- PRINT1(_L("Camera <> CCamAppController::StartAutoFocus - IsViewFinding() = [%d]"), IsViewFinding() );
-
- if( iConfigManager
- && iConfigManager->IsAutoFocusSupported()
- && IsViewFinding()
- && !iAFCancelInProgress
- && ECamNoOperation == iInfo.iOperation )
- {
-
- PRINT(_L("Camera <> Calling TryAutoFocus" ) );
- TryAutoFocus();
- }
- PRINT(_L("Camera <= CCamAppController::StartAutoFocus"));
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::Capture
-// Begin the capture procedure
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::Capture()
- {
- PRINT2( _L("Camera => CCamAppController::Capture(), operation[%s], iSaving:%d"),
- KCamCaptureOperationNames[iInfo.iOperation],
- iSaving );
-
- // If the camera orientation changed during capture and not in burst mode,
- // set the new orientation
- if ( iConfigManager && iConfigManager->IsOrientationSensorSupported()
- && iOrientationChangeOccured
- && iInfo.iImageMode != ECamImageCaptureBurst )
- {
- iOrientationChangeOccured = EFalse;
- TRAP_IGNORE( SetImageOrientationL() );
- }
- if( iConfigManager && iConfigManager->IsOrientationSensorSupported() && !iAccSensorListening )
- {
- // Delayed sensor initialization has not yet happened, but shutter key has been pressed.
- // Force initialization now, causing an addition to shutter lag - this is a very
- // rare case, as there should always be enough idle time to run the delayed
- // initialization.
- TRAP_IGNORE( UpdateSensorApiL( ETrue ) );
- }
-
- PERF_EVENT_END_L1( EPerfEventKeyToCapture );
-
- // Set to EFalse for burst
- iAllSnapshotsReceived = EFalse;
-
- if ( ECamFocusing == iInfo.iOperation ||
- iAFCancelInProgress ||
- iAutoFocusRequested || IsAfNeeded() )
- {
- PRINT( _L("Camera <> Focusing going on, cannot start capture - setting iCaptureRequested" ) );
- iCaptureRequested = ETrue;
- if( !IsAfNeeded() )
- {
- CancelAFNow();
- }
- }
- // -------------------------------------------------------
- //Quick pressed capture key after backing to precapture from postcapture in burst mode
- //Quick pressed capture key during cancelling autofocus(eg. backing to precapture from setting view )
- else if ( ECamNoOperation == iInfo.iOperation
- && ( ( ECamImageCaptureTimeLapse == iInfo.iImageMode )
- || ( ECamImageCaptureBurst == iInfo.iImageMode )
- || ( ECamImageCaptureSingle == iInfo.iImageMode ) )
- && iAFCancelInProgress )
- {
- PRINT(_L("Camera <> Cancelling auto focus going on, cannot start capture - setting iCaptureRequested"));
- // delay the start of capture until cancelling autofocus has finished
- iCaptureRequested = ETrue;
- }
- // -------------------------------------------------------
- // Quick pressed after capture, during image processing
- else if ( ECamCompleting == iInfo.iOperation
- && ECamImageCaptureSingle == iInfo.iImageMode )
- {
- PRINT(_L("Camera <> operation state is capture completing setting iCaptureRequested"));
- // delay the start of capture until current capture has finished
- iCaptureRequested = ETrue;
- }
- // -------------------------------------------------------
- // Ready for new shot
- else if( ECamNoOperation == iInfo.iOperation
- || ECamFocused == iInfo.iOperation
- || ECamFocusFailed == iInfo.iOperation )
- {
- PRINT(_L("Camera <> operation state is no operation"));
-
- // Update current capture mode
-// iInfo.iImageMode = CurrentImageModeSetup();
-
- if ( iConfigManager && iConfigManager->IsAutoFocusSupported() )
- {
- // If AF sound hasn't finished playing yet, stop it now
- // to make sure it does not block capture sound playing.
- iSoundPlayer->CancelPlaying( ECamAutoFocusComplete );
- }
-
-#ifdef CAMERAAPP_PERFORMANCE_MEASUREMENT
- if( ECamImageCaptureBurst != iInfo.iImageMode )
- {
- // Do not log the single image start events in burst mode, as the end
- // events would arrive for all images at once after all images have been taken
- PERF_EVENT_START_L1( EPerfEventShotToSnapshot );
- PERF_EVENT_START_L1( EPerfEventShotToStillImageReady );
- PERF_EVENT_START_L1( EPerfEventShotToSave );
- }
- else
- {
- PERF_EVENT_START_L1( EPerfEventSequenceCapture );
- }
-#endif // CAMERAAPP_PERFORMANCE_MEASUREMENT
-
- if( ECamImageCaptureTimeLapse == iInfo.iImageMode &&
- !iSequenceCaptureInProgress )
- {
- // First image of timelapse, reset capture count
- iTimeLapseCaptureCount = 0;
- }
-
- if( iInfo.iImageMode == ECamImageCaptureNone )
- {
- PRINT(_L("Camera <= CCamAppController::Capture() - request ignored"));
- return;
- }
-
- // iCaptureRequested is reset in DoCaptureL
- TBool capture = EFalse;
- TInt err = KErrNone;
- iFilenameReserved = EFalse;
- TRAP( err, capture = DoCaptureL() );
- if ( KErrNone != err )
- {
- // Sequence capture is not in progress as capture failed
- iSequenceCaptureInProgress = EFalse;
- }
-
- PRINT1( _L("Camera <> Tried to start capture, status:%d"), capture );
- }
- // -------------------------------------------------------
- // Not ready for a capture
- else
- {
- // request ignored
- }
- // -------------------------------------------------------
- PRINT(_L("Camera <= CCamAppController::Capture()"));
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StopSequenceCaptureL
-// Stop and complete the burst capture operation
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::StopSequenceCaptureL()
- {
- PRINT( _L("Camera => CCamAppController::StopSequenceCaptureL()") );
-
- iSequenceCaptureInProgress = EFalse;
- iNoBurstCancel = EFalse;
-
- // Re-enable screen saver
- EnableScreenSaver( ETrue );
-
- TCamImageCaptureMode captureModeSetup = CurrentImageModeSetup();
- // Test that this method was not called in single capture mode
- __ASSERT_DEBUG( captureModeSetup != ECamImageCaptureSingle, CamPanic( ECamPanicInvalidState ) );
-
- // If a burst sequence is currently active or has been requested
- if ( iInfo.iImageMode == ECamImageCaptureBurst
- || ( captureModeSetup == ECamImageCaptureBurst && iCaptureRequested ) )
- {
- IssueDirectRequestL( ECamRequestImageCancel );
- if ( iInfo.iOperation != ECamCapturing )
- {
- CompleteBurstOperation();
- }
-
- }
- // If a timelapse sequence is currently active or has been requested
- else if ( iInfo.iImageMode == ECamImageCaptureTimeLapse ||
- ( captureModeSetup == ECamImageCaptureTimeLapse &&
- iCaptureRequested ) )
- {
- if ( TimeLapseSupported() )
- {
- if ( iTimeLapseTimer )
- {
- iTimeLapseTimer->Cancel();
- delete iTimeLapseTimer;
- iTimeLapseTimer = NULL;
- }
-
- // The current state is in between captures the next one has now been cancelled
- // so just ensure that the view switch occurs
- // if ( iInfo.iOperation != ECamCapturing && !iCaptureRequested )
- if ( iInfo.iOperation != ECamCapturing )
- {
- CompleteTimeLapseOperation();
- }
- // Either the first capture is queued or a capture is still in stages of
- // completion. Any future capture has been cancelled so all that remains is to ensure the
- // completion code is run when the capture finally completes
- else
- {
- iCompleteTimeLapsePending = ETrue;
- }
- }
- }
- else // Otherwise there is no active or pending burst
- {
- // Do nothing
- }
-
- PRINT( _L("Camera <= CCamAppController::StopSequenceCaptureL()") );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CapturePending
-// Whether or not a capture is pending
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::CapturePending() const
- {
- // iOperation can be ECamFocusing but a
- // request to start still capture has been made and is waiting for the
- // focus operation to complete
- return iCaptureRequested;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::VideoRecordPending
-// Whether or not video recording is pending
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::VideoRecordPending() const
- {
- // iOperation can be ECamFocusing but a
- // request to start video has been made and is waiting for the
- // focus operation to complete
- return iVideoRequested;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SequenceCaptureInProgress
-// Whether or not sequence capture is active
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::SequenceCaptureInProgress() const
- {
- return iSequenceCaptureInProgress;
- }
-
-// -----------------------------------------------------------------------------
-// CCamAppController::StartVideoRecordingL
-// Begin the video recording procedure
-// -----------------------------------------------------------------------------
-//
-void CCamAppController::StartVideoRecordingL()
- {
- PRINT( _L("Camera => CCamAppController::StartVideoRecordingL") );
- __ASSERT_DEBUG( iCameraController, CamPanic( ECamPanicInvalidState ) );
- if ( ECamControllerVideo == iInfo.iMode )
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if ( IntegerSettingValue( ECamSettingItemStopRecordingInHdmiMode) &&
- IsHdmiCableConnected() )
- {
- appUi->HandleHdmiEventL( ECamHdmiCableConnectedBeforeRecording );
- return;
- }
- if ( !iVideoRequested
- && ECamNoOperation == iInfo.iOperation )
- {
- iVideoRequested = ETrue;
- if( !iSilentProfile || iShutterSndAlwaysOn )
- {
- // Load (and play) the start video sound
- PlaySound( ECamVideoStartSoundId , ETrue );
- }
-
- // initialise the array accessing values
- iArrayUsageCount = KVideoArrayUsers;
- iCurrentImageIndex = 0;
-
- if ( ECamMediaStorageCard ==
- IntegerSettingValue( ECamSettingItemVideoMediaStorage ) )
- {
- TRAPD( err, ReserveFileNamesL( iInfo.iMode, ECamImageCaptureNone ) );
- if ( err )
- {
- PRINT( _L("Camera <> invalid MMC") );
- NotifyControllerObservers( ECamEventInvalidMemoryCard );
-
- // If we have got here, we can't access MMC. Switch to phone memory
- TRAP_IGNORE( ForceUsePhoneMemoryL() ); //with multiple drive support,
- //this actually uses the internal mass memory
- // Ignore for now, let fail when recording.
- TRAP_IGNORE( ReserveFileNamesL( iInfo.iMode, ECamImageCaptureNone, ETrue ) );
- }
- }
- else
- {
- // Ignore for now, let fail when recording.
- TRAP_IGNORE( ReserveFileNamesL( iInfo.iMode, ECamImageCaptureNone ) );
- }
-
- if( iSilentProfile && !iShutterSndAlwaysOn )
- {
- PlaySoundComplete();
- }
- // Remember where are we recording
- iInitialVideoStorageLocation = static_cast<TCamMediaStorage>(
- IntegerSettingValue( ECamSettingItemVideoMediaStorage ) );
- }
- else
- {
- // Video already requested or other operation busy.
- // Request ignored.
- }
- }
- // Note: The code to actually START video recording has been moved
- // to the PlaySoundComplete function so as to only start when
- // sound playback has completed.
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StopVideoRecording
-// End the video recording procedure
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::StopVideoRecording()
- {
- PRINT( _L("Camera => CCamAppController::StopVideoRecording") );
- // if a video capture operation is pending
- if ( iVideoRequested )
- {
- iVideoRequested = EFalse;
- }
- // otherwise, if a video recording operation is in progress or is paused
- /* else */
- if ( ECamCapturing == CurrentVideoOperation()
- || ECamPaused == CurrentVideoOperation() )
- {
- // TRAPD( err, iAutoFocus->StopContinuousFocusL() );
- // iFocusLocked = EFalse;
- // Keep track of the fact we are now in "saving" state
- iSaving = ETrue;
- TRAP_IGNORE(
- {
- // IssueDirectRequestL( ECamRequestVfStop );
- StopViewFinder();
- IssueRequestL( ECamRequestVideoStop ); // Rest handled when event comes.
- });
-
- StartIdleTimer();
- }
- else
- {
- // otherwise there is no current recording operation
- }
- PRINT( _L("Camera <= CCamAppController::StopVideoRecording") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StopVideoRecordingAsync
-// End the video recording procedure asynchronously
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::StopVideoRecordingAsync()
- {
- PRINT( _L("Camera => CCamAppController::StopVideoRecordingAsync") );
-
- // Change CAE and MMF mode to async
- TRAP_IGNORE( IssueRequestL( ECamRequestSetAsyncVideoStopMode ) );
- StopVideoRecording(); // Call normal stop, mode is set to sync in call-backs
-
- PRINT( _L("Camera <= CCamAppController::StopVideoRecordingAsync") );
- }
-
-// ---------------------------------------------------------------------------
-// HandleVideoAsyncStopEvent
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::HandleVideoAsyncStopEvent( TInt aStatus )
- {
- PRINT1( _L( "Camera => CCamAppController::HandleVideoAsyncStopEvent, status:%d" ), aStatus );
- (void)aStatus; // remove compiler warning
-
- // We DO NOT play the stop sound when recording stopped due to
- // an incoming call. UI Spec 1.0, 4.4.1.
- if ( !iInCallOrRinging
- && !iVideoStoppedForPhoneApp )
- {
- PlaySound( ECamVideoStopSoundId, EFalse ); // No callback
- }
-
- // Recording completed, so we can re-enable key sounds
- iSoundPlayer->EnableAllKeySounds();
-
- PRINT( _L( "Camera <= CCamAppController::HandleVideoAsyncStopEvent" ) );
- }
-
-// ---------------------------------------------------------------------------
-// HandleVideoStopEvent
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::HandleVideoStopEvent( TInt aStatus )
- {
- PRINT1( _L( "Camera => CCamAppController::HandleVideoStopEvent, status:%d" ), aStatus );
-
- PERF_EVENT_END_L1( EPerfEventVideoStopToSave );
-
- if ( KErrDiskFull == aStatus
- || KErrCompletion == aStatus)
- {
- // if recording ends due to disk full condition or end of
- // specified recording period do not propogate the error
- aStatus = KErrNone;
- }
- // Play sound here if async mode is not supported
- // If it is then next playing is copyed to HandleVideoAsyncStopEvent
- if ( iCameraController && !iCameraController->AsyncVideoStopModeSupported() )
- {
- // We DO NOT play the stop sound when recording stopped due to
- // an incoming call. UI Spec 1.0, 4.4.1.
- if ( !iInCallOrRinging
- && !iVideoStoppedForPhoneApp )
- {
- PlaySound( ECamVideoStopSoundId, EFalse ); // No callback
- }
-
- // Recording completed, so we can re-enable key sounds
- iSoundPlayer->EnableAllKeySounds();
- }
- // Keep track of the fact we are now leaving saving state
- iSaving = EFalse;
-
- // try closing video record to free up resources
- // Test - <eo> commented out, no such direct request supported
- // TRAP_IGNORE( IssueDirectRequestL( ECamRequestVideoRelease ) );
-
- // if video post capture is off then force re-prepare so
- // that remaining record time is updated
- // REMOVED
-
- // if using direct viewfinding pause viewfinder
- // REMOVED
-
- // report to LifeBlog
- RProperty::Set( KPSUidCamcorderNotifier, KCamLatestFilePath, iSuggestedVideoPath );
- // Add to album if this is enabled for videos
- TUint32 defaultAlbumId = static_cast<TUint32>(
- IntegerSettingValue( ECamSettingItemDefaultAlbumId ));
- if ( iSettingsModel->IntegerSettingValue
- ( ECamSettingItemVideoStoreInAlbum ) == ECamSettYes )
- {
- iImageSaveActive->AddToAlbum( iSuggestedVideoPath, ETrue, defaultAlbumId );
- }
- else // Harvest the file but dont add to the default album
- {
- iImageSaveActive->AddToAlbum( iSuggestedVideoPath, EFalse, defaultAlbumId );
- }
-
- //create thumbnail
- if( iConfigManager && iConfigManager->IsThumbnailManagerAPISupported() )
- {
- TRAP_IGNORE( iImageSaveActive->CreateThumbnailsL( *BurstCaptureArray() ) );
- }
- NotifyControllerObservers( ECamEventRecordComplete, aStatus );
- SetOperation( ECamNoOperation );
- PRINT( _L( "Camera <> calling HandleCaptureCompletion.." ) )
- HandleCaptureCompletion();
- NotifyControllerObservers( ECamEventMediaFileChanged, aStatus );
- PRINT( _L( "Camera <= CCamAppController::HandleVideoStopEvent" ) );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetVideoStoppedForPhoneApp
-// Store the cause of the video stopping
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetVideoStoppedForPhoneApp( TBool aIsPhoneApp )
- {
- iVideoStoppedForPhoneApp = aIsPhoneApp;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::PauseVideoRecording
-// Pause the video recording procedure
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::PauseVideoRecording()
- {
- PRINT( _L("Camera => CCamAppController::PauseVideoRecording") );
- if( ECamCapturing == CurrentVideoOperation() )
- {
- TRAPD( error, IssueRequestL( ECamRequestVideoPause ) );
- if( KErrNone != error )
- {
- PRINT( _L("Camera <> PAUSING FAILED!!") );
- }
- else
- {
- // start video pause timeout
- StartIdleTimer();
- }
- }
- PRINT( _L("Camera <= CCamAppController::PauseVideoRecording") );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ContinueVideoRecording
-// Continue the video recording procedure
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::ContinueVideoRecording()
- {
- PRINT( _L("Camera => CCamAppController::ContinueVideoRecording") );
- if ( ECamPaused == CurrentVideoOperation() )
- {
- SetOperation( ECamResuming );
- // Restart video when sound played
- PlaySound( ECamVideoResumeSoundId, ETrue );
- }
- PRINT( _L("Camera <= CCamAppController::ContinueVideoRecording") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::TryAFRequest
-// issue AF request if there are no pending AF requests currently
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::TryAFRequest( TInt aAFRequest )
- {
- PRINT( _L( "Camera => TryAFRequest") );
- PRINT3( _L( "iPendingAFRequest=%d aAFRequest=%d ,iCurrentAFRequest=%d"), iPendingAFRequest,
- aAFRequest, iCurrentAFRequest );
- switch( aAFRequest )
- {
- case ECamRequestCancelAutofocus:
- case ECamRequestStartAutofocus:
- {
- if( iPendingAFRequest == 0 ||
- ( !iAFCancelInProgress &&
- iPendingAFRequest == ECamRequestCancelAutofocus &&
- iCurrentAFRequest == ECamRequestCancelAutofocus ) )
- {
- if ( !( UiConfigManagerPtr()->IsContinuosAutofocusSupported()&& ECamControllerVideo == CurrentMode() ) )
- {
- iPendingAFRequest=aAFRequest;
- TRAPD( err, IssueDirectRequestL( TCamCameraRequestId(aAFRequest) ) );
- //TRAPD( err, iCameraController->DirectRequestL( aAFRequest ) );
- if ( err != KErrNone )
- {
- // There is an error, we leave without focusing
- iPendingAFRequest=0;
- return EFalse; // Not doing any autofocus request.
- //This is only case where AFrequest cause EFalse to be returned.
- }
- }
- }
- else
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if ( appUi->AlwaysDrawPreCaptureCourtesyUI()
- && !CurrentSceneHasForcedFocus() )
- {
- appUi->SetActivePaletteVisibility( EFalse );
- }
- iPendingAFRequest=aAFRequest;
- }
- }
- break;
- default:
- {
- //Not type of autofocus request. Ignoring.
- }
- break;
- }
- PRINT( _L( "Camera <= TryAFRequest") );
- return ETrue;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CancelAFNow
-// Cancel AutoFocus
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::CancelAFNow()
- {
- PRINT( _L("Camera => CCamAppController::CancelAfNow()") );
-
- if( !iAFCancelInProgress && ECamFocusing == CurrentOperation() )
- {
- TRAPD( err, IssueDirectRequestL( ECamRequestCancelAutofocus ) );
- if( KErrNone == err )
- {
- iAFCancelInProgress = ETrue;
- iCurrentAFRequest = ECamRequestCancelAutofocus;
- iPendingAFRequest = ECamRequestCancelAutofocus;
- }
- }
- else
- {
- PRINT( _L("AF Cancel already in progress or not focusing") );
- }
-
- PRINT( _L("Camera <= CCamAppController::CancelAfNow()") );
- }
-// CCamAppController::CancelFocusAndCapture
-// Cancel the focus and capture procedures
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::CancelFocusAndCapture()
- {
- PRINT( _L( "Camera => CCamAppController::CancelFocusAndCapture") );
- PRINT1( _L("Camera <> CCamAppController::CancelFocusAndCapture - CurrentOperation() = [%s]"), KCamCaptureOperationNames[iInfo.iOperation] );
- PRINT1( _L("Camera <> CCamAppController::CancelFocusAndCapture - IsViewFinding() = [%d]"), IsViewFinding() );
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- // Only cancels autofocus if needed, burst capture is no longer
- // stopped if capture key pressed during burst
-
- if( !iNoBurstCancel
- && ECamNoOperation != CurrentOperation()
- && ECamCompleting != CurrentOperation() )
- {
- // If we are currently focused, cancel autofocus
- if ( IsViewFinding() && CurrentOperation() != ECamCapturing && // Cannot do AF operations if VF not on. AF is anyway cancelled on VF start event.
- iCurrentAFRequest != ECamRequestCancelAutofocus ) // Don't cancel twice
- {
- if( ECamFocusing == CurrentOperation() )
- {
- CancelAFNow();
- if ( IsTouchScreenSupported() )
- {
- CAknToolbar* fixedToolbar = appUi->CurrentFixedToolbar();
- if ( fixedToolbar )
- {
- fixedToolbar->SetToolbarVisibility( ETrue );
- }
- }
- }
- else
- {
- TryAFRequest( ECamRequestCancelAutofocus );
- }
- }
- iCaptureRequested = EFalse;
- }
- PRINT( _L( "Camera <= CCamAppController::CancelFocusAndCapture") );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SnapshotImage
-// Get post-exposure snapshot bitmap, if available.
-//
-// Returns: pointer to post-exposure snapshot bitmap. Does not transfer ownership.
-// May be NULL if no image available.
-//
-// ---------------------------------------------------------------------------
-//
-const CFbsBitmap*
-CCamAppController::SnapshotImage()
- {
- PRINT ( _L("Camera => CCamAppController::SnapshotImage") );
- PRINT1( _L("Camera <> CCamAppController::SnapshotImage .. current image index: %d"), iCurrentImageIndex );
- PRINT1( _L("Camera => CCamAppController::SnapshotImage .. saved current image: %d"), SavedCurrentImage() );
-
- PRINT1( _L("Camera <> CCamAppController::SnapshotImage - iSnapshotRedrawNeeded:%d"), iSnapshotRedrawNeeded );
- if ( iSnapShotRotator->IsActive() )
- {
- // Avoid flickering. Do not show original snapshot, if it needs to be rotated
- // Snapshot might need a separate draw if rotation takes long time
- iSnapshotRedrawNeeded = ETrue;
- PRINT( _L("Camera <= CCamAppController::SnapshotImage - return null") );
- return NULL;
- }
- iSnapshotRedrawNeeded = EFalse;
-
- //Sometime burst capture array includes more than one image in single capture mode,
- //so just display the latest image here.
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if ( BurstCaptureArray()->Count() > 1 && !appUi->IsBurstEnabled() )
- {
- TInt currentImageIndex = BurstCaptureArray()->Count() - 1;
- const CFbsBitmap* ss = BurstCaptureArray()->Snapshot( currentImageIndex );
- PRINT( _L("Camera <= CCamAppController::SnapshotImage") );
- return ss;
- }
-
- const CFbsBitmap* ss = BurstCaptureArray()->Snapshot( iCurrentImageIndex );
- PRINT( _L("Camera <= CCamAppController::SnapshotImage") );
- return ss;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetAsCurrentImage
-// Sets the specified index as the "current image", as will be used by the
-// post capture view
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetAsCurrentImage( TInt aIndex )
- {
- iCurrentImageIndex = aIndex;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CurrentImageName
-// Get the user-visible name for the current image
-// used in post-capture views.
-// ---------------------------------------------------------------------------
-//
-const TDesC&
-CCamAppController::CurrentImageName() const
- {
- return BurstCaptureArray()->ImageName( iCurrentImageIndex );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::BurstCaptureArray
-// Return a pointer to the array representing a burst capture
-// ---------------------------------------------------------------------------
-//
-CCamBurstCaptureArray*
-CCamAppController::BurstCaptureArray() const
- {
- return iCaptureArray;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CurrentItemCount
-// Return the count of non-deleted items in the burst array
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::CurrentItemCount()
- {
- if ( !BurstCaptureArray() )
- {
- return 0;
- }
- return BurstCaptureArray()->ImagesRemaining();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CurrentCapturedCount
-// Return the count of burst capture moments that have taken
-// place in a current burst
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::CurrentCapturedCount()
- {
- //return iActualBurstCount;
- TInt count( 0 );
- if( iCameraController )
- {
- // Using snapshot as count, because UI updates counter
- // on snapshot events.
- count = iCameraController->ControllerInfo().iSnapshotCount;
- }
- return count;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::TimeLapseImageCount
-// Return the count of items in the timelapse sequence array
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::TimeLapseImageCount()
- {
- return iTimeLapseCaptureCount;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ResetTimelapseArray
-// Resets the timelapse sequence array
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::ResetTimelapseArray()
- {
- iSequenceFilenameArray->Reset();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::PlaySound
-// Play a sound with given id.
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::PlaySound( TCamSoundId aSoundId, TBool aEnableCallback )
- {
- PRINT1( _L("Camera => CCamAppController::PlaySound %d"), aSoundId );
- if ( ToneShouldBeSilent( aSoundId ) &&
- !iShutterSndAlwaysOn &&
- iSilentProfile )
- {
- PRINT( _L("Camera <> Profile silent, do not play sound") );
- // Don't play shutter sound if we are following
- // current profile setting and profile is silent.
- // Notify the observer right away. E.g. video start
- // depends on the notification
- if( aEnableCallback )
- {
- PlayComplete( aSoundId, KErrNone );
- }
- /* OLD
- if ( aSoundId == ECamVideoStartSoundId ||
- aSoundId == ECamVideoPauseSoundId ||
- aSoundId == ECamVideoResumeSoundId )
- {
- // Force the callback to start recording without sound.
- PlaySoundComplete();
- }
- */
- }
- else
- {
- OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAPPCONTROLLER_PLAYSOUND, "e_CAM_APP_CAPTURE_SOUND_PLAY 1" ); //CCORAPP_CAPTURE_SOUND_PLAY_START
- iSoundPlayer->CancelAllPlaying();
- iSoundPlayer->PlaySound( aSoundId, aEnableCallback );
-
- }
-
- // If in timelapse mode the remaining time counter should be updated
- // as soon as the capture tone has played, but as there is no callback
- // this is the closest we can get
- if ( ECamImageCaptureTimeLapse == iInfo.iImageMode )
- {
- NotifyControllerObservers( ECamEventCounterUpdated );
- }
-
- PRINT( _L("Camera <= CCamAppController::PlaySound") );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::AllOptionsVisibleForSettingItem
-// Returns true if all the settings list options for a particular setting
-// item are visible.
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::AllOptionsVisibleForSettingItem( TInt aSettingItem,
- TInt& aRevisedResourceId )
- {
- if ( ( aSettingItem == ECamSettingItemVideoQuality ) &&
- ( iInfo.iActiveCamera == ECamActiveCameraSecondary ) )
- {
- aRevisedResourceId = ROID(R_CAM_FRONT_CAMERA_VIDEO_QUALITY_TEXT_ARRAY);
- return EFalse;
- }
- // Otherwise, all options are visible for the setting item
- return ETrue;
- }
-
-// ----------------------------------------------------
-// CCamAppController::SwitchCameraL
-// Switch the camera
-// ----------------------------------------------------
-//
-void CCamAppController::SwitchCameraL()
- {
- PRINT( _L("Camera => CCamAppController::SwitchCameraL") );
-
- TCamAppControllerInfo oldInfo = iInfo;
- TCamActiveCamera targetCamera = ECamActiveCameraNone;
- // If something goes wrong when changing from 2nd to 1st camera,
- // we need to make sure, that 2nd cam settings are not stored
- // to CR by accident.
- iInfo = TCamAppControllerInfo(); // reset
-
- // reset zoom waiting flag. this flag is only used with bitmap viewfinder
- // and it might cause problems if one camera uses bitmap viewfinder and the
- // other one uses direct viewfinder
- iZoomWaitingForCamera = EFalse;
-
- CancelPreviewChangesL();
-
- if( ECamActiveCameraPrimary == oldInfo.iActiveCamera )
- {
- // Currently using primary camera, switch to secondary
- PRINT( _L("Camera <> switch to 2nd cam") );
-
-#ifdef _DEBUG
- PRINT ( _L("Camera <> ======================================") );
- PRINT ( _L("Camera <> Photo quality index: ") );
- PRINT1( _L("Camera <> Before loading 2nd cam settings: %d "), IntegerSettingValue( ECamSettingItemPhotoQuality ) );
-#endif
-
- // Scene mode is forced to Automatic while secondary camera is in use.
- iSceneModeForcedBySecondaryCamera = ETrue;
-
- LoadSecondaryCameraSettingsL();
-
-#ifdef _DEBUG
- PRINT1( _L("Camera <> After loading 2nd cam settings: %d "), IntegerSettingValue( ECamSettingItemPhotoQuality ) );
- PRINT ( _L("Camera <> ======================================") );
-#endif
-
- targetCamera = ECamActiveCameraSecondary;
- }
- else
- {
- // Currently using secondary camera, switch to primary
- // or landscape secondary camera
- PRINT( _L("Camera <> switch to 1st camera or change 2nd camera mode") )
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if( appUi->IsEmbedded() )
- {
- LoadStaticSettingsL( appUi->IsEmbedded() );
- }
- else if ( CameraSwitchQueued() != ESwitchSecondaryOrientation )
- {
- iSettingsModel->RestorePrimaryCameraSettingsL();
- }
-
- if ( CameraSwitchQueued() != ESwitchSecondaryOrientation )
- {
- PRINT( _L("Camera <> switch to 1st cam") )
- targetCamera = ECamActiveCameraPrimary;
-
- // Primary camera will use its previously selected scene mode after camera switch.
- iSceneModeForcedBySecondaryCamera = EFalse;
- }
- else
- {
- PRINT( _L("Camera <> change 2nd camera mode") )
- targetCamera = ECamActiveCameraSecondary;
- }
- }
- SetCameraSwitchRequired( ESwitchDone );
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- iCameraController->SwitchCameraL( (ECamActiveCameraPrimary == targetCamera) ? 0 : 1 );
- if( UiConfigManagerPtr()->IsUIOrientationOverrideSupported() )
- {
- RArray<TInt> screenModeValues;
- UiConfigManagerPtr()->SupportedScreenModesL( screenModeValues );
- TInt landscapeScreenMode = screenModeValues[0];
- SetCameraOrientationModeL( landscapeScreenMode );
- }
- iCameraController->CompleteSwitchCameraL();
- // Force to get a sensor data after switch camera from primary to secondary
- // when always holding in camera with portrait mode.
- if( iConfigManager
- && iConfigManager->IsOrientationSensorSupported() )
- {
- if( iAccSensorListening )
- {
- iAccSensorListening = EFalse;
- }
- if( iAccSensorChannel )
- {
- delete iAccSensorChannel;
- iAccSensorChannel = NULL;
- }
- TRAP_IGNORE( UpdateSensorApiL( ETrue ) );
- }
-
- // Camera switched.
- // a) Set current camera index to the new one.
- // b) Set target mode (video/image) to the one before mode switch.
- // c) Image mode is single shot after camera switch
- // d) Ensure vf start
- iInfo.iActiveCamera = targetCamera; // a)
- iInfo.iTargetMode = appUi->TargetMode(); // b)
- iInfo.iTargetImageMode = ( ECamControllerVideo==iInfo.iTargetMode )
- ? ECamImageCaptureNone : ECamImageCaptureSingle; // c)
- iInfo.iTargetVfState = ECamTriActive; // d)
- if( oldInfo.iMode != ECamControllerShutdown )
- {
- IssueModeChangeSequenceL();
- }
-
- appUi->SetDrawPreCaptureCourtesyUI( ETrue );
-
- NotifyControllerObservers( ECamEventCameraChanged );
-
- PRINT( _L("Camera <= CCamAppController::SwitchCameraL") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ActiveCamera
-// Returns the active camera
-// ---------------------------------------------------------------------------
-//
-TCamActiveCamera
-CCamAppController::ActiveCamera() const
- {
- return iInfo.iActiveCamera;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CameraSwitchQueued
-// Returns whether a camera switch is pending
-// ---------------------------------------------------------------------------
-//
-TCameraSwitchRequired
-CCamAppController::CameraSwitchQueued() const
- {
- PRINT1( _L("Camera =><= CCamAppController::CameraSwitchQueued %d"), iCameraSwitchRequired )
- return iCameraSwitchRequired;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CheckExitStatus
-// Check whether exit is required
-// ---------------------------------------------------------------------------
-//
-TBool
-CCamAppController::CheckExitStatus()
- {
- PRINT( _L("Camera => CCamAppController::CheckExitStatus" ) )
- TBool exit = EFalse;
- if ( iEndKeyWaiting )
- {
- exit = ETrue;
- }
- else if ( iConfigManager && iConfigManager->IsLensCoverSupported() )
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
-
- if ( iSliderCloseEvent && !appUi->IsEmbedded() && !appUi->Embedding() )
- {
- PRINT( _L("Camera <> CCamAppController::CheckExitStatus - slider closed, not embedded/embedding" ) )
- exit = ETrue;
- }
- else
- {
- PRINT( _L("Camera <> CCamAppController::CheckExitStatus - embedded/embedding, not exiting" ) )
- exit = EFalse;
- }
- }
- else
- {
- exit = EFalse;
- }
-
- PRINT1( _L("Camera <= CCamAppController::CheckExitStatus - return %d" ), exit )
- return exit;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetEndKeyExitWaiting
-// Update whether exit is required
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetEndKeyExitWaiting( TBool aEndKeyWaiting )
- {
- iEndKeyWaiting = aEndKeyWaiting;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CameraSlideState
-// Returns the status of the camera slide
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::CameraSlideState() const
- {
- return iSlideState;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SliderCloseEventActioned
-// Update whether exit is required
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SliderCloseEventActioned()
- {
- iSliderCloseEvent = EFalse;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetCameraSwitchRequired
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetCameraSwitchRequired( TCameraSwitchRequired aSwitchRequired )
- {
- iCameraSwitchRequired = aSwitchRequired;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CheckSlideStatus
-// Check the slide state and schedule a camera switch if needed
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::CheckSlideStatus()
- {
- PRINT( _L("Camera => CCamAppController::CheckSlideStatus") );
- // if only 1 camera available then can't switch camera
- if ( CamerasAvailable() <= 1 )
- {
- PRINT( _L("Camera <> Only one camera, no action") );
- }
- else
- {
- RefreshSlideStatus();
- // if the slide is closed then schedule a camera switch
- // if the back camera is active
- if ( CameraSlideState() == CameraPlatPSKeys::EClosed ||
- CameraSlideState() == KErrNone )
- {
- if ( iInfo.iActiveCamera == ECamActiveCameraPrimary )
- {
- PRINT( _L("Camera <> slide closed or uninitialized -> switch to secondary") );
- iCameraSwitchRequired = ESwitchPrimaryToSecondary;
- }
- else
- {
- PRINT( _L("Camera <> no camera switch needed") );
- iCameraSwitchRequired = ESwitchDone;
- }
- }
- // if the slide is open then schedule a camera switch
- // if the front camera is active
- else if ( CameraSlideState() == CameraPlatPSKeys::EOpen )
- {
- if ( iInfo.iActiveCamera == ECamActiveCameraSecondary )
- {
- PRINT( _L("Camera <> slide open -> switch to primary") );
- iCameraSwitchRequired = ESwitchSecondaryToPrimary;
- }
- else
- {
- PRINT( _L("Camera <> no camera switch needed") );
- iCameraSwitchRequired = ESwitchDone;
- }
- }
- else
- {
- // do nothing
- PRINT( _L("Camera <> not recognized slider state -> no action") );
- }
- }
- PRINT( _L("Camera <= CCamAppController::CheckSlideStatus") );
- }
-
-
-// ----------------------------------------------------
-// CCamAppController::EvRange
-// Range of EV value supported by current product
-// ----------------------------------------------------
-//
-TCamEvCompRange CCamAppController::EvRange() const
- {
- PRINT( _L("Camera =><= CCamAppController::EvRange") );
- return iEvRange;
- }
-
-
-// ----------------------------------------------------
-// CCamAppController::CallStateChanged
-// Callback for when the current phone call state changes
-// ----------------------------------------------------
-//
-void
-CCamAppController::CallStateChanged( TPSCTsyCallState aState,
- TInt /* aError */ )
- {
- PRINT1( _L("Camera => CCamAppController::CallStateChanged aState: %d"), aState);
-
- TBool oldState = iInCallOrRinging;
-
- if ( aState == EPSCTsyCallStateAlerting ||
- aState == EPSCTsyCallStateRinging ||
- aState == EPSCTsyCallStateDialling ||
- aState == EPSCTsyCallStateAnswering ||
- aState == EPSCTsyCallStateDisconnecting ||
- aState == EPSCTsyCallStateConnected ||
- aState == EPSCTsyCallStateHold )
- {
- // If not already in a call/ringing state, and the new state
- // indicates this, stop recording
- if ( !iInCallOrRinging )
- {
- // Set the flag before handle call, as this may need to
- // know the call state for stopping video.
- iInCallOrRinging = ETrue;
- PRINT( _L("Camera <> CCamAppController::CallStateChanged: calling handleincomingcallL") );
- HandleIncomingCall();
- }
- }
- else
- {
- iInCallOrRinging = EFalse;
- }
- // If the state has changed from in a call to not, notify the
- // observers
- // Also notify again if the state has reached connected so that
- // the observer can reconsider its actions now that connection is complete
- if ( iInCallOrRinging != oldState ||
- EPSCTsyCallStateConnected == aState )
- {
- PRINT( _L("Camera <> CCamAppController::CallStateChanged: telling call observers") );
- NotifyControllerObservers( ECamEventCallStateChanged, KErrNone );
- }
-
- PRINT1( _L("Camera <= CCamAppController::CallStateChanged(%d, %d)"), aState );
- }
-
-
-
-
-
-
-// ---------------------------------------------------------------------------
-// ReleaseCamera
-//
-// Releases the camera hardware for other apps to use
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::ReleaseCamera()
- {
- PRINT( _L("Camera => CCamAppController::ReleaseCamera") );
-
- if ( IsAppUiAvailable())
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if ( appUi )
- {
- appUi->SetAssumePostCaptureView( EFalse );
- }
- }
-
- if ( Busy() )
- {
- PRINT( _L("Camera <> CCamAppController::ReleaseCamera: set release pending") );
- iPendingRelease = ETrue;
- }
- else if ( iCameraController && ECamCameraIdle != CameraState() )
- {
- // No leaving code here. Clear the flag before any operation
- // to prevent calling this from the event callbacks caused
- // by the following requests.
- iPendingRelease = EFalse;
-
- if( iInfo.iImageMode == ECamImageCaptureBurst &&
- SequenceCaptureInProgress() )
- {
- // Cancel ongoing burst capture
- // Burst capture is normally cancelled by setting iRequestedBurstCount,
- // and actual cancelling is done when next imagedata arrives.
- // However, in this case camera is going to be released, and there won't
- // be next image data, so give ECamRequestImageCancel and capture
- // completion event here to avoid problems
- PRINT( _L("Camera <> CCamAppController::ReleaseCamera: Going to bacgkround in the middle of a burst capture") );
- TRAP_IGNORE ( IssueDirectRequestL( ECamRequestImageCancel ) );
- NotifyControllerObservers( ECamEventCaptureComplete, KErrCancel );
- }
- //In SetOperation(), it notify observer with ECamEventOperationStateChanged,
- //the clear work for flash indicator flag can be done with ECamEventOperationStateChanged in some abnormal cases.
- if ( ECamControllerImage == CurrentMode() && iInfo.iActiveCamera == ECamActiveCameraPrimary )
- {
- SetOperation( ECamNoOperation );
- }
-
-
- //iInfo.iMode = ECamControllerShutdown;
- //iInfo.iTargetMode = ECamControllerIdle;
- iInfo.iTargetMode = ECamControllerIdle;
- iInfo.iImageMode = ECamImageCaptureNone;
- iInfo.iTargetImageMode = ECamImageCaptureNone;
- iInfo.iOperation = ECamNoOperation;
-
- iCaptureModeTransitionInProgress = EFalse;
-
- // Last change to stop view finder if we were "busy" previously in
- // ExitViewfinderMode method. View finder must be stopped in case where
- // orientation is changed, so Posting API display control doesn't try to
- // draw outside existing area. Otherwise KErrTooBig error is encountered.
- StopViewFinder();
-
- PRINT( _L("Camera <> CCamAppController::ReleaseCamera: requesting release directly..") );
- // iInfo.iMode set when complete
- TRAP_IGNORE( IssueDirectRequestL( ECamRequestRelease ) );
- //iPendingRelease = EFalse;
- //shutdown the orientation channel
- if( iConfigManager && iConfigManager->IsOrientationSensorSupported() &&
- iAccSensorListening )
- {
- TRAP_IGNORE( UpdateSensorApiL( EFalse ) );
- }
- }
- else
- {
- // No action needed.
- PRINT( _L("Camera <> CCamAppController::ReleaseCamera: camera already idle!!") );
- if(ECamControllerIdle != iInfo.iMode )
- {
- PRINT( _L("Camera <> CCamAppController::ReleaseCamera: camera already idle correcting state!!") );
- iInfo.iMode = ECamControllerIdle;
- }
- }
- PRINT( _L("Camera <= CCamAppController::ReleaseCamera") );
- }
-
-
-// ---------------------------------------------------------------------------
-// IncCameraUsers
-//
-// Increments the camera usage count
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::IncCameraUsers()
- {
- PRINT ( _L("Camera => CCamAppController::IncCameraUsers") );
- iCameraReferences++;
- PRINT1( _L("Camera <= CCamAppController::IncCameraUsers, count now %d"), iCameraReferences );
- }
-
-
-// ---------------------------------------------------------------------------
-// DecCameraUsers
-//
-// Decrements the camera usage count
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::DecCameraUsers()
- {
- PRINT ( _L("Camera => CCamAppController::DecCameraUsers") );
-
- __ASSERT_DEBUG( iCameraReferences > 0, CamPanic( ECamPanicInvalidState ) );
- iCameraReferences--;
-
- PRINT1( _L("Camera <> CCamAppController::DecCameraUsers: count now %d"), iCameraReferences );
- // If the engine is no longer required then release it.
- if ( iCameraReferences <= 0 )
- {
- ReleaseCamera();
- }
- PRINT ( _L("Camera <= CCamAppController::DecCameraUsers") );
- }
-
-
-
-
-// ----------------------------------------------------
-// CCamAppController::InCallOrRinging
-// Whether we are in call or ringing
-// ----------------------------------------------------
-//
-TBool
-CCamAppController::InCallOrRinging() const
- {
- return iInCallOrRinging;
- }
-
-// ----------------------------------------------------
-// CCamAppController::InVideocallOrRinging
-// Whether we are in videocall or ringing
-// ----------------------------------------------------
-//
-TBool
-CCamAppController::InVideocallOrRinging()
- {
- if ( InCallOrRinging() )
- {
- TInt callType( EPSCTsyCallTypeUninitialized );
- TInt err = RProperty::Get( KPSUidCtsyCallInformation, KCTsyCallType, callType );
- if ( err == KErrNone && callType == EPSCTsyCallTypeH324Multimedia )
- {
- return ETrue;
- }
- else
- {
- return EFalse;
- }
- }
- else
- {
- return EFalse;
- }
-
- }
-
-// ----------------------------------------------------
-// CCamAppController::CurrentlySavingVideo
-// Whether we are currently saving a video clip or not
-// ----------------------------------------------------
-//
-TBool
-CCamAppController::CurrentlySavingVideo() const
- {
- return iSaving;
- }
-
-
-
-// ---------------------------------------------------------------------------
-// IssueModeChangeSequenceL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::IssueModeChangeSequenceL( TBool aStartup )
- {
- PRINT( _L( "Camera => CCamAppController::IssueModeChangeSequenceL" ) );
- // Generate the request sequence and issue to Camera Controller.
- RCamRequestArray sequence;
- CleanupClosePushL( sequence );
-
- if( !aStartup )
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- TVwsViewId activeView;
- (void) appUi->GetActiveViewId( activeView ); // ignore error
-
- if(IntegerSettingValue(ECamSettingItemRemovePhoneMemoryUsage) &&
- !IsMemoryAvailable(ECamMediaStorageMassStorage) &&
- !IsMemoryAvailable(ECamMediaStorageCard) &&
- ( appUi->PreCaptureMode() == ECamPreCapViewfinder ||
- appUi->PreCaptureMode() == ECamPreCapGenericSetting ) &&
- activeView.iViewUid.iUid != ECamViewIdPhotoUserSceneSetup )
- {
- TBool usbPersonality = 0;
- #ifndef __WINSCW__
- User::LeaveIfError ( RProperty::Get (KPSUidUsbWatcher,
- KUsbWatcherSelectedPersonality, usbPersonality));
- #endif // __WINSCW__
- TInt mmcInserted = 0;
- User::LeaveIfError( RProperty::Get( KPSUidUikon, KUikMMCInserted, mmcInserted ) );
-
- if( KUsbPersonalityIdMS == usbPersonality )
- {
- SwitchToStandbyL( ECamErrMassStorageMode );
- }
- else if( !mmcInserted )
- {
- SwitchToStandbyL( ECamErrMemoryCardNotInserted );
- }
- else
- {
- CamPanic(ECamPanicInvalidState);
- }
-
- iIssueModeChangeSequenceSucceeded = EFalse;
- ClearSequenceBusyFlag( &iBusyFlags );
- }
- else
- {
- GenerateModeChangeSequenceL( sequence );
-
- if( iCameraReferences )
- {
- SetFlags( iBusyFlags, EBusySequence );
- TCleanupItem clearBusy( ClearSequenceBusyFlag, &iBusyFlags );
- CleanupStack::PushL( clearBusy );
- iCameraController->RequestSequenceL( sequence );
- CleanupStack::Pop();
-
- iCaptureModeTransitionInProgress = ETrue;
-
- }
- else
- {
- PRINT( _L("Camera <> No camera users, not requesting sequence.") );
- }
- iIssueModeChangeSequenceSucceeded = ETrue;
- }
- }
- else
- {
- GenerateStartupSequenceL( sequence );
-
- SetFlags( iBusyFlags, EBusySequence );
- TCleanupItem clearBusy( ClearSequenceBusyFlag, &iBusyFlags );
- CleanupStack::PushL( clearBusy );
- iCameraController->RequestSequenceL( sequence );
- CleanupStack::Pop();
- iIssueModeChangeSequenceSucceeded = ETrue;
- }
-
- CleanupStack::PopAndDestroy(); // sequence.Close()
- PRINT( _L( "Camera <= CCamAppController::IssueModeChangeSequenceL" ) );
- }
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::GenerateModeChangeSequenceL( RCamRequestArray& aSequence )
- {
- PRINT( _L( "Camera => CCamAppController::GenerateModeChangeSequenceL" ) );
- TBool vfStartDone = EFalse;
- //Have to empty autofocusrequest values here because modechange could override
- //currently processed autofocus request.
- iPendingAFRequest=0;
- iCurrentAFRequest=0;
- iNoBurstCancel = EFalse;
- iKeyUP = EFalse;
- iAFCancelInProgress = EFalse;
- iTouchCapture = EFalse;
-
- // -------------------------------------------------------
- if( ECamTriIdle != iCameraController->ViewfinderState() )
- {
- // If VF is not stopped, frames might come when we are not
- // in either image or video mode.
- if( ECamControllerIdle != iInfo.iMode
- && iInfo.iTargetMode != iInfo.iMode )
- {
- aSequence.Append( ECamRequestVfRelease );
- }
- else
-
- if( ECamTriIdle == iInfo.iTargetVfState )
- {
- aSequence.Append( ECamRequestVfRelease );
- }
- else if( ECamTriInactive == iInfo.iTargetVfState )
- {
- aSequence.Append( ECamRequestVfStop );
- }
- else
- {
- // Nothing needed here
- }
-
- }
-
- switch( iInfo.iMode )
- {
- // ---------------------------------
- case ECamControllerImage:
- {
- if( ECamControllerImage != iInfo.iTargetMode )
- {
- aSequence.Append( ECamRequestImageRelease );
- }
- break;
- }
- // ---------------------------------
- case ECamControllerVideo:
- {
- if( ECamControllerVideo != iInfo.iTargetMode )
- {
- aSequence.Append( ECamRequestVideoRelease );
- }
- break;
- }
- // ---------------------------------
- default:
- {
- // If we need to get to video or image mode
- // make sure camera has power on before further requests.
- if( ECamControllerImage == iInfo.iTargetMode
- || ECamControllerVideo == iInfo.iTargetMode )
- {
- TUint cameraState( iCameraController->State() );
-
- if( !(ECamPowerOn&cameraState) )
- {
- if( !(ECamReserved&cameraState) )
- {
- aSequence.Append( ECamRequestReserve );
- }
- aSequence.Append( ECamRequestPowerOn );
- }
- }
- break;
- }
- // ---------------------------------
- }
-
- // -------------------------------------------------------
- // Append prepare operations to achieve target camera mode
- switch( iInfo.iTargetMode )
- {
- // ---------------------------------
- case ECamControllerImage:
- {
- if( ECamImageCaptureNone != iInfo.iTargetImageMode )
- {
- aSequence.Append( ECamRequestImageInit );
-
- // Snapshot may have to be released and restarted because the
- // snapshot size may change.
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if( appUi )
- {
- if( appUi->ShowPostCaptureView() || iInfo.iTargetImageMode == ECamImageCaptureBurst )
- {
- // If vf needs to be (re)started.
- // Camera Controller checks from Setting Provider if
- // viewfinder mode (direct/bitmap) has changed, and
- // releases old type first if needed.
- if( ECamTriActive == iInfo.iTargetVfState )
- {
- PRINT( _L( "Camera <> CCamAppController::GenerateModeChangeSequenceL: VF start needed" ) );
- aSequence.Append( ECamRequestVfStart );
- vfStartDone = ETrue;
- }
- PRINT( _L( "Camera <> CCamAppController::GenerateModeChangeSequenceL: Snapshot on" ) );
- aSequence.Append( ECamRequestSsRelease );
- aSequence.Append( ECamRequestSsStart );
- }
- else
- {
- PRINT( _L( "Camera <> CCamAppController::GenerateModeChangeSequenceL: Snapshot on" ) );
- aSequence.Append( ECamRequestSsRelease );
- aSequence.Append( ECamRequestSsStart ); // SS is requested and delivered to tn-manager, but not shown on display
- }
- }
- }
-
- break;
- }
- // ---------------------------------
- case ECamControllerVideo:
- {
- // Video recorder needs to be initialized and prepared
- // if we are not already in video mode.
- if ( iInfo.iMode != ECamControllerVideo )
- {
- iVideoInitNeeded = ETrue;
- }
- aSequence.Append( ECamRequestVideoInit );
-
- // Snapshot has to be released and restarted because the
- // snapshot size may change.
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if( appUi )
- {
- if( appUi->ShowPostCaptureView() || iInfo.iTargetImageMode == ECamImageCaptureBurst )
- {
- // If vf needs to be (re)started.
- // Camera Controller checks from Setting Provider if
- // viewfinder mode (direct/bitmap) has changed, and
- // releases old type first if needed.
- if( ECamTriActive == iInfo.iTargetVfState )
- {
- PRINT( _L( "Camera <> CCamAppController::GenerateModeChangeSequenceL: VF start needed" ) );
- aSequence.Append( ECamRequestVfStart );
- vfStartDone = ETrue;
- }
- PRINT( _L( "Camera <> CCamAppController::GenerateModeChangeSequenceL: Snapshot on" ) );
- aSequence.Append( ECamRequestSsRelease );
- aSequence.Append( ECamRequestSsStart );
- }
- else
- {
- PRINT( _L( "Camera <> CCamAppController::GenerateModeChangeSequenceL: Snapshot on" ) );
- aSequence.Append( ECamRequestSsRelease );
- aSequence.Append( ECamRequestSsStart );
- }
- }
- break;
- }
- // ---------------------------------
- default:
- break;
- // ---------------------------------
- }
-
- // If vf needs to be (re)started.
- // Camera Controller checks from Setting Provider if
- // viewfinder mode (direct/bitmap) has changed, and
- // releases old type first if needed.
- if( !vfStartDone && ECamTriActive == iInfo.iTargetVfState )
- {
- PRINT( _L( "Camera <> CCamAppController::GenerateModeChangeSequenceL: VF start needed" ) );
- aSequence.Append( ECamRequestVfStart );
- }
-
-
- // -------------------------------------------------------
-#ifdef _DEBUG
- PRINT( _L( "Camera <> Generated sequence: " ) );
- for( TInt i = 0; i < aSequence.Count(); i++ )
- {
- PRINT2( _L( "Camera <> %d) %s" ), i, KCamRequestNames[aSequence[i]] );
- }
-#endif
- PRINT( _L( "Camera <= CCamAppController::GenerateModeChangeSequenceL" ) );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SettingsPhotoResolution
-// Returns the photo resolution stored by the Settings Model
-// ---------------------------------------------------------------------------
-//
-TCamPhotoSizeId CCamAppController::SettingsPhotoResolution() const
- {
- return iSettingsModel->CurrentPhotoResolution();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::GetCurrentImageDimensions
-// ---------------------------------------------------------------------------
-//
-TSize
-CCamAppController::GetCurrentImageDimensions() const
- {
- TCamPhotoSizeId index = iSettingsModel->CurrentPhotoResolution();
- TSize size = iSettingsModel->ImageResolutionFromIndex( index );
- return size;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::GetCurrentImageResolution
-// Gets the current image resolution used. May not be the same at that stored in Settings
-// if Zoom state is not 1x
-// ---------------------------------------------------------------------------
-//
-TCamPhotoSizeId CCamAppController::GetCurrentImageResolution() const
- {
- TCamPhotoSizeId size = iSettingsModel->CurrentPhotoResolution();
- return size;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::GetCurrentImageCompression
-// Returns the photo compression level from the Settings Model
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::GetCurrentImageCompression() const
- {
- return iSettingsModel->CurrentPhotoCompression();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::GetCurrentVideoResolution
-// Gets the current video resolution used.
-// ---------------------------------------------------------------------------
-//
-TCamVideoResolution CCamAppController::GetCurrentVideoResolution() const
- {
- TInt videoQuality = iSettingsModel->IntegerSettingValue( ECamSettingItemVideoQuality );
- CCamVideoQualityLevel& level = *( iSettingsModel->VideoQualityArray() )[videoQuality];
- return static_cast<TCamVideoResolution>( level.VideoResolution() );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::UsePhoneMemoryL
-// Force use of phone memory storage.
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::UsePhoneMemoryL() const
- {
-#ifdef PRODUCT_SUPPORTS_FORCE_MEDIA_STORAGE_VALUE
- // This function is used to directly force the value of media storage
- // Bypasses any updates the controller does for change to these values
-
- if( ExistMassStorage() )
- {
- iSettingsModel->SetIntegerSettingValueL( ECamSettingItemPhotoMediaStorage,
- ECamMediaStorageMassStorage );
-
- iSettingsModel->SetIntegerSettingValueL( ECamSettingItemVideoMediaStorage,
- ECamMediaStorageMassStorage );
- }
- else
- {
- TCamMediaStorage storage = iSettingModel->
- IntegerSettingValue( ECamSettingItemRemovePhoneMemoryUsage )?
- ECamMediaStorageNone:
- ECamMediaStoragePhone;
-
- iSettingsModel->SetIntegerSettingValueL( ECamSettingItemPhotoMediaStorage,
- storage );
-
- iSettingsModel->SetIntegerSettingValueL( ECamSettingItemVideoMediaStorage,
- storage );
- }
-
-#endif // PRODUCT_SUPPORTS_FORCE_MEDIA_STORAGE_VALUE
- }
-
-
-// ===========================================================================
-// From MCamSettingsModelObserver
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IntSettingChangedL
-//
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::IntSettingChangedL( TCamSettingItemIds aSettingItem,
- TInt aSettingValue )
- {
- PRINT( _L("Camera => CCamAppController::IntSettingChangedL") );
- switch( aSettingItem )
- {
- case ECamSettingItemDynamicSelfTimer:
- {
- TCamSelfTimerFunctions function( ECamSelfTimerDisabled );
- switch( aSettingValue )
- {
- case ECamSelfTimer2: function = ECamSelfTimerMode1; break;
- case ECamSelfTimer10: function = ECamSelfTimerMode2; break;
- case ECamSelfTimer20: function = ECamSelfTimerMode3; break;
- default: break;
- }
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if( appUi )
- {
- appUi->SelfTimerEnableL( function );
- }
- break;
- }
- case ECamSettingItemPhotoQuality:
- {
- HandleImageQualitySettingChangeL();
- break;
- }
- case ECamSettingItemVideoQuality:
- NotifyControllerObservers( ECamEventVideoQualityChanged, KErrNone );
- break;
- case ECamSettingItemVideoAudioRec:
- {
- NotifyControllerObservers( ECamEventAudioMuteStateChanged );
- break;
- }
- case ECamSettingItemContinuousAutofocus:
- {
- NotifyControllerObservers( ECamEventContAFStateChanged );
- break;
- }
-
- case ECamSettingItemFaceTracking:
- {
- PRINT( _L("Camera => ECamSettingItemFaceTracking") );
- TCamCameraSettingId cameraId(
- CCamSettingConversion::Map2CameraControllerSettingId( aSettingItem ) );
- iCameraController->DirectSettingsChangeL( cameraId );
- NotifyControllerObservers( ECamEventFaceTrackingStateChanged );
-
- // If Face tracking was turned off by user (not forced off by a scene mode)
- // update iPreviousFaceTrack to the current state as we are not going to
- // reset to the previous state automatically at any point.
- TCamSceneId scene = static_cast< TCamSceneId >
- ( IntegerSettingValue( ECamSettingItemDynamicPhotoScene ) );
-
- if ( scene != ECamSceneMacro &&
- scene != ECamSceneScenery &&
- scene != ECamSceneSports &&
- !iSceneModeForcedBySecondaryCamera )
- {
- PRINT1( _L("Camera MK: Changing face tracking state -> update iPreviousFaceTrack to %d"), aSettingValue );
- iSettingsModel->SetPreviousFaceTrack( static_cast<TCamSettingsOnOff>( aSettingValue ) );
- }
-
- break;
- }
- case ECamSettingItemDynamicVideoFlash:
- {
- PRINT( _L("Camera => ECamSettingItemDynamicVideoFlash") );
- TCamCameraSettingId cameraId(
- CCamSettingConversion::Map2CameraControllerSettingId( aSettingItem ) );
- iCameraController->DirectSettingsChangeL( cameraId );
- break;
- }
- default:
- {
- break;
- }
- }
- PRINT( _L("Camera <= CCamAppController::IntSettingChangedL") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::TextSettingChangedL
-//
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::TextSettingChangedL( TCamSettingItemIds /*aSettingItem*/,
- const TDesC& /*aSettingValue*/ )
- {
- }
-
-// ---------------------------------------------------------------------------
-// HandleImageQualitySettingChangeL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::HandleImageQualitySettingChangeL()
- {
- PRINT( _L("Camera => CCamAppController::HandleImageQualitySettingChangeL") );
- if( IsViewFinding() )
- {
- PRINT( _L("Camera <> CCamAppController - viewfinder on, stop vf / re-prepare / start vf..") );
- TRAPD( status,
- {
- IssueDirectRequestL( ECamRequestVfStop );
- IssueDirectRequestL( ECamRequestSsRelease );
- IssueDirectRequestL( ECamRequestImageInit );
- IssueDirectRequestL( ECamRequestVfStart );
- IssueDirectRequestL( ECamRequestSsStart );
- });
-
- if( KErrNone != status )
- {
- SetOperation( ECamStandby, status );
- }
- }
-
- NotifyControllerObservers( ECamEventImageQualityChanged, KErrNone );
- PRINT( _L("Camera <= CCamAppController::HandleImageQualitySettingChangeL") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::BurstModeActive
-//
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::BurstModeActiveL( TBool aActive, TBool /*aStillModeActive*/ )
- {
- PRINT1( _L("Camera => CCamAppController::BurstModeActiveL %d"), aActive );
- if( ECamControllerImage == iInfo.iMode )
- {
- //TCamImageCaptureMode oldImageMode = iInfo.iImageMode;
- // We are in still capture mode
- if( aActive )
- {
- PRINT( _L("Camera <> CCamAppController .. iInfo.iImageMode = appUi->CurrentBurstMode() ") );
- // Burst mode active. Query current mode from AppUi
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- // iInfo.iImageMode = appUi->CurrentBurstMode();
- SetImageMode( appUi->CurrentBurstMode() );
- // reset image orientation
- iImageOrientation = ECamOrientation0;
- TRAP_IGNORE( SetImageOrientationL() );
-
- }
- else
- {
- // Burst mode not active
- PRINT( _L("Camera <> CCamAppController .. iInfo.iImageMode = ECamImageCaptureSingle ") );
- // iInfo.iImageMode = ECamImageCaptureSingle;
- SetImageMode( ECamImageCaptureSingle );
- }
- iRequestedCaptureCount = ( ECamImageCaptureBurst == iInfo.iImageMode )
- ? KShortBurstCount
- : 1;
- iCameraController->DirectSettingsChangeL( ECameraSettingCaptureLimit );
- // set image orientation in case it was changed during burst mode
- if( iOrientationChangeOccured )
- {
- iOrientationChangeOccured = EFalse;
- TRAP_IGNORE( SetImageOrientationL() );
- }
-
- }
- else
- {
- PRINT( _L("Camera <> CCamAppController .. [WARNING] Not in image mode, set iInfo.iImageMode = ECamImageCaptureNone") );
- // iInfo.iImageMode = ECamImageCaptureNone;
- SetImageMode( ECamImageCaptureNone );
- }
- PRINT( _L("Camera <= CCamAppController::BurstModeActiveL %d") );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetVideoLengthL
-// Set video length (max or short)
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetVideoLengthL( TInt /*aLength*/ )
- {
- PRINT( _L( "Camera => CCamAppController::SetVideoLengthL" ) );
- User::Leave( KErrNotSupported );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CurrentPhotoStorageLocation
-// Returns the current photo storage location filtered by MMC presence
-// ---------------------------------------------------------------------------
-TInt CCamAppController::CurrentPhotoStorageLocation() const
- {
- TInt storageLocation = iSettingsModel->IntegerSettingValue( ECamSettingItemPhotoMediaStorage );
-
- // added iForceUseOfPhoneMemory part to treat current location
- // as Mass Storage / Phone, also if it is forced.
- if ( iForceUseOfPhoneMemory ||
- ( ( storageLocation == ECamMediaStorageCard ) &&
- ( CamUtility::MemoryCardStatus() != ECamMemoryCardInserted ) ) )
- {
- if ( ExistMassStorage() )
- {
- storageLocation = ECamMediaStorageMassStorage;
- }
- else
- {
- storageLocation = IntegerSettingValue( ECamSettingItemRemovePhoneMemoryUsage)?
- ECamMediaStorageNone:
- ECamMediaStoragePhone;
- }
- }
- return storageLocation;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CurrentVideoStorageLocation
-// Returns the current video storage location filtered by MMC presence
-// ---------------------------------------------------------------------------
-TInt CCamAppController::CurrentVideoStorageLocation() const
- {
- TInt storageLocation = iSettingsModel->IntegerSettingValue( ECamSettingItemVideoMediaStorage );
-
- // added iForceUseOfPhoneMemory part to treat current location
- // as Mass Storage / Phone, also if it is forced.
-
- if ( iForceUseOfPhoneMemory )
- {
- storageLocation = iForcedStorageLocation;
- }
- return storageLocation;
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ReleaseArray
-// Record that the view has finished with the array
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::ReleaseArray( TBool aForcedRelease )
- {
- PRINT( _L("Camera => CCamAppController::ReleaseArray") );
- // Otherwise we were using the real capture array, so reset it
- if( iArrayUsageCount > 0 )
- {
- iArrayUsageCount--;
- }
-
- if ( iArrayUsageCount == 0 || aForcedRelease )
- {
- PRINT( _L("Camere <> CCamAppController::ReleaseArray .. usage to 0") );
- iCaptureArray->Reset();
- iCurrentImageIndex = 0;
- // May have released a large amount of memory, so compress the heap
- User::Heap().Compress();
- }
-
- PRINT( _L("Camera <= CCamAppController::ReleaseArray") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RestoreFactorySettingsL
-// Delete
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::RestoreFactorySettingsL( TBool aIsEmbedded )
- {
- PRINT( _L("Camera => CCamAppController::RestoreFactorySettingsL") );
- iSettingsModel->ResetRepository();
-
- // reload static settings
- LoadStaticSettingsL( aIsEmbedded );
-
- // reload dynamic settings
- SetDynamicSettingsToDefaults();
-
- // Restoring camera settings didn't set the capture mode to single capture,
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- appUi->SwitchStillCaptureModeL( ECamImageCaptureSingle, EFalse, EFalse );
- //
- SetMode( ECamControllerIdle );
-
- if( iLocationTrailStarted &&
- ECamLocationOn != IntegerSettingValue( ECamSettingItemRecLocation ) )
- {
- PRINT( _L("Camera <> CCamAppController::RestoreFactorySettingsL - Stop location trail") );
- // Location trail has been started, but setting off after restore -> stop trail
- // Starting (if needed after restore) happens when still precap view is activated
- StopLocationTrail();
- }
-
- //
- NotifyControllerObservers( ECamEventRestoreCameraSettings );
- PRINT( _L("Camera <= CCamAppController::RestoreFactorySettingsL") );
- }
-
-
-
-
-// ---------------------------------------------------------------------------
-// PlayComplete
-//
-// Called from when sound playing completes.
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::PlayComplete( TInt /*aStatus*/, TInt /*aSoundId*/ )
- {
- PlaySoundComplete();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::PlaySoundComplete
-// Called when playback of a sound has completed. Typically used in conjunction
-// with Video recording (must only start recording AFTER sound has finished
-// to avoid recording the sound in the recorded clip).
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::PlaySoundComplete()
- {
- PRINT( _L("Camera => CCamAppController::PlaySoundComplete") );
- OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAPPCONTROLLER_PLAYSOUNDCOMPLETE, "e_CAM_APP_CAPTURE_SOUND_PLAY 0" ); //CCORAPP_CAPTURE_SOUND_PLAY_END
-
- __ASSERT_DEBUG( iCameraController, CamPanic( ECamPanicInvalidState ) );
- if( ECamControllerVideo == iInfo.iMode && !IsKeyLockOn() )
- {
- switch( CurrentVideoOperation() )
- {
- case ECamResuming:
- {
- // Restarting video
- DoRecord();
- break;
- }
- case ECamPausing:
- {
- // Notifies observers, so paused icon and softkeys can be updated.
- SetOperation( ECamPaused );
- break;
- }
- case ECamNoOperation:
- {
- // Starting the video capture
- // If the next file path has not changed, start capturing
- if ( BurstCaptureArray()->FileName( 0 ).Compare( iSuggestedVideoPath ) == 0 )
- {
- PRINT( _L("Camera <> starting to record..") );
- DoRecord();
- }
- // File path changed. Prepare the engine with the new video file path.
- // Start video recording when filename changed (event)
- else
- {
- iVideoRequested = ETrue;
- iSuggestedVideoPath.Copy( BurstCaptureArray()->FileName( 0 ) );
- PRINT1( _L("Camera <> Requesting Camera controller to set the video name, iSuggestedVideoPath = [%S] "), &iSuggestedVideoPath );
- TRAP_IGNORE(
- {
- // Set video name change pending and request setting it to camera controller.
- iSettingProvider->AddPendingSettingChangeL( ECamSettingItemVideoNameBase );
- IssueSettingsChangeRequestL();
- });
- iVideoNameRetries = KVideoNameRetryCount;
- }
- }
- default:
- {
- // No operation.
- // Should be stopping video
- }
- }
- }
- else
- {
- // Image mode or keylock on, no action
- }
- PRINT( _L("Camera <= CCamAppController::PlaySoundComplete") );
- }
-// ---------------------------------------------------------------------------
-// CCamAppController::MediaFileChangedNotification
-//Helper function for making notification about deleted files
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::MediaFileChangedNotification()
- {
- PRINT( _L("Camera => CCamAppController::MediaFileChangedNotification") );
- NotifyControllerObservers( ECamEventMediaFileChanged );
- PRINT( _L("Camera <= CCamAppController::MediaFileChangedNotification") );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DeleteCurrentFile
-// Delete the current image/video file
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::DeleteCurrentFile( TBool aNotify /*=ETrue*/ )
- {
- PRINT( _L("Camera => CCamAppController::DeleteCurrentFile") );
- iImageSaveRequestPending = EFalse;
-
- TInt err( KErrNone );
- if( BurstCaptureArray()->Count() > 0 )
- {
- err = BurstCaptureArray()->SetDeleted( iCurrentImageIndex, ETrue );
- if ( aNotify && err == KErrNone )
- {
- NotifyControllerObservers( ECamEventMediaFileChanged );
- }
- }
-
- PRINT( _L("Camera <= CCamAppController::DeleteCurrentFile") );
- return err;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DeleteTimeLapseFiles
-// Delete the current timelapse sequence
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::DeleteTimeLapseFiles()
- {
- // Count() is inline
- for ( TInt i = 0; i < iSequenceFilenameArray->Count(); i++ )
- {
- TPtrC filename( iSequenceFilenameArray->MdcaPoint( i ) );
- // Error ignored
- (void)iImageSaveActive->DeleteFile( filename, ETrue );
- }
- iSequenceFilenameArray->Reset();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsProcessingCapture
-// Indicate whether or not the controller is actively engaged in still
-// or video capture
-// ---------------------------------------------------------------------------
-//
-
-TBool CCamAppController::IsProcessingCapture()
- {
- return ( iCaptureRequested // if a still capture is pending
- || iVideoRequested // if a video capture is pending
- || EngineProcessingCapture() // if recording or capture is active
- || ECamImageCaptureTimeLapse == iInfo.iImageMode // if capturing time lapse
- || CurrentlySavingVideo() ); // if a video save is in progress
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CompleteCaptureAndNotifyL
-// Request that any current processes complete, then notify observers
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::CompleteCaptureAndNotifyL( MCamObserver* aObserver,
- TBool aSafeCompletion )
- {
- PRINT( _L( "Camera => CCamAppController::CompleteCaptureAndNotifyL" ) )
-
- RProperty::Set( KPSUidCamcorderNotifier, KCCorFocused, 0 );
-
- // Add the observer to the observer handler for capture completion.
- if ( !iCaptureCompletionObserverHandler )
- {
- iCaptureCompletionObserverHandler = CCamObserverHandler::NewL();
- }
- iCaptureCompletionObserverHandler->RegisterObserverL( aObserver );
-
- // if the capture has not yet begun, all that is required is to switch off
- // the pending capture
- iCaptureRequested = EFalse;
- iVideoRequested = EFalse;
-
- // if no capture is actively in progress
- if ( !IsProcessingCapture() )
- {
- PRINT( _L( "Camera <> not capturing calling HandleCaptureCompletion" ) )
- HandleCaptureCompletion();
- }
-
- // if recording is active
- else if ( ECamControllerVideo == iInfo.iMode )
- {
- if( ECamCapturing == iInfo.iOperation
- || ECamPausing == iInfo.iOperation
- || ECamPaused == iInfo.iOperation
- || ECamResuming == iInfo.iOperation )
- {
- PRINT( _L( "Camera <> currently recording calling StopVideoRecording()" ) )
- StopVideoRecording();
- // iCaptureCompletionObserverHandler will be notified when the record completes
- // in McaeoVideoRecordingComplete
- }
- }
- else if ( ECamImageCaptureTimeLapse == iInfo.iImageMode )
- {
- PRINT( _L( "Camera <> Calling StopSequenceCapture" ) )
- StopSequenceCaptureL();
- // iCaptureCompletionObserverHandler will be notified when the
- // next image saving completes
- }
-
- // if a burst capture is in early stages
- else if ( ECamImageCaptureBurst == iInfo.iImageMode )
- {
- if( ECamCapturing == iInfo.iOperation )
- {
- if ( !aSafeCompletion )
- {
- //iEngine->CancelCaptureStill();
- PRINT( _L( "Camera <> Safe completion requested, currently capturing burst, issue ECamRequestImageCancel" ) )
- IssueDirectRequestL( ECamRequestImageCancel );
- CompleteBurstOperation();
- }
- else
- {
- //iEngine->StopStillBurstCapture();
- PRINT( _L( "Camera <> Not safe completion requested, currently capturing burst, issue ECamRequestImageCancel" ) )
- IssueDirectRequestL( ECamRequestImageCancel );
- // iCaptureCompletionObserverHandler will be notified when the
- // image saving completes
- }
- }
- }
- else // do nothing
- {
- PRINT( _L( "Camera <> currently waiting for capture completion" ) )
- // e.g. iOperation == ECamCaptureCompleting
- // iCaptureCompletionObserverHandler will be notified when the
- // image saving completes
-
- // e.g. CurrentlySavingVideo()
- // iCaptureCompletionObserverHandler will be notified when the
- // video saving completes in McaeoVideoRecordingComplete
-
- // e.g. iOperation == ECamCaptureInProgress (single capture)
- // iCaptureCompletionObserverHandler will be notified when the
- // image saving completes
- }
- PRINT( _L( "Camera <= CCamAppController::CompleteCaptureAndNotifyL" ) )
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::EnterShutdownMode
-// Enter shutdown mode as the application is closing
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::EnterShutdownMode( TBool aImmediateShutdown )
- {
- PRINT1( _L( "Camera => CCamAppController::EnterShutdownMode( aImmediateShutdown=%d )"), aImmediateShutdown );
-
- DeRegisterHarverterClientEvents();
-
- if ( !IsInShutdownMode() )
- {
- PRINT ( _L( "Camera <> CCamAppController::EnterShutdownMode: set target mode to ECamControllerShutdown..") );
- SetTargetMode( ECamControllerShutdown );
- }
-
- // if not close down straightaway (i.e. for embedded )
- if ( !aImmediateShutdown )
- {
- // cancel any outstanding sound requests
- // iSoundPlayer->CancelTonePlayer();
- iSoundPlayer->CancelAllPlaying();
-
- TRAPD( err, CompleteCaptureAndNotifyL( this, EFalse ) )
- if ( err )
- {
- NotifyControllerObservers( ECamEventExitRequested, KErrNone );
- }
- }
- else
- {
- // This checks for any ongoing operation.
- ReleaseCamera();
- }
-
- PRINT ( _L( "Camera <= CCamAppController::EnterShutdownMode") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsInShutdownMode
-// Whether or not the controller is in shutdown mode
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsInShutdownMode() const
- {
- return ( ECamControllerShutdown == iInfo.iTargetMode );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsAppUiAvailable
-// Returns true if AppUi has been constructed, and not yet destructed
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsAppUiAvailable() const
- {
- PRINT1(_L("Camera <> CCamAppController::IsAppUiAvailable=%d"),iAppUiAvailable);
- return iAppUiAvailable;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetAppUiAvailable
-// Sets AppUi availablility (see IsAppUiAvailable)
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetAppUiAvailable( TBool aAvailable )
- {
- iAppUiAvailable = aAvailable;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::GetZoomRange
-// Returns the minimum and maximum supported zoom values
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::GetZoomRange( TInt& aMinZoom, TInt& aMaxZoom ) const
- {
- __ASSERT_ALWAYS( iCameraController, CamPanic( ECamPanicNullPointer ) );
- aMinZoom = 0;
- aMaxZoom = iCameraController->CameraInfo().iMaxDigitalZoom;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ZoomValue
-// Returns the current zoom value
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::ZoomValue() const
- {
- return iDesiredZoomVal;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetZoomValue
-// Sets a new zoom value
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetZoomValue( TInt aValue )
- {
- PRINT1( _L("Camera => CCamAppController::SetZoomValue( %d )"), aValue );
- __ASSERT_ALWAYS( iCameraController, CamPanic( ECamPanicNullPointer ) );
-
- // Check the requested value for validity
- __ASSERT_DEBUG( Rng( 0, aValue, iCameraController->CameraInfo().iMaxDigitalZoom ),
- CamPanic( ECamPanicInvalidZoomValue ) );
-
- if ( ECamControllerImage == iInfo.iMode
- || ECamControllerVideo == iInfo.iMode )
- {
- // Setting provider asks for the zoom value from us
- iDesiredZoomVal = aValue;
-
- if ( !iZoomWaitingForCamera )
- {
- PRINT( _L("Camera <> CCamAppController: calling Camera Controller..") );
-
- TRAPD( error,
- {
- iCameraController->DirectSettingsChangeL( ECameraSettingDigitalZoom );
- });
-
- // If no leave occurred, notification is done in HandleSettingEventL
- if( KErrNone != error )
- {
- NotifyControllerObservers( ECamEventZoomStateChanged, error );
- }
-
- // iZoomWaitingForCamera is set to EFalse when vf frame arrives.
- // With direct vf, this never happens, so do not set to ETrue.
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if ( appUi && !appUi->IsDirectViewfinderActive() )
- {
- iZoomWaitingForCamera = ETrue;
- }
- iNewZoomPending = EFalse;
- }
- else
- {
- PRINT( _L("Camera <> CCamAppController: zoom is waiting for VF update") );
- iNewZoomPending = ETrue;
- }
- }
- PRINT( _L("Camera <= CCamAppController::SetZoomValue") );
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ResetUserSceneL
-// Resets all the user scene settings to their defaults.
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::ResetUserSceneL()
- {
- iSettingsModel->ResetUserSceneL();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::PreviewSettingChangeL
-//
-// Previews a new value for the specified integer setting.
-// If method leaves, preview is not activated.
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::PreviewSettingChangeL( TInt aSettingItem,
- TInt aSettingValue )
- {
- PRINT( _L("Camera => CCamAppController::PreviewSettingChangeL") );
- __ASSERT_DEBUG( iSettingsPreviewHandler, CamPanic( ECamPanicNullPointer ) );
-
- TCamSettingItemIds settingId(
- static_cast<TCamSettingItemIds>(aSettingItem) );
-
- PRINT1( _L("Camera <> Setting to be previewed [%s]"), KCamSettingItemNames[settingId] );
-
- if ( settingId == ECamSettingItemDynamicSelfTimer )
- {
- SetSlideInSelfTimerPreview(ETrue);
- }
-
- // Activate the preview as a first thing.
- // If requests are issued to Camera Controller,
- // it asks for the setting value through Setting Provider and
- // the setting needs to be already in preview at that point.
- // If this fails, there's nothing we need to roll back.
- iSettingsPreviewHandler->ActivatePreviewL( settingId, aSettingValue );
-
-
- // Check which setting is previewed.
- // Some need special attention, or should/need not be set to Camera at this point.
- TInt status( KErrNone );
- switch( settingId )
- {
- // ---------------------------------
- // Image quality
- case ECamSettingItemPhotoQuality:
- // Still image quality does not require re-prepare,
- // as even the remining images counting is done
- // based on local size esimates.
- // Need to do notification to update counters.
- NotifyControllerObservers( ECamEventImageQualityChanged );
- break;
- // ---------------------------------
- // Video quality
- case ECamSettingItemVideoQuality:
- // Video needs to be re-prepared to be able to update
- // remaining time counters.
- NotifyControllerObservers( ECamEventVideoQualityChanged );
- break;
- // ---------------------------------
- // Self timer
- case ECamSettingItemDynamicSelfTimer:
- // Just set the preview. Once committed, set via AppUi.
- break;
- // ---------------------------------
- // Others - set to Camera to see the effect.
- default:
- {
- TCamCameraSettingId cameraId(
- CCamSettingConversion::Map2CameraControllerSettingId( settingId ) );
-
- //PRINT1( _L("Camera <> CCamAppController: Setting the preview to Camera, id[%s]"), KCameraSettingNames[settingId] );
-
- // Assertation to notice if some setting is not properly handled.
- __ASSERT_DEBUG( ECameraSettingNone != cameraId, CamPanic( ECamPanicNotSupported ) );
-
- if( ECameraSettingNone != cameraId )
- {
- // Preview is active.
- // Camera controller will ask the value during DirectSettingsChangeL.
- // Need trap to be able to cancel on failure.
- TRAP( status, iCameraController->DirectSettingsChangeL( cameraId ) );
- }
- break;
- }
- // ---------------------------------
- }
-
- if( KErrNone != status )
- {
- PRINT( _L("Camera <> CCamAppController: Problem in preview, cancelling!!!") );
-
- // Invalid id does not cause problem here.
- iSettingsPreviewHandler->CancelPreview( settingId );
- User::Leave( status );
- }
- PRINT( _L("Camera <= CCamAppController::PreviewSettingChangeL") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CancelPreviewChangesL
-// Cancels all preview changes, since last commit/cancel.
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::CancelPreviewChangesL()
- {
- PRINT( _L("Camera => CCamAppController::CancelPreviewChangesL") );
-
- // Just check non-null, but no panic.
- if ( iSettingsPreviewHandler )
- {
- RArray<TCamSettingItemIds> previews;
- CleanupClosePushL( previews );
-
- // Get all active previews
- iSettingsPreviewHandler->ActivePreviewsL( previews );
- // Reset all previews so the Setting Provider does
- // not get those values anymore.
- iSettingsPreviewHandler->CancelAllPreviews();
-
- // Reset the original setting values to Camera
- TInt errorOne( KErrNone );
- TInt errorAll( KErrNone );
- TCamCameraSettingId cameraId( ECameraSettingNone );
- for( TInt i = previews.Count() - 1; i >= 0; i-- )
- {
- if( ECamSettingItemVideoQuality == previews[i] )
- {
- TRAP( errorOne, RePrepareVideoL() );
- }
- else
- {
- cameraId =
- CCamSettingConversion::Map2CameraControllerSettingId( previews[i] );
-
- if( ECameraSettingNone != cameraId )
- {
- TRAP( errorOne, iCameraController->DirectSettingsChangeL( cameraId ) );
- }
- /* All previews are not set to Camera.
- else
- {
- errorOne = KErrNotSupported;
- }
- */
- }
-
- if( KErrNone == errorAll
- && KErrNone != errorOne )
- {
- errorAll = errorOne;
- }
- }
- User::LeaveIfError( errorAll );
-
- CleanupStack::PopAndDestroy(); // previews
- }
- PRINT( _L("Camera <= CCamAppController::CancelPreviewChangesL") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CommitPreviewChanges
-// Commits last preview change.
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::CommitPreviewChanges()
- {
- PRINT( _L("Camera => CCamAppController::CommitPreviewChanges") );
- __ASSERT_DEBUG( iSettingsPreviewHandler, CamPanic( ECamPanicNullPointer ) );
-
- // All previews have been set to Camera already.
- // Only need to request the model to store new values.
- // Currently ignore error, if settings model cannot save the preview.
- TRAPD( error, iSettingsPreviewHandler->CommitAllPreviewsL() );
- if( KErrNone != error )
- {
- // Ignored.
- PRINT( _L("Camera <> Settings model could not save the preview!!!") );
- }
- PRINT( _L("Camera <= CCamAppController::CommitPreviewChanges") );
- }
-
-
-// ---------------------------------------------------------------------------
-// RePrepareVideoL
-//
-// Helper method for re-preparing video if e.g. a setting change
-// requires it. If Camera Controller is currently processing
-// some request, set the flag to issue the request later.
-//
-// Used atleast in PreviewSettingChangeL and CancelPreviewChangesL.
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::RePrepareVideoL()
- {
- PRINT( _L("Camera => CCamAppController::RePrepareVideoL") );
-
- GenerateNextValidVideoPathL();
- if( !Busy() )
- {
- iVideoPrepareNeeded = EFalse;
- IssueRequestL( ECamRequestVideoInit );
- }
- else
- {
- iVideoPrepareNeeded = ETrue;
- }
- PRINT( _L("Camera <= CCamAppController::RePrepareVideoL") );
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IntegerSettingValue
-// Returns the current integer value for the specified setting
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::IntegerSettingValue( TInt aSettingItem ) const
- {
- // If the requested item is the photo storage location, this must be filtered
- // based on the availability of the MMC.
- if ( aSettingItem == ECamSettingItemPhotoMediaStorage )
- {
- return CurrentPhotoStorageLocation();
- }
-
- // If the requested item is the video storage location, this must be filtered
- // based on the availability of the MMC.
- if ( aSettingItem == ECamSettingItemVideoMediaStorage )
- {
- return CurrentVideoStorageLocation();
- }
-
- // Not a setting we sometimes need to filter
- return IntegerSettingValueUnfiltered( aSettingItem );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IntegerSettingValueUnfiltered
-// Returns the current integer value for the specified setting
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::IntegerSettingValueUnfiltered( TInt aSettingItem ) const
- {
- if( aSettingItem == ECamSettingItemVideoFileType )
- {
- TInt videoQuality = iSettingsModel->IntegerSettingValue( ECamSettingItemVideoQuality );
-
- CCamVideoQualityLevel& level = *( iSettingsModel->VideoQualityArray() )[videoQuality];
-
- return level.VideoType();
- }
- // Query the relevant settings model.
- return iSettingsModel->IntegerSettingValue( aSettingItem );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetIntegerSettingValueL
-// Sets a new value for the specified integer setting
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetIntegerSettingValueL( TInt aSettingItem,
- TInt aSettingValue )
- {
- PRINT( _L("Camera => CCamAppController::SetIntegerSettingValueL"))
- // Update the settings model.
- iSettingsModel->SetIntegerSettingValueL( aSettingItem, aSettingValue );
-
- // Update observers with any changes that do not directly affect the
- // engine. That is, they need to be updated now because the settings model
- // will not pass these to this observer.
- switch( aSettingItem )
- {
- case ECamSettingItemPhotoMediaStorage:
- case ECamSettingItemVideoMediaStorage:
- {
- PRINT1(_L("Camera SetIntegerSettingValueL calling SetPathnamesToNewStorageL %d" ), aSettingValue);
- // reset iForceUseOfPhoneMemory flag when user chooses
- // from settings.
- iForceUseOfPhoneMemory = EFalse;
- SetPathnamesToNewStorageL(static_cast < TCamMediaStorage > ( aSettingValue ) );
- InitCaptureLimitL();
- break;
- }
- case ECamSettingItemDynamicVideoScene:
- {
- iVideoInitNeeded = ETrue;
- NotifyControllerObservers( ECamEventSceneStateChanged );
- break;
- }
- case ECamSettingItemDynamicPhotoScene:
- case ECamSettingItemUserSceneBasedOnScene:
- {
- if( iConfigManager && iConfigManager->IsAutoFocusSupported() )
- {
- // Check for macro or landscape scene/based on scene and
- // set up AF accordingly. For other scenes, the AF mode
- // is setup at capture
- CheckAfModeForScene();
- }
- NotifyControllerObservers( ECamEventSceneStateChanged );
- break;
- }
- case ECamSettingItemVideoAudioRec:
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if ( appUi->IsEmbedded() )
- {
- iCameraController->DirectSettingsChangeL( ECameraSettingAudioMute );
- }
- NotifyControllerObservers( ECamEventAudioMuteStateChanged );
- break;
- }
- case ECamSettingItemContinuousAutofocus:
- {
- iSettingProvider->AddPendingSettingChangeL( ECamSettingItemContinuousAutofocus );
- IssueSettingsChangeRequestL();
- break;
- }
- case ECamSettingItemPhotoStoreInAlbum:
- case ECamSettingItemVideoStoreInAlbum:
- {
- TUint32 defaultAlbumId = static_cast<TUint32>(
- IntegerSettingValue( ECamSettingItemDefaultAlbumId ));
-
- iImageSaveActive->SetAddImageToAlbum( aSettingValue == ECamSettYes,
- defaultAlbumId );
- break;
- }
- case ECamSettingItemRecLocation:
- {
- // Set the location utility active object
- if ( ECamLocationOff == aSettingValue )
- {
- StopLocationTrail();
- }
- else if ( ECamLocationOn == aSettingValue )
- {
- StartLocationTrailL();
- }
-
- // Notify observers
- NotifyControllerObservers( ECamEventLocationSettingChanged );
- break;
- }
- // Need to support more zoom settings.
- // Digital/extended setting combined to
- // ECamSettingItemPhotoDigitalZoom and ECamSettingItemVideoDigitalZoom
- case ECamSettingItemPhotoDigitalZoom:
- case ECamSettingItemVideoDigitalZoom:
- {
- // Notify observers
- NotifyControllerObservers( ECamEventZoomSetupChanged );
- break;
- }
-
- default:
- {
- // no action for others here
- break;
- }
- }
-
- PRINT( _L("Camera <= CCamAppController::SetIntegerSettingValueL"))
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetPathnamesToNewStorageL
-// Sets pathnames for video and image files to point to new storage
-// ---------------------------------------------------------------------------
-void CCamAppController::SetPathnamesToNewStorageL( TCamMediaStorage aMediaStorage )
- {
- PRINT(_L("Camera => CCamAppController::SetPathnamesToNewStorageL" ))
-
- iSetNewPathnamesPending = ECamMediaStorageNone;
- TFileName path;
-
- // If the engine is prepared for image capture then check that the required
- // image folder exists
- if ( IsFlagOn( CameraControllerState(), ECamImageOn ) )
- {
- CCamFolderUtility::GetBasePathL( iMonthFolderCounters,
- aMediaStorage,
- path,
- ECamControllerImage,
- EFalse );
- iCurrentStorage = aMediaStorage;
- }
-
- // If the engine is prepared for video capture then check that the required
- // month folder exists and set up the engine with the new video path, this
- // will be adjusted with the appropriate month counter folder when video
- // capture begins
- else if ( IsFlagOn( CameraControllerState(), ECamVideoOn ) )
- {
- CCamFolderUtility::GetBasePathL( iMonthFolderCounters,
- aMediaStorage,
- path,
- ECamControllerVideo,
- EFalse );
- if( iInfo.iOperation != ECamCapturing &&
- iInfo.iOperation != ECamPausing &&
- iInfo.iOperation != ECamPaused &&
- iInfo.iOperation != ECamResuming &&
- iInfo.iOperation != ECamCompleting )
- {
- GenerateNextValidVideoPathL();
- }
- iCurrentStorage = aMediaStorage;
-
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
-
- if( !appUi->SettingsLaunchedFromCamera() )
- {
- // Set video name change pending and request setting it to camera controller.
- if( iInfo.iOperation != ECamCapturing &&
- iInfo.iOperation != ECamPausing &&
- iInfo.iOperation != ECamPaused &&
- iInfo.iOperation != ECamResuming &&
- iInfo.iOperation != ECamCompleting )
- {
- iSettingProvider->AddPendingSettingChangeL( ECamSettingItemVideoNameBase );
- // Can't set the new pathname, if camera controller is busy.
- if ( CameraControllerBusy() )
- {
- PRINT( _L("Camera <> Camera controller busy. New pathname not set. Set iSetNewPathnamesPending.") )
- iSetNewPathnamesPending = aMediaStorage;
- }
- else
- {
- IssueSettingsChangeRequestL();
- }
- }
-
- iVideoNameRetries = KVideoNameRetryCount;
- //iVideoTimeRemaining = KMaxRecordingLength;
- if( iInfo.iOperation == ECamCapturing ||
- iInfo.iOperation == ECamPausing ||
- iInfo.iOperation == ECamPaused ||
- iInfo.iOperation == ECamResuming ||
- iInfo.iOperation == ECamCompleting )
- {
- iVideoTimeRemaining = RemainingVideoRecordingTime();
- }
- else
- {
- PRINT( _L("Camera <> CCamAppController::SetPathnamesToNewStorageL - video mode not yet initialized" ));
- TRAPD( err, iVideoTimeRemaining = CalculateVideoTimeRemainingL() );
- if( KErrNone != err )
- {
- iVideoTimeRemaining = 0;
- }
- }
- }
- }
-
- // The engine is not yet prepared, the folder will be checked when the engine preparation
- // takes place. The controller also checks the state of iSetNewPathnamesPending when
- // preparation completes, just in case preparation is currently in progress.
- else
- {
- iSetNewPathnamesPending = aMediaStorage;
- }
-
- NotifyControllerObservers( ECamEventSaveLocationChanged );
- PRINT(_L("Camera <= CCamAppController::SetPathnamesToNewStorageL" ))
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetTextSettingValueL
-// Sets a new text value for the specified setting
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetTextSettingValueL( TInt aSettingItem,
- const TDesC& aSettingValue )
- {
- // Update the relevant settings model.
- iSettingsModel->SetTextSettingValueL( aSettingItem, aSettingValue );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::TextSettingValue
-// Returns the current text value for the specified setting
-// ---------------------------------------------------------------------------
-//
-TPtrC
-CCamAppController::TextSettingValue( TInt aSettingItem ) const
- {
- // Query the relevant settings model.
- return iSettingsModel->TextSettingValue( aSettingItem );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SettingValueEnabled
-// Returns whether a particular setting value can be set or not.
-// ---------------------------------------------------------------------------
-//
-TBool
-CCamAppController::SettingValueEnabled( TInt aSettingItem,
- TInt aSettingValue ) const
- {
- return iSettingsModel->SettingValueEnabled( aSettingItem, aSettingValue );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::LoadStaticSettingsL
-// Loads the static settings from shared data
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::LoadStaticSettingsL( TBool aIsEmbedded )
- {
- OstTrace0( CAMERAAPP_PERFORMANCE_DETAIL, CCAMAPPCONTROLLER_LOADSTATICSETTINGSL, "e_CCamAppController_LoadStaticSettingsL 1" );
- PRINT(_L("Camera => CCamAppController::LoadStaticSettingsL" ))
- iSettingsModel->LoadStaticSettingsL( aIsEmbedded );
-
- // Cache the image 'add to album' setting in the saving active object
- // it will change infrequently
- TInt value = iSettingsModel->IntegerSettingValue( ECamSettingItemPhotoStoreInAlbum );
-
- TUint32 defaultAlbumId = static_cast<TUint32>(
- IntegerSettingValue( ECamSettingItemDefaultAlbumId ));
- iImageSaveActive->SetAddImageToAlbum( value == ECamSettYes,
- defaultAlbumId );
-
- // Ensure that the navipane is upto date with the current save location.
- if ( !aIsEmbedded )
- {
- NotifyControllerObservers( ECamEventAudioMuteStateChanged );
- NotifyControllerObservers( ECamEventVideoQualityChanged );
- }
- NotifyControllerObservers( ECamEventSaveLocationChanged );
- NotifyControllerObservers( ECamEventVideoStabChanged );
- if ( iConfigManager && iConfigManager->IsLocationSupported() )
- {
- NotifyControllerObservers( ECamEventLocationSettingChanged );
- }
- NotifyControllerObservers( ECamEventVideoFileTypeChanged );
- NotifyControllerObservers( ECamEventImageQualityChanged );
- NotifyControllerObservers( ECamEventContAFStateChanged );
- PRINT(_L("Camera <= CCamAppController::LoadStaticSettingsL" ))
- OstTrace0( CAMERAAPP_PERFORMANCE_DETAIL, DUP1_CCAMAPPCONTROLLER_LOADSTATICSETTINGSL, "e_CCamAppController_LoadStaticSettingsL 0" );
- }
-
-
-// ---------------------------------------------------------------------------
-// DynamicSettingDefaultValue
-// Get the setting default value.
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::DynamicSettingDefaultValue( TInt aSettingId ) const
- {
- return iSettingsModel->DynamicSettingDefaultValue( aSettingId );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetDynamicSettingsToDefaults
-// Sets all dynamic settings to their defaults.
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetDynamicSettingsToDefaults()
- {
- iSettingsModel->SetDynamicSettingsToDefaults();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetDynamicSettingsToDefaults
-// Sets a dynamic setting to its default.
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetDynamicSettingToDefault(TInt aSettingItem)
- {
- iSettingsModel->SetDynamicSettingToDefault(aSettingItem);
- }
-
-// ---------------------------------------------------------------------------
-// SetDynamicSettingToSceneDefaultL
-//
-// Set the dynamic setting identified by aSettingId to scene default.
-// Because video and photo scenes can have sama identifiers, aVideoScene
-// is needed to decide which ones to look for.
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::SetDynamicSettingToSceneDefaultL( TInt aSceneId,
- TInt aSceneField,
- TInt aSettingId,
- TBool aVideoScene )
- {
- return iSettingsModel->SetDynamicSettingToSceneDefaultL( aSceneId,
- aSceneField,
- aSettingId,
- aVideoScene );
- }
-
-
-
-
-#ifdef PRODUCT_USES_GENERIC_SETUP_INDICATOR
-// ---------------------------------------------------------------------------
-// CCamAppController::VideoSceneDefaultsAreSet
-// Returns whether the video setup settings are set to the defaults
-// for its current scene.
-// ---------------------------------------------------------------------------
-//
-TBool
-CCamAppController::VideoSceneDefaultsAreSet()
- {
- return iSettingsModel->VideoSceneDefaultsAreSet();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::PhotoSceneDefaultsAreSet
-// Returns whether the photo setup settings are set to the defaults
-// for its current scene.
-// ---------------------------------------------------------------------------
-//
-TBool
-CCamAppController::PhotoSceneDefaultsAreSet()
- {
- return iSettingsModel->PhotoSceneDefaultsAreSet();
- }
-
-#endif // PRODUCT_USES_GENERIC_SETUP_INDICATOR
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CurrentFullFileName
-// ---------------------------------------------------------------------------
-//
-const TDesC&
-CCamAppController::CurrentFullFileName() const
- {
- PRINT1( _L("Camera => CCamAppController::CurrentFullFileName, index:%d"), iCurrentImageIndex );
- const TDesC& name( BurstCaptureArray()->FileName( iCurrentImageIndex ) );
-
- if( name != KNullDesC )
- {
- PRINT1( _L("Camera <= CCamAppController::CurrentFullFileName, return:[%S]"), &name );
- }
- else
- {
- PRINT( _L("Camera <= CCamAppController::CurrentFullFileName, name not set.") );
- }
- return name;
- }
-
-const TDesC&
-CCamAppController::CurrentVideoFileName() const
- {
- return iSuggestedVideoPath;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CCamAppController
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// ---------------------------------------------------------------------------
-//
-CCamAppController::CCamAppController()
- : iBusyFlags( EBusyNone )
- , iDiskCriticalLevel ( KErrNotFound )
- , iRamDiskCriticalLevel( KErrNotFound )
- , iImageOrientation( ECamOrientation0 )
- , iLastImageOrientation( ECamOrientation0 )
- , iPendingHdmiEvent( ECamHdmiNoEvent )
- {
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ConstructL
-// Symbian 2nd phase constructor can leave.
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::ConstructL()
- {
- PRINT( _L("Camera => CCamAppController::ConstructL"));
- iPendingAFRequest=0;
- iCurrentAFRequest=0;
- iNoBurstCancel=EFalse;
-
- PRINT( _L("Camera <> CCamAppController::ConstructL - constructing Configuration Manager"));
- iConfiguration = CCamConfiguration::NewL();
-
-
- CCamFolderUtility::ResetCounters( iMonthFolderCounters );
- iCaptureKeyPressedWhileImageSaving = EFalse;
-
- iCaptureModeTransitionInProgress = ETrue;
-
- iSettingsModel = CCamSettingsModel::NewL( *iConfiguration );
- iSettingsModel->AttachObserverL( this );
-
- // Get the config pointer from settings model
- iConfigManager = static_cast<CCamSettingsModel*>(iSettingsModel)->UiConfigManagerPtr();
-
- RArray<TInt> supportedValues;
- CleanupClosePushL( supportedValues );
-
- // Get the EV slider info
- // these values should be read before camsettingsprovided is constructd
- // as the EV step value is needed during the construction of camsettingsprovider.
- iConfigManager->SupportedEVSettingsL( supportedValues );
-
- if ( supportedValues.Count() > 0 )
- {
- iEvRange.iMinValue = supportedValues[0];
- iEvRange.iMaxValue = supportedValues[1];
- iEvRange.iStepsPerUnit = supportedValues[2];
- }
-
- CleanupStack::PopAndDestroy( &supportedValues );
-
- // The Settings Model handles the previews at the moment
- iSettingsPreviewHandler = static_cast<CCamSettingsModel*>( iSettingsModel );
-
- //iSettingProvider = CCamConstantSettingProvider::NewL( *this );
- iSettingProvider = CCamSettingProvider::NewL( *this, iSettingsModel );
-
- iDeepSleepTimer = CCamTimer::NewL( KDeepSleepTimeout,
- TCallBack( CCamAppController::DeepSleepTimeout, this ) );
-
- iIdleTimer = CCamTimer::NewL( KIdleTimeout,
- TCallBack( CCamAppController::IdleTimeoutL, this ) );
- iImageSaveActive = CCamImageSaveActive::NewL( *this , *this );
- iCaptureArray = CCamBurstCaptureArray::NewL( *iImageSaveActive );
- iRotationArray = CCamBurstCaptureArray::NewL( *iImageSaveActive );
- iSnapShotRotator = CCamSnapShotRotator::NewL( *this );
- iSequenceFilenameArray = new( ELeave ) CDesCArraySeg( KTimelapseArrayGranularity );
- iSoundPlayer = CCamAudioPlayerController::NewL( *this, *this );
-
- if ( iConfigManager && iConfigManager->IsLensCoverSupported() )
- {
- // create property watcher for slide state
- PRINT( _L("Camera <> CCamAppController: Define Camera slider P&S key..") );
-
- // Whole slider position reading could be removed after PCFW has implemented
- // creation for KLensCoverStatus key
- TInt sliderPosition;
- TInt err = RProperty::Get(
- CameraPlatPSKeys::KPSCameraPlatUid,
- CameraPlatPSKeys::KLensCoverStatus,
- sliderPosition );
-
-
- if( err != KErrNone )
- {
- iSlideStateWatcher = CCamPropertyWatcher::NewL( *this,
- NMusResourceApi::KCategoryUid,
- NMusResourceApi::KCameraAvailability );
- }
- else
- {
- iSlideStateWatcher = CCamPropertyWatcher::NewL( *this,
- CameraPlatPSKeys::KPSCameraPlatUid,
- CameraPlatPSKeys::KLensCoverStatus );
- }
- }
-
- if ( iConfigManager && iConfigManager->IsKeyLockWatcherSupported() )
- {
- iKeyLockStatusWatcher = CCamPropertyWatcher::NewL( *this,
- KPSUidAvkonDomain,
- KAknKeyguardStatus );
- // request notifications about key lock status
- iKeyLockStatusWatcher->Subscribe();
- }
-
- iProfileStatusWatcher = CCamPropertyWatcher::NewL( *this,
- KPSUidProfileEngine,
- KProEngActiveProfileChanged );
- // request notifications about profile status
- iProfileStatusWatcher->Subscribe();
- IsProfileSilent();
-
- // read central repository value indicating whether camera shutter sound
- // should be played always or depending on the current profile setting
- CRepository* cr = CRepository::NewLC( KCRUidCamcorderFeatures );
- TInt value;
- TInt err;
- User::LeaveIfError( cr->Get( KCRCamShutterSound, value ) );
- CleanupStack::PopAndDestroy( cr );
- iShutterSndAlwaysOn = value;
-
- // get data for monitoring free RAM during sequence capture
- CamUtility::GetPsiInt( ECamPsiSnapshotSize, iSnapshotDataSize );
-
- iConfiguration->GetPsiIntArrayL( ECamPsiJpegDataSizes, iJpegDataSizes );
- iConfiguration->GetPsiIntArrayL( ECamPsiSequencePostProcessDataSizes,
- iSequencePostProcessDataSizes );
-
- if ( iConfigManager && iConfigManager->IsCaptureToneDelaySupported() )
- {
- TInt captureToneDelay = iConfigManager->CaptureToneDelay();
- TCallBack captureToneCb( CCamAppController::CaptureToneDelayTimeout, this );
- iCaptureToneDelayTimer =
- CCamTimer::NewL( captureToneDelay * KMicroSecsInMilliSec,
- captureToneCb );
- }
-
- PRINT( _L("Camera <> CCamAppController: Define Camera focused P&S key..") );
- err = RProperty::Define( KPSUidCamcorderNotifier,
- KCCorFocused,
- RProperty::EInt );
- if ( KErrNone != err )
- {
- // Error handling. Remove warning.
- }
-
- if ( iConfigManager && iConfigManager->IsPublishZoomStateSupported() )
- { // Publish zoom state
- iContextFwClient = CCFClient::NewL( *this );
-
- // Defining the context using the Context Framework.
- err = iContextFwClient->DefineContext(
- KCamContextSource,
- KCamContextType,
- KCamContextSecurity );
- if( KErrNone == err )
- {
- iDefineContextSuccessful = ETrue;
- PublishZoomStateL( EFalse );
- }
- else
- {
- // We make sure that we dont proceed with publishing the zoom state
- // if the context definition fails.
- iDefineContextSuccessful = EFalse;
- }
- } // Publish zoom state
-
- iLocationTrailStarted = EFalse;
-
- CamUtility::GetPsiInt( ECamPsiMaxBurstCapture, iLongSequenceLimit );
-
- User::LeaveIfError( iFs.Connect() );
- iDriveChangeNotifier = CCamDriveChangeNotifier::NewL( iFs, *this );
-
- iTvAccessoryMonitor = CCamTvAccessoryMonitor::NewL( this );
- iTvAccessoryMonitor->StartListeningL();
-
- PRINT( _L("Camera <= CCamAppController::ConstructL"));
- }
-
-
-
-/*
-* CCamAppController::PublishZoomStateL
-*/
-void CCamAppController::PublishZoomStateL( const TBool aEnabled )
- {
- // We publish the zoom state only when context definition is
- // successful. the value of the zoom state is controlled by the
- // boolean flag "aEnabled".
- if ( iConfigManager && iConfigManager->IsPublishZoomStateSupported() )
- {
- if ( iDefineContextSuccessful )
- {
- CCFContextQuery* query = CCFContextQuery::NewLC();
- query->SetSourceL( KCamContextSource );
- query->SetTypeL( KCamContextType );
- RContextObjectArray result;
- TInt err = iContextFwClient->RequestContext( *query, result );
- if( err == KErrNone && result.Count() > 0 )
- {
- if ( aEnabled )
- {
- result[0]->SetValueL( KCamContextValueEnable );
- }
- else
- {
- result[0]->SetValueL( KCamContextValueDisable );
- }
- TInt err = iContextFwClient->PublishContext( *result[0] );
- if ( err != KErrNone )
- {
- // Define how to handle the error case.
- }
- }
- else
- {
- // ignoring the error case.
- }
- result.ResetAndDestroy();
- CleanupStack::PopAndDestroy( query );
- }
- }
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsViewFinding
-// Check if viewfinder is active
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsViewFinding() const
- {
- __ASSERT_DEBUG( iCameraController, CamPanic( ECamPanicInvalidState ) );
- return ( iCameraController
- && iCameraController->ViewfinderState() == ECamTriActive );
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::NotifyControllerObservers
-// Notify the controller observers that a new controller event has occurred
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController
-::NotifyControllerObservers( TCamControllerEvent aEvent,
- TInt aError ) const
- {
- PRINT( _L("Camera => CCamAppController::NotifyControllerObservers"));
- // We might need to stop notification for some time.
- if( !iMuteNotifications )
- {
- for ( TInt i = 0; i < iControllerObservers.Count(); i++ )
- {
- // NON-NULL checked when adding observers.
- // If the notification leaves, continue for the other observers
- TRAP_IGNORE( iControllerObservers[i]->HandleControllerEventL( aEvent, aError ) )
- }
- }
- PRINT( _L("Camera <= CCamAppController::NotifyControllerObservers"));
- }
-
-
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController
-::EnterViewfinderMode( const TCamCameraMode& aMode )
- {
- PRINT( _L("Camera => CCamAppController::EnterViewfinderMode"));
-
- TInt error( KErrNone );
- iPendingRelease = EFalse;
-
- // start monitoring mmc dismount notifications
- StartDismountMonitoring();
-
- if ( iConfigManager && iConfigManager->IsPublishZoomStateSupported() )
- {
- TRAP_IGNORE ( PublishZoomStateL( ETrue ) );
- }
-
- // Clear these just in case some video prepare is pending.
- iVideoPrepareNeeded = EFalse;
-
-
- if( ECamControllerVideo == aMode )
- {
- // Filename generation needs to be done in all case, not only
- // when the current path is null.
- // if( KNullDesC() == iSuggestedVideoPath )
- {
- TRAP_IGNORE( GenerateNextValidVideoPathL() );
- }
-
- // Clear this to be sure it doesn't block recording
- iVideoRequested = EFalse;
- SetTargetMode ( ECamControllerVideo );
- SetTargetImageMode( ECamImageCaptureNone );
- // shutdown the orientation channel when going to videomode
- if ( iConfigManager && iConfigManager->IsOrientationSensorSupported() )
- {
- TRAP_IGNORE( UpdateSensorApiL( EFalse ) );
- }
- }
- else if( ECamControllerImage == aMode )
- {
- SetTargetMode ( ECamControllerImage );
-// SetTargetImageMode( ECamImageCaptureSingle );
- SetTargetImageMode( CurrentImageModeSetup() );
- }
- else
- {
- SetOperation( ECamStandby, KErrGeneral );
- return;
- }
-
- iInfo.iTargetVfState = ECamTriActive;
- if( !Busy() )
- {
- TRAP( error, IssueModeChangeSequenceL() );
- if ( KErrNone != error
- && ECamStandby != iInfo.iOperation )
- {
- SetOperation( ECamStandby, error );
- }
- }
- else
- {
- // operation will continue when busy sequence or request completes
- }
- PRINT( _L("Camera <= CCamAppController::EnterViewfinderMode"));
- }
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::ExitViewfinderMode( const TCamCameraMode& aMode )
- {
- PRINT( _L("Camera => CCamAppController::ExitViewfinderMode"));
- // The check here is to ensure that the viewfinder isn't stopped by the still precapture
- // view when it has just lost the foreground to the video precapture view and vice versa.
- // In that case the mode in parameter would not match the target mode.
- if( iInfo.iOperation != ECamStandby )
- {
- if ( aMode == iInfo.iTargetMode )
- {
- iInfo.iTargetVfState = ECamTriIdle;
- SetTargetImageMode( ECamImageCaptureNone );
-
- if( !Busy() )
- {
- if ( iConfigManager && iConfigManager->IsPublishZoomStateSupported() )
- {
- TRAP_IGNORE ( PublishZoomStateL( EFalse ) );
- }
- TRAPD( error, IssueDirectRequestL( ECamRequestVfRelease ) );
- if ( KErrNone != error
- && ECamStandby != iInfo.iOperation )
- {
- SetOperation( ECamStandby, error );
- }
- }
- else
- {
- // operation will continue when busy sequence or request completes
- }
- }
- }
- PRINT( _L("Camera <= CCamAppController::ExitViewfinderMode"));
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StartViewFinder();
-// Non-leaving version of StartViewFinderL()
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::StartViewFinder()
- {
- PRINT( _L("Camera => CCamAppController::StartViewFinder" ))
- iInfo.iTargetVfState = ECamTriActive;
-
- if( !Busy() )
- {
- OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAPPCONTROLLER_STARTVIEWFINDER, "e_CAM_APP_VF_INIT 0" ); //CCORAPP_APP_VF_INIT_END
-
- TRAPD( error, IssueDirectRequestL( ECamRequestVfStart ) );
- if ( KErrNone != error
- && ECamStandby != iInfo.iOperation )
- {
- PRINT( _L("Camera <> CCamAppController::StartViewFinder - [ERROR] VF start failed, go to standby" ))
- SetOperation( ECamStandby, error );
- }
- }
- else
- {
- // Vf started at earliest convenient time when ongoing requests finish.
- }
- PRINT(_L("Camera <= CCamAppController::StartViewFinder") );
- }
-
-// ---------------------------------------------------------------------------
-// StopViewFinder
-// Stop the viewfinder immediately
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::StopViewFinder()
- {
- PRINT( _L("Camera => CCamAppController::StopViewFinderNow" ) )
- __ASSERT_DEBUG( iCameraController, CamPanic( ECamPanicInvalidState ) );
-
- OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAPPCONTROLLER_STOPVIEWFINDER, "e_CAM_APP_STOP_VF 1" ); //CCORAPP_STOP_VF_START
-
- if ( iBacklightTimer && iBacklightTimer->IsActive() )
- {
- iBacklightTimer->Cancel();
- }
-
- // Only stop if active.
- // Idle and inactive need no action at this point.
- if( ECamTriActive == iCameraController->ViewfinderState() )
- {
- iInfo.iTargetVfState = ECamTriInactive;
-
- // Can only fail to OOM when state is checked.
- TRAPD( error, iCameraController->DirectRequestL( ECamRequestVfStop ) );
- if( KErrNone != error
- && ECamStandby != iInfo.iOperation )
- {
- SetOperation( ECamStandby, error );
- }
- }
-
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP1_CCAMAPPCONTROLLER_STOPVIEWFINDER, "e_CAM_APP_STOP_VF 0" ); //CCORAPP_STOP_VF_END
-
- PRINT( _L("Camera <= CCamAppController::StopViewFinderNow" ) )
- }
-
-// ---------------------------------------------------------------------------
-// StopViewFinderEcam
-// Stop the viewfinder immediately without changing states
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::StopViewFinderEcam()
- {
- PRINT( _L("Camera => CCamAppController::StopViewFinderEcam" ) )
- __ASSERT_DEBUG( iCameraController, CamPanic( ECamPanicInvalidState ) );
-
- OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAPPCONTROLLER_STOPVIEWFINDERECAM, "e_CAM_APP_STOP_VF 1" ); //CCORAPP_STOP_VF_START
-
- // Trap and ignore error
- TRAP_IGNORE( iCameraController->DirectRequestL( ECamRequestVfStopEcam ) );
-
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP1_CCAMAPPCONTROLLER_STOPVIEWFINDERECAM, "e_CAM_APP_STOP_VF 0" ); //CCORAPP_STOP_VF_END
-
- PRINT( _L("Camera <= CCamAppController::StopViewFinderEcam" ) )
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::FreezeViewFinder
-// Copy the next viewfinder frame then stop the viewfinder
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::FreezeViewFinder( TBool aFreeze )
- {
- // If the viewfinder needs to freeze
- if ( aFreeze )
- {
- PERF_MESSAGE_L2( EPerfMessagePausingViewFinder );
- iFreezeViewFinder = ETrue;
- iUpdateFrozenFrame = ETrue;
- }
- // Restarting the viewfinder
- else
- {
- iFreezeViewFinder = EFalse;
- iUpdateFrozenFrame = EFalse;
- if ( ECamTriActive != iCameraController->ControllerInfo().iVfState )
- {
- StartViewFinder();
- }
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetKeyUp
-// Set iKeyUP value which is used to determine if burst
-// timer should be activated or not
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetKeyUp( TBool aValue /*= EFalse*/ )
- {
- PRINT1(_L("Camera => CCamAppController::SetKeyUp, iKeyUP=%d"), aValue );
- iKeyUP=aValue;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DoCaptureL
-// Initiate image capture
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::DoCaptureL()
- {
- PRINT( _L("Camera => CCamAppController::DoCaptureL()"));
- PRINT2(_L("Camera <> mode[%s] imagemode[%s]"), KCamModeNames[iInfo.iMode], KCamImageModeNames[iInfo.iImageMode] );
-
- // ReleaseArray();
- if( iImageSaveActive->Count() <= 0 )
- {
- ReleaseArray( ETrue );
- }
- iCurrentImageIndex = 0;
- iArrayUsageCount = KImageArrayUsers;
-
- iCameraWoken = EFalse;
-
- TBool continueWithCapture = ETrue;
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
-
- // Cancel capture if there are settings pending
- if ( IsFlagOn( iBusyFlags, EBusySetting ) )
- {
- continueWithCapture = EFalse;
- }
-
- switch( iInfo.iImageMode )
- {
- // -----------------------------------------------------
- // Burst capture
- case ECamImageCaptureBurst:
- {
- PRINT( _L("Camera <> CCamAppController::DoCaptureL .. case ECamImageCaptureBurst") );
- /*
- TCamPhotoSizeId sizeId( GetCurrentImageResolution() );
-
- TInt memoryNeed( iJpegDataSizes[sizeId]
- + iSequencePostProcessDataSizes[sizeId]
- + iSnapshotDataSize );
- TInt memoryFree( 0 );
- HAL::Get( HALData::EMemoryRAMFree, memoryFree ); // error ignored
-
- if( memoryFree < memoryNeed )
- {
- PRINT( _L( "Camera <> Not enough memory for more burst captures - complete capture" ) );
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- // Force re-prepare of engine
- appUi->HandleCommandL( ECamCmdSequence );
-
- // Display out of memory note
- NotifyControllerObservers( ECamEventSnapshotReady, KErrNoMemory );
-
- // Return app to burst precapture state from burst in-capture
- SetOperation( ECamNoOperation );
- NotifyControllerObservers( ECamEventCaptureComplete );
-
- // Force update of UI furniture
- NotifyControllerObservers( ECamEventCounterUpdated );
- appUi->UpdateCba();
-
- iCaptureRequested = EFalse;
- HandleCaptureCompletion();
- continueWithCapture = EFalse;
- }
- else
- {
- iSequenceCaptureInProgress = ETrue;
- iActualBurstCount = 0;
- FreezeViewFinder( ETrue );
- // Stop the screensaver from coming on when burst mode is active
- EnableScreenSaver( EFalse );
- // Make navi counter update itself
- NotifyControllerObservers( ECamEventCounterUpdated );
- }
- */
-
- if( !appUi->SelfTimerEnabled() )
- {
- // Start timer to change burst mode to press and hold
- // if not determined to be short burst before that.
-
- //One such case is if capturekeyup event has occured before
- //DocaptureL method
- if( !iKeyUP && !iNoBurstCancel )
- {
- StartBurstTimerL();
- }
- }
- iSequenceCaptureInProgress = ETrue;
- iValueIsStored = EFalse;
- FreezeViewFinder( ETrue );
- EnableScreenSaver( EFalse );
- if( iBacklightTimer
- && !iBacklightTimer->IsActive() )
- {
- iBacklightTimer->Start( 0,
- KBacklighTimerInterval,
- TCallBack( ResetInactivityTimer, this ) );
- }
- NotifyControllerObservers( ECamEventCounterUpdated );
-
- break;
- }
- // -----------------------------------------------------
- // Timelapse capture
- case ECamImageCaptureTimeLapse:
- {
- PRINT( _L("Camera <> CCamAppController::DoCaptureL .. case ECamImageCaptureTimeLapse") );
- iSequenceCaptureInProgress = ETrue;
- // Stop the screensaver from coming on when burst mode is active
- EnableScreenSaver( EFalse );
-
- // Get the remaining image count and only start the timer for the next capture if there is enough
- // space, taking into account that the current capture will also use up one image
- TCamMediaStorage storage( (TCamMediaStorage)IntegerSettingValue( ECamSettingItemPhotoMediaStorage ) );
- TCamPhotoSizeId sizeId ( GetCurrentImageResolution() );
-
- TInt remainingCount = ImagesRemaining( storage, ETrue, sizeId );
-
- // Check if the advanced sequence is limited (by starting from selftimer)
- if( remainingCount >= 1
- && iRequestedCaptureCount <= TimeLapseImageCount()+1 )
- {
- iCompleteTimeLapsePending = ETrue;
- }
-
- // if there isn't space for this capture (e.g. some memory has been used since the timer was initiated
- // or there isn't enough space to initiate a further capture
- else if ( remainingCount <= 1 )
- {
- PRINT( _L("Camera <> CCamAppController::DoCaptureL .. only space for one capture, stop timer") );
-
- // The timer is no longer needed
- if ( iTimeLapseTimer )
- {
- iTimeLapseTimer->Cancel();
- delete iTimeLapseTimer;
- iTimeLapseTimer = NULL;
- }
- // if there isn't even enough space for this capture
- if ( remainingCount < 1 )
- {
- // complete the timelapse capture now (prevent the current capture from starting)
- continueWithCapture = EFalse;
- iArrayUsageCount = 0;
- CompleteTimeLapseOperation();
- }
- else // if there isn't enough space to initiate a further capture
- {
- // ensure that the time lapse capture completes after the current capture
- iCompleteTimeLapsePending = ETrue;
- }
- }
-
- else // there is space to initiate a further capture
- {
- PRINT( _L("Camera <> CCamAppController::DoCaptureL .. space for more than this capture, timer set on..") );
- if ( !iTimeLapseTimer )
- {
- RestartTimeLapseTimerL();
-
- //Products which support autofocus needs to reduce time for second picture
- //about the time needed by autofocus.
- if( iConfigManager && iConfigManager->IsAutoFocusSupported()
- && !CurrentSceneHasForcedFocus() )
- {
- iTimeLapseStartTime = iTimeLapseStartTime - TTimeIntervalSeconds( KFocusingDurationSeconds );
- }
- }
- }
- break;
- }
- // -----------------------------------------------------
- // Single capture
- case ECamImageCaptureSingle:
- PRINT( _L("Camera <> CCamAppController::DoCaptureL .. case ECamImageCaptureSingle") );
- // Should not take so long to get the image captured and saved,
- // but
- EnableScreenSaver( EFalse );
- SetCaptureKeyPressedWhileImageSaving(EFalse);
- break;
- // -----------------------------------------------------
- default:
- PRINT(_L("Camera <> Not in any image capture mode, LEAVE!!"));
- User::Leave( KErrGeneral );
- break;
- // -----------------------------------------------------
- }
-
- if ( continueWithCapture )
- {
- IssueRequestL( ECamRequestImageCapture );
- // Operation in progress is updated in HandleCameraEventL
- // store the orientation at capture time, needed in thumbnail creation
- iCaptureOrientation = iLastImageOrientation;
- }
-
- iCaptureStoppedForUsb = EFalse;
- PRINT( _L("Camera <= CCamAppController::DoCaptureL()"));
- return continueWithCapture;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DoRecord
-// Initiate video recording
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::DoRecord()
- {
- PRINT( _L("Camera => CCamAppController::DoRecord") );
- __ASSERT_DEBUG( iCameraController, CamPanic( ECamPanicInvalidState ) );
-
- StopIdleTimer();
-
- // No key sounds when recording
- TRAP_IGNORE( iSoundPlayer->DisableAllKeySoundsL() );
-
- PRINT( _L("Camera <> Requesting video capture start..") );
- TRAPD( error, IssueRequestL( ECamRequestVideoStart ) );
- PRINT1( _L("Camera <> ..request issued, status:%d"), error );
-
- if( KErrNone != error ) SetOperation( ECamStandby, error );
- else SetOperation( ECamCapturing );
-
- // Request is handled
- iVideoRequested = EFalse;
-
- iCaptureStoppedForUsb = EFalse;
- PRINT( _L("Camera <= CCamAppController::DoRecord") );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ReserveFileNamesL
-// Reserve a set of filenames for a burst capture
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::ReserveFileNamesL(
- const TCamCameraMode& aCaptureMode,
- const TCamImageCaptureMode& aImageMode,
- TBool aForcePhoneMem /*= EFalse*/ )
- {
- PRINT( _L("Camera => CCamAppController::ReserveFileNamesL") )
- TInt captureCount = 1;
- TInt store = ECamMediaStorageNone;
- TBuf<KMaxExtension> extension;
-
- // If the next file will be a photo
- if ( ECamControllerImage == aCaptureMode )
- {
- extension = KImageExtension;
- }
- // Otherwise the next file will be a video
- else
- {
-#ifndef __WINS__
- TCamVideoFileType fileType = static_cast<TCamVideoFileType>
- ( IntegerSettingValue( ECamSettingItemVideoFileType ) );
-
- extension = ( ECamVideoMpeg4 == fileType )
- ? KVideoMP4Extension
- : KVideo3GPExtension;
-#else
- extension = KVideo3GPExtension;
-#endif
- }
-
- store = ( ECamControllerImage == aCaptureMode ) ?
- CurrentPhotoStorageLocation() : CurrentVideoStorageLocation();
-
- TPath basePath;
-
- // Take a snapshot of the date - to ensure a sequence on a date boundary isn't split into
- // different months
- TTime now;
- now.HomeTime();
- // Need to check that there is enough space for the files. If this is a sequence of 20 images or
- // less then ensure there is enough space in the current folder, otherwise only one space is needed
- TInt guaranteedGroup = 1;
- if ( captureCount < CCamFolderUtility::KMaxGuaranteedBurstGroup )
- {
- guaranteedGroup = captureCount;
- }
-
- // Leaves if errors generating the path
- CCamFolderUtility::GetBasePathL( iMonthFolderCounters,
- store,
- basePath,
- aCaptureMode,
- ETrue,
- guaranteedGroup,
- now );
-
- iCurrentStorage = static_cast<TCamMediaStorage>( store );
-// TInt numberSettingId( KErrNotFound );
- TInt typeSettingId( KErrNotFound );
- TInt baseSettingId( KErrNotFound );
- TInt counter( 0 );
-
- if( ECamControllerVideo == aCaptureMode )
- {
-// numberSettingId = ECamSettingItemVideoNumber;
- counter = IntegerSettingValue( ECamSettingItemVideoNumber );
- typeSettingId = ECamSettingItemVideoNameBaseType;
- baseSettingId = ECamSettingItemVideoNameBase;
- }
- else
- {
-// numberSettingId = ECamSettingItemPhotoNumber;
- counter = iImageNumberCache;
- typeSettingId = ECamSettingItemPhotoNameBaseType;
- baseSettingId = ECamSettingItemPhotoNameBase;
- }
-
-// TInt counter( IntegerSettingValue( numberSettingId ) );
- TBuf<KCamMaxDateLen> dateNameBase;
- TPtrC nameBase;
- if ( ECamNameBaseDate == iSettingsModel->IntegerSettingValue( typeSettingId ) )
- {
- CamUtility::FormatDateFileNameL( dateNameBase );
- nameBase.Set( dateNameBase );
- }
- else
- {
- nameBase.Set( TextSettingValue( baseSettingId ) );
- }
-
- RFs rfs;
- User::LeaveIfError( rfs.Connect() );
- CleanupClosePushL( rfs );
-
- TEntry entry;
-
- TInt namedImages = 0;
- while ( namedImages < captureCount )
- {
- // Generate new name
- TFileName newFileName;
-
- CamUtility::FormatFileName( counter, nameBase, newFileName );
-
- TFileName newPath( basePath );
- newPath.Append( newFileName );
- newPath.Append( extension );
-
- // if there is no file in the current location with this name
- TEntry entry; // Prevent LINT error
- TInt ferr = rfs.Entry( newPath, entry );
- if ( KErrNotFound == ferr )
- {
- // A file with that name was not found, so the filename is okay.
- PRINT( _L("Camera <> Filename OK.") )
- namedImages++;
- StoreNextFileNameL( newPath );
-
- // If this is time lapse capture then the full set of file names
- // will be needed for the 'delete sequence' option. The burst capture array
- // in timelapse only holds data for one item at a time so a separate array
- // is used to keep track of all the images file names. The redundancy in filename
- // storage is limited to a single file name.
- if ( ECamImageCaptureTimeLapse == aImageMode )
- {
- TRAP_IGNORE( iSequenceFilenameArray->AppendL( newPath ) );
- // Update the images captured count
- NotifyControllerObservers( ECamEventCounterUpdated );
- }
- counter++;
- }
- else if ( KErrNone == ferr )
- {
- // A file with that name exists already. Increment the counter and try again.
- PRINT( _L("Camera <> Filename already in use!") )
- counter++; // Try the next index number
- }
- else
- {
- // There was some other error. Can not save file -> Leave.
- PRINT1( _L("Camera <> File server returned error: %d"), ferr );
- User::Leave( ferr );
- }
-
- }
- CleanupStack::PopAndDestroy( &rfs );
-
- // SetIntegerSettingValueL( numberSettingId, counter );
- if( ECamControllerVideo == aCaptureMode )
- {
- SetIntegerSettingValueL( ECamSettingItemVideoNumber, counter );
- }
- else
- {
- // SetIntegerSettingValueL called when capture ends.
- iImageNumberCache = counter;
- }
-
- PRINT( _L("Camera <= CCamAppController::ReserveFileNamesL") )
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CreateDummyFileL
-// Create dummy file ready for image storage
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::CreateDummyFileL( RFs& aFs, const TDesC& aFullPath )
- {
- PRINT1( _L("Camera => CCamAppController::CreateDummyFileL [%S]"), &aFullPath );
- RFile file;
- CleanupClosePushL( file );
-
- TInt err = file.Create( aFs, aFullPath, EFileWrite );
- if ( err == KErrNone )
- {
- // Still image files are made writable and non-hidden
- // just before the save operation
- // file is set to hidden so that media gallery does not detect it
- file.SetAtt( KEntryAttReadOnly|KEntryAttHidden, 0 );
- }
-
- CleanupStack::PopAndDestroy( &file );
-
- PRINT1( _L("Camera <= CCamAppController::CreateDummyFileL, status:%d"), err );
- return err;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StoreNextFileNameL
-// Add newly generated filename to array of names
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::StoreNextFileNameL( const TDesC& aFullPath )
- {
- PRINT( _L("Camera => CCamAppController::StoreNextFileNameL") );
- TParse parse;
- parse.Set( aFullPath, NULL, NULL );
-
- // Store the path + filename and plain filename for future reference
- if( ECamControllerVideo == iInfo.iMode && BurstCaptureArray()->Count() > 0 )
- {
- BurstCaptureArray()->SetNameL( aFullPath, parse.Name(), 0 );
- }
- else
- {
- BurstCaptureArray()->SetNextNameL( aFullPath, parse.Name() );
- }
-
- PRINT( _L("Camera <= CCamAppController::StoreNextFileNameL") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::GenerateNextVideoFilePathL
-// Generate a new file name and full path to save the next
-// video
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::GenerateNextVideoFilePathL( TBool aForcePhoneMem )
- {
- PRINT1( _L( "Camera => CCamAppController::GenerateNextVideoFilePathL, force phone mem:%d" ), aForcePhoneMem )
- if( aForcePhoneMem )
- {
- ForceUsePhoneMemoryL( ETrue );
- }
- TInt store = IntegerSettingValue( ECamSettingItemVideoMediaStorage );
-
- TBuf<KMaxExtension> extension;
-
-#ifdef __WINS__
- extension = KVideo3GPExtension;
-#else
- // If the video file type is MP3, then display this icon.
- TCamVideoFileType fileType =
- static_cast<TCamVideoFileType>(
- IntegerSettingValue( ECamSettingItemVideoFileType ) );
-
- extension = (fileType == ECamVideoMpeg4)
- ? KVideoMP4Extension
- : KVideo3GPExtension;
-#endif
-
- TBuf<KCamMaxDateLen> dateNameBase;
- TPtrC baseVideoName;
-
- if ( iSettingsModel->IntegerSettingValue(
- ECamSettingItemVideoNameBaseType ) == ECamNameBaseDate )
- {
- CamUtility::FormatDateFileNameL( dateNameBase );
- baseVideoName.Set( dateNameBase );
- }
- else
- {
- baseVideoName.Set( TextSettingValue( ECamSettingItemVideoNameBase ) );
- }
-
- TFileName nextFileName( baseVideoName );
-
- store = ( ECamControllerImage == iInfo.iMode ) ?
- CurrentPhotoStorageLocation() : CurrentVideoStorageLocation();
-
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
-
- if ( IsAppUiAvailable() &&
- appUi &&
- appUi->IsMemoryFullOrUnavailable( ECamMediaStorageCard ) &&
- ECamMediaStorageCard == store )
- {
- if ( ExistMassStorage() )
- {
- // with multiple drives, the mass memory is the default
- PRINT( _L("Camera <> Force ECamMediaStorageMassStorage") );
- store = ECamMediaStorageMassStorage;
- }
- else
- {
- PRINT( _L("Camera <> Force ECamMediaStoragePhone") );
- store = IntegerSettingValue(ECamSettingItemRemovePhoneMemoryUsage)?
- ECamMediaStorageNone:
- ECamMediaStoragePhone;
- }
- }
-
- TInt fileNameCounter = IntegerSettingValue( ECamSettingItemVideoNumber );
-
- // Update contents of iSuggestedVideoPath (drive and folders only)
- CCamFolderUtility::GetBasePathL( iMonthFolderCounters,
- store,
- iSuggestedVideoPath,
- ECamControllerVideo,
- ETrue );
-
- iCurrentStorage = static_cast<TCamMediaStorage>( store );
- // Update contents of iSuggestedVideoPath (appending filename and extension)
- CamUtility::GetUniqueNameL( iSuggestedVideoPath, nextFileName, fileNameCounter, extension );
- PRINT( _L( "Camera <= CamAppController::GenerateNextVideoFilePathL" ) )
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::GenerateNextValidVideoPathL
-// Generate a new file name and full path to save the next video.
-// If the generated file (using settings to suggest the drive) can not be opened
-// try again, forcing the file to be on C: instead.
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::GenerateNextValidVideoPathL()
- {
- PRINT( _L("Camera => CCamAppController::GenerateNextValidVideoPathL()"));
-
- // If USB is active, use phone memory
- if( CamUtility::IsUsbActive() )
- {
- GenerateNextVideoFilePathL( ETrue );
- }
- else
- {
- // Generate a file path using the settings
- TRAPD( err, GenerateNextVideoFilePathL() );
-
- // If left (possibly due to corrupt MMC), try again with phone memory
- if ( err )
- {
- // If we have got here, we can't access MMC.
- // Don't switch to phone memory, but prepare the engine with a video
- // name in phone memory. This will be reset if needed when the user actually
- // starts recording
- PRINT( _L( "Could not generate next file path! Corrupt MMC?" ) );
- GenerateNextVideoFilePathL( ETrue );
- }
- }
-
- PRINT( _L("Camera <= CCamAppController::GenerateNextValidVideoPathL()"));
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::GenerateNextValidImagesPathL
-// Generate a new path to save the next image.
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::GenerateNextValidImagesPathL()
- {
- PRINT( _L("Camera => CCamAppController::GenerateNextValidImagesPathL()"));
- // Generate a file path using the settings
- // Ensure the image folder exists
- TFileName path;
- TInt storage = IntegerSettingValue( ECamSettingItemPhotoMediaStorage );
- CCamFolderUtility::GetBasePathL( iMonthFolderCounters,
- storage,
- path,
- ECamControllerImage,
- EFalse );
-
- iCurrentStorage = static_cast<TCamMediaStorage>( storage );
- PRINT( _L("Camera <= CCamAppController::GenerateNextValidImagesPathL()"));
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CaptureModeTranstionInProgress
-// Report whather a capture mode is currently being prepared
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::CaptureModeTransitionInProgress()
- {
- PRINT1( _L("Camera => CCamAppController::CaptureModeTransitionInProgress (%d)"), iCaptureModeTransitionInProgress )
- return iCaptureModeTransitionInProgress;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandleSaveEvent
-// From MCamImageSaveObserver.
-// Handle completion of image saving
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::HandleSaveEvent( TCamSaveEvent aEvent )
- {
- PRINT3( _L( "Camera => CCamAppController::HandleSaveEvent .. event[%s] imagemode[%s] operation[%s]" ),
- KCamSaveEventNames [aEvent ],
- KCamImageModeNames [iInfo.iImageMode],
- KCamCaptureOperationNames[iInfo.iOperation] )
-
- TBool mediaFileChanged = EFalse;
-
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if( ( iCaptureArray->ImagesRemaining() <= 0 )
- && appUi
- && appUi->IsInPretendExit() )
- {
- ReleaseArray( ETrue );
- }
-
- if( ECamSaveEventCriticalError == aEvent )
- {
- PRINT( _L( "Camera <> CCamAppController::HandleSaveEvent: critical error, going to standby.." ) )
- SetOperation( ECamStandby, KErrGeneral );
- PRINT( _L( "Camera <= CCamAppController::HandleSaveEvent" ) )
- return;
- }
-
- if( aEvent == ECamSaveEventSaveError )
- {
- PRINT( _L("Camera <> CCamAppController::HandleSaveEvent - ECamSaveEventSaveError!") );
- if( iInfo.iImageMode == ECamImageCaptureBurst &&
- SequenceCaptureInProgress() )
- {
- // Cancel ongoing burst capture
- // Burst capture is normally cancelled by setting iRequestedBurstCount,
- // and actual cancelling is done when next imagedata arrives.
- // However, in this case camera is going to be released, and there won't
- // be next image data, so give ECamRequestImageCancel and capture
- // completion event here to avoid problems
- PRINT( _L("Camera <> CCamAppController::HandleSaveEvent .. Cancel burst due to error") );
- TRAP_IGNORE ( IssueDirectRequestL( ECamRequestImageCancel ) );
- NotifyControllerObservers( ECamEventCaptureComplete, KErrCancel );
- }
- else
- {
- PRINT( _L( "Camera <> CCamAppController::HandleSaveEvent: critical error, going to standby.." ) )
- SetOperation( ECamStandby, KErrGeneral );
- }
- PRINT( _L("Camera <= CCamAppController::HandleSaveEvent - ECamSaveEventSaveError!") );
- return;
- }
-
- // if a save completes
- if ( aEvent == ECamSaveEventComplete )
- {
- PRINT( _L("Camera <> CCamAppController::HandleSaveEvent .. ECamSaveEventComplete") );
-
-#ifdef CAMERAAPP_PERFORMANCE_MEASUREMENT
- if( ECamImageCaptureBurst != iInfo.iImageMode )
- {
- // Do not log in burst mode
- PERF_EVENT_END_L1( EPerfEventShotToSave );
- }
-#endif
-
- OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAPPCONTROLLER_HANDLESAVEEVENT, "e_CAM_PRI_SHOT_TO_SAVE 0" ); //CCORAPP_PRI_SHOT_TO_SAVE_END
-
- // Check that this is the completion of the last pending
- // single image save.
- // Note burst capture completion is handled separately
- TBool savedAll = ( iImageSaveActive->Count()== 0 );
- TBool completing = ( ECamCompleting == iInfo.iOperation );
-
- switch( iInfo.iImageMode )
- {
- case ECamImageCaptureNone: // In postcapture, waiting for saving
- case ECamImageCaptureSingle:
- PRINT( _L("Camera <> CCamAppController::HandleSaveEvent .. case ECamImageCaptureSingle/None") );
- if( savedAll )
- {
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP2_CCAMAPPCONTROLLER_HANDLESAVEEVENT, "e_CAM_PRI_SERIAL_SHOOTING 0" ); //CCORAPP_PRI_SERIAL_SHOOTING_END
-
- PRINT( _L("Camera <> CCamAppController::HandleSaveEvent .. calling HandleCaptureCompletion()") );
- if( !iSaveStarted )
- {
- HandleCaptureCompletion();
- NotifyControllerObservers( ECamEventCaptureComplete, KErrNone );
- }
- else
- {
- iSaveStarted = EFalse;
- }
-
- // If we have returned from postcapture to precapture before
- // the filename has been sent to the gallery (i.e. pressing back
- // key during image processing), iArrayUsageCount will be reduced
- // to zero and capture array will be released. In that case, we must
- // send the filename to gallery before it happens.
- if ( iArrayUsageCount == 1 )
- {
- NotifyControllerObservers( ECamEventMediaFileChanged );
- mediaFileChanged = ETrue;
- }
-
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if( iImageSaveActive && IsAppUiAvailable() )
- {
- if( iImageSaveActive->Count() <= 0 && ECamViewStatePostCapture != appUi->CurrentViewState() )
- {
- ReleaseArray();
- }
- }
- }
- break;
- case ECamImageCaptureTimeLapse:
- PRINT( _L("Camera <> CCamAppController::HandleSaveEvent .. case ECamImageCaptureTimeLapse") );
- // If image capture has finished, but waiting for file to be saved.
- if( ECamNoOperation == iInfo.iOperation || ECamCompleting == iInfo.iOperation )
- {
- PRINT( _L("Camera <> CCamAppController .. current file saved, complete this capture") );
- SetOperation( ECamNoOperation );
- ReleaseArray();
- }
- break;
- case ECamImageCaptureBurst:
- PRINT( _L("Camera <> CCamAppController::HandleSaveEvent .. case ECamImageCaptureBurst") );
- // After the whole burst has stopped, we get Image Stop event from Camera Controller,
- // and enter completing state.
- if( completing && savedAll )
- {
- // Modify this event to "burst complete" one.
- aEvent = ECamSaveEventBurstComplete;
- }
- break;
- default:
- break;
- }
-
- NotifyControllerObservers( ECamEventSaveComplete );
- }
-
- if ( aEvent == ECamSaveEventStarted )
- {
- if( iInfo.iImageMode == ECamImageCaptureSingle )
- {
- PRINT( _L("Camera <> CCamAppController::HandleSaveEvent .. Saving started") );
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP1_CCAMAPPCONTROLLER_HANDLESAVEEVENT, "e_CAM_APP_PREP_FOR_NEXT_SHOT 1" ); //CCORAPP_PREP_FOR_NEXT_SHOT_START
- HandleCaptureCompletion();
- NotifyControllerObservers( ECamEventCaptureComplete, KErrNone );
- iSaveStarted = ETrue;
- NotifyControllerObservers( ECamEventSaveComplete );
- iCaptureRequested = EFalse;
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP4_CCAMAPPCONTROLLER_HANDLESAVEEVENT, "e_CAM_APP_PREP_FOR_NEXT_SHOT 0" ); //CCORAPP_PREP_FOR_NEXT_SHOT_END
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP5_CCAMAPPCONTROLLER_HANDLESAVEEVENT, "e_CAM_PRI_SHOT_TO_SHOT 0" ); //CCORAPP_PRI_SHOT_TO_SHOT_END
- }
- }
-
- // If the user cancelled a save
- if ( aEvent == ECamSaveEventUserCancelled )
- {
- PRINT( _L( "Camera <> CCamAppController::HandleSaveEvent .. ECamSaveEventUserCancelled" ) )
- //iInfo.iImageMode = ECamImageModeNone;
- // Make sure that any further engine callbacks are ignored until next capture
- SetOperation( ECamNoOperation );
-
- // Delete dummy files for unsaved images
- TInt nextSavingImage = BurstCaptureArray()->NextFileIndex();
- TInt lastImage = BurstCaptureArray()->Count();
- TInt i;
- // delete the next and following files
- for ( i = nextSavingImage; i < lastImage; i++ )
- {
- SetAsCurrentImage( i );
- DeleteCurrentFile();
- }
- SetAsCurrentImage( 0 );
- // Empty out the array - this ensures the thumbnail view doesn't open
- BurstCaptureArray()->Reset();
-
- NotifyControllerObservers( ECamEventSaveCancelled );
- }
-
- // if a burst capture has completed
- if ( aEvent == ECamSaveEventBurstComplete )
- {
- CompleteBurstOperation();
-
- if( ECamCompleting == iInfo.iOperation )
- {
- PRINT( _L( "Camera <> CCamAppController::HandleSaveEvent .. completing burst capture" ) )
- SetOperation( ECamNoOperation );
- NotifyControllerObservers( ECamEventCaptureComplete, KErrNone );
- ReleaseArray();
- }
-
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP3_CCAMAPPCONTROLLER_HANDLESAVEEVENT, "e_CAM_PRI_SERIAL_SHOOTING 0" ); //CCORAPP_PRI_SERIAL_SHOOTING_END
- }
- else
- {
- if ( iImageSaveActive->Count() == 0 || aEvent == ECamSaveEventStarted )
- {
- iSaving = EFalse;
- }
- }
- if ( !mediaFileChanged )
- {
- NotifyControllerObservers( ECamEventMediaFileChanged );
- }
-
- PRINT( _L( "Camera <= CCamAppController::HandleSaveEvent" ) )
- }
-
-
-// ---------------------------------------------------------------------------
-// HandleViewfinderFrame
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::HandleViewfinderFrame( TInt /*aStatus*/,
- CFbsBitmap* /*aFrame*/ )
- {
- PRINT_FRQ( _L( "Camera => CCamAppController::HandleViewfinderFrame" ) );
-
-#ifdef CAMERAAPP_PERFORMANCE_MEASUREMENT
- // This function is called when a viewfinder bitmap arrives
- if( EPerfWaitingForStartup == iPerformanceState )
- {
- iPerformanceState = EPerfIdle;
- PERF_EVENT_END_L1( EPerfEventApplicationStartup );
- }
- else if( EPerfWaitingForStillMode == iPerformanceState )
- {
- iPerformanceState = EPerfIdle;
- PERF_EVENT_END_L1( EPerfEventSwitchToStillMode );
- }
- else if( EPerfWaitingForVideoMode == iPerformanceState )
- {
- iPerformanceState = EPerfIdle;
- PERF_EVENT_END_L1( EPerfEventSwitchToVideoMode );
- }
- else if( EPerfWaitingForBurstFrame == iPerformanceState )
- {
- iPerformanceState = EPerfIdle;
- PERF_EVENT_END_L1( EPerfEventBurstCaptureMomentToViewfinderFrame );
- }
-#endif
-
- if( ECamControllerVideo == iInfo.iMode )
- {
- // removed first vf frame usage as snapshot.
- // snapshot received now from Camera
- }
- else if( ECamControllerImage == iInfo.iMode )
- {
- // No need to duplicate here.
- }
- else
- {
- // Not valid state for vf frame.
- __ASSERT_DEBUG( EFalse, CamPanic( ECamPanicInvalidState ) );
- }
-
- if ( iZoomWaitingForCamera )
- {
- iZoomWaitingForCamera = EFalse;
- if ( iNewZoomPending )
- {
- SetZoomValue( iDesiredZoomVal );
- }
- }
- PRINT_FRQ( _L( "Camera <= CCamAppController::HandleViewfinderFrame" ) );
- }
-
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandleSnapshotEvent( TInt aStatus,
- CFbsBitmap* aBitmap )
- {
- PRINT1( _L( "Camera => CCamAppController::HandleSnapshotEvent, status:%d" ), aStatus );
-
-#ifdef CAMERAAPP_PERFORMANCE_MEASUREMENT
- if( ECamImageCaptureBurst != iInfo.iImageMode )
- {
- // Do not log in burst mode
- PERF_EVENT_END_L1( EPerfEventShotToSnapshot );
- }
- else
- {
- // In burst mode
- PERF_MESSAGE_L2( EPerfMessageBurstSnapshotReady );
- }
-#endif
-
- OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAPPCONTROLLER_HANDLESNAPSHOTEVENT, "e_CAM_APP_SHOT_TO_SNAPSHOT 0" ); //CCORAPP_SHOT_TO_SNAPSHOT_END
-
-// ---------------------------------------------------------------------------
-// Video snapshot handling
- if( ECamControllerVideo == iInfo.iMode )
- {
- PRINT( _L("Camera <> Snapshot in video mode") );
- if( KErrNone == aStatus )
- {
- // Make a copy of the snapshot and set it as current video ss.
- CopySnapshotIfNeeded( *aBitmap, aStatus );
- if( iSnapShotCopy )
- {
- if (BurstCaptureArray()->Count() > 0 )
- {
- const CFbsBitmap* tempSnapShotCopy = iSnapShotCopy;
- TRAP_IGNORE( BurstCaptureArray()->ReplaceSnapshot( tempSnapShotCopy, 0 ) );
- }
- else
- {
- TRAP_IGNORE( BurstCaptureArray()->SetNextSnapshotL( *iSnapShotCopy ) );
- }
- }
- }
-
- // If video recording has already stopped, give snapshot event,
- // which causes snapshot to be updated in postcapture view.
- //
- // If recording is still in progress, the event would cause
- // too early switch to pastcapture.
- if( ECamNoOperation == iInfo.iOperation ||
- ECamCompleting == iInfo.iOperation )
- {
- NotifyControllerObservers( ECamEventSnapshotReady, aStatus );
- }
-
- return;
- }
-
-// ---------------------------------------------------------------------------
-// Still snapshot handling
-
- PRINT( _L("Camera <> Snapshot in still mode") );
-
- if( ECamImageCaptureTimeLapse == iInfo.iImageMode )
- {
- // Update time lapse count during snapshot, so the update counter value
- // appears at the same time as snapshot.
- iTimeLapseCaptureCount++;
- NotifyControllerObservers( ECamEventCounterUpdated );
- }
- else if ( ECamImageCaptureBurst == iInfo.iImageMode )
- {
- // Re-enable the screen saver if burst capture is completing.
- // This has to be done when all captures complete for timelapse.
- // EnableScreenSaver( ETrue );
-
- NotifyControllerObservers( ECamEventCounterUpdated );
- iUpdateFrozenFrame = ETrue;
-
- }
-
- // -------------------------------------------------------
- // if there is an error with the still capture operation
- if ( KErrNone != aStatus )
- {
- PRINT( _L("Camera <> CCamAppController: error in, cancel saving etc..") );
- // Store this now, as it's cleared by TidyCaptureArray
- // but needed a little later
- TBool wasCapturingBurst = (ECamImageCaptureBurst == iInfo.iImageMode);
-
- iImageSaveActive->Cancel();
-
- TidyCaptureArray( BurstCaptureArray()->NextFileIndex(), aStatus );
- PRINT( _L("Camera <> cancel further capturing") );
- TRAP_IGNORE( iCameraController->DirectRequestL( ECamRequestImageCancel ) );
-
- NotifyControllerObservers( ECamEventSnapshotReady, aStatus );
-
- if ( wasCapturingBurst )
- {
- // Need this here to allow the AppUi to update the state correctly
- // following the error condition. This needs to be *after* the
- // change to OperationNone (called in TidyCaptureArray) so when the
- // AppUi forces CBA update we're not still in burst capture state.
- NotifyControllerObservers( ECamEventCaptureComplete, aStatus );
- }
-
- PRINT( _L( "Camera <> calling HandleCaptureCompletion()" ) )
- HandleCaptureCompletion();
- }
- // -------------------------------------------------------
- // No error reported
- else
- {
- PRINT( _L("Camera <> CCamAppController: status in KErrNone..") );
- __ASSERT_ALWAYS( aBitmap, CamPanic( ECamPanicNullPointer ) );
-
- // The secondary camera postcapture snapshot is rotated here.
- // Due to the viewfinder mirroring along the landscape axis the
- // portrait (or upside down portrait) postcapture snapshot would
- // otherwise be upside down.
- // This affects the snapshot seen in postcapture view.
-
- if( iInfo.iActiveCamera == ECamActiveCameraSecondary &&
- iCaptureOrientation == ECamOrientation180 &&
- ECamSettOn == IntegerSettingValue( ECamSettingItemShowCapturedPhoto ) )
- {
- PRINT( _L( "Camera <> Rotate portrait secondary camera snapshot image 180 degrees" ) )
- TRAP_IGNORE( iSnapShotRotator->RotateL( aBitmap ) );
- }
-
- CopySnapshotIfNeeded( *aBitmap, aStatus );
-
- // Removed filename reservation when snapshot arrives.
- // From now on, it's always done in HandleImageCaptureEvent,
- // even if snapshot comes first.
-
- // This is being ignored, but there is nothing to display in the app
- TRAP_IGNORE( BurstCaptureArray()->SetNextSnapshotL( *aBitmap ) )
-
- NotifyControllerObservers( ECamEventSnapshotReady );
-
- // If this is not a burst capture and snapshot came before image
- // data, then the operation is now entering the completion phase.
- // In case iFilenameReserved is set, imagedata has already
- // arrived and we don't need to change state here.
- if ( ECamCompleting != iInfo.iOperation &&
- ECamImageCaptureBurst != iInfo.iImageMode &&
- !iFilenameReserved )
- {
- SetOperation( ECamCompleting );
- }
-
- if( CurrentCapturedCount() < CaptureLimit() )
- {
- // Play capture sound for the next burst image
- PlaySound( CaptureToneId(), EFalse );
- }
-
- }
- // -------------------------------------------------------
-
- PRINT( _L( "Camera <= CCamAppController::HandleSnapshotEvent" ) );
- }
-
-
-// ---------------------------------------------------------------------------
-// HandleImageCaptureEventL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::HandleImageCaptureEventL( TInt aStatus,
- CCamBufferShare* aShare )
- {
- PRINT1( _L("Camera => CCamAppController::HandleImageCaptureEventL, status:%d"), aStatus );
-
-#ifdef CAMERAAPP_PERFORMANCE_MEASUREMENT
- if( ECamImageCaptureBurst != iInfo.iImageMode )
- {
- // Do not log in burst mode
- PERF_EVENT_END_L1( EPerfEventShotToStillImageReady );
- }
- else
- {
- PERF_MESSAGE_L2( EPerfMessageBurstStillimageReady );
- }
-#endif // CAMERAAPP_PERFORMANCE_MEASUREMENT
-
- OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAPPCONTROLLER_HANDLEIMAGECAPTUREEVENTL, "e_CAM_APP_SHOT_TO_STILL 0" ); //CCORAPP_SHOT_TO_STILL_END
-/*
- // Check if we need to stop the burst capture.
- if ( ECamImageCaptureBurst == iInfo.iImageMode )
- {
- if( CurrentCapturedCount() < CaptureLimit() )
- {
- // Play capture sound for the next burst image
- PlaySound( CaptureToneId(), EFalse );
- }
- }
-*/
- // If we have all the needed snapshots set the flag
- // so the processing image text is shown.
- // Do it here instead of handlesnapshotevent so that
- // the counter has time to show the last image as well
- if( CurrentCapturedCount() == CaptureLimit() )
- {
- iAllSnapshotsReceived = ETrue;
- }
-
- if( KErrNone == aStatus )
- {
- PRINT( _L("Camera <> CCamAppController: image capture status KErrNone") );
- aShare->Reserve();
- CleanupStack::PushL( TCleanupItem( CamBufferShareCleanup, aShare ) );
-
- // Reserve filename for saving the image. In case there's problem
- // with current media, switch to internal memory
- TRAPD(err, ReserveFileNamesL( iInfo.iMode, iInfo.iImageMode ) );
- if( KErrNone != err )
- {
- if( ECamMediaStorageCard == IntegerSettingValue( ECamSettingItemPhotoMediaStorage ) )
- {
- PRINT( _L("Camera <> Memory card access failed.") )
- NotifyControllerObservers( ECamEventInvalidMemoryCard );
- }
- // If we have got here, we can't access MMC. Switch to phone memory
-
- TRAP_IGNORE( ForceUsePhoneMemoryL() ); //with multiple drive support,
- //this actually uses the internal mass memory
- TRAPD(err, ReserveFileNamesL( iInfo.iMode, iInfo.iImageMode ) );
- if( KErrNone != err )
- {
- PRINT( _L("Camera <> Mass memory or phone memory access also failed.") )
- TRAP_IGNORE( ForceUsePhoneMemoryL() );
- TRAP_IGNORE( ReserveFileNamesL( iInfo.iMode, iInfo.iImageMode, ETrue ) );
- }
- }
-
- TBool markedForDelete = BurstCaptureArray()->IsNextImageDeleted();
- PRINT1( _L("Camera <> Next image delete mark:%d"), markedForDelete );
- if ( !markedForDelete )
- {
- PRINT( _L("Camera <> setting iImageSaveRequestPending to false"))
- iImageSaveRequestPending = EFalse;
- const TDesC& nextName( BurstCaptureArray()->NextFileName() );
- PRINT( _L("Camera <> BurstCaptureArray()->NextFileName() returned") );
- PRINT1( _L("Camera <> Set image to be saved, name:[%S]"), &nextName );
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if( ( iInfo.iImageMode == ECamImageCaptureSingle )
- && ECamSettOff == IntegerSettingValue( ECamSettingItemShowCapturedPhoto )
- && iInfo.iActiveCamera == ECamActiveCameraPrimary
- && !appUi->IsEmbedded() )
- {
- HandleSaveEvent( ECamSaveEventStarted );
- }
- TBool added = iImageSaveActive->AddToSave( nextName, aShare );
-
- if ( !added )
- {
- PRINT( _L("Camera <> Image saving start unsuccessful!") );
- // The system state is consistent if this fails so ignore the error
- }
- else
- {
- PRINT( _L("Camera <> Image saving started ok.") );
- // Ownership of the data has now been passed to CCamImageSaveActive
- if ( ECamImageCaptureBurst == iInfo.iImageMode )
- {
- NotifyControllerObservers( ECamEventImageData );
- }
- PRINT1( _L("Camera <> CCamAppController::HandleImageCaptureEventL array count:%d"), BurstCaptureArray()->Count() );
-
- // Snapshots are rotated here if necessary, so that the thumbnails created by
- // ThumbNailManager accurately represent the actual images.
- // This affects the thumbnails seen in Photos.
-
- // check if snapshot bitmap needs to be rotated before creating a thumbnail from it
- TBool rotate( ( ECamSettOn == iSettingsModel->IntegerSettingValue( ECamSettingItemImageRotation ) ||
- iInfo.iActiveCamera == ECamActiveCameraSecondary ) &&
- iCaptureOrientation != ECamOrientation0 );
-
- if ( ECamImageCaptureBurst != iInfo.iImageMode )
- {
- //create thumbnail or rotate first if needed
- if ( iConfigManager && iConfigManager->IsThumbnailManagerAPISupported() )
- {
- if ( rotate )
- {
- RotateSnapshotL();
- }
- else
- {
- TRAP_IGNORE( iImageSaveActive->CreateThumbnailsL( *BurstCaptureArray() ) );
- }
- }
- }
- }
- }
- CleanupStack::PopAndDestroy(); // aShare->Release()
- aShare = NULL;
- }
- else
- {
- PRINT( _L("Camera <> CCamAppController: capture status *not* KErrNone, mark current file for delete") );
- DeleteCurrentFile();
- }
-
-
- iFilenameReserved = ETrue;
-
- PRINT( _L( "Camera <= CCamAppController::HandleImageCaptureEventL" ) );
- }
-
-
-
-// ---------------------------------------------------------------------------
-// HandleImageStopEventL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::HandleImageStopEventL( TInt aStatus, TInt aFullCaptureCount )
- {
- PRINT2( _L("Camera => CCamAppController::HandleImageStopEventL, status:%d, full captures:%d"), aStatus, aFullCaptureCount );
-
- TBool saved = ( iImageSaveActive->Count()== 0 );
-
- switch( iInfo.iImageMode )
- {
- // -----------------------------------------------------
- case ECamImageCaptureBurst:
- {
- PRINT( _L( "Camera <> CCamAppController .. case ECamImageCaptureBurst" ) );
- // CompleteBurstOperation();
-
- // Re-enable screen saver
- EnableScreenSaver( ETrue );
- if( iBacklightTimer )
- {
- iBacklightTimer->Cancel();
- }
-
- TInt started( iCameraController->ControllerInfo().iSnapshotCount );
- if ( aFullCaptureCount < started )
- {
- PRINT ( _L("Camera <> CCamAppController .. [WARNING] Incomplete captures detected, cleaning up.." ) );
- PRINT1( _L("Camera <> CCamAppController .. [WARNING] snapshot count: %d"), started );
- PRINT1( _L("Camera <> CCamAppController .. [WARNING] full capture count: %d"), aFullCaptureCount );
- PRINT1( _L("Camera <> CCamAppController .. [WARNING] burst array count: %d"), BurstCaptureArray()->Count() );
- TInt stopAt = Min( started, BurstCaptureArray()->Count() );
- for ( TInt index = aFullCaptureCount; index < stopAt; index++ )
- {
- PRINT1( _L("Camera <> CCamAppController .. [WARNING] deleting temp file from index %d.."), index );
- SetAsCurrentImage( index );
- // Parameter: notify about file system change only on last delete.
- DeleteCurrentFile( stopAt-1 == index );
- }
- PRINT1( _L("Camera <> CCamAppController .. [WARNING] setting as current image %d.."), aFullCaptureCount );
- SetAsCurrentImage( aFullCaptureCount );
- PRINT ( _L("Camera <> CCamAppController .. [WARNING] resetting burst array to required count..") );
- BurstCaptureArray()->Reset( aFullCaptureCount );
- }
-
- SetOperation( ECamCompleting );
-
- // We may have deleted all the images, so check the status here.
- if( iImageSaveActive->Count()== 0 )
- {
- PRINT( _L( "Camera <> CCamAppController .. images already saved, completing burst capture" ) )
- SetOperation( ECamNoOperation );
- NotifyControllerObservers( ECamEventCaptureComplete, aStatus );
- ReleaseArray();
- }
- // if no images were taken, clear AssumePostCaptureView flag
- if ( started == 0 )
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if ( appUi )
- {
- appUi->SetAssumePostCaptureView( EFalse );
- }
- }
- break;
- }
- // -----------------------------------------------------
- case ECamImageCaptureSingle:
- {
- PRINT( _L( "Camera <> CCamAppController .. case ECamImageCaptureSingle" ) );
-
- // In secondary camera we can get snapshot as last event
- // so we might still be in capturing state.
- if( ECamCapturing == iInfo.iOperation )
- {
- PRINT( _L( "Camera <> CCamAppController .. still in capturing phase, set to completing first.." ) );
- SetOperation( ECamCompleting );
- }
-
- // In case of secondary camera, image may be saved before Stop event is received.
- // Notify capture complete event to the observers and other completion handling here.
- if( saved && ECamCompleting == iInfo.iOperation )
- {
- PRINT( _L( "Camera <> CCamAppController .. file saved, complete capture" ) );
-
- // Operation mode is also set in HandleCaptureCompletion
- HandleCaptureCompletion();
- NotifyControllerObservers( ECamEventCaptureComplete, aStatus );
- ReleaseArray();
- }
-
- break;
- }
- // -----------------------------------------------------
- case ECamImageCaptureTimeLapse:
- {
- PRINT( _L( "Camera <> CCamAppController .. case ECamImageCaptureTimeLapse" ) );
- if( saved )
- {
- PRINT( _L( "Camera <> CCamAppController .. current file saved, complete this capture" ) );
- SetOperation( ECamNoOperation );
- ReleaseArray();
- }
-
- if ( iCompleteTimeLapsePending )
- {
- CompleteTimeLapseOperation();
- }
- else
- {
- // If the camera orientation changed during capture, set the new orientation in the engine
- // ready for the next timelapse capture
- if ( iConfigManager && iConfigManager->IsOrientationSensorSupported()
- && iOrientationChangeOccured )
- {
- iOrientationChangeOccured = EFalse;
- TRAP_IGNORE( SetImageOrientationL() );
- }
- }
- break;
- }
- // -----------------------------------------------------
- default:
- break;
- // -----------------------------------------------------
- }
- PRINT( _L( "Camera <= CCamAppController::HandleImageStopEventL" ) );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IdleTimeoutL
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::IdleTimeoutL( TAny* aPtr )
- {
- return static_cast<CCamAppController*>( aPtr )->DoIdleTimeoutL();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DoIdleTimeoutL
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::DoIdleTimeoutL()
- {
- // if a video recording has been paused for 60 seconds without key presses
- if ( ECamPaused == CurrentVideoOperation() )
- {
- NotifyControllerObservers( ECamEventVideoPauseTimeout, KErrNone );
- }
-
- // notify switch to standby mode and stop timer
- else if( ECamStandby != iInfo.iOperation && ECamTriActive == iCameraController->ViewfinderState())
- {
- SetOperation( ECamStandby );
- }
- else
- {
- // For Lint
- }
-
- iIdleTimer->Cancel();
-
-// Use backlight timer also with bitmap vf
- if( iBacklightTimer )
- {
- if( ECamTriActive == iCameraController->ViewfinderState() )
- {
- User::ResetInactivityTime();
- }
- iBacklightTimer->Cancel();
- }
-
- return EFalse;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StartIdleTimer
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::StartIdleTimer()
- {
- PRINT( _L( "Camera => CCamAppController::StartIdleTimer" ) );
- // if in standby mode notify of switch back to pre-capture
- if ( ECamStandby == iInfo.iOperation )
- {
- PRINT( _L( "Camera <> CCamAppController::StartIdleTimer ECamStandby" ) );
- SetOperation( ECamNoOperation );
- }
- // if recording is in progress don't go to standby
- else if ( ECamCapturing == CurrentVideoOperation() )
- {
- PRINT( _L( "Camera <> CCamAppController::StartIdleTimer no restart" ) );
- // don't restart if recording operation in progress
- return;
- }
- // if recording is paused, use the idle timer to stop recording after 60 secs
- else
- {
- PRINT( _L( "Camera <> CCamAppController::StartIdleTimer else part" ) );
- // empty else statement to remove LINT error
- }
-
- // restart timer
- iIdleTimer->Cancel();
-
- // don't restart if capturing burst, setting time lapse or in a pretend exit state
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if ( !SequenceCaptureInProgress() && appUi && !appUi->IsInPretendExit()
- && !appUi->TimeLapseSliderShown())
- {
- // restart timer
- PRINT( _L( "Camera <> CCamAppController::StartIdleTimer starting timer" ) );
- iIdleTimer->StartTimer();
- }
-
- if ( iDeepSleepTimer )
- {
- if ( iDeepSleepTimer->IsActive() )
- {
- PRINT( _L( "Camera <> CCamAppController::StartIdleTimer - restart deep sleep timer" ) );
- DeepSleepTimerCancel();
- DeepSleepTimerStart();
- }
- else if ( iDeepSleepTimerExpired )
- {
- iDeepSleepTimerExpired = EFalse; // clear flag
- TVwsViewId activeView;
- CCamAppUi* appUi =
- static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- (void) appUi->GetActiveViewId( activeView ); // ignore error
-
- if ( !IsViewFinding() && !InVideocallOrRinging() &&
- activeView.iViewUid.iUid != ECamViewIdVideoPostCapture &&
- activeView.iViewUid.iUid != ECamViewIdStillPostCapture &&
- activeView.iViewUid.iUid != ECamViewIdBurstThumbnail )
- {
- PRINT( _L( "Camera <> CCamAppController::StartIdleTimer - Deep sleep timer expired. Restart VF" ) );
- TCamCameraMode mode = CurrentMode() == ECamControllerVideo?
- ECamControllerVideo : ECamControllerImage;
- EnterViewfinderMode( mode );
- DeepSleepTimerStart();
- }
- }
- }
-
- PRINT( _L( "Camera <= CCamAppController::StartIdleTimer" ) );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StopIdleTimer
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::StopIdleTimer()
- {
- PRINT( _L( "Camera => CCamAppController::StopIdleTimer" ) );
- if( iIdleTimer )
- {
- iIdleTimer->Cancel();
- }
- PRINT( _L( "Camera <= CCamAppController::StopIdleTimer" ) );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::TimeLapseTimeoutL
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::TimeLapseTimeoutL( TAny* aPtr )
- {
- return static_cast<CCamAppController*>( aPtr )->DoTimeLapseTimeoutL();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DoTimeLapseTimeoutL
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::DoTimeLapseTimeoutL()
- {
- PRINT( _L("Camera => CCamAppController::DoTimeLapseTimeoutL" ))
- // Work out how much time is left before the next capture
- TTime now;
- now.HomeTime();
- TTimeIntervalMicroSeconds elapsedTime = now.MicroSecondsFrom( iTimeLapseStartTime );
- TInt64 remainingTime = iTimeLapseInterval.Int64() - elapsedTime.Int64();
- // update the remaining time countdown
- NotifyControllerObservers( ECamEventCounterUpdated );
-
- //if the total timelapse period has now completed
- if ( remainingTime <= 0 )
- {
- // Workaround for DoTimeLapseTimeoutL firing while in inappropriate state
- // cause capture to be delayed by 1 sec
- if( ECamNoOperation != iInfo.iOperation )
- {
- PRINT( _L("Camera <> CCamAppController::DoTimeLapseTimeoutL workaround" ))
- //remainingTime = TInt64( KSecondInMicSec );
- iTimeLapseTimer->StartTimer();
- }
- else
- {
- TInt remainingCount = ImagesRemaining( static_cast<TCamMediaStorage>( IntegerSettingValue( ECamSettingItemPhotoMediaStorage ) ), ETrue );
- if ( remainingCount > 0 )
- {
- PRINT( _L("Camera => CCamAppController::DoTimeLapseTimeoutL about to do next capture" ))
- // About to do the next capture so decrement the view's usage count on the array
- ReleaseArray();
- if ( iConfigManager && iConfigManager->IsAutoFocusSupported() )
- {
- if( !CurrentSceneHasForcedFocus() )
- {
- if( !IsViewFinding() )
- {
- StartViewFinder();
- }
- StartAutoFocus();
- iCaptureRequested = ETrue; //Has to be set before focused/not focused event.
- }
- else
- {
- PRINT( _L("Camera <> CCamAppController::DoTimeLapseTimeoutL capture with forcedfocus scene" ))
- Capture();
- }
- }
- else
- {
- Capture();
- }
- RestartTimeLapseTimerL();
- }
- else
- {
- PRINT( _L("Camera => CCamAppController::DoTimeLapseTimeoutL capture is complete" ))
- CompleteTimeLapseOperation();
- }
- }
- return EFalse;
- }
- // Otherwise restart the timer for the next period
- else
- {
- if ( remainingTime < TInt64( KSecondInMicSec ) )
- {
- PRINT( _L("Camera => CCamAppController::DoTimeLapseTimeoutL shortening timer" ))
- iTimeLapseTimer->SetTimeout( (TInt)remainingTime );
- }
- else if( ( remainingTime < TInt64( 5 *KSecondInMicSec )) && !iCameraWoken )
- {
- iCameraWoken = ETrue;
- if( !IsViewFinding() )
- {
- StartViewFinder();
- }
- User::ResetInactivityTime();
- }
-
- PRINT( _L("Camera => CCamAppController::DoTimeLapseTimeoutL restarting timer" ))
- iTimeLapseTimer->StartTimer();
- }
- return EFalse;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SupportedFlashModes
-// Return flash modes supported engine
-// ---------------------------------------------------------------------------
-//
-TUint32 CCamAppController::SupportedFlashModes()
- {
- if( iCameraController )
- return iCameraController->CameraInfo().iFlashModesSupported;
- else
- return 0;
- //iSupportedFlashModes;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SupportedWBModes
-// Return white balance modes supported engine
-// ---------------------------------------------------------------------------
-//
-TUint32 CCamAppController::SupportedWBModes()
- {
- if( iCameraController )
- return iCameraController->CameraInfo().iWhiteBalanceModesSupported;
- else
- return 0;
- //iSupportedWBModes;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SupportedEVModes
-// Return EV modes supported engine
-// ---------------------------------------------------------------------------
-//
-TUint32 CCamAppController::SupportedEVModes()
- {
- if( iCameraController )
- return iCameraController->CameraInfo().iExposureModesSupported;
- else
- return 0;
- //iSupportedEVModes;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CaptureState
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::CaptureState()
- {
- if( iCameraController )
- {
- return iCameraController->ControllerInfo().iCaptureState;
- }
- else
- {
- return KErrNotFound;
- }
- }
-
-
-
-// -----------------------------------------------------------------------------
-// CCamAppController::FlashStatus()
-// Returns pointer to FlashStatus object
-// -----------------------------------------------------------------------------
-//
-CCamFlashStatus*
-CCamAppController::FlashStatus() const
- {
- return iFlashStatus;
- }
-
-
-// -----------------------------------------------------------------------------
-// CCamAppController::FlashRequired()
-//
-// -----------------------------------------------------------------------------
-//
-TBool
-CCamAppController::FlashRequired() const
- {
- if( ECamSceneSports == IntegerSettingValue( ECamSettingItemDynamicPhotoScene ) )
- {
- // Flash is not required in sport scene, even if the flash mode
- // is forced or redeye.
- return EFalse;
- }
-
- // Make decision based on current flash mode
- TInt flashMode = IntegerSettingValue( ECamSettingItemDynamicPhotoFlash );
- switch( flashMode )
- {
- case ECamFlashOff:
- {
- return EFalse;
- }
- case ECamFlashAntiRedEye: // Flowthrough
- case ECamFlashForced:
- {
- return ETrue;
- }
- default:
- {
- // Just return true in the default case.
- // Automatic mode will decide if flash is used or not.
- return ETrue;
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// CCamAppController::CheckFlash()
-//
-// -----------------------------------------------------------------------------
-//
-TBool
-CCamAppController::CheckFlash() const
- {
- PRINT ( _L("Camera => CCamAppController::CheckFlash") );
- PRINT1( _L("Camera <> CCamAppController: flash required :%d "), FlashRequired() );
- PRINT1( _L("Camera <> CCamAppController: FlashStatus: flash ready :%d "), iFlashStatus->FlashReady() );
- PRINT1( _L("Camera <> CCamAppController: CameraCtrl: flash status :[%s]"),
- KCamCameraReadyStateNames[iCameraController->FlashState()] );
-
- TBool ok( !FlashRequired() || iFlashStatus->FlashReady() );
-
- PRINT1( _L("Camera <= CCamAppController::CheckFlash, return:%d"), ok );
-#ifdef __WINSCW__
- return ETrue;
-#else
- return ok;
-#endif
- }
-
-
-// -----------------------------------------------------------------------------
-// CCamAppController::SaveFlashMode()
-//
-// -----------------------------------------------------------------------------
-//
-void CCamAppController::SaveFlashMode()
- {
- iFlashModeSaved = ETrue;
- iSavedFlashMode = static_cast<TCamFlashId>( IntegerSettingValue( ECamSettingItemDynamicPhotoFlash ) );
- iSavedFlashScene = static_cast<TCamSceneId>( IntegerSettingValue( ECamSettingItemDynamicPhotoScene ) );
- }
-
-// -----------------------------------------------------------------------------
-// CCamAppController::RestoreFlashMode
-//
-// -----------------------------------------------------------------------------
-//
-void CCamAppController::RestoreFlashMode()
- {
- if( iFlashModeSaved )
- {
- if( iSavedFlashScene == IntegerSettingValue( ECamSettingItemDynamicPhotoScene ) )
- {
- // Set saved flash mode
- TRAP_IGNORE( SetIntegerSettingValueL( ECamSettingItemDynamicPhotoFlash, iSavedFlashMode ) );
- }
- else
- {
- // Set default flash mode for this scene
- // SetDynamicSettingToDefault( ECamSettingItemDynamicPhotoFlash );
- TInt scene = IntegerSettingValue( ECamSettingItemDynamicPhotoScene );
- TInt sceneFlashMode = iSettingsModel->SceneSettingValue( scene, ECamSettingItemSceneFlashMode );
- TRAP_IGNORE( SetIntegerSettingValueL( ECamSettingItemDynamicPhotoFlash, sceneFlashMode ) );
-
- }
- }
- iFlashModeSaved = EFalse;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ForceUsePhoneMemoryL
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::ForceUsePhoneMemoryL( TBool aEnable )
- {
- PRINT( _L("Camera => CCamAppController::ForceUsePhoneMemoryL") );
-
- if( aEnable )
- {
- iForceUseOfPhoneMemory = ETrue;
- if( ExistMassStorage() )
- {
- // with multiple drives, the mass memory is the default
- PRINT( _L("Camera <> Force ECamMediaStorageMassStorage") );
- iForcedStorageLocation = ECamMediaStorageMassStorage;
- SetPathnamesToNewStorageL( ECamMediaStorageMassStorage );
- }
- else
- {
- PRINT( _L("Camera <> Force ECamMediaStoragePhone") );
- TCamMediaStorage storage = IntegerSettingValue(ECamSettingItemRemovePhoneMemoryUsage)?
- ECamMediaStorageNone:
- ECamMediaStoragePhone;
- iForcedStorageLocation = storage;
- SetPathnamesToNewStorageL( storage );
- }
- }
- // Revert back to memory card, if aEnable is EFalse
- else
- {
- iForceUseOfPhoneMemory = EFalse;
- iForcedStorageLocation = ECamMediaStorageNone;
- SetPathnamesToNewStorageL( iPreferredStorageLocation );
- }
-
- NotifyControllerObservers( ECamEventSaveLocationChanged );
- PRINT( _L("Camera <= CCamAppController::ForceUsePhoneMemoryL") );
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsPhoneMemoryForced
-// Check whether the use of phone memory is forced, because of unavailibility
-// or problems encountered in using MMC.
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsPhoneMemoryForced()
- {
- return iForceUseOfPhoneMemory;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CheckMemoryToUseL
-// Set the appropriate memory to use. Use Phone memory if MMC not available.
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::CheckMemoryToUseL()
- {
- TInt key = ( ECamControllerImage == CurrentMode() )
- ? ECamSettingItemPhotoMediaStorage
- : ECamSettingItemVideoMediaStorage;
-
- TCamMediaStorage storageLocation = static_cast<TCamMediaStorage> ( IntegerSettingValueUnfiltered(key) );
- TBool mmcAvailable = IsMemoryAvailable ( ECamMediaStorageCard );
-
- PRINT1( _L("Camera :: CCamAppController::CheckMemoryToUse preferred storage:%d"),
- storageLocation );
-
- // If MMC is preferred storage location but is not available
- if ( storageLocation == ECamMediaStorageCard && !mmcAvailable )
- {
- PRINT( _L("Camera :: CCamAppController::CheckMemoryToUse - use phone memory / mass storage") )
- ForceUsePhoneMemoryL( ETrue );
- return ETrue;
- }
- // Preferred location is MMC and its available now -> stop forcing phone memory
- else if( storageLocation == ECamMediaStorageCard && mmcAvailable &&
- iForceUseOfPhoneMemory )
- {
- PRINT( _L("Camera :: CCamAppController::CheckMemoryToUse - use MMC") )
- ForceUsePhoneMemoryL( EFalse );
- return ETrue;
- }
- if ( storageLocation == ECamMediaStorageMassStorage && !ExistMassStorage() )
- {
- PRINT( _L("Camera :: CCamAppController::CheckMemoryToUse - no mass storage, use phone memory") )
- ForceUsePhoneMemoryL( ETrue );
- return ETrue;
- }
- // Mass storage is available now -> stop forcing phone memory
- else if( storageLocation == ECamMediaStorageMassStorage && ExistMassStorage() && iForceUseOfPhoneMemory )
- {
- PRINT( _L("Camera :: CCamAppController::CheckMemoryToUse - use mass memory") )
- ForceUsePhoneMemoryL( EFalse );
- return ETrue;
- }
- else
- {
- SetPathnamesToNewStorageL( storageLocation );
- }
-
- return EFalse;
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CompleteBurstOperation
-// Complete the burst operation
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::CompleteBurstOperation()
- {
- PRINT( _L( "Camera => CCamAppController::CompleteBurstOperation" ) );
- iSequenceCaptureInProgress = EFalse;
- iNoBurstCancel=EFalse;
-
- if( ECamImageCaptureBurst == iInfo.iImageMode )
- {
- PRINT1( _L("Camera <> CCamAppController::CompleteBurstOperation array count:%d"), BurstCaptureArray()->Count() );
- // Create thumbnails
- if( iConfigManager && iConfigManager->IsThumbnailManagerAPISupported() )
- {
- TRAP_IGNORE( iImageSaveActive->CreateThumbnailsL( *BurstCaptureArray() ) );
- }
-
- // Re-enable screen saver
- EnableScreenSaver( ETrue );
- if( iBacklightTimer )
- {
- iBacklightTimer->Cancel();
- }
- SetOperation( ECamNoOperation );
-
- NotifyControllerObservers( ECamEventCaptureComplete, KErrNone );
- HandleCaptureCompletion();
- }
- PRINT( _L( "Camera <= CCamAppController::CompleteBurstOperation" ) );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CompleteTimeLapseOperation
-// Complete the time lapse operation
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::CompleteTimeLapseOperation()
- {
- PRINT( _L( "Camera => CCamAppController::CompleteTimeLapseOperation" ) );
-
- iSequenceCaptureInProgress = EFalse;
-
- if ( iTimeLapseTimer )
- {
- iTimeLapseTimer->Cancel();
- delete iTimeLapseTimer;
- iTimeLapseTimer = NULL;
- }
-
- if( ECamImageCaptureTimeLapse == iInfo.iImageMode )
- {
- // Re-enable screen saver
- EnableScreenSaver( ETrue );
- iCompleteTimeLapsePending = EFalse;
-
-// SetImageMode( ECamImageCaptureNone );
- SetOperation( ECamNoOperation );
-
- NotifyControllerObservers( ECamEventCaptureComplete, KErrNone );
- HandleCaptureCompletion();
- iTimeLapseStartTime = TInt64( 0 );
- }
-
- PRINT( _L( "Camera <= CCamAppController::CompleteTimeLapseOperation" ) );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::EngineProcessingCapture
-// Return whether or not the engine is carrying out a capture operation
-// ---------------------------------------------------------------------------
-//
-TBool
-CCamAppController::EngineProcessingCapture() const
- {
- TBool engineIsProcessing = EFalse;
-
- if ( ECamCapturing == iInfo.iOperation
- || ECamPausing == iInfo.iOperation
- || ECamPaused == iInfo.iOperation
- || ECamResuming == iInfo.iOperation
- || ECamCompleting == iInfo.iOperation
- )
- {
- engineIsProcessing = ETrue;
- }
-
- return engineIsProcessing;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandleIncomingCall
-// Stop video recording (or burst capture in early stages)
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandleIncomingCall()
- {
- PRINT2( _L("Camera => CCamAppController::HandleIncomingCallL .. mode[%s] operation[%s]"),
- KCamModeNames[iInfo.iMode],
- KCamCaptureOperationNames[iInfo.iOperation]
- );
-
- if( ECamControllerVideo == iInfo.iMode )
- {
- // if video is recording or paused
- if ( !iSaving
- && ( ECamCapturing == iInfo.iOperation
- || ECamPaused == iInfo.iOperation ) )
- {
- StopVideoRecording();
- }
- }
- else if( ECamControllerImage == iInfo.iMode )
- {
- iCaptureRequested = EFalse;
- switch( iInfo.iImageMode )
- {
- // if a timelapse operation is in progress
- case ECamImageCaptureTimeLapse:
- {
- TRAP_IGNORE( StopSequenceCaptureL() );
- break;
- }
- case ECamImageCaptureBurst:
- {
- TRAP_IGNORE( SoftStopBurstL( ETrue ) );
- /*
- if ( ECamCompleting == iInfo.iOperation )
- {
- // if some of the image captures failed
- // release the reserved filenames and tidy the array
- TInt captured( iCameraController->ControllerInfo().iCaptureCount );
- if ( BurstCaptureArray()->NextFileIndex() < captured )
- {
- TInt index;
- TInt stopAt = Min( captured, BurstCaptureArray()->Count() );
- for ( index = BurstCaptureArray()->NextFileIndex(); index < stopAt; index++ )
- {
- SetAsCurrentImage( index );
- DeleteCurrentFile();
- }
- SetAsCurrentImage( 0 );
-
- BurstCaptureArray()->Reset( BurstCaptureArray()->NextFileIndex() );
- // Finished with this now
- }
-// SetImageMode( ECamImageCaptureNone );
- if( iImageSaveActive )
- iImageSaveActive->DismissProgressNote();
- StartIdleTimer();
- }
- */
- break;
- }
- default:
- break;
- }
- }
- else
- {
- // no action needed
- }
- PRINT( _L( "Camera <= CCamAppController::HandleIncomingCallL" ) );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::FileSize
-// Returns the file size of the specified captured item, or KErrNotFound if doesn't exist
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::FileSize( TDesC& aFilename ) const
- {
- return iImageSaveActive->FileSize( aFilename );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CancelStillCaptureNow
-// Immediately cancels an ongoing still capture
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::CancelStillCaptureNow()
- {
- PRINT( _L( "Camera => CCamAppController::CancelStillCaptureNow" ) )
- // Re-enable screen saver
- EnableScreenSaver( ETrue );
-// iEngine->CancelCaptureStill();
- TRAP_IGNORE( iCameraController->DirectRequestL( ECamRequestImageCancel ) );
-
- // ensure that any outstanding images are discarded
- SetOperation( ECamCompleting );
- SetOperation( ECamNoOperation );
-
- // If sequence mode, remove items from the array
- // this prevents the post capture view from showing
- if ( ECamImageCaptureBurst == iInfo.iImageMode )
- {
- BurstCaptureArray()->Reset( 0 );
- }
- else // single capture, the array is no longer needed
- {
- PRINT( _L( "Camera <> single capture so releasing array and starting vf" ) )
- ReleaseArray();
- FreezeViewFinder( EFalse );
- }
- // Cancel any pending saves, this will call CompleteBurstOperation for sequence
- PRINT( _L( "Camera <> calling iImageSaveArray->Cancel" ) )
- iImageSaveActive->Cancel();
- PRINT( _L( "Camera <= CCamAppController::CancelStillCaptureNow" ) )
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::TidyCaptureArray
-// Tidy up capture array in event of burst capture failure
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::TidyCaptureArray( TInt aImageCountDelivered,
- TInt /*aError*/ )
- {
- PRINT1( _L("Camera => CCamAppController::TidyCaptureArray img count %d"), aImageCountDelivered )
- iSoundPlayer->EnableAllKeySounds();
-
- // if some of the image captures failed
- // release the reserved filenames and tidy the array
-
- TInt captured( iCameraController->ControllerInfo().iSnapshotCount );
- if ( aImageCountDelivered < captured )
- {
- TInt index;
- TInt stopAt = Min( captured, BurstCaptureArray()->Count() );
- for ( index = aImageCountDelivered; index < stopAt; index++ )
- {
- PRINT1( _L("Camera <> TidyCaptureArray delete current %d"),index )
- SetAsCurrentImage( index );
- DeleteCurrentFile();
- }
- SetAsCurrentImage( 0 );
- iCaptureArray->Reset( aImageCountDelivered );
- // Finished with this now
- }
-
- SetImageMode( ECamImageCaptureNone );
- StartIdleTimer();
-
- // Need to release the array
- ReleaseArray();
-
-
- // Unfreeze the viewfinder
- FreezeViewFinder( EFalse );
-
- // Change op state to none
- SetOperation( ECamNoOperation );
-
- PRINT( _L("Camera <= CCamAppController::TidyCaptureArray") )
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CaptureToneId
-// Returns the current capture tone
-//
-// ---------------------------------------------------------------------------
-//
-TCamSoundId CCamAppController::CaptureToneId( )
- {
- TCamSoundId toneId = ECamStillCaptureSoundId1;
-
- switch(iSettingsModel->IntegerSettingValue( ECamSettingItemPhotoCaptureTone ) )
- {
- case ECamSettTone1:
- if ( ECamImageCaptureBurst == iInfo.iImageMode )
- {
- toneId = ECamBurstCaptureSoundId1;
- }
- else
- {
- toneId = ECamStillCaptureSoundId1;
- }
- break;
- case ECamSettTone2:
- if ( ECamImageCaptureBurst == iInfo.iImageMode )
- {
- toneId = ECamBurstCaptureSoundId2;
- }
- else
- {
- toneId = ECamStillCaptureSoundId2;
- }
- break;
- case ECamSettTone3:
- if ( ECamImageCaptureBurst == iInfo.iImageMode )
- {
- toneId = ECamBurstCaptureSoundId3;
- }
- else
- {
- toneId = ECamStillCaptureSoundId3;
- }
- break;
- case ECamSettTone4:
- if ( ECamImageCaptureBurst == iInfo.iImageMode )
- {
- toneId = ECamBurstCaptureSoundId4;
- }
- else
- {
- toneId = ECamStillCaptureSoundId4;
- }
- break;
- default:
- break;
- }
-
- return toneId;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::LoadSecondaryCameraSettingsL()
-// Update settings for secondary camera
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::LoadSecondaryCameraSettingsL()
- {
- OstTrace0( CAMERAAPP_PERFORMANCE_DETAIL, CCAMAPPCONTROLLER_LOADSECONDARYCAMERASETTINGSL, "e_CCamAppController_LoadSecondaryCameraSettingsL 1" );
- PRINT( _L("Camera => CCamAppController::LoadSecondaryCameraSettingsL" ))
- iSettingsModel->StorePrimaryCameraSettingsL();
- iSettingsModel->StoreUserSceneSettingsL();
-
- PRINT( _L("Camera <> CCamAppController::LoadSecondaryCameraSettingsL B" ))
-
- SetIntegerSettingValueL( ECamSettingItemPhotoQuality,
- iConfiguration->SecondaryCameraImageQuality() );
- PRINT( _L("Camera <> CCamAppController::LoadSecondaryCameraSettingsL C" ))
- SetIntegerSettingValueL( ECamSettingItemVideoQuality,
- iConfiguration->SecondaryCameraVideoQuality() );
-
-
- // Remember the previous state of face tracking,
- // current state of face tracking and
- // the previous scene mode
- TCamSettingsOnOff previousFaceTrack = iSettingsModel->GetPreviousFaceTrack();
- TCamSettingsOnOff faceTracking = static_cast<TCamSettingsOnOff>( IntegerSettingValue( ECamSettingItemFaceTracking ) );
- TCamSceneId previousSceneMode = iSettingsModel->GetPreviousSceneMode();
-
- PRINT( _L("Camera <> CCamAppController::LoadSecondaryCameraSettingsL E" ))
- SetIntegerSettingValueL( ECamSettingItemDynamicPhotoScene, ECamSceneAuto );
- SetIntegerSettingValueL( ECamSettingItemDynamicVideoScene, ECamSceneNormal );
-
-
- // Restore the previous state of face tracking,
- // current state of face tracking and
- // the previous scene mode
- iSettingsModel->SetPreviousFaceTrack( previousFaceTrack );
- SetIntegerSettingValueL( ECamSettingItemFaceTracking, faceTracking );
- iSettingsModel->SetPreviousSceneMode( previousSceneMode );
-
- PRINT( _L("Camera <> CCamAppController::LoadSecondaryCameraSettingsL F" ))
-
- PRINT( _L("Camera <= CCamAppController::LoadSecondaryCameraSettingsL" ))
- OstTrace0( CAMERAAPP_PERFORMANCE_DETAIL, DUP1_CCAMAPPCONTROLLER_LOADSECONDARYCAMERASETTINGSL, "e_CCamAppController_LoadSecondaryCameraSettingsL 0" );
- }
-
-// ---------------------------------------------------------------------------
-// ImageOrientation <<public>>
-//
-// Return the current image orientation based on data from orientation sensor.
-// If "image rotation" setting is OFF, the value has been overriden with
-// "no rotation" value (ECamOrientation0).
-//
-// Provided (primarily) for Camera Controller even if orientation
-// sensor is not supported. In that case the returned
-// value is always ECamOrientation0.
-// ---------------------------------------------------------------------------
-//
-TCamImageOrientation
-CCamAppController::ImageOrientation() const
- {
- return iImageOrientation;
- }
-
-
-// ---------------------------------------------------------------------------
-// Indicates data is available in the receiving buffer. A client can read
-// the data through GetData()-function in the related channel object. Data
-// is valid until the data received notification occurs again.
-//
-// @param[in] aChannel Reference to the related channel object
-// @param[in] aCount Data object count in receiving buffer. Not used in this implementation.
-// @param[in] aDataLost Number of lost data items. Not used in this implementation. It does not
-// matter if some data event is lost.
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::DataReceived( CSensrvChannel& aChannel,
- TInt aCount,
- TInt aDataLost )
- {
- PRINT3( _L("Camera => CCamAppController::DataReceived aChannel %d aCount %d aDataLost %d"),
- aChannel.GetChannelInfo().iChannelType, aCount, aDataLost );
-
- if ( KSensrvChannelTypeIdOrientationData == aChannel.GetChannelInfo().iChannelType )
- {
- // Rotation is used in primary camera whenever the feature is enabled by user.
- // A rotation is always set for secondary camera in portrait and upside down
- // portrait orientations due to the the viewfinder mirroring along the landscape axis.
- // This affects the final JPEG file.
- TBool rotate( ECamSettOn == iSettingsModel->IntegerSettingValue( ECamSettingItemImageRotation )
- || iInfo.iActiveCamera == ECamActiveCameraSecondary );
-
- if( rotate )
- {
- TSensrvOrientationData orientationData;
- TPckg<TSensrvOrientationData> orientationPackage( orientationData );
- aChannel.GetData( orientationPackage );
-
- iImageOrientation =
- MapSensorOrientatio2CamOrientation( orientationData.iDeviceOrientation,
- iLastImageOrientation,
- iInfo.iActiveCamera );
- }
- else
- {
- // If "rotate images" setting is OFF, set "no rotation" value
- iImageOrientation = ECamOrientation0;
- }
-
- // rotate image if we are in still capture mode but not currently
- // capturing image, no rotation in burst mode or if orientation has stayed the same
- if( IsFlagOn( CameraControllerState(), ECamImageOn ) &&
- rotate &&
- iLastImageOrientation != iImageOrientation &&
- iImageOrientation != ECamOrientationIgnore)
- {
- if( ECamCapturing != CurrentOperation() &&
- ECamFocusing != CurrentOperation() &&
- ECamFocused != CurrentOperation() &&
- ECamFocusFailed != CurrentOperation() &&
- ECamCompleting != CurrentOperation() &&
- ECamImageCaptureBurst != iInfo.iImageMode &&
- ECamImageCaptureBurst != iInfo.iTargetImageMode )
- {
- PRINT( _L("Camera <> CCamAppController:DataReceived calling SetImageOrientationL()") );
- TRAP_IGNORE( SetImageOrientationL() );
- }
- else
- {
- // queue a request to re-prepare still capture
- PRINT( _L("Camera <> CCamAppController: Queueing an orientation change event") );
- iOrientationChangeOccured = ETrue;
- }
- }
- else
- {
- iOrientationChangeOccured = EFalse;
- }
-
- if( iImageOrientation != ECamOrientationIgnore )
- {
- iLastImageOrientation = iImageOrientation;
- }
- }
-
- PRINT ( _L("Camera <= CCamAppController::DataReceived") );
- }
-
-// ---------------------------------------------------------------------------
-// Data listening failed.
-// If error was fatal, channel has also been closed and sensor server session
-// terminated. If error was minor, some data has potentially been lost.
-// iAccSensorChannel needs to be closed in fatal error case. A new channel will
-// be created the next time we call UpdateSensorApiL().
-//
-// @param[in] aChannel Reference to the related channel object
-// @param[in] aError Error code.
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::DataError( CSensrvChannel& aChannel,
- TSensrvErrorSeverity aError )
- {
- PRINT2( _L("Camera => CCamAppController::DataError aChannel %d aError %d"), aChannel.GetChannelInfo().iChannelType, aError );
- if ( ESensrvErrorSeverityFatal == aError )
- {
- // Delete sensor api object
- delete iAccSensorChannel;
- iAccSensorChannel = NULL;
- iAccSensorListening = EFalse;
-
- // Set orientation back to default if not already there.
- iImageOrientation = ECamOrientation0;
- }
- }
-
-// ---------------------------------------------------------------------------
-// Returns a pointer to a specified interface
-//
-// @since S60 5.0
-// @param aInterfaceUid Identifier of the interface to be retrieved
-// @param aInterface A reference to a pointer that retrieves the specified interface.
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::GetDataListenerInterfaceL( TUid aInterfaceUid,
- TAny*& aInterface )
- {
- aInterface = NULL;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetImageOrientationL()
-// Setup image rotation parameters
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetImageOrientationL()
- {
- PRINT( _L("Camera => CCamAppController::SetImageOrientationL") );
- if( iConfigManager && iConfigManager->IsOrientationSensorSupported()
- && iCameraController )
- {
- // Camera controller asks for the current orientation through
- // our ImageOrientation(). Value for that was updated in
- // DataReceived() callback.
- iCameraController->DirectSettingsChangeL( ECameraSettingOrientation );
- }
- PRINT( _L("Camera <= CCamAppController::SetImageOrientationL"))
- }
-
-
-// ---------------------------------------------------------------------------
-// MapSensorOrientatio2CamOrientation
-// ---------------------------------------------------------------------------
-//
-TCamImageOrientation
-CCamAppController::MapSensorOrientatio2CamOrientation(
- const TSensrvOrientationData::TSensrvDeviceOrientation& aSensorOrientation, TCamImageOrientation aLastImageOrientation,
- TCamActiveCamera aActiveCamera )
- {
- PRINT1 ( _L("Camera => CCamAppController::MapSensorOrientatio2CamOrientation aSensorOrientation: %d"), aSensorOrientation );
-
- TCamImageOrientation cameraOrientation( ECamOrientation0 );
-
- // Primary camera rotation
- if ( aActiveCamera == ECamActiveCameraPrimary )
- {
- switch( aSensorOrientation )
- {
- case TSensrvOrientationData::EOrientationDisplayUpwards:
- // If coming from upside down portrait...
- if ( ECamOrientation270 == aLastImageOrientation )
- {
- // Switch from upside down portrait to normal portrait.") )
- cameraOrientation = ECamOrientation90; // Set normal portrait
- }
- // If coming from upside down landscape...
- else if ( ECamOrientation180 == aLastImageOrientation )
- {
- // Switch from upside down landscape to normal landscape...") )
- cameraOrientation = ECamOrientation0; // Set normal lanscape
- }
- // If neither one, keep the current image orientation.
- else
- {
- cameraOrientation = ECamOrientationIgnore;
- }
- break;
-
- case TSensrvOrientationData::EOrientationDisplayDownwards:
- // Camera is pointing up now. Check if it was upside down previously.
- // If coming from upside down portrait...
- if ( ECamOrientation270 == aLastImageOrientation )
- {
- // Switch from upside down portrait to normal portrait...") )
- cameraOrientation = ECamOrientation90; // Set normal portrait
- }
- // If coming from upside down landscape...
- else if ( ECamOrientation180 == aLastImageOrientation )
- {
- // Switch from upside down landscape to normal landscape...") )
- cameraOrientation = ECamOrientation0; // Set normal lanscape
- }
- // If neither one, keep the current image orientation.
- else
- {
- cameraOrientation = ECamOrientationIgnore;
- }
- break;
- case TSensrvOrientationData::EOrientationDisplayRightUp:
- case TSensrvOrientationData::EOrientationUndefined:
- cameraOrientation = ECamOrientation0;
- break;
- case TSensrvOrientationData::EOrientationDisplayUp:
- cameraOrientation = ECamOrientation90;
- break;
- case TSensrvOrientationData::EOrientationDisplayLeftUp:
- cameraOrientation = ECamOrientation180;
- break;
- case TSensrvOrientationData::EOrientationDisplayDown:
- cameraOrientation = ECamOrientation270;
- break;
- default:
- PRINT( _L("Camera <> Unexpected orientation value") );
- break;
- }
- }
- // Secondary camera rotations
- else if ( aActiveCamera == ECamActiveCameraSecondary )
- {
- if ( aSensorOrientation == TSensrvOrientationData::EOrientationDisplayUp ) // Portrait
- {
- cameraOrientation = ECamOrientation180;
- }
- else if ( aSensorOrientation == TSensrvOrientationData::EOrientationDisplayDown ) // Upside down portrait
- {
- cameraOrientation = ECamOrientation180;
- }
- else
- {
- cameraOrientation = ECamOrientation0;
- }
- }
-
- PRINT1( _L("Camera <= CCamAppController::MapSensorOrientatio2CamOrientation, return [%s]"),
- KCamOrientationNames[cameraOrientation] );
-
- return cameraOrientation;
- }
-
-// ---------------------------------------------------------------------------
-// MapCamOrientation2RotationAngle
-// ---------------------------------------------------------------------------
-//
-CBitmapRotator::TRotationAngle
-CCamAppController::MapCamOrientation2RotationAngle(
- const TCamImageOrientation aOrientation )
- {
- PRINT1 ( _L("Camera => CCamAppController::MapCamOrientation2RotationAngle aOrientation: %d"), aOrientation );
-
- CBitmapRotator::TRotationAngle angle;
-
- switch( aOrientation )
- {
- case ECamOrientation90:
- angle = CBitmapRotator::ERotation90DegreesClockwise;
- break;
- case ECamOrientation180:
- angle = CBitmapRotator::ERotation180DegreesClockwise;
- break;
- case ECamOrientation270:
- angle = CBitmapRotator::ERotation270DegreesClockwise;
- break;
- default:
- PRINT( _L("Camera <> Unexpected orientation value") );
- // using a value to avoid compiler warning
- angle = CBitmapRotator::ERotation90DegreesClockwise;
- break;
- }
- PRINT1( _L("Camera <= CCamAppController::MapCamOrientation2RotationAngle, return %d"), angle );
- return angle;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::UpdateSensorApiL() <<public>>
-// Updates the sensorApi object when the app focus changes
-//
-// ---------------------------------------------------------------------------
-//
-
-void CCamAppController::UpdateSensorApiL(TBool aStartupApi)
- {
- PRINT(_L("Camera => CCamAppController::UpdateSensorApiL"));
- if( iConfigManager && iConfigManager->IsOrientationSensorSupported() )
- {
- if(aStartupApi)
- {
- // only activate the orientation channel for image mode
- if( ECamControllerImage == CurrentMode() )
- {
- // This if-statement intentionally not a condition of the first if.
- // If the iAccSensorChannel is already active, we don't want to recreate it
- // and leak memory, but at the same time, we don't want to destroy it either.
-
- if( !iAccSensorChannel )
- {
- PRINT(_L("Camera <=> CCamAppController::UpdateSensorApiL - Starting new sensor channel api - info not yet initialized"));
- //Construct a channel finder.
- CSensrvChannelFinder* channelFinder;
- PRINT(_L("Camera <=> CCamAppController::UpdateSensorApiL - calling CSensrvChannelFinder::NewL()"));
- //CSensorChannelFinder* channelFinder;
- channelFinder = CSensrvChannelFinder::NewL();
- //channelFinder = CSensorChannelFinder::NewL();
- PRINT(_L("Camera <=> CCamAppController::UpdateSensorApiL - CSensrvChannelFinder::NewL() returned without a leave"));
- CleanupStack::PushL( channelFinder );
-
- //List of found channels.
- RSensrvChannelInfoList channelInfoList;
- CleanupClosePushL( channelInfoList );
-
- //Create and fill channel search criteria.
- TSensrvChannelInfo channelInfo;
- channelInfo.iChannelType = KSensrvChannelTypeIdOrientationData;
-
- PRINT(_L("Camera <=> CCamAppController::UpdateSensorApiL - calling channelFinder->FindChannelsL"));
- //Find the orientation channel
- channelFinder->FindChannelsL( channelInfoList, channelInfo );
-
- if( channelInfoList.Count() != 1 )
- {
- //The device doesn’t support orientation data channel or
- //there are several orientation channels.
- PRINT1(_L("Camera <=> CCamAppController::UpdateSensorApiL - The device doesn’t support orientation data channel or there are several orientation channels: %d channels found"),channelInfoList.Count());
- User::Leave( KErrNotSupported );
- }
- else
- {
- //orientation channel found
- PRINT(_L("Camera <=> CCamAppController::UpdateSensorApiL - orientation channel found"));
- }
- //Open the orientation channel.
- //When the channel object is created the channel info object
- //must be an object returned by CSensrvChannelFinder::FindChannelsL().
- PRINT(_L("Camera <=> CCamAppController::UpdateSensorApiL - calling CSensrvChannel::NewL"));
- iAccSensorChannel = CSensrvChannel::NewL( channelInfoList[ 0 ] );
- //iAccSensorChannel = CSensorChannel::NewL( channelInfoList[ 0 ] );
- //CleanupStack::PushL( iAccSensorChannel );
- CleanupStack::PopAndDestroy( &channelInfoList ); //Close() is being called on "channelInfoList"
- CleanupStack::PopAndDestroy( channelFinder );
- }
-
- if( !iAccSensorListening )
- {
- PRINT(_L("Camera <=> CCamAppController::UpdateSensorApiL - calling iAccSensorChannel->OpenChannelL()"));
- TRAPD(channelerror, iAccSensorChannel->OpenChannelL() );
- if (channelerror!=KErrNone)
- {
- PRINT1(_L("CCamAppController::UpdateSensorApiL - iAccSensorChannel->OpenChannelL() failed. Error code: %d"),channelerror);
- User::Leave( channelerror );
- }
- //iAccSensorChannel->OpenChannelL();
- //orientation channel is now open.
-
- // start listening
- PRINT(_L("Camera <=> CCamAppController::UpdateSensorApiL - calling iAccSensorChannel->StartDataListeningL"));
- iAccSensorChannel->StartDataListeningL( this, //this object is data listener for this channel
- 1, //aDesiredCount is one, i.e. each orientation change is notified separately
- 1, //aMaximumCount is one, i.e. object count in receiving data buffer is one
- 0 );//buffering period is not used
- iAccSensorListening = ETrue;
- iLastImageOrientation = ECamOrientation0;
- }
- }
- }
- else // shut down the sensorApi object
- {
- PRINT(_L("Camera <=> UpdateSensorApiL shutting down iAccSensor"))
- if(iAccSensorListening)
- {
- // Stop listening to the events
- iAccSensorChannel->StopDataListening();
- iAccSensorListening = EFalse;
- }
-
- // Delete sensor api object
- delete iAccSensorChannel;
- iAccSensorChannel = NULL;
- }
- }
- PRINT(_L("Camera <= CCamAppController::UpdateSensorApiL"));
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandlePropertyChangedL()
-// Handle changes in specified property
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandlePropertyChangedL( const TUid& aCategory, const TUint aKey )
- {
- PRINT( _L("Camera => CCamAppController::HandlePropertyChangedL"))
-#if !( defined(__WINS__) || defined(__WINSCW__) )
-
- if ( iConfigManager && iConfigManager->IsLensCoverSupported() )
- {
- // First if condition could be removed after PCFW has released
- // creation for KLensCoverStatus key
- if ( ( aCategory == NMusResourceApi::KCategoryUid &&
- aKey == NMusResourceApi::KCameraAvailability ) ||
- ( aCategory == CameraPlatPSKeys::KPSCameraPlatUid &&
- aKey == CameraPlatPSKeys::KLensCoverStatus ) )
- {
-
- TInt err = iSlideStateWatcher->Get( iNewSlideState );
-
- PRINT2( _L( "Camera HandlePropertyChangedL getting slider state = %d, err = %d" ), iNewSlideState, err )
-
- if ( iNewSlideState != iSlideState )
- {
- delete iSliderCallBack;
- iSliderCallBack = NULL;
- iSliderCallBack = CPeriodic::NewL( CActive::EPriorityIdle );
- iSliderCallBack->Start( KLensCoverDelay, KLensCoverDelay, TCallBack( LensCoverUpdateL, this ) );
- }
- }
- else
- {
- (void)aCategory;
- (void)aKey;
- }
- }
-
- // if its key lock state changed
- if ( aCategory == KPSUidAvkonDomain && aKey == KAknKeyguardStatus )
- {
- PRINT( _L("Camera <> aCategory == KPSUidAvkonDomain && aKey == KAknKeyguardStatus") );
- if ( !IsKeyLockOn() )
- {
- PRINT( _L("Camera <> !IsKeyLockOn()") );
- // if in standby view and the slide is opened then exit standby view
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- TVwsViewId activeView;
- appUi->GetActiveViewId( activeView );
- CCamPreCaptureViewBase* view = static_cast<CCamPreCaptureViewBase*>( appUi->View( activeView.iViewUid ) );
- if ( iInfo.iOperation == ECamStandby ||
- ( view && view->IsInStandbyMode() ) && appUi->IsRecoverableStatus() )
- {
- PRINT( _L("Camera HandleSlideOpenedL => Exit Standby view") );
- view->HandleCommandL( ECamCmdExitStandby );
- }
- }
- }
-
- if ( aCategory == KPSUidProfileEngine && aKey == KProEngActiveProfileChanged )
- {
- PRINT( _L("Camera <> aCategory == KCRUidProfileEngine && aKey == KProEngActiveWarningTones") );
- IsProfileSilent();
- }
-
-#endif // !( defined(__WINS__) || defined(__WINSCW__
-
- PRINT( _L("Camera <= CCamAppController::HandlePropertyChangedL"))
-
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::LensCoverUpdate()
-// Callback function that is called when lens cover state changes.
-// Used to implement delayed handling of lens cover events.
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::LensCoverUpdateL( TAny* aPtr )
- {
- PRINT( _L( "Camera => CCamAppController::LensCoverUpdateL()" ) )
- CCamAppController* self = static_cast<CCamAppController*>( aPtr );
- if ( self->iNewSlideState != self->iSlideState ||
- self->iNewSlideState == CameraPlatPSKeys::EClosed // always handle closing
- )
- {
-
- self->iSlideState = self->iNewSlideState;
-
- if ( self->iSlideState == CameraPlatPSKeys::EClosed )
- {
- PRINT( _L( "Camera => CCamAppController::LensCoverUpdateL() SLIDE CLOSED" ) )
- self->HandleSlideClosedL();
- }
- else if ( self->iSlideState == CameraPlatPSKeys::EOpen )
- {
- PRINT( _L( "Camera => CCamAppController::LensCoverUpdateL() SLIDE OPENED" ) )
- self->HandleSlideOpenedL();
- }
- }
- self->iSliderCallBack->Cancel();
- delete self->iSliderCallBack;
- self->iSliderCallBack = 0;
-
- PRINT( _L( "Camera <= CCamAppController::LensCoverUpdateL()" ) )
- return KErrNone;
-
- }
-// ---------------------------------------------------------------------------
-// CCamAppController::RefreshSlideState
-// Force a refresh of the slide status
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::RefreshSlideStatus()
- {
- PRINT( _L("Camera => CCamAppController::RefreshSlideStatus") );
- // read the slider status from P & S key
- if ( iSlideStateWatcher->Get( iSlideState ) != KErrNone )
- {
- iSlideState = KErrNone;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandleSlideClosedL
-// Handle the slide closed event
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandleSlideClosedL()
- {
- PRINT( _L("Camera => CCamAppController::HandleSlideClosedL") );
-
- NotifyControllerObservers( ECamEventSliderClosed );
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
-
- if ( appUi->IsInPretendExit() )
- {
- PRINT( _L("Camera <= CCamAppController::HandleSlideClosedL already in pretend exit") );
- return;
- }
- SetCameraSwitchRequired( ESwitchDone );
- // shutdown the camera on slide closing if EDGE variant/standalone app
- // don't close app if embedded or embedding
- TInt camerasAvailable = CamerasAvailable();
- TVwsViewId activeView;
- TInt viewErr = appUi->GetActiveViewId( activeView );
-
- TBool embedded = appUi->IsEmbedded();
- TBool embedding = appUi->Embedding();
- if ( camerasAvailable == 1 ) // EDGE variant
- {
- PRINT( _L("Camera <> CCamAppController::HandleSlideClosedL - camerasAvailable == 1") );
- // if embedding another app then don't exit just yet
- if ( embedding )
- {
- PRINT( _L("Camera <> CCamAppController::HandleSlideClosedL - Embedding mode") );
- // remember that the slider has been closed
- iSliderCloseEvent = ETrue;
- }
- // Embedded post capture view
- else if ( embedded && viewErr == KErrNone &&
- ( activeView.iViewUid.iUid == ECamViewIdStillPostCapture ||
- activeView.iViewUid.iUid == ECamViewIdVideoPostCapture ) )
- {
- PRINT( _L("Camera <> CCamAppController::HandleSlideClosedL - Embedded post capture") );
- // remember that the slider has been closed
- iSliderCloseEvent = ETrue;
- }
- // if standalone app performing a burst capture,
- // don't exit till complete
- else if ( ECamImageCaptureBurst == iInfo.iImageMode ||
- ECamImageCaptureTimeLapse == iInfo.iImageMode )
- {
- // remember that the slider has been closed
- iSliderCloseEvent = ETrue;
- StopSequenceCaptureL();
- }
- else // standalone or embedded pre capture view
- {
- PRINT( _L("Camera <> CCamAppController::HandleSlideClosedL - emit ECamCmdSlideClosedExit") );
- appUi->HandleCommandL( ECamCmdSlideClosedExit );
- }
- }
- else // variants with > 1 camera
- {
- PRINT( _L("Camera <> CCamAppController::HandleSlideClosedL - camerasAvailable > 1") );
- if ( !embedding && !embedded )
- {
- // if standalone app performing a burst capture,
- // don't exit till complete
- if ( ECamImageCaptureBurst == iInfo.iImageMode ||
- ECamImageCaptureTimeLapse == iInfo.iImageMode )
- {
- // remember that the slider has been closed
- iSliderCloseEvent = ETrue;
- StopSequenceCaptureL();
- }
- else
- {
- PRINT( _L("Camera Normal mode-handle ECamCmdSlideClosedExit") );
- appUi->SetLensCoverExit( ETrue );
- if ( ECamViewIdVideoPreCapture == activeView.iViewUid.iUid )
- {
- // stop recording and save the video
- StopVideoRecording();
- }
- PRINT( _L("Camera <> CCamAppController::HandleSlideClosedL - emit ECamCmdSlideClosedExit") );
- appUi->HandleCommandL( ECamCmdSlideClosedExit );
-
- // 2ndary camera, slider closed -> application to be closed,
- // not in embedded mode
- if ( iInfo.iActiveCamera == ECamActiveCameraSecondary )
- {
- PRINT( _L("Camera <> CCamAppController::HandleSlideClosedL - 2ndary camera slider closed, app closing...") );
- appUi->CloseAppL();
- }
- }
- }
- else // we are embedded in an app or embedding another app
- {
- // remember that the slider has been closed
- PRINT( _L("Camera <> CCamAppController::HandleSlideClosedL - Embedded/Embedding mode") );
-
- if ( viewErr == KErrNone )
- {
- iSliderCloseEvent = ETrue;
-
- PRINT1( _L("Camera <> CCamAppController::HandleSlideClosedL - active view %d"), activeView.iViewUid.iUid );
- PRINT1( _L("Camera <> CCamAppController::HandleSlideClosedL - iInfo.iOperation %d"), iInfo.iOperation );
-
- // switch the camera if slide is closed and primary camera
- // is active in embedded mode
- switch ( activeView.iViewUid.iUid )
- {
- case ECamViewIdStillPreCapture:
- case ECamViewIdVideoPreCapture:
- {
- // if in pre capture view and slide is closed
- if ( iInfo.iActiveCamera == ECamActiveCameraPrimary )
- {
- if ( iInfo.iOperation != ECamPaused &&
- iInfo.iOperation != ECamCapturing &&
- iInfo.iOperation != ECamCompleting &&
- iInfo.iOperation != ECamPausing &&
- iInfo.iOperation != ECamResuming &&
- !iVideoRequested )
- {
- appUi->HandleCommandL( ECamCmdSwitchCamera );
- }
- else if ( iInfo.iOperation == ECamCapturing ||
- iInfo.iOperation == ECamPaused )
- {
- StopVideoRecording();
- }
- else if ( iVideoRequested )
- {
- StopVideoRecording();
- // cancel any outstanding sound requests
- iSoundPlayer->CancelAllPlaying();
-
- appUi->HandleCommandL( ECamCmdSwitchCamera );
- }
- else // lint
- {
- }
- }
- else
- {
- // Embedded camera not closed even if lens cover is closed.
- PRINT( _L("Camera <> CCamAppController::HandleSlideClosedL - 2ndary camera, no action..") );
- }
- }
- break;
- case ECamViewIdStillPostCapture:
- case ECamViewIdVideoPostCapture:
- {
- // Embedded camera not closed even if lens cover is closed.
- }
- break;
- default:
- break;
- }
- }
- else if ( viewErr == KErrNotFound )
- {
- PRINT( _L("Camera <> CCamAppController::HandleSlideClosedL - view not found") );
- if ( ECamActiveCameraPrimary == iInfo.iActiveCamera )
- {
- PRINT( _L("Camera <> CCamAppController::HandleSlideClosedL - need switch to 2ndary") );
- SetCameraSwitchRequired( ESwitchPrimaryToSecondary );
- if ( !appUi->AppInBackground( ETrue ) )
- {
- appUi->HandleCommandL( ECamCmdSwitchCamera );
- }
- }
- }
- }
- }
-
- PRINT( _L("Camera <= CCamAppController::HandleSlideClosedL") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandleSlideOpenedL
-// Handles the slide opened event
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandleSlideOpenedL()
- {
- PRINT( _L("Camera => CCamAppController::HandleSlideOpenedL") );
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- // reset slider event flag
- if ( iSliderCloseEvent )
- {
- iSliderCloseEvent = EFalse;
- }
-
- TVwsViewId activeView;
- TInt viewErr = appUi->GetActiveViewId( activeView );
- if ( viewErr == KErrNone )
- {
- PRINT1( _L("Camera HandleSlideOpenedL => active view %d"),
- activeView.iViewUid.iUid );
-
- // For EDGE variant
- TInt camerasAvailable = CamerasAvailable();
- if ( camerasAvailable == 1 )
- {
- // if in standby view and the slide is opened then exit standby view
- if ( iInfo.iOperation == ECamStandby )
- {
- PRINT( _L("Camera HandleSlideOpenedL => Exit Standby view") );
- appUi->View( activeView.iViewUid )->HandleCommandL(
- ECamCmdExitStandby );
- }
- }
- else // variants with > 1 camera
- {
- PRINT1( _L("Camera HandleSlideOpenedL => iInfo.iOperation %d"),
- iInfo.iOperation );
- PRINT1( _L("Camera HandleSlideOpenedL => CameraState() %d"),
- CameraState());
- switch ( activeView.iViewUid.iUid )
- {
- // if we are in the photo/video capture view and the
- // second camera is enabled then switch to the main camera
- // so long as video/photo capture is not in progress
- case ECamViewIdStillPreCapture:
- case ECamViewIdVideoPreCapture:
- {
- if ( iInfo.iActiveCamera == ECamActiveCameraSecondary &&
- iInfo.iOperation != ECamCapturing &&
- iInfo.iOperation != ECamPaused &&
- iInfo.iOperation != ECamPausing &&
- iInfo.iOperation != ECamResuming &&
- iInfo.iOperation != ECamCompleting &&
- (CameraState() == ECamCameraPreparedImage ||
- CameraState() == ECamCameraPreparedVideo
- ||
- CameraState() == ECamCameraReserved ||
- CameraState() == ECamCameraPowerOn
- ) &&
- !VideoRecordPending() )
- {
- PRINT( _L("Camera precapture 2nd camera - switching now") );
- SetCameraSwitchRequired( ESwitchSecondaryToPrimary );
- if ( !appUi->AppInBackground( ETrue ) )
- {
- appUi->HandleCommandL( ECamCmdSwitchCamera );
- }
- }
- else
- {
- PRINT( _L("Camera capturing, paused etc. in precapview") );
-
- if ( ECamViewIdVideoPreCapture == activeView.iViewUid.iUid &&
- ( ECamCapturing == iInfo.iOperation ||
- ECamPaused == iInfo.iOperation ) )
- {
- StopVideoRecording(); // stop recording and save the video
- }
- if ( ECamActiveCameraSecondary == iInfo.iActiveCamera )
- {
- PRINT( _L("Camera HandleSlideOpenedL, switchCamera") );
- SetCameraSwitchRequired( ESwitchSecondaryToPrimary );
- if ( !appUi->AppInBackground( ETrue ) )
- {
- appUi->HandleCommandL( ECamCmdSwitchCamera );
- }
- }
- }
- }
- break;
- case ECamViewIdStillPostCapture:
- case ECamViewIdVideoPostCapture:
- {
- if ( ECamActiveCameraSecondary == iInfo.iActiveCamera )
- {
- SetCameraSwitchRequired( ESwitchSecondaryToPrimary );
- if ( !appUi->AppInBackground( ETrue ) )
- {
- appUi->HandleCommandL( ECamCmdSwitchCamera );
- }
- }
- }
- break;
- default:
- break;
- }
- }
- }
-
- else if ( viewErr == KErrNotFound &&
- iInfo.iActiveCamera == ECamActiveCameraSecondary )
- {
- // If no view is found it means that camera is in background.
- // We don't want to do camera switch in embdedded/embedding mode
- // post-capture when in background
- if ( ( !appUi->IsEmbedded() &&
- !appUi->Embedding() ) ||
- appUi->CurrentViewState() != ECamViewStatePostCapture )
- {
- PRINT( _L("Camera HandleSlideOpenedL => view not found, 2nd active") );
- iCameraSwitchRequired = ESwitchToUnknown;
- }
- }
- else
- {
- }
- NotifyControllerObservers( ECamEventSliderOpen );
- PRINT( _L("Camera <= CamAppController::HandleSlideOpenedL") );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::VideoViewFinderResourceId()
-// Resource Id for video viewfinder layout
-//
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::VideoViewFinderResourceId( TCamVideoResolution aResolution )
- {
- PRINT( _L( "Camera => CCamAppController::VideoViewFinderResourceIdL"))
- TInt vidVFRes;
-
- TCamOrientation orient = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() )->CamOrientation();
- if( orient == ECamOrientationCamcorder || orient == ECamOrientationCamcorderLeft )
- {
- vidVFRes = CamUtility::MapVideoQualityToViewFinderRes( aResolution );
- }
- else
- {
- TInt resId;
- TInt err = CamUtility::GetPsiInt( ECamPsiVideoVFResSecondaryCamera, resId );
- if( err )
- {
- vidVFRes = ROID( R_CAM_VIEWFINDER_RECT_CIF_ID );
- }
- else
- {
- vidVFRes = ROID( resId );
- }
- }
-
- PRINT1( _L( "Camera => CCamAppController::VideoViewFinderResourceId res id "), vidVFRes )
- return vidVFRes;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandleObservedEvent()
-// Receives event codes from observables
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandleObservedEvent( TCamObserverEvent aEvent )
- {
- switch( aEvent )
- {
- case ECamObserverEventCaptureProcessComplete:
- {
- NotifyControllerObservers( ECamEventExitRequested, KErrNone );
- }
- break;
- default:
- break;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsProfileSilent
-// Return whether current profile is silent or not, uses warning
-// tones setting to determine whether silent or not
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsProfileSilent()
- {
- if ( !iShutterSndAlwaysOn )
- {
- TRAPD( ignore, iSilentProfile = IsProfileSilentL() );
- if ( ignore )
- {
- // If reading the warning tone (= camera tones) value fails
- // we set tones off by default
- iSilentProfile = ETrue;
- }
- return iSilentProfile;
- }
- else
- {
- return EFalse;
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsProfileSilentL
-// Return whether current profile is silent or not, uses warning
-// tones setting to determine whether silent or not
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsProfileSilentL()
- {
- // If camera tones have been set off from settings, return true here
- if ( iSettingsModel->IntegerSettingValue( ECamSettingItemPhotoCaptureTone )
- == ECamSettToneOff )
- {
- return ETrue;
- }
-
- // Get current keypad volume as an indication of whether
- // or not we have a silent profile
- CRepository* cr = CRepository::NewLC( KCRUidProfileEngine );
- TInt value;
- User::LeaveIfError( cr->Get( KProEngActiveWarningTones, value ) );
- PRINT1(_L("Camera <> CCamAppController::IsProfileSilentL() value = %d"), value)
- CleanupStack::PopAndDestroy( cr );
-
- return ( value == 0 );
- }
-
-
-// ---------------------------------------------------------------------------
-// ResetInactivityTimer <<static>>
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::ResetInactivityTimer( TAny* /*aPtr*/ )
- {
- PRINT( _L("Camera =><= CCamAppController::ResetInactivityTimer") );
-
- User::ResetInactivityTime();
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ToneShouldBeSilent
-// Returns ETrue if the supplied toneId should be silent if the profile is
-// set to silent. Does *not* take into account network variant forcing
-// sounds on.
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::ToneShouldBeSilent( TCamSoundId aSoundId )
- {
- if ( aSoundId == CaptureToneId() ||
- aSoundId == ECamVideoStartSoundId ||
- aSoundId == ECamVideoStopSoundId ||
- aSoundId == ECamVideoPauseSoundId ||
- aSoundId == ECamVideoResumeSoundId ||
- aSoundId == ECamAutoFocusComplete ||
- aSoundId == ECamSelfTimerSoundId )
- {
- return ETrue;
- }
- else
- {
- return EFalse;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandleCaptureCompletion
-// Inform any observers that are waiting for a capture completion event
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandleCaptureCompletion()
- {
- PRINT( _L( "Camera => CCamAppController::HandleCaptureCompletion()" ) )
-
- SetOperation( ECamNoOperation );
-
- // Re-enable screensaver
- EnableScreenSaver( ETrue );
-
- // If mmc dismount notification came while saving, allow the dismount now
- if( iDismountPending )
- {
- iDismountPending = EFalse;
- iDriveChangeNotifier->SendAllowDismount();
- }
-
- // If any observers are waiting for a capture completion event
- if ( iCaptureCompletionObserverHandler )
- {
- iCaptureCompletionObserverHandler->BroadcastEvent( ECamObserverEventCaptureProcessComplete );
- delete iCaptureCompletionObserverHandler;
- iCaptureCompletionObserverHandler = NULL;
- }
-
- // If the camera orientation changed during capture and not in burst mode,
- // set the new orientation
- if ( iConfigManager && iConfigManager->IsOrientationSensorSupported()
- && iOrientationChangeOccured
- && iInfo.iImageMode != ECamImageCaptureBurst )
- {
- iOrientationChangeOccured = EFalse;
- TRAP_IGNORE( SetImageOrientationL() );
- }
-
- if ( iPendingRelease )
- {
- PRINT( _L( "Camera <> CCamAppController::HandleCaptureCompletion(), DATAMAKE2" ) )
- ReleaseCamera();
- }
- PRINT( _L( "Camera <= CCamAppController::HandleCaptureCompletion()" ) )
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CheckAfModeForScene
-// Checks the current scene/based on scene to see if AF mode needs setting
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::CheckAfModeForScene( TBool aForceAFReset )
- {
- PRINT(_L("Camera => CCamAppController::CheckAfModeForScene"));
-
- if ( iConfigManager && iConfigManager->IsAutoFocusSupported() )
- {
- TRAP_IGNORE( iCameraController->DirectRequestL( ECamRequestSetAfRange ) );
- }
-
- PRINT(_L("Camera <= CCamAppController::CheckAfModeForScene"));
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::TryAutoFocus
-// Start an AF operation, if needed
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::TryAutoFocus()
- {
- PRINT( _L("Camera => CCamAppController::TryAutoFocus()") );
- OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAPPCONTROLLER_TRYAUTOFOCUS, "e_CAM_APP_AF_LOCK 1" ); //CCORAPP_AF_LOCK_START
-
- if ( iConfigManager && iConfigManager->IsAutoFocusSupported() )
- {
- if( ECamActiveCameraPrimary != iInfo.iActiveCamera ||
- ECamControllerImage != iInfo.iMode )
- {
- PRINT( _L("Returning EFalse - Not using primary camera in still mode") );
- // Not using primary camera in still mode
- return EFalse; // Not focusing
- }
-
- PRINT( _L("Calling IssueDirectRequestL( ECamRequestStartAutofocus )") );
- return TryAFRequest( ECamRequestStartAutofocus );
- }
- else
- {
- return ETrue;
- }
- }
-
-
-// ---------------------------------------------------------
-// CCamAppController::CurrentSceneHasForcedFocus
-// Returns whether the current scene has focus forced to
-// a particular value ( eg Macro/Landscape modes may have
-// focus fixed to Macro/Infinite )
-// ---------------------------------------------------------
-//
-TBool CCamAppController::CurrentSceneHasForcedFocus() const
- {
- if ( iConfigManager && iConfigManager->IsAutoFocusSupported() )
- {
- // Work out what the current scene is (or if current scene is user
- // scene, what it's based on).
- TInt currentScene = IntegerSettingValue( ECamSettingItemDynamicPhotoScene );
- if ( currentScene == ECamSceneUser )
- {
- currentScene = IntegerSettingValue( ECamSettingItemUserSceneBasedOnScene );
- }
-
- TBool isFaceTrackingOn = (iConfigManager &&
- iConfigManager->IsFaceTrackingSupported() &&
- (iSettingsModel->IntegerSettingValue(
- ECamSettingItemFaceTracking ) == ECamSettOn ) );
-
- // Check if the current (or based on) scene is one that should *not* have
- // a reticule.
- if ( ( currentScene == ECamSceneScenery
- || currentScene == ECamSceneNightScenery
- || currentScene == ECamSceneSports )
- && !isFaceTrackingOn )
- {
- return ETrue;
- }
- else
- {
- return EFalse;
- }
- }
- else
- {
- return ETrue;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CaptureToneDelayTimeout
-// Timeout from capture tone delay timer
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::CaptureToneDelayTimeout( TAny* aPtr )
- {
- PRINT( _L("Camera => CCamAppController::CaptureToneDelayTimeoutL") )
- static_cast<CCamAppController*>( aPtr )->PlayDelayedCaptureTone();
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::PlayDelayedCaptureTone
-// Play capture tone
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::PlayDelayedCaptureTone()
- {
- PlaySound( CaptureToneId(), EFalse );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::InitAutoFocusL
-// Initalises the AutoFocus interface, if needed
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::InitAutoFocusL()
- {
- PRINT( _L("Camera => CCamAppController::InitAutoFocusL") )
- PRINT(_L("Camera !! DISABLED"));
- PRINT( _L("Camera <= CCamAppController::InitAutoFocusL") )
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CopySnapshotIfNeededL
-// Helper function for McaeoSnapImageReady that makes a copy of the snapshot
-// if needed to fake a viewfinder or for image rotation.
-// ---------------------------------------------------------------------------
-//
-
-void
-CCamAppController::CopySnapshotIfNeeded( const CFbsBitmap& aSnapshot, TInt aError )
- {
- if ( ECamImageCaptureTimeLapse == iInfo.iImageMode
- || ECamControllerVideo == iInfo.iMode
- || ( iConfigManager && iConfigManager->IsOrientationSensorSupported() &&
- ( iSettingsModel->IntegerSettingValue( ECamSettingItemImageRotation ) == ECamSettOn
- || iInfo.iActiveCamera == ECamActiveCameraSecondary ) )
- )
- {
- StopIdleTimer();
- delete iSnapShotCopy;
- iSnapShotCopy = NULL;
- TRAP_IGNORE ( ( iSnapShotCopy = new(ELeave) CFbsBitmap() ) );
-
- if ( iSnapShotCopy )
- {
- TInt dupeError = iSnapShotCopy->Duplicate( aSnapshot.Handle() );
-
- if ( dupeError )
- {
- iSnapShotCopy->Reset();
- delete iSnapShotCopy;
- iSnapShotCopy = NULL;
- }
- else if ( iConfigManager && !iConfigManager->IsOrientationSensorSupported() )
- {
- if( ECamImageCaptureTimeLapse == iInfo.iImageMode )
- {
- // simulate the receipt of a viewfinder frame using the snapshot image
- // McaeoViewFinderFrameReady( *iSnapShotCopy, aError );
- HandleViewfinderFrame( aError, iSnapShotCopy );
- }
- }
- }
- }
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::EnableScreenSaver
-// Turns the screen saver on or off for timelapse capture
-//
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::EnableScreenSaver( TBool aEnable )
- {
- if ( !aEnable )
- {
- // Stop the screensaver from appearing
- RProperty::Set( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, 1 );
- }
- else
- {
- // Allow the screensaver to appear
- RProperty::Set( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, 0 );
- User::ResetInactivityTime();
- }
- }
-
-
-#ifdef CAMERAAPP_PERFORMANCE_MEASUREMENT
-// ---------------------------------------------------------------------------
-// CCamAppController::SetPerformanceState
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetPerformanceState( TCamPerformanceState aState )
- {
- iPerformanceState = aState;
- }
-#endif
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StartLocationTrailL()
-// Connects and starts the locationtrail
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::StartLocationTrailL()
- {
- PRINT( _L("Camera => CCamAppController::StartLocationTrailL") );
- CCamAppUi* appUI = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
-
- if( !iRepository )
- {
- iRepository = CRepository::NewL( KCRUidCameraappSettings );
- }
-
- TInt ftuValue=-1;
- TInt retErr=0;
- retErr = iRepository->Get( KCamCrFtuMessageFlag, ftuValue );
- if( ftuValue == 0 )
- {
- return;
- }
-
- if( iRepository )
- {
- delete iRepository;
- iRepository = NULL;
- }
-
-
- // If a stop request is pending but the trail is being restarted, stop
- // and delete the timer
- if( iLocationTrailTimer )
- {
- iLocationTrailTimer->Cancel();
- delete iLocationTrailTimer;
- iLocationTrailTimer = NULL;
- }
-
- TInt err = KErrNone;
-#if defined(RD_MDS_2_5) && !defined(__WINSCW__)
- if ( !iLocationTrailStarted )
- {
- if ( !iLocationUtilityConnected )
- {
- PRINT( _L("Camera => CCamAppController::StartLocationTrailL - iLocationUtility.Connect()") );
- TVwsViewId activeView;
- if ( appUI->GetActiveViewId( activeView ) == KErrNone )
- {
- if( ECamViewIdStillPreCapture == activeView.iViewUid.iUid )
- {
- CCamPreCaptureViewBase* view = static_cast<CCamPreCaptureViewBase*>( appUI->View( activeView.iViewUid ) );
- view->SetLocationTrailConnecting();
- }
- }
- User::LeaveIfError( iLocationUtility.Connect() );
- iLocationUtilityConnected = ETrue;
- }
- err = iLocationUtility.StartLocationTrail( RLocationTrail::ECaptureAll );
- }
-#endif
- // If start fails, change the setting to off
- if( KErrNone != err )
- {
- PRINT1( _L("Camera :: CCamAppController::StartLocationTrailL error:%d encountered while starting location trail"), err )
-
-#if defined(RD_MDS_2_5) && !defined(__WINSCW__)
- // Disconnect from the location utility
- PRINT( _L("Camera => CCamAppController::StartLocationTrailL - Starting of LocationTrail failed -> iLocationUtility.Close()") );
- iLocationUtility.Close();
- iLocationUtilityConnected = EFalse;
- SetIntegerSettingValueL( ECamSettingItemRecLocation, ECamLocationOff );
-#endif
-
- // Going to standby mode, location trail disabled
- /*
- TVwsViewId activeView;
- if ( appUI->GetActiveViewId( activeView ) == KErrNone )
- {
- CCamViewBase* view = static_cast<CCamViewBase*>( appUI->View( activeView.iViewUid ) );
- view->SwitchToStandbyModeL( TCamAppViewIds(activeView.iViewUid.iUid), err );
- }
- */
- appUI->SetStandbyStatus( err );
- appUI->HandleCommandL( ECamCmdGoToStandby );
- }
- else
- {
- iLocationTrailStarted = ETrue;
- }
- PRINT( _L("Camera <= CCamAppController::StartLocationTrailL") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StopLocationTrail( TBool aCloseSession )
-// Stops the locationtrail
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::StopLocationTrail( TBool aCloseSession )
- {
- PRINT1( _L("Camera => CCamAppController::StopLocationTrail operation mode:%d"), iInfo.iOperation );
-#if defined(RD_MDS_2_5) && !defined(__WINSCW__)
- if( iLocationTrailStarted )
- {
- // if not ECamCapturing, ECamPausing, ECamPaused, ECamResuming or ECamCompleting
- if( (iInfo.iOperation < ECamCapturing || iInfo.iOperation > ECamCompleting ) &&
- ( CurrentFullFileName() == KNullDesC || SavedCurrentImage() )
- )
- {
- PRINT( _L("Camera :: CCamAppController::StopLocationTrail - stopping location trail") )
- iLocationUtility.StopLocationTrail();
- if ( aCloseSession )
- {
- PRINT( _L("Camera => CCamAppController::StartLocationTrailL - iLocationUtility.Close()") );
- iLocationUtility.Close();
- iLocationUtilityConnected = EFalse;
- }
- iLocationTrailStarted = EFalse;
-
- // If a timer was used to stop the location trail, then cancel and delete the timer
- if( iLocationTrailTimer )
- {
- iLocationTrailTimer->Cancel();
- delete iLocationTrailTimer;
- iLocationTrailTimer = NULL;
- }
- }
- else
- {
- // Use a timer to close the trail in a few seconds
- PRINT( _L("Camera :: CCamAppController::StopLocationTrail - location trail in use") )
- if( !iLocationTrailTimer )
- {
- TRAP_IGNORE( iLocationTrailTimer = CCamTimer::NewL( KLocTrailCloseRetryTime,
- TCallBack( CCamAppController::RetryStopLocationTrail, this ) ) );
- }
- else // restart the timer
- {
- iLocationTrailTimer->Cancel();
- iLocationTrailTimer->SetTimeout( KLocTrailCloseRetryTime );
- }
- iLocationTrailTimer->StartTimer();
- }
- }
- else if ( aCloseSession )
- {
- PRINT( _L("Camera => CCamAppController::StartLocationTrailL - iLocationUtility.Close()") );
- // location trail already stopped, but we are exiting app, so close the utility
- iLocationUtility.Close();
- iLocationUtilityConnected = EFalse;
- }
-
- #endif
- PRINT( _L("Camera <= CCamAppController::StopLocationTrail") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RetryStopLocationTrail()
-// Timer callback function to attempt to remove the location trail periodically
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::RetryStopLocationTrail( TAny* aPtr )
- {
- PRINT( _L("Camera => CCamAppController::RetryStopLocationTrail") )
- static_cast<CCamAppController*>( aPtr )->StopLocationTrail();
- PRINT( _L("Camera <= CCamAppController::RetryStopLocationTrail") )
- return KErrNone;
- }
-
-// -----------------------------------------------------------------------------
-// CCamAppController::CaptureKeyPressedWhileImageSaving
-// Whether or not a capture key pressed during image saving
-// -----------------------------------------------------------------------------
-//
-TBool CCamAppController::CaptureKeyPressedWhileImageSaving() const
- {
- return iCaptureKeyPressedWhileImageSaving;
- }
-
-// -----------------------------------------------------------------------------
-// CCamAppController::SetCaptureKeyPressedWhileImageSaving
-// -----------------------------------------------------------------------------
-//
-void CCamAppController::SetCaptureKeyPressedWhileImageSaving(TBool aCaptureKeyPressed)
- {
- iCaptureKeyPressedWhileImageSaving = aCaptureKeyPressed;
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CamerasAvailable <<static>>
-//
-// Commonly needed in UI classes, so added also support to get this info
-// through this class. This way we avoid unnecessary binding of
-// CCameraController and UI classes.
-// ---------------------------------------------------------------------------
-//
-TInt
-CCamAppController::CamerasAvailable()
- {
- return CCamCameraController::CamerasAvailable();
- }
-
-TBool
-CCamAppController::TimeLapseSupported()
- {
- return (ECamSupportOn == iSettingsModel->VariantInfo().iTimeLapseSupport);
- }
-
-TBool
-CCamAppController::AlwaysOnSupported()
- {
- return (ECamSupportOn == iSettingsModel->VariantInfo().iAlwaysOnSupport);
- }
-
-const TVersion&
-CCamAppController::Version()
- {
- return iSettingsModel->VariantInfo().iVersion;
- }
-
-
-// <<public>>
-TBool
-CCamAppController::Busy() const
- {
- PRINT1(_L("Camera <> CCamAppController::Busy:%d"), iBusyFlags );
- return (EBusyNone != iBusyFlags || CameraControllerBusy() );
- }
-
-TBool
-CCamAppController::CameraControllerBusy() const
- {
- PRINT1(_L("Camera <> CCamAppController::CameraControllerBusy:%d"), iCameraController->ControllerInfo().iBusy );
- return (iCameraController && ECamBusyOff != iCameraController->ControllerInfo().iBusy );
- }
-
-// ===========================================================================
-// From MCamCameraObserver
-
-// ---------------------------------------------------------------------------
-// HandleCameraEventL <<virtual>>
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController
-::HandleCameraEventL( TInt aStatus,
- TCamCameraEventId aEventId,
- TAny* aEventData /*= NULL*/ )
- {
-#ifdef _DEBUG
- // Log viewfinder events with PRINT_FRQ
- // #ifdef _DEBUG is used to avoid extra if in release builds
- // where logging is not used anyway.
- if( ECamCameraEventVfFrameReady == aEventId )
- {
- PRINT_FRQ1( _L( "Camera => CCamAppController::HandleCameraEventL, event[%s]" ),
- KCamCameraEventNames[aEventId] );
- }
- else
-#endif // _DEBUG
- {
- PRINT1( _L( "Camera => CCamAppController::HandleCameraEventL, event[%s]" ),
- KCamCameraEventNames[aEventId] );
- }
-
- // in case we get poweron event before appui is completely constructed
- // finish it here
- if ( aEventId == ECamCameraEventPowerOn )
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if ( iConfigManager &&
- iConfigManager->IsUIOrientationOverrideSupported() &&
- !appUi->IsUiConstructionComplete() )
- {
- appUi->AppUIConstructCallbackL( appUi );
- }
- }
-
- TInt handleError( KErrNone );
-
- if( ECamCameraEventVfFrameReady != aEventId &&
- KErrNone == aStatus || KErrDiskFull == aStatus || KErrCompletion == aStatus )
- {
- // Called for all events, except viewfinder frame ready event.
- SetStateFromEvent( aEventId );
- }
-
- if( ECamCameraEventImageInit == aEventId ||
- ECamCameraEventVideoInit == aEventId )
- {
- iSettingsRestoreNeeded = ETrue;
- }
-
-
- // NOTE: Consider that the ones needing these events
- // receive them directly from Camera Controller?
- switch( aEventId )
- {
- case ECamCameraEventVfStart:
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- // For forced focus scenes, do one autofocus request once vf starts if needed
- if( UiConfigManagerPtr()->IsAutoFocusSupported() )
- {
- if( CurrentSceneHasForcedFocus() || UiConfigManagerPtr()->IsAutofocusSetInHyperfocalAtStartup() )
- {
- PRINT( _L( "Camera => CCamAppController::HandleCameraEventL, TryAFRequest( ECamRequestCancelAutofocus )") );
- TryAFRequest( ECamRequestCancelAutofocus );
- }
- }
- if( iSettingsRestoreNeeded )
- {
- iSettingsRestoreNeeded = EFalse;
- TRAP_IGNORE( iCameraController->DirectSettingsChangeL( ECameraSettingFacetracking ) );
- TRAP( aStatus, RestoreSettingsToCameraL() );
- }
- // fixed toolbar is used only with touch devices
- if ( IsTouchScreenSupported() && appUi )
- {
- CAknToolbar* toolbar = appUi->CurrentFixedToolbar();
- if ( toolbar )
- {
- CAknToolbarExtension* toolbarextension = toolbar->ToolbarExtension();
- if ( toolbarextension && toolbarextension->IsShown() )
- {
- appUi->SetToolbarVisibility();// avoid flickering in settings view
- }
- else
- {
- appUi->SubmergeToolbar();
- }
- }
- PRINT( _L( "Camera <> SetToolbarVisibility done ") );
- }
- // else use AP
- else
- {
- if( iConfigManager && iConfigManager->IsUIOrientationOverrideSupported() )
- {
- NotifyControllerObservers( ECamEventInitReady );
- }
- }
-
- if ( UiConfigManagerPtr()->IsLocationSupported() &&
- ECamLocationOn == IntegerSettingValue( ECamSettingItemRecLocation ) )
- {
- StartLocationTrailL();
- }
-
- //Check if profile is silent and/or camera tones are set off
- IsProfileSilent();
-
- break;
- }
- case ECamCameraEventVfFrameReady:
- {
- HandleViewfinderFrame( aStatus, static_cast<CFbsBitmap*>( aEventData ) );
-
- if( KErrNone == aStatus && iSettingsRestoreNeeded )
- {
- iSettingsRestoreNeeded = EFalse;
- TRAP( aStatus, RestoreSettingsToCameraL() );
- }
- return;
- }
- case ECamCameraEventSsReady:
- {
- TRAP_IGNORE( HandleSnapshotEvent( aStatus, static_cast<CFbsBitmap*>( aEventData ) ) );
-
- if ( ECamImageCaptureBurst == iInfo.iImageMode &&
- CurrentCapturedCount() < CaptureLimit() )
- {
- // check memory level
- TInt memoryLeft = 0;
- HAL::Get( HALData::EMemoryRAMFree, memoryLeft );
-
- if ( memoryLeft < KCriticalMemoryLevel )
- {
- PRINT( _L("Camera <> RAM is below critical level #1") )
- // memory below critical level, need to stop capture
- SoftStopBurstL( ETrue );
- EventHandlingErrorRecovery( KErrNoMemory );
- }
- }
-
- break;
- }
- case ECamCameraEventImageData:
- {
-// TRAP_IGNORE( HandleImageCaptureEventL( aStatus, static_cast<HBufC8*>( aEventData ) ) );
- TRAP_IGNORE( HandleImageCaptureEventL( aStatus, static_cast<CCamBufferShare*>( aEventData ) ) );
- if ( ECamImageCaptureBurst == iInfo.iImageMode &&
- CurrentCapturedCount() < CaptureLimit() )
- {
- // check memory level
- TInt memoryLeft = 0;
- HAL::Get( HALData::EMemoryRAMFree, memoryLeft );
- if ( memoryLeft < KCriticalMemoryLevel )
- {
- PRINT( _L("Camera <> RAM is below critical level #2") )
- // memory below critical level, need to stop capture
- TRAP_IGNORE( iCameraController->DirectRequestL( ECamRequestImageCancel ) );
- EventHandlingErrorRecovery( KErrNoMemory );
- }
- }
- break;
- }
- case ECamCameraEventImageStop:
- {
- TRAP( aStatus, HandleImageStopEventL( aStatus, aEventData ? *static_cast<TInt*>( aEventData ) : 0 ) );
- break;
- }
-
- case ECamCameraEventAutofocusSuccessful: // Flowthrough
- case ECamCameraEventAutofocusFailed:
- {
- // Autofocusing is done, do possible pending capture
- SetAfNeeded( EFalse );
- if( iCaptureRequested && !EngineProcessingCapture() )
- {
- iCaptureRequested = EFalse;
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP7_CCAMAPPCONTROLLER_HANDLECAMERAEVENTL, "e_CAM_APP_AF 0" );
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP8_CCAMAPPCONTROLLER_HANDLECAMERAEVENTL, "e_CAM_PRI_AF_LOCK 0" );
- OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAPPCONTROLLER_HANDLECAMERAEVENTL, "e_CAM_APP_SHOT_TO_SNAPSHOT 1" );
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP1_CCAMAPPCONTROLLER_HANDLECAMERAEVENTL, "e_CAM_PRI_SHOT_TO_SNAPSHOT 1" );
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP2_CCAMAPPCONTROLLER_HANDLECAMERAEVENTL, "e_CAM_PRI_SHOT_TO_SAVE 1" );
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP3_CCAMAPPCONTROLLER_HANDLECAMERAEVENTL, "e_CAM_PRI_SHOT_TO_SHOT 1" );
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP4_CCAMAPPCONTROLLER_HANDLECAMERAEVENTL, "e_CAM_APP_SHOT_TO_STILL 1" );
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP5_CCAMAPPCONTROLLER_HANDLECAMERAEVENTL, "e_CAM_APP_CAPTURE_START 1" );
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP6_CCAMAPPCONTROLLER_HANDLECAMERAEVENTL, "e_CAM_PRI_SERIAL_SHOOTING 1" );
-
- // When image capture is started with touch capture button, a short
- // delay is added after AF completes, but before capturing starts to
- // avoid blurry screen sometimes when VF is frozen and before the
- // snapshot is drawn. Delay also helps to see focus reticule.
- if( iTouchCapture )
- {
- User::After( 50000 );
- iTouchCapture = EFalse;
- }
- Capture();
- }
- break;
- }
-
- case ECamCameraEventSettingsSingle:
- {
- TRAP_IGNORE( HandleSettingEventL( aStatus, aEventId, aEventData ) );
- return;
- }
- case ECamCameraEventVideoAsyncStop:
- case ECamCameraEventVideoStop:
- {
- // we always want to handle these events. set the flag because
- // there is a possibility that some other event has come before
- // and caused the flag to be cleared
- SetFlags(iBusyFlags, EBusyRequest);
- if ( !IsMemoryAvailable( ECamMediaStorageCard, EFalse )
- && CurrentStorage() == ECamMediaStorageCard )
- {
- aStatus = KErrNone;
- }
- if( aStatus != KErrNone && aStatus != KErrDiskFull && aStatus != KErrCompletion
- && !( aStatus == KErrPathNotFound && IsCaptureStoppedForUsb() ) )
- {
- iSaving = EFalse;
- SetOperation( ECamStandby, KErrGeneral );
- }
- else
- {
- // In case of no error, we are already in appropriate state
- }
- break;
- }
- case ECamCameraEventIveRecover:
- {
- if( !Busy() )
- {
- PRINT( _L( "Camera => CCamAppController::HandleCameraEventL - Issue new recovery sequence" ) );
- SetStateFromEvent( ECamCameraEventReserveLose );
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- // Find target mode from appUi and set this controller target mode
- if( appUi->TargetMode() == ECamControllerVideo )
- {
- PRINT( _L( "Camera => CCamAppController::HandleCameraEventL - recover to video mode" ) );
- SetTargetMode( ECamControllerVideo );
- SetTargetImageMode( ECamImageCaptureNone );
- }
- else
- {
- PRINT( _L( "Camera => CCamAppController::HandleCameraEventL - recover to still mode" ) );
- SetTargetMode( ECamControllerImage );
- SetTargetImageMode( CurrentImageModeSetup() );
- }
- IssueModeChangeSequenceL();
- }
- else
- {
- PRINT( _L( "Camera => CCamAppController::HandleCameraEventL - Recovery sequence is active" ) );
- }
- break;
- }
- case ECamCameraEventSequenceEnd:
- {
- // only for image mode
- if( iConfigManager && iConfigManager->IsOrientationSensorSupported()
- && ECamControllerImage == CurrentMode() )
- {
- // If the camera orientation changed during initialization sequence and not in burst mode,
- // set the new orientation
- if ( iOrientationChangeOccured &&
- iInfo.iImageMode != ECamImageCaptureBurst )
- {
- iOrientationChangeOccured = EFalse;
- TRAP_IGNORE( SetImageOrientationL() );
- }
- if( !iAccSensorListening )
- {
- TRAP_IGNORE( UpdateSensorApiL( ETrue ) );
- }
- }
- if ( aStatus == KErrCancel )
- {
- // sequence canceled, no need to event further
- return;
- }
- else if( aStatus == KErrNone )
- {
- //Reset standbystatus. Needed if recovered from error.
- if( IsAppUiAvailable() )
- {
- if ( !InVideocallOrRinging() )
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- appUi->SetStandbyStatus( aStatus );
- }
- }
- }
- break;
- }
- //Image capture event
- case ECamCameraEventImageCaptureEvent:
- {
- PlaySound( CaptureToneId(), EFalse );
- }
- break;
- default:
- break;
- }
-
-
- // -------------------------------------------------------
- // We have requested a series of operations.
- // The sequences have ids, which we use to determine
- // the right procedure. React when sequence ends.
- if( IsFlagOn( iBusyFlags, EBusySequence ) )
- {
- PRINT( _L( "Camera <> Sequence of requests pending" ) );
- TRAP( handleError, HandleSequenceEventL( aStatus, aEventId, aEventData ) );
- }
- // -------------------------------------------------------
- // We have single request pending.
- else if( IsFlagOn( iBusyFlags, EBusyRequest ) )
- {
- PRINT( _L( "Camera <> Single request pending" ) );
- TRAP( handleError, HandleRequestEventL( aStatus, aEventId, aEventData ) );
- }
- else if( IsFlagOn( iBusyFlags, EBusySetting ) )
- {
- PRINT( _L( "Camera <> Settings finished" ) );
- TRAP( handleError, HandleSettingEventL( aStatus, aEventId, aEventData ) );
- }
- // -------------------------------------------------------
- // No request pending for us.
- // Direct request issued to Camera controller.
- else
- {
- PRINT( _L( "Camera <> No requests pending!!" ) );
- // handle these ..
- }
-
- // -------------------------------------------------------
- if( KErrNone != handleError )
- {
- EventHandlingErrorRecovery( handleError );
- }
-
- // Reserve lost event is always handled.
- if( ECamCameraEventReserveLose == aEventId && KErrNone != aStatus )
- {
- SetOperation( ECamStandby, aStatus );
- }
-
- if( iPendingRelease && !Busy() &&
- !IsSavingInProgress() && iInfo.iOperation != ECamCapturing )
- {
- // Finally, if camera release is pending, and we are no longer busy,
- // call ReleaseCamera to get it done.
- // ReleaseCamera is used instead of simply setting iInfo.iTargetMode,
- // because it also handles stopping ongoing burst captures.
- PRINT( _L( "Camera <> CCamAppController::HandleCameraEventL, release pending, calling ReleaseCamera..") );
- ReleaseCamera();
- }
-
-#ifdef _DEBUG
- // Log viewfinder events with PRINT_FRQ
- if( ECamCameraEventVfFrameReady == aEventId )
- {
- PRINT_FRQ( _L( "Camera <= CCamAppController::HandleCameraEventL" ) );
- }
- else
-#endif // _DEBUG
- {
- PRINT( _L( "Camera <= CCamAppController::HandleCameraEventL" ) );
- }
- }
-
-// ===========================================================================
-
-
-// ---------------------------------------------------------------------------
-// EventHandlingErrorRecovery
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::EventHandlingErrorRecovery( TInt aError )
- {
- PRINT1( _L( "Camera => CCamAppController::EventHandlingErrorRecovery, error:%d" ), aError );
-
- __ASSERT_ALWAYS( aError != KErrNone, CamPanic( ECamPanicInvalidState ) );
-
- iCaptureModeTransitionInProgress = EFalse;
-
- // Reset the saving flag to ensure that camera does not get stuck
- iSaving = EFalse;
-
- iMuteNotifications = ETrue;
-
- // Cancel ongoing sequence if any
- iCameraController->CancelSequence();
-
- // Clear busy flags
- iBusyFlags = EBusyNone;
- iInfo.iBusyRequestId = ECamRequestNone;
-
- iMuteNotifications = EFalse;
-
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- //Don't change to Stand by mode if -4 error gotten during burst (somehow expected)
- if(SequenceCaptureInProgress() && appUi->CurrentBurstMode() == ECamImageCaptureBurst && KErrNoMemory == aError )
- {
- TRAP_IGNORE( appUi->HandleCameraErrorL(aError) );
- }
- else
- {
- SetOperation( ECamStandby, aError );
- }
-
- NotifyControllerObservers( ECamEventControllerReady, aError );
-
- PRINT( _L( "Camera <= CCamAppController::EventHandlingErrorRecovery" ) );
- }
-
-// ---------------------------------------------------------------------------
-// HandleSettingEventL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::HandleSettingEventL( TInt aStatus,
- TCamCameraEventId aEventId,
- TAny* aEventData )
- {
- PRINT( _L( "Camera => CCamAppController::HandleSettingEventL" ) );
- // -------------------------------------------------------
- if( ECamCameraEventSettingsDone == aEventId )
- {
- ClearFlags( iBusyFlags, EBusySetting );
-
- // Need to clear any pending settings.
- iSettingProvider->Reset();
-
- if( IsInShutdownMode() && iInfo.iMode != ECamControllerIdle && iInfo.iMode != ECamControllerShutdown )
- {
- PRINT( _L( "Camera <> CCamAppController: Releasing camera.." ) );
- IssueRequestL( ECamRequestRelease );
- }
- else
- {
- PRINT( _L( "Camera <> CCamAppController: Got setting end event.." ) );
- if( KErrNone != aStatus )
- {
- TCamCameraSettingId* cameraSetting =
- static_cast<TCamCameraSettingId*>( aEventData );
-
- // Leave with the incoming error, if setting id not provided.
- CheckNonNullL( cameraSetting, aStatus );
-
- if( ECameraSettingFileName == *cameraSetting )
- {
- DoVideoNameRetryL( aStatus );
- }
- else
- {
- User::Leave( aStatus );
- }
- }
- else
- {
- ProceedPendingOrNotifyReadyL();
- }
- }
- }
- // -------------------------------------------------------
- else if( ECamCameraEventSettingsSingle == aEventId )
- {
- TCamCameraSettingId* cameraSetting =
- static_cast<TCamCameraSettingId*>( aEventData );
-
- CheckNonNullL( cameraSetting, KErrNotFound );
- switch( *cameraSetting )
- {
- case ECameraSettingDigitalZoom:
- case ECameraSettingOpticalZoom:
- {
- PRINT( _L( "Camera <> CCamAppController: zoom event" ) );
- NotifyControllerObservers( ECamEventZoomStateChanged, aStatus );
- // Pending zooming done in HandleViewfinderFrame
- break;
- }
- default:
- PRINT( _L( "Camera <> CCamAppController: unhandled setting event" ) );
- break;
- }
- }
- // -------------------------------------------------------
- else
- {
- // Ignored
- }
- // -------------------------------------------------------
- PRINT( _L( "Camera <= CCamAppController::HandleSettingEventL" ) );
- }
-
-// ---------------------------------------------------------------------------
-// DoVideoNameRetryL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::DoVideoNameRetryL( TInt aStatus )
- {
- PRINT( _L( "Camera => CCamAppController::DoVideoNameRetryL" ) );
- if ( IsFlagOn( iCameraController->State(), ECamVideoOn )
- && iVideoNameRetries > 0 )
- {
- PRINT1( _L( "Camera <> video rename failed retries = %d retrying rename" ), iVideoNameRetries );
-
- // Try again
- --iVideoNameRetries;
- TRAP_IGNORE( GenerateNextValidVideoPathL() );
- if ( ECamCapturing != iInfo.iOperation && ECamPaused != iInfo.iOperation )
- {
- iSettingProvider->AddPendingSettingChangeL( ECamSettingItemVideoNameBase );
- }
- IssueSettingsChangeRequestL();
- }
- else if ( KErrDiskFull == aStatus
- && ECamMediaStorageCard == IntegerSettingValue( ECamSettingItemVideoMediaStorage ) )
- {
- PRINT( _L( "Camera McaeoVideoPrepareComplete disk full and set to memory card " ) );
- NotifyControllerObservers( ECamEventInvalidMemoryCard );
-
- // ForceUsePhoneMemory
- if( ExistMassStorage() )
- {
- TRAP_IGNORE(
- {
- iSettingsModel->SetIntegerSettingValueL( ECamSettingItemVideoMediaStorage,
- ECamMediaStorageMassStorage );
- GenerateNextValidVideoPathL();
- });
- }
- else
- {
- TCamMediaStorage storage = IntegerSettingValue(ECamSettingItemRemovePhoneMemoryUsage)?
- ECamMediaStorageNone:
- ECamMediaStoragePhone;
- TRAP_IGNORE(
- {
- iSettingsModel->SetIntegerSettingValueL( ECamSettingItemVideoMediaStorage,
- storage );
- GenerateNextValidVideoPathL();
- });
-
- }
- iSettingProvider->AddPendingSettingChangeL( ECamSettingItemVideoMediaStorage );
- IssueSettingsChangeRequestL();
- }
- // No retries left
- else
- {
- PRINT1( _L( "Camera <> video prep failed retries = %d removing iVideoRequested" ), iVideoNameRetries );
- // remove pending request, so that new attempts to record are not blocked
- if ( iVideoRequested )
- iVideoRequested = EFalse;
-
- User::LeaveIfError( aStatus );
- }
- PRINT( _L( "Camera <= CCamAppController::DoVideoNameRetryL" ) );
- }
-
-// ---------------------------------------------------------------------------
-// HandleCameraSequenceComplete
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::HandleSequenceEventL( TInt aStatus,
- TCamCameraEventId aEventId,
- TAny* /*aEventData*/ )
- {
- PRINT( _L( "Camera => CCamAppController::HandleSequenceEventL" ) );
-
- if( iDismountPending &&
- ( ECamCameraEventImageInit == aEventId ||
- ECamCameraEventVideoInit == aEventId ||
- ECamCameraEventSequenceEnd == aEventId ) )
- {
- iDismountPending = EFalse;
- iDriveChangeNotifier->SendAllowDismount();
- }
- if( ECamCameraEventSequenceEnd == aEventId )
- {
- ClearFlags( iBusyFlags, EBusySequence );
-
- if( IsInShutdownMode() && iInfo.iMode != ECamControllerIdle && iInfo.iMode != ECamControllerShutdown )
- {
- PRINT( _L( "Camera <> In shutdown mode!!" ) );
- IssueRequestL( ECamRequestRelease );
- }
- else
- {
- User::LeaveIfError( aStatus );
- if( iCameraController && !iCameraController->IsWaitingIveResources() )
- {
- PRINT( _L( "Camera <> sequence end, proceed with pending.." ) );
- ProceedPendingOrNotifyReadyL();
- }
- }
- }
-
- PRINT( _L( "Camera <= CCamAppController::HandleSequenceEventL" ) );
- }
-
-// ---------------------------------------------------------------------------
-// HandleRequestEventL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::HandleRequestEventL( TInt aStatus,
- TCamCameraEventId aEventId,
- TAny* /*aEventData*/ )
- {
- PRINT( _L( "Camera => CCamAppController::HandleRequestEventL" ) );
-
- // Check if pending operations that need immediate attention.
- if( IsInShutdownMode() && iInfo.iMode != ECamControllerIdle &&
- iInfo.iMode != ECamControllerShutdown &&
- !iSaving && iInfo.iOperation != ECamCapturing &&
- iInfo.iOperation != ECamCompleting )
- {
- PRINT( _L( "Camera <> in shutdown mode, release camera.." ) );
- IssueDirectRequestL( ECamRequestRelease );
- }
- else
- {
- if( ECamCameraEventVideoStop == aEventId )
- {
- ClearFlags( iBusyFlags, EBusyRequest );
- HandleVideoStopEvent( aStatus );
- //If postcapture view is set to off notify controller ready event
- //for updating counter.
- if(IntegerSettingValue(ECamSettingItemVideoShowCapturedVideo)!=ECamSettOn )
- {
- NotifyControllerObservers( ECamEventControllerReady, KErrNone );
- }
- }
- else if( ECamCameraEventVideoAsyncStop == aEventId )
- {
- HandleVideoAsyncStopEvent( aStatus );
- }
- else
- {
- // Error handling in one place
- User::LeaveIfError( aStatus );
-
- // If our request is fully processed.
- if( !CameraControllerBusy() )
- {
- PRINT( _L( "Camera <> camera not busy, proceed or notify ready.." ) );
- ClearFlags( iBusyFlags, EBusyRequest );
- ProceedPendingOrNotifyReadyL();
- }
- }
- }
- PRINT( _L( "Camera <= CCamAppController::HandleRequestEventL" ) );
- }
-
-
-// ---------------------------------------------------------------------------
-// IssueRequestL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController
-::IssueRequestL( const TCamCameraRequestId& aId )
- {
- PRINT1( _L("Camera => CCamAppController::IssueRequestL request[%s]"), KCamRequestNames[aId] );
-
- SetFlags( iBusyFlags, EBusyRequest );
- iInfo.iBusyRequestId = aId;
-
- TRAPD( error, iCameraController->RequestL( iInfo.iBusyRequestId ) );
- if( error != KErrNone )
- {
- ClearFlags( iBusyFlags, EBusyRequest );
- iInfo.iBusyRequestId = ECamRequestNone;
- User::Leave( error );
- }
-
- PRINT( _L("Camera <= CCamAppController::IssueRequestL") );
- }
-
-// ---------------------------------------------------------------------------
-// IssueDirectRequestL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController
-::IssueDirectRequestL( const TCamCameraRequestId& aId )
- {
- PRINT( _L("Camera => CCamAppController::IssueDirectRequestL") );
- iCameraController->DirectRequestL( aId );
- PRINT( _L("Camera <= CCamAppController::IssueDirectRequestL") );
- }
-
-
-// ---------------------------------------------------------------------------
-// IssueSettingsChangeRequestL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::IssueSettingsChangeRequestL()
- {
- PRINT( _L("Camera => CCamAppController::IssueSettingsChangeRequestL") );
- SetFlags( iBusyFlags, EBusySetting );
-
- TRAPD( error, iCameraController->RequestSettingsChangeL() );
- if( KErrNone != error )
- {
- ClearFlags( iBusyFlags, EBusySetting );
- User::Leave( error );
- }
- PRINT( _L("Camera <= CCamAppController::IssueSettingsChangeRequestL") );
- }
-
-// ---------------------------------------------------------------------------
-// ProceedPendingOrNotifyReadyL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::ProceedPendingOrNotifyReadyL()
- {
- PRINT( _L("Camera => CCamAppController::ProceedPendingOrNotifyReadyL") );
- PRINT4( _L("Camera <> iMode[%s] iTargetMode[%s] iImageMode[%s] iTargetImageMode[%s]"),
- KCamModeNames[iInfo.iMode],
- KCamModeNames[iInfo.iTargetMode],
- KCamImageModeNames[iInfo.iImageMode],
- KCamImageModeNames[iInfo.iTargetImageMode] );
-
- __ASSERT_DEBUG( iCameraController, CamPanic( ECamPanicNullPointer ) );
-
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
-
- if( iInfo.iMode != iInfo.iTargetMode )
- {
- if ( !IsInShutdownMode() && !iSaving && iInfo.iOperation != ECamCapturing && iInfo.iOperation != ECamStandby )
- {
- PRINT1( _L("Camera <> CCamAppController: not in target mode, need to issue requests iInfo.iOperation=%d"), iInfo.iOperation );
- IssueModeChangeSequenceL();
- }
- }
- else if( iCameraController->ViewfinderState() != iInfo.iTargetVfState &&
- IsAppUiAvailable () &&
- !appUi->AppInBackground( ETrue ) &&
- !( iConfigManager && iConfigManager->IsUIOrientationOverrideSupported() &&
- iPendingRelease ) )
- {
- PRINT( _L("Camera <> CCamAppController: need to start/stop viewfinder..") );
- IssueModeChangeSequenceL();
- }
- else if( iSettingProvider
- && iSettingProvider->PendingSettingChangeCount() > 0 )
- {
- PRINT( _L("Camera <> CCamAppController: settings pending, proceed now..") );
- IssueSettingsChangeRequestL();
- }
- else if( iVideoPrepareNeeded )
- {
- PRINT( _L("Camera <> CCamAppController: video prepare pending, proceed now..") );
- iVideoPrepareNeeded = EFalse;
- IssueRequestL( ECamRequestVideoInit );
- }
- else
- {
- PRINT( _L("Camera <> CCamAppController: Target mode achieved") );
- if( iCaptureModeTransitionInProgress )
- {
- PRINT( _L("Camera <> CCamAppController: capture mode transition complete") );
- iCaptureModeTransitionInProgress = EFalse;
- SetImageMode( iInfo.iTargetImageMode );
- }
-
- if ( iSetNewPathnamesPending > ECamMediaStorageNone )
- {
- TRAP_IGNORE( SetPathnamesToNewStorageL( iSetNewPathnamesPending ) );
- }
-
- if( iVideoRequested )
- {
- PRINT( _L("Camera <> starting recording..") );
- iVideoRequested = EFalse;
- IssueRequestL( ECamRequestVideoStart );
- PRINT( _L("Camera <> ..done") );
- }
-
-
- NotifyControllerObservers( ECamEventEngineStateChanged, KErrNone );
- NotifyControllerObservers( ECamEventControllerReady, KErrNone );
- }
- PRINT( _L("Camera <= CCamAppController::ProceedPendingOrNotifyReadyL") );
- }
-
-// ---------------------------------------------------------------------------
-// SetStateFromEvent
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetStateFromEvent( TCamCameraEventId aEventId )
- {
- PRINT3( _L("Camera => CCamAppController::SetStateFromEvent mode[%s] operation[%s] event[%s]"),
- KCamModeNames[iInfo.iMode],
- KCamCaptureOperationNames[iInfo.iOperation],
- KCamCameraEventNames[aEventId]
- );
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- switch( aEventId )
- {
- // =================================
- case ECamCameraEventReserveLose:
- // SetMode( ECamControllerShutdown );
- SetMode( ECamControllerIdle );
- SetOperation( ECamNoOperation );
- // we dont need location trail anymore.
- StopLocationTrail();
- break;
- // ---------------------------------
- case ECamCameraEventPowerOn:
- PRINT( _L("Camera <> Init key sound system..") );
- iSoundPlayer->InitKeySoundSystem();
- PRINT( _L("Camera <> ..Init key sound system done") );
- break;
- // ---------------------------------
- case ECamCameraEventPowerOff:
- // Reset the flash error status
- if( iFlashStatus ) iFlashStatus->SetFlashError( EFalse );
- SetMode( ECamControllerIdle );
- SetOperation( ECamNoOperation );
- break;
- // =================================
- // VF events
- case ECamCameraEventVfStart:
- if( iBacklightTimer
- && !iBacklightTimer->IsActive() )
- {
- //iBacklightTimer->Start( KBacklighTimerInterval,
- // KBacklighTimerInterval,
- // TCallBack( ResetInactivityTimer, this ) );
- iBacklightTimer->Start( 0,
- KBacklighTimerInterval,
- TCallBack( ResetInactivityTimer, this ) );
- }
- iAFCancelInProgress = EFalse;
- break;
- // ---------------------------------
- case ECamCameraEventVfStop:
- if( iBacklightTimer )
- {
- iBacklightTimer->Cancel();
- }
- break;
- // =================================
- case ECamCameraEventImageInit:
- PRINT ( _L("Camera <> CCamAppController::SetStateFromEvent .. case ECamCameraEventImageInit") );
- SetMode( ECamControllerImage );
-
- // Set the capture count now, so we don't need to set it when starting capture.
- TRAP_IGNORE( InitCaptureLimitL() );
- SetOperation( ECamNoOperation );
- NotifyControllerObservers( ECamEventImageQualityChanged );
-
- break;
- // ---------------------------------
- case ECamCameraEventImageStart: // Capture started, not finished.
- PRINT ( _L("Camera <> CCamAppController::SetStateFromEvent .. case ECamCameraEventImageStart") );
- SetOperation( ECamCapturing );
-
- // Make sure our cached value for image filename number is up to date.
- iImageNumberCache = IntegerSettingValue( ECamSettingItemPhotoNumber );
- break;
- // ---------------------------------
- case ECamCameraEventImageStop: // Capture finished, unless in burst
- PRINT ( _L("Camera <> CCamAppController::SetStateFromEvent .. case ECamCameraEventImageStop") );
- // Store image counter now.
- TRAP_IGNORE( SetIntegerSettingValueL( ECamSettingItemPhotoNumber, iImageNumberCache ) );
-
- if ( ECamImageCaptureBurst != iInfo.iImageMode )
- {
-
- //If canceled autofocusing previously then have to set
- //autofocus range to get autofocusing work again.
-
- if(iAFCancelInProgress )
- {
- iAFCancelInProgress = EFalse;
- TRAP_IGNORE( iCameraController->DirectRequestL( ECamRequestSetAfRange ) );
-
- }
-
-
-// No operation change here.
-// Set to Completing in SS event, and ECamNoOperation when image saved.
-// SetOperation( ECamNoOperation );
- }
- break;
- // ---------------------------------
- case ECamCameraEventImageRelease:
- SetMode( ECamControllerIdle );
- SetOperation( ECamNoOperation );
- break;
- // =================================
- case ECamCameraEventVideoInit:
- SetMode( ECamControllerVideo );
- SetOperation( ECamNoOperation );
- break;
- // ---------------------------------
- case ECamCameraEventVideoStart:
- iVideoRequested = EFalse;
- SetOperation( ECamCapturing );
- break;
- // ---------------------------------
- case ECamCameraEventVideoPause:
- PlaySound( ECamVideoPauseSoundId, EFalse );
- SetOperation( ECamPaused );
- break;
- // ---------------------------------
- case ECamCameraEventVideoStop:
- SetOperation( ECamCompleting );
- break;
- // ---------------------------------
- case ECamCameraEventVideoRelease:
- SetMode( ECamControllerIdle );
- SetOperation( ECamNoOperation );
- break;
- // =================================
- case ECamCameraEventStartAutofocus:
-
- if ( !CurrentSceneHasForcedFocus() &&
- !iAFCancelInProgress )
- {
- PRINT( _L("ECamCameraEventStartAutofocus -> Set operation state to ECamFocusing") );
- iCurrentAFRequest=ECamRequestStartAutofocus;
- SetOperation( ECamFocusing );
- // fixed toolbar is used only with touch devices
- if ( IsTouchScreenSupported() )
- {
- CAknToolbar* fixedToolbar = appUi->CurrentFixedToolbar();
- if ( fixedToolbar )
- {
- CAknToolbarExtension* extension = fixedToolbar->ToolbarExtension();
- if ( extension )
- {
- // Keep toolbar extension hidden after the half press key is released
- extension->SetShown( EFalse );
- }
- fixedToolbar->SetToolbarVisibility( EFalse );
- }
- }
- }
- break;
- // ---------------------------------
- case ECamCameraEventAutofocusSuccessful:
- case ECamCameraEventAutofocusFailed:
- {
- OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAPPCONTROLLER_SETSTATEFROMEVENT, "e_CAM_APP_AF_LOCK 0" ); //CCORAPP_AF_LOCK_END
- OstTrace0( CAMERAAPP_PERFORMANCE, DUP1_CCAMAPPCONTROLLER_SETSTATEFROMEVENT, "e_CAM_APP_OVERLAY_UPD 1" ); //CCORAPP_OVERLAY_UPD_START
- PRINT2( _L("Camera <> CCamAppController::SetStateFromEvent - iPendingAFRequest[%s] iCurrentAFRequest[%s]"),
- KCamRequestNames[iPendingAFRequest],
- KCamRequestNames[iCurrentAFRequest] );
-
- if( iAFCancelInProgress && ECamRequestCancelAutofocus == iCurrentAFRequest &&
- ECamRequestCancelAutofocus == iPendingAFRequest )
- {
- // Cancelling done, camera lens is in hyperfocal position.
- // Return AF range back to normal, so that next autofocus request
- // will use the right range for this scene.
- iAFCancelInProgress = EFalse;
- TRAP_IGNORE( iCameraController->DirectRequestL( ECamRequestSetAfRange ) );
- iPendingAFRequest=0;
- iCurrentAFRequest=0;
- NotifyControllerObservers( ECamEventFocusCancelled );
-
- if ( !iCaptureRequested )
- {
- SetOperation( ECamNoOperation );
- }
- else
- {
- // do not notify observers if this happens after capture
- // has been requested as that would result in invalid ui state
- iInfo.iOperation = ECamNoOperation;
- if( IsAfNeeded() )
- {
- SetAfNeeded( EFalse );
- StartAutoFocus();
- }
- }
- }
- else if( iCurrentAFRequest==iPendingAFRequest &&
- iPendingAFRequest==ECamRequestStartAutofocus
- && !CurrentSceneHasForcedFocus()
- )
- {
- if( aEventId==ECamCameraEventAutofocusSuccessful )
- {
-
- PRINT( _L("ECamCameraEventAutofocusSuccessful -> Set operation state to ECamFocused") );
-
-
- if( iConfigManager && iConfigManager->IsAutoFocusSupported() &&
- !iCaptureRequested && appUi && appUi->SelfTimer() &&
- !appUi->SelfTimer()->IsActive())
- {
- if ( !iSilentProfile || iShutterSndAlwaysOn )
- {
- // Play only if camera tones are not set off
- PlaySound(ECamAutoFocusComplete, EFalse);
- }
- }
- SetOperation( ECamFocused );
- }
- else if( aEventId==ECamCameraEventAutofocusFailed )
- {
- PRINT( _L("ECamCameraEventAutofocusFailed -> Set operation state to ECamFocusFailed") );
- if ( iConfigManager && iConfigManager->IsAutoFocusSupported() )
- {
- PlaySound( ECamAutoFocusFailed, EFalse );
- }
- SetOperation( ECamFocusFailed );
- }
- iPendingAFRequest=0;
- iCurrentAFRequest=0;
- }
- else if( iCurrentAFRequest != iPendingAFRequest && iPendingAFRequest !=0
- && !CurrentSceneHasForcedFocus()
- )
- {
- iCurrentAFRequest=iPendingAFRequest;
- iPendingAFRequest=0;
- TryAFRequest( iCurrentAFRequest );
- }
- else if( CurrentSceneHasForcedFocus() )
- {
- // Autofocus flags has to be reset in forced focus cases
- iPendingAFRequest=0;
- iCurrentAFRequest=0;
- }
- }
- break;
- // ---------------------------------
- case ECamCameraEventCancelAutofocus:
- {
- // Set iAFCancelInProgress to true so that we don't change the
- // reticule for the next focus successful/focus failed event.
- iAFCancelInProgress = ETrue;
- iCurrentAFRequest = ECamRequestCancelAutofocus;
- // fixed toolbar is used only with touch devices
- if ( !iCaptureRequested && IsTouchScreenSupported() )
- {
- appUi->SetToolbarVisibility(); // avoid flickering in settings view
- }
- }
- break;
- // =================================
- default:
- // No change to state with other events
- break;
- // =================================
- }
- PRINT2( _L("Camera <= CCamAppController::SetStateFromEvent mode[%s] operation[%s]"),
- KCamModeNames[iInfo.iMode],
- KCamCaptureOperationNames[iInfo.iOperation] );
- }
-
-void
-CCamAppController::InitCaptureLimitL()
- {
- // Set the capture count now, so we don't need to set it when starting capture.
- switch( iInfo.iTargetImageMode )
- {
- case ECamImageCaptureBurst:
- PRINT1( _L("Camera <> CCamAppController .. burst mode as target, set capture limit to %d"), KShortBurstCount );
- SetCaptureLimitL( KShortBurstCount );
- break;
- case ECamImageCaptureTimeLapse:
- PRINT1( _L("Camera <> CCamAppController .. timelapse mode as target, set capture limit locally to max %d"), iLongSequenceLimit );
- SetCaptureLimitL( iLongSequenceLimit );
- break;
- default:
- PRINT( _L("Camera <> CCamAppController .. single mode as target, set capture limit locally to 1") );
- SetCaptureLimitL( 1 );
- break;
- }
- }
-
-
-// ===========================================================================
-//
-TCamAppControllerInfo::TCamAppControllerInfo()
- : iActiveCamera ( ECamActiveCameraNone ),
- iMode ( ECamControllerIdle ),
- iTargetMode ( ECamControllerIdle ),
- iImageMode ( ECamImageCaptureNone ),
- iTargetImageMode ( ECamImageCaptureNone ),
- iOperation ( ECamNoOperation ),
- iTargetVfState ( ECamTriIdle ),
- iViewfinderMirror ( EFalse ),
- iTargetImageResolution( 0 ),
- iTargetImageQuality ( 0 ),
- iBusyRequestId ( ECamRequestNone )
- {
- }
-
-
-// ===========================================================================
-
-
-//
-//
-//
-void CCamAppController::HandleFileHarvestingComplete()
- {
- PRINT( _L("Camera => CCamAppController::HandleFileHarvestingComplete" ) );
- // If release required but not done in postcapture not shown mode this is the
- // last time to do it. Otherwise problems occurs in 2ndary camera if opened
- if ( iPendingRelease && ECamSettOff == IntegerSettingValue( ECamSettingItemShowCapturedPhoto ) )
- {
- PRINT( _L("Camera <> CCamAppController::HandleFileHarvestingComplete, releasing" ) );
- ReleaseCamera();
- }
- PRINT( _L("Camera <= CCamAppController::HandleFileHarvestingComplete" ) );
- }
-
-
-//
-//CCamAppController::DeRegisterHarverterClientEvents
-//
-void CCamAppController::DeRegisterHarverterClientEvents()
- {
- if ( iImageSaveActive )
- {
-#if defined(RD_MDS_2_5) && !defined(__WINSCW__) && !defined(__WINS__)
- iImageSaveActive->DeRegisterHarverterClientEvents();
-#endif //defined(RD_MDS_2_5) && !defined(__WINSCW__) && !defined(__WINS__)
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::Configuration
-//
-// ---------------------------------------------------------------------------
-//
-CCamConfiguration*
-CCamAppController::Configuration() const
- {
- return iConfiguration;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RestoreSettingsToCameraL
-// Calls RestoreSettingIfNecessaryL for all supported camera settings.
-// In case there were settings needing restoring, and camera controller
-// is not busy, request camera controller to start setting changes.
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::RestoreSettingsToCameraL()
- {
- PRINT( _L("Camera => CCamAppController::RestoreSettingsToCameraL" ) );
- const TCamCameraMode mode = CurrentMode();
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if ( IsAppUiAvailable() && appUi->CurrentViewState()==ECamViewStateUserSceneSetup )
- {
- //restore user scence setting
- DirectRestoreSettingIfNecessaryL( ECamSettingItemUserSceneWhitebalance );
- DirectRestoreSettingIfNecessaryL( ECamSettingItemUserSceneExposure );
- DirectRestoreSettingIfNecessaryL( ECamSettingItemUserSceneFlash );
- if ( UiConfigManagerPtr()->IsColorToneFeatureSupported() )
- DirectRestoreSettingIfNecessaryL( ECamSettingItemUserSceneColourFilter );
- if ( UiConfigManagerPtr()->IsBrightnessSupported() )
- DirectRestoreSettingIfNecessaryL( ECamSettingItemUserSceneBrightness );
- if ( UiConfigManagerPtr()->IsContrastSupported() )
- DirectRestoreSettingIfNecessaryL( ECamSettingItemUserSceneContrast );
- if ( UiConfigManagerPtr()->IsISOSupported() || UiConfigManagerPtr()->IsExtendedLightSensitivitySupported() )
- DirectRestoreSettingIfNecessaryL( ECamSettingItemUserSceneLightSensitivity );
- if ( ECamControllerImage == mode )
- {
- if ( UiConfigManagerPtr()->IsSharpnessFeatureSupported() )
- DirectRestoreSettingIfNecessaryL( ECamSettingItemUserSceneImageSharpness );
- DirectRestoreSettingIfNecessaryL( ECamSettingItemPhotoDigitalZoom );
- }
- else if ( ECamControllerVideo == mode )
- {
- DirectRestoreSettingIfNecessaryL( ECamSettingItemVideoDigitalZoom );
- DirectRestoreSettingIfNecessaryL( ECamSettingItemVideoStab);
- }
- }
- else if(iInfo.iActiveCamera == ECamActiveCameraPrimary)
- {
- if ( ECamControllerImage == mode )
- {
- // Add rest of the pending settings where needed
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicPhotoWhiteBalance );
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicPhotoExposure );
-
- if ( UiConfigManagerPtr()->IsColorToneFeatureSupported() )
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicPhotoColourFilter );
-
- if ( UiConfigManagerPtr()->IsBrightnessSupported() )
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicPhotoBrightness );
-
- if ( UiConfigManagerPtr()->IsContrastSupported() )
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicPhotoContrast );
-
- if ( UiConfigManagerPtr()->IsSharpnessFeatureSupported() )
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicPhotoImageSharpness );
-
- if ( UiConfigManagerPtr()->IsISOSupported() || UiConfigManagerPtr()->IsExtendedLightSensitivitySupported() )
- {
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicPhotoLightSensitivity );
- }
-
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicPhotoFlash );
-
- RestoreSettingIfNecessaryL( ECamSettingItemPhotoDigitalZoom );
- }
- else if ( ECamControllerVideo == mode )
- {
- // Video settings in the toolbar
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicVideoWhiteBalance );
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicVideoExposure );
-
- if ( UiConfigManagerPtr()->IsColorToneFeatureSupported() )
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicVideoColourFilter );
-
- // The following settings are not supported in video mode toolbar
- // However, the values may need to be reset, in case the setting was
- // changed in image mode
- if ( UiConfigManagerPtr()->IsBrightnessSupported() )
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicVideoBrightness );
-
- if ( UiConfigManagerPtr()->IsContrastSupported() )
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicVideoContrast );
-
- if ( UiConfigManagerPtr()->IsVideoStabilizationSupported() )
- {
- RestoreSettingIfNecessaryL( ECamSettingItemVideoStab );
- }
- RestoreSettingIfNecessaryL( ECamSettingItemVideoDigitalZoom );
-
- RestoreSettingIfNecessaryL( ECamSettingItemDynamicVideoFlash );
-
- RestoreSettingIfNecessaryL( ECamSettingItemContinuousAutofocus );
- }
- }
- else if(iInfo.iActiveCamera == ECamActiveCameraSecondary)
- {
- if ( ECamControllerImage == mode )
- {
- // Not needed
- }
- else if ( ECamControllerVideo == mode )
- {
- // Not needed
- }
- }
- else
- {
- // Do nothing
- }
-
- if( iSettingProvider->PendingSettingChangeCount() > 0 &&
- !iCameraController->ControllerInfo().iBusy )
- {
- PRINT( _L("Camera <> CCamAppController::RestoreSettingsToCameraL - Issue settings change request") );
- IssueSettingsChangeRequestL( );
- }
-
- PRINT( _L("Camera <= CCamAppController::RestoreSettingsToCameraL" ) );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RestoreSettingIfNecessaryL
-// Checks from camera controller, whether the value of the setting given
-// as argument has same value in camera hw and settings model (UI).
-// If value is not the same, add the setting id to settingsmodel's list
-// of pending changes.
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::RestoreSettingIfNecessaryL( TCamSettingItemIds aSettingItem )
- {
- // Convert UI setting ID to camera controller setting ID
- TCamCameraSettingId camSettingId =
- CCamSettingConversion::Map2CameraControllerSettingId( aSettingItem );
-
- if( !iCameraController->SettingValueUpToDateL( camSettingId ) )
- {
- PRINT1( _L("RestoreSettingIfNecessaryL - Restoring value for setting %s"), KCamSettingItemNames[aSettingItem] );
- iSettingProvider->AddPendingSettingChangeL( aSettingItem );
- }
- else
- {
- if( aSettingItem == ECamSettingItemDynamicVideoFlash )
- {
- TCamCameraSettingId cameraId(
- CCamSettingConversion::Map2CameraControllerSettingId( aSettingItem ) );
- iCameraController->DirectSettingsChangeL( cameraId );
- }
- PRINT1( _L("RestoreSettingIfNecessaryL - Setting %s has up-to-date value, no need to restore"), KCamSettingItemNames[aSettingItem] );
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DirectRestoreSettingIfNecessaryL
-// Checks if the setting needs restoring (UI setting value doesn't match
-// the actual setting value in camera). In that case, function
-// directly set settting to camera
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::DirectRestoreSettingIfNecessaryL( TCamSettingItemIds aSettingItem )
- {
-
- TCamCameraSettingId cameraId(
- CCamSettingConversion::Map2CameraControllerSettingId( aSettingItem ) );
- if ( !iCameraController->SettingValueUpToDateL( cameraId ) )
- {
- PRINT1( _L("RestoreSettingIfNecessaryL - Restoring value for setting %s"), KCamSettingItemNames[aSettingItem] );
- iCameraController->DirectSettingsChangeL( cameraId );
- }
- }
-// -----------------------------------------------------------------------------
-// CCamAppController::RestartTimeLapseTimerL()
-//
-// -----------------------------------------------------------------------------
-//
-void CCamAppController::RestartTimeLapseTimerL()
- {
- PRINT( _L("Camera => CCamAppController::RestartTimeLapseTimerL inside this function" ))
- if ( iTimeLapseTimer )
- {
- iTimeLapseTimer->Cancel();
- iTimeLapseTimer->SetTimeout( KSecondInMicSec );
- }
- else
- {
- iTimeLapseTimer = CCamTimer::NewL( KSecondInMicSec, TCallBack( CCamAppController::TimeLapseTimeoutL, this ) );
- }
-
- NotifyControllerObservers( ECamEventCounterUpdated );
- PRINT( _L("Camera <> CCamAppController::RestartTimeLapseTimerL starting timelapse timer" ));
-
- iTimeLapseStartTime.HomeTime();
- iTimeLapseTimer->StartTimer();
-
- // Following trace may be useful to see timing related handling in TimeLapse mode
- // TDateTime stTime = iTimeLapseStartTime.DateTime();
- // PRINT3( _L("Start time: %d:%d:%d"), stTime.Minute(), stTime.Second(), stTime.MicroSecond() );
-
- PRINT( _L("Camera <= CCamAppController::RestartTimeLapseTimerL" ))
- }
-
-
-// ---------------------------------------------------------------------------
-// SetSettingsRestoreNeeded
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetSettingsRestoreNeeded()
- {
- iSettingsRestoreNeeded = ETrue;
- }
-
-// ---------------------------------------------------------------------------
-// IsSettingsRestoreNeeded
-// ---------------------------------------------------------------------------
-//
-TBool
-CCamAppController::IsSettingsRestoreNeeded() const
- {
- return iSettingsRestoreNeeded;
- }
-
-// ---------------------------------------------------------------------------
-// StaticSettingsModel
-//
-// Gets the handle to the settings model, which is used inturn by the
-// plugin to call the interfaces for performing needed actions.
-// ---------------------------------------------------------------------------
-//
-TBool
-CCamAppController::IsSceneSupported( const TInt aSceneId, TBool aPhotoScene ) const
- {
- if ( aPhotoScene )
- return static_cast<CCamSettingsModel*>(iSettingsModel)->IsImageSceneSupported( aSceneId );
- else
- return static_cast<CCamSettingsModel*>(iSettingsModel)->IsVideoSceneSupported( aSceneId );
- }
-
-// ---------------------------------------------------------------------------
-// StaticSettingsModel
-//
-// Gets the handle to the settings model, which is used inturn by the
-// plugin to call the interfaces for performing needed actions.
-// ---------------------------------------------------------------------------
-//
-MCamStaticSettings&
-CCamAppController::StaticSettingsModel()
- {
- return static_cast<CCamSettingsModel*>(iSettingsModel)->StaticSettingsModel();
- }
-
-
-// ---------------------------------------------------------------------------
-// EngineRequestsPending
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::EngineRequestsPending() const
- {
- return IsFlagOn( iBusyFlags, EBusyRequest );
- }
-
-// ---------------------------------------------------------------------------
-// CalculateVideoTimeRemainingL
-//
-// ---------------------------------------------------------------------------
-//
-TTimeIntervalMicroSeconds
-CCamAppController::CalculateVideoTimeRemainingL( TCamMediaStorage aStorage )
- {
- RFs& fs = CEikonEnv::Static()->FsSession();
- TInt drive = 0;
- // Check if setting the new video path is pending. The path may not have been
- // set if camera controller was busy or video mode not initialized. This
- // happens e.g. while in Settings menu.
- // If yes, use the storage media that is going to be used next.
- if( iSetNewPathnamesPending != ECamMediaStorageNone )
- {
- aStorage = iSetNewPathnamesPending;
- }
- if(aStorage == ECamMediaStorageCurrent)
- {
- const TDesC& filename = CurrentVideoFileName();
- TParse fp;
- User::LeaveIfError(fs.Parse(filename, fp));
- TPtrC driveletter = fp.Drive();
- TChar drl = driveletter[0];
- User::LeaveIfError(fs.CharToDrive(drl, drive));
- }
- else
- {
- DriveInfo::TDefaultDrives driveInfo = static_cast<DriveInfo::TDefaultDrives>(KErrNotFound);
- switch(aStorage)
- {
- case ECamMediaStoragePhone:
- driveInfo = DriveInfo::EDefaultPhoneMemory;
- break;
- case ECamMediaStorageCard:
- driveInfo = DriveInfo::EDefaultRemovableMassStorage;
- break;
- case ECamMediaStorageMassStorage:
- driveInfo = DriveInfo::EDefaultMassStorage;
- break;
- default:
- break;
- }
- User::LeaveIfError(DriveInfo::GetDefaultDrive( driveInfo, drive ));
- }
-
- // Get critical level for this drive type
- TDriveInfo driveInfo;
- fs.Drive(driveInfo, drive);
-
- TInt criticalDiskVal = 0;
- if( driveInfo.iType == EMediaRam ) //RAM drives have diff critical levels
- {
- CRepository* repository = CRepository::NewLC( KCRUidDiskLevel );
- User::LeaveIfError(
- repository->Get( KRamDiskCriticalLevel, criticalDiskVal ) );
- CleanupStack::PopAndDestroy( repository );
- }
- else // Some other media type
- {
- CRepository* repository = CRepository::NewLC( KCRUidDiskLevel );
- User::LeaveIfError(
- repository->Get( KDiskCriticalThreshold, criticalDiskVal ) );
- CleanupStack::PopAndDestroy( repository );
- }
-
- // Get the available space in volumeinfo.iFree
- TVolumeInfo volumeinfo;
- User::LeaveIfError(fs.Volume(volumeinfo, drive));
-
- // Get the current video quality data
- TInt videoQuality = iSettingsModel->IntegerSettingValue(
- ECamSettingItemVideoQuality );
- CCamVideoQualityLevel& level = *( iSettingsModel->
- VideoQualityArray() )[videoQuality];
-
- // Audio recording on/muted
- TInt audioRec = iSettingsModel->IntegerSettingValue(
- ECamSettingItemVideoAudioRec );
- TBool audioMute = ECamSettOff == audioRec;
-
- TInt64 videoLimit = KMaxTUint32; // 4G limit
- // Video file size limit (MMS case)
- if( ECamVideoClipShort == level.VideoLength() )
- {
- // Short video, needs to fit into MMS message
- videoLimit = CamUtility::MaxMmsSizeInBytesL();
- }
-
- TCamVideoTime videoTime( volumeinfo.iFree, // Free space
- criticalDiskVal, // Critical space
- //level.VideoFileType(), // Video codec
- level.VideoBitRate(), // Video bitrate
- //level.AudioType(), // Audio FourCC
- level.AudioBitRate(), // Audio bitrate
- videoLimit, // File size limit
- audioMute, // Mute audio?
- iConfiguration->CMRAvgVideoBitRateScaler() );
-
- return videoTime.GetRemainingTimeL();
- }
-
-
-// ---------------------------------------------------------------------------
-// SetRemainingImageStored
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::SetRemainingImageStored()
- {
- iValueIsStored = ETrue;
- }
-// ---------------------------------------------------------------------------
-// IsRemainingImageStored
-// ---------------------------------------------------------------------------
-//
-TBool
-CCamAppController::IsRemainingImageStored() const
- {
- return iValueIsStored;
- }
-
-// ---------------------------------------------------------------------------
-// IsSavingInProgress
-// ---------------------------------------------------------------------------
-//
-TBool
-CCamAppController::IsSavingInProgress() const
- {
- return ( iImageSaveActive->Count() > 0 );
- }
-
-// ---------------------------------------------------------------------------
-// CapturedImages
-// ---------------------------------------------------------------------------
-//
- TInt CCamAppController::CapturedImages() const
- {
- return iCameraController->ControllerInfo().iCaptureCount;
- }
-
-// -----------------------------------------------------------------------------
-//
-// -----------------------------------------------------------------------------
-//
-void CCamAppController::SetSettingsPlugin( CCamGSInterface* aPlugin )
- {
- iPlugin = aPlugin;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetViewfinderWindowHandle
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetViewfinderWindowHandle( RWindowBase* aWindow )
- {
- __ASSERT_ALWAYS( iCameraController, CamPanic( ECamPanicInvalidState ) );
-
- iCameraController->SetViewfinderWindowHandle( aWindow );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ViewfinderWindowDeleted
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::ViewfinderWindowDeleted( RWindowBase* aWindow )
- {
- __ASSERT_ALWAYS( iCameraController, CamPanic( ECamPanicInvalidState ) );
-
- iCameraController->ViewfinderWindowDeleted( aWindow );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ExistMassStorage()
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::ExistMassStorage() const
- {
- const TUint KMassStorageBits = DriveInfo::EDriveInternal |
- DriveInfo::EDriveExternallyMountable;
- TInt drive;
- TInt err = DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive );
-
- if ( err != KErrNone )
- {
- return EFalse;
- }
-
- TUint driveStatus(0);
- err = DriveInfo::GetDriveStatus( CCoeEnv::Static()->FsSession(),
- drive,
- driveStatus );
-
- TInt usbPersonality;
- TInt ret = RProperty::Get(KPSUidUsbWatcher,
- KUsbWatcherSelectedPersonality,
- usbPersonality);
-
- if ( err != KErrNone )
- {
- return EFalse;
- }
-
- if ( (driveStatus & KMassStorageBits) == KMassStorageBits &&
- !(driveStatus & DriveInfo::EDriveCorrupt) &&
- ( KErrNotFound == ret || // USB watcher is not loaded
- ( (KErrNone == ret) && (KUsbPersonalityIdMS != usbPersonality) ) ) )
- {
- return ETrue;
- }
-
- return EFalse;
- }
-
-
-// ------------------------------------------------------------------------
-// CCamAppController::IsMemoryAvailable()
-// ------------------------------------------------------------------------
-//
-TBool
-CCamAppController::IsMemoryAvailable(const TCamMediaStorage aStorage, TBool aIgnoreUsbPersonality ) const
- {
- TInt currentStorage = aStorage;
- if(aStorage == ECamMediaStorageCurrent)
- {
- TCamCameraMode mode = CurrentMode();
-
- if((ECamControllerImage != mode) && (ECamControllerVideo != mode))
- {
- //This is needed for case where current mode is not yet set.
- mode = TargetMode();
- }
-
- if(ECamControllerImage == mode)
- {
- currentStorage = static_cast<TCamMediaStorage>(
- IntegerSettingValue(
- ECamSettingItemPhotoMediaStorage ) );
- }
- else if(ECamControllerVideo == mode)
- {
- currentStorage = static_cast<TCamMediaStorage>(
- IntegerSettingValue(
- ECamSettingItemVideoMediaStorage ) );
- }
- else
- {
- //No impl
- }
- }
-
- TInt usbPersonality;
- TInt ret = RProperty::Get(KPSUidUsbWatcher,
- KUsbWatcherSelectedPersonality,
- usbPersonality);
- if ( !aIgnoreUsbPersonality )
- {
- if ( ( currentStorage != ECamMediaStoragePhone ) && ( KErrNone == ret ) &&
- ( KUsbPersonalityIdMS == usbPersonality ) )
- {
- return EFalse;
- }
- }
-
- DriveInfo::TDefaultDrives driveInfo = static_cast<DriveInfo::TDefaultDrives>(KErrNotFound);
- switch(currentStorage)
- {
- case ECamMediaStoragePhone:
- driveInfo = DriveInfo::EDefaultPhoneMemory;
- break;
- case ECamMediaStorageCard:
- driveInfo = DriveInfo::EDefaultRemovableMassStorage;
- break;
- case ECamMediaStorageMassStorage:
- driveInfo = DriveInfo::EDefaultMassStorage;
- break;
- default:
- break;
- }
-
-
- TInt drive;
- TInt err = DriveInfo::GetDefaultDrive( driveInfo, drive );
- if(err)
- {
- return EFalse;
- }
- TUint driveStatus(0);
- err = DriveInfo::GetDriveStatus( CCoeEnv::Static()->FsSession(),
- drive,
- driveStatus );
- if(err)
- {
- return EFalse;
- }
-
- return ( (driveStatus & DriveInfo::EDrivePresent) &&
- !(driveStatus & DriveInfo::EDriveCorrupt) &&
- (driveStatus & DriveInfo::EDriveUserVisible) &&
- !(driveStatus & DriveInfo::EDriveInUse) &&
- !(driveStatus & DriveInfo::EDriveReadOnly) );
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsDemandKeyRelease()
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsDemandKeyRelease()
- {
- return iDemandKeyRelease;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetDemandKeyRelease()
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetDemandKeyRelease( TBool aDemand )
- {
- iDemandKeyRelease = aDemand;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsKeyLockOn()
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsKeyLockOn()
- {
- if ( iKeyLockStatusWatcher && iConfigManager && iConfigManager->IsKeyLockWatcherSupported() )
- {
- TInt iKeyLockStatus = 0;
- iKeyLockStatusWatcher->Get( iKeyLockStatus );
- if ( iKeyLockStatus == EKeyguardLocked )
- {
- return ETrue;
- }
- else
- {
- return EFalse;
- }
- }
- return EFalse;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DriveChangeL
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::DriveChangeL( const TCamDriveChangeType aType )
- {
- PRINT1( _L("Camera => CCamAppController::DriveChangeL aType: %d" ), aType );
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- appUi->CheckMemoryAvailableForCapturing();
-
-
- TCamCameraMode mode = CurrentMode();
- TCamMediaStorage currentStorage;
-
- // Photos and videos are saved onto the same media, so no need to
- // differentiate between still/video
- currentStorage = static_cast<TCamMediaStorage>(
- IntegerSettingValueUnfiltered( ECamSettingItemPhotoMediaStorage ) );
-
- PRINT1( _L("Camera <> iPreferredStorageLocation is now %d"),
- iPreferredStorageLocation );
- PRINT1( _L("Camera <> Update iPreferredStorageLocation to %d"),
- currentStorage );
-
- iPreferredStorageLocation = currentStorage;
-
- if ( ECamMediaStoragePhone == iPreferredStorageLocation )
- {
- PRINT( _L("Camera <> Phone memory is the preferred storage location. Nothing to be done here. Return KErrNone.") )
- PRINT( _L("Camera <= CCamAppController::DriveChangeL" ) );
- return KErrNone;
- }
-
- if ( ( !IsMemoryAvailable( ECamMediaStorageCard, EFalse ) ||
- !IsMemoryAvailable( ECamMediaStorageMassStorage, EFalse ) ) ||
- !IsMemoryAvailable( iPreferredStorageLocation, ETrue ) )
- {
- PRINT( _L("Camera <> USB personality is 'Mass storage' or iPreferredStorageLocation (MMC or mass memory) is unavailable") )
-
- // Stop if recording a video to mass memory or MMC
- if ( CurrentVideoOperation() == ECamCapturing ||
- CurrentVideoOperation() == ECamPaused )
- {
- PRINT( _L("Camera <> Video capture in progress...") )
-
- if ( !IsMemoryAvailable( iInitialVideoStorageLocation ) )
- {
- PRINT( _L("Camera <> ...Stop video recording.") )
- iCaptureStoppedForUsb = ETrue;
- StopVideoRecording();
- }
- else
- {
- PRINT( _L("Camera <> ...Phone memory in use. No need to stop.") )
- }
-
- }
- // Cancel if pending recording
- else if( iVideoRequested )
- {
- iVideoRequested = EFalse;
- }
-
- if ( appUi->SelfTimerEnabled() && appUi->AllMemoriesFullOrUnavailable() )
- {
- PRINT( _L("Camera <> All storages full or unavailable. Cancel selftimer.") )
- appUi->HandleCommandL( ECamCmdSelfTimerCancel );
- }
-
- if ( SequenceCaptureInProgress() )
- {
- PRINT( _L("Camera <> Sequence capture in progress. -> Stop and skip postcapture.") )
-
- iCaptureStoppedForUsb = ETrue;
- SoftStopBurstL( ETrue );
- }
- // If in the middle of init sequence or saving a file, set the dismount
- // pending so that the AllowDismount call will be made later
- if( IsFlagOn( iBusyFlags, EBusySequence ) || iSaving )
- {
- PRINT( _L("Camera <> CCamAppController::DriveChangeL sequence or saving ongoing" ) );
-
- iDismountPending = ETrue;
- // Mass memory may be the forced storage location. Then it's necessary
- // to switch to (forced) phone memory
- TRAP_IGNORE( ForceUsePhoneMemoryL( ETrue ) );
- PRINT( _L("Camera <= CCamAppController::DriveChangeL dismount pending" ) );
-
- }
- else
- {
- // Mass memory may be the forced storage location. Then it's necessary
- // to switch to (forced) phone memory
- TRAP_IGNORE( ForceUsePhoneMemoryL( ETrue ) );
- PRINT( _L("Camera <= CCamAppController::DriveChangeL dismount ok" ) );
-
- }
- }
- else if ( IsMemoryAvailable( iPreferredStorageLocation, ETrue ) &&
- ( ECamMediaStorageCard == iPreferredStorageLocation ||
- ECamMediaStorageMassStorage == iPreferredStorageLocation ) )
- {
- PRINT( _L("Camera <> iPreferredStorageLocation (MMC or mass memory) is now available.") )
-
- // if phone memory forced, then revert back to user selected location
- if ( iForceUseOfPhoneMemory )
- {
- PRINT( _L("Camera <> Phone memory is forced, switch back to user selected storage location.") )
- TRAP_IGNORE( ForceUsePhoneMemoryL( EFalse ) );
- }
- else
- {
- PRINT( _L("Camera <> !IsPhoneMemoryForced() -> No action.") )
- }
- }
-
- if( IntegerSettingValue(ECamSettingItemRemovePhoneMemoryUsage) )
- {
- if( aType == EDriveMount &&
- !appUi->IsRecoverableStatus() )
- {
- SwitchToStandbyL( KErrNone );
- }
- else if( aType == EDriveDismount &&
- appUi->IsRecoverableStatus() )
- {
- TInt mmcInserted = 0;
- TInt usbPersonality = 0;
- User::LeaveIfError( RProperty::Get( KPSUidUikon, KUikMMCInserted, mmcInserted ) );
- User::LeaveIfError(RProperty::Get(KPSUidUsbWatcher,
- KUsbWatcherSelectedPersonality,
- usbPersonality) );
- if( !IsMemoryAvailable(ECamMediaStorageMassStorage) &&
- !IsMemoryAvailable(ECamMediaStorageCard) )
- {
- if( KUsbPersonalityIdMS == usbPersonality )
- {
- SwitchToStandbyL( ECamErrMassStorageMode );
- }
- else if ( !mmcInserted )
- {
- SwitchToStandbyL( ECamErrMemoryCardNotInserted );
- }
- }
- }
- else if ( aType == EDriveUSBMassStorageModeOn &&
- appUi->IsRecoverableStatus() )
- {
- SwitchToStandbyL(ECamErrMassStorageMode);
- }
- else if ( aType == EDriveUSBMassStorageModeOff &&
- !appUi->IsRecoverableStatus() )
- {
- SwitchToStandbyL( KErrNone );
- }
- }
-
- if( appUi->CurrentViewState() == ECamViewStatePostCapture )
- {
- if( aType == EDriveDismount && !IsMemoryAvailable( currentStorage, EFalse ))
- {
- TVwsViewId activeView;
- if ( appUi->GetActiveViewId( activeView ) == KErrNone )
- {
- if( ECamViewIdStillPostCapture == activeView.iViewUid.iUid ||
- ECamViewIdVideoPostCapture == activeView.iViewUid.iUid )
- {
- CCamPostCaptureViewBase* view =
- static_cast<CCamPostCaptureViewBase*>( appUi->View( activeView.iViewUid ) );
- if( view )
- {
- view->HandleCommandL( EAknSoftkeyBack );
- }
- }
- }
- }
- }
-
- PRINT( _L("Camera <= CCamAppController::DriveChangeL" ) );
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CurrentStorage
-// ---------------------------------------------------------------------------
-//
-TCamMediaStorage CCamAppController::CurrentStorage()
- {
- return iCurrentStorage;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsAfNeeded
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsAfNeeded()
- {
- return iAfNeeded;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetAfNeeded
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetAfNeeded( TBool aAfNeeded )
- {
- iAfNeeded = aAfNeeded;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsCaptureStoppedForUsb
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsCaptureStoppedForUsb()
- {
- return iCaptureStoppedForUsb;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetCaptureStoppedForUsb
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetCaptureStoppedForUsb( TBool aCaptureStoppedForUsb )
- {
- iCaptureStoppedForUsb = aCaptureStoppedForUsb;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CancelDismountMonitoring
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::CancelDismountMonitoring()
- {
- if( iDriveChangeNotifier )
- {
- iDriveChangeNotifier->CancelMonitoring();
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StartDismountMonitoring
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::StartDismountMonitoring()
- {
- if( iDriveChangeNotifier )
- {
- iDriveChangeNotifier->StartMonitoring();
- }
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DeepSleepTimeout
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::DeepSleepTimeout( TAny* aPtr )
- {
- static_cast<CCamAppController*>( aPtr )->DoDeepSleepTimeout();
- return EFalse; // dummy
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DoDeepSleepTimeout
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::DoDeepSleepTimeout()
- {
- PRINT( _L("Camera => CCamAppController::DoDeepSleepTimeout") );
-
- ReleaseCamera();
- iDeepSleepTimerExpired = ETrue;
- iDeepSleepTimer->Cancel();
-
- PRINT( _L("Camera <= CCamAppController::DoDeepSleepTimeout") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DeepSleepTimerStart
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::DeepSleepTimerStart()
- {
- PRINT( _L("Camera : DeepSleepTimerStart") );
- iDeepSleepTimerExpired = EFalse;
- if ( iDeepSleepTimer && !iDeepSleepTimer->IsActive() )
- {
- iDeepSleepTimer->StartTimer();
- }
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::DeepSleepTimerCancel
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::DeepSleepTimerCancel()
- {
- PRINT( _L("Camera : DeepSleepTimerCancel") );
- if ( iDeepSleepTimer )
- {
- iDeepSleepTimer->Cancel();
- }
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::AllSnapshotsReceived
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::AllSnapshotsReceived()
- {
- PRINT1( _L("Camera <> AllSnapshotsReceived %d"), iAllSnapshotsReceived );
- return iAllSnapshotsReceived;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::PendingAFRequest
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::PendingAFRequest()
- {
- return iPendingAFRequest;
- }
-
-
-
-// CCamAppController::IsTouchScreenSupported
-// Return whether the device supports touch screen
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsTouchScreenSupported()
- {
- return AknLayoutUtils::PenEnabled();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsTouchScreenSupported
-// Return whether the device supports direct screen viewfinder
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsDirectScreenVFSupported( TBool aPrimaryCamera )
- {
- // test for integration
- return iConfigManager->IsDSAViewFinderSupported( aPrimaryCamera );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::UiConfigManagerPtr
-// handle to CameraUiConfigManager
-// ---------------------------------------------------------------------------
-//
-CCameraUiConfigManager* CCamAppController::UiConfigManagerPtr()
- {
- __ASSERT_DEBUG(iConfigManager, CamPanic(ECamPanicNullPointer));
- return iConfigManager;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetCameraOrientationModeL
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetCameraOrientationModeL( TInt aOrientation )
- {
- iCameraController->SetOrientationModeL( aOrientation );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CompleteCameraConstruction
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::CompleteCameraConstructionL()
- {
- PRINT( _L( "Camera => CCamAppController::CompleteCameraConstructionL" ) );
- iCameraController->CompleteSwitchCameraL();
- // start reserve and poweron already here unless embedded mode used
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- if( appUi && !appUi->IsEmbedded() )
- {
- IssueModeChangeSequenceL( ETrue );
- }
- PRINT( _L( "Camera <= CCamAppController::CompleteCameraConstructionL" ) );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::CurrentImageIndex
-//
-// ---------------------------------------------------------------------------
-//
-TInt CCamAppController::CurrentImageIndex()
- {
- return iCurrentImageIndex;
- }
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::GenerateStartupSequenceL( RCamRequestArray& aSequence )
- {
- PRINT( _L( "Camera => CCamAppController::GenerateStartupSequenceL" ) );
-
- //Have to empty autofocusrequest values here because modechange could override
- //currently processed autofocus request.
- iPendingAFRequest=0;
- iCurrentAFRequest=0;
- iNoBurstCancel = EFalse;
- iKeyUP = EFalse;
-
- aSequence.Append( ECamRequestReserve );
- aSequence.Append( ECamRequestPowerOn );
-
- // -------------------------------------------------------
-#ifdef _DEBUG
- PRINT( _L( "Camera <> Generated sequence: " ) );
- for( TInt i = 0; i < aSequence.Count(); i++ )
- {
- PRINT2( _L( "Camera <> %d) %s" ), i, KCamRequestNames[aSequence[i]] );
- }
-#endif
- PRINT( _L( "Camera <= CCamAppController::GenerateStartupSequenceL" ) );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RotateSnapshotL
-// Copy and rotate snapshot bitmap before it is used to
-// create a thumbnail
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::RotateSnapshotL()
- {
- PRINT( _L( "Camera => CCamAppController::RotateSnapshotL" ) );
- // empty the array
- if( iRotationArray->Count() > 0 )
- {
- iRotationArray->Reset();
- }
- if( BurstCaptureArray()->Snapshot( iCurrentImageIndex ) )
- {
- // copy snapshot to preserve the original snapshot bitmap
- // first get the handle for the original snapshot bitmap
- CFbsBitmap* snapshot = new (ELeave)CFbsBitmap();
- CleanupStack::PushL( snapshot );
- snapshot->Duplicate( BurstCaptureArray()->Snapshot( iCurrentImageIndex )->Handle() );
- //create a new bitmap with the same dimensions as the original snapshot
- iRotatedSnapshot = new (ELeave)CFbsBitmap();
- iRotatedSnapshot->Create( snapshot->SizeInPixels(), snapshot->DisplayMode() );
- TRect tmpRect( TPoint( 0, 0 ), snapshot->SizeInPixels() );
- TInt tmpLen = tmpRect.Width() * tmpRect.Height() * 4;
- //copy the snapshot data
- iRotatedSnapshot->BeginDataAccess();
- snapshot->BeginDataAccess();
- Mem::Copy( iRotatedSnapshot->DataAddress(), snapshot->DataAddress(), tmpLen );
- iRotatedSnapshot->EndDataAccess();
- snapshot->EndDataAccess();
- // copy the filename
- iRotationArray->SetNextNameL( BurstCaptureArray()->FileName( iCurrentImageIndex ), BurstCaptureArray()->ImageName( iCurrentImageIndex ));
- // rotate the copied snapshot
- if ( !iRotatorAo )
- {
- iRotatorAo = CCamSyncRotatorAo::NewL( *this );
- }
- iRotatorAo->RotateL( iRotatedSnapshot, MapCamOrientation2RotationAngle( iCaptureOrientation ) );
-
- CleanupStack::PopAndDestroy(snapshot);
- }
- PRINT( _L( "Camera <= CCamAppController::RotateSnapshotL" ) );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RotationCompleteL
-// Notification of bitmap rotation complete events
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::RotationCompleteL( TInt aErr )
- {
- PRINT1( _L( "Camera => CCamAppController::RotationCompleteL aErr:%d" ), aErr );
- // rotation completed, use the rotated bitmap to create a thumbnail
- // in case of error, don't use the snapshot, thumbnail is created from
- // the imagefile instead
- if ( !aErr )
- {
- iRotationArray->ReplaceSnapshot( iRotatedSnapshot, 0 );
- }
- TRAP_IGNORE( iImageSaveActive->CreateThumbnailsL( *iRotationArray ) );
-
- delete iRotatedSnapshot;
- iRotatedSnapshot = NULL;
- PRINT( _L( "Camera <= CCamAppController::RotationCompleteL" ) );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::StoreFaceTrackingValue
-// Calls CamSettingModel to save user defined FT setting
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::StoreFaceTrackingValue()
- {
- iSettingsModel->StoreFaceTrackingValue();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetVideoInitNeeded
-// Sets the value defining the need for CAE video init and prepare
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetVideoInitNeeded( TBool aVideoInitNeeded )
- {
- iVideoInitNeeded = aVideoInitNeeded;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::VideoInitNeeded
-// Returns the value defining the need for CAE video init and prepare
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::VideoInitNeeded()
- {
- return iVideoInitNeeded;
- }
-
-// ---------------------------------------------------------------------------
-// StoreUserSceneSettingsL
-// Stores the UserScene settings
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::StoreUserSceneSettingsL()
- {
- iSettingsModel->StoreUserSceneSettingsL();
- }
-
-// ---------------------------------------------------------------------------
-// HandleVideoQualitySettingChangeL
-// ---------------------------------------------------------------------------
-//
-void
-CCamAppController::HandleVideoQualitySettingChangeL()
- {
- PRINT( _L("Camera => CCamAppController::HandleVideoQualitySettingChangeL") );
- if( IsViewFinding() && !Busy() )
- {
- PRINT( _L("Camera <> CCamAppController - viewfinder on, stop vf / re-prepare / start vf..") );
- TRAPD( status,
- {
- // Generate the request sequence and issue to Camera Controller.
- RCamRequestArray sequence;
- CleanupClosePushL( sequence );
-
- // Asynchronously init video. No need to reconstruct video names etc.
- sequence.Append( ECamRequestVfStop );
- sequence.Append( ECamRequestSsRelease );
-
- SetVideoInitNeeded( ETrue );
-
- sequence.Append( ECamRequestVideoRelease );
- sequence.Append( ECamRequestVideoInit );
-
- sequence.Append( ECamRequestSsStart );
- sequence.Append( ECamRequestVfStart );
-
- // Set busy flags to indicate sequence in progress and execute the seq
- SetFlags( iBusyFlags, EBusySequence );
- TCleanupItem clearBusy( ClearSequenceBusyFlag, &iBusyFlags );
- CleanupStack::PushL( clearBusy );
- iCameraController->RequestSequenceL( sequence );
- CleanupStack::Pop();
-
- iCaptureModeTransitionInProgress = ETrue;
- CleanupStack::PopAndDestroy(); // sequence.Close()
- });
-
- if( KErrNone != status )
- {
- PRINT1( _L("Camera <> CCamAppController::HandleVideoQualitySettingChangeL, error:%d"), status );
- SetOperation( ECamStandby, status );
- }
- }
-
- PRINT( _L("Camera <= CCamAppController::HandleVideoQualitySettingChangeL") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::ToggleWideScreenQuality
-// Toggles between wide-screen (16:9) and VGA (4:3) screen resolutions.
-// Applicable only for highest quality settings for 16:9 & 4:3.
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::ToggleWideScreenQuality( TBool aWide )
- {
- TBool qualityChanged = EFalse;
-
- if ( ECamControllerImage == iInfo.iMode && ECamActiveCameraPrimary == iInfo.iActiveCamera )
- {
- PRINT( _L("Camera => CCamAppController::ToggleWideScreenQuality - image mode") );
- TInt qualityIndex = IntegerSettingValue( ECamSettingItemPhotoQuality );
- if ( qualityIndex <= EImageQualityPrint )
- {
- if ( ( qualityIndex == EImageQualityPrintHigh && aWide )
- || ( qualityIndex == EImageQualityPrint && !aWide ) )
- {
- qualityIndex = (EImageQualityPrint==qualityIndex) ? EImageQualityPrintHigh
- : EImageQualityPrint;
-
- // Ensure that the setting value is enabled/usable.
- if ( iSettingsModel->SettingValueEnabled( ECamSettingItemPhotoQuality, qualityIndex ) )
- {
- SetIntegerSettingValueL( ECamSettingItemPhotoQuality, qualityIndex );
- qualityChanged = ETrue;
- }
- }
- else
- ; // skip
- }
- PRINT( _L("Camera <= CCamAppController::ToggleWideScreenQuality") );
- }
- else if ( ECamControllerVideo == iInfo.iMode && ECamActiveCameraPrimary == iInfo.iActiveCamera )
- {
- PRINT( _L("Camera => CCamAppController::ToggleWideScreenQuality - video mode") );
- TInt qualityIndex = IntegerSettingValue( ECamSettingItemVideoQuality );
- if ( qualityIndex <= ECamVideoQualityNormalHigh )
- {
- TVideoQualitySettings videoQuality = iConfiguration->VideoQuality( qualityIndex );
- qualityIndex = (ECamVideoQualityNormalHigh==qualityIndex) ? ECamVideoQualityHigh
- : ECamVideoQualityNormalHigh;
-
- if ( ( videoQuality.iVideoResolution == ECamVideoResolutionVGA && aWide ) ||
- ( videoQuality.iVideoResolution == ECamVideoResolutionHD && !aWide ) )
- {
- // Ensure that the setting value is enabled/usable.
- if ( iSettingsModel->SettingValueEnabled( ECamSettingItemVideoQuality, qualityIndex ) )
- {
- SetIntegerSettingValueL( ECamSettingItemVideoQuality, qualityIndex );
- HandleVideoQualitySettingChangeL();
- qualityChanged = ETrue;
- }
- }
- }
- PRINT( _L("Camera <= CCamAppController::ToggleWideScreenQuality") );
- }
- else // avoids LINT warning.
- PRINT( _L("Camera =><= CCamAppController::ToggleWideScreenQuality - current quality level NOT high") );
-
- return qualityChanged;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsSaveStarted
-//
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsSaveStarted()
- {
- return iSaveStarted;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SwitchToStandby
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SwitchToStandbyL( TInt aStatus )
- {
- PRINT( _L("Camera => CCamAppController::SwitchToStandbyL") );
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- __ASSERT_DEBUG( appUi, CamPanic( ECamPanicNullPointer ) );
- if( !appUi->ChangeStandbyStatusL(aStatus) )
- {
- SetOperation( ECamStandby, aStatus );
- iIdleTimer->Cancel();
-
- // Use backlight timer also with bitmap vf
- if( iBacklightTimer )
- {
- if( ECamTriActive == iCameraController->ViewfinderState() )
- {
- User::ResetInactivityTime();
- }
- iBacklightTimer->Cancel();
- }
- }
- switch( aStatus )
- {
- case ECamErrMassStorageMode:
- case ECamErrMemoryCardNotInserted:
- {
- iCurrentStorage = static_cast<TCamMediaStorage>(IntegerSettingValueUnfiltered( ECamSettingItemPhotoMediaStorage ));
- }
- break;
- default:
- {
- SetIntegerSettingValueL( ECamSettingItemPhotoMediaStorage, iCurrentStorage );
- SetIntegerSettingValueL( ECamSettingItemVideoMediaStorage, iCurrentStorage );
- }
- break;
- }
- PRINT( _L("Camera <= CCamAppController::SwitchToStandbyL") );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IssueModeChangeSequenceSucceeded
-//
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IssueModeChangeSequenceSucceeded()
- {
- return iIssueModeChangeSequenceSucceeded;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::EmbeddedStartupSequence
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::EmbeddedStartupSequence()
- {
- // If startup sequence fails at this point, it will be tried again later
- TRAP_IGNORE( IssueModeChangeSequenceL( ETrue ) );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SnapshotRotationComplete
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SnapshotRotationComplete()
- {
- PRINT( _L( "Camera => CCamAppController::SnapshotRotationComplete" ) );
- // If snapshot rotation takes too long, it might not be drawn
- // unless specifically requested
- if( iSnapshotRedrawNeeded )
- {
- iSnapshotRedrawNeeded = EFalse;
- NotifyControllerObservers( ECamEventSnapshotRotated );
- }
- PRINT( _L( "Camera <= CCamAppController::SnapshotRotationComplete" ) );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandleTvAccessoryConnectedL
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandleTvAccessoryConnectedL()
- {
- PRINT(_L("Camera => CCamAppController::HandleTvAccessoryConnectedL "));
- if( IntegerSettingValue( ECamSettingItemStopRecordingInHdmiMode)
- && IsHdmiCableConnected() )
- {
- if( ECamCapturing == iInfo.iOperation ||
- ECamPaused == iInfo.iOperation )
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- iHdmiCableConnectedDuringRecording = ETrue;
- TVwsViewId activeView;
- if ( appUi->GetActiveViewId( activeView ) == KErrNone )
- {
- if( ECamViewIdVideoPreCapture == activeView.iViewUid.iUid )
- {
- CCamVideoPreCaptureView* view = static_cast<CCamVideoPreCaptureView*>( appUi->View( activeView.iViewUid ) );
- view->HandleCommandL( ECamCmdStop );
- }
- }
- }
- }
- PRINT(_L("Camera <= CCamAppController::HandleTvAccessoryConnectedL "));
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandleTvAccessoryConnectedL
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandleTvAccessoryDisconnectedL()
- {
-
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::IsHdmiCableConnected
-//
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::IsHdmiCableConnected()
- {
- return iTvAccessoryMonitor->IsHdmiCableConnected();
- }
-// End of File
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::RemainingVideoRecordingTime
-//
-// ---------------------------------------------------------------------------
-//
-TTimeIntervalMicroSeconds CCamAppController::RemainingVideoRecordingTime()
- {
- return iCameraController->RemainingVideoRecordingTime();
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandlePostHdmiConnectDuringRecordingEventL
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandlePostHdmiConnectDuringRecordingEventL()
- {
- if( iHdmiCableConnectedDuringRecording == TBool(ETrue) )
- {
- iHdmiCableConnectedDuringRecording = EFalse;
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- appUi->HandleHdmiEventL( ECamHdmiCableConnectedDuringRecording );
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetPendingHdmiEvent
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetPendingHdmiEvent( TCamHdmiEvent aPendingHdmiEvent )
- {
- iPendingHdmiEvent = aPendingHdmiEvent;
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandlePendingHdmiEvent
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandlePendingHdmiEvent()
- {
- if( iPendingHdmiEvent != ECamHdmiNoEvent )
- {
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- appUi->HandleHdmiEventL( iPendingHdmiEvent );
- iPendingHdmiEvent = ECamHdmiNoEvent;
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CCamAppController::HandleSecondaryCameraExit
-//
-// Place here any extra things that need to be done when
-// exiting camera app. in secondary camera mode
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::HandleSecondaryCameraExitL()
- {
- PRINT( _L( "Camera => CCamAppController::HandleSecondaryCameraExit" ) );
-
- // Scene mode and face tracking issues --->
- CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
- // Do a switch to primary camera.
- appUi->HandleCommandL( ECamCmdSwitchCamera );
- // Set correct settings for primary camera.
- SetDynamicSettingsToDefaults();
- // Check if "User" scene mode should be on.
- iSettingsModel->SetUserSceneDefault();
- // PhotoSceneHasChangedL() needs to be called to
- // get also face tracking to the correct state.
- iSettingsModel->PhotoSceneHasChangedL( IntegerSettingValue( ECamSettingItemDynamicPhotoScene ) );
- // StoreFaceTrackingValue() does nothing in 2ndary camera mode.
- // (Because scene mode is forced to Auto while in 2ndary camera.)
- // -> Always save face tracking state when exiting from 2ndary cam.
- SetIntegerSettingValueL( ECamSettingItemFaceTracking, iSettingsModel->GetPreviousFaceTrack() );
- // <--- Scene mode and face tracking issues
-
- PRINT( _L( "Camera <= CCamAppController::HandleSecondaryCameraExit" ) );
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SceneModeForcedBySecondaryCamera
-//
-// ---------------------------------------------------------------------------
-//
-TBool CCamAppController::SceneModeForcedBySecondaryCamera()
- {
- return iSceneModeForcedBySecondaryCamera;
- }
-
-// ---------------------------------------------------------------------------
-// CCamAppController::SetTouchCapture
-//
-// ---------------------------------------------------------------------------
-//
-void CCamAppController::SetTouchCapture( TBool aTouchCapture )
- {
- iTouchCapture = aTouchCapture;
- }
-// End of File
-