diff -r 71ca22bcf22a -r 5a06f39ad45b mmserv/tms/tmsserver/src/tmsaudioinbandtoneplayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/tms/tmsserver/src/tmsaudioinbandtoneplayer.cpp Fri Apr 16 15:29:42 2010 +0300 @@ -0,0 +1,545 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Telephony Multimedia Service + * + */ + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include "tmsutility.h" +#include "tmsaudioinbandtoneplayer.h" +#include "tmsaudiotoneutilityimpl.h" + +using namespace TMS; + +// CONSTANTS +const TInt KPhoneInbandVolumeMax = 10; +const TInt KPhoneInbandVolumeMin = 0; +const TInt KPhoneInbandToneZero = 0; + +// Resourcefile destination. +_LIT( KSystemDefaultbeepRscDrive, "Z:" ); +_LIT( KSystemDefaultbeepRscFile, "DEFAULTBEEP.rSC" ); + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +TMSAudioInbandTonePlayer* TMSAudioInbandTonePlayer::NewL() + { + TMSAudioInbandTonePlayer* self = + new (ELeave) TMSAudioInbandTonePlayer(); + CleanupStack::PushL(self); + self->ConstructL( /*aAudioFactory*/); + CleanupStack::Pop(self); + return self; + } + +//Destructor +TMSAudioInbandTonePlayer::~TMSAudioInbandTonePlayer() + { + TRACE_PRN_FN_ENT; + iFsSession.Close(); + delete iPlayBeepSequence; + delete iPlayNoSoundSequence; + delete iPlayDataSequence; + delete iResourceCallWaitingSeq; + delete iResourceRingGoingSeq; + delete iResourceRadioPathSeq; + delete iResourceSpecialSeq; + delete iResourceCongestionSeq; + delete iResourceReorderSeq; + delete iResourceBusySeq; + delete iCurrent; + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::TMSAudioInbandTonePlayer +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +TMSAudioInbandTonePlayer::TMSAudioInbandTonePlayer() + { + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::ConstructL() + { + // iCurrent = aFactory.CreateAudioToneUtilityL( *this ); + TRACE_PRN_FN_ENT; + iCurrent = TMSAudioToneUtilityImpl::NewL(*this); + + //Get the inband tone sequences from resource and and store to member + //variables + RResourceFile resourceFile; + + TFileName fileName(KSystemDefaultbeepRscDrive); + fileName.Append(KDC_RESOURCE_FILES_DIR); + fileName.Append(KSystemDefaultbeepRscFile); + + iFsSession.Connect(); + resourceFile.OpenL(iFsSession, fileName); + CleanupClosePushL(resourceFile); + + HBufC8* resourceBusy = resourceFile.AllocReadL(R_NET_BUSY); + HBufC8* resourceReorder = resourceFile.AllocReadL(R_NET_REORDER); + HBufC8* resourceCongestion = resourceFile.AllocReadL(R_NET_CONGESTION); + HBufC8* resourceSpecial = resourceFile.AllocReadL( + R_NET_SPECIAL_INFORMATION); + HBufC8* resourceRadioPath = resourceFile.AllocReadL( + R_NET_RADIO_NOT_AVAILABLE); + HBufC8* resourceRingGoing = resourceFile.AllocReadL(R_NET_RING_GOING); + HBufC8* resourceCallWaiting = resourceFile.AllocReadL(R_NET_CALL_WAITING); + HBufC8* dataCallTone = resourceFile.AllocReadL(R_DATA_CALL_TONE); + HBufC8* noSoundSequence = resourceFile.AllocReadL(R_NO_SOUND_SEQUENCE); + HBufC8* beepSequence = resourceFile.AllocReadL(R_BEEP_SEQUENCE); + + CleanupStack::PopAndDestroy(&resourceFile); + + TResourceReader reader; + TInt i(0); + TInt length(0); + + //SubscriberBusy + reader.SetBuffer(resourceBusy); + length = reader.ReadInt16(); + iResourceBusySeq = HBufC8::NewL(length); + //Tptr modifies member variables (HBufC8) length so it includes the memory + //edited by Append() + TPtr8 appendBusy(iResourceBusySeq->Des()); + + for (i = 0; i < length; i++) + { + appendBusy.Append(reader.ReadUint16()); + } + + //Reorder + reader.SetBuffer(resourceReorder); + length = reader.ReadInt16(); + iResourceReorderSeq = HBufC8::NewL(length); + //Tptr modifies member variables (HBufC8) length so it includes the memory + //edited by Append() + TPtr8 appendReorder(iResourceReorderSeq->Des()); + + for (i = 0; i < length; i++) + { + appendReorder.Append(reader.ReadUint16()); + } + + //Congestion + reader.SetBuffer(resourceCongestion); + length = reader.ReadInt16(); + iResourceCongestionSeq = HBufC8::NewL(length); + //Tptr modifies member variables (HBufC8) length so it includes the memory + //edited by Append() + TPtr8 appendCongestion(iResourceCongestionSeq->Des()); + + for (i = 0; i < length; i++) + { + appendCongestion.Append(reader.ReadUint16()); + } + + //Special Information + reader.SetBuffer(resourceSpecial); + length = reader.ReadInt16(); + iResourceSpecialSeq = HBufC8::NewL(length); + //Tptr modifies member variables (HBufC8) length so it includes the memory + //edited by Append() + TPtr8 appendSpecial(iResourceSpecialSeq->Des()); + + for (i = 0; i < length; i++) + { + appendSpecial.Append(reader.ReadUint16()); + } + + //RadioPathNotAvailable + reader.SetBuffer(resourceRadioPath); + length = reader.ReadInt16(); + iResourceRadioPathSeq = HBufC8::NewL(length); + //Tptr modifies member variables (HBufC8) length so it includes the memory + //edited by Append() + TPtr8 appendRadio(iResourceRadioPathSeq->Des()); + + for (i = 0; i < length; i++) + { + appendRadio.Append(reader.ReadUint16()); + } + + //RemoteAlertingTone + reader.SetBuffer(resourceRingGoing); + length = reader.ReadInt16(); + iResourceRingGoingSeq = HBufC8::NewL(length); + //Tptr modifies member variables (HBufC8) length so it includes the memory + //edited by Append() + TPtr8 appendRingGoing(iResourceRingGoingSeq->Des()); + + for (i = 0; i < length; i++) + { + appendRingGoing.Append(reader.ReadUint16()); + } + //CallWaitingTone + reader.SetBuffer(resourceCallWaiting); + length = reader.ReadInt16(); + iResourceCallWaitingSeq = HBufC8::NewL(length); + //Tptr modifies member variables (HBufC8) length so it includes the memory + //edited by Append() + TPtr8 appendCallWaiting(iResourceCallWaitingSeq->Des()); + + for (i = 0; i < length; i++) + { + appendCallWaiting.Append(reader.ReadUint16()); + } + + //DataCalTone + reader.SetBuffer(dataCallTone); + length = reader.ReadInt16(); + iPlayDataSequence = HBufC8::NewL(length); + //Tptr modifies member variables (HBufC8) length so it includes the memory + //edited by Append() + TPtr8 appendDataCallTone(iPlayDataSequence->Des()); + + for (i = 0; i < length; i++) + { + appendDataCallTone.Append(reader.ReadUint16()); + } + + //NoSoundSequence + reader.SetBuffer(noSoundSequence); + length = reader.ReadInt16(); + iPlayNoSoundSequence = HBufC8::NewL(length); + //Tptr modifies member variables (HBufC8) length so it includes the memory + //edited by Append() + TPtr8 appendNoSoundSequence(iPlayNoSoundSequence->Des()); + + for (i = 0; i < length; i++) + { + appendNoSoundSequence.Append(reader.ReadUint16()); + } + + //BeepSequence + reader.SetBuffer(beepSequence); + length = reader.ReadInt16(); + iPlayBeepSequence = HBufC8::NewL(length); + //Tptr modifies member variables (HBufC8) length so it includes the memory + //edited by Append() + TPtr8 appendBeepSequence(iPlayBeepSequence->Des()); + + for (i = 0; i < length; i++) + { + appendBeepSequence.Append(reader.ReadUint16()); + } + + delete dataCallTone; + delete noSoundSequence; + delete beepSequence; + delete resourceBusy; + delete resourceReorder; + delete resourceCongestion; + delete resourceSpecial; + delete resourceRadioPath; + delete resourceRingGoing; + delete resourceCallWaiting; + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::PlayInbandTone +// Searches the given Inband tone from iToneArray and calls PlayCurrentTone. +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::PlayInbandTone( +/*TCCPTone*/TMSInbandToneType aTone) + { + TRACE_PRN_FN_ENT; + //Stop playing if there is something playing + Cancel(); + + UpdateTonePlayerVolume(); + + iToneName = aTone; + + TPtr8 resourceBusySeq = iResourceBusySeq -> Des(); + TPtr8 resourceRadioPathSeq = iResourceRadioPathSeq -> Des(); + TPtr8 resourceCongestionSeq = iResourceCongestionSeq -> Des(); + TPtr8 resourceSpecialSeq = iResourceSpecialSeq -> Des(); + TPtr8 resourceReorderSeq = iResourceReorderSeq->Des(); + TPtr8 resourceRingGoingSeq = iResourceRingGoingSeq -> Des(); + TPtr8 resourceCallWaitingSeq = iResourceCallWaitingSeq -> Des(); + + switch (aTone) + { + case TMS_INBAND_USER_BUSY://ECCPToneUserBusy: + iCurrent->PrepareToPlayDesSequence(resourceBusySeq); + break; + case TMS_INBAND_RADIO_PATH_NOT_AVAIL://ECCPToneRadioPathNotAvailable: + iCurrent->PrepareToPlayDesSequence(resourceRadioPathSeq); + break; + case TMS_INBAND_CONGESTION://ECCPToneCongestion: + iCurrent->PrepareToPlayDesSequence(resourceCongestionSeq); + break; + case TMS_INBAND_SPECIAL_INFO://ECCPToneSpecialInformation: + iCurrent->PrepareToPlayDesSequence(resourceSpecialSeq); + break; + case TMS_INBAND_REORDER://ECCPReorder: + iCurrent->PrepareToPlayDesSequence(resourceReorderSeq); + break; + case TMS_INBAND_REMOTE_ALEARTING://ECCPRemoteAlerting: + iCurrent->PrepareToPlayDesSequence(resourceRingGoingSeq); + break; + case TMS_INBAND_CALL_WAITING://ECCPCallWaiting: + iCurrent->PrepareToPlayDesSequence(resourceCallWaitingSeq); + break; + case TMS_INBAND_NO_SEQUENCE://ECCPNoSoundSequence: + break; + default: + break; + } + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::Cancel +// Cancels the currently playing tone. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::Cancel() + { + TRACE_PRN_FN_ENT; + + if (iCurrent) + { + if (iCurrent->State() == EMdaAudioToneUtilityNotReady) + { + // Prepare is called, but toneplayer's state is not yet prepare, + // then cancel to prepare is needed. + iCurrent->CancelPrepare(); + } + else + { + iCurrent->CancelPlay(); + } + } + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::PlayCurrentTone +// Cancels the currently playing tone. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::PlayCurrentTone() + { + TRACE_PRN_FN_ENT; + if (iCurrent) + { + if (iCurrent->State() == EMdaAudioToneUtilityPrepared) + { + UpdateTonePlayerVolume(); + + switch (iToneName) + { + case TMS_INBAND_USER_BUSY://ECCPToneUserBusy: + iCurrent->SetRepeats(KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds(KPhoneInbandToneZero)); + iCurrent->SetPriority(KAudioPriorityNetMsg, + static_cast ( + KAudioPrefBusy)); + break; + case TMS_INBAND_RADIO_PATH_NOT_AVAIL://ECCPToneRadioPathNotAvailable: + iCurrent->SetRepeats(KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds(KPhoneInbandToneZero)); + iCurrent->SetPriority(KAudioPriorityNetMsg, + static_cast ( + KAudioPrefRadioNotAvailable)); + break; + case TMS_INBAND_CONGESTION://ECCPToneCongestion: + iCurrent->SetRepeats(KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds(KPhoneInbandToneZero)); + iCurrent->SetPriority(KAudioPriorityNetMsg, + static_cast ( + KAudioPrefCongestion)); + break; + case TMS_INBAND_SPECIAL_INFO://ECCPToneSpecialInformation: + iCurrent->SetRepeats(KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds(KPhoneInbandToneZero)); + iCurrent->SetPriority(KAudioPriorityNetMsg, + static_cast ( + KAudioPrefSpecialInformation)); + break; + case TMS_INBAND_REORDER://ECCPReorder: + iCurrent->SetRepeats(KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds(KPhoneInbandToneZero)); + iCurrent->SetPriority(KAudioPriorityNetMsg, + static_cast ( + KAudioPrefReorder)); + break; + case TMS_INBAND_REMOTE_ALEARTING://ECCPRemoteAlerting: + iCurrent->SetRepeats(KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds(KPhoneInbandToneZero)); + iCurrent->SetPriority(KAudioPriorityNetMsg, + static_cast ( + KAudioPrefRingGoing)); + break; + case TMS_INBAND_CALL_WAITING://ECCPCallWaiting: + iCurrent->SetRepeats(0, TTimeIntervalMicroSeconds( + KPhoneInbandToneZero)); + iCurrent->SetPriority(KAudioPriorityNetMsg, + static_cast ( + KAudioPrefCallWaiting)); + break; + case TMS_INBAND_DATA_CALL://ECCPDataCallTone: //EProfileRingingTypeRinging, EProfileRingingTypeAscending, EProfileRingingTypeRingingOnce + iCurrent->SetRepeats(KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds(KPhoneInbandToneZero)); + iCurrent->SetPriority(KAudioPriorityPhoneCall, + static_cast ( + KAudioPrefIncomingDataCall)); + + // if ( iRingingType == EProfileRingingTypeAscending ) + // { + // iCurrent->SetVolumeRamp( + // TTimeIntervalMicroSeconds( KPERingingToneRampDuration ) ); + // } + // else + // { + //EProfileRingingTypeRinging, EProfileRingingTypeRingingOnce + iCurrent->SetVolumeRamp(TTimeIntervalMicroSeconds( + KPhoneInbandToneZero)); + // } + // if ( iRingingType == EProfileRingingTypeRingingOnce ) + // { + iCurrent->SetRepeats(0, TTimeIntervalMicroSeconds( + KPhoneInbandToneZero)); + // } + break; + case TMS_INBAND_NO_SEQUENCE://ECCPNoSoundSequence: + case TMS_INBAND_BEEP_SEQUENCE://ECCPBeepSequence: + iCurrent->SetRepeats(KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds(KPhoneInbandToneZero)); + iCurrent->SetPriority( + KAudioPriorityPhoneCall, + static_cast ( + KAudioPrefIncomingCall)); + iCurrent->SetRepeats(0, TTimeIntervalMicroSeconds( + KPhoneInbandToneZero)); + iCurrent->SetVolumeRamp(TTimeIntervalMicroSeconds( + KPhoneInbandToneZero)); + break; + default: + break; + } + +#ifdef __WINS__ + +#else + //Play the tone + iCurrent->Play(); +#endif + + } // State() + } //iCurrent + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::MatoPrepareComplete +// Updates flag values and plays current inbandtone. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::MatoPrepareComplete(TInt aError) + { + TRACE_PRN_FN_ENT; + if (aError == KErrNone) + { + PlayCurrentTone(); + } + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::SetVolume +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::SetVolume(TInt aVolume) + { + TRACE_PRN_FN_ENT; + TInt safeVolume = Max(Min(aVolume, KPhoneInbandVolumeMax), + KPhoneInbandVolumeMin); + + if (iCurrent && EMdaAudioToneUtilityNotReady != iCurrent->State()) + { + TInt mediaServerVolume = CalculateMediaServerVolume(safeVolume); + iCurrent->SetVolume(mediaServerVolume); + } + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::MatoPlayComplete +// - +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::MatoPlayComplete(TInt aError) + { + TRACE_PRN_FN_ENT; + if (aError != KErrNone) + { + } + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::CalculateMediaServerVolume +// ----------------------------------------------------------------------------- +// +TInt TMSAudioInbandTonePlayer::CalculateMediaServerVolume(TInt aVolume) const + { + TRACE_PRN_FN_ENT; + TRACE_PRN_FN_EXT; + // Our volume level scale is 0...10, media server's can be anything. + // This scales the volume to correct level. + return (iCurrent->MaxVolume() * aVolume) / + (KPhoneInbandVolumeMax - KPhoneInbandVolumeMin); + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::UpdateTonePlayerVolume +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::UpdateTonePlayerVolume() + { + TRACE_PRN_FN_ENT; + TInt volume( /*KPhoneInbandVolumeMin*/KPhoneInbandVolumeMax); + // iOwner.GetAudioVolumeSync( volume ); + SetVolume(volume); + TRACE_PRN_FN_EXT; + } + +// End of File