satui/satapp/src/satappplaytoneprovider.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 11 Jun 2010 14:07:16 +0300
changeset 27 7eb70891911c
parent 15 d7fc66ccd6fb
permissions -rw-r--r--
Revision: 201021 Kit: 2010123

/*
* Copyright (c) 2010 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:
*
*/


// PlayStandardTone
#include    <MProfile.h>
#include    <MProfileEngine.h>
#include    <MProfileTones.h>
#include    <TProfileToneSettings.h>
#include    <AudioPreference.h> //KAudioPriorityLowLevel
#include    <mda/common/resource.h>//KMdaRepeatForever
#include    <QTimer> // timeout callback
#include    <hbmessagebox.h>//playtone note
#include    <mdaaudiotoneplayer.h>// for CMdaAudioToneUtility&CMdaAudioPlayerUtility
#include    <e32std.h>//TTimeIntervalMicroSeconds

#include "satappplaytoneprovider.h"
#include "satappcommonconstant.h"
#include "tflogger.h"

//const
// Maximum length for sound file. 
const TInt KMaxSoundFileLength = 256;
// Used when dividing some values. Used only for preventing the use of magic 
// numbers
// Audio sample is repeated indefinitely.
const TInt KSoundPlayerRepeatForever = KMdaRepeatForever;

// The max volume value from settings.
// From TProfileToneSettings.h
const TInt KMaxVolumeFromProfile( 10 );


// ----------------------------------------------------------------------------
// SatAppPlayToneProvider::SatAppPlayToneProvider
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
SatAppPlayToneProvider::SatAppPlayToneProvider(QObject *parent) :
    QObject(parent), mWarningAndPlayTones(false),mVolume(0),
    mPlayer(0),mPlayToneError(ESatSuccess), mTimer(0),mLoop(0),
    mPermanentNote(0), mAudioPlayer(0)
{
    TFLOGSTRING("SATAPP: SatAppPlayToneProvider::SatAppPlayToneProvider call")
    TFLOGSTRING("SATAPP: SatAppPlayToneProvider::SatAppPlayToneProvider exit")
}

// ----------------------------------------------------------------------------
// SatAppPlayToneProvider::~SatAppPlayToneProvider
// Sets a pointer to CSatUiViewAppUi object.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
SatAppPlayToneProvider::~SatAppPlayToneProvider()
{
    TFLOGSTRING("SATAPP: SatAppPlayToneProvider::~SatAppPlayToneProvider call")
    stopPlayTone();
    if (mPermanentNote) {
        TFLOGSTRING("SATAPP: SatAppPlayToneProvider::~SatAppPlayToneProvider note 0")
        delete mPermanentNote;
        mPermanentNote = 0;
    }
    if (mTimer) {
        TFLOGSTRING("SATAPP: SatAppPlayToneProvider::~SatAppPlayToneProvider timer 0")
        delete mTimer;
        mTimer = 0;
    }
    if (mLoop) {
        TFLOGSTRING("SatAppPlayToneProvider::~SatAppPlayToneProvider loop 0")
        delete mLoop;
        mLoop = 0;
    }
    TFLOGSTRING("SATAPP: SatAppPlayToneProvider::~SatAppPlayToneProvider exit")
}

//-----------------------------------------------------------------------------
// SatAppPlayToneProvider::PlayStandardToneL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TSatUiResponse SatAppPlayToneProvider::PlayStandardToneL( const TDesC& aText,
    const TDesC8& aSequence,
    TTimeIntervalMicroSeconds aDuration,
    const CFbsBitmap* /*aIconBitmap*/,
    const TBool aSelfExplanatory )
{
    TFLOGSTRING("SATAPP: SatAppPlayToneProvider::PlayStandardToneL call")
    if (mTimer) {
        if (mTimer->isActive()) {
            mTimer->stop();
        }
        delete mTimer;
        mTimer = 0;
        TFLOGSTRING("SatAppPlayToneProvider::PlayStandardToneL delete timer")
    }
    if (mLoop) {
        TFLOGSTRING("SatAppPlayToneProvider::PlayStandardToneL delete loop")
        if (mLoop->isRunning()) {
            mLoop->exit();
        }
        delete mLoop;
        mLoop = 0;
    }

    TSatUiResponse response(ESatSuccess);
    unsigned int duration(0);
    if (aDuration > 0) {
        duration = aDuration.Int64() / 1000;
    }
    TFLOGSTRING2("SATAPP: SatAppPlayToneProvider::PlayStandardToneL \
     duration microseconds %d", duration)
    QString text;
    mLoop = new QEventLoop(this);
    if (aText.Length() > 0) {
        text = QString::fromUtf16(aText.Ptr(), aText.Length());
        TFLOGSTRING2("SATAPP: SatAppPlayToneProvider::PlayStandardToneL \
            text=%S", &aText)
        mPermanentNote = new HbMessageBox(HbMessageBox::MessageTypeInformation);
        bool ret = connect(mPermanentNote, SIGNAL(aboutToClose()),
                this, SLOT(stopPlayTone()));
        TFLOGSTRING2("SATAPP: SatAppPlayToneProvider::PlayStandardToneL connect \
           note close to timer stop: %d", ret)

        bool selfExplanatory = aSelfExplanatory;
        if (!selfExplanatory) {
            mPermanentNote->setText(text);
            if (duration > 0 ) {
                mPermanentNote->setTimeout(duration);
            }
            mPermanentNote->setDismissPolicy(HbPopup::TapAnywhere);
            TFLOGSTRING("SatAppPlayToneProvider::PlayStandardToneL show before")
            mPermanentNote->show();
            TFLOGSTRING("SatAppPlayToneProvider::PlayStandardToneL show after")
        }
    }

    if (mPlayer) {
        delete mPlayer;
        mPlayer = 0;
    }
    mPlayer = CMdaAudioToneUtility::NewL(*this);
    TInt volume(mPlayer->MaxVolume());
    mPlayer->SetVolume(volume);
    mPlayer->PrepareToPlayDesSequence(aSequence);

    if (duration > 0) {
        mTimer = new QTimer(this);
        bool ret = connect(mTimer, SIGNAL(timeout()),
                this, SLOT(stopPlayTone()));
        TFLOGSTRING2("SATAPP: SatAppPlayToneProvider::PlayStandardToneL \
                connect mTimer stop: %d", ret)
        mTimer->start(duration);
    }

    if (mLoop) {
        TFLOGSTRING("SATAPP: SatAppPlayToneProvider::PlayStandardToneL loop")
        mLoop->exec(QEventLoop::AllEvents);
        TFLOGSTRING("SATAPP: SatAppPlayToneProvider::PlayStandardToneL quit loop")
        delete mLoop;
        mLoop = 0;
    }
    if (mPermanentNote) {
        TFLOGSTRING("SATAPP: SatAppPlayToneProvider::PlayStandardToneL note 0")
        delete mPermanentNote;
        mPermanentNote = 0;
    }
    if (mTimer) {
        TFLOGSTRING("SATAPP: SatAppPlayToneProvider::PlayStandardToneL timer 0")
        delete mTimer;
        mTimer = 0;
    }


    TFLOGSTRING("SATAPP: SatAppPlayToneProvider::PlayStandardToneL before play cancel")
    mPlayer->CancelPlay();
    delete mPlayer;
    mPlayer = NULL;

    //get warning and game tones setting from active profile
    GetProfileParamsL();
    if((EFalse == mWarningAndPlayTones) && 
          (ESatSuccess == mPlayToneError)) {
        mPlayToneError = ESatSuccessToneNotPlayed;
    }
    response = mPlayToneError;
    TFLOGSTRING("SATAPP: SatAppPlayToneProvider::PlayStandardToneL exit")
    return response;
}


// ---------------------------------------------------------
// SatAppCommandHandler::GetProfileParamsL
// Get and store settings from current profile 
// (other items were commented in a header).
// ---------------------------------------------------------
//
void SatAppPlayToneProvider::GetProfileParamsL( TSatTone aTone /*= ESatToneNotSet*/,
                                         TDes* aToneName /*= NULL*/ )
{
    TFLOGSTRING( "SatAppCommandHandler::GetProfileParamsL calling" )
    MProfile* profile = NULL;
    MProfileEngine* engine = NULL;
    engine = CreateProfileEngineL();
    CleanupReleasePushL( *engine );

    profile = engine->ActiveProfileLC();

    const MProfileTones& tones = profile->ProfileTones();

    // Takes a current warning and gametones setting.
    const TProfileToneSettings& ts = tones.ToneSettings();
    mWarningAndPlayTones = ts.iWarningAndGameTones;
    mVolume = ts.iRingingVolume;
    
    TFLOGSTRING2( "SatAppCommandHandler::GetProfileParamsL \
        mVolume before mapping %d", mVolume )
    
    // Max volume from profile is KMaxVolumeFromProfile, Max volume from 
    // CMdaAudioToneUtility is different, maybe 10,000. So, 
    // rate = maxVolumeFromPlayer / KMaxVolumeFromProfile
    // User may never hear the TONE, because volume is too small.
    // iVolume times the rate make it can be heard.
    
    CMdaAudioToneUtility* toneUtl = CMdaAudioToneUtility::NewL( *this );
    TInt maxVolumeFromPlayer( toneUtl->MaxVolume() );
    mVolume *= maxVolumeFromPlayer / KMaxVolumeFromProfile;
    delete toneUtl;
    toneUtl = NULL;
    TFLOGSTRING2( "CSatUiViewAppUi::GetProfileParamsL \
        mVolume after mapping %d", mVolume )
    
    if ( ( ESatUserSelectedToneIncomingSms == aTone ) && ( aToneName ) )
        {
        TFLOGSTRING("SatAppCommandHandler::GetProfileParamsL message tone")
        aToneName->Copy( tones.MessageAlertTone() );
    } else if( aToneName ) {
        TFLOGSTRING("SatAppCommandHandler::GetProfileParamsL ring tone")
        aToneName->Copy( tones.RingingTone1() );
    }

    CleanupStack::PopAndDestroy(2); // engine, profile
    TFLOGSTRING("SatAppCommandHandler::GetProfileParamsL exits")
}

// ---------------------------------------------------------
// SatAppPlayToneProvider::MatoPrepareComplete
// Indicates success or failure.
// (other items were commented in a header).
// ---------------------------------------------------------
//
void SatAppPlayToneProvider::MatoPrepareComplete(TInt aError)
{
    TFLOGSTRING2("SatAppPlayToneProvider::MatoPrepareComplete called\
        aError = %d", aError)
    if (KErrNone == aError && mPlayer) {
        mPlayToneError = ESatSuccess;
        TTimeIntervalMicroSeconds zero(static_cast<TInt64>( 0 ));
        mPlayer->SetPriority(KAudioPriorityLowLevel,
               STATIC_CAST(TMdaPriorityPreference, KAudioPrefConfirmation));
        mPlayer->SetRepeats( KMdaAudioToneRepeatForever, zero );
        mPlayer->Play();
    } else {
        mPlayToneError = ESatFailure;
    }
    TFLOGSTRING( "SatAppPlayToneProvider::MatoPrepareComplete exit" )
}

//-----------------------------------------------------------------------------
// SatAppPlayToneProvider::MatoPlayComplete
// Indicates success or failure.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void SatAppPlayToneProvider::MatoPlayComplete( TInt aError )
{
    TFLOGSTRING("SatAppPlayToneProvider::MatoPlayComplete calling")
    if (KErrNone == aError && mPlayer) {
        TFLOGSTRING("SatAppPlayToneProvider::MatoPlayComplete play")
        mPlayer->Play();
    } else {
        TFLOGSTRING( "SatAppPlayToneProvider::MatoPlayComplete stop playing")
        // Stops playing if error.
        stopPlayTone();
    }
    TFLOGSTRING2("SatAppPlayToneProvider::MatoPlayComplete exit error %d", aError)
}

//-----------------------------------------------------------------------------
// SatAppPlayToneProvider::PlayUserSelectedToneL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TSatUiResponse SatAppPlayToneProvider::PlayUserSelectedToneL(
        const TDesC &aText,
        TTimeIntervalMicroSeconds aDuration,
        TSatTone aTone,
        const CFbsBitmap* /*aIconBitmap*/,
        const TBool aSelfExplanatory )
{
    TFLOGSTRING("SatAppPlayToneProvider::PlayUserSelectedToneL calling")
    if (mTimer) {
        delete mTimer;
        mTimer = 0;
        TFLOGSTRING("SatAppPlayToneProvider::PlayUserSelectedToneL delete timer")
    }
    if (mLoop) {
        delete mLoop;
        mLoop = 0;
        TFLOGSTRING("SatAppPlayToneProvider::PlayUserSelectedToneL delete loop")
    }
    unsigned int duration(0);
    if (aDuration > 0) {
        duration = aDuration.Int64() / KPlayToneSymbianConvertQtTime;
        TFLOGSTRING2("SatAppPlayToneProvider::PlayUserSelectedToneL duration %d",
                duration)
    }

    QString text;
    if (aText.Length() > 0) {
        text = QString::fromUtf16(aText.Ptr(), aText.Length());
        TFLOGSTRING2("SATAPP: SatAppPlayToneProvider::PlayUserSelectedToneL \
            text=%S", &aText)
        mPermanentNote = new HbMessageBox(HbMessageBox::MessageTypeInformation);
        bool selfExplanatory = aSelfExplanatory;
        if (!selfExplanatory) {
            mPermanentNote->setText(text);
            if (duration) {
                mPermanentNote->setTimeout(duration);
            }
            mPermanentNote->setDismissPolicy(HbPopup::TapAnywhere);
            TFLOGSTRING("SatAppPlayToneProvider::PlayUserSelectedToneL show before")
            mPermanentNote->show();
            TFLOGSTRING("SatAppPlayToneProvider::PlayUserSelectedToneL show after")
        }
    }

    // If several messages/calls arrive during a small amount of time and if the
    // message received or incoming call tone is already being played we do not 
    // restart it.
    if (mAudioPlayer) {
        TFLOGSTRING( "SatAppPlayToneProvider::\
            PlayUserSelectedToneL Error - already played" )
        return ESatFailure;
    }

    TSatUiResponse response(ESatSuccess);
    // This defines name for the current message alert or incoming call tone. 
    TBuf<KMaxSoundFileLength> soundFileName;
    GetProfileParamsL( aTone, &soundFileName );
    // This defines the behaviour to be adopted by an
    // audio client if a higher priority client takes over the device.
    TInt mdaPriority( KAudioPrefIncomingCall );
    // This is used to resolve conflicts when more than one client tries to 
    // access the same sound output device simultaneously.
    TInt audioPriority( KAudioPriorityPhoneCall );

    TFLOGSTRING2( "SATAPP: SatAppPlayToneProvider::PlayUserSelectedToneL\
        Volume is %d ", mVolume )

    // Creates the audio player.
    mAudioPlayer = CMdaAudioPlayerUtility::NewFilePlayerL( 
        soundFileName,
        *this,
        audioPriority,
        ( TMdaPriorityPreference ) mdaPriority );

    if (aDuration > 0) {
        TFLOGSTRING( "SATAPP: SatAppPlayToneProvider::PlayUserSelectedToneL\
         duration not 0" )
        mAudioPlayer->SetRepeats( KSoundPlayerRepeatForever, 
                                  TTimeIntervalMicroSeconds( 
                                  static_cast<TInt64>( 0 ) ) );
        mTimer = new QTimer(this);
        mTimer->start(duration);
        mLoop = new QEventLoop(this);
        bool ret = connect(mTimer, SIGNAL(timeout()), this, SLOT(stopPlayTone()));
        TFLOGSTRING2("SATAPP: SatAppPlayToneProvider::PlayUserSelectedToneL\
                connect mTimer stop: %d", ret)

        if (mPermanentNote) {
            ret = connect(mPermanentNote, SIGNAL(aboutToClose()),
                    this, SLOT(stopPlayTone()));
            TFLOGSTRING2("SATAPP: SatAppPlayToneProvider::PlayUserSelectedToneL \
               connect note close to timer stop: %d", ret)
        }
        if (mLoop) {
            mLoop->exec(QEventLoop::AllEvents);
            TFLOGSTRING("SATAPP: SatAppPlayToneProvider::PlayUserSelectedToneL quit loop")
            delete mLoop;
            mLoop = 0;
        }
        if (mPermanentNote) {
            TFLOGSTRING("SATAPP: SatAppPlayToneProvider::PlayUserSelectedToneL note 0")
            delete mPermanentNote;
            mPermanentNote = 0;
        }
        if (mTimer) {
            TFLOGSTRING("SATAPP: SatAppPlayToneProvider::PlayUserSelectedToneL timer 0")
            delete mTimer;
            mTimer = 0;
        }
        // Sample is played in forever loop for the duration.
        // After duration call back timers are destroyed       
        // If player exists, stop playing and delete player. MapcPlayComplete
        // is not called because CallBackTimer stops the playing.
        if (mAudioPlayer) {
            mAudioPlayer->Stop();
            delete mAudioPlayer;
            mAudioPlayer = 0;
            TFLOGSTRING( "SatAppPlayToneProvider::PlayUserSelectedToneL\
                mAudioPlayer deleted" )
        }
    } else {
        // If duration is zero then tone is played only once.
        // Playing duration is same as duration of the sample.
        mAudioPlayer->SetRepeats(
            0, TTimeIntervalMicroSeconds( static_cast<TInt64>( 0 ) ) );
        TFLOGSTRING( "SatAppPlayToneProvider::PlayUserSelectedToneL SetRepeats 0" )
    }

    TFLOGSTRING( "SatAppPlayToneProvider::PlayUserSelectedToneL exit" )
    if( EFalse == mWarningAndPlayTones ) {
        response = ESatSuccessToneNotPlayed;
    }

    TFLOGSTRING( "SatAppPlayToneProvider::PlayUserSelectedToneL exit" )
    return response;
}

//-----------------------------------------------------------------------------
// SatAppPlayToneProvider::MapcInitComplete
// Plays the tone.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
void SatAppPlayToneProvider::MapcInitComplete( TInt aError, 
    const TTimeIntervalMicroSeconds& /*aDuration*/ )
{
    TFLOGSTRING( "SatAppPlayToneProvider::MapcInitComplete called" )
    // Audio player is initialised, so if there is no error, we can start 
    // playing the tone.
    if (KErrNone == aError && mAudioPlayer) {
        const TInt volume( Max(0, Min(mVolume, 
                           mAudioPlayer->MaxVolume())));
        TFLOGSTRING2("CSatUiViewAppUi::\
            MapcInitComplete SetVolume %d", volume )
        // Set volume according Settings. 
        mAudioPlayer->SetVolume( volume );
        mAudioPlayer->Play();
        TFLOGSTRING( "SatAppPlayToneProvider::MapcInitComplete Play" )
    } else {
        // Otherwise, we delete the initialised audio player.
        if ( mAudioPlayer ) {
            TFLOGSTRING( "SatAppPlayToneProvider::MapcInitComplete mAudioPlayer \
                          true" )
            delete mAudioPlayer;
            mAudioPlayer = 0;
     }

        // Remove also the note for play tone
        // If there was a duration for play tone, stop waiting
        stopPlayTone();

        TFLOGSTRING2( "SatAppPlayToneProvider::MapcInitComplete Error %d", aError )
    }
    TFLOGSTRING( "SatAppPlayToneProvider::MapcInitComplete exit" )
}

//-----------------------------------------------------------------------------
// SatAppPlayToneProvider::MapcPlayComplete
// Deletes audio player after playing is completed.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
void SatAppPlayToneProvider::MapcPlayComplete( TInt /*aError*/ )
{
    TFLOGSTRING( "SatAppPlayToneProvider::MapcPlayComplete called" )

    // When playing is completed, deleting the audio player.
    if ( mAudioPlayer ) {
        TFLOGSTRING("SatAppPlayToneProvider::MapcPlayComplete delete mAudioPlayer")
        delete mAudioPlayer;
        mAudioPlayer = 0;
    }
    // Remove note after play has completed.
    stopPlayTone();
    TFLOGSTRING("SatAppPlayToneProvider::MapcPlayComplete exit")
}

// ----------------------------------------------------------------------------
// SatAppPlayToneProvider::clearScreen
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void SatAppPlayToneProvider::clearScreen()
{
    TFLOGSTRING("SATAPP: SatAppEventProvider::ClearScreen call")
    stopPlayTone();
    TFLOGSTRING("SATAPP: SatAppEventProvider::ClearScreen exit")
}

// ----------------------------------------------------------------------------
// SatAppPlayToneProvider::clearScreen
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void SatAppPlayToneProvider::closeSatUI()
{
    TFLOGSTRING("SATAPP: SatAppEventProvider::closeSatUI call")
    clearScreen();
    TFLOGSTRING("SATAPP: SatAppEventProvider::closeSatUI exit")
}

// ----------------------------------------------------------------------------
// SatAppPlayToneProvider::stopPlayTone
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void SatAppPlayToneProvider::stopPlayTone()
{
    TFLOGSTRING("SATAPP: SatAppEventProvider::stopPlayTone call")
     if (mPermanentNote) {
        TFLOGSTRING("SatAppPlayToneProvider::stopPlayTone delete mPermanentNote")
        disconnect(mPermanentNote,SIGNAL(aboutToClose()),
                this, SLOT(stopPlayTone())); 
        mPermanentNote->close();
    }
    if (mTimer) {
        TFLOGSTRING("SatAppPlayToneProvider::stopPlayTone delete timer")
        disconnect(mTimer,SIGNAL(timeout()), this, SLOT(stopPlayTone()));
        if (mTimer->isActive()) {
            mTimer->stop();
        }
    }
    if (mLoop && mLoop->isRunning()) {
        TFLOGSTRING("SatAppPlayToneProvider::stopPlayTone exit loop")
        mLoop->exit();
    }
    TFLOGSTRING("SATAPP: SatAppEventProvider::stopPlayTone exit")
}

 //End of file