kernel/eka/include/drivers/soundsc.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/drivers/soundsc.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,621 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// e32\include\drivers\soundsc.h
+// Kernel side definitions for the shared chunk sound driver.
+//
+//
+
+/**
+ @file
+ @internalTechnology
+ @prototype
+*/
+
+#ifndef __SOUNDSC_H__
+#define __SOUNDSC_H__
+
+#include <d32soundsc.h>
+#include <platform.h>
+#include <kernel/kpower.h>
+#include <e32ver.h>
+
+/** The maximum number of client transfer requests which may be outstanding in a particular direction at any time. */
+const TInt KMaxSndScRequestsPending=8;
+
+/**
+A bit-mask value for the sound configuration status variable DSoundScLdd::iSoundConfigFlags. This being set signifies
+that the sound configuration has been set in hardware by the driver.
+*/
+const TUint KSndScSoundConfigIsSetup=0x00000001;
+/**
+A bit-mask value for the sound configuration status variable DSoundScLdd::iSoundConfigFlags. This being set signifies
+that the record level / play volume has been set in hardware by the driver.
+*/
+const TUint KSndScVolumeIsSetup=0x00000002;
+
+// Bit-mask values used when testing the driver
+const TUint KSoundScTest_StartTransferError=0x01;
+const TUint KSoundScTest_TransferDataError=0x02;
+const TUint KSoundScTest_TransferTimeout=0x04;
+
+// Forward declarations
+class TAudioBuffer;
+class DBufferManager;
+class DSoundScLdd;
+
+/**
+@publishedPartner
+@prototype
+*/
+class TSoundSharedChunkBufConfig : public TSharedChunkBufConfigBase
+	{
+public:
+	/** The first entry of the buffer offset list. This list holds the offset from the start of the chunk
+	for each buffer. This list is only valid if the flag KScFlagBufOffsetListInUse is set in
+	TSharedChunkBufConfigBase::iFlags. */
+	TInt iBufferOffsetListStart;
+	};
+
+/**
+The sound driver power handler class.
+*/
+class DSoundScPowerHandler : public DPowerHandler
+	{
+public:
+	DSoundScPowerHandler(DSoundScLdd* aChannel);
+	// Inherited from DPowerHandler
+	void PowerUp();
+	void PowerDown(TPowerState aPowerState);
+private:
+	DSoundScLdd* iChannel;
+	};
+
+/**
+An object encapsulating an audio data transfer - either record or playback.
+*/
+class TSndScTransfer
+	{
+public:
+	enum TTfState
+		{
+		/** None of the data for this transfer has been queued on the device. */
+		ETfNotStarted,
+		/** Some of the data for this transfer has been queued on the device - but there is more that needs queuing. */
+		ETfPartlyStarted,
+		/** All the data for this transfer has been queued on the device - but transfer is not complete. */
+		ETfFullyStarted,
+		/** All the data for this transfer has been transferred. */
+		ETfDone
+		};
+public:
+	TSndScTransfer();
+	void Init(TUint aId,TInt aChunkOffset,TInt aLength,TAudioBuffer* anAudioBuffer);
+	inline TInt GetNotStartedLen();
+	inline TInt GetStartOffset();
+	inline TInt GetLengthTransferred();
+	void SetStarted(TInt aLength);
+	TBool SetCompleted(TInt aLength);
+public:
+	/** A value which uniquely identifies a particular audio data transfer. */
+	TUint iId;
+	/** The status of this transfer. */
+	TTfState iTfState;
+	/** The audio buffer associated with this transfer. */
+	TAudioBuffer* iAudioBuffer;
+private:
+	/** An offset within the shared chunk indicating the progress of the transfer. Data between the initial offset
+	and this value has either been successfully been transferred or has been queued for transfer. */
+	TUint iStartedOffset;
+	/** An offset within the shared chunk indicating the end of the data to be transferred. */
+	TUint iEndOffset;
+	/** This holds the count of the number of bytes which have been successfully transferred. */
+	TInt iLengthTransferred;
+	/** This holds the count of the number of transfer fragments which are currently in progress for this transfer. */
+	TInt iTransfersInProgress;
+	};
+
+/**
+An object encapsulating an audio request from the client - either record or playback.
+*/
+class TSoundScRequest : public SDblQueLink
+	{
+public:
+	inline TSoundScRequest();
+	virtual ~TSoundScRequest();
+	virtual TInt Construct();
+public:
+	/** The thread which issued the request and which supplied the request status. */
+	DThread* iOwningThread;
+	/** The client request completion object
+		This is the base class and may be constructed as a derived type*/
+	TClientRequest* iClientRequest;
+	};
+
+/**
+A play request object.
+*/
+class TSoundScPlayRequest : public TSoundScRequest
+	{
+public:
+	TSoundScPlayRequest();
+	inline void SetFail(TInt aCompletionReason);
+	inline void UpdateProgress(TInt aLength);
+	TInt Construct();
+public:
+	/** The transfer information associated with this play request. */
+	TSndScTransfer iTf;
+	/** The play request flags which were supplied by the client for this request - see KSndFlagLastSample. */
+	TUint iFlags;
+	/** The error value to be returned when completing the request. */
+	TInt iCompletionReason;
+	};
+
+/**
+An object encapsulating a queue of audio requests from the client.
+*/
+class TSoundScRequestQueue
+	{
+public:
+	TSoundScRequestQueue(DSoundScLdd* aLdd);
+	virtual ~TSoundScRequestQueue();
+	virtual TInt Create();
+	TSoundScRequest* NextFree();
+	void Add(TSoundScRequest* aReq);
+	TSoundScRequest* Remove();
+	TSoundScRequest* Remove(TSoundScRequest* aReq);
+	TSoundScRequest* Find(TRequestStatus* aStatus);
+	void Free(TSoundScRequest* aReq);
+	inline TBool IsEmpty();
+	inline TBool IsAnchor(TSoundScRequest* aReq);
+	void CompleteAll(TInt aCompletionReason,NFastMutex* aMutex=NULL);
+protected:
+	/** The queue of pending audio requests. */
+	SDblQue iPendRequestQ;
+	/** The queue of unused audio requests. */
+	SDblQue iUnusedRequestQ;
+	/** The actual array of request objects. */
+	TSoundScRequest* iRequest[KMaxSndScRequestsPending];
+	/** Mutex used to protect the unused queue from corruption */
+	NFastMutex iUnusedRequestQLock;
+private:
+	/** The owning LDD object. */
+	DSoundScLdd* iLdd;
+	};
+
+/**
+An object encapsulating a queue of play requests from the client.
+*/
+class TSoundScPlayRequestQueue : public TSoundScRequestQueue
+	{
+public:
+	TSoundScPlayRequestQueue(DSoundScLdd* aLdd);
+	virtual TInt Create();
+	TSoundScPlayRequest* NextRequestForTransfer();
+	TSoundScPlayRequest* Find(TUint aTransferID,TBool& aIsNextToComplete);
+	};
+
+/**
+The buffer manager base class.
+*/
+class DBufferManager : public DBase
+	{
+public:
+	enum TFlushOp
+		{
+		/** Flush before a DMA write. */
+		EFlushBeforeDmaWrite,
+		/** Flush before a DMA read. */
+		EFlushBeforeDmaRead,
+		/** Flush after a DMA read. */
+		EFlushAfterDmaRead
+		};
+public:
+	DBufferManager(DSoundScLdd* aLdd);
+	~DBufferManager();
+	TInt Create(TSoundSharedChunkBufConfig* aBufConfig);
+	TInt Create(TSoundSharedChunkBufConfig& aBufConfig,TInt aChunkHandle,DThread* anOwningThread);
+	void FlushData(TInt aChunkOffset,TInt aLength,TFlushOp aFlushOp);
+protected:
+	TInt ValidateBufferOffsets(TInt* aBufferOffsetList,TInt aNumBuffers,TInt aBufferSizeInBytes);
+	TInt ValidateRegion(TUint aChunkOffset,TUint aLength,TAudioBuffer*& anAudioBuffer);
+	TInt CreateBufferLists(TInt aNumBuffers);
+	TInt CommitMemoryForBuffer(TInt aChunkOffset,TInt aSize,TBool& aIsContiguous);
+	void GetChunkCreateInfo(TChunkCreateInfo& aChunkCreateInfo);
+protected:
+	/** The owning LDD object. */
+	DSoundScLdd* iLdd;
+	/** The chunk which contains the buffers. */
+	DChunk* iChunk;
+	/** The linear address in kernel process for the start of the chunk. */
+	TLinAddr iChunkBase;
+	/** MMU mapping attributes that the chunk has actually been mapped with. */
+	TUint32 iChunkMapAttr;
+	/** The number of buffers. */
+	TInt iNumBuffers;
+	/** The actual array of buffer objects. */
+	TAudioBuffer* iAudioBuffers;
+	/** The maximum transfer length that the owning audio channel can support in a single data transfer. */
+	TInt iMaxTransferLen;
+protected:
+	friend class DSoundScLdd;
+	friend class TAudioBuffer;
+	};
+
+/**
+The record buffer manager class.
+*/
+class DRecordBufferManager : public DBufferManager
+	{
+public:
+	DRecordBufferManager(DSoundScLdd* aLdd);
+	void Reset();
+	inline TAudioBuffer* GetCurrentRecordBuffer();
+	inline TAudioBuffer* GetNextRecordBuffer();
+	TAudioBuffer* GetBufferForClient();
+	TAudioBuffer* SetBufferFilled(TInt aBytesAdded,TInt aTransferResult);
+	TAudioBuffer* ReleaseBuffer(TInt aChunkOffset);
+protected:
+	/** The buffer currently being filled with record data. (Not in any list). */
+	TAudioBuffer* iCurrentBuffer;
+	/** The next buffer to use to capture record data. (Not in any list). */
+	TAudioBuffer* iNextBuffer;
+	/** A queue of those buffers which are currently free. */
+	SDblQue iFreeBufferQ;
+	/** A queue of those buffers which currently contain record data (and which aren't being used by the client). */
+	SDblQue iCompletedBufferQ;
+	/** A queue of those buffers which are currently being used by the client. */
+	SDblQue iInUseBufferQ;
+	/** A flag set within SetBufferFilled() each time it is necessary to use a buffer from the completed list rather
+	than the free list as the next buffer for capture (i.e. 'iNextBuffer'). */
+	TBool iBufOverflow;
+private:
+	friend class DSoundScLdd;
+	};
+
+/**
+The class representing a single record/play buffer.
+*/
+class TAudioBuffer : public SDblQueLink
+	{
+public:
+	TAudioBuffer();
+	~TAudioBuffer();
+	TInt Create(DChunk* aChunk,TInt aChunkOffset,TInt aSize,TBool aIsContiguous,DBufferManager* aBufManager);
+	TInt GetFragmentLength(TInt aChunkOffset,TInt aLengthRemaining,TPhysAddr& aPhysAddr);
+	void Flush(DBufferManager::TFlushOp aFlushOp);
+public:
+	/** The owning buffer manager. */
+	DBufferManager* iBufManager;
+	/** The offset, in bytes, of the start of the buffer within the chunk. */
+	TInt iChunkOffset;
+	/** The size of the buffer in bytes. */
+	TInt iSize;
+	/** The physical address of the start of the buffer. KPhysAddrInvalid if the buffer is not physically contiguous. */
+	TPhysAddr iPhysicalAddress;
+	/** A list of physical addresses for buffer pages. 0 if the buffer is physically contiguous. */
+	TPhysAddr* iPhysicalPages;
+	/** Used for record only this is the number of bytes added into this buffer during recording. */
+	TInt iBytesAdded;
+	/** Used for record only this is the result of the transfer into this buffer. */
+	TInt iResult;
+	};
+
+/**
+The physical device driver (PDD) base class for the sound driver - for either playback or record.
+@publishedPartner
+@prototype
+*/
+class DSoundScPdd : public DBase
+	{
+public:
+	/**
+	Return the DFC queue to be used by this device.
+	@param	aUnit	The record or playback unit for which to return the DFC queue.  This is for use by
+			SMP optimised drivers to return different DFC queues for different units that can
+			then run on separate CPU cores.
+	@return The DFC queue to use.
+	*/
+	virtual TDfcQue* DfcQ(TInt aUnit)=0;
+
+	/**
+	Return the shared chunk create information to be used by this device.
+	@param aChunkCreateInfo A chunk create info. object to be to be filled with the settings
+							required for this device.
+	*/
+	virtual void GetChunkCreateInfo(TChunkCreateInfo& aChunkCreateInfo)=0;
+
+	/**
+	Return the capabilities of this audio device.
+	This includes information on the direction of the device (i.e. play or record), the number of audio channels
+	supported (mono, stereo etc), the encoding formats and sample rates supported and so on.
+	@param aCapsBuf A packaged TSoundFormatsSupportedV02 object to be filled with the capabilities
+		of this device. This descriptor is in kernel memory and can be accessed directly.
+	@see TSoundFormatsSupportedV02.
+	*/
+	virtual void Caps(TDes8& aCapsBuf) const=0;
+
+	/**
+	Return the maximum transfer length in bytes that this device can support in a single data transfer.
+	(If the device is using the Symbian DMA framework to handle data transfers then the framework handles data
+	transfers which exceed the maximum transfer length for the platform. However, some PDD implementations
+	may not use the DMA framework).
+	@return The maximum transfer length in bytes.
+	*/
+	virtual TInt MaxTransferLen() const=0;
+
+	/**
+	Configure or reconfigure the device using the configuration supplied.
+	@param aConfigBuf A packaged TCurrentSoundFormatV02 object which contains the new configuration settings.
+		This descriptor is in kernel memory and can be accessed directly.
+	@return KErrNone if successful, otherwise one of the other system wide error codes.
+	@see TCurrentSoundFormatV02.
+	*/
+	virtual TInt SetConfig(const TDesC8& aConfigBuf)=0;
+
+	/**
+	Set the volume or record level.
+	@param aVolume The play volume or record level to be set - a value in the range 0 to 255. The value 255
+		equates to the maximum volume and each value below this equates to a 0.5dB step below it.
+	@return KErrNone if successful, otherwise one of the other system wide error codes.
+	*/
+	virtual TInt SetVolume(TInt aVolume)=0;
+
+	/**
+	Prepare the audio device for data transfer.
+	This may be preparing it either for record or playback - depending on the direction of the channel.
+	@return KErrNone if successful, otherwise one of the other system wide error codes.
+	*/
+	virtual TInt StartTransfer()=0;
+
+	/**
+	Initiate the transfer of a portion of data from/to the audio device.
+	This may be to either record or playback the data - depending on the direction of the channel. When the transfer is
+	complete, the PDD should signal this event using the LDD function PlayCallback() or RecordCallback() as appropriate.
+	@param aTransferID A value assigned by the LDD to allow it to uniquely identify a particular transfer fragment.
+	@param aLinAddr A linear address within the shared chunk. For playback this is the address of the start of the data
+		to be transferred. For record, this is the start address for storing the recorded data.
+	@param aPhysAddr The physical address within the shared chunk that corresponds to the linear address: aLinAddr.
+	@param aNumBytes The number of bytes to be transferred.
+	@return KErrNone if the transfer has been initiated successfully;
+  			KErrNotReady if the device is unable to accept the transfer for the moment;
+		  	otherwise one of the other system-wide error codes.
+	*/
+	virtual TInt TransferData(TUint aTransferID,TLinAddr aLinAddr,TPhysAddr aPhysAddr,TInt aNumBytes)=0;
+
+	/**
+	Terminate the transfer of a data to/from the device and to release any resources necessary for transfer.
+	In the case of playback, this is called soon after the last pending play request from the client has been completed.
+	In the case of record, the LDD will leave the audio device capturing record data even when there are no record
+	requests pending from the client. Transfer will only be terminated when the client either issues
+	RSoundSc::CancelRecordData() or closes the channel. Once this function had been called, the LDD will not issue
+	any further TransferData() commands without first issueing a StartTransfer() command.
+	*/
+	virtual void StopTransfer()=0;
+
+	/**
+	Halt the transfer of data to/from the sound device but don't release any resources necessary for transfer.
+	In the case of playback, if possible, any active transfer should be suspended in such a way that it can be
+	resumed later - starting from next sample following the one last played.
+	In the case of record, any active transfer should be aborted. When recording is halted the PDD should signal this event
+	with a single call of the LDD function RecordCallback() - reporting back any partial data already received. In this
+	case, if transfer is resumed later, the LDD will issue a new TransferData() request to re-commence data transfer.
+	@return KErrNone if successful, otherwise one of the other system wide error codes.
+	*/
+	virtual TInt PauseTransfer()=0;
+
+	/**
+	Resume the transfer of data to/from the sound device following a request to halt the transfer.
+	In the case of playback, if possible, any transfer which was active when the device was halted should be resumed -
+	starting from next sample following the one last played. Once complete, it should be reported using PlayCallback()
+	as normal.
+	In the case of record, any active transfer would have been aborted when the device was halted so its just a case
+	of re-creating the same setup achieved following StartTransfer().
+	@return KErrNone if successful, otherwise one of the other system wide error codes.
+	*/
+	virtual TInt ResumeTransfer()=0;
+
+	/**
+	Power up the sound device. This is called when the channel is first opened and if ever the phone is brought out
+	of standby mode.
+	@return KErrNone if successful, otherwise one of the other system wide error codes.
+	*/
+	virtual TInt PowerUp()=0;
+
+	/**
+	Power down the sound device. This is called when the channel is closed and just before the phone powers down when
+	being turned off or going into standby.
+	*/
+	virtual void PowerDown()=0;
+
+	/**
+	Handle a custom configuration request.
+	@param aFunction A number identifying the request.
+	@param aParam A 32-bit value passed to the driver. Its meaning depends on the request.
+	@return KErrNone if successful, otherwise one of the other system wide error codes.
+	*/
+	virtual TInt CustomConfig(TInt aFunction,TAny* aParam)=0;
+
+	/**
+	Calculates and returns the number of microseconds of data transferred since the start of transfer.
+	@param aTime	A reference to a variable into which to place the number of microseconds played or recorded.
+	@param aState	The current state of the transfer (from TSoundScLdd::TState).  Included so that paused
+					and Active transfers can be treated differently.
+	@return			KErrNone if successful, otherwise one of the other system wide error codes.
+	*/
+	virtual TInt TimeTransferred(TInt64& aTime, TInt aState);
+protected:
+	inline DSoundScLdd* Ldd();
+private:
+	DSoundScLdd* iLdd;
+	friend class DSoundScLdd;
+	};
+
+/**
+The logical device (factory class) for the sound driver.
+*/
+class DSoundScLddFactory : public DLogicalDevice
+	{
+public:
+	DSoundScLddFactory();
+	virtual TInt Install();
+	virtual void GetCaps(TDes8 &aDes) const;
+	virtual TInt Create(DLogicalChannelBase*& aChannel);
+	TBool IsUnitOpen(TInt aUnit);
+	TInt SetUnitOpen(TInt aUnit,TBool aIsOpenSetting);
+private:
+	/** Mask to keep track of which units have a channel open on them. */
+	TUint iUnitsOpenMask;
+	/** A mutex to protect access to the unit info. mask. */
+	NFastMutex iUnitInfoMutex;
+	};
+
+/**
+The logical channel class for the sound driver.
+*/
+class DSoundScLdd : public DLogicalChannel
+	{
+public:
+	enum TState
+		{
+		/** Channel is open - but not configured. */
+		EOpen,
+		/** Channel is configured - but inactive. */
+		EConfigured,
+		/** Channel is active - recording or playing data. */
+		EActive,
+		/** Channel is paused - recording or playing has been suspended. */
+		EPaused
+		};
+public:
+	DSoundScLdd();
+	virtual ~DSoundScLdd();
+	// Inherited from DLogicalChannel
+	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
+	virtual TInt Request(TInt aReqNo, TAny* a1, TAny* a2);
+ 	virtual TInt SendMsg(TMessageBase* aMsg);
+	virtual void HandleMsg(TMessageBase* aMsg);
+	void Shutdown();
+	// Functions used by the PDD
+	virtual void PlayCallback(TUint aTransferID,TInt aTransferResult,TInt aBytesPlayed);
+	virtual void RecordCallback(TUint aTransferID,TInt aTransferResult,TInt aBytesRecorded);
+	virtual void NotifyChangeOfHwConfigCallback(TBool aHeadsetPresent);
+	virtual TSoundSharedChunkBufConfig* BufConfig();
+	virtual TLinAddr ChunkBase();
+private:
+	// Implementations for the different kinds of requests
+	TInt DoControl(TInt aFunction, TAny* a1, TAny* a2,DThread* aThread);
+	TInt DoRequest(TInt aFunction, TRequestStatus* aStatus, TAny* a1, TAny* a2,DThread* aThread);
+	TInt DoCancel(TUint aMask);
+	TInt SetBufferConfig(DThread* aThread);
+	TInt SetBufferConfig(TInt aChunkHandle,DThread* aThread);
+	TInt SetSoundConfig();
+	TInt DoSetSoundConfig(const TCurrentSoundFormatV02& aSoundConfig);
+	TInt SetVolume(TInt aVolume);
+	TInt PlayData(TRequestStatus* aStatus,TSoundScPlayRequest* aRequest,DThread* aThread);
+	TInt RecordData(TRequestStatus* aStatus,TInt* aLengthPtr,DThread* aThread);
+	TInt StartRecord();
+	TInt ReleaseBuffer(TInt aChunkOffset);
+	TInt CustomConfig(TInt aFunction,TAny* aParam);
+	TInt ValidateConfig(const TCurrentSoundFormatV02& aConfig);
+	TInt ReAllocBufferConfigInfo(TInt aNumBuffers);
+	void StartNextPlayTransfers();
+	inline void CompletePlayRequest(TSoundScPlayRequest* aReq,TInt aResult);
+	void DoCompletePlayRequest(TSoundScPlayRequest* aReq);
+	void CompleteAllDonePlayRequests(TSoundScPlayRequest* aReq);
+	void HandleCurrentRecordBufferDone(TInt aTransferResult);
+	void CompleteRequest(DThread* aThread,TRequestStatus* aStatus,TInt aReason,TClientRequest* aClientRequest=NULL);
+	TInt StartNextRecordTransfers();
+	void StartPlayEofTimer();
+	void CancelPlayEofTimer();
+	inline DSoundScPdd* Pdd();
+	static void PlayEofTimerExpired(TAny* aChannel);
+	static void PlayEofTimerDfc(TAny* aChannel);
+	static void PowerUpDfc(TAny* aChannel);
+	static void PowerDownDfc(TAny* aChannel);
+	TInt PrePlay(TMessageBase* aMsg);
+	TInt PreSetBufferChunkCreateOrOpen(TMessageBase* aMsg);
+	TInt PreSetSoundConfig(TMessageBase* aMsg);
+private:
+	/** The handle to the chunk that is returned to the user side code. */
+	TInt iChunkHandle;
+	/** The handle of the thread that created the chunk referenced by iChunkHandle */
+	DThread* iChunkHandleThread;
+	/** The unit number of this channel. */
+	TInt iUnit;
+	/** The data transfer direction for this unit: play or record. */
+	TSoundDirection iDirection;
+	/** The operating state of the channel. */
+	TState iState;
+	/** Spare. */
+	TInt iSpare;
+	/** The buffer manager - managing the shared chunk and the record/play buffers within this. */
+	DBufferManager* iBufManager;
+	/** A mutex to protect access to the buffer lists and the pending request list. */
+	NFastMutex iMutex;
+	/** The transfer status of the record buffer currently being filled. */
+	TSndScTransfer iCurrentRecBufTf;
+	/** The transfer status of the record buffer which is next to be filled. */
+	TSndScTransfer iNextRecBufTf;
+	/** The current buffer configuration in the play/record chunk. */
+	TSoundSharedChunkBufConfig* iBufConfig;
+	/** The size in bytes of the play/record buffer configuration info. structure. */
+	TInt iBufConfigSize;
+	/** The sound driver power handler. */
+	DSoundScPowerHandler* iPowerHandler;
+	/** DFC used to handle power down requests from the power manager before a transition into system shutdown/standby. */
+	TDfc iPowerDownDfc;
+	/** DFC used to handle power up requests from the power manager following a transition out of system standby. */
+	TDfc iPowerUpDfc;
+	/** The capabilities of this device. */
+	TSoundFormatsSupportedV02 iCaps;
+	/** The current audio configuration of the driver. */
+	TCurrentSoundFormatV02 iSoundConfig;
+	/** The requested audio configuration of the driver before validation. */
+	TCurrentSoundFormatV02 iTempSoundConfig;
+	/** A bitmask holding sound configuration status information. */
+	TUint32 iSoundConfigFlags;
+	/** The current setting for the record level / play volume. */
+	TInt iVolume;
+	/** The queue of pending play or record requests. */
+	TSoundScRequestQueue* iReqQueue;
+	/** Used to complete the change of hardware notification. */
+	TClientDataRequest<TBool>* iNotifyChangeOfHwClientRequest;
+	/** The thread which has registered for the hardware configuration change notifier. */
+	DThread* iChangeOfHwConfigThread;
+	/** A pointer to the headset present boolean variable in client memory which is updated on a notification. */
+	TBool* iHeadsetPresentStatPtr;
+	/** To keep track of the number of bytes transferred. */
+	TInt iBytesTransferred;
+	/** Count of the number of times the PDD completes a record transfer fragment just after being paused. */
+	TInt iCompletesWhilePausedCount;
+	/** A timer used to delay exiting play transfer mode at EOF. */
+	NTimer iEofTimer;
+	/** DFC used to delay exiting play transfer mode at EOF. */
+	TDfc iPlayEofDfc;
+	/** Used for testing and debugging. */
+	TUint iTestSettings;
+	/** A flag to indicate whether the play EOF timer is active. */
+	TBool iPlayEofTimerActive;
+	/** Used in debug builds to track that all calls to DThread::Open() are balanced with a close before the driver closes. */
+	TInt iThreadOpenCount;
+	/** Used to complete requests in the DFC thread. */
+	TClientRequest** iClientRequests;
+
+	friend class DBufferManager;
+	friend class DSoundScPowerHandler;
+	friend class TSoundScRequestQueue;
+	};
+
+#include <drivers/soundsc.inl>
+#endif	// __SOUNDSC_H__