mmserv/voipaudioservices/VoIPServer/inc/VoIPServerThread.h
changeset 0 71ca22bcf22a
child 38 9e9fc5ab059f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/voipaudioservices/VoIPServer/inc/VoIPServerThread.h	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) 2007-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:  VoIP Audio Services - Uplink stream API
+ *               Defines uplink and downlink thread objects.
+ *
+ */
+
+#ifndef __VOIPAUDIOSERVERTHREAD_H
+#define __VOIPAUDIOSERVERTHREAD_H
+
+#include <e32msgqueue.h>
+#include <sounddevice.h>
+#include "JitterBufferObserver.h"
+#include "JitterBuffer.h"
+#include "VoIPAudioClientServer.h"
+#include "VoIPQueueHandlerSrv.h"
+#include "VoIPSharedData.h"
+
+// FORWARD DECLARATIONS
+class CAudioOutput;
+class CErrorConcealmentIntfc;
+class CSpeechEncoderConfig;
+class CG711DecoderIntfc;
+class CG729DecoderIntfc;
+class CIlbcDecoderIntfc;
+class CG711EncoderIntfc;
+class CG729EncoderIntfc;
+class CIlbcEncoderIntfc;
+class CQueueHandlerSrv;
+
+// -----------------------------------------------------------------------------
+//  Class Name:  CVoIPThreadBase
+//
+//  Base abstract class for creating VoIP uplink and downlink threads.
+// -----------------------------------------------------------------------------
+class CVoIPThreadBase : public CBase,
+                        public MDevSoundObserver,
+                        public MQueueHandlerObserverSrv
+    {
+public:
+    enum TStreamState
+        {
+        ENotReady,  // not initialized
+        EReady,     // initialized and ready for streaming
+        EStreaming  // active streaming
+        };
+
+public:
+    virtual ~CVoIPThreadBase();
+
+    // From MQueueHandlerObserverSrv
+    virtual void Event(TInt aEventType, TInt aError) = 0;
+
+protected:
+    virtual void SetCodecCiL() = 0;
+    virtual void Start() = 0;
+    virtual void Stop() = 0;
+
+    void InitThreadL();
+    void InitDevSoundL(const TMMFState aDevSoundState, const TInt aPriority,
+            const TInt aPreference);
+    void InitMsgQueuesL(const TDesC& aBufferQ, const TDesC& aComQ);
+    TInt DoChunk(const TDesC& aChunkName, const TInt aChunkLen,
+            const TInt aChunkMaxLen);
+    TInt DetermineMaxBufferLen(TVoIPCodecSettings::TG711FrameRate
+            aG711FrameRate = TVoIPCodecSettings::E20MS);
+
+    // From MDevSoundObserver
+    virtual void InitializeComplete(TInt aError) = 0;
+    virtual void BufferToBeEmptied(CMMFBuffer* /*aBuffer*/) {}
+    virtual void RecordError(TInt /*aError*/) {}
+    virtual void BufferToBeFilled(CMMFBuffer* /*aBuffer*/) {}
+    virtual void PlayError(TInt /*aError*/) {}
+    virtual void ToneFinished(TInt /*aError*/) {}
+    virtual void ConvertError(TInt /*aError*/) {}
+    virtual void DeviceMessage(TUid /*aMessageType*/, const TDesC8& /*aMsg*/) {}
+    virtual void SendEventToClient(const TMMFEvent& /*aEvent*/) {}
+
+protected:
+
+    CActiveScheduler* iActiveScheduler;
+    TStreamState iStatus;
+    CMMFDevSound* iDevSound;
+
+    RMsgQueue<TVoIPMsgBuf> iMsgQueue; // ITC back to client
+    RMsgQueue<TVoIPMsgBuf> iMsgComQueue; // ITC with this thread
+    CQueueHandlerSrv* iMsgQComHandler; // commands from main thread
+    TVoIPMsgBuf iMsgBuffer;
+    CMMFDataBuffer* iDevSoundBufPtr;
+    RChunk iChunk;
+    TUint32 iCodecID;
+    TInt iBufLen;
+    TInt iMaxBufLen;
+
+    CVoIPFormatIntfc::TG711CodecMode iG711CodecMode;
+    CVoIPFormatIntfc::TILBCCodecMode iILBCCodecMode;
+
+    };
+
+// -----------------------------------------------------------------------------
+//  Class Name:  CVoIPDownlinkThread
+//
+//  Class handling VoIP downlink in a separate thread.
+// -----------------------------------------------------------------------------
+class CVoIPDownlinkThread : public CVoIPThreadBase,
+                            public MJitterBufferObserver
+    {
+public:
+    static TInt ThreadFunction(TAny* aData);
+    virtual ~CVoIPDownlinkThread();
+
+private:
+
+    static CVoIPDownlinkThread* NewL(TSharedData& aData);
+    CVoIPDownlinkThread(TSharedData& aData);
+    void ConstructL();
+
+    void SetCodecCiL();
+    void Start();
+    void Stop();
+
+    void BufferFilled();
+    void SetVolume();
+    void GetVolume();
+    void SetAudioDeviceL();
+    void GetAudioDeviceL();
+
+    // For CIs
+    void SetIlbcCodecMode();
+    void GetIlbcCodecMode();
+    void SetG711CodecMode();
+    void GetG711CodecMode();
+    void FrameModeRqrdForEC();
+    void SetFrameMode();
+    void GetFrameMode();
+    void ConcealErrorForNextBuffer();
+    void SetCng();
+    void GetCng();
+    void SetPlc();
+    void GetPlc();
+    void BadLsfNextBuffer();
+
+    // For Jitter Buffer
+    /**
+     * ?description
+     * @since S60 v5.0
+     * @param  none
+     * @return void
+     */
+    void ConfigureJitterBufferL();
+
+    /**
+     * ?description
+     * @since S60 v5.0
+     * @param none
+     * @return void
+     */
+    void ResetJitterBuffer();
+
+    /**
+     * ?description
+     * @since S60 v5.0
+     * @param none
+     * @return void
+     */
+    void JBDelayDown();
+
+    /**
+     * ?description
+     * @since S60 v5.0
+     * @param none
+     * @return void
+     */
+    void JBDelayUp();
+
+    void SendCmd(TUserCommand aCmd, TInt aError = KErrNone);
+
+    // From MDevSoundObserver
+    virtual void InitializeComplete(TInt aError);
+    virtual void BufferToBeFilled(CMMFBuffer* aBuffer);
+    virtual void PlayError(TInt aError);
+
+    // From MQueueHandlerObserverSrv
+    virtual void Event(TInt aEventType, TInt aError);
+
+    // From MJitterBufferObserver
+    virtual void EventJB(TInt aEventType, TInt aError = KErrNone);
+
+private:
+
+    TSharedData& iShared;
+    TBool iFrameMode;
+    TBool iPlc;
+    CAudioOutput* iAudioOutput;
+    CErrorConcealmentIntfc* iErrConcealmentIntfc;
+    CG711DecoderIntfc* iG711DecoderIntfc;
+    CG729DecoderIntfc* iG729DecoderIntfc;
+    CIlbcDecoderIntfc* iIlbcDecoderIntfc;
+
+    CVoIPJitterBuffer* iJitterBuffer;
+    CMMFDataBuffer* iAddJBuffer;
+    CMMFDataBuffer* iGetJBuffer;
+
+#ifdef _DEBUG
+    TInt iSamplesPlayedCount;
+#endif
+
+    };
+
+// -----------------------------------------------------------------------------
+//  Class Name:  CVoIPUplinkThread
+//
+//  Class handling VoIP uplink in a separate thread.
+// -----------------------------------------------------------------------------
+class CVoIPUplinkThread : public CVoIPThreadBase
+    {
+public:
+
+    static TInt ThreadFunction(TAny* aData);
+    virtual ~CVoIPUplinkThread();
+
+private:
+
+    static CVoIPUplinkThread* NewL(TSharedData& aData);
+    CVoIPUplinkThread(TSharedData& aData);
+    void ConstructL();
+
+    void SetCodecCiL();
+    void Start();
+    void Stop();
+
+    void BufferEmptied();
+    void SetGain();
+    void GetGain();
+
+    // For CIs
+    void SetIlbcCodecMode();
+    void GetIlbcCodecMode();
+    void SetG711CodecMode();
+    void GetG711CodecMode();
+    void GetSupportedBitrates();
+    void SetBitrate();
+    void GetBitrate();
+    void SetVad();
+    void GetVad();
+
+    void SendCmd(TUserCommand aCmd, TInt aError = KErrNone);
+
+    // From MDevSoundObserver
+    virtual void InitializeComplete(TInt aError);
+    virtual void BufferToBeEmptied(CMMFBuffer* /*aBuffer*/);
+    virtual void RecordError(TInt /*aError*/);
+
+    // From MQueueHandlerObserverSrv
+    virtual void Event(TInt aEventType, TInt aError);
+
+private:
+
+    TSharedData& iShared;
+    TBool iVad;
+
+    CSpeechEncoderConfig* iSpeechEncoderConfig;
+    CG711EncoderIntfc* iG711EncoderIntfc;
+    CG729EncoderIntfc* iG729EncoderIntfc;
+    CIlbcEncoderIntfc* iIlbcEncoderIntfc;
+
+#ifdef _DEBUG
+    TInt iSamplesRecCount;
+#endif
+
+    };
+
+#endif  // __VOIPAUDIOSERVERTHREAD_H
+
+// End of file