camerauis/cameraapp/generic/src/audioplayer/camaudioplayercontroller.cpp
branchRCL_3
changeset 54 bac7acad7cb3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/src/audioplayer/camaudioplayercontroller.cpp	Wed Sep 01 12:30:54 2010 +0100
@@ -0,0 +1,595 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Implementation of Controller for Sound / Tone Wrappers
+*
+*/
+
+
+
+// ===========================================================================  
+// includes
+#include <e32base.h>
+#include <aknappui.h>       // CAknAppUi
+#include <aknsoundsystem.h> // CAknKeySoundSystem
+
+#include <cameraapp.rsg>
+#include <vgacamsettings.rsg>
+
+#include "camlogging.h"
+
+#include "CamSettingsInternal.hrh"       // TCamCameraMode, TCamSettingItemIds
+#include "CamAppController.h"
+#include "mcamplayerobserver.h"
+#include "mcamplayerwrapper.h"
+#include "camaudioplayerwrapper.h"
+#include "camaudioplayercontroller.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "camaudioplayercontrollerTraces.h"
+#endif
+
+
+
+// ===========================================================================
+// Constants
+namespace NCamAudioPlayerController
+  {
+  static const TInt KImageCaptureSoundId = KMinTInt;
+
+
+  // Cached sounds which are loaded once entering image mode.
+  // No need to include capture sound, it is selected based
+  // on the setting.
+  static const TInt KImageCachedSounds[] =
+    {
+    // Our own id for image capture sound,
+    // which can change.
+    // Also avoid compilation error, if AF beep not supported.
+    KImageCaptureSoundId,
+    ECamAutoFocusComplete
+    };
+  
+  // Cached sounds which are loaded once entering video mode.
+  static const TInt KVideoCachedSounds[] =
+    {
+    ECamVideoStartSoundId,
+    ECamVideoStopSoundId,
+    ECamVideoPauseSoundId,
+    ECamVideoResumeSoundId
+    };
+  }
+
+using namespace NCamAudioPlayerController;
+
+// ===========================================================================
+// public constructors and destructor
+
+// ---------------------------------------------------------------------------
+// NewL <<static>>
+// ---------------------------------------------------------------------------
+//
+CCamAudioPlayerController* 
+CCamAudioPlayerController::NewL( CCamAppController&  aController,
+                                 MCamPlayerObserver& aObserver )
+  {
+  CCamAudioPlayerController* self = 
+    new (ELeave) CCamAudioPlayerController( aController, aObserver );
+    
+  CleanupStack::PushL( self );
+  self->ConstructL();
+  CleanupStack::Pop( self );
+
+  return self;  
+  }
+
+// ---------------------------------------------------------------------------
+// destructor <<virtual>>
+// ---------------------------------------------------------------------------
+//
+CCamAudioPlayerController::~CCamAudioPlayerController()
+  {
+  iController.RemoveControllerObserver( this );
+  iController.RemoveSettingsObserver( this );
+
+  Reset();
+  iPlayers.Close();
+
+  iKeySoundSystem = NULL; // not own
+  }
+
+
+
+
+// ===========================================================================
+// From MCamControllerObserver
+
+// ---------------------------------------------------------------------------
+// HandleControllerEventL <<virtual>>
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController
+::HandleControllerEventL( TCamControllerEvent aEvent,
+                          TInt                aError )
+  {
+  PRINT( _L("Camera => CCamAudioPlayerController::HandleControllerEventL") );
+  switch( aEvent )
+    {
+    case ECamEventEngineStateChanged:
+      {
+      PRINT( _L("Camera <> CCamAudioPlayerController: case ECamEventEngineStateChanged") );
+      if( KErrNone == aError )
+        {
+        TCamCameraMode mode = iController.CurrentMode();
+        PRINT2( _L("Camera <> CCamAudioPlayerController: KErrNone, old mode[%s] new mode[%s]"), KCamModeNames[iCameraMode], KCamModeNames[mode] );
+        if( mode != iCameraMode )
+          {
+          // Changing to video or image mode.
+          // Cache the players needed.
+          // If this fails we just retry once a sound is really needed.
+          if     ( ECamControllerImage    == mode 
+                || ECamControllerVideo    == mode ) { Setup( mode ); }
+          // Changing to shutdown mode
+          // Release all players.
+          else if( ECamControllerShutdown == mode || ECamControllerIdle == mode ) 
+        	  {
+        	  Setup( mode );
+        	  }
+          // Other mode entered, no action
+          else                                      { /* no action */ }
+          }
+        }
+      else
+        {
+        PRINT1( _L("Camera <> CCamAudioPlayerController: error in (%d), call Reset.."), aError );
+        Reset();
+        }
+      break;
+      }
+
+    default:
+      {
+      break;
+      }
+    }
+  PRINT( _L("Camera <= CCamAudioPlayerController::HandleControllerEventL") );
+  }
+
+
+
+// ===========================================================================
+// From MCamSettingsModelObserver
+
+// ---------------------------------------------------------------------------
+// IntSettingChangedL <<virtual>>
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController
+::IntSettingChangedL( TCamSettingItemIds aSettingItem, 
+                      TInt               /*aSettingValue*/ )
+  {
+  PRINT( _L("Camera => CCamAudioPlayerController::IntSettingChangedL") );
+  switch( aSettingItem )
+    {
+    case ECamSettingItemPhotoCaptureTone:
+      {
+      PRINT( _L("Camera <> CCamAudioPlayerController: case ECamSettingItemPhotoCaptureTone") );
+
+      // The setting value is *not* of TCamSoundId type.
+      // See CCamAppController::CaptureToneId().
+      const TCamSoundId newSoundId = iController.CaptureToneId();
+      SetupCaptureSoundPlayerL( newSoundId );
+
+      break;
+      }
+    default:
+      {
+      break;
+      }
+    }
+
+  PRINT( _L("Camera <= CCamAudioPlayerController::IntSettingChangedL") );
+  }
+
+
+// ---------------------------------------------------------------------------
+// TextSettingChangedL <<virtual>>
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController
+::TextSettingChangedL(       TCamSettingItemIds /*aSettingItem*/, 
+                       const TDesC&             /*aSettingValue*/ )
+  {
+  // these events are ignored
+  }
+
+
+
+// ===========================================================================
+// new public
+
+// ---------------------------------------------------------------------------
+// PlaySound
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController::PlaySound( TInt  aSoundId,
+                                      TBool aCallback )
+  {
+  TRAPD( status,
+    {
+    // Get cached player, if available.
+    // Otherwise create new one.
+    CCamPlayerWrapperBase* player = GetPlayerL( aSoundId );
+    player->Play( aCallback );
+    });
+
+  if( KErrNone != status )
+    {
+    if( KErrNoMemory == status )
+      {
+      // If OOM, release all players.
+      // Create new ones again when needed.
+      Reset();
+      }
+    if( aCallback )
+      {
+      // If could not instantiate a player, notify observer right away.
+      iObserver.PlayComplete( status, aSoundId );
+      }
+    }
+  }
+
+
+// ---------------------------------------------------------------------------
+// CancelAllPlaying
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController::CancelAllPlaying()
+  {
+  PRINT( _L("Camera => CCamAudioPlayerController::CancelAllPlaying") );
+
+  for( TInt i = 0; i < iPlayers.Count(); i++ )
+    {
+    iPlayers[i]->CancelPlay();
+    }
+
+  PRINT( _L("Camera <= CCamAudioPlayerController::CancelAllPlaying") );
+  }
+
+// ---------------------------------------------------------------------------
+// CancelPlaying
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController::CancelPlaying( TInt aSoundId )
+  {
+  TInt index = FindPlayerIndex( aSoundId );
+  if( KErrNotFound != index )
+    {
+    CCamPlayerWrapperBase* player = iPlayers[index];
+    player->CancelPlay();
+    }
+  }
+
+
+// ---------------------------------------------------------------------------
+// InitKeySoundSystem
+// ---------------------------------------------------------------------------
+// 
+void
+CCamAudioPlayerController::InitKeySoundSystem()
+  {
+  PRINT( _L("Camera => CCamAudioPlayerController::InitKeySoundSystem") );
+  iKeySoundSystem = static_cast<CAknAppUi*>( CEikonEnv::Static()->AppUi() )->KeySounds();
+  /* No sounds played via iKeySoundSystem. No need to add sound list.
+  if( !iKeySoundSystem )
+    {
+    iKeySoundSystem = static_cast<CAknAppUi*>( CEikonEnv::Static()->AppUi() )->KeySounds();
+    if ( iKeySoundSystem )
+      {
+      TRAPD( status, iKeySoundSystem->AddAppSoundInfoListL( R_CAM_SOUND_LIST ) );
+      PRINT1( _L("Camera <> CCamAudioPlayerController: status:%d"), status );
+      if( KErrNone          != status
+       && KErrAlreadyExists != status
+        )
+        {
+        // Set unusable
+        iKeySoundSystem = NULL;
+        }  
+      }
+    }
+  */
+  PRINT( _L("Camera <= CCamAudioPlayerController::InitKeySoundSystem") );
+  }
+
+// ---------------------------------------------------------------------------
+// EnableAllKeySounds
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController::EnableAllKeySounds()
+  {
+  if ( iKeySoundSystem && iKeySoundsDisabled )
+    {
+    iKeySoundSystem->ReleaseContext();
+    iKeySoundSystem->PopContext();
+    iKeySoundsDisabled = EFalse;
+    }
+  }
+
+
+// ---------------------------------------------------------------------------
+// DisableAllKeySoundsL
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController::DisableAllKeySoundsL()
+  {
+  if ( iKeySoundSystem && !iKeySoundsDisabled )    
+    {
+    iKeySoundSystem->PushContextL( R_AVKON_SILENT_SKEY_LIST );
+    iKeySoundSystem->BringToForeground();
+    iKeySoundSystem->LockContext();
+    iKeySoundsDisabled = ETrue;
+    }
+  }
+
+
+
+
+// ===========================================================================
+// new private
+
+// ---------------------------------------------------------------------------
+// FindPlayerIndex
+// ---------------------------------------------------------------------------
+//
+TInt 
+CCamAudioPlayerController::FindPlayerIndex( TInt aSoundId ) const
+  {
+  TInt found = KErrNotFound;
+
+  // Check that id is valid.
+  if( aSoundId > 0 )
+    {
+    TInt current = iPlayers.Count(); 
+    while( --current >= 0 )
+      {
+      // Reuse player, if the sound is the same despite
+      // sound id being different.
+      // if( aSoundId == iPlayers[current]->Id() )
+      if( iPlayers[current]->IsEqualSound( aSoundId ) )
+        {
+        found   = current;
+        current = -1;
+        }
+      }
+    }
+  return found;
+  }
+    
+// ---------------------------------------------------------------------------
+// GetPlayerL
+// ---------------------------------------------------------------------------
+//
+CCamPlayerWrapperBase*
+CCamAudioPlayerController::GetPlayerL( TInt aSoundId )
+  {
+  PRINT1( _L("Camera => CCamAudioPlayerController::GetPlayerL, sound id:%d"), aSoundId );
+  CCamPlayerWrapperBase* player( NULL );
+  
+  if( KImageCaptureSoundId == aSoundId )
+    {
+    player = GetPlayerL( iController.CaptureToneId() );
+    }
+  else
+    {
+    TInt index = FindPlayerIndex( aSoundId );
+  
+    if( KErrNotFound != index )
+      {
+      player = iPlayers[index];
+      }
+    else
+      {
+      OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAUDIOPLAYERCONTROLLER_GETPLAYERL, "e_CAM_APP_CAPTURE_SOUND_LOAD 1" ); //CCORAPP_CAPTURE_SOUND_LOAD_START
+      
+      player = CCamAudioPlayerWrapper::NewL( iObserver, aSoundId );
+  
+      CleanupStack::PushL( player );
+      iPlayers.AppendL( player );
+      CleanupStack::Pop( player );
+      OstTrace0( CAMERAAPP_PERFORMANCE, DUP1_CCAMAUDIOPLAYERCONTROLLER_GETPLAYERL, "e_CAM_APP_CAPTURE_SOUND_LOAD 0" ); //CCORAPP_CAPTURE_SOUND_LOAD_END
+      }
+    }
+
+  PRINT( _L("Camera <= CCamAudioPlayerController::GetPlayerL") );
+  return player;
+  }
+
+
+
+// ---------------------------------------------------------------------------
+// RemovePlayer
+// ---------------------------------------------------------------------------
+//
+void
+CCamAudioPlayerController::RemovePlayer( TInt aSoundId )
+  {
+  TInt index = FindPlayerIndex( aSoundId );
+  if( KErrNotFound != index )
+    {
+    CCamPlayerWrapperBase* player = iPlayers[index];
+    iPlayers.Remove( index );
+    delete player;
+    player = NULL;
+    }
+  }
+
+// ---------------------------------------------------------------------------
+// Setup
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController::Setup( TCamCameraMode aCameraMode )
+  {
+  PRINT( _L("Camera => CCamAudioPlayerController::Setup") );
+  Reset();
+
+  TInt status( KErrNone );  
+  switch( aCameraMode )
+    {
+    case ECamControllerImage:
+      {
+      TRAP( status, SetupForImageL() );
+      break;
+      }
+
+    case ECamControllerVideo:
+      {
+      TRAP( status, SetupForVideoL() );
+      break;
+      }
+
+    case ECamControllerIdle:
+    case ECamControllerShutdown:
+    default:
+      {
+      // Already reset, no sounds needed now.
+      break;
+      }
+    }
+
+  // If any problems, try reload sounds once really needed, so reset now.
+  if( KErrNone != status ) 
+    Reset();
+  else
+    iCameraMode = aCameraMode;
+
+  PRINT( _L("Camera <= CCamAudioPlayerController::Setup") );
+  }
+
+// ---------------------------------------------------------------------------
+// SetupForVideoL
+// ---------------------------------------------------------------------------
+//
+void
+CCamAudioPlayerController::SetupForVideoL()
+  {
+  PRINT( _L("Camera => CCamAudioPlayerController::SetupForVideoL") );
+  InitKeySoundSystem();
+
+  TInt count( sizeof( KVideoCachedSounds ) / sizeof( TInt ) );
+  PRINT1( _L("Camera <> CCamAudioPlayerController: count of players to load: %d"), count );
+  for( TInt i = 0; i < count; i++ )
+    {
+    GetPlayerL( KVideoCachedSounds[i] );
+    }
+  PRINT( _L("Camera <= CCamAudioPlayerController::SetupForVideoL") );
+  }
+
+// ---------------------------------------------------------------------------
+// SetupForImageL
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController::SetupForImageL()
+  {
+  PRINT( _L("Camera => CCamAudioPlayerController::SetupForImageL") );
+  TInt count( sizeof( KImageCachedSounds ) / sizeof( TInt ) );
+
+  PRINT1( _L("Camera <> CCamAudioPlayerController: count of players to load: %d"), count );
+  for( TInt i = 0; i < count; i++ )
+    {
+    GetPlayerL( KImageCachedSounds[i] );
+    }
+  PRINT( _L("Camera => CCamAudioPlayerController::SetupForImageL") );
+  }
+
+// ---------------------------------------------------------------------------
+// SetupCaptureSoundPlayerL
+// ---------------------------------------------------------------------------
+//
+void
+CCamAudioPlayerController::SetupCaptureSoundPlayerL( TInt aNewSoundId )
+  {
+  PRINT2( _L("Camera => CCamAudioPlayerController::SetupCaptureSoundPlayerL, old sound:%d new sound:%d"), iCaptureSoundId, aNewSoundId );
+
+  if( aNewSoundId != iCaptureSoundId )
+    {
+    // Free old player, if exists.
+    RemovePlayer( iCaptureSoundId );
+  
+    // If loading new fails, retry when sound is needed.
+    iCaptureSoundId = -1;
+    GetPlayerL( aNewSoundId ); 
+    iCaptureSoundId = aNewSoundId;
+    }
+  PRINT ( _L("Camera <= CCamAudioPlayerController::SetupCaptureSoundPlayerL") );
+  }
+
+// ---------------------------------------------------------------------------
+// Reset
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController::Reset()
+  {
+  PRINT ( _L("Camera => CCamAudioPlayerController::Reset") );
+  iPlayers.ResetAndDestroy();
+
+
+  iCameraMode     = ECamControllerIdle;
+  iCaptureSoundId = -1;
+  PRINT ( _L("Camera <= CCamAudioPlayerController::Reset") );
+  }
+
+
+
+// ===========================================================================
+// private constructors
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void 
+CCamAudioPlayerController::ConstructL()
+  {
+  iController.AddControllerObserverL( this );
+  iController.AddSettingsObserverL( this );
+  }
+
+// ---------------------------------------------------------------------------
+// constructor
+// ---------------------------------------------------------------------------
+//
+CCamAudioPlayerController
+::CCamAudioPlayerController( CCamAppController&  aController,
+                             MCamPlayerObserver& aObserver )
+  : iController       ( aController            ),
+    iObserver         ( aObserver              ),
+    iCameraMode       ( ECamControllerIdle ),
+    iCaptureSoundId   ( -1                     ),
+    iKeySoundsDisabled( EFalse                 )
+  {
+  }
+
+// ===========================================================================  
+// end of file
+