--- /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 <tms.h>
+#include <AudioPreference.h>
+#include <data_caging_path_literals.hrh>
+#include <defaultbeep.rsg>
+#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<TMdaPriorityPreference> (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;
+ }
+