os/mm/devsound/a3fdevsound/src/mmfdevsound/sounddevicebody.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /*
     2 * Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description:
    15 *
    16 */
    17 
    18 
    19 
    20 #ifndef SOUNDDEVICEBODY_H
    21 #define SOUNDDEVICEBODY_H
    22 
    23 //  INCLUDES
    24 #include <mmf/server/sounddevice.h>
    25 #include "mmfdevsoundproxy.h"
    26 #include <mmf/server/mmfdevsoundcustominterfacesupport.h>
    27 #include <mmf/server/mmfdevsoundcustominterface.h>
    28 #include <a3f/mmfdevsoundcustominterfaceextensions.h>
    29 #include "MmfDevSoundCIMuxUtility.h"
    30 
    31 /**
    32 *  This is the Body for CMMFDevSound.
    33 *
    34 *  @lib MMFDevSound.lib
    35 */
    36 
    37 NONSHARABLE_CLASS( CMMFDevSound::CBody ) : public CBase,
    38 										   public MMMFDevSoundCancelInitialize,
    39 										   public MMMFDevSoundCustomInterfaceChannel,
    40 										   public MMMFDevSoundCustomInterfaceObserver,
    41 										   public MMMFDevSoundEmptyBuffers,
    42 										   public MAutoPauseResumeSupport,
    43 										   public MMMFDevSoundTimePlayed,
    44 										   public MMMFDevSoundQueryIgnoresUnderflow,
    45 										   public MAudioClientThreadInfo, 
    46 										   public MMMFDevSoundTruePause
    47 
    48 	{
    49 public:  // Constructors and destructor
    50 
    51 	/**
    52 	* Factory function - returning instance of the class.
    53 	*/
    54 	static CBody* NewL();
    55 
    56 	/**
    57 	* Destructor.
    58 
    59 	* Deletes all objects and releases all resources owned by this
    60 	* instance.
    61 	*/
    62 	~CBody();
    63 
    64 	/**
    65 	* Initializes to raw audio data PCM16 and Sampling Rate of 8 KHz.
    66 	* On completion of Initialization, calls InitializeComplete() on
    67 	* aDevSoundObserver.
    68 	* @param aDevSoundObserver. A reference to DevSound observer instance.
    69 	* @param aMode. Mode for which this object will be used.
    70 	*/
    71 	void InitializeL(MDevSoundObserver& aDevSoundObserver,
    72 	                 TMMFState aMode);
    73 
    74 	/**
    75 	* Initializes DevSound object for the mode aMode for processing audio
    76 	* data with hardware device supporting FourCC aDesiredFourCC.
    77 	* @param  aDevSoundObserver. A reference to DevSound observer instance.
    78 	* @param  aDesiredFourCC. The CMMFHwDevice implementation FourCC code.
    79 	* @param  aMode. The mode for which this object will be used
    80 	*/
    81 	void InitializeL(MDevSoundObserver& aDevSoundObserver,
    82 	                 TFourCC aDesiredFourCC,
    83 	                 TMMFState aMode);
    84 
    85 	/**
    86 	* Returns the supported Audio settings ie. encoding, sample rates,
    87 	* mono/stereo operation, buffer size etc..
    88 	* @return TMMFCapabilities. The device settings.
    89 	*/
    90 	inline TMMFCapabilities Capabilities();
    91 
    92 	/**
    93 	* Returns the current device configuration.
    94 	* @return TMMFCapabilities. The device settings.
    95 	*/
    96 	inline TMMFCapabilities Config() const;
    97 
    98 	/**
    99 	* Configure CMMFDevSound object with the settings in aConfig. Use this
   100 	* to set sampling rate, encoding and mono/stereo.
   101 	* @param aConfig. The attribute values to which CMMFDevSound object will be configured to.
   102 	*/
   103 	inline void SetConfigL(const TMMFCapabilities& aCaps);
   104 
   105 	/**
   106 	* Returns an integer representing the maximum volume device supports.
   107 	* This is the maximum value which can be passed to
   108 	* CMMFDevSound::SetVolume.
   109 	* @return TInt The maximum volume. This value is platform dependent but is always greater than or equal to one.
   110 	*/
   111 	inline TInt MaxVolume();
   112 
   113 	/**
   114 	* Returns an integer representing the current volume.
   115 	* @return TInt The current volume level.
   116 	*/
   117 	inline TInt Volume();
   118 
   119 	/**
   120 	* Changes the current playback volume to a specified value. The volume
   121 	* can be changed before or during playback and is effective immediately.
   122 	* @param aVolume. The volume setting. This can be any value from 0
   123 	*        to the value returned by a call to
   124 	*        CMMFDevSound::MaxVolume(). If the volume is not
   125 	*        within this range, the volume is automatically set
   126 	*        to minimum or maximum value based on the value
   127 	*        that is being passed. Setting a zero value mutes
   128 	*        the sound. Setting the maximum value results in
   129 	*        the loudest possible sound.
   130 	*/
   131 	inline void SetVolume(TInt aVolume);
   132 
   133 	/**
   134 	* Returns an integer representing the maximum gain the device supports.
   135 	* This is the maximum value which can be passed to CMMFDevSound::SetGain
   136 	* @return TInt The maximum gain. This value is platform dependent but is
   137 	*        always greater than or equal to one.
   138 	*/
   139 	inline TInt MaxGain();
   140 
   141 	/**
   142 	* Returns an integer representing the current gain.
   143 	* @return TInt The current gain level.
   144 	*/
   145 	inline TInt Gain();
   146 
   147 	/**
   148 	* Changes the current recording gain to a specified value. The gain can
   149 	* be changed before or during recording and is effective immediately.
   150 	* @param aGain. The gain setting. This can be any value from zero to
   151 	*        the value returned by a call to
   152 	*        CMMFDevSound::MaxGain(). If the volume
   153 	*        is not within this range, the gain is automatically
   154 	*        set to minimum or maximum value based on the value
   155 	*        that is being passed. Setting a zero value mutes the
   156 	*        sound. Setting the maximum value results in the
   157 	*        loudest possible sound.
   158 	*/
   159 	inline void SetGain(TInt aGain);
   160 
   161 	/**
   162 	* Returns the speaker balance set for playing.
   163 	* @param aLeftPercentage. On return contains the left speaker volume percentage.
   164 	* @param aRightPercentage. On return contains the right speaker volume percentage.
   165 	*/
   166 	inline void GetPlayBalanceL(TInt& aLeftPercentage,TInt& aRightPercentage);
   167 
   168 	/**
   169 	* Sets the speaker balance for playing. The speaker balance can be
   170 	* changed before or during playback and is effective immediately.
   171 	* @param aLeftPercentage. The left speaker volume percentage. This
   172 	*        can be any value from zero to 100. Setting
   173 	*        a zero value mutes the sound on left
   174 	*        speaker.
   175 	* @param aRightPercentage. The right speaker volume percentage.
   176 	*        This can be any value from zero to 100.
   177 	*        Setting a zero value mutes the sound on
   178 	*        right speaker.
   179 	*/
   180 	inline void SetPlayBalanceL(TInt aLeftPercentage,
   181 	                            TInt aRightPercentage);
   182 
   183 	/**
   184 	* Returns the microphone gain balance set for recording.
   185 	* @param aLeftPercentage On return contains the left microphone
   186 	*        gain percentage.
   187 	* @param aRightPercentage On return contains the right microphone
   188 	*        gain percentage.
   189 	*/
   190 	inline void GetRecordBalanceL(TInt& aLeftPercentage, TInt& aRightPercentage);
   191 
   192 	/**
   193 	* Sets the microphone balance for recording. The microphone balance can
   194 	* be changed before or during recording and is effective immediately.
   195 	* @param aLeftPercentage. The left microphone gain percentage. This
   196 	*        can be any value from zero to 100. Setting
   197 	*        a zero value mutes the sound from left
   198 	*        microphone.
   199 	* @param aRightPercentage. The right microphone gain percentage.
   200 	*        This can be any value from zero to 100.
   201 	*        Setting a zero value mutes the sound from
   202 	*        right microphone.
   203 	*/
   204 	inline void SetRecordBalanceL(TInt aLeftPercentage,
   205 	                              TInt aRightPercentage);
   206 
   207 	/**
   208 	* Initializes the audio device and starts the play process. This
   209 	* function queries and acquires the audio policy before initializing
   210 	* audio device. If there was an error during policy initialization,
   211 	* PlayError() function will be called on the observer with error code
   212 	* KErrAccessDenied, otherwise BufferToBeFilled() function will be called
   213 	* with a buffer reference. After reading data into the buffer reference
   214 	* passed, the client should call PlayData() to play data.
   215 	* The amount of data that can be played is specified in
   216 	* CMMFBuffer::RequestSize(). Any data that is read into buffer beyond
   217 	* this size will be ignored.
   218 	*/
   219 	inline void PlayInitL();
   220 
   221 	/**
   222 	* Initializes the audio device and starts the record process. This
   223 	* function queries and acquires the audio policy before initializing
   224 	* audio device. If there was an error during policy initialization,
   225 	* RecordError() function will be called on the observer with error code
   226 	* KErrAccessDenied, otherwise BufferToBeEmptied() function will be
   227 	* called with a buffer reference. This buffer contains recorded or
   228 	* encoded data. After processing data in the buffer reference passed,
   229 	* the client should call RecordData() to continue recording process.
   230 	* The amount of data that is available is specified in
   231 	* CMMFBuffer::RequestSize().
   232 	*/
   233 	inline void RecordInitL();
   234 
   235 	/**
   236 	* Plays data in the buffer at the current volume.
   237 	* The client should fill the buffer with audio data before calling this
   238 	* function. The observer gets a reference to the buffer along with the
   239 	* callback function BufferToBeFilled(). When playing of the audio sample
   240 	* is complete, successfully or otherwise, the function PlayError() on
   241 	* the observer is called.
   242 	* The last buffer of the audio stream being played should have the last
   243 	* buffer flag set using CMMFBuffer::SetLastBuffer(TBool). If a
   244 	* subsequent attempt to play the clip is made, this flag will need
   245 	* resetting by the client.
   246 	*/
   247 	inline void PlayData();
   248 
   249 	/**
   250 	* Contine the process of recording.
   251 	* Once the buffer is filled with recorded data, the Observer gets a
   252 	* reference to the buffer along with the callback function
   253 	* BufferToBeEmptied(). After processing the buffer (copying over to a
   254 	* different buffer or writing to file) the client should call this
   255 	* function to continue the recording process.
   256 	*/
   257 	inline void RecordData();
   258 
   259 	/**
   260 	* Stops the ongoing operation (Play, Record, TonePlay).
   261 	*/
   262 	inline void Stop();
   263 
   264 	/**
   265 	* Temporarily Stops the ongoing operation (Play, Record, TonePlay).
   266 	*/
   267 	inline void Pause();
   268 
   269 	/**
   270 	* Returns the Sample recorded so far
   271 	* @return TInt Returns the samples recorded.
   272 	*/
   273 	inline TInt SamplesRecorded();
   274 
   275 	/**
   276 	* Returns the Sample played so far
   277 	* @return TInt Returns the samples played.
   278 	*/
   279 	inline TInt SamplesPlayed();
   280 
   281 	/**
   282 	* Initializes the audio device and starts playing a tone. The tone is
   283 	* played with the frequency and duration specified.
   284 	* Leaves on failure.
   285 	* @param aFrequency. The frequency at which the tone will be played.
   286 	* @param const TTimeIntervalMicroSeconds &aDuration The period over
   287 	*        which the tone will be played. A zero value causes the no tone
   288 	*        to be played.
   289 	*/
   290 	inline void PlayToneL(TInt aFrequency, const TTimeIntervalMicroSeconds& aDuration);
   291 
   292 	/**
   293 	* Initializes audio device and starts playing a dual tone. Dual Tone is
   294 	* played with the specified frequencies and for the specified duration.
   295 	* @param aFrequencyOne The first frequency of dual tone.
   296 	* @param aFrequencyTwo The second frequency of dual tone.
   297 	* @param aDuration The period over which the tone will be played. 
   298 	* A zero value causes the no tone to be played.
   299 	*/
   300 	inline void PlayDualToneL(
   301 	            TInt aFrequencyOne,
   302 	            TInt aFrequencyTwo,
   303 	            const TTimeIntervalMicroSeconds& aDuration);
   304 
   305 	/**
   306 	* Initializes the audio device and starts playing the DTMF string
   307 	* aDTMFString.
   308 	* @param aDTMFString The DTMF sequence in a descriptor.
   309 	*/
   310 	inline void PlayDTMFStringL(const TDesC& aDTMFString);
   311 
   312 	/**
   313 	* Initializes the audio device and starts playing a tone sequence.
   314 	* @param aData The tone sequence in a descriptor.
   315 	*/
   316 	inline void PlayToneSequenceL(const TDesC8& aData);
   317 
   318 	/**
   319 	* Defines the number of times the audio is to be repeated during the
   320 	* tone playback operation. A period of silence can follow each playing
   321 	* of a tone. The tone playing can be repeated indefinitely
   322 	* @param aRepeatCount. The number of times the tone, together with
   323 	*        the trailing silence, is to be repeated. If this is set to
   324 	*        KMdaRepeatForever, then the tone, together with the trailing
   325 	*        silence, is repeated indefinitely or until Stop() is called.
   326 	*        If this is set to zero, then the tone is not repeated.
   327 	* @param aRepeatTrailingSilence An interval of silence which will be played after each tone.
   328 	*        Supported only during tone playing.
   329 	*/
   330 	inline void SetToneRepeats(
   331 	            TInt aRepeatCount,
   332 	            const TTimeIntervalMicroSeconds& aRepeatTrailingSilence);
   333 
   334 	/**
   335 	* Defines the duration of tone on, tone off and tone pause to be used
   336 	* during the DTMF tone playback operation.
   337 	* Supported only during tone playing.
   338 	* @param aToneOnLength The period over which the tone will be played.
   339 	* If this is set to zero, then the tone is not played.
   340 	* @param aToneOffLength The period over which the no tone will be played.
   341 	* @param aPauseLength The period over which the tone playing will be paused.
   342 	*/
   343 	inline void SetDTMFLengths(
   344 	            TTimeIntervalMicroSeconds32& aToneOnLength,
   345 	            TTimeIntervalMicroSeconds32& aToneOffLength,
   346 	            TTimeIntervalMicroSeconds32& aPauseLength);
   347 
   348 	/**
   349 	* Defines the period over which the volume level is to rise smoothly
   350 	* from nothing to the normal volume level.
   351 	* The function is only available before playing.
   352 	* @param aRampDuration The period over which the volume is to rise. 
   353 	* 	 A zero value causes the tone sample to be played at the 
   354 	* 	 normal level for the full duration of the playback. 
   355 	* 	 A value, which is longer than the duration of
   356 	*        the tone sample means that the sample never reaches its normal
   357 	*        volume level.
   358 	*/
   359 	inline void SetVolumeRamp(
   360 	            const TTimeIntervalMicroSeconds& aRampDuration);
   361 
   362 	/**
   363 	* Defines the priority settings that should be used for this instance.
   364 	* @param aPrioritySettings. A class type representing the client's priority, 
   365 	* priority preference and state
   366 	*/
   367 	inline void SetPrioritySettings(
   368 	            const TMMFPrioritySettings& aPrioritySettings);
   369 
   370 	/**
   371 	* Retrieves a custom interface to the device.
   372 	* @param aInterfaceId. The interface UID, defined with the custom
   373 	*        interface.
   374 	* @return TAny* A pointer to the interface implementation, or NULL if
   375 	*        the device does not implement the interface requested. The
   376 	*        return value must be cast to the correct type by the user.
   377 	*/
   378 	TAny* CustomInterface(TUid aInterfaceId);
   379 
   380 	/**
   381 	* Returns a list of the supported input datatypes that can be sent to
   382 	* DevSound for playing audio. The datatypes returned are those that the
   383 	* DevSound supports given the priority settings passed in
   384 	* aPrioritySettings. Note that if no supported data types are found this
   385 	* does not constitute failure, the function will return normally with no
   386 	* entries in aSupportedDataTypes.
   387 	* @param aSupportedDataTypes The array of supported
   388 	*        data types that will be filled in by this function. The
   389 	*        supported data types of the DevSound are in the form of an
   390 	*        array of TFourCC codes. Any existing entries in the array will
   391 	*        be overwritten on calling this function. If no supported data
   392 	*        types are found given the priority settings, then the
   393 	*        aSupportedDatatypes array will have zero entries.
   394 	* @param aPrioritySettings The priority settings used to determine the 
   395 	* 	 supported datatypes. Note this does not set the priority settings. 
   396 	* 	 For input datatypes the iState member of the priority settings would 
   397 	* 	 be expected to be either EMMFStatePlaying or EMMFStatePlayingRecording.
   398 	* 	 The priority settings may effect the supported datatypes depending
   399 	*        on the audio routing.
   400 	*/
   401 	inline void GetSupportedInputDataTypesL(
   402 	            RArray<TFourCC>& aSupportedDataTypesconst,
   403 	            const TMMFPrioritySettings& aPrioritySettings) const;
   404 
   405 	/**
   406 	* Returns a list of the supported output dataypes that can be received
   407 	* from DevSound for recording audio. The datatypes returned are those
   408 	* that the DevSound supports given the priority settings passed in
   409 	* aPrioritySettings. Note that if no supported data types are found this
   410 	* does not constitute failure, the function will return normally with no
   411 	* entries in aSupportedDataTypes.
   412 	* @param aSupportedDataTypes. The array of supported
   413 	*        data types that will be filled in by this function. The
   414 	*        supported datatypes of the DevSound are in the form of an array
   415 	*        of TFourCC codes. Any existing entries in the array will be
   416 	*        overwritten on calling this function. If no supported datatypes
   417 	*        are found given the priority settings, then the
   418 	*        aSupportedDatatypes array will have zero entries.
   419 	* @param aPrioritySettings. The priority settings used to determine the supported 
   420 	*        data types. Note this does not set the priority settings. For output data types the
   421 	*        iState member of the priority settings would expected to be
   422 	*        either EMMFStateRecording or EMMFStatePlayingRecording. The
   423 	*        priority settings may effect the supported datatypes depending
   424 	*        on the audio routing.
   425 	*/
   426 	inline void GetSupportedOutputDataTypesL(
   427 	            RArray<TFourCC>& aSupportedDataTypes,
   428 	            const TMMFPrioritySettings& aPrioritySettings) const;
   429 	            
   430 	/** 
   431 	Registers the client for notification of resource avalibility.
   432 
   433 	@param  aEventType
   434 	        The Notification event type for which the client needs notification.
   435 	@param  aNotificationRegistrationData
   436 	        The Notification Registration data has been reserved for future use and its value should be always NULL
   437 	@return An error code indicating if the function call was successful. KErrNone on success, 
   438 			KErrNotSupported if the event type is not supported, KErrArgument if the notification data
   439 			is not null otherwise another of the system-wide error codes.
   440 	*/
   441 	inline TInt RegisterAsClient(TUid aEventType, const TDesC8& aNotificationRegistrationData = KNullDesC8);
   442 
   443 	/**
   444 	Cancels the Registered Notification.
   445 
   446 	@param  aEventType. The Event type need to cancel
   447 	@return An error code indicating if the function call was successful. KErrNone on success, KErrNotSupported
   448 			if the event type is not supported otherwise another of the system-wide error codes.
   449 	*/	
   450 	inline TInt CancelRegisterAsClient(TUid aEventType);
   451 
   452 	/**
   453 	Returns the Notification data which the client needs to resume playing.
   454 
   455 	@param aEventType. The Event type for which to get notification data  
   456 	@param aNotificationData
   457 			The reference data for which the client needs to resume the play. The actual data depends on the event type.
   458 			Note that for the event type 'KMMFEventCategoryAudioResourceAvailable' the package buffer returned
   459 			is TMMFTimeIntervalMicroSecondsPckg,but the contents should be converted to an integer and
   460 			interpreted as the data returned is samples played ,but not as a microsecond value.
   461 	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
   462 	        another of the system-wide error codes.
   463 	*/
   464 	inline TInt GetResourceNotificationData(TUid aEventType,TDes8& aNotificationData);
   465 
   466 	/**
   467 	Wait for the clients to resume play back even after the default timeout expires.
   468 	Unless the client cancels the notification request or completes no other client gets
   469 	notification.
   470 
   471 	@return An error code indicating if the function call was successful. KErrNone on success, 
   472 	        otherwise another of the system-wide error codes.
   473 	*/
   474 	inline TInt WillResumePlay();
   475 
   476 	/**
   477 	Empties the play buffers below DevSound without causing the codec to be deleted.
   478 
   479 	@return An error code indicating if the function call was successful. KErrNone on success,
   480 			KErrNotSupported if called in a mode other than EMMFStatePlaying or if the function is otherwise not supported,
   481 			KErrNotReady if this is called before playing,
   482 			otherwise another of the system-wide error codes.
   483 			If this function is not supported, it is advised to use Stop().
   484 	*/
   485 	inline TInt EmptyBuffers();
   486 	
   487 	//from MMMFDevSoundCancelInitialize
   488 	/** 
   489 		
   490 	Cancels the initialization process of a CMMFDevSound object
   491 
   492 	@return An error code indicating if the function call was successful. 
   493 			KErrNone on success,
   494 			KerrNotReady if this is called before InitializeL() call or after      
   495 			the object has been initialized 
   496 	*/
   497 	inline TInt CancelInitialize();
   498 
   499 	// from MMMFDevSoundCustomInterfaceChannel
   500 	/**
   501 	Implements a synchronous custom command
   502 	@param aUid
   503 		   The UID of the custom command
   504 	@param aParam1
   505 		   A buffer of data to be supplied to the receiver
   506 	@param aParam2
   507 		   A buffer of data to be supplied to the receiver
   508 	@param aOutParam
   509 		   A buffer that will be written into by the receiver
   510 		   and returned to the client
   511 	@return the result of the custom command
   512 	 */
   513 	TInt SyncCustomCommand(TUid aUid, const TDesC8& aParam1, const TDesC8& aParam2, TDes8* aOutParam);
   514 
   515 	/**
   516 	Implements an asynchronous custom command
   517 	@param aUid
   518 		   The UID of the custom command
   519 	@param aStatus
   520 		   The request status of the active object that
   521 		   will be called upon the completion of the request
   522 	@param aParam1
   523 		   A buffer of data to be supplied to the receiver
   524 	@param aParam2
   525 		   A buffer of data to be supplied to the receiver
   526 	@param aOutParam
   527 		   A buffer that will be written into by the receiver
   528 		   and returned to the client
   529 	 */
   530 	void AsyncCustomCommand(TUid aUid, TRequestStatus& aStatus, const TDesC8& aParam1, const TDesC8& aParam2, TDes8* aOutParam);
   531 
   532 	//from MMMFDevSoundCustomInterfaceObserver
   533 	void CloseCustomInterface(TInt aInterfaceId);
   534 
   535 	//from MMMFDevSoundTimePlayed
   536 	TInt GetTimePlayed(TTimeIntervalMicroSeconds& aTime);
   537 	
   538 	//MMMFDevSoundQueryIgnoresUnderflow
   539 	TBool QueryIgnoresUnderflow();
   540 	
   541 	// Set the real client thread with thread Id
   542 	TInt SetClientThreadInfo(TThreadId aTid);
   543 
   544 	// from MMMFDevSoundTruePause
   545 	TBool IsResumeSupported();
   546 	TInt Resume();
   547 protected:
   548 
   549 	/**
   550 	* Constructor
   551 	*/
   552 	CBody();
   553 
   554 	/**
   555 	* Symbian constructor
   556 	*/
   557 	void ConstructL();
   558 
   559 	TInt FindCustomInterface(TUid aInterfaceId);
   560 
   561 	// custom interface storage
   562 	RArray<TMMFDevSoundCustomInterfaceData> iCustomInterfaceArray;
   563 	CMMFDevSoundCIMuxUtility* iMuxUtility;
   564 	// Reference to DevSound proxy
   565 	RMMFDevSoundProxy* iDevSoundProxy;
   566 	// CI Extension
   567 	MDevSoundCIClientExtension* iCIExtension;
   568 	};
   569 
   570 #include "sounddevicebody.inl"
   571 
   572 #endif // SOUNDDEVICEBODY_H
   573 
   574 // End of File