diff -r a36789189b53 -r 095bea5f582e mmserv/tms/tmsserver/src/tmsaudioinbandtoneplayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/tms/tmsserver/src/tmsaudioinbandtoneplayer.cpp Tue Aug 31 15:43:02 2010 +0300 @@ -0,0 +1,371 @@ +/* + * 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 "tmsutility.h" +#include "tmsaudioinbandtoneplayer.h" +#include "tmsaudiotoneutilityimpl.h" + +using namespace TMS; + +// CONSTANTS +const gint KPhoneInbandVolumeMax = 10; +const gint KPhoneInbandVolumeMin = 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(); + CleanupStack::Pop(self); + return self; + } + +//Destructor +TMSAudioInbandTonePlayer::~TMSAudioInbandTonePlayer() + { + TRACE_PRN_FN_ENT; + iResourceFile.Close(); + iFsSession.Close(); + iTones.ResetAndDestroy(); + iTones.Close(); + if (iPlayer) + { + iPlayer->CancelPlay(); + } + delete iPlayer; + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::TMSAudioInbandTonePlayer +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +TMSAudioInbandTonePlayer::TMSAudioInbandTonePlayer() : + iPlayer(NULL) + { + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::ConstructL() + { + TRACE_PRN_FN_ENT; + iPlayer = TMSAudioToneUtilityImpl::NewL(*this); + iTones.Reset(); + CreateToneSequencesL(); + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::CreateSequencesL +// Create inband tone sequences from resources. +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::CreateToneSequencesL() + { + TRACE_PRN_FN_ENT; + + iFileName = KSystemDefaultbeepRscDrive; + iFileName.Append(KDC_RESOURCE_FILES_DIR); + iFileName.Append(KSystemDefaultbeepRscFile); + iFsSession.Connect(); + iResourceFile.OpenL(iFsSession, iFileName); + + // DO NOT change order of sequence allocation! + AllocSeqFromResourceL(R_NET_BUSY); //iTones[0] + AllocSeqFromResourceL(R_NET_RADIO_NOT_AVAILABLE); //iTones[1] + AllocSeqFromResourceL(R_NET_CONGESTION); //iTones[2] + AllocSeqFromResourceL(R_NET_SPECIAL_INFORMATION); //iTones[3] + AllocSeqFromResourceL(R_NET_REORDER); //iTones[4] + AllocSeqFromResourceL(R_NET_RING_GOING); //iTones[5] + AllocSeqFromResourceL(R_NET_CALL_WAITING); //iTones[6] + AllocSeqFromResourceL(R_DATA_CALL_TONE); //iTones[7] + AllocSeqFromResourceL(R_NO_SOUND_SEQUENCE); //iTones[8] + AllocSeqFromResourceL(R_BEEP_SEQUENCE); //iTones[9] + + iResourceFile.Close(); + iFsSession.Close(); + + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::AllocSeqFromResourceL +// +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::AllocSeqFromResourceL(const gint resource) + { + HBufC8* res = iResourceFile.AllocReadLC(resource); + iReader.SetBuffer(res); + gint length = iReader.ReadInt16(); + HBufC8* buf = HBufC8::NewL(length); + TPtr8 ptr(buf->Des()); + for (gint i = 0; i < length; i++) + { + ptr.Append(iReader.ReadUint16()); + } + User::LeaveIfError(iTones.Append(buf)); + CleanupStack::PopAndDestroy(res); + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::PlayInbandTone +// Searches the given Inband tone from iToneArray and calls PlayCurrentTone. +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::PlayInbandTone(TMSInbandToneType tone) + { + TRACE_PRN_FN_ENT; + + // First stop any ongoing playback + Cancel(); + UpdateTonePlayerVolume(); + iToneName = tone; + + if (iPlayer && (tone >= 0 && tone < iTones.Count())) + { + iPlayer->PrepareToPlayDesSequence(iTones[tone]->Des()); + } + 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 (iPlayer) + { + if (iPlayer->State() == EMdaAudioToneUtilityNotReady) + { + // Prepare is called, but toneplayer's state is not yet prepare, + // then cancel to prepare is needed. + iPlayer->CancelPrepare(); + } + else + { + iPlayer->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 (iPlayer) + { + if (iPlayer->State() == EMdaAudioToneUtilityPrepared) + { + UpdateTonePlayerVolume(); + + switch (iToneName) + { + case TMS_INBAND_USER_BUSY: + SetToneAttributes(KAudioPrefBusy); + break; + case TMS_INBAND_RADIO_PATH_NOT_AVAIL: + SetToneAttributes(KAudioPrefRadioNotAvailable); + break; + case TMS_INBAND_CONGESTION: + SetToneAttributes(KAudioPrefCongestion); + break; + case TMS_INBAND_SPECIAL_INFO: + SetToneAttributes(KAudioPrefSpecialInformation); + break; + case TMS_INBAND_REORDER: + SetToneAttributes(KAudioPrefReorder); + break; + case TMS_INBAND_REMOTE_ALEARTING: + SetToneAttributes(KAudioPrefRingGoing); + break; + case TMS_INBAND_CALL_WAITING: + SetToneAttributes(KAudioPrefCallWaiting, + KAudioPriorityNetMsg, 0); + break; + case TMS_INBAND_DATA_CALL: + SetToneAttributes(KAudioPrefIncomingDataCall, + KAudioPriorityPhoneCall); + + // if ( iRingingType == EProfileRingingTypeAscending ) + // { + // iPlayer->SetVolumeRamp( + // TTimeIntervalMicroSeconds( KPERingingToneRampDuration ) ); + // } + // else + // { + // EProfileRingingTypeRinging, EProfileRingingTypeRingingOnce + iPlayer->SetVolumeRamp(TTimeIntervalMicroSeconds( + KPhoneInbandToneZero)); + // } + // if ( iRingingType == EProfileRingingTypeRingingOnce ) + // { + // iPlayer->SetRepeats(0, TTimeIntervalMicroSeconds( + // KPhoneInbandToneZero)); + // } + break; + case TMS_INBAND_NO_SEQUENCE: + case TMS_INBAND_BEEP_SEQUENCE: + SetToneAttributes(KAudioPrefIncomingCall, + KAudioPriorityPhoneCall); + + //iPlayer->SetRepeats(0, TTimeIntervalMicroSeconds( + // KPhoneInbandToneZero)); + iPlayer->SetVolumeRamp(TTimeIntervalMicroSeconds( + KPhoneInbandToneZero)); + break; + default: + break; + } +#ifndef __WINSCW__ + //Play the tone + iPlayer->Play(); +#endif + } + } + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::SetToneAttributes +// +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::SetToneAttributes(const guint pref, + const guint priority, const gint repeatTimes, const gint trailSilence) + { + iPlayer->SetRepeats(repeatTimes, TTimeIntervalMicroSeconds(trailSilence)); + iPlayer->SetPriority(priority, static_cast (pref)); + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::SetVolume +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::SetVolume(gint volume) + { + TRACE_PRN_FN_ENT; + gint safeVolume = Max(Min(volume, KPhoneInbandVolumeMax), + KPhoneInbandVolumeMin); + + if (iPlayer) + { + gint mediaServerVolume = CalculateMediaServerVolume(safeVolume); + if (EMdaAudioToneUtilityNotReady != iPlayer->State()) + { + iPlayer->SetVolume(mediaServerVolume); + } + } + 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_IF_ERR(aError); + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::MatoPlayComplete +// - +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::MatoPlayComplete( +#ifdef _DEBUG + TInt aError) +#else + TInt /*aError*/) +#endif + { + TRACE_PRN_FN_ENT; + // TODO: process error? +#ifdef _DEBUG + TRACE_PRN_IF_ERR(aError); +#endif + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::CalculateMediaServerVolume +// ----------------------------------------------------------------------------- +// +gint TMSAudioInbandTonePlayer::CalculateMediaServerVolume(gint volume) 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 (iPlayer->MaxVolume() * volume) / + (KPhoneInbandVolumeMax - KPhoneInbandVolumeMin); + } + +// ----------------------------------------------------------------------------- +// TMSAudioInbandTonePlayer::UpdateTonePlayerVolume +// ----------------------------------------------------------------------------- +// +void TMSAudioInbandTonePlayer::UpdateTonePlayerVolume() + { + TRACE_PRN_FN_ENT; + gint volume( /*KPhoneInbandVolumeMin*/KPhoneInbandVolumeMax); + SetVolume(volume); + TRACE_PRN_FN_EXT; + } +