camerauis/cameraapp/generic/src/cameracontroller/camsettingprovider.cpp
branchRCL_3
changeset 24 bac7acad7cb3
equal deleted inserted replaced
23:61bc0f252b2b 24:bac7acad7cb3
       
     1 /*
       
     2 * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Setting Provider class implementation
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // ===========================================================================
       
    20 // Includes
       
    21 
       
    22 #include "camcameracontrollerflags.hrh"
       
    23 #include <ecam.h>
       
    24 #ifdef CAMERAAPP_CAPI_V2
       
    25   #include <ecamadvsettings.h> // KECamFineResolutionFactor
       
    26 #endif
       
    27 
       
    28 #include <ECamOrientationCustomInterface2.h>
       
    29 
       
    30 #include "camlogging.h"
       
    31 #include "camcameracontroller.pan"
       
    32 #include "CamSettingsInternal.hrh"
       
    33 #include "camcameracontrollertypes.h"
       
    34 #include "camsettingprovider.h"
       
    35 #include "CamSettingsModel.h"
       
    36 #include "camsettingconversion.h"
       
    37 #include "CamAppController.h"
       
    38 #include "campointerutility.inl"
       
    39 #include "CameraUiConfigManager.h"
       
    40 
       
    41 #include "CamAppUi.h"
       
    42 #include "CamUtility.h"
       
    43 #include "CamPSI.h"
       
    44 
       
    45 #include "CamVideoQualityLevel.h"
       
    46 
       
    47 
       
    48 // ===========================================================================
       
    49 // Types
       
    50 
       
    51 using namespace NCamCameraController;
       
    52 
       
    53 #ifdef CAMERAAPP_CAPI_V2_ADV
       
    54   typedef CCamera::CCameraAdvancedSettings CAS;
       
    55 #endif
       
    56 #ifdef CAMERAAPP_CAPI_V2_IP
       
    57   typedef CCamera::CCameraImageProcessing  CIP;
       
    58 #endif
       
    59 
       
    60 // ===========================================================================
       
    61 // Local data
       
    62 
       
    63 static const TInt               KSettingArrayGranularity = 8;
       
    64 
       
    65 static const TSize              KViewfinderSize         = TSize(320, 240);
       
    66 static const TBool              KSnapshotMaintainAspect = EFalse;
       
    67 static const TInt               KEngineMultiplier       = 10;
       
    68 
       
    69 // ===========================================================================
       
    70 // Methods
       
    71 
       
    72 // static
       
    73 CCamSettingProvider*
       
    74 CCamSettingProvider::NewL( CCamAppController& aController,
       
    75                            MCamSettingsModel* aSettingsModel )
       
    76   {
       
    77   CCamSettingProvider* self =
       
    78       CCamSettingProvider::NewLC( aController, aSettingsModel );
       
    79   CleanupStack::Pop( self );
       
    80   return self;
       
    81   }
       
    82 
       
    83 // static
       
    84 CCamSettingProvider*
       
    85 CCamSettingProvider::NewLC( CCamAppController& aController,
       
    86                             MCamSettingsModel* aSettingsModel )
       
    87   {
       
    88   CCamSettingProvider* self =
       
    89       new (ELeave) CCamSettingProvider( aController, aSettingsModel );
       
    90   CleanupStack::PushL( self );
       
    91   self->ConstructL();
       
    92   return self;
       
    93   }
       
    94 
       
    95 // virtual
       
    96 CCamSettingProvider::~CCamSettingProvider()
       
    97   {
       
    98   iPendingSettingChanges.Close();
       
    99   }
       
   100 
       
   101 
       
   102 // ===========================================================================
       
   103 // From MCamSettingProvider
       
   104 
       
   105 // ---------------------------------------------------------------------------
       
   106 // virtual ProvideCameraParamL
       
   107 //
       
   108 // ---------------------------------------------------------------------------
       
   109 //
       
   110 void
       
   111 CCamSettingProvider::ProvideCameraParamL(
       
   112     const NCamCameraController::TCamCameraParamId& aParamId,
       
   113           TAny*                                      aParamData )
       
   114   {
       
   115   __ASSERT_DEBUG( aParamData, Panic( ECamNullPointer ) );
       
   116   switch( aParamId )
       
   117     {
       
   118     // -----------------------------------------------------
       
   119     case ECameraParamImage:
       
   120       {
       
   121       TPckgBuf<TCamParamsImage>* ptr =
       
   122           static_cast<TPckgBuf<TCamParamsImage>*>( aParamData );
       
   123       CheckNonNullL( ptr, KErrNotFound );
       
   124       TCamParamsImage& params( (*ptr)() );
       
   125       CCamAppUiBase* appUi = static_cast<CCamAppUiBase*>( CEikonEnv::Static()->AppUi() );
       
   126       
       
   127       // Both primary and secondary camera use Exif format
       
   128       params.iFormat = CCamera::EFormatExif;  
       
   129 
       
   130       TCamPhotoSizeId PhotoSizeIndex = iSettingsModel->CurrentPhotoResolution();
       
   131       TSize PhotoSize = iSettingsModel->ImageResolutionFromIndex( PhotoSizeIndex );
       
   132       params.iSize     = PhotoSize;
       
   133       params.iQualityFactor = iSettingsModel->CurrentPhotoCompression();
       
   134       break;
       
   135       }
       
   136     // -----------------------------------------------------
       
   137 #ifdef CAMERAAPP_CAE_FOR_VIDEO
       
   138     case ECameraParamVideoCae:
       
   139       {
       
   140       TPckgBuf<TCamParamsVideoCae>* ptr =
       
   141           static_cast<TPckgBuf<TCamParamsVideoCae>*>( aParamData );
       
   142       CheckNonNullL( ptr, KErrNotFound );
       
   143 
       
   144       TCamParamsVideoCae& params( (*ptr)() );
       
   145 
       
   146 
       
   147       TInt videoQuality = iSettingsModel->IntegerSettingValue( ECamSettingItemVideoQuality );
       
   148 
       
   149       PRINT1( _L("Camera <> CCamSettingProvider::ProvideCameraParamL - video quality (index): %d"), videoQuality );
       
   150       PRINT1( _L("Camera <> CCamSettingProvider::ProvideCameraParamL - quality count: %d"), iSettingsModel->VideoQualityArray().Count() );
       
   151 
       
   152       CCamVideoQualityLevel& level = *( iSettingsModel->VideoQualityArray() )[videoQuality];
       
   153       TInt res = level.VideoResolution();
       
   154       PRINT1( _L("Camera <> CCamSettingProvider::ProvideCameraParamL - video resolution (index): %d"), res );
       
   155       PRINT1( _L("Camera <> CCamSettingProvider::ProvideCameraParamL - resolution count: %d"), iSettingsModel->VideoResolutions().Count() );
       
   156 
       
   157       // Video resolutions array in Setting Model is set up from
       
   158       // R_CAM_VIDEO_RESOLUTION_ARRAY resource. New resolutions
       
   159       // need to be added there also, in addition to configuration files.
       
   160       TSize resolution =  ( iSettingsModel->VideoResolutions() )[ res ];
       
   161       params.iFrameSize    = resolution;
       
   162       params.iFrameRate    = level.FrameRate();
       
   163       params.iVideoBitRate = level.VideoBitRate();
       
   164       params.iAudioBitRate = level.AudioBitRate();
       
   165       params.iAudioOn      = iSettingsModel->IntegerSettingValue( ECamSettingItemVideoAudioRec );
       
   166       params.iMimeType.Set ( level.VideoMimeType() );
       
   167       params.iSupplier.Set ( level.PreferredSupplier() );
       
   168       params.iVideoType.Set( level.VideoFileType() );
       
   169       params.iAudioType.Set( level.AudioType() );
       
   170 
       
   171       TInt framerate = -1;
       
   172       TCamSceneId videoscene = static_cast< TCamSceneId > (
       
   173               iSettingsModel->IntegerSettingValue(ECamSettingItemDynamicVideoScene) );
       
   174 
       
   175       framerate = iSettingsModel->SceneSettingValue(videoscene, ECamSettingItemSceneFramerate);
       
   176 
       
   177       // Change the framerate if scene has defined it to be > 0
       
   178       if ( framerate > 0 )
       
   179           {
       
   180           params.iFrameRate = framerate;
       
   181           }
       
   182 
       
   183       PRINT1( _L("Camera <> CCamSettingProvider::ProvideCameraParamL ECameraParamVideoCae framerate: %d"), framerate )
       
   184 
       
   185       break;
       
   186       }
       
   187 #endif // CAMERAAPP_CAE_FOR_VIDEO
       
   188     // -----------------------------------------------------
       
   189     case ECameraParamVfMode:
       
   190       {
       
   191       CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
       
   192       TPckgBuf<TCamViewfinderMode>* ptr =
       
   193           static_cast<TPckgBuf<TCamViewfinderMode>*>( aParamData );
       
   194       CheckNonNullL( ptr, KErrNotFound );
       
   195       TCamViewfinderMode& params( (*ptr)() );
       
   196       TBool isPrimaryCamera = appUi->ActiveCamera() == ECamActiveCameraPrimary;
       
   197 
       
   198       if ( iController.IsDirectScreenVFSupported( isPrimaryCamera ) )
       
   199         {// primary camera or 2nd camera DSVF
       
   200         PRINT( _L("Setting Provider <> provide ECameraParamVfMode == ECamViewfinderDirect") );
       
   201         params = ECamViewfinderDirect;
       
   202         }
       
   203       else
       
   204         {// primary camera or 2nd camera bitmap view finder
       
   205         PRINT( _L("Setting Provider <> provide ECameraParamVfMode == ECamViewfinderBitmap") );
       
   206         params = ECamViewfinderBitmap;
       
   207         }
       
   208       break;
       
   209       }
       
   210     // -----------------------------------------------------
       
   211     case ECameraParamVfBitmap:
       
   212         {
       
   213         CCamAppUi* appUi = static_cast<CCamAppUi*>(
       
   214             CEikonEnv::Static()->AppUi() );
       
   215         PRINT2( _L("Setting Provider <> provide ECameraParamVfBitmap. CurrentMode: (%d) TargetMode: (%d)"), iController.CurrentMode(), appUi->TargetMode() );
       
   216         TPckgBuf<TCamParamsVfBitmap>* ptr =
       
   217           static_cast<TPckgBuf<TCamParamsVfBitmap>*>( aParamData );
       
   218         CheckNonNullL( ptr, KErrNotFound );
       
   219         TCamParamsVfBitmap& params( (*ptr)() );
       
   220 
       
   221         TDisplayMode displayMode =
       
   222             CEikonEnv::Static()->ScreenDevice()->DisplayMode();
       
   223         CCamera::TFormat viewfinderFormat =
       
   224             CCamSettingConversion::Map2CameraFormat( displayMode );
       
   225 
       
   226         const TCamCameraMode cameraMode =
       
   227         ( appUi->TargetMode() != ECamControllerIdle)
       
   228             ? appUi->TargetMode()
       
   229             : iController.CurrentMode();
       
   230         const TInt           resolution = (cameraMode == ECamControllerVideo)
       
   231                                         ? iController.GetCurrentVideoResolution()
       
   232                                         : iController.GetCurrentImageResolution();
       
   233         params.iRect   = CamUtility::ViewfinderLayout( cameraMode, resolution );
       
   234 
       
   235         params.iFormat = viewfinderFormat;
       
   236 
       
   237         // Mirror viewfinder for secondary camera
       
   238         params.iMirrorImage = ECamActiveCameraSecondary == appUi->ActiveCamera();
       
   239 
       
   240         break;
       
   241         }
       
   242     // -----------------------------------------------------
       
   243     case ECameraParamVfDirect:
       
   244       {
       
   245       // Not supported yet.
       
   246       User::Leave( KErrNotSupported );
       
   247       break;
       
   248       }
       
   249     // -----------------------------------------------------
       
   250     case ECameraParamSnapshot:
       
   251       {
       
   252       TPckgBuf<TCamParamsSnapshot>* ptr =
       
   253           static_cast<TPckgBuf<TCamParamsSnapshot>*>( aParamData );
       
   254       CheckNonNullL( ptr, KErrNotFound );
       
   255       TCamParamsSnapshot& params( (*ptr)() );
       
   256 
       
   257       // Fetch the snapshot size
       
   258       TDisplayMode   displayMode = CEikonEnv::Static()->ScreenDevice()->DisplayMode();
       
   259       TCamCameraMode cameraMode  = iController.CurrentMode();
       
   260       TInt           resolution  = (cameraMode == ECamControllerVideo)
       
   261                                       ? iController.GetCurrentVideoResolution()
       
   262                                       : iController.GetCurrentImageResolution();
       
   263       params.iSize           = CamUtility::ViewfinderLayout( cameraMode, resolution ).Size();
       
   264       params.iFormat         = CCamSettingConversion::Map2CameraFormat(displayMode);
       
   265       params.iMaintainAspect = KSnapshotMaintainAspect;
       
   266       break;
       
   267       }
       
   268     // -----------------------------------------------------
       
   269     default:
       
   270       {
       
   271       User::Leave( KErrNotSupported );
       
   272       break;
       
   273       }
       
   274     // -----------------------------------------------------
       
   275     }
       
   276   }
       
   277 
       
   278 
       
   279 // ---------------------------------------------------------------------------
       
   280 // virtual ProvideCameraSettingL
       
   281 //
       
   282 // ---------------------------------------------------------------------------
       
   283 //
       
   284 void
       
   285 CCamSettingProvider::ProvideCameraSettingL(
       
   286     const NCamCameraController::TCamCameraSettingId& aSettingId,
       
   287           TAny*                                      aSettingData )
       
   288   {
       
   289   CheckNonNullL( aSettingData, KErrArgument );
       
   290 
       
   291   TCamCameraMode mode( iController.CurrentMode() );
       
   292 
       
   293   switch( aSettingId )
       
   294     {
       
   295     // -----------------------------------------------------
       
   296     // Flash
       
   297     case ECameraSettingFlash:
       
   298     case ECameraUserSceneSettingFlash:
       
   299       {
       
   300       TCamFlashId flashId = static_cast<TCamFlashId> (iSettingsModel->
       
   301                      IntegerSettingValue( ECamSettingItemDynamicPhotoFlash ) );
       
   302       if ( mode == ECamControllerVideo )
       
   303         {
       
   304         flashId = static_cast<TCamFlashId> (iSettingsModel->
       
   305                      IntegerSettingValue( ECamSettingItemDynamicVideoFlash ) );
       
   306         }
       
   307       CCamera::TFlash CamFlashId = CCamSettingConversion::Map2CameraFlash( flashId );
       
   308       CCamera::TFlash* ptr = static_cast<CCamera::TFlash*>( aSettingData );
       
   309       *ptr = CamFlashId;
       
   310       break;
       
   311       }
       
   312     // -----------------------------------------------------
       
   313     // Exposure (EV mode + EV compensation step)
       
   314     case ECameraSettingExposure:
       
   315     case ECameraUserSceneSettingExposure:
       
   316       {
       
   317       TPckgBuf<TCamSettingDataExposure>* ptr =
       
   318         static_cast<TPckgBuf<TCamSettingDataExposure>*>( aSettingData );
       
   319       TCamSettingDataExposure& evData( (*ptr)() );
       
   320 
       
   321       TInt sceneItemId = ( ECamControllerVideo == mode )
       
   322                          ? ECamSettingItemDynamicVideoScene
       
   323                          : ECamSettingItemDynamicPhotoScene;
       
   324 
       
   325       TInt sceneId = iSettingsModel->IntegerSettingValue( sceneItemId );
       
   326 
       
   327       TCamSceneAEMode evMode =
       
   328         static_cast<TCamSceneAEMode>(
       
   329           iSettingsModel->SceneSettingValue( sceneId, ECamSettingItemSceneAEMode ) );
       
   330 
       
   331       evData.iExposureMode = CCamSettingConversion::Map2CameraExposureMode( evMode );
       
   332       PRINT1( _L("Camera <> provide EV mode: %016b"), evData.iExposureMode );
       
   333 #ifdef CAMERAAPP_CAPI_V2
       
   334       TInt evKey;
       
   335       if ( ECameraUserSceneSettingExposure != aSettingId )
       
   336         {
       
   337         evKey   = ( ECamControllerVideo == mode )
       
   338                    ? ECamSettingItemDynamicVideoExposure
       
   339                    : ECamSettingItemDynamicPhotoExposure;
       
   340         }
       
   341       else
       
   342         {
       
   343         evKey   = ECamSettingItemUserSceneExposure;
       
   344         }
       
   345 
       
   346       TInt evValue = iSettingsModel->IntegerSettingValue( evKey );
       
   347       if( iEvStepAsUiValue != 0 )
       
   348         evData.iExposureStep = (evValue * KECamFineResolutionFactor) / iEvStepAsUiValue;
       
   349       else
       
   350         evData.iExposureStep = 0;
       
   351       PRINT1( _L("Camera <> provide EV compensation: %d"), evData.iExposureStep );
       
   352 #else
       
   353       evData.iExposureStep = 0;
       
   354 #endif
       
   355       break;
       
   356       }
       
   357     // -----------------------------------------------------
       
   358     // Light sensitivity (ISO value)
       
   359     case ECameraSettingLightSensitivity:
       
   360     case ECameraUserSceneSettingLightSensitivity:
       
   361       {
       
   362       TInt* ptr = static_cast<TInt*>( aSettingData );
       
   363       TInt isoKey;
       
   364 
       
   365       if ( ECameraUserSceneSettingLightSensitivity != aSettingId )
       
   366         {
       
   367         isoKey   =  ( ECamControllerVideo == mode )
       
   368                     ? ECamSettingItemDynamicVideoLightSensitivity
       
   369                     : ECamSettingItemDynamicPhotoLightSensitivity;
       
   370         }
       
   371       else
       
   372         {
       
   373         isoKey = ECamSettingItemUserSceneLightSensitivity;
       
   374         }
       
   375       // TCamLightSensitivityId type value returned
       
   376       TCamLightSensitivityId isoId =
       
   377         static_cast<TCamLightSensitivityId>( iSettingsModel->IntegerSettingValue( isoKey ) );
       
   378 
       
   379       *ptr = CamUtility::MapLightSensitivity2IsoValueL( isoId, iSupportedISORates );
       
   380       PRINT1( _L("Camera <> provide ISO rate: %d"), *ptr );
       
   381       break;
       
   382       }
       
   383     // -----------------------------------------------------
       
   384     // White balance
       
   385     case ECameraSettingWhiteBalance:
       
   386     case ECameraUserSceneSettingWhiteBalance:
       
   387       {
       
   388       TPckgBuf<TCamSettingDataWhiteBalance>* ptr =
       
   389         static_cast<TPckgBuf<TCamSettingDataWhiteBalance>*>( aSettingData );
       
   390       TInt key;
       
   391 
       
   392       if ( ECameraUserSceneSettingWhiteBalance != aSettingId )
       
   393         {
       
   394         key = ( ECamControllerVideo == mode )
       
   395                ? ECamSettingItemDynamicVideoWhiteBalance
       
   396                : ECamSettingItemDynamicPhotoWhiteBalance;
       
   397         }
       
   398       else
       
   399         {
       
   400         key = ECamSettingItemUserSceneWhitebalance;
       
   401         }
       
   402 
       
   403       TCamSettingDataWhiteBalance& wbData( (*ptr)() );
       
   404 
       
   405       TCamWhiteBalanceId WB = static_cast<TCamWhiteBalanceId>(iSettingsModel->IntegerSettingValue( key ));
       
   406       CCamera::TWhiteBalance CamWB = CCamSettingConversion::Map2CameraWb( WB );
       
   407 
       
   408       wbData.iWhiteBalanceMode = CamWB;
       
   409       break;
       
   410       }
       
   411 #ifdef CAMERAAPP_CAPI_V2_IP
       
   412     // -----------------------------------------------------
       
   413     // Colour effect (colour filter: sepia/b&w/vivid/..)
       
   414     case ECameraSettingColourEffect:
       
   415     case ECameraUserSceneSettingColourEffect:
       
   416       {
       
   417       CIP::TEffect* ptr = static_cast<CIP::TEffect*>( aSettingData );
       
   418 
       
   419       TInt key;
       
   420 
       
   421       if ( ECameraUserSceneSettingColourEffect != aSettingId )
       
   422         {
       
   423         key = ( ECamControllerVideo == mode )
       
   424                ? ECamSettingItemDynamicVideoColourFilter
       
   425                : ECamSettingItemDynamicPhotoColourFilter;
       
   426         }
       
   427       else
       
   428         {
       
   429         key = ECamSettingItemUserSceneColourFilter;
       
   430         }
       
   431 
       
   432       TCamColourFilterId uiValue =
       
   433         static_cast<TCamColourFilterId>( iSettingsModel->IntegerSettingValue( key ) );
       
   434 
       
   435       CIP::TEffect effect = CCamSettingConversion::Map2CameraEffect( uiValue );
       
   436 
       
   437       PRINT1( _L("Camera <> provide colour effect: 0x%08x"), effect );
       
   438       *ptr = effect;
       
   439       break;
       
   440       }
       
   441     // -----------------------------------------------------
       
   442     // Sharpness
       
   443     case ECameraSettingSharpness:
       
   444     case ECameraUserSceneSettingSharpness:
       
   445       {
       
   446       TInt* ptr = static_cast<TInt*>( aSettingData );
       
   447 
       
   448       TInt key;
       
   449 
       
   450       if ( ECameraUserSceneSettingSharpness != aSettingId )
       
   451         {
       
   452         key = ECamSettingItemDynamicPhotoImageSharpness;
       
   453         }
       
   454       else
       
   455         {
       
   456         key = ECamSettingItemUserSceneImageSharpness;
       
   457         }
       
   458       TCamImageSharpnessId uiValue =
       
   459         static_cast<TCamImageSharpnessId>(
       
   460           iSettingsModel->IntegerSettingValue( key ) );
       
   461 
       
   462       TInt sharpness = CamUtility::MapSharpnessId2SharpnessValueL( uiValue );
       
   463       PRINT1( _L("Camera <> provide sharpness: %d"), sharpness );
       
   464       *ptr = sharpness;
       
   465 
       
   466       break;
       
   467       }
       
   468 #endif // CAMERAAPP_CAPI_V2_IP
       
   469     // -----------------------------------------------------
       
   470     // Brightness
       
   471     case ECameraSettingBrightness:
       
   472     case ECameraUserSceneSettingBrightness:
       
   473       {
       
   474       CCamera::TBrightness* ptr =
       
   475           static_cast<CCamera::TBrightness*>( aSettingData );
       
   476 
       
   477       TInt key;
       
   478 
       
   479       if ( ECameraUserSceneSettingBrightness != aSettingId )
       
   480         {
       
   481         key = ( ECamControllerVideo == mode )
       
   482                ? ECamSettingItemDynamicVideoBrightness
       
   483                : ECamSettingItemDynamicPhotoBrightness;
       
   484         }
       
   485       else
       
   486         {
       
   487         key = ECamSettingItemUserSceneBrightness;
       
   488         }
       
   489 
       
   490       TInt SettingsBrightness = iSettingsModel->IntegerSettingValue( key );
       
   491       CCamera::TBrightness CamBrightness = CCamera::TBrightness( KEngineMultiplier * SettingsBrightness );
       
   492 
       
   493       PRINT1( _L("Camera <> provide brightness: %d"), CamBrightness );
       
   494       *ptr = CamBrightness;
       
   495       break;
       
   496       }
       
   497     // -----------------------------------------------------
       
   498     // Contrast
       
   499     case ECameraSettingContrast:
       
   500     case ECameraUserSceneSettingContrast:
       
   501       {
       
   502       CCamera::TContrast* ptr = static_cast<CCamera::TContrast*>( aSettingData );
       
   503       TInt key;
       
   504 
       
   505       if ( ECameraUserSceneSettingContrast != aSettingId )
       
   506         {
       
   507         key = ( ECamControllerVideo == mode )
       
   508                ? ECamSettingItemDynamicVideoContrast
       
   509                : ECamSettingItemDynamicPhotoContrast;
       
   510         }
       
   511       else
       
   512         {
       
   513         key = ECamSettingItemUserSceneContrast;
       
   514         }
       
   515 
       
   516       TInt SettingsContrast = iSettingsModel->IntegerSettingValue( key );
       
   517       CCamera::TContrast CamContrast = CCamera::TContrast( KEngineMultiplier * SettingsContrast );
       
   518       PRINT1( _L("Camera <> provide contrast: %d"), CamContrast );
       
   519       *ptr = CamContrast;
       
   520       break;
       
   521       }
       
   522     // -----------------------------------------------------
       
   523     // Digital zoom
       
   524     case ECameraSettingDigitalZoom:
       
   525       {
       
   526       TInt* ptr = static_cast<TInt*>( aSettingData );
       
   527       CheckNonNullL( ptr, KErrArgument );
       
   528       *ptr = iController.ZoomValue();
       
   529       break;
       
   530       }
       
   531     // -----------------------------------------------------
       
   532     // Optical zoom
       
   533     case ECameraSettingOpticalZoom:
       
   534       {
       
   535       User::Leave( KErrNotSupported );
       
   536       //iSettingsModel->IntegerSettingValue( ECamSettingItemPhotoOpticalZoom );
       
   537       break;
       
   538       }
       
   539 #ifdef CAMERAAPP_CAPI_V2_ADV
       
   540     case ECameraSettingFocusRange:
       
   541       {
       
   542       // User::Leave( KErrNotSupported );
       
   543       CAS::TFocusRange* ptr = static_cast<CAS::TFocusRange*>( aSettingData );
       
   544 
       
   545       // Get current scene, from which the focus range value should be obtained
       
   546       TInt currentScene = iSettingsModel->IntegerSettingValue( ECamSettingItemDynamicPhotoScene );
       
   547       if ( currentScene  == ECamSceneUser )
       
   548         {
       
   549         // In case of user scene, use the base scene instead
       
   550         currentScene = iSettingsModel->IntegerSettingValue( ECamSettingItemUserSceneBasedOnScene );
       
   551         }
       
   552       PRINT1( _L("Camera <> current scene: %d"), currentScene );
       
   553 
       
   554       // Get the autofocus mode in camera internal format
       
   555       TInt afMode = iSettingsModel->SceneSettingValue( currentScene, ECamSettingItemSceneAFMode );
       
   556 
       
   557       PRINT1( _L("Camera <> Autofocusmode for current scene: %d"), afMode );
       
   558 
       
   559       TCamSettingsOnOff facetrack =
       
   560       static_cast<TCamSettingsOnOff>(
       
   561           iSettingsModel->IntegerSettingValue( ECamSettingItemFaceTracking ) );
       
   562       if ( iController.UiConfigManagerPtr() && iController.UiConfigManagerPtr()->IsFaceTrackingSupported() &&
       
   563            ( ECamSettOn == facetrack ) )
       
   564           {
       
   565           // Use CCamera::CCameraAdvancedSettings::EFocusRangeAuto if in facetracking mode.
       
   566           *ptr = CCamera::CCameraAdvancedSettings::EFocusRangeAuto;
       
   567           }
       
   568       else
       
   569           {
       
   570           // Convert it to TFocusRange
       
   571           *ptr = CCamSettingConversion::Map2CameraAutofocus( static_cast<TCamSceneAFMode>( afMode ) );
       
   572           PRINT1( _L("Camera <> Autofocusmode mapped for CCamera: %d"), *ptr );
       
   573           }
       
   574       //CheckNonNullL( ptr, KErrNotFound );
       
   575       //*ptr = KFocusRange;//iSettingsModel->IntegerSettingValue( ECamSettingItemDynamicPhotoFocusRange );
       
   576       break;
       
   577       }
       
   578     // -----------------------------------------------------
       
   579     case ECameraSettingCaptureLimit:
       
   580       {
       
   581       TInt* ptr = static_cast<TInt*>( aSettingData );
       
   582       *ptr = iController.CaptureLimitSetting();
       
   583 
       
   584       PRINT1( _L("Camera <> provide capture limit: %d"), *ptr );
       
   585       break;
       
   586       }
       
   587     // -----------------------------------------------------
       
   588     // Stabilization setting (for video)
       
   589     case ECameraSettingStabilization:
       
   590       {
       
   591       TCamSettingDataStabilization& stabilization =
       
   592         ( *static_cast<TPckgBuf<TCamSettingDataStabilization>*>( aSettingData ) )();
       
   593 
       
   594       TCamSettingsOnOff settingOn =
       
   595         static_cast<TCamSettingsOnOff>( iSettingsModel->IntegerSettingValue( ECamSettingItemVideoStab ) );
       
   596 
       
   597       // These could be made product specific..
       
   598       if( ECamSettOn == settingOn )
       
   599         {
       
   600         PRINT( _L("Camera <> Stabilization is set ON") );
       
   601         stabilization.iMode       = CAS::EStabilizationModeAuto;
       
   602         stabilization.iEffect     = CAS::EStabilizationAuto;
       
   603         stabilization.iComplexity = CAS::EStabilizationComplexityAuto;
       
   604         }
       
   605       else
       
   606         {
       
   607         PRINT( _L("Camera <> Stabilization is set OFF") );
       
   608         stabilization.iMode       = CAS::EStabilizationModeOff;
       
   609         stabilization.iEffect     = CAS::EStabilizationOff;
       
   610         stabilization.iComplexity = CAS::EStabilizationComplexityAuto;
       
   611         }
       
   612       break;
       
   613       }
       
   614 #endif // CAMERAAPP_CAPI_V2_ADV
       
   615     // -----------------------------------------------------
       
   616     // Device orientation setting
       
   617     case ECameraSettingOrientation:
       
   618       {
       
   619       MCameraOrientation::TOrientation* ptr =
       
   620         static_cast<MCameraOrientation::TOrientation*>( aSettingData );
       
   621 
       
   622       TCamImageOrientation orientationSetting =
       
   623         static_cast<TCamImageOrientation>( iController.ImageOrientation() );
       
   624       PRINT1( _L("Camera <> Got image orientation from ui: [%s]"), KCamOrientationNames[orientationSetting] );
       
   625 
       
   626       *ptr = CCamSettingConversion::Map2CameraOrientation( orientationSetting );
       
   627       PRINT1( _L("Camera <> provide camera orientation: 0x%02X"), *ptr );
       
   628       break;
       
   629       }
       
   630     // -----------------------------------------------------
       
   631     // Video audio mute setting
       
   632     case ECameraSettingAudioMute:
       
   633       {
       
   634       TCamSettingsOnOff mute =
       
   635         static_cast<TCamSettingsOnOff>(
       
   636           iSettingsModel->IntegerSettingValue( ECamSettingItemVideoAudioRec ) );
       
   637 
       
   638       TBool* ptr = static_cast<TBool*>( aSettingData );
       
   639       *ptr = (ECamSettOn == mute);
       
   640       PRINT1( _L("Camera <> provide mute on: %d"), *ptr );
       
   641       break;
       
   642       }
       
   643     // -----------------------------------------------------
       
   644     // Continuous autofocus setting
       
   645     case ECameraSettingContAF: 
       
   646       {
       
   647       TCamSettingsOnOff caf = static_cast<TCamSettingsOnOff>( 
       
   648          iSettingsModel->IntegerSettingValue( ECamSettingItemContinuousAutofocus ) );
       
   649 
       
   650       TBool* ptr = static_cast<TBool*>( aSettingData );
       
   651       *ptr = (ECamSettOn == caf);
       
   652       PRINT1( _L("Camera <> provide continuous autofocus on: %d"), *ptr );      
       
   653       break;
       
   654       }
       
   655     // -----------------------------------------------------
       
   656     // facetracking setting
       
   657     case ECameraSettingFacetracking:
       
   658       {
       
   659       TCamSettingsOnOff facetrack =
       
   660         static_cast<TCamSettingsOnOff>(
       
   661           iSettingsModel->IntegerSettingValue( ECamSettingItemFaceTracking ) );
       
   662       TBool* ptr = static_cast<TBool*>( aSettingData );
       
   663       *ptr = (ECamSettOn == facetrack);
       
   664       PRINT1( _L("Camera <> provide facetracking on: %d"), *ptr );
       
   665       break;
       
   666       }
       
   667     // -----------------------------------------------------
       
   668     // Video max size in bytes
       
   669     case ECameraSettingFileMaxSize:
       
   670       {
       
   671       TCamVideoClipLength setting =
       
   672         static_cast<TCamVideoClipLength>(
       
   673           iSettingsModel->IntegerSettingValue( ECamSettingItemVideoClipLength ) );
       
   674 
       
   675       TInt* ptr = static_cast<TInt*>( aSettingData );
       
   676 
       
   677       *ptr = ( ECamVideoClipShort == setting )
       
   678              ? CamUtility::MaxMmsSizeInBytesL()
       
   679              : 0; // 0 means not limited
       
   680 
       
   681       PRINT1( _L("Camera <> provide max file size: %d"), *ptr );
       
   682       break;
       
   683       }
       
   684     // -----------------------------------------------------
       
   685     // Video filename
       
   686     case ECameraSettingFileName:
       
   687       {
       
   688       TPtr* ptr = static_cast<TPtr*>( aSettingData );
       
   689       //*ptr = iController.CurrentFullFileName();
       
   690       *ptr = iController.CurrentVideoFileName();
       
   691       break;
       
   692       }
       
   693     // -----------------------------------------------------
       
   694     default:
       
   695       {
       
   696 #ifndef CAMERAAPP_EMULATOR_BUILD
       
   697       User::Leave( KErrNotSupported );
       
   698 #endif // not CAMERAAPP_EMULATOR_BUILD
       
   699       break;
       
   700       }
       
   701     // -----------------------------------------------------
       
   702     }
       
   703   }
       
   704 
       
   705 // ---------------------------------------------------------------------------
       
   706 //
       
   707 // ---------------------------------------------------------------------------
       
   708 //
       
   709 void
       
   710 CCamSettingProvider::ProvidePendingSettingChangesL(
       
   711     RArray<NCamCameraController::TCamCameraSettingId>& aSettingIds )
       
   712   {
       
   713   PRINT( _L("Camera => CCamSettingProvider::ProvidePendingSettingChangesL") );
       
   714   aSettingIds.Reset();
       
   715   aSettingIds.ReserveL( iPendingSettingChanges.Count() );
       
   716   for( TInt i = 0; i < iPendingSettingChanges.Count(); i++ )
       
   717     {
       
   718     aSettingIds.AppendL( iPendingSettingChanges[i] );
       
   719     }
       
   720   PRINT1( _L("Camera <> %d settings changed"), aSettingIds.Count() );
       
   721 
       
   722   // These have been asked and delivered now.
       
   723   // Update: Reset only when asked. Enables retries.
       
   724   // iPendingSettingChanges.Reset();
       
   725   PRINT( _L("Camera <= CCamSettingProvider::ProvidePendingSettingChangesL") );
       
   726   }
       
   727 
       
   728 
       
   729 // ---------------------------------------------------------------------------
       
   730 // PendingSettingChangeCount
       
   731 // ---------------------------------------------------------------------------
       
   732 //
       
   733 TInt
       
   734 CCamSettingProvider::PendingSettingChangeCount() const
       
   735   {
       
   736   return iPendingSettingChanges.Count();
       
   737   }
       
   738 
       
   739 
       
   740 // ===========================================================================
       
   741 // New methods
       
   742 
       
   743 // ---------------------------------------------------------------------------
       
   744 // Reset
       
   745 // ---------------------------------------------------------------------------
       
   746 //
       
   747 void
       
   748 CCamSettingProvider::Reset()
       
   749   {
       
   750   PRINT( _L("Camera =><= CCamSettingProvider::Reset") );
       
   751   iPendingSettingChanges.Reset();
       
   752   }
       
   753 
       
   754 // ---------------------------------------------------------------------------
       
   755 // AddPendingSettingChangesL
       
   756 // ---------------------------------------------------------------------------
       
   757 //
       
   758 void
       
   759 CCamSettingProvider
       
   760 ::AddPendingSettingChangesL( const RArray<TCamSettingItemIds>& aUiSettingIds )
       
   761   {
       
   762   iPendingSettingChanges.ReserveL( aUiSettingIds.Count()
       
   763                                  + iPendingSettingChanges.Count() );
       
   764 
       
   765   for( TInt i = 0; i < aUiSettingIds.Count(); i++ )
       
   766     {
       
   767     AddPendingSettingChangeL( aUiSettingIds[i] );
       
   768     }
       
   769   }
       
   770 
       
   771 // ---------------------------------------------------------------------------
       
   772 // AddPendingSettingChangeL
       
   773 // ---------------------------------------------------------------------------
       
   774 //
       
   775 void
       
   776 CCamSettingProvider
       
   777 ::AddPendingSettingChangeL( TCamSettingItemIds aUiSettingId )
       
   778   {
       
   779   PRINT1( _L("Camera => CCamSettingProvider::AddPendingSettingChangeL [%s]"),
       
   780           KCamSettingItemNames[aUiSettingId] );
       
   781 
       
   782   TCamCameraSettingId cameraId =
       
   783       CCamSettingConversion::Map2CameraControllerSettingId( aUiSettingId );
       
   784 
       
   785   if( ECameraSettingNone != cameraId )
       
   786     {
       
   787     // Add each setting only once
       
   788     if( KErrNotFound == iPendingSettingChanges.Find( cameraId ) )
       
   789       {
       
   790       PRINT1( _L("Camera <> Add pending setting [%s]"), KCameraSettingNames[cameraId] );
       
   791       iPendingSettingChanges.AppendL( cameraId );
       
   792       }
       
   793     }
       
   794   else
       
   795     {
       
   796     User::Leave( KErrNotSupported );
       
   797     }
       
   798   PRINT( _L("Camera <= CCamSettingProvider::AddPendingSettingChangeL") );
       
   799   }
       
   800 
       
   801 // ---------------------------------------------------------------------------
       
   802 // SetSupportedISORatesL
       
   803 //
       
   804 // ---------------------------------------------------------------------------
       
   805 //
       
   806 void
       
   807 CCamSettingProvider::SetSupportedISORatesL( const RArray<TInt>& aSupportedIsoRates )
       
   808   {
       
   809   iSupportedISORates = aSupportedIsoRates;
       
   810   if ( iSupportedISORates.Count() != 0 )
       
   811     {
       
   812     iValidISORates = ETrue;
       
   813     }
       
   814   }
       
   815 
       
   816 // ===========================================================================
       
   817 // private
       
   818 
       
   819 void
       
   820 CCamSettingProvider::ConstructL()
       
   821   {
       
   822   PRINT( _L("Camera => CCamSettingProvider::ConstructL") );
       
   823   // Get EV steps range.
       
   824   iEvStepAsUiValue = iController.EvRange().iStepsPerUnit;
       
   825   PRINT( _L("Camera <= CCamSettingProvider::ConstructL") );
       
   826   }
       
   827 
       
   828 
       
   829 CCamSettingProvider::CCamSettingProvider( CCamAppController& aController,
       
   830                                           MCamSettingsModel* aSettingsModel )
       
   831  : iSettingsModel( aSettingsModel ),
       
   832    iController   ( aController    ),
       
   833    iPendingSettingChanges( KSettingArrayGranularity )
       
   834   {
       
   835   }
       
   836 
       
   837