mmserv/tms/tmsserver/src/tmsaudioinbandtoneplayer.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 14 May 2010 16:22:35 +0300
changeset 16 43d09473c595
parent 12 5a06f39ad45b
child 20 b67dd1fc57c5
permissions -rw-r--r--
Revision: 201017 Kit: 201019

/*
 * 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 <barsc.h>
#include <barsread.h>
#include <data_caging_path_literals.hrh>
#include <defaultbeep.rsg>
#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();
    iCurrent->CancelPlay();
    delete iCurrent;

    delete iPlayBeepSequence;
    delete iPlayNoSoundSequence;
    delete iPlayDataSequence;
    delete iResourceCallWaitingSeq;
    delete iResourceRingGoingSeq;
    delete iResourceRadioPathSeq;
    delete iResourceSpecialSeq;
    delete iResourceCongestionSeq;
    delete iResourceReorderSeq;
    delete iResourceBusySeq;
    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<TMdaPriorityPreference> (
                                    KAudioPrefBusy));
                    break;
                case TMS_INBAND_RADIO_PATH_NOT_AVAIL://ECCPToneRadioPathNotAvailable:
                    iCurrent->SetRepeats(KMdaAudioToneRepeatForever,
                            TTimeIntervalMicroSeconds(KPhoneInbandToneZero));
                    iCurrent->SetPriority(KAudioPriorityNetMsg,
                            static_cast<TMdaPriorityPreference> (
                                    KAudioPrefRadioNotAvailable));
                    break;
                case TMS_INBAND_CONGESTION://ECCPToneCongestion:
                    iCurrent->SetRepeats(KMdaAudioToneRepeatForever,
                            TTimeIntervalMicroSeconds(KPhoneInbandToneZero));
                    iCurrent->SetPriority(KAudioPriorityNetMsg,
                            static_cast<TMdaPriorityPreference> (
                                    KAudioPrefCongestion));
                    break;
                case TMS_INBAND_SPECIAL_INFO://ECCPToneSpecialInformation:
                    iCurrent->SetRepeats(KMdaAudioToneRepeatForever,
                            TTimeIntervalMicroSeconds(KPhoneInbandToneZero));
                    iCurrent->SetPriority(KAudioPriorityNetMsg,
                            static_cast<TMdaPriorityPreference> (
                                    KAudioPrefSpecialInformation));
                    break;
                case TMS_INBAND_REORDER://ECCPReorder:
                    iCurrent->SetRepeats(KMdaAudioToneRepeatForever,
                            TTimeIntervalMicroSeconds(KPhoneInbandToneZero));
                    iCurrent->SetPriority(KAudioPriorityNetMsg,
                            static_cast<TMdaPriorityPreference> (
                                    KAudioPrefReorder));
                    break;
                case TMS_INBAND_REMOTE_ALEARTING://ECCPRemoteAlerting:
                    iCurrent->SetRepeats(KMdaAudioToneRepeatForever,
                            TTimeIntervalMicroSeconds(KPhoneInbandToneZero));
                    iCurrent->SetPriority(KAudioPriorityNetMsg,
                            static_cast<TMdaPriorityPreference> (
                                    KAudioPrefRingGoing));
                    break;
                case TMS_INBAND_CALL_WAITING://ECCPCallWaiting:
                    iCurrent->SetRepeats(0, TTimeIntervalMicroSeconds(
                            KPhoneInbandToneZero));
                    iCurrent->SetPriority(KAudioPriorityNetMsg,
                            static_cast<TMdaPriorityPreference> (
                                    KAudioPrefCallWaiting));
                    break;
                case TMS_INBAND_DATA_CALL://ECCPDataCallTone: //EProfileRingingTypeRinging, EProfileRingingTypeAscending, EProfileRingingTypeRingingOnce
                    iCurrent->SetRepeats(KMdaAudioToneRepeatForever,
                            TTimeIntervalMicroSeconds(KPhoneInbandToneZero));
                    iCurrent->SetPriority(KAudioPriorityPhoneCall,
                            static_cast<TMdaPriorityPreference> (
                                    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<TMdaPriorityPreference> (
                                    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