devsound/devsoundrefplugin/src/platsec/server/AudioServer/MmfDevSoundSessionBody.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devsound/devsoundrefplugin/src/platsec/server/AudioServer/MmfDevSoundSessionBody.h Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,361 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+// DevSoundSessionBody.h
+//
+//
+
+#ifndef MMFDEVSOUNDSESSIONBODY_H
+#define MMFDEVSOUNDSESSIONBODY_H
+
+#include <e32base.h>
+#include <mmf/server/mmfhwdevice.h>
+#include "MmfDevSoundSession.h"
+#include "MmfDevSoundSessionXtnd.h"
+#include "ToneGenerator.h"
+#include "mmfAudioPolicyProxy.h"
+#include "MmfDevSoundInfo.h"
+#include "DevSoundUtility.h"
+
+#ifdef SYMBIAN_MDF_SHAREDCHUNK_SOUNDDRIVER
+ #include "mdasoundadapter.h"
+#else
+ #include <mdasound.h>
+#endif
+
+#include <mmf/server/devsoundstandardcustominterfaces.h>
+
+//controlls buffer sizes
+const TInt KDevSoundDefaultFrameSize = 0x1000;
+const TInt KDevSoundMinFrameSize = 0x800; //2K
+const TInt KDevSoundMaxFrameSize = 0x4000; //16K
+const TInt KDevSoundDeltaFrameSize = 0x800; //2K
+const TInt KDevSoundFramesPerSecond = 4;
+
+//Forward references:
+class CDevSoundPlayer;
+class CDevSoundError;
+class CDevSoundRecorder;
+class CDevSoundRecordError;
+class CMMFDevSoundProxyXtnd;
+
+class CMMFHwDevice;
+class CMMFHwDeviceObserver;
+class MPlayCustomInterface;
+class MRecordCustomInterface;
+class MEmptyBuffersCustomInterface;
+class MTimePlayedCustomInterface;
+
+/*
+ *
+ * Reference internals for CMMFDevSound
+ * @internalComponent
+ *
+ */
+class CMMFDevSoundSvrImp;
+NONSHARABLE_CLASS( CMMFDevSoundSvrImp ) : public CBase, public MMMFHwDeviceObserver,
+ public MMMFDevSoundCustomInterfaceTarget
+ {
+public:
+ static CMMFDevSoundSvrImp* NewL(CMMFDevSoundSessionXtnd* aParent);
+ ~CMMFDevSoundSvrImp();
+
+ // Initializes to raw audio data PCM16 and Sampling Rate of 8 KHz.
+ void InitializeL(MDevSoundObserver& aDevSoundObserver, TMMFState aMode);
+ // Initializes with hardware device and mode (play, record, convert)
+ void InitializeL(MDevSoundObserver& aDevSoundObserver, TUid aHWDev, TMMFState aMode);
+ // Initializes with hardware device associated with specific FourCC code
+ // and desired mode (play, record, convert)
+ void InitializeL(MDevSoundObserver& aDevSoundObserver, TFourCC aDesiredFourCC, TMMFState aMode);
+
+ // Returns device capabilities
+ TMMFCapabilities Capabilities();
+ // Returns device configuration
+ TMMFCapabilities Config() const;
+ // Sets device configuration
+ void SetConfigL(const TMMFCapabilities& aCaps);
+
+ // Returns maximum play volume device supports
+ TInt MaxVolume();
+ // Returns play volume device is configured to
+ TInt Volume();
+ // Sets device play volume
+ void SetVolume(TInt aVolume);
+
+ // Returns maximum record gain device supports
+ TInt MaxGain();
+ // Returns record gain device is configured to
+ TInt Gain();
+ // Sets device record gain
+ void SetGain(TInt aGain);
+
+ // Returns play balance
+ void GetPlayBalanceL(TInt& aLeftPercentage, TInt& aRightPercentage);
+ // Sets play balance
+ void SetPlayBalanceL(TInt aLeftPercentage, TInt aRightPercentage);
+
+ // Returns record balance
+ void GetRecordBalanceL(TInt& aLeftPercentage, TInt& aRightPercentage);
+ // Sets record balance
+ void SetRecordBalanceL(TInt aLeftPercentage, TInt aRightPercentage);
+
+ // Initializes audio device and start play process
+ void PlayInitL();
+ // Initializes audio device and start record process
+ void RecordInitL(const RMmfIpcMessage& aMessage);
+ // Plays the data in the buffer
+ TBool PlayData(const RMmfIpcMessage& aMessage);
+ // Records data into buffer
+ TBool RecordData(const RMmfIpcMessage& aMessage);
+ // Stops the ongoing operation
+ void Stop();
+ // Tempororily Stops the ongoing operation
+ void Pause();
+
+ // Returns the Sample recorded so far
+ TInt SamplesRecorded();
+ // Returns the Sample played so far
+ TInt SamplesPlayed();
+
+ // Initializes device and start playing tone
+ void PlayToneL(TInt aFrequency, const TTimeIntervalMicroSeconds& aDuration);
+ // Initializes device and start playing dual tone
+ void PlayDualToneL(TInt aFrequencyOne, TInt aFrequencyTwo, const TTimeIntervalMicroSeconds& aDuration);
+ // Initializes device and start playing DTMF String
+ void PlayDTMFStringL(const TDesC& aDTMFString);
+ // Initializes device and start playing tone sequence
+ void PlayToneSequenceL(const TDesC8& aData);
+ // Initializes device and start playing fixed sequence
+ void PlayFixedSequenceL(TInt aSequenceNumber);
+
+ // Sets tone repeat attributes
+ void SetToneRepeats(TInt aRepeatCount,
+ const TTimeIntervalMicroSeconds& aRepeatTrailingSilence);
+ // Sets DTMF tone attributes
+ void SetDTMFLengths(TTimeIntervalMicroSeconds32& aToneOnLength,
+ TTimeIntervalMicroSeconds32& aToneOffLength,
+ TTimeIntervalMicroSeconds32& aPauseLength);
+ // Sets volume ramp for playing
+ void SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration);
+ // Sets priority settings
+ void SetPrioritySettings(const TMMFPrioritySettings& aPrioritySettings);
+
+ // Provides interface for sending custom commands for the audio device
+ virtual TAny* CustomInterface(TUid aInterfaceId);
+
+ // Provides interface for querying fixed sequence count
+ TInt FixedSequenceCount();
+ // Provides interface for querying fixed sequence name
+ const TDesC& FixedSequenceName(TInt aSequenceNumber);
+ // Gets the supported input datatypes
+ void GetSupportedInputDataTypesL(RArray<TFourCC>& aSupportedDataTypesconst, const TMMFPrioritySettings& aPrioritySettings) const;
+ // Gets the supported output datatypes
+ void GetSupportedOutputDataTypesL(RArray<TFourCC>& aSupportedDataTypes, const TMMFPrioritySettings& aPrioritySettings) const;
+
+ // Interface for Audio Policy
+ // Sets id for this DevSound instance
+ void SetDevSoundId(TInt aDevSoundId);
+ // Returns info about this DevSound instance
+ TMMFDevSoundInfo DevSoundInfo();
+ // Called by Audio Policy Server when play reqeust is granted
+ void StartPlayDataL();
+ // Called by Audio Policy Server when record reqeust is granted
+ void StartRecordDataL();
+ // Called by Audio Policy Server when play tone reqeust is granted
+ void StartPlayToneL();
+ // Called by Audio Policy Server when play dual tone request is granted
+ void StartPlayDualToneL();
+ // Called by Audio Policy Server when play DTMF reqeust is granted
+ void StartPlayDTMFStringL();
+ // Called by Audio Policy Server when play tone sequence reqeust is granted
+ void StartPlayToneSequenceL();
+ // Called by Audio Policy Server when DevSound instance looses device
+ void SendEventToClient(const TMMFEvent& aEvent);
+ // Updates the total bytes played from audio device
+ void UpdateBytesPlayed();
+
+ // CMMFHwDevice implementation:
+ TInt FillThisHwBuffer(CMMFBuffer& aHwBuffer);
+ TInt EmptyThisHwBuffer(CMMFBuffer& aHwBuffer);
+ TInt MsgFromHwDevice(TUid aMessageType, const TDesC8& aMsg);
+ void Stopped();
+ void Error(TInt aError);
+ // CMMFHwDevice implementation ends
+
+ //provides interface for register a notification event
+ TInt RegisterAsClient(TUid aEventType, const TDesC8& aNotificationRegistrationData = KNullDesC8);
+ //provides interface to cancel the registered notification
+ TInt CancelRegisterAsClient(TUid aEventType);
+ //Gets the notification data for client to resume
+ TInt GetResourceNotificationData(TUid aEventType, TDes8& aNotificationData);
+ //waits for the client to resume playback even after the timeout expires
+ TInt WillResumePlay();
+ //Empties the buffers below DevSound without causing the codec to be deleted
+ TInt EmptyBuffers();
+
+ TInt GetTimePlayed(TTimeIntervalMicroSeconds& aTime);
+ // CustomCommand implementation - this bit knows it is server side
+ void DoSyncCustomCommandL(const RMmfIpcMessage& aMessage);
+ void DoSyncCustomCommandResultL(const RMmfIpcMessage& aMessage);
+ void DoAsyncCustomCommandL(const RMmfIpcMessage& aMessage);
+ void DoAsyncCustomCommandResultL(const RMmfIpcMessage& aMessage);
+
+private:
+ // So that nobody can extend
+ CMMFDevSoundSvrImp(CMMFDevSoundSessionXtnd* aParent);
+ // Second phase constructor
+ void Construct3L(RServer2& aPolicyServerHandle);
+ void PreInitializeL();
+ // Initializes format based on format supported
+ TInt InitializeFormat(RMdaDevSound::TSoundFormatsSupportedBuf& aSupportedFormat,
+ RMdaDevSound::TCurrentSoundFormatBuf& aFormat);
+ // Request Policy
+ void RequestPolicy();
+ // Play tone
+ void DoPlayL();
+ // Sets active tone
+ void SetActiveToneBuffer();
+ // Fills free tone buffer with tone data
+ TInt FillFreeToneBuffer();
+ // Updates the state of audio policy based on the audio policy settings
+ TInt UpdatePolicyState(TMMFAudioPolicyState aNewState);
+ // HwDevice implementation begins
+ TInt InitTask();
+ // Returns Sampling Frequency the device is currently configured to
+ TInt SamplingFrequency();
+ // Returns number of channels the device is currently configured to
+ TInt NumberOfChannels();
+ //returns the number of bytes in each audio sample
+ TInt BytesPerAudioSample();
+ // HwDevice implementation ends
+ TInt SetDeviceVolume(TInt aVolume);
+ TInt SetPlayFormat(RMdaDevSound::TCurrentSoundFormatBuf& aPlayFormat);
+ TInt SetRecordFormat(RMdaDevSound::TCurrentSoundFormatBuf& aRecordFormat);
+ TInt SetDeviceRecordLevel(TInt aGain);
+ TInt SetDeviceVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration);
+public:
+ enum TMMFDevSoundState
+ {
+ /** Idle state.
+ */
+ EMMFDevSoundStateIdle,
+ /** The DevSound is currently playing.
+ */
+ EMMFDevSoundStatePlaying,
+ /** The DevSound is playing a tone.
+ */
+ EMMFDevSoundStateTonePlaying,
+ /** The DevSound is currently recording.
+ */
+ EMMFDevSoundStateRecording,
+ /** The DevSound is playing and recording.
+ */
+ EMMFDevSoundStatePlayingRecording,
+ /** The DevSound is converting data.
+ */
+ EMMFDevSoundStateConverting
+ };
+private:
+
+ CMMFDevSoundSessionXtnd& iParent;
+
+ //Objects (owned or referred to):
+ RMMFAudioPolicyProxy* iAudioPolicyProxy;
+ CMMFAudioPolicyRequest* iAudioPolicyRequest;
+ MDevSoundObserver* iDevSoundObserver;
+
+ // Handles receiving events
+ CMMFDevSoundEventHandler* iDevSoundEventHandler;
+
+ //WINS Sound Device Structures
+ RMdaDevSound::TSoundFormatsSupportedBuf iPlayFormatsSupported;
+ RMdaDevSound::TCurrentSoundFormatBuf iPlayFormat;
+ RMdaDevSound::TSoundFormatsSupportedBuf iRecordFormatsSupported;
+ RMdaDevSound::TCurrentSoundFormatBuf iRecordFormat;
+
+ // DevSound capabilities
+ TMMFCapabilities iDeviceCapabilities;
+ // Current Configuration
+ TMMFCapabilities iDeviceConfig;
+
+ // AudioPolicy priority used to communicate with server
+ TMMFAudioPolicyPrioritySettings iAudioPolicyPrioritySettings;
+
+ MPlayCustomInterface* iPlayCustomInterface;
+ MRecordCustomInterface* iRecordCustomInterface;
+
+ // Bytes of audio data played in current play cycle
+ TInt iPlayedBytesCount;
+ TInt iGain;
+ TInt iVolume;
+ TMMFDevSoundInfo iDevSoundInfo;
+
+ //Tone Stuff:
+ MMdaToneSynthesis* iCurrentGenerator;
+ TMdaSimpleToneGenerator iToneGen;
+ TMdaDualToneGenerator iDualToneGen;
+ TMdaDTMFGenerator iDTMFGen;
+ TMdaSequenceGenerator iSequenceGen; // Not Supported
+ TInt iRepeatCount;
+ TTimeIntervalMicroSeconds iRepeatTrailingSilence;
+ TTimeIntervalMicroSeconds iRampDuration;
+ // Double buffer tone playing
+ CMMFDataBuffer* iToneBuffer1;
+ CMMFDataBuffer* iToneBuffer2;
+ // Reference to current tone buffer playing
+ CMMFDataBuffer* iActiveToneBuffer;
+
+ // Hardware device implementation
+ CMMFHwDevice* iCMMFHwDevice;
+ // Mode in which DevSound instance will be used for
+ TMMFDevSoundState iMode;
+ // Reference to hardware buffer
+ CMMFDataBuffer* iHwDeviceBuffer;
+
+ TBool iLastBufferReceived;
+
+ // Holds true of Audio data given to DevSound needs to ramped up
+ CMMFDevSoundUtility* iDevSoundUtil;
+
+ // Fixed sequence related
+ CPtrC8Array* iFixedSequences; // Holds the fixed sequence data
+ TPtrC8 iFixedSequence; // Holds reference to current sequence
+
+ // Balance
+ TInt iLeftPlayBalance;
+ TInt iRightPlayBalance;
+
+ TInt iLeftRecordBalance;
+ TInt iRightRecordBalance;
+
+ TBool iPaused;
+
+ TUid iHwDeviceID;
+
+ // Hardware device initialization parameters
+ THwDeviceInitParams iDevInfo;
+
+ TBool iFirstCallFromHwDevice;
+ TBool iFourCCSet;
+ TFourCC iSrcFourCC;
+ TFourCC iDestFourCC;
+
+ TBool iHasPolicy;
+ MTimePlayedCustomInterface* iTimePlayedCustomInterface;
+ TTimeIntervalMicroSeconds iTimePlayed;
+ friend class CMMFDevSoundSession;
+ };
+
+#include "MmfDevSoundSessionBody.inl"
+
+#endif // MMFDEVSOUNDSESSIONBODY__H