diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/src/audioplayer/camaudioplayercontroller.cpp --- /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 +#include // CAknAppUi +#include // CAknKeySoundSystem + +#include +#include + +#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 <> +// --------------------------------------------------------------------------- +// +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 <> +// --------------------------------------------------------------------------- +// +CCamAudioPlayerController::~CCamAudioPlayerController() + { + iController.RemoveControllerObserver( this ); + iController.RemoveSettingsObserver( this ); + + Reset(); + iPlayers.Close(); + + iKeySoundSystem = NULL; // not own + } + + + + +// =========================================================================== +// From MCamControllerObserver + +// --------------------------------------------------------------------------- +// HandleControllerEventL <> +// --------------------------------------------------------------------------- +// +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 <> +// --------------------------------------------------------------------------- +// +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 <> +// --------------------------------------------------------------------------- +// +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( CEikonEnv::Static()->AppUi() )->KeySounds(); + /* No sounds played via iKeySoundSystem. No need to add sound list. + if( !iKeySoundSystem ) + { + iKeySoundSystem = static_cast( 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 +