diff -r 000000000000 -r 71ca22bcf22a mmserv/voipaudioservices/VoIPServer/src/VoIPServerSession.cpp --- /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 +#include +#include +#include +#include +#include +#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 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 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 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 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 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 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 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 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 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 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 (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 (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