class CMMFDataPath : public CActive |
Abstract utility class that moves data from a single data source to a single data sink, via a codec if required.
All functions are exported form the DLL and are virtual to allow plugins to define their own data paths.
Protected Member Functions | |
---|---|
CMMFDataPath(TMediaId, MAsyncEventHandler &) | |
TInt | AudioSamplesPlayed() |
TInt | AudioSamplesRecorded() |
TTimeIntervalMicroSeconds | CalculateAudioInputPosition() |
TTimeIntervalMicroSeconds | CalculateAudioOutputPosition() |
IMPORT_C void | ConstructL(TUid) |
IMPORT_C void | ConstructSinkL(const TDesC8 &) |
IMPORT_C void | ConstructSourceL(const TDesC8 &) |
TInt | DetermineBuffersToUseL(void) |
IMPORT_C void | EndOfData() |
TTimeIntervalMicroSeconds | InputPosition() |
TTimeIntervalMicroSeconds | OutputPosition() |
Private Member Functions | |
---|---|
void | ChangeDataPathTransferState(TTransferState) |
void | CreateDataPathL(MDataSource *, MDataSink *) |
void | DoCleanupBuffers() |
void | DoEndOfDataL() |
void | DoPauseL() |
void | DoStopL() |
TTimeIntervalMicroSeconds | Duration() |
void | EmptySinkBufferL() |
void | FillSinkBufferL() |
void | FillSourceBufferL() |
void | InitializeSinkL() |
void | InitializeSourceL() |
void | ObtainSyncBuffersL() |
void | ResetRefBuffers() |
IMPORT_C TInt | SendEventToClient(const TMMFEvent &) |
void | SetBuffersAvailable() |
Public Member Enumerations | |
---|---|
enum | TDataPathState { EStopped, EPrimed, EPlaying, ERecording, EConverting } |
Protected Member Enumerations | |
---|---|
enum | TNeedBuffer { ENoBuffers = 0x0, ENeedSinkBuffer = 0x01, ENeedSourceBuffer = 0x10 } |
enum | TTransferState { EWaitSink, EWaitSource, EInitializeSink, EInitializeSource, ENeedSourceData, ENeedSinkData, ENeedToMatchSourceToSink, ESendDataToSink, EEndOfData } |
Inherited Enumerations | |
---|---|
CActive:TPriority |
Inherited Attributes | |
---|---|
CActive::iStatus |
CMMFDataPath | ( | TMediaId | aMediaId, |
MAsyncEventHandler & | aEventHandler | ||
) | [protected, inline] |
TMediaId aMediaId | |
MAsyncEventHandler & aEventHandler |
IMPORT_C void | AddDataSinkL | ( | MDataSink * | aSink | ) | [virtual] |
Adds a data sink to the datapath and, if the source already exists, tries to establish a connection between the source and sink.
MDataSink * aSink | The data sink to add to the data path. |
IMPORT_C void | AddDataSourceL | ( | MDataSource * | aSource | ) | [virtual] |
Adds a data source to the datapath and, if the sink already exists, tries to establish a connection between the source and sink.
MDataSource * aSource | The data source to add to the data path. |
IMPORT_C void | BufferEmptiedL | ( | CMMFBuffer * | aBuffer | ) | [virtual] |
Indicates the data sink has emptied the buffer.
Called by the CMMFDataPath's MDataSink when it has emptied the buffer
CMMFBuffer * aBuffer | The emptied buffer. |
IMPORT_C void | BufferFilledL | ( | CMMFBuffer * | aBuffer | ) | [virtual] |
Indicates the data source has filled the specified buffer.
Called by the CMMFDataPath's MDataSource when it has filled the buffer.
CMMFBuffer * aBuffer | A pointer to the filled buffer. |
TTimeIntervalMicroSeconds | CalculateAudioInputPosition | ( | ) | const [protected] |
TTimeIntervalMicroSeconds | CalculateAudioOutputPosition | ( | ) | const [protected] |
IMPORT_C TBool | CanCreateSinkBuffer | ( | ) | [virtual] |
Tests whether the data path can create a sink buffer.
The default implementation returns false.
IMPORT_C TBool | CanCreateSourceBuffer | ( | ) | [virtual] |
Tests whether the data path can create a source buffer.
Would expect datapath to always return NULL, so this is a default implementation of a pure virtual from MDataSink.
The default implementation returns EFalse.
void | ChangeDataPathTransferState | ( | TTransferState | aNewDataPathTransferState | ) | [private] |
Uses the AO mechanism to drive state changes between sources and sinks.
RunL() moves and assigns buffers between its attached MDataSource/MDataSinks.
TTransferState aNewDataPathTransferState |
IMPORT_C void | ClearPlayWindowL | ( | ) | [virtual] |
Sets the play window to the full length of clip.
IMPORT_C void | ConstructL | ( | TUid | aCodecUid = KNullUid | ) | [protected] |
Takes UID of codec on construction, and if not an NULL codec sets the datapath up for codec instantiation.
TUid aCodecUid = KNullUid | The UID of the codec. |
IMPORT_C void | ConstructSinkL | ( | const TDesC8 & | aInitData | ) | [protected, virtual] |
Constructs a sink.
Overridable constuction specific to this datasource.
The default implementation leaves with KErrNotSupported.
const TDesC8 & aInitData | The initialisation data. |
IMPORT_C void | ConstructSourceL | ( | const TDesC8 & | aInitData | ) | [protected, virtual] |
Constructs a source.
The default implementation leaves with KErrNotSupported.
const TDesC8 & aInitData | The initialisation data. |
void | CreateDataPathL | ( | MDataSource * | aSource, |
MDataSink * | aSink | |||
) | [private] |
MDataSource * aSource | |
MDataSink * aSink |
IMPORT_C CMMFBuffer * | CreateSinkBufferL | ( | TMediaId | aMediaId | ) | [virtual] |
TMediaId aMediaId | An optional mediaID parameter when there are multiple buffers arriving of different media types. |
IMPORT_C CMMFBuffer * | CreateSinkBufferL | ( | TMediaId | aMediaId, |
TBool & | aReference | |||
) | [virtual] |
Creates a sink buffer according to the specifed media ID and reference.
Intended for asynchronous usage (buffers supplied by Devsound device). This method is essentially a dummy implementation of an MDataSink pure virtual.
The default implementation returns NULL.
IMPORT_C CMMFBuffer * | CreateSourceBufferL | ( | TMediaId | aMediaId | ) | [virtual] |
Creates a source buffer.
Intended for synchronous usage (buffers supplied by datapath for a MDataSource) This method is essentially a dummy implementation of an MDataSource pure virtual.
The default implementation leaves with KErrNotSupported and returns NULL.
TMediaId aMediaId | An optional mediaID parameter when there are multiple buffers arriving of different media types. |
IMPORT_C CMMFBuffer * | CreateSourceBufferL | ( | TMediaId | aMediaId, |
TBool & | aReference | |||
) | [virtual] |
Creates a source buffer according to the specifed media ID and reference.
Intended for asynchronous usage (buffers supplied by datapath for a MDataSource) This method is essentially a dummy implementation of an MDataSource pure virtual.
The default implementation leaves with KErrNotSupported and returns NULL.
void | DoCleanupBuffers | ( | ) | [private] |
Delete source and/or sink buffers that are owned by DataPath.
Ownership indicated by iSrcBufRef and iSnkBufRef.
Ownership is assigned during buffer allocation within the datapath PrimeL().
void | DoEndOfDataL | ( | ) | [private] |
This is a virtual function datapath (or derivations off) that can be implemented or may be left blank for default behaviour.
Additional Pause method specific to this datapath.
void | DoPauseL | ( | ) | [private] |
This is a virtual function datapath (or derivations off) that can be implemented but may be left blank for default behaviour.
Additional Pause method specific to this datapath.
The DataPath implements pause by recording the current position and stopping the source and sink. When Play is called the DataPath uses the stored position as the starting point and resumes playing. The reason for this (rather than using the PauseL() API on sources and sinks) is that some implementations do not support a suitable pause, therefore the DataPath is implemented to support the lowest common denominator.
Note: A suitable pause implementation will retain any buffers in use. There will be no need to call PrimeL() prior to PlayL().
IMPORT_C TInt | DoSendEventToClient | ( | TUid | aEventType, |
TInt | aErrorCode | |||
) |
Passes error handling and general messages up to clients.
void | DoStopL | ( | ) | [private] |
This is a virtual function datapath (or derivations off) that can be implemented but may be left blank for default behaviour.
Additional Stop() method specific to this datapath.
IMPORT_C void | EmptyBufferL | ( | CMMFBuffer * | aBuffer, |
MDataSource * | aSupplier, | |||
TMediaId | aMediaId | |||
) | [virtual] |
Clears the specified buffer.
Pure virtual dummy implementation, not needed by datapath comes from MDataSink - CMMFData path is a sink to its MDataSource.
This is only required for an active push MDataSource requesting a buffer empty.
CMMFBuffer * aBuffer | The buffer to empty. |
MDataSource * aSupplier | The MDataSource supplying this buffer. |
TMediaId aMediaId | An optional mediaID parameter when there are multiple buffers arriving of different media types. |
IMPORT_C void | EndOfData | ( | ) | [protected, virtual] |
Forces and end of data state on the datapath
IMPORT_C void | FillBufferL | ( | CMMFBuffer * | aBuffer, |
MDataSink * | aConsumer, | |||
TMediaId | aMediaId | |||
) | [virtual] |
CMMFBuffer * aBuffer | The buffer to fill. |
MDataSink * aConsumer | The MDataSink supplying this buffer. |
TMediaId aMediaId | An optional mediaID parameter when there are multiple buffers arriving of different media types |
IMPORT_C CMMFDataPath * | NewL | ( | MAsyncEventHandler & | aEventHandler | ) | [static] |
Allocates and constructs a data path.
Use this function if the codec UID is not already known by CMMFController and there is no data path ambiguity - ie only one data path is possible.
Will create codec via fourCC.
MAsyncEventHandler & aEventHandler | Installs an event handler to provide message passing between clients and sources/sinks. |
IMPORT_C CMMFDataPath * | NewL | ( | TMediaId | aMediaId, |
MAsyncEventHandler & | aEventHandler | |||
) | [static] |
Allocates and constructs a data path according to the specified media ID.
Use this function if the codec UID is not already known by CMMFController and there is ambiguity with the data path ie. there is more than one possible data path.
TMediaId aMediaId | Optional media ID parameter when there are multiple media types. |
MAsyncEventHandler & aEventHandler | Installs an event handler to provide message passing between clients and sources/sinks. |
IMPORT_C CMMFDataPath * | NewL | ( | TUid | aCodecUid, |
MAsyncEventHandler & | aEventHandler | |||
) | [static] |
Allocates and constructs a data path according to the specified codec UID.
Use this function if the codec UID is already known by CMMFController and there is no data path ambiguity ie. only one data path is possible will create codec explicitly using the supplied codec Uid
TUid aCodecUid | Optional mediaID parameter when there are multiple media types |
MAsyncEventHandler & aEventHandler | Installs an event handler to provide message passing between clients and sources/sinks. |
IMPORT_C CMMFDataPath * | NewL | ( | TUid | aCodecUid, |
TMediaId | aMediaId, | |||
MAsyncEventHandler & | aEventHandler | |||
) | [static] |
Allocates and constructs a data path according to the specified codec UID.
Use this function if the codec UID is already known by CMMFController and there is ambiguity ie. more than one possible data path. TMediaId used to select the path.
TUid aCodecUid | The codec UID. |
TMediaId aMediaId | Optional mediaID parameter when there are multiple media types. |
MAsyncEventHandler & aEventHandler | Installs an event handler to provide message passing between clients and sources/sinks. |
void | ObtainSyncBuffersL | ( | ) | [private] |
Obtain source and/or sink buffer using the synchronous API CreateSourceBufferL() and CreateSinkBufferL().
IMPORT_C void | Pause | ( | ) | [virtual] |
Pauses playing.
Sends KMMFErrorCategoryDataPathGeneralError to the client if an error occurs.
IMPORT_C void | PlayL | ( | ) | [virtual] |
Starts an active scheduler 'play' loop.
Can only play from the primed state.
IMPORT_C void | PrimeL | ( | ) | [virtual] |
Allocates buffers in preparation to play.
Must be called before calling PlayL().
iSnkBufRef and iSrcBufRef contain ETrue if these buffers are created and owned by a MDataSource or MDataSink For clean-up purposes, datapath only cleans up buffers allocated directly by PrimeL().
IMPORT_C void | ResetL | ( | ) | [virtual] |
Deletes buffers if this datapath's sources and sinks own the buffers returned by PrimeL(). Typically if buffers are created asychronously, the datapath doesn't own the buffer so leaves cleanup handling to the owner sources/sinks.
Called when source and sink needs to be de-referenced. Sets iDataPathCreated, iSinkCanReceive, iSnkBufRef and iSrcBufRef to EFalse; sets iState to EStopped.
IMPORT_C TInt | RunError | ( | TInt | aError | ) | [virtual] |
Handles errors coming from attached sources and passes them to the clients.
TInt aError | Standard error code (KErrNone = No Error). |
IMPORT_C void | RunL | ( | ) | [virtual] |
Runs the clip depending on the current data path and transfer state.
For example, fills the sink buffer if TDataPathState is EPlaying and TTransferState is ENeedSinkData.
IMPORT_C TInt | SendEventToClient | ( | const TMMFEvent & | aEvent | ) | [private] |
Passes error handling and general messages to clients.
const TMMFEvent & aEvent | TMMFEvent supplied by callee (typically DoSendEventToClient) |
IMPORT_C void | SetPlayWindowL | ( | const TTimeIntervalMicroSeconds & | aStart, |
const TTimeIntervalMicroSeconds & | aEnd | |||
) | [virtual] |
Sets the play window absolutely (i.e. the parameters are relative to the start of the entire clip).
const TTimeIntervalMicroSeconds & aStart | The offset from the start of the Clip |
const TTimeIntervalMicroSeconds & aEnd | The offset from the end of the clip (if this is less than aStart, then the two will be inverted). |
IMPORT_C void | SetPositionL | ( | const TTimeIntervalMicroSeconds & | aPosition | ) | [virtual] |
Sets the data path position.
const TTimeIntervalMicroSeconds & aPosition | The data path position. |
IMPORT_C TFourCC | SinkDataTypeCode | ( | TMediaId | aMediaId | ) | [virtual] |
Gets the sink's data type for the specified media ID.
TMediaId aMediaId | An optional parameter to specifiy the specific stream when datasource contains more than one stream of data |
IMPORT_C TFourCC | SourceDataTypeCode | ( | TMediaId | aMediaId | ) | [virtual] |
Gets the source data type for the specified media ID.
TMediaId aMediaId | An optional parameter to specifiy specific stream when datasource contains more than one stream of data. |
IMPORT_C void | Stop | ( | ) | [virtual] |
Stops playing.
Resets datapath position - currently does not clean up buffers. Sends KMMFErrorCategoryDataPathGeneralError to the client if an error occurs.
Indicates the state of the data path.
Mimics typical MultiMedia behaviour of stopped, primed and playing
EStopped |
Stopped. |
EPrimed |
Primed. |
EPlaying |
Playing. |
ERecording |
Recording. |
EConverting |
Converting. |
This indicates what buffers are required in order to operate. If a real Codec is in use, buffers are required from both source and sink, else only one is required and source is preferred.
ENoBuffers = 0x0 |
No buffers needed. |
ENeedSinkBuffer = 0x01 |
Sink buffer needed. |
ENeedSourceBuffer = 0x10 |
Source buffer needed. |
Indicates the transfer state.
Buffers maybe be filled, emptied, or have "one" shot initialisatings performed upon them.
TTransferState is used within the datapath RunL which drives databuffer exchange.
EWaitSink |
Waiting on a BufferEmptied callback from sink |
EWaitSource |
Waiting on a BufferFilled callback from source |
EInitializeSink |
Initialize the sink. |
EInitializeSource |
Initialize the source. |
ENeedSourceData |
Source buffer does not contain data. |
ENeedSinkData |
Sink buffer does not contain data. |
ENeedToMatchSourceToSink |
There is more source data to send to the sink and need to match sink and source. |
ESendDataToSink |
Outstanding data to send to sink. |
EEndOfData |
End of data. |
TBool | iAllDataSentToSink | [protected] |
Indicates that all data has been sent to the sink.
TInt | iBuffersToUse | [protected] |
Holds the outcome of the call to DetermineBuffersToUseL
TTimeIntervalMicroSeconds | iCachedSourceDuration | [protected] |
This value can be used to obtain the duration of the source when playing or converting. This is an optimisation as this value will not change if we are playing or converting.
TCodecProcessResult | iCodecProcessResult | [protected] |
Result of processing the codec.
CCompleteCallback * | iCompleteCallback | [protected] |
Pointer to internal callback completion class
TUint | iCurrentSinkFrameNumber | [protected] |
The sink's position in terms of frames or some other time fixed parameter.
TUint | iCurrentSourceFrameNumber | [protected] |
The source's position in terms of frames or some other time fixed parameter.
TUint | iDataPathCompletedErrorCode | [protected] |
Datapath completed because of an error; usually KErrNone.
TBool | iDataPathCreated | [protected] |
Set to ETrue when the data path has a source and a sink and can send data from the source to the sink.
MDataSink * | iDataSink | [protected] |
The sink of data for which the CMMFDataPath is a MDataSource for
MDataSource * | iDataSource | [protected] |
The source of data to which the CMMFDataPath is a MDataSink for.
TMediaId | iMediaId | [protected] |
Identifies which media type and stream within MDataSource.
TBool | iNoMoreSourceData | [protected] |
Indicates that all data has been obtained from the source (ETrue if there is no more source data).
TBool | iObtainingAsyncSinkBuffer | [protected] |
Indicates asynchrous buffers from AudioOutput.
TBool | iObtainingAsyncSourceBuffer | [protected] |
Indicates asynchrous buffers from AudioInput.
TTimeIntervalMicroSeconds | iPlayWindowEndPosition | [protected] |
End position of the play window.
TTimeIntervalMicroSeconds | iPlayWindowStartPosition | [protected] |
Start position of the play window.
TInt | iReferenceAudioSamplesPlayed | [protected] |
Holds the number of samples played on audio output at a point where we want to reference play duration from.
TInt | iReferenceAudioSamplesRecorded | [protected] |
Holds the number of samples recorded from audio input at a point where we want to reference record duration from.
CMMFBuffer * | iSinkBuffer | [protected] |
This is set to point to whichever sink buffer is in use.
TBool | iSinkBufferWithSink | [protected] |
Flag to indicate that a buffer is with the sink.
This are necessary as it is imperrative that when a buffer is with the sink, it must not be referenced in any way. The reason for this is that it is not mandated that sinks maintain buffer references. For example, it is valid for DevSound to request more audio data in a different buffer to the one supplied to it.
TBool | iSinkCanReceive | [protected] |
Set to true when the sink is able to accept data. EFalse otherwise.
TFourCC | iSinkFourCC | [protected] |
The sink's data type. Same as the codec input data type.
TBool | iSnkBufRef | [protected] |
ETrue if sink buffer is reference to object owned by someone else
CMMFBuffer * | iSourceBuffer | [protected] |
This is the pointer to whichever source buffer is in use
TBool | iSourceBufferWithSource | [protected] |
Flag to indicate that a buffer is with the source.
This is necessary as it is imperrative that when a buffer is with the source, it must not be referenced in any way. The reason for this is that it is not mandated that sources maintain buffer references. For example, it is valid for DevSound to return recorded data in a different buffer to the one supplied to it.
TFourCC | iSourceFourCC | [protected] |
The source's data type. Same as the codec output data type.
TBool | iSrcBufRef | [protected] |
ETrue if the source buffer is reference to object owned by someone else.
TTimeIntervalMicroSeconds | iStartPosition | [protected] |
The position audio will start playing from. When stopping, this is set to iPlayWindowStartPosition. When pausing, this is set to the current position.
TTransferState | iTransferState | [protected] |
Current transfer state. TTransferState
TBool | iUseSuppliedCodecUid | [protected] |
Set to true if data path has to use a supplied codec in its construction.
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.