mmserv/voipaudioservices/VoIPClient/src/VoIPAudioSession.cpp
changeset 0 71ca22bcf22a
child 28 ebf79c79991a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/voipaudioservices/VoIPClient/src/VoIPAudioSession.cpp	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,989 @@
+/*
+ * Copyright (c) 2007-2008 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:  Implements RVoIPAudioSession object.
+ *
+ */
+
+#include <s32mem.h>
+#include "debugtracemacros.h"
+#include "VoIPAudioClientServer.h"
+#include "VoIPAudioSession.h"
+
+// CONSTANTS
+const TUint KServerConnectRetries = 2;
+const TUint KSessionMessageSlots = 10;
+
+// -----------------------------------------------------------------------------
+// StartServer
+// Static function to start the server process thread.
+// Start the server process/thread which lives in an EPOCEXE object.
+// Returns: TInt: KErrNone (0) if no error
+// -----------------------------------------------------------------------------
+//
+static TInt StartServer()
+    {
+    const TUidType serverUid(KNullUid, KNullUid, KVoIPServerUid3);
+
+    // Only one instance of the server is allowed. Attempt of launching
+    // second instance of the server will fail with KErrAlreadyExists.
+    RProcess server;
+    TInt r = server.Create(KVoIPServerName, KNullDesC, serverUid);
+
+    if (r != KErrNone)
+        {
+        return r;
+        }
+
+    TRequestStatus stat;
+    server.Rendezvous(stat);
+
+    if (stat != KRequestPending)
+        {
+        server.Kill(0); // abort startup
+        }
+    else
+        {
+        server.Resume(); // logon OK - start the server
+        }
+
+    User::WaitForRequest(stat); // wait for start or death
+
+    // Panic reason cannot be '0' as it would conflict with KErrNone
+    r = (server.ExitType() == EExitPanic) ? KErrGeneral : stat.Int();
+    server.Close();
+    return r;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::Connect
+// Create a client-side session. Start the server if not started already.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::Connect()
+    {
+    TRACE_PRN_FN_ENT;
+
+    TInt retry = KServerConnectRetries;
+    TInt err = KErrGeneral;
+    TInt numMessageSlots = KSessionMessageSlots;
+
+    for (;;)
+        {
+        // Try to create a new session with the server
+        err = CreateSession(KVoIPServerName, Version(), numMessageSlots);
+
+        if ((err != KErrNotFound) && (err != KErrServerTerminated))
+            {
+            TRACE_PRN_N1(_L("[VAS session created; err==%d]"), err);
+            break; // Connected to existing server - ok
+            }
+
+        if (--retry == 0)
+            {
+            break; // Failed.
+            }
+
+        // Server not running, try to start it.
+        err = StartServer();
+        TRACE_PRN_N1(_L("[VAS server started; err==%d]"), err);
+
+        if ((err != KErrNone) && (err != KErrAlreadyExists))
+            {
+            break; // Server not launched - propagate error
+            }
+        }
+
+    TRACE_PRN_FN_EXT;
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::Version
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TVersion RVoIPAudioSession::Version() const
+    {
+    return (TVersion(KVoIPServMajorVersionNumber,
+            KVoIPServMinorVersionNumber, KVoIPServBuildVersionNumber));
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::Close
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RVoIPAudioSession::Close()
+    {
+    TRACE_PRN_FN_ENT;
+
+    SendClientRequest(EVoIPSessionClose, TIpcArgs(TIpcArgs::ENothing));
+    RSessionBase::Close();
+
+    TRACE_PRN_FN_EXT;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::OpenDownlink
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::OpenDownlink(
+        const TMMFPrioritySettings aPriority)
+    {
+    TMMFPrioritySettingsPckg pckg;
+    pckg() = aPriority;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPOpenDownlink, args);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetMaxVolume
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetMaxVolume()
+    {
+    TInt maxVol = 0;
+    TPckgBuf<TInt> pckg;
+    TIpcArgs args(&pckg);
+    SendClientRequest(EVoIPGetMaxVolume, args);
+    maxVol = pckg();
+    return maxVol;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetVolume
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetVolume(const TInt aVolume)
+    {
+    TInt err = SendClientRequest(EVoIPSetVolume, TIpcArgs(aVolume));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetVolume
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetVolume()
+    {
+    TInt vol = 0;
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPGetVolume, args);
+    if (err == KErrNone)
+        {
+        vol = pckg().iInt;
+        err = pckg().iStatus;
+        }
+
+    return (err == KErrNone) ? vol : err;
+    }
+
+// ---------------------------------------------------------------------------
+// RVoIPAudioSession::GetSupportedDecoders
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetSupportedDecoders(
+        const TMMFPrioritySettings aPriority, RArray<TUint32>& aDecoders,
+        TInt& aFrameSize)
+    {
+    TRACE_PRN_FN_ENT;
+
+    TMMFPrioritySettingsPckg pckg;
+    pckg() = aPriority;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPSetDecoderPriority, args);
+
+    TVoIPMsgBufPckg pckg1;
+    TIpcArgs args1(&pckg1);
+    err = SendClientRequest(EVoIPGetSupportedDecodersCount, args1);
+    TInt count = 0;
+    aFrameSize = 0;
+
+    if (err == KErrNone)
+        {
+        count = pckg1().iInt;
+        aFrameSize = pckg1().iUint; //for 10/20ms frame detection
+        err = pckg1().iStatus;
+        }
+
+    if (count > 0 && err == KErrNone)
+        {
+        TRAP(err, PopulateArrayL(EVoIPGetSupportedDecoders, aDecoders, count));
+        }
+
+    TRACE_PRN_FN_EXT;
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetDecoder
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetDecoder(const TUint32 aDecoder)
+    {
+    TPckgBuf<TUint32> pckg;
+    pckg() = aDecoder;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPSetDecoder, args);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetAudioDevice
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetAudioDevice(
+        const CVoIPAudioDownlinkStream::TVoIPOutputDevice aDevice)
+    {
+    TPckgBuf<TUint> pckg;
+    pckg() = TUint(aDevice);
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPSetAudioDevice, args);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetAudioDevice
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetAudioDevice(
+        CVoIPAudioDownlinkStream::TVoIPOutputDevice& aDevice)
+    {
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPGetAudioDevice, args);
+    if (err == KErrNone)
+        {
+        aDevice = (CVoIPAudioDownlinkStream::TVoIPOutputDevice) pckg().iUint;
+        err = pckg().iStatus;
+        }
+
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::StartDownlink
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::StartDownlink()
+    {
+    TInt err = SendClientRequest(EVoIPStartDownlink, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::StopDownlink
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::StopDownlink()
+    {
+    TInt err = SendClientRequest(EVoIPStopDownlink, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::CloseDownlink
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RVoIPAudioSession::CloseDownlink()
+    {
+    SendClientRequest(EVoIPCloseDownlink, TIpcArgs(TIpcArgs::ENothing));
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::BufferFilled
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::BufferFilled(TPtr8 aBuffer,
+        const TUint aBufferSequence)
+    {
+    TVoIPMsgBufPckg pckg;
+    pckg().iInt = aBuffer.Size();
+    pckg().iUint = aBufferSequence;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPBufferFilled, args);
+    return err;
+    }
+
+// For uplink stream
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::OpenUplink
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::OpenUplink(
+        const TMMFPrioritySettings aPriority)
+    {
+    TMMFPrioritySettingsPckg pckg;
+    pckg() = aPriority;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPOpenUplink, args);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetMaxGain
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetMaxGain()
+    {
+    TInt maxGain = 0;
+    TPckgBuf<TInt> pckg;
+    TIpcArgs args(&pckg);
+    SendClientRequest(EVoIPGetMaxGain, args);
+    maxGain = pckg();
+    return maxGain;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetGain
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetGain(const TInt aGain)
+    {
+    TInt err = SendClientRequest(EVoIPSetGain, TIpcArgs(aGain));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetGain
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetGain()
+    {
+    TInt gain = 0;
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPGetGain, args);
+    if (err == KErrNone)
+        {
+        gain = pckg().iInt;
+        err = pckg().iStatus;
+        }
+
+    return (err == KErrNone) ? gain : err;
+    }
+
+// ---------------------------------------------------------------------------
+// RVoIPAudioSession::GetSupportedEncodersL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetSupportedEncoders(
+        const TMMFPrioritySettings aPriority, RArray<TUint32>& aEncoders,
+        TInt& aFrameSize)
+    {
+    TRACE_PRN_FN_ENT;
+
+    TMMFPrioritySettingsPckg pckg;
+    pckg() = aPriority;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPSetEncoderPriority, args);
+
+    TVoIPMsgBufPckg pckg1;
+    TIpcArgs args1(&pckg1);
+    err = SendClientRequest(EVoIPGetSupportedEncodersCount, args1);
+    TInt count = 0;
+    aFrameSize = 0;
+
+    if (err == KErrNone)
+        {
+        count = pckg1().iInt;
+        aFrameSize = pckg1().iUint; //for 10/20ms frame detection
+        err = pckg1().iStatus;
+        }
+
+    if (count > 0 && err == KErrNone)
+        {
+        TRAP(err, PopulateArrayL(EVoIPGetSupportedEncoders, aEncoders, count));
+        }
+
+    TRACE_PRN_FN_EXT;
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetEncoder
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetEncoder(const TUint32 aEncoder)
+    {
+    TPckgBuf<TUint32> pckg;
+    pckg() = aEncoder;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPSetEncoder, args);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::StartUplink
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::StartUplink()
+    {
+    TInt err = SendClientRequest(EVoIPStartUplink, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::StopUplink
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::StopUplink()
+    {
+    TInt err = SendClientRequest(EVoIPStopUplink, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::CloseUplink
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RVoIPAudioSession::CloseUplink()
+    {
+    SendClientRequest(EVoIPCloseUplink, TIpcArgs(TIpcArgs::ENothing));
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::BufferEmptied
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::BufferEmptied(TPtr8 aBuffer)
+    {
+    TVoIPMsgBufPckg pckg;
+    pckg().iInt = aBuffer.Size();
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPBufferEmptied, args);
+    return err;
+    }
+
+// For codec CIs
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetSupportedBitRatesL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RVoIPAudioSession::GetSupportedBitRatesL(RArray<TUint>& aArray)
+    {
+    TRACE_PRN_FN_ENT;
+
+    TInt brCount = 0;
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPGetSupportedBitratesCount, args);
+    if (err == KErrNone)
+        {
+        brCount = pckg().iInt;
+        err = pckg().iStatus;
+        }
+
+    TRACE_PRN_N1(_L("BRCount [%d]"), brCount);
+
+    if (brCount > 0 && err == KErrNone)
+        {
+        HBufC8* buf = HBufC8::NewLC(brCount * sizeof(TUint));
+        TPtr8 ptr = buf->Des();
+        TIpcArgs args1;
+        args1.Set(0, &ptr);
+        err = SendClientRequest(EVoIPGetSupportedBitrates, args1);
+        if (err == KErrNone)
+            {
+            RDesReadStream stream(ptr);
+            CleanupClosePushL(stream); // stream on cleanup
+            aArray.Reset();
+
+            for (TInt i = 0; i < brCount; i++)
+                {
+                aArray.Append(stream.ReadUint32L());
+                }
+
+            CleanupStack::PopAndDestroy(&stream);
+            }
+
+        CleanupStack::PopAndDestroy(buf);
+        }
+
+    TRACE_PRN_FN_EXT;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetBitRate
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetBitRate(const TUint aBitrate)
+    {
+    TInt err = SendClientRequest(EVoIPSetBitrate, TIpcArgs(aBitrate));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetBitRate
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetBitRate(TUint& aBitrate)
+    {
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPGetBitrate, args);
+    if (err == KErrNone)
+        {
+        aBitrate = pckg().iUint;
+        err = pckg().iStatus;
+        }
+
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetVAD
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetVAD(const TBool aVad)
+    {
+    TInt err = SendClientRequest(EVoIPSetVad, TIpcArgs(aVad));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetVAD
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetVAD(TBool& aVad)
+    {
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPGetVad, args);
+    if (err == KErrNone)
+        {
+        aVad = pckg().iBool;
+        err = pckg().iStatus;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::FrameModeRequiredForErrorConcealment
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::FrameModeRequiredForEC(TBool& aMode)
+    {
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPFrameModeRqrdForEC, args);
+    if (err == KErrNone)
+        {
+        aMode = pckg().iBool;
+        err = pckg().iStatus;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetFrameMode
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetFrameMode(const TBool aMode)
+    {
+    TInt err = SendClientRequest(EVoIPSetFrameMode, TIpcArgs(aMode));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetFrameMode
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetFrameMode(TBool& aMode)
+    {
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPGetFrameMode, args);
+    if (err == KErrNone)
+        {
+        aMode = pckg().iBool;
+        err = pckg().iStatus;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::ConcealErrorForNextBuffer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::ConcealErrorForNextBuffer()
+    {
+    TInt err = SendClientRequest(EVoIPConcealErrForNextBuf, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetMode
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetMode(
+        const CVoIPFormatIntfc::TG711CodecMode aMode)
+    {
+    TPckgBuf<CVoIPFormatIntfc::TG711CodecMode> pckg;
+    pckg() = aMode;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPSetG711CodecMode, args);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetMode
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetMode(
+        CVoIPFormatIntfc::TG711CodecMode& aMode)
+    {
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPGetG711CodecMode, args);
+    if (err == KErrNone)
+        {
+        aMode = (CVoIPFormatIntfc::TG711CodecMode) pckg().iUint;
+        err = pckg().iStatus;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetMode
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetMode(
+        const CVoIPFormatIntfc::TILBCCodecMode aMode)
+    {
+    TPckgBuf<CVoIPFormatIntfc::TILBCCodecMode> pckg;
+    pckg() = aMode;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPSetIlbcCodecMode, args);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetMode
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetMode(
+        CVoIPFormatIntfc::TILBCCodecMode& aMode)
+    {
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPGetIlbcCodecMode, args);
+    if (err == KErrNone)
+        {
+        aMode = (CVoIPFormatIntfc::TILBCCodecMode) pckg().iUint;
+        err = pckg().iStatus;
+        }
+
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetCNG
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetCNG(const TBool aCng)
+    {
+    TInt err = SendClientRequest(EVoIPSetCng, TIpcArgs(aCng));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetCNG
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetCNG(TBool& aCng)
+    {
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPGetCng, args);
+    if (err == KErrNone)
+        {
+        aCng = pckg().iBool;
+        err = pckg().iStatus;
+        }
+
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SetPLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::SetPLC(const TBool aPlc)
+    {
+    TInt err = SendClientRequest(EVoIPSetPlc, TIpcArgs(aPlc));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::GetPLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::GetPLC(TBool& aPlc)
+    {
+    TVoIPMsgBufPckg pckg;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPGetPlc, args);
+    if (err == KErrNone)
+        {
+        aPlc = pckg().iBool;
+        err = pckg().iStatus;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::BadLsfNextBuffer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::BadLsfNextBuffer()
+    {
+    TInt err = SendClientRequest(EVoIPBadLsfNextBuffer, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::Open
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::OpenDTMFTonePlayer()
+    {
+    TInt err = SendClientRequest(EVoIPOpenDTMFTonePlayer, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// RVoIPAudioSession::Play
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::PlayDTMFTone(const TDesC& aTones)
+    {
+    TTonesMsgBufPckg pckg;
+    pckg().iFileName = aTones;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPPlayDTMFTone, args);
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// RVoIPAudioSession::Stop
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::StopDTMFTonePlay()
+    {
+    TInt err = SendClientRequest(EVoIPStopDTMFTone, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// RVoIPAudioSession::Close
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void RVoIPAudioSession::CloseDTMFTonePlayer()
+    {
+    SendClientRequest(EVoIPCloseDTMFTonePlayer, TIpcArgs(TIpcArgs::ENothing));
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::OpenRingTonePlayer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::OpenRingTonePlayer()
+    {
+    TInt err = SendClientRequest(EVoIPOpenRingTonePlayerFromProfile, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::OpenRingTonePlayer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::OpenRingTonePlayer(const TDesC& aFileName)
+    {
+    TTonesMsgBufPckg pckg;
+    pckg().iFileName = aFileName;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPOpenRingTonePlayerFromFile, args);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::OpenRingTonePlayer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::OpenRingTonePlayer(const RFile& aFileHandle)
+    {
+    TIpcArgs args;
+    aFileHandle.TransferToServer(args, 0, 1); //0=Fs, 1==file handle
+    TInt err = SendClientRequest(EVoIPOpenRingTonePlayerFromRFile, args);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::OpenRingTonePlayer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::OpenRingTonePlayer(const TDesC8& aDesData)
+    {
+    TPtrC8 ptr(aDesData);
+    TIpcArgs args;
+    args.Set(0, &ptr);
+    TInt err = SendClientRequest(EVoIPOpenRingTonePlayerFromDes, args);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::PlayRingTone
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::PlayRingTone()
+    {
+    TInt err = SendClientRequest(EVoIPPlayRingTone, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::PauseRingTone
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::PauseRingTone()
+    {
+    TInt err = SendClientRequest(EVoIPPauseRingTone, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::ResumeRingTone
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::ResumeRingTone()
+    {
+    TInt err = SendClientRequest(EVoIPResumeRingTone, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::StopRingTone
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::StopRingTone()
+    {
+    TInt err = SendClientRequest(EVoIPStopRingTone, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::CloseRingTonePlayer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RVoIPAudioSession::CloseRingTonePlayer()
+    {
+    SendClientRequest(EVoIPCloseRingTonePlayer, TIpcArgs(TIpcArgs::ENothing));
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::ConfigureJitterBuffer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::ConfigureJitterBuffer(
+        const TVoIPJBConfig& aJbConfig)
+    {
+    TPckgBuf<TVoIPJBConfig> pckg;
+    pckg() = aJbConfig;
+    TIpcArgs args(&pckg);
+    TInt err = SendClientRequest(EVoIPConfigJitterBuffer, args);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::ResetJitterBuffer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::ResetJitterBuffer(const TBool aPlayTone)
+    {
+    TInt err = SendClientRequest(EVoIPResetJitterBuffer, TIpcArgs(aPlayTone));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::DelayDown
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::DelayDown()
+    {
+    TInt err = SendClientRequest(EVoIPJBDelayDown, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::DelayUp
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RVoIPAudioSession::DelayUp()
+    {
+    TInt err = SendClientRequest(EVoIPJBDelayUp, TIpcArgs(TIpcArgs::ENothing));
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::PopulateArrayL
+// -----------------------------------------------------------------------------
+//
+void RVoIPAudioSession::PopulateArrayL(
+        TVoIPAudioClientServerRequest aRequest, RArray<TUint32>& aDecoders,
+        TInt aCount)
+    {
+    HBufC8* buf = HBufC8::NewLC(aCount * sizeof(TUint32));
+    TPtr8 ptr = buf->Des();
+    TIpcArgs args;
+    args.Set(0, &ptr);
+    TInt err = SendClientRequest(aRequest, args);
+
+    if (err == KErrNone)
+        {
+        RDesReadStream stream(ptr);
+        CleanupClosePushL(stream);
+        aDecoders.Reset();
+
+        for (TInt i = 0; i < aCount; i++)
+            {
+            aDecoders.Append(stream.ReadUint32L());
+            }
+
+        CleanupStack::PopAndDestroy(&stream);
+        }
+
+    CleanupStack::PopAndDestroy(buf);
+    }
+
+
+// -----------------------------------------------------------------------------
+// RVoIPAudioSession::SendClientRequest
+// -----------------------------------------------------------------------------
+//
+TInt RVoIPAudioSession::SendClientRequest(
+        TVoIPAudioClientServerRequest aRequest, const TIpcArgs& aArgs) const
+    {
+    TInt status = KErrBadHandle;
+    if (Handle())
+        {
+       // if (&aArgs == TIpcArgs::ENothing)
+        status = SendReceive(aRequest, aArgs);
+        }
+    return status;
+    }
+
+// End of file