kernel/eka/include/d32soundsc.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/d32soundsc.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,620 @@
+// Copyright (c) 1998-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\d32soundsc.h
+// User side class definition for the shared chunk sound driver.
+// 
+//
+
+/**
+ @file
+ @publishedPartner
+ @prototype
+*/
+
+#ifndef __D32SOUNDSC_H__
+#define __D32SOUNDSC_H__
+
+#include <e32cmn.h>
+#include <e32ver.h>
+#ifndef __KERNEL_MODE__
+#include <e32std.h>
+#endif
+
+_LIT(KDevSoundScName,"SoundSc");
+
+const TInt KSoundScTxUnit0=0;
+const TInt KSoundScTxUnit1=1;
+/**
+@capability UserEnvironment
+@ref RSoundSc::Open An RSoundSc may not be opened for record without UserEnvironment
+*/
+const TInt KSoundScRxUnit0=4;
+/**
+@capability UserEnvironment
+@ref RSoundSc::Open An RSoundSc may not be opened for record without UserEnvironment
+*/
+const TInt KSoundScRxUnit1=5;
+
+// Note that the implementation in the sound driver LDD to calculate a default audio configuration assumes a 
+// monotonic ordering of all caps bitfields. If it is necessary to break this ordering then this implementation
+// will need to be reviewed and possibly changed.
+
+/**
+Sound driver capability constants - bitmasks of the audio channel configurations supported
+by a unit. @see TSoundFormatsSupportedV02.
+*/
+/** The unit supports Mono (i.e. a single audio channel). */
+const TUint KSoundMonoChannel = 0x0001;
+/** The unit supports Stereo (i.e. two audio channels). */
+const TUint KSoundStereoChannel = 0x0002;
+/** The unit supports three audio channels. */
+const TUint KSoundThreeChannel = 0x0004;
+/** The unit supports four audio channels. */
+const TUint KSoundFourChannel = 0x0008;
+/** The unit supports five audio channels. */
+const TUint KSoundFiveChannel = 0x0010;
+/** The unit supports six audio channels. */
+const TUint KSoundSixChannel = 0x0020;
+
+/**
+Sound driver capability constants - bitmasks of supported sample rates. @see TSoundFormatsSupportedV02.
+*/
+/** The device supports the 7.35KHz sample rate. */
+const TUint KSoundRate7350Hz = 0x0001;
+/** The device supports the 8KHz sample rate. */
+const TUint KSoundRate8000Hz = 0x0002;
+/** The device supports the 8.82KHz sample rate. */
+const TUint KSoundRate8820Hz = 0x0004;
+/** The device supports the 9.6KHz sample rate. */
+const TUint KSoundRate9600Hz = 0x0008;
+/** The device supports the 11.025KHz sample rate. */
+const TUint KSoundRate11025Hz = 0x0010;
+/** The device supports the 12KHz sample rate. */
+const TUint KSoundRate12000Hz = 0x0020;
+/** The device supports the 14.7KHz sample rate. */
+const TUint KSoundRate14700Hz = 0x0040;
+/** The device supports the 16KHz sample rate. */
+const TUint KSoundRate16000Hz = 0x0080;
+/** The device supports the 22.05KHz sample rate. */
+const TUint KSoundRate22050Hz = 0x0100;
+/** The device supports the 24KHz sample rate. */
+const TUint KSoundRate24000Hz = 0x0200;
+/** The device supports the 29.4KHz sample rate. */
+const TUint KSoundRate29400Hz = 0x0400;
+/** The device supports the 32KHz sample rate. */
+const TUint KSoundRate32000Hz = 0x0800;
+/** The device supports the 44.1KHz sample rate. */
+const TUint KSoundRate44100Hz = 0x1000;
+/** The device supports the 48KHz sample rate. */
+const TUint KSoundRate48000Hz = 0x2000;
+
+/**
+Sound driver capability constants - bitmasks of supported encoding formats. @see TSoundFormatsSupportedV02.
+*/
+/** The device supports 8bit PCM encoding format. */
+const TUint KSoundEncoding8BitPCM = 0x0001;
+/** The device supports 16bit PCM encoding format. */
+const TUint KSoundEncoding16BitPCM = 0x0002;
+/** The device supports 24bit PCM encoding format. */
+const TUint KSoundEncoding24BitPCM = 0x0004;
+
+/**
+Sound driver capability constants - bitmasks of the data formats supported
+by the device. @see TSoundFormatsSupportedV02.
+*/
+/** The device supports an interleaved data format (i.e. data for each channel is interleaved throughout
+each data buffer). */
+const TUint KSoundDataFormatInterleaved = 0x0001;
+/** The device supports a non-interleaved data format (i.e. data for each channel is arranged in
+contiguous regions within each data buffer). */
+const TUint KSoundDataFormatNonInterleaved = 0x0002;
+
+/** The maximum setting possible for the record level / volume. */
+const TInt KSoundMaxVolume = 255;
+
+/**
+Enumeration of possible data transfer directions. @see TSoundFormatsSupportedV02.
+*/
+enum TSoundDirection
+	{
+	/**	A unit for recording data. */
+	ESoundDirRecord,
+	/** A unit for playing data. */
+	ESoundDirPlayback
+	};
+
+/**
+Enumeration of possible sample rates. @see TCurrentSoundFormatV02.
+*/	
+enum TSoundRate
+	{
+	/** 7.35KHz sample rate. */
+	ESoundRate7350Hz,
+	/** 8KHz sample rate. */
+	ESoundRate8000Hz,
+	/** 8.82KHz sample rate. */
+	ESoundRate8820Hz,
+	/** 9.6KHz sample rate. */
+	ESoundRate9600Hz,
+	/** 11.025KHz sample rate. */
+	ESoundRate11025Hz,
+	/** 12KHz sample rate. */
+	ESoundRate12000Hz,
+	/** 14.7KHz sample rate. */
+	ESoundRate14700Hz,
+	/** 16KHz sample rate. */
+	ESoundRate16000Hz,
+	/** 22.05KHz sample rate. */
+	ESoundRate22050Hz,
+	/** 24KHz sample rate. */
+	ESoundRate24000Hz,
+	/** 29.4KHz sample rate. */
+	ESoundRate29400Hz,
+	/** 32KHz sample rate. */
+	ESoundRate32000Hz,
+	/** 44.1KHz sample rate. */
+	ESoundRate44100Hz,
+	/** 48KHz sample rate. */
+	ESoundRate48000Hz
+	};
+
+/**
+Enumeration of possible sound encoding formats. @see TCurrentSoundFormatV02.
+*/
+enum TSoundEncoding
+	{
+	/** 8bit PCM encoding format. */
+	ESoundEncoding8BitPCM,
+	/** 16bit PCM encoding format. */
+	ESoundEncoding16BitPCM,
+	/** 24bit PCM encoding format. */
+	ESoundEncoding24BitPCM
+	};
+	
+/**
+Enumeration of possible sound data formats. @see TCurrentSoundFormatV02.
+*/
+enum TSoundDataFormat
+	{
+	/** The device supports an interleaved data format. */ 
+	ESoundDataFormatInterleaved,
+	/** The device supports a non-interleaved data format. */
+	ESoundDataFormatNonInterleaved
+	};	
+	
+/**
+The general driver capabilites class - returned by the LDD factory in response to RDevice::GetCaps().
+*/
+class TCapsSoundScV01
+	{
+public:
+	TVersion iVersion;
+	};
+
+/**
+The main audio capabilities class. This is used by the LDD to get either the play or record capabilities
+of a particular sound device once a channel to it has been opened.
+*/
+class TSoundFormatsSupportedV02
+	{
+public:
+	/** The data transfer direction for this unit: play or record. @see TSoundDirection. */
+	TSoundDirection iDirection;
+	/** The audio channel configurations supported by this unit - a bitfield. */
+	TUint32 iChannels;
+	/** The sample rates supported - a bitfield. */
+	TUint32 iRates;
+	/** The encoding formats supported - a bitfield. */
+	TUint32 iEncodings;
+	/** The data formats supported - a bitfield. */
+	TUint32 iDataFormats;
+	/** The minimum request size that the device can support. All requests to play or record data must be of a
+	length that is a multiple of this value. */
+	TInt iRequestMinSize;
+	/** The logarithm to base 2 of the alignment required for request arguments. All requests to play or
+	record data must specify locations in the shared chunk which conform to this alignment.
+	For example, iRequestAlignment of 1 is 2 byte aligned (2^1), 2 is 4 byte aligned (2^2) etc. */
+	TInt iRequestAlignment;
+	/** Indicates whether this unit is capable of detecting changes in its hardware configuration. */
+	TBool iHwConfigNotificationSupport;
+	/** Reserved field. */
+	TInt iReserved1;
+	};
+typedef TPckgBuf<TSoundFormatsSupportedV02> TSoundFormatsSupportedV02Buf;
+
+/**
+The sound format configuration class. This is used to get and set the current configuration
+of the sound device (both for playing and recording).
+*/
+class TCurrentSoundFormatV02
+	{
+public:
+	/** The audio channel configuration: 1=Mono, 2=Stereo etc. */ 
+	TInt iChannels;
+	/** The sample rate. @see TSoundRate. */
+	TSoundRate iRate;
+	/** The encoding format. @see TSoundEncoding. */
+	TSoundEncoding iEncoding;
+	/** The data format: interleaved, non-interleaved etc. @see TSoundDataFormat. */
+	TSoundDataFormat iDataFormat;
+	/** Reserved field. */
+	TInt iReserved1;
+	};
+typedef TPckgBuf<TCurrentSoundFormatV02> TCurrentSoundFormatV02Buf;
+
+/**
+A flag that can be passed via the 'aFlags' argument of the function RSoundSc::PlayData(). This being
+set signifies that this particular play request is the last one of a series (ie EOF) and therefore an underflow is
+expected after this request completes.
+*/
+const TUint KSndFlagLastSample=0x00000001;
+
+/** Reserved settings used with CustomConfig(). */
+const TInt KSndCustomConfigMaxReserved=0x0FFFFFFF;
+#ifdef _DEBUG
+const TInt KSndCustom_ForceHwConfigNotifSupported=0x00;
+const TInt KSndCustom_CompleteChangeOfHwConfig=0x01;
+const TInt KSndCustom_ForceStartTransferError=0x02;
+const TInt KSndCustom_ForceTransferDataError=0x03;
+const TInt KSndCustom_ForceTransferTimeout=0x04;
+#endif
+
+/** A structure used to assemble arguments for the function RSoundSc::PlayData() and to pass these to the driver. */
+struct SRequestPlayDataInfo
+	{
+	TInt iBufferOffset;
+	TInt iLength;
+	TUint iFlags;
+	};	
+
+#ifndef __KERNEL_MODE__
+typedef TPckgBuf<TTimeIntervalMicroSeconds> TTimeIntervalMicroSecondsBuf;
+#endif
+
+class RSoundSc : public RBusLogicalChannel
+	{
+private:	
+	enum TRequest
+	/**
+	 Asynchronous request types
+	 */
+		{
+		EMsgRequestPlayData,
+		ERequestNotifyChangeOfHwConfig,
+		EMsgRequestMax=3,				// All requests less than this value are handled in the driver DFC thread.
+		ERequestRecordData,
+		ENumRequests,
+		EAllRequests = (1<<ENumRequests)-1
+		};
+		
+	enum TControl
+	/**
+	 Synchronous request types
+	*/
+		{
+		EMsgControlSetAudioFormat,
+		EMsgControlSetBufChunkCreate,
+		EMsgControlSetBufChunkOpen,
+		EMsgControlSetVolume,
+		EMsgControlPause,
+		EMsgControlResume,
+		EMsgControlCancelSpecific,
+		EMsgControlCustomConfig,
+		EControlTimePlayed,
+		EControlTimeRecorded,
+		EMsgControlMax=10,				// All requests less than this value are handled in the driver DFC thread.
+		EControlGetCaps,
+		EControlGetAudioFormat,
+		EControlGetBufConfig,
+		EControlGetVolume,
+		EControlBytesTransferred,
+		EControlResetBytesTransferred,
+		EControlReleaseBuffer
+		};
+	friend class DSoundScLdd;	
+public:
+	/**
+	Get the version number of sound driver interface.
+    @return The sound driver interface version number.
+	*/
+	inline static TVersion VersionRequired();
+
+#ifndef __KERNEL_MODE__
+	/**
+	Open a channel on a specified sound device. This driver allows more than one channel to be opened on each device.
+	@capability MultimediaDD
+	@capability Dependent UserEnvironment Is required when opening a record channel.
+	@param aUnit The unit number of the sound device.
+	@return KErrNone, if successful; KErrPermissionDenied, if process lacks required capabilities
+        	otherwise one of the other system-wide error codes. 
+	*/
+	inline TInt Open(TInt aUnit=KNullUnit);
+	
+	/**
+	Get the capabilities of the sound device.
+	@param aCapsBuf A packaged object which will be filled with the capabilities of the device.
+	@see TSoundFormatsSupportedV02.
+	*/
+	inline void Caps(TDes8& aCapsBuf);
+	
+	/**
+  	Get the current audio format configuration.
+  	@param aFormatBuf A packaged object which will be filled with the audio configuration settings.
+    @see TCurrentSoundFormatV02.
+	*/
+	inline void AudioFormat(TDes8& aFormatBuf);
+	
+	/**
+  	Set the current audio format configuration.
+  	This can't be changed while the driver is currently playing or recording data.
+	@param aFormatBuf A packaged object holding the new audio configuration settings to be used.
+  	@return KErrNone if successful;
+  			KErrInUse if the playing or recording of data is in progress;
+          	KErrNotSupported if any configuration values are invalid;
+		  	otherwise one of the other system-wide error codes.
+	@see TCurrentSoundFormatV02.
+	*/
+	inline TInt SetAudioFormat(const TDesC8& aFormatBuf);
+	
+ 	/**
+  	Get the current buffer configuration.
+	@param aConfigBuf A packaged TSharedChunkBufConfigBase derived object which will be filled with the buffer
+					  configuration settings.
+	@see TSharedChunkBufConfigBase.
+	*/
+ 	inline void GetBufferConfig(TDes8& aConfigBuf);
+ 	
+ 	/**
+  	Set the current buffer configuration - creating a shared chunk.
+  	The driver will create a shared chunk according to the buffer specification supplied (and will commit
+  	memory to it). This will replace any previous shared chunk created by this driver. A handle to
+  	the chunk will then be created for the client thread which will be assigned to the RChunk object supplied
+  	by the client.
+  	The buffer configuration cannot be changed while the driver is currently playing or recording data.
+  	Note that a minimum of three buffers are required when recording: one being loaded with record data by the driver,
+  	another also owned by the driver - queued ready for the next transfer and a third owned by the client for processing.
+  	Note that for record channels, the buffer size specified effectively determines the size of each record request.
+  	Hence, for record channels the buffer size must be a multiple of the minimum request size as specified in the capabilities 
+  	class. @see TSoundFormatsSupportedV02. It should also be a multiple of the number of bytes per audio sample (e.g. a multiple 
+  	of 4 for 2 channels of 16bit PCM).  
+	@param aConfigBuf A packaged TSharedChunkBufConfigBase derived object which must be set with the new buffer configuration
+					  settings to be used. Note that this function will ignore any buffer offset information specified by the 
+					  caller (i.e. setting the flag KScFlagBufOffsetListInUse has no effect).
+	@param aChunk An RChunk object to which the chunk handle will be assigned. 
+  	@return KErrNone if successful;
+  			KErrInUse if the playing or recording of data is in progress;
+          	KErrArgument if any configuration values are invalid;
+          	KErrNoMemory if the driver failed to allocate memory for the shared chunk specified;
+		  	otherwise one of the other system-wide error codes.
+	@see TSharedChunkBufConfigBase.
+	*/
+ 	inline TInt SetBufferChunkCreate(const TDesC8& aConfigBuf,RChunk& aChunk);
+ 	
+ 	/**
+  	Set the current buffer configuration - using an existing shared chunk.
+  	The client supplies an existing shared chunk which is to be used by the driver as the play or record buffer. 
+  	Any shared chunk previously created by the driver will be closed by it.
+  	The buffer configuration cannot be changed while the driver is currently playing or recording data.
+  	See RSoundSc::SetBufferChunkCreate for details on the buffer configuration setting necessary for playback or record.
+	@param aConfigBuf A packaged TSharedChunkBufConfigBase derived object which must be set with the buffer configuration
+					  settings of the chunk supplied. This must include buffer offset information (i.e. the flag 
+					  KScFlagBufOffsetListInUse must be set).
+	@param aChunk A handle to the shared chunk which is to be used as the play or record buffer. (This must
+				  be a valid handle for the calling thread).
+  	@return KErrNone if successful;
+  			KErrInUse if the playing or recording of data is in progress;
+          	KErrArgument if any configuration values are invalid;
+		  	otherwise one of the other system-wide error codes.
+	@see TSharedChunkBufConfigBase.
+	*/
+ 	inline TInt SetBufferChunkOpen(const TDesC8& aConfigBuf,RChunk& aChunk);
+ 	
+ 	/**
+  	Get the current play volume or record level.
+	@return The current play volume / record level - 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.
+	*/
+	inline TInt Volume();
+	
+	/**
+	Set the current play volume or record level. The volume can be altered while the driver is in the process
+	of playing or recording data.
+	@param aVolume The play volume / 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;
+          	KErrArgument if the specified volume is out of range;
+		  	otherwise one of the other system-wide error codes.
+	*/
+	inline TInt SetVolume(TInt aVolume);
+	
+	/**
+	Submit a request to play (write data) to the sound device from a buffer.
+  	The buffer must be contained within the driver's shared chunk. A single play request may not span more than one
+  	buffer even if two or more buffers are contiguous within the shared chunk.
+  	The driver will allow more than one play request to be pending at any time. It will
+  	process requests in FIFO order. This is an asynchronous operation with the driver completing the request and
+  	returning the request status once all the specified data has been delivered to the sound device. The driver
+  	will return a request status of KErrUnderflow each time it completes the last pending play request unless this
+  	request was marked with the KSndFlagLastSample flag. If this flag is set, the driver will return
+  	KErrNone in this situation. Therefore when it is required to play uninterrupted audio by issuing a series of play
+  	requests, the client should mark the last play request using this flag.
+	@param aStatus 		 The request status which is signalled when all of the specified data has been transferred to
+						 the sound device (or when an error occurs). Possible values:
+								KErrNone:	   if all the specified data was successfully transferred and no underflow
+											   occured following this transfer (or if an underflow occurred but the
+											   request was marked with the KSndFlagLastSample flag);
+								KErrUnderflow: if data underflow occurred during or immediately following the transfer;
+								otherwise one of the system-wide error codes.
+	@param aBufferOffset Offset from the beginning of the shared chunk for the start of data to be played. This must be
+						 aligned to a value conforming to the iRequestAlignment member of the capabilities structure.
+						 @see TSoundFormatsSupportedV02.
+  	@param aLength 		 Number of bytes of data to be played. This must be a multiple of the minimum request size as
+  						 specified in the capabilities class. @see TSoundFormatsSupportedV02. It should also be a multiple
+  						 of the number of bytes per audio sample (e.g. a multiple of 4 for 2 channels of 16bit PCM).
+  	@param aFlags 		 Play request flags. Use KSndFlagLastSample to mark the last play request in a series of play
+  						 requests.
+	@pre The buffer must have been previously initialised by a call to SetBufferChunkN().
+	*/
+	inline void PlayData(TRequestStatus& aStatus,TInt aBufferOffset,TInt aLength,TUint aFlags=0);
+	
+	/**
+	Get the next available record buffer. More than one request may be pending at any time. This is an asynchronous
+	operation. If the driver is not already recording then the issuing of this request will start the capturing of
+	record data from the sound device into a record buffer.
+	@param aStatus	The request status which is signalled when buffer is available (or an error occurs). If
+					the request is successful then this result value is set to the offset within the shared chunk
+					where the buffer resides. Alternatively, if an error occurs, it will be set to one of
+					the system wide error values. These include:
+					KErrInUse: if the client needs to free up record buffers;
+					KErrOverflow: if it was necessary for the driver to over-write unread record data since the
+								  last record request;
+					KErrCancel: if the device is paused and there is no un-read record data available.			  
+					otherwise one of the system-wide error codes.
+  	@param aLength	On return, this contains the number of record bytes successfully stored in the buffer. 
+	@pre The record buffer must have been previously initialised by a call to SetBufferChunkN().
+	*/
+	inline void RecordData(TRequestStatus& aStatus, TInt& aLength);
+	
+	/**
+	Release a record buffer - making it available again for the driver to record into.
+	@param aChunkOffset: The chunk offset of the image to be released. This is the value that was returned by the
+						 RecordData() request when the buffer was claimed by the client.
+	@return KErrNone: if successful;
+			KErrNotFound: if the chunk offset is invalid;
+			otherwise one of the system-wide error codes.
+	*/
+	inline TInt ReleaseBuffer(TInt aChunkOffset);
+	
+	/**
+	Cancel all outstanding play requests.
+	This immediately stops the driver playing data and all outstanding play requests are completed with KErrCancel.
+	*/
+	inline void CancelPlayData();
+	
+	/**
+	Cancel all outstanding record requests.
+	This immediately stops the driver from capturing record data and all outstanding record requests are completed
+	with KErrCancel.
+	*/
+	inline void CancelRecordData();
+	
+	/**
+	Cancel a specific record or play request.
+	The outstanding request completes with KErrCancel.
+	@param aStatus The request status object associated with the request to be cancelled.
+	*/			   
+	inline void Cancel(const TRequestStatus& aStatus);
+	
+	/**
+	For a play back units, this method returns the number of bytes delivered to the sound device hardware. For
+	recording units, this method returns the number of bytes read from the sound device hardware. This is the
+	count since the driver was opened or since the last ResetBytesTransferred() command was issued.	
+	@return The number of bytes transferred.
+	@see ResetBytesTransferred()
+	*/
+	inline TInt BytesTransferred();
+	
+	/**
+	Reset the count of the number of bytes transferred by the sound device..
+	@see BytesTransferred().
+	*/
+	inline void ResetBytesTransferred();
+	
+	/**
+	Halt the playing or recording of data from the sound device.
+	Playing or recording can be resumed using Resume().
+	If an incomplete play request is outstanding when the device is paused, this request does not complete as a 
+	result. Resuming play operation following a pause will cause the driver to re-commence playing data from the 
+	next sample following the last one played - even of this is part way through a play buffer.
+	However, if an incomplete record request is outstanding when recording is paused, this will be completed immediately
+	as a result. Typically this will be a partially filled record buffer and the number of valid bytes in the buffer are
+	indicated via the length argument of the RecordData() method. The client should release this buffer in the normal
+	way in order to make it available again to the driver when recoding is resumed. Any other outstanding record
+	requests are completed immediately when recording is halted with a return value of KErrCancel. Likewise, record 
+	requests received after the device has been paused will complete immediately in the same way - either successfully
+	if un-read data is available or KErrCancel if not. The device must be resumed before it can be primed to capture a
+	new record buffer. The driver will capture no record data while it is in the paused state. If recording is resumed,
+	the driver will begin storing the received data from the beginning of its next available record buffer.
+	@return KErrNone if successful;
+  			KErrNotReady: if the driver is not currently playing or recording;
+		  	otherwise one of the other system-wide error codes.
+	@see Resume()
+	*/
+	inline TInt Pause();
+	
+	/**
+	Allow the sound device to resume playing or recording data.
+	This is used resume the operation of the driver following a earlier Pause() command to pause play or record.
+	@return KErrNone if successful;
+  			KErrNotReady: if the driver is not currently paused;
+		  	otherwise one of the other system-wide error codes.
+	@see Pause()
+	*/
+	inline TInt Resume();
+	
+	/**
+	Register for notification of a change in the hardware configuration of the device.
+	This is an asynchronous operation. Only one request of this type can be outstanding per driver channel.
+	@param aStatus The request status which is signalled when a change in hardware configuration occurs. Possible
+		values returned:
+			KErrNotSupported: The unit cannot detect changes in configuration;
+			KErrInUse: A notification request is already outstanding for this driver channel.
+			KErrNone: A normal change in hardware configuration has occured;
+			otherwise one of the other system-wide error codes.
+	@param aHeadsetPresent On return, this is set to ETrue if the unit is connected to a microphone or headset socket and
+		this is now present. Otherwise it returns EFalse.
+	*/
+	inline void NotifyChangeOfHwConfig(TRequestStatus& aStatus,TBool& aHeadsetPresent);
+
+	/**
+	Cancel a request for notification of a change in the hardware configuration.
+	This results in a pending request being completed immediately with KErrCancel.
+	*/
+	inline void CancelNotifyChangeOfHwConfig();
+	
+	/**
+	Issue a custom configuration request.
+	@param aFunction A number identifying the request. (Values below 0x10000000 are reserved).
+	@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.
+	*/
+	inline TInt CustomConfig(TInt aFunction,TAny* aParam=NULL);
+
+	/**
+	Calculates and returns the number of microseconds of data played since the start of playback.  If playback ends or
+	if CancelPlayData() is called, this number will be reset.
+	@param aTimePlayed A packaged TTimeIntervalMicroSecondsBuf into which to place the number of microseconds played.
+	@return	KErrNone if successful.
+			KErrNotSupported if unit is not open for playback.
+			Otherwise one of the other system wide error codes.
+	*/
+	inline TInt TimePlayed(TTimeIntervalMicroSecondsBuf& aTimePlayed);
+
+	/**
+	Calculates and returns the number of microseconds of data recorded since the start of record.  If recording ends or
+	if CancelRecord() is called, this number will be reset.
+	@param aTimeRecorded A packaged TTimeIntervalMicroSecondsBuf into which to place the number of microseconds played.
+	@return	KErrNone if successful.
+			KErrNotSupported if unit is not open for recording.
+			Otherwise one of the other system wide error codes.
+	*/
+	inline TInt TimeRecorded(TTimeIntervalMicroSecondsBuf& aTimeRecorded);
+
+#endif	// __KERNEL_MODE__
+	};
+
+#include <d32soundsc.inl>
+
+#endif // __D32SOUNDSC_H__
+