1 // Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
14 // include\mmf\Server\mmfdatasource.h
18 #ifndef __MMF_SERVER_DATASOURCE_H__
19 #define __MMF_SERVER_DATASOURCE_H__
22 #include <mmf/server/mmfdatasourcesink.hrh>
23 #include <mmf/common/mmfutilities.h>
24 #include <ecom/ecom.h>
25 #include <mmf/common/mmfbase.h>
26 #include <mmf/common/mmfcontrollerframework.h>
34 class MAsyncEventHandler;
40 Abstract class representing a data source.
45 static inline MDataSource* NewSourceL( TUid aImplementationUid, const TDesC8& aInitData ) ;
50 virtual ~MDataSource() {REComSession::DestroyedImplementation(iDtor_ID_Key);};
53 Returns the UID identifying the type of data source.
55 @return The UID identifying the type of data source.
57 virtual TUid DataSourceType() const {return iDataSourceType;};
60 Returns the data type as a fourCC code of the data source.
62 This is a pure virtual function that each derrived class must implement.
65 This identifies the type of media eg. audio or video and the stream ID.
66 This parameter is required in cases where the source can supply data
67 of more than one media type and/or multiple streams of data.
69 @return The fourCC code identifying the source datatype for the specified aMediaId.
71 virtual TFourCC SourceDataTypeCode(TMediaId aMediaId) = 0;
73 inline virtual TInt SetSourceDataTypeCode(TFourCC aSourceFourCC, TMediaId aMediaId);
76 Function called by a MDataSink to request the data source to fill aBuffer with data.
78 This is a pure virtual function that each derived class must implement.
79 This method is used when a data source is passively waiting for requests from a consumer ie. a data sink
80 to fill a buffer. The data source must call the BufferFilledL member on aConsumer when it has filled
81 the buffer with data. The data source can either make this callback synchronously or asynchronously.
83 The format should read the frame number of the buffer via the buffer's CMMFBuffer::FrameNumber()
84 function. From this, the format should be able to determine the actual position of the data on
85 the data source. The technique here depends on the nature of the format. For a linear audio
86 format, the position can be obtained by a simple calculation of the frame size, the header size
87 and where appropriate the datatype.
89 For non-linear formats, either an index table of frame number and location will need to be
90 created in the NewL() or some form of approximating algorithm will be required. Some formats
91 have an index table as part of the format eg. AVI. If no random access is required then no index
92 table is required, the format can keep track of the current read position and increment it on
93 each access, and reset it if the frame number is reset to 0 or 1. Given that for non-linear
94 ie. variable bit rate formats, the size of the data read may vary from frame to frame, then the
95 format should either set the request size of the buffer for the required frame or call the
96 source's ReadBufferL() (either CMMFClip::ReadBufferL(), CMMFDescriptor ::ReadBufferL() or
97 CMMFFile::ReadBufferL()) function that takes the aLength parameter.
99 It is the responsibility of the format decode to determine the size and position of the source
100 data for each frame. For linear audio formats, the format decode should fill the buffer up to
101 its maximum length. For multimedia formats e.g. mp4, AVI etc, the format decode is effectively
102 acting as a demultiplexor, and must obtain the appropriate data from the source depending on
106 The buffer that needs filling with data.
108 The data sink that consumes the data. The data source needs this to make the BufferFilledL
109 callback on aConsumer when the data source has completed filling the aBuffer.
111 This identifies the type of media eg. audio or video and the stream ID.
112 This parameter is required in cases where the source can supply data
113 of more than one media type and/or multiple strams of data eg. a multimedia file.
115 virtual void FillBufferL(CMMFBuffer* aBuffer, MDataSink* aConsumer,TMediaId aMediaId)=0;
118 Function called by a data sink to pass back an emptied buffer to the source.
120 This is a pure virtual function that each derived class must implement.
121 This method is used as the callback when the data source actively requests a consumer ie. a data
122 sink to empty a buffer by calling the data sinks EmptyBufferL.
123 When the data source gets this callback it knows that the buffer has been emptied and can be
127 The buffer that has been emptied by a data sink and is now available for reuse.
129 virtual void BufferEmptiedL(CMMFBuffer* aBuffer)=0;
134 Function to indicate whether the data source can create a buffer.
136 This is a pure virtual function that each derived class must implement.
138 @return A boolean indicating if the data source can create a buffer. ETrue if it can otherwise
141 virtual TBool CanCreateSourceBuffer()=0;
146 Returns a buffer created by the data source
148 This is a pure virtual function that each derived class must implement.
151 This identifies the type of media eg. audio or video and the stream ID.
152 This parameter is required in cases where the source can supply data
153 of more than one media type and/or multiple strams of data eg a multimedia file.
155 This must be written to by the method to indicate whether the created buffer is
156 a 'reference' buffer. A 'reference' buffer is a buffer that is owned by the source
157 and should be used in preference to the sink buffer provided the sink buffer
158 is also not a reference buffer.
160 @return A pointer to the created buffer.
162 virtual CMMFBuffer* CreateSourceBufferL(TMediaId aMediaId, TBool &aReference) = 0;
164 inline virtual CMMFBuffer* CreateSourceBufferL(TMediaId aMediaId, CMMFBuffer& aSinkBuffer, TBool &aReference);
166 inline virtual TInt SourceThreadLogon(MAsyncEventHandler& aEventHandler);
169 Function to 'logoff' the data source from the same thread that source supplies data in.
171 This method may be required as the thread that the data source is deleted in may not be
172 the same thread that the data transfer took place in. Therefore any thread specific
173 releasing of resources needs to be performed in the SourceThreadLogoff rather than in the
176 This is a virtual function that a derrived data source can implement if any thread specific
177 releasing of resources is required.
179 virtual void SourceThreadLogoff() {};
181 inline virtual void NegotiateSourceL(MDataSink& aDataSink); //called if source setup depends on sink
184 Indicates whether the data source supports sample rate conversion.
186 This is a virtual function that a derived class can implement.
188 @return A boolean indicating if the data source can perform a sample rate conversion. ETrue if
189 it can otherwise EFalse.
191 virtual TBool SourceSampleConvert() {return EFalse;};
194 Function to 'prime' the data source.
196 This is a virtual function that a derrived data source can implement if
197 any data source specific 'priming' is required.
199 virtual void SourcePrimeL() {};
202 Function to 'play' the data source.
204 This is a virtual function that a derrived data source can implement if
205 any data source specific action is required prior to 'playing' ie. the start of data transfer.
207 virtual void SourcePlayL() {};
210 Function to 'pause' the data source.
212 This is a virtual function that a derrived data source can implement if
213 any data source specific action is required to 'pause'
215 virtual void SourcePauseL() {};
218 Function to 'stop' the data source.
220 This is a virtual function that a derrived data source can implement if
221 any data source specific action is required to 'stop'.
223 virtual void SourceStopL() {};
225 inline virtual void SetSourcePrioritySettings(const TMMFPrioritySettings& aPrioritySettings);
228 Function to call a source specific custom command.
230 This is a virtual function that a derrived data source can implement if
231 it implements any custom commands.
234 The message specifying the custom command.
236 virtual void SourceCustomCommand(TMMFMessage& aMessage) {aMessage.Complete(KErrNotSupported);};
240 Performs any source construction dependant on the source construction
241 initialisation data aInitData.
243 This is a pure virtual function that a derrived data source must implement
246 The source specific initialisation data required for source construction.
248 virtual void ConstructSourceL( const TDesC8& aInitData ) = 0 ;
251 Protected constructor.
253 MDataSource(TUid aType): iDataSourceType(aType) {}
255 TUid iDataSourceType;
261 Instantiates a data source.
263 @param aImplementationUid
264 The UID identifying the data source to be instantiated.
266 The source specific initialisation data required for source construction.
268 @return The instantiated data source.
270 inline MDataSource* MDataSource::NewSourceL( TUid aImplementationUid, const TDesC8& aInitData )
272 MDataSource* retPtr = REINTERPRET_CAST( MDataSource*, REComSession::CreateImplementationL( aImplementationUid,
273 _FOFF(MDataSource, iDtor_ID_Key) ) ) ;
274 CleanupDeletePushL(retPtr);
275 retPtr->ConstructSourceL( aInitData ) ;
277 CleanupStack::Pop(retPtr);
282 Sets the data type as a fourCC code for the data source.
284 This is a virtual function that each derived class can implement if the data source supports
285 the ability to have its data type set.
288 This specifies the data type as a fourCC code to set the source to.
290 This identifies the type of media eg. audio or video and the stream ID.
291 This parameter is required in cases where the source can supply data
292 of more than one media type and/or multiple strams of data eg a multimedia file.
294 @return KErrNone if successful, KErrNotSupported if the source does not support having
295 it's data type set, otherwise a system wide error code.
297 inline TInt MDataSource::SetSourceDataTypeCode(TFourCC /*aSourceFourCC*/, TMediaId /*aMediaId*/)
299 return KErrNotSupported;
305 Returns a buffer created by the data source.
307 This is a virtual function that a derived class can implement.
308 This can be used in preference to the above CreateSourceBufferL method in cases where
309 the source buffer creation has a dependancy on the sink buffer.
312 This identifies the type of media eg. audio or video and the stream ID.
313 This parameter is required in cases where the source can supply data
314 of more than one media type and/or multiple strams of data eg a multimedia file
316 The sink buffer the nature of which may influence the creation of the source buffer.
318 This must be written to by the method to indicate whether the created buffer is
319 a 'reference' buffer. A 'reference' buffer is a buffer that is owned by the source
320 and should be used in preference to the sink buffer provided the sink buffer is not a
323 @return A pointer to the created buffer.
325 inline CMMFBuffer* MDataSource::CreateSourceBufferL(TMediaId aMediaId, CMMFBuffer& /*aSinkBuffer*/, TBool &aReference)
327 return CreateSourceBufferL(aMediaId, aReference);
331 Function to 'logon' the data source to the same thread that source will be supplying data in.
333 This method may be required as the thread that the data source was created in is not always
334 the same thread that the data transfer will take place in. Therefore any thread specific
335 initialisation needs to be performed in the SourceThreadLogon rather than in the creation
338 This is a virtual function that a derrived data source can implement if any thread specific
339 initialisation is required and/or the data source can create any asynchronous events.
342 This is an MAsyncEventHandler to handle asynchronous events that occur during the
343 transfer of multimedia data. The event handler must be in the same thread as the data transfer
344 thread. Hence the reason it is passed in the SourceThreadLogon as opposed to say the constructor.
346 @return An error code indicating if the function call was successful. KErrNone on success, otherwise
347 another of the system-wide error codes.
349 inline TInt MDataSource::SourceThreadLogon(MAsyncEventHandler& /*aEventHandler*/)
355 Function to allow the data source to negotiate with a data sink
357 This method is required in cases where the settings of data source are dependant on those of a
358 data sink. This is a virtual function that a derrived data source can implement.
361 The data sink whose settings can affect the data source.
363 inline void MDataSource::NegotiateSourceL(MDataSink& /*aDataSink*/)
368 Function to set the source priority settings.
370 This is a virtual function that a derrived data source can implement if
371 a priority mechanism is required to arbitrate between multiple clients
372 trying to access the same resource.
374 @param aPrioritySettings
375 The source priority settings.
378 inline void MDataSource::SetSourcePrioritySettings(const TMMFPrioritySettings& /*aPrioritySettings*/)
383 This function is used by TCleanupItem objects to perform
384 a SourceStopL() when leaving functions exist, ususally between SourcePrimeL-SourceStopL pairs.
387 The data source to be stopped.
389 inline static void DoDataSourceStop(TAny* aSource)
391 MDataSource* source = STATIC_CAST(MDataSource*, aSource);
392 // we don't want this function to leave because no leaving functions are supposed
393 // to be used as argument to the TCleanupItem objects. Hence we catch the error but
394 // we do nothing with it.
395 TRAP_IGNORE(source->SourceStopL());
399 This method is used by TCleanupItem objects to perform a SourceThreadLogoff().
402 The data source to be logged off.
404 inline static void DoDataSourceThreadLogoff(TAny* aSource)
406 MDataSource* source = STATIC_CAST(MDataSource*, aSource);
407 source->SourceThreadLogoff();