--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mpx/playbackframework/playbackengine/inc/mpxplaybackinitializer.h Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,284 @@
+/*
+* Copyright (c) 2006 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: Initialize a file before playback
+*
+*/
+
+
+#ifndef CMPXPLAYBACKINITIALIZER_H
+#define CMPXPLAYBACKINITIALIZER_H
+
+#include <mpxplaybackframeworkdefs.h>
+#include <mpxplaybackpluginobserver.h>
+#include <mpxpluginhandlerobserver.h>
+#include <mpxcollectionobserver.h>
+
+class CMPXPlaybackPluginHandler;
+class CMPXCollectionPlaylist;
+class CMPXPlaybackEngine;
+class CMPXPlaybackPluginHandler;
+class CMPXPlaybackPlugin;
+class CMPXPlaybackMediaHelper;
+
+/**
+* Initializes playlist to be played. This class is a friend
+* of CMPXPlaybackEngine
+*
+* The use of this class is intended to be as follows by the
+* playback engine:
+* 1) The Engine creates initializer class and initializes it with a
+* CMPXCollectionPlaylist.
+* 2) This initializer will then request the media.
+* 3) The Engine then calls SetActive(), which means the Engine is now
+* active, so that means the resultant media request will be forwarded
+* directly to the Engine.
+* 4) The Engine can then call Next() anytime afterwards. This will
+* make the initializer call request media on the next item in the playlist.
+* 5) Once the media returns to the initializer, it will create a playback
+* plugin and initialize the file
+* 6) Once initialized, the plugin stays in the initialized state. If the
+* Engine then calls SetActive() again, the plugin and all data will
+* be swapped, and then the Engine can start playing immediately.
+*
+* At anytime during the process (e.g. during request media, during
+* initialization, etc), the Engine can interrupt the process and call
+* SetActive(), which will swap any plugins or data appropriately, depending
+* on the current state.
+*
+*/
+class CMPXPlaybackInitializer : public CBase,
+ public MMPXPlaybackPluginObserver,
+ public MMPXPluginHandlerObserver
+ {
+public:
+ /**
+ * Two-phased constructor.
+ *
+ * @param aEngine reference to engine
+ * @param aMediaHelper Media helper object
+ * @return Constructed object
+ */
+ static CMPXPlaybackInitializer* NewL(
+ CMPXPlaybackEngine& aEngine,
+ CMPXPlaybackMediaHelper& aMediaHelper );
+
+ /**
+ * Destructor
+ */
+ ~CMPXPlaybackInitializer();
+
+ /**
+ * Start intializing first media in the playlist.
+ * Clears any current playlist being processed
+ */
+ void Init(CMPXCollectionPlaylist& aPlaylist);
+
+ /**
+ * Initializes next track in playlist. Discards current
+ * track being processed
+ */
+ TBool Next();
+
+ /**
+ * Set the playlist active in the engine. Subsequently,
+ * the next track or a new playlist can be initialized
+ */
+ void SetActiveL();
+
+ /**
+ * Close the initializer
+ */
+ void Close();
+
+ /**
+ * Return the TMPXItemId of the current file in the initializer
+ */
+ TMPXItemId CurrentInitItemId();
+
+ /**
+ * Implementation uid of the plugin of pre-initialzer
+ */
+ TUid PluginUid();
+
+private:
+ /**
+ * C++ constructor
+ *
+ * @param aEngine reference to engine
+ * @param aMediaHelper Media helper object
+ */
+ CMPXPlaybackInitializer(
+ CMPXPlaybackEngine& aEngine,
+ CMPXPlaybackMediaHelper& aMediaHelper );
+
+ /**
+ * 2nd phase contructor
+ */
+ void ConstructL();
+
+ /**
+ * Resets such that next media can be initialised
+ */
+ void Reset();
+
+ /**
+ * Get the Media from the collection - the callback triggers
+ * the initialization
+ */
+ void RequestMediaL();
+
+ /**
+ * Updates the forwarding variable
+ * to send the media to the engine if a media has been requested.
+ */
+ void UpdateMediaForwarding();
+
+ /**
+ * Swaps the plugin being handled in the initializer to the
+ * engine, which takes over in whatever state it currently is in.
+ */
+ void SwapPluginL();
+
+ /**
+ * Swaps the item uri in the engine
+ * Only in the EPbStateInitialising and EPbStateStopped states
+ */
+ void SwapUriL();
+
+ /**
+ * Swaps the item db flag in the engine
+ * Only in the EPbStateInitialising and EPbStateStopped states
+ */
+ void SwapFlag();
+
+ /**
+ * Is this playlist the one currently being processed?
+ * @param aPlaylist Playlist to check if it is already initialized
+ */
+ TBool IsInitializing(const CMPXCollectionPlaylist& aPlaylist);
+
+ /**
+ * Initializes a track
+ * @param aMedia CMPXMedia object to initialize
+ * @param aError Error returned from media request
+ */
+ void InitL(const CMPXMedia& aMedia,TInt aError);
+
+ /**
+ * Cancels the pre-init timer
+ */
+ void CancelPreInitTimer();
+
+ /**
+ * Handle pre-init timer callback
+ */
+ void HandlePreInitTimerCallback();
+
+ /**
+ * Callback for pre-init timer.
+ */
+ static TInt PreInitTimerCallback(TAny* aPtr);
+
+ /**
+ * Initialize streaming
+ */
+ void InitL(const TDesC& aUri, const TDesC8& aType, TInt aAccessPoint);
+
+private:
+ /**
+ * From MMPXPlaybackPluginObserver
+ * Handle plugin event
+ *
+ * @param aEvent the event type
+ * @param aData optional data
+ * @param aError error code of the event
+ */
+ void HandlePluginEvent(TEvent aEvent,TInt aData,TInt aError);
+
+ /**
+ * Leaving version of CMPXPlaybackInitializer::HandlePluginEvent
+ */
+ void HandlePluginEventL(TEvent aEvent,TInt aData,TInt aError);
+
+ /**
+ * From MMPXPlaybackPluginObserver
+ * Handle message from plug-in
+ *
+ * @param aMsg, message from the plug-in. Ownership not transferred.
+ * @param aErr system error code. if aErr is not KErrNone, aMsg will not be
+ * used/dereferenced at playback engine.
+ */
+ void HandlePlaybackMessage(CMPXMessage* aMsg, TInt aErr);
+
+ /**
+ * From MMPXPlaybackPluginObserver
+ * Async response for Value request
+ *
+ * @param aProperty property key
+ * @param aValue property value
+ * @param aError error code
+ */
+ void HandleProperty(TMPXPlaybackProperty aProperty,
+ TInt aValue,TInt aError);
+
+ /**
+ * From MMPXPlaybackPluginObserver
+ * Async response for subplayer request
+ *
+ * @param aPlayer UID of the subplayer
+ * @param aSubPlayers array of subplayers
+ * @param aComplete ETrue, completed, EFalse, not completed
+ * @param aError error code
+ */
+ void HandleSubPlayerNames(TUid aPlayer,const MDesCArray* aSubPlayers,
+ TBool aComplete,TInt aError);
+
+ /**
+ * From MMPXPlaybackPluginObserver
+ * Async response for ExtendedMediaProperties request
+ *
+ * @param aMedia property object
+ * @param aError error code
+ */
+ void HandleMedia(const CMPXMedia& aProperties,TInt aError);
+
+ ///////////////////////////////////////////////////////////////////////////
+ // From MMPXPluginHandlerObserver
+
+ /*
+ * @see MMPXPluginHandlerObserver
+ */
+ void HandlePluginHandlerEvent(TPluginHandlerEvents aEvent,
+ const TUid& aPluginUid, TBool aLoaded, TInt aData);
+
+private:
+ TMPXPlaybackState iState; // State of playlist
+ CMPXPlaybackPluginHandler* iHandler;
+ CMPXPlaybackEngine& iEngine;
+ CMPXPlaybackMediaHelper& iMediaHelper; // not owned
+
+ TInt iPathIndex;
+ TInt iInitPlaylistCount;
+ TBool iMediaToEngine;
+ TBool iMediaRequested;
+
+ TInt iDuration;
+ TInt iError;
+ CMPXMedia* iMedia;
+ CMPXMessage* iMediaMessage; // media update message from plugin
+ TInt iErrorOfMediaMessage; // error along with media update message
+ CPeriodic* iTimer;
+ };
+
+#endif // CMPXPLAYBACKINITIALIZER_H