diff -r 7d48bed6ce0c -r 987c9837762f satui/satapp/src/satapptoneprovider.cpp --- a/satui/satapp/src/satapptoneprovider.cpp Tue Aug 31 15:45:17 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,702 +0,0 @@ -/* -* 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: -* -*/ - -// includes -#include -#include -#include -#include //playtone note - -#include "SatAppToneProvider.h" -#include "satappconstant.h" -#include "satappaction.h" - -// ---------------------------------------------------------------------------- -// SatAppToneProvider::SatAppToneProvider -// ---------------------------------------------------------------------------- -// -SatAppToneProvider::SatAppToneProvider(QObject *parent) : - QObject(parent) -{ - qDebug("SATAPP: SatAppToneProvider::SatAppToneProvider <>"); - mState = Idle; - mWarningAndPlayTones = false; - mVolume = 0; - mPlayer = 0; - mPlayToneError = ESatSuccess; - mTimer = 0; - mPermanentNote = 0; - mAudioPlayer = 0; - mCurrentAction = 0; -} - -// ---------------------------------------------------------------------------- -// SatAppToneProvider::~SatAppToneProvider -// ---------------------------------------------------------------------------- -// -SatAppToneProvider::~SatAppToneProvider() -{ - qDebug("SATAPP: SatAppToneProvider::~SatAppToneProvider >"); - - if (mCurrentAction) { - stopPlayTone(); - } - - if (mPermanentNote) { - qDebug("SatAppToneProvider::resetState delete mPermanentNote"); - delete mPermanentNote; - mPermanentNote = 0; - } - - if (mTimer) { - qDebug("SatAppToneProvider::resetState delete timer"); - delete mTimer; - mTimer = 0; - } - - qDebug("SATAPP: SatAppToneProvider::~SatAppToneProvider <"); -} - -//----------------------------------------------------------------------------- -// SatAppToneProvider::playTone -//----------------------------------------------------------------------------- -void SatAppToneProvider::playTone(SatAppAction& action) -{ - qDebug("SATAPP: SatAppToneProvider::playTone >"); - resetState(); - - mCurrentAction = &action; - int tone = action.value(KeyToneId).toInt(); - int duration = action.value(KeyDuration).toInt(); - QString text = action.value(KeyText).toString(); - QByteArray sequence; - mState = recognizeTone(tone,sequence,duration); - if (mState == PlayStandardTone) - { - playStandardTone(text,sequence,duration); - } - else if (mState == PlayUserSelectedTone) - { - playUserSelectedTone(text,tone,duration); - } - else - { - mCurrentAction->complete(ESatCmdDataNotUnderstood); - mCurrentAction = 0; - } - qDebug("SATAPP: SatAppToneProvider::playTone <"); -} - -//----------------------------------------------------------------------------- -// SatAppToneProvider::recognizeTone -// @param tone the tone code from server (see TSatTone in MSatUiObserver) -// @param sequence (out) standard tone play sequence -// @param duration (out) stanrard tone play duration (manipulated in some cases) -// @return suggested state for the tone provider (or Idle if tone is not recognised) -//----------------------------------------------------------------------------- -SatAppToneProvider::State SatAppToneProvider::recognizeTone( - int tone, - QByteArray& sequence, - int& duration) -{ - qDebug("SATAPP: SatAppToneProvider::recognizeTone >"); - State ret = Idle; - qDebug("SATAPP: SatAppToneProvider::recognizeTone tone: %d", tone); - switch (tone) - { - case ESatGeneralBeep: - case ESatPositiveTone: - case ESatToneNotSet: - { - if (duration == 0) duration = KSatDur170ms; // 170ms - sequence = charArrayToByteArray(KGeneralBeep, - sizeof(KGeneralBeep)); - ret = PlayStandardTone; - break; - } - case ESatNegativeTone: - { - if (duration == 0) duration = KSatDur250ms; // 250ms - sequence = charArrayToByteArray(KErrorTone, - sizeof(KErrorTone)); - ret = PlayStandardTone; - break; - } - case ESatRadioPathNotAvailableCallDropped: - { - if (duration == 0) duration = KSatDur1200ms; // 1200ms - sequence = charArrayToByteArray(KRadioPathNotAvailable, - sizeof(KRadioPathNotAvailable)); - ret = PlayStandardTone; - break; - } - case ESatRadioPathAcknowledge: - { - if (duration == 0) duration = KSatDur200ms; // 200ms - sequence = charArrayToByteArray(KRadioPathAck, - sizeof(KRadioPathAck)); - ret = PlayStandardTone; - break; - } - case ESatDialTone: - { - if (duration == 0) break; - sequence = charArrayToByteArray(KNetToneSeqDial, - sizeof(KNetToneSeqDial)); - ret = PlayStandardTone; - break; - } - case ESatCalledSubscriberBusy: - { - if (duration == 0) break; - sequence = charArrayToByteArray(KNetToneSeqNetBusy, - sizeof(KNetToneSeqNetBusy)); - ret = PlayStandardTone; - break; - } - case ESatCongestion: - { - if (duration == 0) break; - sequence = charArrayToByteArray(KNetToneSeqNetCongestion, - sizeof(KNetToneSeqNetCongestion)); - ret = PlayStandardTone; - break; - } - case ESatErrorSpecialInfo: - { - if (duration == 0) break; - sequence = charArrayToByteArray(KNetToneSeqNetSpecialInformation, - sizeof(KNetToneSeqNetSpecialInformation)); - ret = PlayStandardTone; - break; - } - case ESatCallWaitingTone: - { - if (duration == 0) break; - sequence = charArrayToByteArray(KNetToneSeqNetCallWaiting, - sizeof(KNetToneSeqNetCallWaiting)); - ret = PlayStandardTone; - break; - } - case ESatRingingTone: - { - if (duration == 0) break; - sequence = charArrayToByteArray(KNetToneSeqRingGoing, - sizeof(KNetToneSeqRingGoing)); - ret = PlayStandardTone; - break; - } - case ESatUserSelectedToneIncomingSpeech: - case ESatUserSelectedToneIncomingSms: - { - ret = PlayUserSelectedTone; - break; - } - default: - break; - } - - qDebug("SATAPP: SatAppToneProvider::recognizeTone state=%d <", ret); - return ret; -} - -//----------------------------------------------------------------------------- -// SatAppToneProvider::charArrayToByteArray -//----------------------------------------------------------------------------- -QByteArray SatAppToneProvider::charArrayToByteArray( - const char tone[], - int size) -{ - qDebug("SATAPP: SatAppToneProvider::charArrayToByteArray >"); - QByteArray seq; - seq = QByteArray::fromRawData(tone, size); - qDebug("SATAPP: SatAppToneProvider::charArrayToByteArray <"); - return seq; -} - -//----------------------------------------------------------------------------- -// SatAppToneProvider::playStandardTone -//----------------------------------------------------------------------------- -void SatAppToneProvider::playStandardTone( - const QString& text, - const QByteArray& sequence, - int duration) -{ - qDebug("SATAPP: SatAppToneProvider::playStandardTone >"); - - if (text.length() > 0) { - mPermanentNote = new HbMessageBox(HbMessageBox::MessageTypeInformation); - SAT_ASSERT(connect(mPermanentNote, SIGNAL(aboutToClose()), - this, SLOT(stopPlayTone()))); - mPermanentNote->setText(text); - mPermanentNote->setStandardButtons(HbMessageBox::Cancel); - if (duration > 0 ) { - mPermanentNote->setTimeout(duration); - } - mPermanentNote->setDismissPolicy(HbPopup::TapAnywhere); - qDebug("SatAppToneProvider::playStandardTone show before"); - mPermanentNote->show(); - qDebug("SatAppToneProvider::playStandardTone show after"); - } - - TPtrC8 seq((unsigned char*)sequence.constData(), sequence.length()); - qDebug("SATAPP: SatAppToneProvider::playStandardTone TPtrC8 seq: %S", &seq); - QT_TRAP_THROWING(SymbianPrepareAudioToneUtilityL(seq)); - - if (duration > 0) { - mTimer = new QTimer(this); - SAT_ASSERT(connect(mTimer, SIGNAL(timeout()), - this, SLOT(stopPlayTone()))); - mTimer->start(duration); - } - - qDebug("SATAPP: SatAppToneProvider::playStandardTone <"); -} - -//----------------------------------------------------------------------------- -// SatAppToneProvider::playUserSelectedTone -//----------------------------------------------------------------------------- -void SatAppToneProvider::playUserSelectedTone( - const QString& text, - int tone, - int duration) -{ - qDebug("SatAppToneProvider::playUserSelectedTone >"); - - // 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) { - qDebug( "SatAppToneProvider::\ - PlayUserSelectedToneL Error - already played" ); - mCurrentAction->complete(ESatFailure); - mCurrentAction = 0; - mState = Idle; - return; - } - - if (text.length() > 0) { - mPermanentNote = new HbMessageBox(HbMessageBox::MessageTypeInformation); - mPermanentNote->setText(text); - mPermanentNote->setStandardButtons(HbMessageBox::Cancel); - if (duration) { - mPermanentNote->setTimeout(duration); - } - mPermanentNote->setDismissPolicy(HbPopup::TapAnywhere); - qDebug("SatAppToneProvider::PlayUserSelectedToneL show before"); - mPermanentNote->show(); - qDebug("SatAppToneProvider::PlayUserSelectedToneL show after"); - } - - QT_TRAP_THROWING(SymbianPrepareAudioPlayerL(tone,duration)); - - if (duration > 0) { - qDebug( "SATAPP: SatAppToneProvider::PlayUserSelectedToneL\ - duration not 0" ); - mTimer = new QTimer(this); - mTimer->start(duration); - SAT_ASSERT(connect(mTimer, SIGNAL(timeout()), this, SLOT(stopPlayTone()))); - - if (mPermanentNote) { - SAT_ASSERT(connect(mPermanentNote, SIGNAL(aboutToClose()), - this, SLOT(stopPlayTone()))); - } - } - - qDebug( "SatAppToneProvider::PlayUserSelectedToneL <" ); -} - - -// ---------------------------------------------------------------------------- -// SatAppToneProvider::clearScreen -// terminates all ongoing UI actions -// ---------------------------------------------------------------------------- -// -void SatAppToneProvider::clearScreen() -{ - qDebug( "SatAppToneProvider::clearScreen >" ); - if (mCurrentAction) { - stopPlayTone(); - } - qDebug( "SatAppToneProvider::clearScreen <" ); -} - -// ---------------------------------------------------------------------------- -// SatAppToneProvider::stopPlayTone -// Stops the music, frees blocked functions -// ---------------------------------------------------------------------------- -// -void SatAppToneProvider::stopPlayTone() -{ - qDebug("SATAPP: SatAppToneProvider::stopPlayTone >"); - - if (mPermanentNote) { - qDebug("SatAppToneProvider::stopPlayTone close mPermanentNote"); - disconnect(mPermanentNote,SIGNAL(aboutToClose()), - this, SLOT(stopPlayTone())); - mPermanentNote->close(); - } - - if (mTimer) { - qDebug("SatAppToneProvider::stopPlayTone stop timer"); - disconnect(mTimer,SIGNAL(timeout()), this, SLOT(stopPlayTone())); - if (mTimer->isActive()) { - mTimer->stop(); - } - } - - switch(mState) { - case PlayStandardTone: { - qDebug("SATAPP: SatAppToneProvider::stopPlayTone before play cancel"); - SymbianStopAudioToneUtility(); - - //get warning and game tones setting from active profile - QT_TRAP_THROWING(GetProfileParamsL()); - if( EFalse == mWarningAndPlayTones - && ESatSuccess == mPlayToneError ) { - mPlayToneError = ESatSuccessToneNotPlayed; - } - break; - } - case PlayUserSelectedTone: { - // 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. - SymbianStopAudioPlayer(); - if( EFalse == mWarningAndPlayTones ) { - mPlayToneError = ESatSuccessToneNotPlayed; - } - break; - } - default: - break; - } - - mState = Idle; - if (mCurrentAction) { - mCurrentAction->complete(mPlayToneError); - mCurrentAction = 0; - } - - qDebug("SATAPP: SatAppToneProvider::stopPlayTone <"); -} - -void SatAppToneProvider::resetState() -{ - qDebug("SATAPP: SatAppToneProvider::resetState >"); - if (mCurrentAction) { - mCurrentAction->completeWithNoResponse(); - mCurrentAction = 0; - } - - if (mPermanentNote) { - qDebug("SatAppToneProvider::resetState delete mPermanentNote"); - delete mPermanentNote; - mPermanentNote = 0; - } - - if (mTimer) { - qDebug("SatAppToneProvider::resetState delete timer"); - delete mTimer; - mTimer = 0; - } - qDebug("SATAPP: SatAppToneProvider::resetState <"); -} - - - -// **************************************************************************** -// * ************************************************************************ * -// * * SYMBIAN PART * * -// * ************************************************************************ * -// **************************************************************************** - - -// includes -#include //TTimeIntervalMicroSeconds -#include -#include -#include -#include -#include //KAudioPriorityLowLevel -#include // for CMdaAudioToneUtility&CMdaAudioPlayerUtility -#include //KMdaRepeatForever - -//constants - -// 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 ); - -// ---------------------------------------------------------------------------- -// SatAppToneProvider::SymbianPrepareAudioToneUtilityL -// creates and prepares CMdaAudioToneUtility -// ---------------------------------------------------------------------------- -// -void SatAppToneProvider::SymbianPrepareAudioToneUtilityL(const TDesC8& sequence) -{ - qDebug( "SatAppToneProvider::SymbianPrepareAudioToneUtilityL >" ); - if (mPlayer) { - delete mPlayer; - mPlayer = 0; - } - mPlayer = CMdaAudioToneUtility::NewL(*this); - TInt volume(mPlayer->MaxVolume()); - mPlayer->SetVolume(volume); - mPlayer->PrepareToPlayDesSequence(sequence); - qDebug( "SatAppToneProvider::SymbianPrepareAudioToneUtilityL <" ); -} - -// ---------------------------------------------------------------------------- -// SatAppToneProvider::SymbianStopAudioToneUtility -// cancels and deletes CMdaAudioToneUtility -// ---------------------------------------------------------------------------- -void SatAppToneProvider::SymbianStopAudioToneUtility() -{ - qDebug( "SatAppToneProvider::SymbianStopAudioToneUtility >" ); - if (mPlayer) { - mPlayer->CancelPlay(); - } - delete mPlayer; - mPlayer = NULL; - qDebug( "SatAppToneProvider::SymbianStopAudioToneUtility <" ); -} - -// ---------------------------------------------------------------------------- -// SatAppToneProvider::SymbianPrepareAudioPlayerL -// cancels and deletes CMdaAudioToneUtility -// ---------------------------------------------------------------------------- -void SatAppToneProvider::SymbianPrepareAudioPlayerL( - int tone, int duration) -{ - qDebug( "SatAppToneProvider::SymbianPrepareAudioPlayerL >" ); - // This defines name for the current message alert or incoming call tone. - TBuf soundFileName; - GetProfileParamsL(tone, &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 ); - - qDebug( "SATAPP: SatAppToneProvider::PlayUserSelectedToneL\ - Volume is %d ", mVolume ); - - // Creates the audio player. - mAudioPlayer = CMdaAudioPlayerUtility::NewFilePlayerL( - soundFileName, - *this, - audioPriority, - ( TMdaPriorityPreference ) mdaPriority ); - - TTimeIntervalMicroSeconds no_silence(0); - if (duration > 0) - { - // repeat forever in a loop - mAudioPlayer->SetRepeats(KSoundPlayerRepeatForever, no_silence); - } - else - { - // play only once - mAudioPlayer->SetRepeats(0, no_silence); - } - qDebug( "SatAppToneProvider::SymbianPrepareAudioPlayerL <" ); - -} - -// ---------------------------------------------------------------------------- -// SatAppToneProvider::SymbianStopAudioPlayer -// cancels and deletes CMdaAudioToneUtility -// ---------------------------------------------------------------------------- -void SatAppToneProvider::SymbianStopAudioPlayer() -{ - qDebug( "SatAppToneProvider::SymbianStopAudioPlayer >" ); - if (mAudioPlayer) { - qDebug( "SatAppToneProvider::SymbianStopAudioPlayer AudioPlayer stop" ); - mAudioPlayer->Stop(); - } - delete mAudioPlayer; - mAudioPlayer = 0; - qDebug( "SatAppToneProvider::SymbianStopAudioPlayer <" ); -} - -// --------------------------------------------------------- -// SatAppCommandHandler::GetProfileParamsL -// Get and store settings from current profile -// (other items were commented in a header). -// --------------------------------------------------------- -// -void SatAppToneProvider::GetProfileParamsL( - int aTone /*= ESatToneNotSet*/, - TDes* aToneName /*= NULL*/ ) -{ - qDebug( "SatAppCommandHandler::GetProfileParamsL >" ); - 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; - - qDebug( "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; - qDebug( "CSatUiViewAppUi::GetProfileParamsL \ - mVolume after mapping %d", mVolume ); - - if ( ( ESatUserSelectedToneIncomingSms == aTone ) && ( aToneName ) ) - { - qDebug("SatAppCommandHandler::GetProfileParamsL message tone"); - aToneName->Copy( tones.MessageAlertTone() ); - } else if( aToneName ) { - qDebug("SatAppCommandHandler::GetProfileParamsL ring tone"); - aToneName->Copy( tones.RingingTone1() ); - } - - CleanupStack::PopAndDestroy(2); // engine, profile - qDebug("SatAppCommandHandler::GetProfileParamsL <"); -} - -// --------------------------------------------------------- -// SatAppToneProvider::MatoPrepareComplete -// Preparation is complete -> Starts playing tone -// --------------------------------------------------------- -// -void SatAppToneProvider::MatoPrepareComplete(TInt aError) -{ - qDebug("SatAppToneProvider::MatoPrepareComplete \ - aError = %d >", aError); - if (KErrNone == aError && mPlayer) { - mPlayToneError = ESatSuccess; - TTimeIntervalMicroSeconds zero(static_cast( 0 )); - mPlayer->SetPriority(KAudioPriorityLowLevel, - STATIC_CAST(TMdaPriorityPreference, KAudioPrefConfirmation)); - mPlayer->SetRepeats( KMdaAudioToneRepeatForever, zero ); - mPlayer->Play(); - } else { - mPlayToneError = ESatFailure; - stopPlayTone(); - } - qDebug( "SatAppToneProvider::MatoPrepareComplete <" ); -} - -//----------------------------------------------------------------------------- -// SatAppToneProvider::MatoPlayComplete -// Play complete -> Frees blocking function -// (other items were commented in a header). -// ---------------------------------------------------------------------------- -// -void SatAppToneProvider::MatoPlayComplete( TInt aError ) -{ - qDebug("SatAppToneProvider::MatoPlayComplete >"); - if (KErrNone == aError && mPlayer) { - qDebug("SatAppToneProvider::MatoPlayComplete play"); - mPlayer->Play(); - } else { - qDebug( "SatAppToneProvider::MatoPlayComplete stop playing"); - // Stops playing if error. - stopPlayTone(); - } - qDebug("SatAppToneProvider::MatoPlayComplete error %d <", aError); -} - -//----------------------------------------------------------------------------- -// SatAppToneProvider::MapcInitComplete -// Initialisation complete -> starts playing the tone. -// ---------------------------------------------------------------------------- -void SatAppToneProvider::MapcInitComplete( TInt aError, - const TTimeIntervalMicroSeconds& /*aDuration*/ ) -{ - qDebug( "SatAppToneProvider::MapcInitComplete >" ); - // 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()))); - qDebug("CSatUiViewAppUi::\ - MapcInitComplete SetVolume %d", volume ); - // Set volume according Settings. - mAudioPlayer->SetVolume( volume ); - mAudioPlayer->Play(); - qDebug( "SatAppToneProvider::MapcInitComplete Play" ); - } else { - // Otherwise, we delete the initialised audio player. - if ( mAudioPlayer ) { - qDebug( "SatAppToneProvider::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(); - - qDebug( "SatAppToneProvider::MapcInitComplete Error %d", aError ); - } - qDebug( "SatAppToneProvider::MapcInitComplete <" ); -} - -//----------------------------------------------------------------------------- -// SatAppToneProvider::MapcPlayComplete -// Deletes audio player after playing is completed. -// ---------------------------------------------------------------------------- -void SatAppToneProvider::MapcPlayComplete( TInt /*aError*/ ) -{ - qDebug( "SatAppToneProvider::MapcPlayComplete >" ); - - // When playing is completed, deleting the audio player. - if ( mAudioPlayer ) { - qDebug("SatAppToneProvider::MapcPlayComplete delete mAudioPlayer"); - delete mAudioPlayer; - mAudioPlayer = 0; - } - // Remove note after play has completed. - stopPlayTone(); - qDebug( "SatAppToneProvider::MapcPlayComplete <" ); -} - - -//End of file