williamr@2: // Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: #ifndef __MMFDATAPATHPROXY_H__ williamr@2: #define __MMFDATAPATHPROXY_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #define KMMFDataPathProxyVersion TVersion(8,0,0) williamr@2: williamr@2: /** williamr@2: The amount of time that is allowed for the datapath to close down before the its thread is killed. williamr@2: */ williamr@2: #define KMMFDataPathProxyShutdownTimeout TTimeIntervalMicroSeconds32(10000000) williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Mixin class that the user of the class CMMFDataPathEventMonitor must derive from. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class MMMFDataPathEventMonitorObserver williamr@2: { williamr@2: public: williamr@2: williamr@2: /** williamr@2: Handles an event that has been generated by the datapath. williamr@2: williamr@2: Called by CMMFDataPathEventMonitor::RunL(). williamr@2: williamr@2: @param aEvent williamr@2: The event to be handled. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: virtual void HandleEvent(const TMMFEvent& aEvent) = 0; williamr@2: }; williamr@2: williamr@2: class RMMFDataPathProxy; //forward reference williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Active object utility class that can be used to monitor a datapath that is running in its own williamr@2: thread for events. If an event occurs, the client will be notified via the williamr@2: MMMFDataPathEventMonitorObserver interface. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: class CMMFDataPathEventMonitor : public CActive williamr@2: { williamr@2: public: williamr@2: williamr@2: IMPORT_C static CMMFDataPathEventMonitor* NewL(MMMFDataPathEventMonitorObserver& aObserver, williamr@2: RMMFDataPathProxy& aMMFDataPathProxy); williamr@2: williamr@2: IMPORT_C ~CMMFDataPathEventMonitor(); williamr@2: williamr@2: IMPORT_C void Start(); williamr@2: williamr@2: IMPORT_C void RunL(); williamr@2: protected: williamr@2: williamr@2: void DoCancel(); williamr@2: private: williamr@2: williamr@2: /** williamr@2: Constructs a datapath event monitor object. williamr@2: williamr@2: @param aObserver williamr@2: A reference to the observer of the active object. The observer will be williamr@2: notified when an event occurs. williamr@2: @param aMMFDataPathProxy williamr@2: A reference to the datapath proxy class. williamr@2: williamr@2: @since 7.0s williamr@2: */ williamr@2: CMMFDataPathEventMonitor(MMMFDataPathEventMonitorObserver& aObserver, williamr@2: RMMFDataPathProxy& aMMFDataPathProxy); williamr@2: private: williamr@2: MMMFDataPathEventMonitorObserver& iObserver; williamr@2: RMMFDataPathProxy& iMMFDataPathProxy; williamr@2: TMMFEventPckg iEventPckg; williamr@2: }; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Proxy class used to create a datapath in a new subthread. williamr@2: */ williamr@2: class RMMFDataPathProxy : public RMMFSubThreadBase williamr@2: williamr@2: { williamr@2: public: williamr@2: williamr@2: /** williamr@2: Constuctor. williamr@2: */ williamr@2: RMMFDataPathProxy() : RMMFSubThreadBase(KMMFDataPathProxyShutdownTimeout) {}; williamr@2: williamr@2: IMPORT_C TInt CreateSubThread(); williamr@2: williamr@2: IMPORT_C TInt LoadDataPath(); williamr@2: williamr@2: IMPORT_C TInt LoadDataPath(TMediaId aMediaId); williamr@2: williamr@2: IMPORT_C TInt LoadDataPath(TUid aCodecUid); williamr@2: williamr@2: IMPORT_C TInt LoadDataPath(TUid aCodecUid, TMediaId aMediaId); williamr@2: williamr@2: IMPORT_C TInt AddDataSource(MDataSource* aSource); williamr@2: williamr@2: IMPORT_C TInt AddDataSink(MDataSink* aSink); williamr@2: williamr@2: IMPORT_C TInt Prime(); williamr@2: williamr@2: IMPORT_C TInt Play(); williamr@2: williamr@2: IMPORT_C TInt Pause(); williamr@2: williamr@2: IMPORT_C TInt Stop(); williamr@2: williamr@2: IMPORT_C TInt GetPosition(TTimeIntervalMicroSeconds& aPosition) const; williamr@2: williamr@2: IMPORT_C TInt SetPosition(const TTimeIntervalMicroSeconds& aPosition); williamr@2: williamr@2: IMPORT_C TInt SetPlayWindow( const TTimeIntervalMicroSeconds& aStart, const TTimeIntervalMicroSeconds& aEnd ) ; williamr@2: williamr@2: IMPORT_C TInt ClearPlayWindow() ; williamr@2: williamr@2: IMPORT_C TInt State( TInt& aState ) ; williamr@2: williamr@2: IMPORT_C void Close(); williamr@2: }; williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: williamr@2: The server running in the datapath subthread. williamr@2: The subthread is owned by the main thread and shares the same heap. williamr@2: */ williamr@2: class CMMFDataPathProxyServer : public CMMFSubThreadServer williamr@2: { williamr@2: public: williamr@2: static CMMFDataPathProxyServer* NewL(); williamr@2: ~CMMFDataPathProxyServer(); williamr@2: static TInt StartThread(TAny* aAny); williamr@2: static void DoStartThreadL(); williamr@2: private: williamr@2: CMmfIpcSession* NewSessionL(const TVersion& aVersion) const; williamr@2: CMMFDataPathProxyServer(); williamr@2: void ConstructL(); williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: @internalComponent williamr@2: williamr@2: The session used to transmit messages between the main thread and the subthread. williamr@2: Only one session can be created with a datapath subthread. williamr@2: Once this session is closed, the subthread will be killed. williamr@2: */ williamr@2: class CMMFDataPathProxySession : public CMMFSubThreadSession williamr@2: { williamr@2: public: williamr@2: static CMMFDataPathProxySession* NewL(); williamr@2: ~CMMFDataPathProxySession(); williamr@2: void ServiceL(const RMmfIpcMessage& aMessage); williamr@2: private: williamr@2: CMMFDataPathProxySession(); williamr@2: TBool LoadDataPathByL(const RMmfIpcMessage& aMessage); williamr@2: TBool LoadDataPathByMediaIdL(const RMmfIpcMessage& aMessage); williamr@2: TBool LoadDataPathByCodecUidL(const RMmfIpcMessage& aMessage); williamr@2: TBool LoadDataPathByMediaIdCodecUidL(const RMmfIpcMessage& aMessage); williamr@2: TBool AddDataSourceL(const RMmfIpcMessage& aMessage); williamr@2: TBool AddDataSinkL(const RMmfIpcMessage& aMessage); williamr@2: TBool PrimeL(const RMmfIpcMessage& aMessage); williamr@2: TBool PlayL(const RMmfIpcMessage& aMessage); williamr@2: TBool PauseL(const RMmfIpcMessage& aMessage); williamr@2: TBool StopL(const RMmfIpcMessage& aMessage); williamr@2: TBool GetPositionL(const RMmfIpcMessage& aMessage) const; williamr@2: TBool SetPositionL(const RMmfIpcMessage& aMessage); williamr@2: TBool SetPlayWindowL(const RMmfIpcMessage& aMessage) ; williamr@2: TBool ClearPlayWindowL(const RMmfIpcMessage& aMessage) ; williamr@2: TBool StateL(const RMmfIpcMessage& aMessage) ; williamr@2: williamr@2: void CheckDataPathExistsL() const {if (!iDataPath) User::Leave(KErrNotReady);}; williamr@2: private: williamr@2: CMMFDataPath* iDataPath; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: #endif