mmserv/tms/tmscallserver/inc/ipcallstream.h
changeset 0 71ca22bcf22a
child 3 4f62049db6ac
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/tms/tmscallserver/inc/ipcallstream.h	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,312 @@
+/*
+ * Copyright (c) 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: Telephony Multimedia Service
+ *
+ */
+
+#ifndef __IPCALLSTREAM_H
+#define __IPCALLSTREAM_H
+
+//#define __PLAY_WAV_FROM_FILE__
+
+#include <e32msgqueue.h>
+#include <mmfbase.h>
+#include <tms.h>
+#include "tmsgstreamer.h"
+#include "tmsshared.h"
+#include "tmsclientserver.h"
+
+#ifdef __USE_GSTREAMER__
+#include <gst.h>
+#include "gstg711encoderinterface.h"
+#include "gstspeechencoderconfig.h"
+#include "gsterrorconcealmentinterface.h"
+#include "gstg711decoderinterface.h"
+#include "gstilbcdecoderinterface.h"
+#include "gstilbcencoderinterface.h"
+#include "gstg729encoderinterface.h"
+#include "gstg729decoderinterface.h"
+#else //__USE_GSTREAMER__
+#include <sounddevice.h>
+#include <VoIPDownlinkStream.h>
+#include <VoIPUplinkStream.h>
+
+// FORWARD DECLARATIONS
+class CAudioOutput;
+class CErrorConcealmentIntfc;
+class CSpeechEncoderConfig;
+class CG711DecoderIntfc;
+class CG729DecoderIntfc;
+class CIlbcDecoderIntfc;
+class CG711EncoderIntfc;
+class CG729EncoderIntfc;
+class CIlbcEncoderIntfc;
+#endif //__USE_GSTREAMER__
+
+namespace TMS {
+
+// -----------------------------------------------------------------------------
+//  Class Name:  IPCallStreamBase
+//
+//  Base abstract class for creating VoIP uplink and downlink streams.
+// -----------------------------------------------------------------------------
+class IPCallStreamBase : public CBase
+#ifndef __USE_GSTREAMER__
+                       , public MDevSoundObserver
+#endif //__USE_GSTREAMER__
+    {
+public:
+    enum TStreamState
+        {
+        ENotReady, // not initialized
+        EReady, // initialized and ready for streaming
+        EStreaming
+        // active streaming
+        };
+
+public:
+    virtual ~IPCallStreamBase();
+
+    virtual void Start() = 0;
+    virtual void Stop() = 0;
+    virtual gint SetCodecCi() = 0;
+
+#ifndef __USE_GSTREAMER__
+    void InitDevSoundL(const TMMFState aDevSoundState,
+            const TMMFPrioritySettings priority);
+#endif //__USE_GSTREAMER__
+    void SetMsgQueue(const RMsgQueue<TmsMsgBuf> aMsgQueue);
+    gint DoChunk(const gint aDataLen, TmsMsgBuf& aMsgBuffer);
+    gint ConfigureMedia(const guint32 aCodecID);
+
+protected:
+#ifndef __USE_GSTREAMER__
+    // 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*/) {}
+#endif //__USE_GSTREAMER__
+
+protected:
+
+    CActiveScheduler* iActiveScheduler;
+    TStreamState iStatus;
+
+#ifndef __USE_GSTREAMER__
+    CMMFDevSound* iDevSound;
+    CMMFDataBuffer* iDevSoundBufPtr;
+#endif //__USE_GSTREAMER__
+
+    RMsgQueue<TmsMsgBuf> iMsgQueue; // ITC back to client
+    TmsMsgBuf iMsgBuffer;
+    RChunk iChunk;
+    gint iMaxBufLen;
+    guint32 iCodecID;
+    TMMFPrioritySettings iPriority;
+    const gchar* iMediaType;
+
+    gint iG711DecodeMode;
+    gint iILBCDecodeMode;
+    gint iG711EncodeMode;
+    gint iILBCEncodeMode;
+    gint iBufLen;
+    TBool iWriteDataXferHndlToClient;
+    TUint32 iKey;
+    };
+
+// -----------------------------------------------------------------------------
+//  Class Name:  TMSVoIPDownlink
+//
+//  Class handling VoIP downlink stream object.
+// -----------------------------------------------------------------------------
+class TMSVoIPDownlink : public IPCallStreamBase
+    {
+public:
+    virtual ~TMSVoIPDownlink();
+
+#ifdef __USE_GSTREAMER__
+    static void cb_raw_playback_handoff(GstElement* appsrc, guint size);
+    static gboolean bus_call(GstBus* bus, GstMessage* msg, gpointer data);
+#endif //__USE_GSTREAMER__
+    static TMSVoIPDownlink* NewL(const guint32 codecID,
+            const TMMFPrioritySettings priority);
+    TMSVoIPDownlink();
+    void ConstructL(const guint32 codecID,
+            const TMMFPrioritySettings priority);
+
+    gint SetCodecCi();
+    void Start();
+    void Stop();
+    void BufferFilled(const guint buflen);
+    gint SetVolume(const guint volume);
+    gint GetVolume(guint& volume);
+    gint GetMaxVolume(guint& volume);
+    gint GetDataXferChunkHndl(const TUint32 key, RChunk& chunk);
+
+    // For CIs
+    gint SetIlbcCodecMode(const gint mode);
+    gint GetIlbcCodecMode(gint& mode);
+    gint SetG711CodecMode(const gint mode);
+    gint GetG711CodecMode(gint& mode);
+    gint FrameModeRqrdForEC(gboolean& frmodereq);
+    gint SetFrameMode(gboolean frmode);
+    gint GetFrameMode(gboolean& frmode);
+    gint ConcealErrorForNextBuffer();
+    gint SetCng(const TMSFormatType fmttype, const gboolean cng);
+    gint GetCng(const TMSFormatType fmttype, gboolean& cng);
+    gint SetPlc(const TMSFormatType fmttype, const gboolean plc);
+    gint GetPlc(const TMSFormatType fmttype, gboolean& plc);
+    gint BadLsfNextBuffer();
+
+    void SetAudioDeviceL(TMSAudioOutput output);
+    void GetAudioDeviceL(TMSAudioOutput& output);
+
+private:
+    void SetCodecCiL();
+
+#ifdef __USE_GSTREAMER__
+    void BufferToBeFilled();
+    gint gst_play_raw();
+    gint gst_initialize_play();
+#else //__USE_GSTREAMER__
+    // From MDevSoundObserver
+    virtual void BufferToBeFilled(CMMFBuffer* aBuffer);
+    virtual void InitializeComplete(TInt aError);
+    virtual void PlayError(TInt aError);
+#endif //__USE_GSTREAMER__
+
+private:
+
+    gboolean iFrameMode;
+    gboolean iPlc;
+    gint iMaxVolume;
+
+#ifndef __USE_GSTREAMER__
+    CAudioOutput* iAudioOutput;
+    CErrorConcealmentIntfc* iErrConcealmentIntfc;
+    CG711DecoderIntfc* iG711DecoderIntfc;
+    CG729DecoderIntfc* iG729DecoderIntfc;
+    CIlbcDecoderIntfc* iIlbcDecoderIntfc;
+#else //__USE_GSTREAMER__
+    GstErrorConcealmentIntfc* iErrConcealmentIntfc;
+    GstG711DecoderIntfc* iG711DecoderIntfc;
+    GstG729DecoderIntfc* iG729DecoderIntfc;
+    GstIlbcDecoderIntfc* iIlbcDecoderIntfc;
+    GstElement* iPipelinePlay;
+    GstElement* iAppSrc;
+    GstElement* iSink;
+    GstBus* iBusPlay;
+#endif //__USE_GSTREAMER__
+#ifdef _DEBUG
+    gint iSamplesPlayedCount;
+#endif
+
+#ifdef __PLAY_WAV_FROM_FILE__
+    RFile iFile;
+    gint fsize;
+    gint iReadSize;
+    gint iReadBytes;
+    RFs iFs;
+    HBufC8* fbuf;
+#endif
+    };
+
+// -----------------------------------------------------------------------------
+//  Class Name:  TMSVoIPUplink
+//
+//  Class handling VoIP uplink stream.
+// -----------------------------------------------------------------------------
+class TMSVoIPUplink : public IPCallStreamBase
+    {
+public:
+    virtual ~TMSVoIPUplink();
+
+#ifdef __USE_GSTREAMER__
+    static void cb_record_raw_handoff(GstElement *sink);
+    static gboolean bus_call(GstBus* bus, GstMessage* msg, gpointer data);
+#endif //__USE_GSTREAMER__
+    static TMSVoIPUplink* NewL(const guint32 codecID,
+            const TMMFPrioritySettings priority);
+    TMSVoIPUplink();
+    void ConstructL(const guint32 codecID,
+            const TMMFPrioritySettings priority);
+
+    gint SetCodecCi();
+    void Start();
+    void Stop();
+    void BufferEmptied();
+    gint SetGain(const guint gain);
+    gint GetGain(guint& gain);
+    gint GetMaxGain(guint& gain);
+    gint GetDataXferChunkHndl(const TUint32 key, RChunk& chunk);
+
+    // For CIs
+    gint SetIlbcCodecMode(const gint mode);
+    gint GetIlbcCodecMode(gint& mode);
+    gint SetG711CodecMode(const gint mode);
+    gint GetG711CodecMode(gint& mode);
+    gint GetSupportedBitrates(RArray<TUint>& bitrates);
+    gint SetBitrate(guint bitrate);
+    gint GetBitrate(guint& bitrate);
+    gint SetVad(const TMSFormatType fmttype, const gboolean vad);
+    gint GetVad(const TMSFormatType fmttype, gboolean& vad);
+
+private:
+    void SetCodecCiL();
+
+#ifdef __USE_GSTREAMER__
+    void BufferToBeEmptied();
+    gint gst_record_raw();
+    gint gst_initialize_record();
+#else //__USE_GSTREAMER__
+    // From MDevSoundObserver
+    virtual void BufferToBeEmptied(CMMFBuffer* aBuffer);
+    virtual void InitializeComplete(TInt aError);
+    virtual void RecordError(TInt /*aError*/);
+#endif //__USE_GSTREAMER__
+
+private:
+    gint iMaxGain;
+
+#ifndef __USE_GSTREAMER__
+    CSpeechEncoderConfig* iSpeechEncoderConfig;
+    CG711EncoderIntfc* iG711EncoderIntfc;
+    CG729EncoderIntfc* iG729EncoderIntfc;
+    CIlbcEncoderIntfc* iIlbcEncoderIntfc;
+#else //__USE_GSTREAMER__
+    GstSpeechEncoderConfigIntfc* iSpeechEncoderConfig;
+    GstG711EncoderIntfc* iG711EncoderIntfc;
+    GstG729EncoderIntfc* iG729EncoderIntfc;
+    GstIlbcEncoderIntfc* iIlbcEncoderIntfc;
+    GstElement* iPipelineRec;
+    GstElement* iSource;
+    GstElement* iAppSink;
+    GstBus* iBusRec;
+#endif //__USE_GSTREAMER__
+#ifdef _DEBUG
+    gint iSamplesRecCount;
+#endif
+    };
+
+} //namespace TMS
+
+#endif  //__IPCALLSTREAM_H
+
+// End of file