mmserv/tms/tmsserver/src/tmsaudioinbandtoneplayer.cpp
branchRCL_3
changeset 19 095bea5f582e
--- /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;
+    }
+