--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/voipaudioservices/VoIPServer/src/VoIPServerSession.cpp Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,2216 @@
+/*
+ * 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: VoIP audio server session class implementation.
+ * Each session is created either for an uplink, downlink or
+ * ring tone player. Separate thread is created for uplink and
+ * downlink stream. Ring tone player runs in the main thread.
+ *
+ */
+
+#include <AudioPreference.h>
+#include <MProEngEngine.h>
+#include <MProEngProfile.h>
+#include <MProEngTones.h>
+#include <ProEngFactory.h>
+#include <voipaudiocommon.h>
+#include "debugtracemacros.h"
+#include "VoIPAudioSession.h"
+#include "VoIPServerThread.h"
+#include "VoIPSharedData.h"
+#include "VoIPServerSession.h"
+
+// These are the default tone length settings for the US
+const TUint KDTMFToneLengthOn = 250000;
+const TUint KDTMFToneLengthOff = 50000;
+const TUint KDTMFToneLengthPause = 2500000;
+const TUint KArrayExpandSize = 8;
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::NewL
+// Symbian constructor.
+// -----------------------------------------------------------------------------
+//
+CVoIPAudioServerSession* CVoIPAudioServerSession::NewL(
+ CVoIPAudioServer &aServer)
+ {
+ CVoIPAudioServerSession* self = new (ELeave) CVoIPAudioServerSession(
+ aServer);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::~CVoIPAudioServerSession
+// The destructor
+// -----------------------------------------------------------------------------
+//
+CVoIPAudioServerSession::~CVoIPAudioServerSession()
+ {
+ TRACE_PRN_FN_ENT;
+
+ if (iAO)
+ {
+ iAO->Cancel();
+ delete iAO;
+ }
+
+ delete iDevSound;
+ delete iToneBuf;
+ delete iRingTonePlayer;
+ delete iDTMFTonePlayer;
+ iCodecsUp.Reset();
+ iCodecsUp.Close();
+ iCodecsDn.Reset();
+ iCodecsDn.Close();
+
+ if (iThread.Handle() > 0)
+ {
+ iThread.Close(); // close thread handle
+ }
+
+ if (iMsgComQueueDtmf.Handle() > 0)
+ {
+ iMsgComQueueDtmf.Close();
+ }
+
+ if (iMsgComQueue.Handle() > 0)
+ {
+ iMsgComQueue.Close();
+ }
+
+ if (iITCMsgComQueue.Handle() > 0)
+ {
+ iITCMsgComQueue.Close();
+ }
+
+ iShared.iMutex.Close();
+ iShared.iCodecSettings.iArrBitrates.Reset();
+
+ iVoIPServer.DropSession(); // will start shutdown if no more sessions left
+
+ // Release memory and close handles to unused plug-ins held by the DevSound
+ REComSession::FinalClose();
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::ConstructL
+// 2-nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::ConstructL()
+ {
+ TRACE_PRN_FN_ENT;
+
+ // Create semaphore for thread signaling when accessing shared data
+ iShared.iMutex.CreateLocal();
+
+ // Setup A/O for ITC to receive callbacks from the uplink/downlink threads
+ // Note: Must replace with msg queue if multiple callbacks can be
+ // received at the same time.
+ TThreadId tID = RThread().Id();
+ iShared.iMutex.Wait();
+ iShared.iMainThreadID = tID;
+ iAO = new (ELeave) CVoIPServerAO(this, tID);
+ iShared.iMnThreadStatus = &(this->iAO->iStatus);
+ iShared.iMutex.Signal();
+ iShared.iCodecSettings.iG711FrameRate = TVoIPCodecSettings::E20MS;
+ iAO->Request();
+ iSessionType = ENone;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::CVoIPAudioServerSession
+// -----------------------------------------------------------------------------
+//
+CVoIPAudioServerSession::CVoIPAudioServerSession(CVoIPAudioServer &aServer) :
+ iVoIPServer(aServer)
+ {
+ TRACE_PRN_FN_ENT;
+ iVoIPServer.AddSession(); //add new session
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::ServiceL
+// Service request handler.
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::ServiceL(const RMessage2& aMessage)
+ {
+ TRAPD(err, DispatchMessageL(aMessage));
+ if (!iMsgQueued)
+ {
+ aMessage.Complete(err);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::DispatchMessageL
+// Service request handler.
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::DispatchMessageL(const RMessage2& aMessage)
+ {
+ switch (aMessage.Function())
+ {
+ case EVoIPSetEncoderPriority:
+ case EVoIPSetDecoderPriority:
+ SetPriorityL(aMessage);
+ break;
+ case EVoIPGetSupportedEncodersCount:
+ if (iSessionType == ENone)
+ {
+ iSessionType = EQueryEnc;
+ }
+ GetCodecsCountL(aMessage);
+ break;
+ case EVoIPGetSupportedDecodersCount:
+ if (iSessionType == ENone)
+ {
+ iSessionType = EQueryDec;
+ }
+ GetCodecsCountL(aMessage);
+ break;
+ case EVoIPGetSupportedEncoders:
+ if (iSessionType == ENone)
+ {
+ iSessionType = EQueryEnc;
+ }
+ GetSupportedCodecsL(aMessage);
+ break;
+ case EVoIPGetSupportedDecoders:
+ GetSupportedCodecsL(aMessage);
+ break;
+ case EVoIPSetDecoder:
+ if (iSessionType == ENone)
+ {
+ iSessionType = EQueryDec;
+ }
+ SetFormatL(aMessage);
+ break;
+ case EVoIPSetEncoder:
+ if (iSessionType == ENone)
+ {
+ iSessionType = EQueryEnc;
+ }
+ SetFormatL(aMessage);
+ break;
+ case EVoIPOpenDownlink:
+ OpenDownlinkL(aMessage);
+ break;
+ case EVoIPOpenUplink:
+ OpenUplinkL(aMessage);
+ break;
+ case EVoIPStartDownlink:
+ StartDownlink();
+ break;
+ case EVoIPStartUplink:
+ StartUplink();
+ break;
+ case EVoIPStopDownlink:
+ StopDownlink();
+ break;
+ case EVoIPStopUplink:
+ StopUplink();
+ break;
+ case EVoIPCloseDownlink:
+ CloseDownlink();
+ break;
+ case EVoIPCloseUplink:
+ CloseUplink();
+ break;
+ case EVoIPGetMaxVolume:
+ GetMaxVolumeL(aMessage);
+ break;
+ case EVoIPGetVolume:
+ GetVolume(aMessage);
+ break;
+ case EVoIPSetVolume:
+ SetVolume(aMessage);
+ break;
+ case EVoIPGetMaxGain:
+ GetMaxGainL(aMessage);
+ break;
+ case EVoIPGetGain:
+ GetGain(aMessage);
+ break;
+ case EVoIPSetGain:
+ SetGain(aMessage);
+ break;
+ case EVoIPSetAudioDevice:
+ SetAudioDeviceL(aMessage);
+ break;
+ case EVoIPGetAudioDevice:
+ GetAudioDevice(aMessage);
+ break;
+ case EVoIPBufferFilled:
+ BufferFilledL(aMessage);
+ break;
+ case EVoIPBufferEmptied:
+ BufferEmptiedL(aMessage);
+ break;
+ case EVoIPSetIlbcCodecMode:
+ SetIlbcCodecModeL(aMessage);
+ break;
+ case EVoIPGetIlbcCodecMode:
+ GetIlbcCodecMode(aMessage);
+ break;
+ case EVoIPSetG711CodecMode:
+ SetG711CodecModeL(aMessage);
+ break;
+ case EVoIPGetG711CodecMode:
+ GetG711CodecMode(aMessage);
+ break;
+ case EVoIPGetSupportedBitratesCount:
+ GetSupportedBitratesCount(aMessage);
+ break;
+ case EVoIPGetSupportedBitrates:
+ GetSupportedBitratesL(aMessage);
+ break;
+ case EVoIPSetBitrate:
+ SetBitrate(aMessage);
+ break;
+ case EVoIPGetBitrate:
+ GetBitrate(aMessage);
+ break;
+ case EVoIPFrameModeRqrdForEC:
+ FrameModeRqrdForEC(aMessage);
+ break;
+ case EVoIPSetFrameMode:
+ SetFrameMode(aMessage);
+ break;
+ case EVoIPGetFrameMode:
+ GetFrameMode(aMessage);
+ break;
+ case EVoIPConcealErrForNextBuf:
+ ConcealErrorForNextBuffer();
+ break;
+ case EVoIPSetVad:
+ SetVad(aMessage);
+ break;
+ case EVoIPGetVad:
+ GetVad(aMessage);
+ break;
+ case EVoIPSetCng:
+ SetCng(aMessage);
+ break;
+ case EVoIPGetCng:
+ GetCng(aMessage);
+ break;
+ case EVoIPSetPlc:
+ SetPlc(aMessage);
+ break;
+ case EVoIPGetPlc:
+ GetPlc(aMessage);
+ break;
+ case EVoIPBadLsfNextBuffer:
+ BadLsfNextBuffer();
+ break;
+ case EVoIPOpenDTMFTonePlayer:
+ OpenDTMFTonePlayerL();
+ break;
+ case EVoIPPlayDTMFTone:
+ PlayDTMFToneL(aMessage);
+ break;
+ case EVoIPStopDTMFTone:
+ StopDTMFTonePlay();
+ break;
+ case EVoIPCloseDTMFTonePlayer:
+ CloseDTMFTonePlayer();
+ break;
+ case EVoIPOpenRingTonePlayerFromFile:
+ OpenRingTonePlayerFromFileL(aMessage);
+ break;
+ case EVoIPOpenRingTonePlayerFromRFile:
+ OpenRingTonePlayerFromRFileL(aMessage);
+ break;
+ case EVoIPOpenRingTonePlayerFromProfile:
+ OpenRingTonePlayerFromProfileL();
+ break;
+ case EVoIPOpenRingTonePlayerFromDes:
+ OpenRingTonePlayerFromDesL(aMessage);
+ break;
+ case EVoIPPlayRingTone:
+ PlayRingTone();
+ break;
+ case EVoIPPauseRingTone:
+ PauseRingTone();
+ break;
+ case EVoIPResumeRingTone:
+ ResumeRingTone();
+ break;
+ case EVoIPStopRingTone:
+ StopRingTone();
+ break;
+ case EVoIPCloseRingTonePlayer:
+ CloseRingTonePlayer();
+ break;
+ case EVoIPConfigJitterBuffer:
+ ConfigureJitterBufferL(aMessage);
+ break;
+ case EVoIPResetJitterBuffer:
+ ResetJitterBuffer(aMessage);
+ break;
+ case EVoIPJBDelayDown:
+ JBDelayDown();
+ break;
+ case EVoIPJBDelayUp:
+ JBDelayUp();
+ break;
+ case EVoIPSessionClose:
+ break;
+ default:
+ User::Leave(KErrNotSupported);
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetDecoderPriority
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetPriorityL(const RMessage2& aMessage)
+ {
+ TMMFPrioritySettingsPckg pckg;
+ aMessage.ReadL(0, pckg);
+ iPriority = pckg();
+ iShared.iMutex.Wait();
+ iShared.iPreference = iPriority.iPref;
+ iShared.iPriority = iPriority.iPriority;
+ iShared.iMutex.Signal();
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetCodecsCountL
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetCodecsCountL(const RMessage2& aMessage)
+ {
+ TRACE_PRN_FN_ENT;
+
+ TVoIPMsgBufPckg p;
+ p().iStatus = KErrNone;
+ p().iInt = 0;
+
+ // Is codecs info already available?
+ if (iCodecsCountUp > 0 &&
+ (iSessionType == EQueryEnc || iSessionType == EUplink))
+ {
+ p().iInt = iCodecsCountUp;
+ iShared.iMutex.Wait();
+ p().iUint = iShared.iCodecSettings.iG711FrameRate; //TODO:
+ iShared.iMutex.Signal();
+ }
+ else if (iCodecsCountDn > 0 &&
+ (iSessionType == EQueryDec || iSessionType == EDnlink))
+ {
+ p().iInt = iCodecsCountDn;
+ iShared.iMutex.Wait();
+ p().iUint = iShared.iCodecSettings.iG711FrameRate; //TODO:
+ iShared.iMutex.Signal();
+ }
+ else
+ {
+ delete iDevSound;
+ iDevSound = NULL;
+ iDevSound = CMMFDevSound::NewL();
+
+ if (iDevSound)
+ {
+ iCodecsUp.Reset();
+ iCodecsCountUp = 0;
+ iDevSound->GetSupportedInputDataTypesL(iCodecsUp, iPriority);
+/*
+#ifdef __WINSCW__
+ // Support for adaptation stubs
+ iCodecsUp.Append(KMccFourCCIdG711);
+ iCodecsUp.Append(KMccFourCCIdG729);
+ iCodecsUp.Append(KMccFourCCIdILBC);
+ iCodecsUp.Append(KMccFourCCIdAMRNB);
+#endif
+*/
+ iCodecsCountUp = iCodecsUp.Count();
+
+ iCodecsDn.Reset();
+ iCodecsCountDn = 0;
+ iDevSound->GetSupportedOutputDataTypesL(iCodecsDn, iPriority);
+/*
+#ifdef __WINSCW__
+ // Support for adaptation stubs
+ iCodecsDn.Append(KMccFourCCIdG711);
+ iCodecsDn.Append(KMccFourCCIdG729);
+ iCodecsDn.Append(KMccFourCCIdILBC);
+ iCodecsDn.Append(KMccFourCCIdAMRNB);
+#endif
+*/
+ iCodecsCountDn = iCodecsDn.Count();
+ }
+ }
+
+ delete iDevSound;
+ iDevSound = NULL;
+
+ if (iSessionType == EQueryEnc || iSessionType == EUplink)
+ {
+ p().iInt = iCodecsCountUp;
+ }
+ else if (iSessionType == EQueryDec || iSessionType == EDnlink)
+ {
+ p().iInt = iCodecsCountDn;
+ }
+
+ p().iUint = KVoIPG711FrameLen20ms; //good for 10ms and 20ms
+ aMessage.WriteL(0, p);
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetSupportedEncodersL
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetSupportedCodecsL(const RMessage2& aMessage)
+ {
+ TRACE_PRN_FN_ENT;
+
+ CBufFlat* dataCopyBuffer = CBufFlat::NewL(KArrayExpandSize);
+ CleanupStack::PushL(dataCopyBuffer);
+ RBufWriteStream stream;
+ stream.Open(*dataCopyBuffer);
+ CleanupClosePushL(stream);
+
+ if (iCodecsCountUp > 0 &&
+ (iSessionType == EQueryEnc || iSessionType == EUplink))
+ {
+ for (TInt i = 0; i < iCodecsCountUp; i++)
+ {
+ stream.WriteUint32L(iCodecsUp[i].FourCC());
+ TRACE_PRN_N2(_L("VoIP->CodecUP[%d]==[0x%x]"), i+1, iCodecsUp[i].FourCC());
+ }
+ }
+ else if (iCodecsCountDn > 0 &&
+ (iSessionType == EQueryDec || iSessionType == EDnlink))
+ {
+ for (TInt i = 0; i < iCodecsCountDn; i++)
+ {
+ stream.WriteUint32L(iCodecsDn[i].FourCC());
+ TRACE_PRN_N2(_L("VoIP->CodecDN[%d]==[0x%x]"), i+1, iCodecsDn[i].FourCC());
+ }
+ }
+
+ aMessage.WriteL(0, dataCopyBuffer->Ptr(0));
+
+ CleanupStack::PopAndDestroy(&stream);
+ CleanupStack::PopAndDestroy(dataCopyBuffer);
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::OpenDownlinkL
+// Method for player initialization.
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::OpenDownlinkL(const RMessage2& aMessage)
+ {
+ TRACE_PRN_FN_ENT;
+
+ TMMFPrioritySettingsPckg pckg;
+ aMessage.ReadL(0, pckg);
+ iShared.iMutex.Wait();
+ iShared.iPreference = pckg().iPref;
+ iShared.iPriority = pckg().iPriority;
+ iShared.iMutex.Signal();
+
+ TInt err = KErrPermissionDenied;
+
+ if (iVoIPServer.HasDnLinkSession())
+ {
+ User::Leave(err);
+ }
+
+ // Create thread only once
+ if (iThread.Handle() <= 0)
+ {
+ err = iThread.Create(_L("VoIPDownlinkThread"),
+ CVoIPDownlinkThread::ThreadFunction,
+ KDefaultStackSize,
+ KMinHeapSize,
+ KMinHeapSize << 12, //1MB
+ &iShared);
+ if (err == KErrNone)
+ {
+ iThread.SetPriority(EPriorityRealTime);
+ iThread.Resume();
+
+ // Open message queue for ITC back to the client
+ if (iMsgComQueue.Handle() <= 0)
+ {
+ err = iMsgComQueue.OpenGlobal(KDnLinkComQueue);
+ }
+
+ // Create message queue for ITC with CVoIPDownlinkThread
+ if (iITCMsgComQueue.Handle() <= 0)
+ {
+ err = iITCMsgComQueue.CreateGlobal(KDnLinkThreadComQueue,
+ KVoIPMsgComQSlots);
+ }
+
+ iVoIPServer.SetDnLinkSession(this, ETrue);
+ iSessionType = EDnlink;
+ }
+ }
+
+ TRACE_PRN_IF_ERR(err);
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::OpenUplinkL
+// Method for recorder initialization.
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::OpenUplinkL(const RMessage2& aMessage)
+ {
+ TRACE_PRN_FN_ENT;
+
+ TMMFPrioritySettingsPckg pckg;
+ aMessage.ReadL(0, pckg);
+ iShared.iMutex.Wait();
+ iShared.iPreference = pckg().iPref;
+ iShared.iPriority = pckg().iPriority;
+ iShared.iMutex.Signal();
+
+ TInt err = KErrPermissionDenied;
+
+ if (iVoIPServer.HasUpLinkSession())
+ {
+ User::Leave(err);
+ }
+
+ // Create thread only once
+ if (iThread.Handle() <= 0)
+ {
+ err = iThread.Create(_L("VoIPUplinkThread"),
+ CVoIPUplinkThread::ThreadFunction,
+ KDefaultStackSize,
+ KMinHeapSize,
+ KMinHeapSize << 12, //1MB
+ &iShared);
+ if (err == KErrNone)
+ {
+ iThread.SetPriority(EPriorityRealTime);
+ iThread.Resume();
+
+ // Create message queues
+ if (iMsgComQueue.Handle() <= 0)
+ {
+ err = iMsgComQueue.OpenGlobal(KUpLinkComQueue);
+ }
+
+ // Create message queue for ITC with CVoIPDownlinkThread
+ if (iITCMsgComQueue.Handle() <= 0)
+ {
+ err = iITCMsgComQueue.CreateGlobal(KUpLinkThreadComQueue,
+ KVoIPMsgComQSlots);
+ }
+
+ iVoIPServer.SetUpLinkSession(this, ETrue);
+ iSessionType = EUplink;
+ }
+ }
+
+ TRACE_PRN_IF_ERR(err);
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetFormat
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetFormatL(const RMessage2& aMessage)
+ {
+ TPckgBuf<TUint32> pckg;
+ aMessage.ReadL(0, pckg);
+ iShared.iMutex.Wait();
+ iShared.iCodecSettings.iFourCC = pckg();
+ iShared.iMutex.Signal();
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::StartDownlink
+// Call the thread to initialize downlink stream
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::StartDownlink()
+ {
+ SendCmdToThread(ECmdStartDownlink);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::StartUplink
+// Call the thread to initialize uplink stream
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::StartUplink()
+ {
+ SendCmdToThread(ECmdStartUplink);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::StopDownlink
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::StopDownlink()
+ {
+ SendCmdToThread(ECmdStopDownlink);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::StopUplink
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::StopUplink()
+ {
+ SendCmdToThread(ECmdStopUplink);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::CloseDownlink
+// Request downlink thread termination
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::CloseDownlink()
+ {
+ if (iThread.Handle() > 0)
+ {
+ SendCmdToThread(ECmdTerminateThread);
+ iThread.Close(); // close thread handle
+ iVoIPServer.SetDnLinkSession(this, EFalse);
+ NotifyClient(ECmdDownlinkThreadClosed);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::CloseUplink
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::CloseUplink()
+ {
+ if (iThread.Handle() > 0)
+ {
+ SendCmdToThread(ECmdTerminateThread);
+ iThread.Close(); // close thread handle
+ iVoIPServer.SetUpLinkSession(this, EFalse);
+ NotifyClient(ECmdUplinkThreadClosed);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetMaxVolume
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetMaxVolumeL(const RMessage2& aMessage)
+ {
+ TPckgBuf<TInt> p(iMaxVolume);
+ aMessage.WriteL(0, p);
+
+ TRACE_PRN_N1(_L("VoIP->SRV-SESSION: GetMaxVolumeL->MaxVolume [%d]"),
+ iMaxVolume);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetVolume
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetVolume(const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdGetVolume);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetVolume
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetVolume(const RMessage2& aMessage)
+ {
+ iShared.iMutex.Wait();
+ iShared.iInt = aMessage.Int0();
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdSetVolume);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetMaxGain
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetMaxGainL(const RMessage2& aMessage)
+ {
+ TPckgBuf<TInt> p(iMaxGain);
+ aMessage.WriteL(0, p);
+
+ TRACE_PRN_N1(_L("VoIP->SRV-SESSION: GetMaxGainL->MaxGain [%d]"), iMaxGain);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetGain
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetGain(const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdGetGain);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetGain
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetGain(const RMessage2& aMessage)
+ {
+ TInt gain = aMessage.Int0();
+ if (gain > iMaxGain)
+ {
+ gain = iMaxGain;
+ }
+
+ iShared.iMutex.Wait();
+ iShared.iInt = gain;
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdSetGain);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetAudioDeviceL
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetAudioDeviceL(const RMessage2& aMessage)
+ {
+ TPckgBuf<TUint> pckg;
+ aMessage.ReadL(0, pckg);
+ iShared.iMutex.Wait();
+ iShared.iAudioDevice = pckg();
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdSetAudioDevice);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetAudioDevice
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetAudioDevice(const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdGetAudioDevice);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::BufferFilled
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::BufferFilledL(const RMessage2& aMessage)
+ {
+ // TRACE_PRN_FN_ENT;
+
+ TVoIPMsgBufPckg pckg;
+ aMessage.ReadL(0, pckg);
+ iShared.iMutex.Wait();
+ iShared.iBufferSize = pckg().iInt;
+ iShared.iSequenceNum = pckg().iUint;
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdBufferFilled);
+
+ // TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::BufferEmptied
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::BufferEmptiedL(const RMessage2& /*aMessage*/)
+ {
+ // TRACE_PRN_FN_ENT;
+ SendCmdToThread(ECmdBufferEmptied);
+ // TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetIlbcCodecMode
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetIlbcCodecModeL(const RMessage2& aMessage)
+ {
+ TPckgBuf<CVoIPFormatIntfc::TILBCCodecMode> pckg;
+ aMessage.ReadL(0, pckg);
+ iShared.iMutex.Wait();
+ iShared.iCodecSettings.iILBCCodecMode = pckg();
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdSetIlbcCodecMode);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetIlbcCodecMode
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetIlbcCodecMode(const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdGetIlbcCodecMode);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetG711CodecMode
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetG711CodecModeL(const RMessage2& aMessage)
+ {
+ TPckgBuf<CVoIPFormatIntfc::TG711CodecMode> pckg;
+ aMessage.ReadL(0, pckg);
+ iShared.iMutex.Wait();
+ iShared.iCodecSettings.iG711CodecMode = pckg();
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdSetG711CodecMode);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetG711CodecMode
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetG711CodecMode(const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdGetG711CodecMode);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetSupportedBitratesCount
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetSupportedBitratesCount(
+ const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdGetSupportedBitrates);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetSupportedBitratesL
+// Bitrates are already returned from the codec as a result of call to
+// GetSupportedBitratesCount(). Just pack them into a descriptor and return
+// bact to the client.
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetSupportedBitratesL(const RMessage2& aMessage)
+ {
+ TRACE_PRN_FN_ENT;
+
+ CBufFlat* dataCopyBuffer = CBufFlat::NewL(KArrayExpandSize);
+ CleanupStack::PushL(dataCopyBuffer);
+ RBufWriteStream stream;
+ stream.Open(*dataCopyBuffer);
+ CleanupClosePushL(stream);
+
+ RArray<TUint> bitrates;
+ iShared.iMutex.Wait();
+ bitrates = iShared.iCodecSettings.iArrBitrates;
+ iShared.iMutex.Signal();
+ TInt numOfItems = bitrates.Count();
+
+ for (TInt i = 0; i < numOfItems; i++)
+ {
+ stream.WriteUint32L(bitrates[i]);
+
+ TRACE_PRN_N1(_L("VoIP->SRV-SESSION: BR: [%d]"), bitrates[i]);
+ }
+
+ aMessage.WriteL(0, dataCopyBuffer->Ptr(0));
+
+ CleanupStack::PopAndDestroy(&stream);
+ CleanupStack::PopAndDestroy(dataCopyBuffer);
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetBitrate
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetBitrate(const RMessage2& aMessage)
+ {
+ TUint bitrate = aMessage.Int0();
+ iShared.iMutex.Wait();
+ iShared.iCodecSettings.iBitrate = bitrate;
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdSetBitrate);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetBitrate
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetBitrate(const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdGetBitrate);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::FrameModeRequiredForEC
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::FrameModeRqrdForEC(const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdFrameModeRqrdForEC);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetFrameMode
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetFrameMode(const RMessage2& aMessage)
+ {
+ iShared.iMutex.Wait();
+ iShared.iCodecSettings.iFrameMode = TBool(aMessage.Int0());
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdSetFrameMode);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetFrameMode
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetFrameMode(const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdGetFrameMode);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::ConcealErrorForNextBuffer
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::ConcealErrorForNextBuffer()
+ {
+ SendCmdToThread(ECmdConcealErrForNextBuf);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetVad
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetVad(const RMessage2& aMessage)
+ {
+ iShared.iMutex.Wait();
+ iShared.iCodecSettings.iVad = TBool(aMessage.Int0());
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdSetVad);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetVad
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetVad(const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdGetVad);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetCng
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetCng(const RMessage2& aMessage)
+ {
+ iShared.iMutex.Wait();
+ iShared.iCodecSettings.iCng = TBool(aMessage.Int0());
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdSetCng);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetCng
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetCng(const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdGetCng);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SetPlc
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SetPlc(const RMessage2& aMessage)
+ {
+ iShared.iMutex.Wait();
+ iShared.iCodecSettings.iPlc = TBool(aMessage.Int0());
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdSetPlc);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetPlc
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetPlc(const RMessage2& aMessage)
+ {
+ iMessage = aMessage;
+ iMsgQueued = ETrue;
+ SendCmdToThread(ECmdGetPlc);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::BadLsfNextBuffer
+//
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::BadLsfNextBuffer()
+ {
+ SendCmdToThread(ECmdBadLsfNextBuffer);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::ConfigureJitterBufferL
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::ConfigureJitterBufferL(const RMessage2& aMessage)
+ {
+ TRACE_PRN_FN_ENT;
+
+ TPckgBuf<TVoIPJBConfig> pckg;
+ aMessage.ReadL(0, pckg);
+ iShared.iMutex.Wait();
+ iShared.iJBConfig.iJBBufferLength = pckg().iJBBufferLength;
+ iShared.iJBConfig.iJBThreshold = pckg().iJBThreshold;
+ iShared.iJBConfig.iJitterLatency = pckg().iJitterLatency;
+ iShared.iJBConfig.iSampleInterval = pckg().iSampleInterval;
+ iShared.iJBConfig.iJBInactivityTimeOut = pckg().iJBInactivityTimeOut;
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdVoIPConfigJB);
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::ResetJitterBuffer
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::ResetJitterBuffer(const RMessage2& aMessage)
+ {
+ iShared.iMutex.Wait();
+ iShared.iBool = TBool(aMessage.Int0());
+ iShared.iMutex.Signal();
+ SendCmdToThread(ECmdVoIPResetJB);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::JBDelayDown
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::JBDelayDown()
+ {
+ SendCmdToThread(ECmdVoIPJBDelayDown);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::JBDelayUp
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::JBDelayUp()
+ {
+ SendCmdToThread(ECmdVoIPJBDelayUp);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::OpenDTMFTonePlayerL
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::OpenDTMFTonePlayerL()
+ {
+ TRACE_PRN_FN_ENT;
+
+ if (iSessionType == EUplink || iSessionType == EDnlink)
+ {
+ CloseDTMFTonePlayer();
+ iDTMFTonePlayer = CMMFDevSound::NewL();
+
+ if (iDTMFTonePlayer)
+ {
+ iDTMFTonePlayerInitRequest = ETrue;
+ TRAPD(err, iDTMFTonePlayer->InitializeL(*this, EMMFStateTonePlaying));
+ if (err != KErrNone)
+ {
+ delete iDTMFTonePlayer;
+ iDTMFTonePlayer = NULL;
+ iDTMFTonePlayerInitRequest = EFalse;
+ return;
+ }
+
+ // Open message queue for ITC back to the client
+ if (iMsgComQueueDtmf.Handle() <= 0)
+ {
+ switch (iSessionType)
+ {
+ case EDnlink:
+ {
+ while (iMsgComQueueDtmf.OpenGlobal(
+ KDTMFToneComQueueDNL))
+ {
+ // to make sure queue is created
+ User::After(KQueueCreateWaitTime);
+ }
+ break;
+ }
+ case EUplink:
+ {
+ while (iMsgComQueueDtmf.OpenGlobal(
+ KDTMFToneComQueueUPL))
+ {
+ // to make sure queue is created
+ User::After(KQueueCreateWaitTime);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ---------------------------------------------------------------------------
+// CVoIPAudioServerSession::PlayDTMFToneL
+// ---------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::PlayDTMFToneL(const RMessage2& aMessage)
+ {
+ TRACE_PRN_FN_ENT;
+
+ // NOTE: no need to queue message, we can complete the message and let
+ // DTMF tones play automatically upon MatoPrepareComplete.
+
+ if (iDTMFTonePlayer)
+ {
+ TTonesMsgBufPckg pckg;
+ aMessage.ReadL(0, pckg);
+ TBuf<KTonesBufferSize> tones;
+ tones = pckg().iFileName;
+ iDTMFTonePlayer->SetDTMFLengths(iToneLenOn, iToneLenOff,
+ iToneLenPause);
+ iDTMFTonePlayer->PlayDTMFStringL(tones);
+ }
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ---------------------------------------------------------------------------
+// CVoIPAudioServerSession::StopDTMFTonePlay
+// ---------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::StopDTMFTonePlay()
+ {
+ if (iDTMFTonePlayer)
+ {
+ iDTMFTonePlayer->Stop();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CVoIPAudioServerSession::CloseDTMFTonePlayer
+// ---------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::CloseDTMFTonePlayer()
+ {
+ delete iDTMFTonePlayer;
+ iDTMFTonePlayer = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::OpenRingTonePlayerFromFileL
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::OpenRingTonePlayerFromFileL(
+ const RMessage2& aMessage)
+ {
+ TRACE_PRN_FN_ENT;
+
+ InitRingTonePlayerL();
+ TTonesMsgBufPckg pckg;
+ aMessage.ReadL(0, pckg);
+ iRingTonePlayer->OpenFileL(pckg().iFileName);
+ iSessionType = ERingTone;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::OpenRingTonePlayerFromRFileL
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::OpenRingTonePlayerFromRFileL(
+ const RMessage2& aMessage)
+ {
+ TRACE_PRN_FN_ENT;
+
+ InitRingTonePlayerL();
+ RFile file;
+ // Note: iFs and file handle are already open by the client who
+ // owns these handles.
+ TInt err = file.AdoptFromClient(aMessage, 0, 1); // 0==iFs, 1==fileHandle
+ CleanupClosePushL(file);
+
+ if (err == KErrNone)
+ {
+ iRingTonePlayer->OpenFileL(file);
+ iSessionType = ERingTone;
+ }
+
+ file.Close(); //will RFs close?
+ CleanupStack::Pop(&file);
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::OpenRingTonePlayerFromProfileL
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::OpenRingTonePlayerFromProfileL()
+ {
+ TRACE_PRN_FN_ENT;
+
+ InitRingTonePlayerL();
+
+ MProEngEngine* engine = ProEngFactory::NewEngineL();
+ CleanupReleasePushL(*engine);
+ MProEngProfile* profile = engine->ActiveProfileLC();
+ MProEngTones& tones = profile->ProfileTones();
+
+ // NOTE: Here is how to use volume settings from Profiles
+ // const TProfileToneSettings& ts = tones.ToneSettings();
+ // iVolume = ts.iRingingVolume;
+
+ TBuf<KMaxFileName> file;
+ file = tones.RingingTone1();
+ // NOTE: alternate line settings can also be used from RingingTone2
+ iRingTonePlayer->OpenFileL(file);
+ iSessionType = ERingTone;
+
+ CleanupStack::PopAndDestroy(2); //profile, engine
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::OpenRingTonePlayerFromDesL
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::OpenRingTonePlayerFromDesL(
+ const RMessage2& aMessage)
+ {
+ TRACE_PRN_FN_ENT;
+
+ InitRingTonePlayerL();
+ TInt size = aMessage.GetDesLength(0);
+
+ if (size > 0)
+ {
+ delete iToneBuf;
+ iToneBuf = NULL;
+ iToneBuf = HBufC8::NewL(size);
+ TPtr8 ptr = iToneBuf->Des();
+ aMessage.ReadL(0, ptr);
+ iRingTonePlayer->OpenDesL(*iToneBuf);
+ iSessionType = ERingTone;
+ }
+ else
+ {
+ User::Leave(KErrArgument); //-6
+ }
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::PlayRingTone
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::PlayRingTone()
+ {
+ if (iRingTonePlayer)
+ {
+ iRingTonePlayer->Play(); //TODO: function returns status
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::PauseRingTone
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::PauseRingTone()
+ {
+ if (iRingTonePlayer)
+ {
+ iRingTonePlayer->Pause(); //TODO: function returns status
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::ResumeRingTone
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::ResumeRingTone()
+ {
+ if (iRingTonePlayer)
+ {
+ iRingTonePlayer->Play();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::StopRingTone
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::StopRingTone()
+ {
+ if (iRingTonePlayer)
+ {
+ iRingTonePlayer->Stop();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::CloseRingTonePlayer
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::CloseRingTonePlayer()
+ {
+ if (iRingTonePlayer)
+ {
+ iRingTonePlayer->Close();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::InitRingTonePlayerL
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::InitRingTonePlayerL()
+ {
+ if (!iRingTonePlayer)
+ {
+ TMdaPriorityPreference pref = TMdaPriorityPreference(
+ KAudioPrefIncomingCall);
+ TInt prio = KAudioPriorityRingingTone;
+ iRingTonePlayer = CMdaAudioPlayerUtility::NewL(*this, prio, pref);
+ }
+
+ // Open message queue for ITC back to the client
+ if (iRingTonePlayer && iMsgComQueue.Handle() <= 0)
+ {
+ while (iMsgComQueue.OpenGlobal(KRingToneComQueue))
+ {
+ // just to make sure queue is created
+ User::After(KQueueCreateWaitTime);
+ }
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::DownlinkInitComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::DownlinkInitComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ // state == DNL initialized
+ // iStatus = EReady;
+ iShared.iMutex.Wait();
+ iMaxVolume = iShared.iMaxVolume;
+ iShared.iMutex.Signal();
+ NotifyClient(ECmdDownlinkInitComplete, aError);
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::UplinkInitComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::UplinkInitComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ // state == UPL initialized
+ // iStatus = EReady;
+ iShared.iMutex.Wait();
+ iMaxGain = iShared.iMaxGain;
+ iShared.iMutex.Signal();
+ NotifyClient(ECmdUplinkInitComplete, aError);
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetVolumeComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetVolumeComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ iShared.iMutex.Wait();
+ TInt vol = iShared.iInt;
+ iShared.iMutex.Signal();
+ TVoIPMsgBufPckg p;
+ p().iInt = vol;
+ p().iStatus = aError;
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetGainComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetGainComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ iShared.iMutex.Wait();
+ TInt gain = iShared.iInt;
+ iShared.iMutex.Signal();
+ TVoIPMsgBufPckg p;
+ p().iInt = gain;
+ p().iStatus = aError;
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetAudioDeviceComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetAudioDeviceComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ TVoIPMsgBufPckg p;
+ iShared.iMutex.Wait();
+ p().iUint = iShared.iAudioDevice;
+ p().iStatus = aError;
+ iShared.iMutex.Signal();
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetSupportedBitratesComplete
+// Notifies bitrate count first.
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetSupportedBitratesComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ TVoIPMsgBufPckg p;
+ iShared.iMutex.Wait();
+ p().iInt = iShared.iCodecSettings.iArrBitrates.Count();
+ p().iStatus = aError;
+ iShared.iMutex.Signal();
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetBitrateComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetBitrateComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ TVoIPMsgBufPckg p;
+ iShared.iMutex.Wait();
+ p().iUint = iShared.iCodecSettings.iBitrate;
+ p().iStatus = aError;
+ iShared.iMutex.Signal();
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetG711CodecModeComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetG711CodecModeComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ TVoIPMsgBufPckg p;
+ iShared.iMutex.Wait();
+ p().iUint = TUint(iShared.iCodecSettings.iG711CodecMode);
+ iShared.iMutex.Signal();
+ p().iStatus = aError;
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetIlbcCodecModeComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetIlbcCodecModeComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ TVoIPMsgBufPckg p;
+ iShared.iMutex.Wait();
+ p().iUint = TUint(iShared.iCodecSettings.iILBCCodecMode);
+ iShared.iMutex.Signal();
+ p().iStatus = aError;
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetFrameModeComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetFrameModeComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ TVoIPMsgBufPckg p;
+ iShared.iMutex.Wait();
+ p().iBool = iShared.iCodecSettings.iFrameMode;
+ iShared.iMutex.Signal();
+ p().iStatus = aError;
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetFrameModeReqForECComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetFrameModeReqForECComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ TVoIPMsgBufPckg p;
+ iShared.iMutex.Wait();
+ p().iBool = iShared.iCodecSettings.iFrameModeReqForEC;
+ iShared.iMutex.Signal();
+ p().iStatus = aError;
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetVadComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetVadComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ TVoIPMsgBufPckg p;
+ iShared.iMutex.Wait();
+ p().iBool = iShared.iCodecSettings.iVad;
+ iShared.iMutex.Signal();
+ p().iStatus = aError;
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetCngComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetCngComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ TVoIPMsgBufPckg p;
+ iShared.iMutex.Wait();
+ p().iBool = iShared.iCodecSettings.iCng;
+ iShared.iMutex.Signal();
+ p().iStatus = aError;
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// ----------------------------------------------------------------------------
+// CVoIPAudioServerSession::GetPlcComplete
+//
+// ----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::GetPlcComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ TVoIPMsgBufPckg p;
+ iShared.iMutex.Wait();
+ p().iBool = iShared.iCodecSettings.iPlc;
+ iShared.iMutex.Signal();
+ p().iStatus = aError;
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::DetermineG711FrameRateL
+// -----------------------------------------------------------------------------
+/*
+void CVoIPAudioServerSession::DetermineG711FrameRateL()
+ {
+ if (iDevSound)
+ {
+ iDevSoundInitRequest = ETrue;
+ TMMFState state = EMMFStatePlaying;
+
+ if (iSessionType == EUplink)
+ {
+ state = EMMFStateRecording;
+ }
+ TRAPD(err, iDevSound->InitializeL(*this, TFourCC(KMccFourCCIdG711),
+ state));
+
+ if (err != KErrNone)
+ {
+ delete iDevSound;
+ iDevSound = NULL;
+ iDevSoundInitRequest = EFalse;
+ }
+ }
+ }*/
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::ReleaseQueuedMessage
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::ReleaseQueuedMessage(TInt aError, TUint aFrmSize)
+ {
+ delete iDevSound;
+ iDevSound = NULL;
+ iDevSoundInitRequest = EFalse;
+ TVoIPMsgBufPckg p;
+
+ if (iSessionType == EQueryEnc || iSessionType == EUplink)
+ {
+ p().iInt = iCodecsCountUp;
+ }
+ else if (iSessionType == EQueryDec || iSessionType == EDnlink)
+ {
+ p().iInt = iCodecsCountDn;
+ }
+
+ p().iUint = aFrmSize;
+ p().iStatus = aError;
+ TRAPD(err, iMessage.WriteL(0, p));
+ iMessage.Complete(err);
+ iMsgQueued = EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::SendCmdToThread
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::SendCmdToThread(const TInt aCommand,
+ const TInt aStatus)
+ {
+ if (iThread.Handle() > 0)
+ {
+ iMsgBuffer.iRequest = aCommand;
+ iMsgBuffer.iStatus = aStatus;
+ iITCMsgComQueue.Send(iMsgBuffer);
+ }
+ else
+ {
+ if (iMsgQueued)
+ {
+ iMessage.Complete(KErrCancel);
+ iMsgQueued = EFalse;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::NotifyClient
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::NotifyClient(const TInt aCommand,
+ const TInt aStatus, const TInt64 /*aInt64*/)
+ {
+ iMsgBuffer.iRequest = aCommand;
+ iMsgBuffer.iStatus = aStatus;
+ iMsgComQueue.Send(iMsgBuffer);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::NotifyDtmfClient
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::NotifyDtmfClient(const TInt aCommand,
+ const TInt aStatus)
+ {
+ iMsgBuffer.iRequest = aCommand;
+ iMsgBuffer.iStatus = aStatus;
+ iMsgComQueueDtmf.Send(iMsgBuffer);
+ }
+
+// CALBACKS
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::InitializeComplete
+//
+// From MDevSoundObserver
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::InitializeComplete(TInt aError)
+ {
+ TRACE_PRN_FN_ENT;
+ TRACE_PRN_IF_ERR(aError);
+
+ if (aError == KErrNone)
+ {
+ TMMFPrioritySettings pSet;
+ iShared.iMutex.Wait();
+ pSet.iPref = iShared.iPreference;
+ pSet.iPriority = iShared.iPriority;
+ iShared.iMutex.Signal();
+
+ if (iDTMFTonePlayer && iDTMFTonePlayerInitRequest)
+ {
+ // initialized DTMF player
+ iDTMFTonePlayer->SetPrioritySettings(pSet);
+ iDTMFTonePlayer->SetVolume(iMaxVolume);
+ iToneLenOn = KDTMFToneLengthOn;
+ iToneLenOff = KDTMFToneLengthOff;
+ iToneLenPause = KDTMFToneLengthPause;
+ iDTMFTonePlayerInitRequest = EFalse;
+
+ if (iSessionType == EUplink)
+ {
+ NotifyDtmfClient(ECmdDTMFOpenUplinkComplete, aError);
+ }
+ else
+ {
+ NotifyDtmfClient(ECmdDTMFOpenDnlinkComplete, aError);
+ }
+ }
+ else if (iDevSound && iDevSoundInitRequest)
+ {
+ // initialized standard player to check G711 frame rate
+ iDevSound->SetPrioritySettings(pSet);
+ iDevSoundInitRequest = EFalse;
+
+ TInt err = KErrNone;
+
+ if (iSessionType == EUplink)
+ {
+ TRAP(err, iDevSound->RecordInitL());
+ }
+ else
+ {
+ TRAP(err, iDevSound->PlayInitL());
+ }
+
+ if (err != KErrNone)
+ {
+ ReleaseQueuedMessage(err);
+ }
+ }
+ }
+ else
+ {
+ if (iDevSound && iDevSoundInitRequest)
+ {
+ ReleaseQueuedMessage(aError);
+ }
+ }
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::ToneFinished
+//
+// From MDevSoundObserver
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::ToneFinished(TInt aError)
+ {
+ TRACE_PRN_IF_ERR(aError);
+
+ NotifyDtmfClient(ECmdDTMFTonePlayFinished, aError);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::BufferToBeEmptied
+//
+// From MDevSoundObserver
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::BufferToBeEmptied(CMMFBuffer* aBuffer)
+ {
+ CMMFDataBuffer* bufPtr = static_cast<CMMFDataBuffer*> (aBuffer);
+ TInt len = bufPtr->BufferSize();
+ iDevSound->Stop();
+
+ if (len == KVoIPG711FrameLen10ms)
+ {
+ iShared.iMutex.Wait();
+ iShared.iCodecSettings.iG711FrameRate = TVoIPCodecSettings::E10MS;
+ iShared.iMutex.Signal();
+ }
+
+ ReleaseQueuedMessage(KErrNone, len);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::BufferToBeFilled
+//
+// From MDevSoundObserver
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::BufferToBeFilled(CMMFBuffer* aBuffer)
+ {
+ CMMFDataBuffer* bufPtr = static_cast<CMMFDataBuffer*> (aBuffer);
+ TInt len = bufPtr->RequestSize();
+ iDevSound->Stop();
+
+ if (len == KVoIPG711FrameLen10ms)
+ {
+ iShared.iMutex.Wait();
+ iShared.iCodecSettings.iG711FrameRate = TVoIPCodecSettings::E10MS;
+ iShared.iMutex.Signal();
+ }
+
+ ReleaseQueuedMessage(KErrNone, len);
+
+ TRACE_PRN_FN_EXT;
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::RecordError
+//
+// From MDevSoundObserver
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::RecordError(TInt aError)
+ {
+ ReleaseQueuedMessage(aError);
+ TRACE_PRN_IF_ERR(aError);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::PlayError
+//
+// From MDevSoundObserver
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::PlayError(TInt aError)
+ {
+ ReleaseQueuedMessage(aError);
+ TRACE_PRN_IF_ERR(aError);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::MapcInitComplete
+//
+// From MMdaAudioPlayerCallback
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::MapcInitComplete(TInt aError,
+ const TTimeIntervalMicroSeconds& aDuration)
+ {
+ TRACE_PRN_IF_ERR(aError);
+
+ if (aError == KErrNone)
+ {
+ TInt vol = iRingTonePlayer->MaxVolume();
+ iRingTonePlayer->SetVolume(vol / 2);
+ }
+
+ NotifyClient(ECmdRingToneOpenComplete, aError, aDuration.Int64());
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::MapcInitComplete
+//
+// From MMdaAudioPlayerCallback
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::MapcPlayComplete(TInt aError)
+ {
+ TRACE_PRN_IF_ERR(aError);
+ NotifyClient(ECmdRingTonePlayComplete, aError);
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::DoHandleError
+//
+// From MThreadComObserver
+//
+// The recorder thread passes commands to this thread via an active object.
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::DoHandleError(TInt /*aError*/)
+ {
+ /* DEBPRN1(_L("VoIP->CVoIPAudioServerSession[0x%x]::DoHandleError [%d] :>"), aError);
+ iShared.iMutex.Wait();
+ TUserCommand cmd = iShared.iCmd;
+ iShared.iMutex.Signal();
+
+ if (iMsgQueued)
+ {
+ iMessage.Complete(aError);
+ iMsgQueued = EFalse;
+ }
+ else
+ {
+ NotifyClient(cmd, aError);
+ }
+ */
+ }
+
+// -----------------------------------------------------------------------------
+// CVoIPAudioServerSession::DoHandleCmd
+//
+// From MThreadComObserver
+//
+// Threads pass complete async request events to this thread via an AO.
+// -----------------------------------------------------------------------------
+//
+void CVoIPAudioServerSession::DoHandleCmd(TExcType aExc, TInt aError)
+ {
+ TRACE_PRN_IF_ERR(aError);
+
+ iShared.iMutex.Wait();
+ TUserCommand cmd = iShared.iCmd;
+ iShared.iMutex.Signal();
+
+ if (aExc == EExcUserInterrupt)
+ {
+ switch (cmd)
+ {
+ case ECmdDownlinkInitComplete:
+ {
+ DownlinkInitComplete(aError);
+ break;
+ }
+ case ECmdUplinkInitComplete:
+ {
+ UplinkInitComplete(aError);
+ break;
+ }
+ case ECmdGetVolumeComplete:
+ {
+ GetVolumeComplete(aError);
+ break;
+ }
+ case ECmdGetGainComplete:
+ {
+ GetGainComplete(aError);
+ break;
+ }
+ case ECmdGetAudioDeviceComplete:
+ {
+ GetAudioDeviceComplete(aError);
+ break;
+ }
+ case ECmdGetSupportedBitratesComplete:
+ {
+ GetSupportedBitratesComplete(aError);
+ break;
+ }
+ case ECmdGetBitrateComplete:
+ {
+ GetBitrateComplete(aError);
+ break;
+ }
+ case ECmdGetG711CodecModeComplete:
+ {
+ GetG711CodecModeComplete(aError);
+ break;
+ }
+ case ECmdGetIlbcCodecModeComplete:
+ {
+ GetIlbcCodecModeComplete(aError);
+ break;
+ }
+ case ECmdGetFrameModeComplete:
+ {
+ GetFrameModeComplete(aError);
+ break;
+ }
+ case ECmdGetFrameModeReqForECComplete:
+ {
+ GetFrameModeReqForECComplete(aError);
+ break;
+ }
+ case ECmdGetVadComplete:
+ {
+ GetVadComplete(aError);
+ break;
+ }
+ case ECmdGetCngComplete:
+ {
+ GetCngComplete(aError);
+ break;
+ }
+ case ECmdGetPlcComplete:
+ {
+ GetPlcComplete(aError);
+ break;
+ }
+ case ECmdDnLinkError:
+ {
+ NotifyClient(ECmdDnLinkError, aError);
+ break;
+ }
+ case ECmdUpLinkError:
+ {
+ NotifyClient(ECmdUpLinkError, aError);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+
+// End of file