diff -r 000000000000 -r 4e91876724a2 photosgallery/slideshow/engine/coresrc/shwplaybackfactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/photosgallery/slideshow/engine/coresrc/shwplaybackfactory.cpp Thu Dec 17 08:45:44 2009 +0200 @@ -0,0 +1,364 @@ +/* +* Copyright (c) 2007-2008 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: The playback factory, configures the playback for the slideshow + * +*/ + + + +// CLASS HEADER +#include "shwplaybackfactory.h" + +// EXTERNAL INCLUDES +#include +#include +#include + +// INTERNAL INCLUDES +#include +#include + +#include "shwtimercontrol.h" +#include "shwviewcontrol.h" +#include "shweffectcontrol.h" +#include "shwdefaulteffectmanager.h" +#include "shwcrossfadeeffect.h" +#include "shwzoomandpaneffect.h" +#include "shwmusiccontrol.h" +#include "shwmusicobserver.h" +#include "shwsettingsmodel.h" +#include "shweffectinfo.h" +#include "shwcleanupwrapper.h" + +using namespace NShwSlideshow; + +// ----------------------------------------------------------------------------- +// Local definitions +// ----------------------------------------------------------------------------- +// +namespace + { + // granularity for observer array, typical count + const TInt KObserverCount = 8; + // granularity for publisher array, typical count + const TInt KPublisherCount = 8; + } + +// ----------------------------------------------------------------------------- +// The implementation class +// ----------------------------------------------------------------------------- +// +NONSHARABLE_CLASS( CShwPlaybackFactory::CShwPlaybackFactoryImpl ) + : public CBase + { + public: + + /** + * Constructors. + */ + CShwPlaybackFactoryImpl(MShwMusicObserver& aMusicObserver); + + /** + * Destructors. + */ + ~CShwPlaybackFactoryImpl(); + + /** + * 2nd stage constructor. + * @param aHuiEnv the HUI environment + * @param aVisualList the visual list of the show + * @param aMediaList the media list of the show + * @param aMusicObserver the music control observer + * @param aScreenSize the screen size to use + */ + void ConstructL( + CAlfEnv* aAlfEnv, + MGlxVisualList* aVisualList, + MGlxMediaList* aMediaList, + TSize aScreenSize ); + + public: + + /// @ref CShwPlaybackFactory::EventObservers + RPointerArray< MShwEventObserver > EventObservers(); + /// @ref CShwPlaybackFactory::EventPublishers + RPointerArray< MShwEventPublisher > EventPublishers(); + /// @ref CShwSlideshowEngine::AvailableEffectsL + // @returns ownership of array of effects + static void CreateEffectsL( RPointerArray& aEffects ); + + private: + + /// Own: Effect manager + CShwDefaultEffectManager* iEffectManager; + /// Own: Timer control + CShwTimerControl* iTimerControl; + /// Own: Music control + CShwMusicControl* iMusicControl; + /// Own: Effect control + CShwEffectControl* iEffectControl; + /// Own: View control + CShwViewControl* iViewControl; + /// Own: the observers + RPointerArray< MShwEventObserver > iObservers; + /// Own: the publishers + RPointerArray< MShwEventPublisher > iPublishers; + + /// Ref: the visual list + MGlxVisualList* iVisualList; + /// Ref: the music control observer + MShwMusicObserver& iMusicObserver; + + }; + +// ----------------------------------------------------------------------------- +// C++ Constructor. Save a few bits of rom with inlining +// ----------------------------------------------------------------------------- +inline CShwPlaybackFactory::CShwPlaybackFactory() + { + // No implementation needed + } + +// ----------------------------------------------------------------------------- +// NewL. Static construction +// ----------------------------------------------------------------------------- +CShwPlaybackFactory* CShwPlaybackFactory::NewL( + CAlfEnv* aAlfEnv, + MGlxVisualList* aVisualList, + MGlxMediaList* aMediaList, + MShwMusicObserver& aMusicObserver, + TSize aScreenSize ) + { + TRACER("CShwPlaybackFactory::NewL"); + GLX_LOG_INFO( "CShwPlaybackFactory::NewL" ); + + CShwPlaybackFactory* self = new( ELeave ) CShwPlaybackFactory( ); + CleanupStack::PushL( self ); + + // create the implementation, forward the parameters + self->iImpl = new( ELeave ) CShwPlaybackFactoryImpl (aMusicObserver); + self->iImpl->ConstructL( aAlfEnv, aVisualList, aMediaList, aScreenSize ); + + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor. +// ----------------------------------------------------------------------------- +CShwPlaybackFactory::~CShwPlaybackFactory() + { + TRACER("CShwPlaybackFactory::~CShwPlaybackFactory"); + GLX_LOG_INFO("CShwPlaybackFactory::~CShwPlaybackFactory"); + delete iImpl; + } + +// ----------------------------------------------------------------------------- +// EventObservers. +// ----------------------------------------------------------------------------- +RPointerArray< MShwEventObserver > CShwPlaybackFactory::EventObservers() + { + TRACER("CShwPlaybackFactory::EventObservers"); + GLX_LOG_INFO("CShwPlaybackFactory::EventObservers"); + return iImpl->EventObservers(); + } + +// ----------------------------------------------------------------------------- +// EventPublishers. +// ----------------------------------------------------------------------------- +RPointerArray< MShwEventPublisher > CShwPlaybackFactory::EventPublishers() + { + TRACER("CShwPlaybackFactory::EventPublishers"); + GLX_LOG_INFO("CShwPlaybackFactory::EventPublishers"); + return iImpl->EventPublishers(); + } + +//------------------------------------------------------------------------------ +// AvailableEffectsL +//------------------------------------------------------------------------------ +void CShwPlaybackFactory::AvailableEffectsL( RArray& + aEffectInfos ) + { + TRACER("CShwPlaybackFactory::AvailableEffectsL"); + GLX_LOG_INFO("CShwPlaybackFactory::AvailableEffectsL"); + aEffectInfos.Reset(); + RPointerArray effects; + // put the array in cleanupstack in case effect construction leaves + ShwCleanupResetAndDestroyPushL( effects ); + CShwPlaybackFactoryImpl::CreateEffectsL( effects ); + TInt i = effects.Count(); + while (i-- > 0) + { + // get the effect info and append it to the given array + aEffectInfos.AppendL( effects[i]->EffectInfo() ); + } + // ownership transferred, remove array from stack + CleanupStack::PopAndDestroy( &effects ); + } + +//------------------------------------------------------------------------------ +// CShwPlaybackFactoryImpl +//------------------------------------------------------------------------------ + +// ----------------------------------------------------------------------------- +// C++ Constructor. Save a few bits of rom with inlining +// ----------------------------------------------------------------------------- +inline CShwPlaybackFactory::CShwPlaybackFactoryImpl::CShwPlaybackFactoryImpl( + MShwMusicObserver& aMusicObserver) + : iObservers( KObserverCount ), + iPublishers( KPublisherCount ), + iMusicObserver (aMusicObserver) + { + TRACER("CShwPlaybackFactory::CShwPlaybackFactoryImpl::CShwPlaybackFactoryImpl"); + GLX_LOG_INFO("CShwPlaybackFactory::CShwPlaybackFactoryImpl::CShwPlaybackFactoryImpl"); + } + +// ----------------------------------------------------------------------------- +// Destructor. Save a few bits of rom with inlining +// ----------------------------------------------------------------------------- +inline CShwPlaybackFactory::CShwPlaybackFactoryImpl::~CShwPlaybackFactoryImpl() + { + TRACER("CShwPlaybackFactory::CShwPlaybackFactoryImpl::~CShwPlaybackFactoryImpl"); + GLX_LOG_INFO("CShwPlaybackFactory::CShwPlaybackFactoryImpl::~CShwPlaybackFactoryImpl"); + + delete iEffectManager; + delete iTimerControl; + delete iMusicControl; + delete iEffectControl; + delete iViewControl; + + iObservers.Close(); + iPublishers.Close(); + } + +//------------------------------------------------------------------------------ +// CShwPlaybackFactoryImpl::ConstructL +//------------------------------------------------------------------------------ +void CShwPlaybackFactory::CShwPlaybackFactoryImpl::ConstructL( + CAlfEnv* aAlfEnv, + MGlxVisualList* aVisualList, + MGlxMediaList* aMediaList, + TSize aScreenSize ) + { + TRACER("CShwPlaybackFactory::CShwPlaybackFactoryImpl::ConstructL"); + GLX_LOG_INFO( "CShwPlaybackFactoryImpl::ConstructL" ); + + // create the effect manager + iEffectManager = CShwDefaultEffectManager::NewL(); + + // create array for effects + RPointerArray< MShwEffect > effects; + // put the array in cleanupstack in case CreateEffectsL leaves + ShwCleanupResetAndDestroyPushL( effects ); + // create the effects + CShwPlaybackFactoryImpl::CreateEffectsL( effects ); + // need to go from last to first as we remove items + TInt i = effects.Count(); + while (i-- > 0) + { + effects[ i ]->InitializeL( + aAlfEnv, aVisualList, aMediaList, + aScreenSize ); + + // give the effect to the manager, it takes ownership + iEffectManager->AddEffectL( effects[ i ] ); + // remove the effect from original array to prevent + // double delete, effect manager takes care of the effect from now on + effects.Remove( i ); + } + // ownership transferred, remove array from stack + CleanupStack::Pop( &effects ); + // need to also close the array in this case, this frees the array memory + effects.Close(); + + // create the model to retrieve the persisted slideshow settings. + CShwSettingsModel* shwSettingsMdl = CShwSettingsModel::NewL(); + CleanupStack::PushL( shwSettingsMdl ); + + // retrieve and set the persisted effect settings + TShwEffectInfo effect; + shwSettingsMdl->TransitionTypeL( + effect.iId.iPluginUid, effect.iId.iIndex ); + iEffectManager->SetDefaultEffectL( effect ); + + // create the timer + iTimerControl = CShwTimerControl::NewL(); + iObservers.AppendL( iTimerControl ); + iPublishers.AppendL( iTimerControl ); + + // create effect control + iEffectControl = + CShwEffectControl::NewL( + *iEffectManager, *aVisualList, *aMediaList, aScreenSize ); + iObservers.AppendL( iEffectControl ); + iPublishers.AppendL( iEffectControl ); + + // create view manager, view duration is stored in seconds so need to + // multiply with 1000 + TInt viewDuration = shwSettingsMdl->TransDelayL() * 1000; + iViewControl = + CShwViewControl::NewL( + *aMediaList, KDefaultTransitionDuration, viewDuration ); + iObservers.AppendL( iViewControl ); + iPublishers.AppendL( iViewControl ); + + // create music control last as it is the least important + if (shwSettingsMdl->MusicOnL() ) + { + // retrieve the name of the music file + TFileName fileName; + shwSettingsMdl->MusicNamePathL( fileName ); + // instantiate and initialise the music player + iMusicControl = CShwMusicControl::NewL(iMusicObserver, fileName ); + iObservers.AppendL( iMusicControl ); + iPublishers.AppendL( iMusicControl ); + } + + CleanupStack::PopAndDestroy( shwSettingsMdl ); + GLX_LOG_INFO( "CShwPlaybackFactoryImpl::ConstructL ended" ); + } + +//------------------------------------------------------------------------------ +// CShwPlaybackFactoryImpl::EventObservers +//------------------------------------------------------------------------------ +RPointerArray + CShwPlaybackFactory::CShwPlaybackFactoryImpl::EventObservers() + { + return iObservers; + } + +//------------------------------------------------------------------------------ +// CShwPlaybackFactoryImpl::EventPublishers +//------------------------------------------------------------------------------ +RPointerArray + CShwPlaybackFactory::CShwPlaybackFactoryImpl::EventPublishers() + { + TRACER("CShwPlaybackFactory::CShwPlaybackFactoryImpl::EventPublishers"); + GLX_LOG_INFO( "CShwPlaybackFactoryImpl::EventPublishers" ); + return iPublishers; + } + +//------------------------------------------------------------------------------ +// CShwPlaybackFactoryImpl::CreateEffectsL +//------------------------------------------------------------------------------ +void CShwPlaybackFactory::CShwPlaybackFactoryImpl::CreateEffectsL( + RPointerArray& aEffects ) + { + TRACER("CShwPlaybackFactory::CShwPlaybackFactoryImpl::CreateEffectsL"); + GLX_LOG_INFO( "CShwPlaybackFactoryImpl::CreateEffectsL" ); + aEffects.AppendL( CShwZoomAndPanEffect::NewLC() ); + CleanupStack::Pop(); + aEffects.AppendL( CShwCrossFadeEffect::NewLC() ); + CleanupStack::Pop(); + }