diff -r 000000000000 -r 5f000ab63145 phoneengine/audiohandling/src/cpeaudioinbandtoneplayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneengine/audiohandling/src/cpeaudioinbandtoneplayer.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,610 @@ +/* +* Copyright (c) 2002-2004 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: This module contains the implementation of CPEAudioInbandTonePlayer class +* member functions +* +*/ + + +// INCLUDE FILES +#include "cpeaudiodata.h" // CPEAudioData header +#include "cpeaudioinbandtoneplayer.h" +#include "cpeaudiofactory.h" +#include "cpeaudiotoneutility.h" +#include +#include +#include +#include +#include +#include +#include + + +// EXTERNAL DATA STRUCTURES +// None + +// EXTERNAL FUNCTION PROTOTYPES +// None + +// CONSTANTS +const TInt KPhoneInbandVolumeMax = 10; +const TInt KPhoneInbandVolumeMin = 0; +const TInt KPhoneInbandToneZero = 0; +const TInt KPhoneInbandToneNoRepeat = 0; +const TInt KPhoneInbandToneRepeatOnce = 1; + +// Resourcefile destination. +_LIT( KSystemDefaultbeepRscDrive, "Z:" ); +_LIT( KSystemDefaultbeepRscFile, "DEFAULTBEEP.rSC" ); + +// MACROS +// None + +// LOCAL CONSTANTS AND MACROS +// None + +// MODULE DATA STRUCTURES +// None + +// LOCAL FUNCTION PROTOTYPES +// None + + +// ==================== LOCAL FUNCTIONS ==================== +// None. + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// CPEAudioInbandTonePlayer::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEAudioInbandTonePlayer* CPEAudioInbandTonePlayer::NewL + ( + CPEAudioData& aOwner, // ref. to class owner + RFs& aFsSession, + CPEAudioFactory& aAudioFactory + ) + { + CPEAudioInbandTonePlayer* self = + new ( ELeave ) CPEAudioInbandTonePlayer( aOwner, aFsSession ); + + CleanupStack::PushL( self ); + self->ConstructL( aAudioFactory ); + CleanupStack::Pop( self ); + + return self; + } + +//Destructor +CPEAudioInbandTonePlayer::~CPEAudioInbandTonePlayer() + { + delete iPlayBeepSequence; + delete iPlayNoSoundSequence; + delete iPlayDataSequence; + delete iResourceCallWaitingSeq; + delete iResourceRingGoingSeq; + delete iResourceRadioPathSeq; + delete iResourceSpecialSeq; + delete iResourceCongestionSeq; + delete iResourceReorderSeq; + delete iResourceBusySeq; + delete iCurrent; + } + +// ----------------------------------------------------------------------------- +// CPEAudioInbandTonePlayer::CPEAudioInbandTonePlayer +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPEAudioInbandTonePlayer::CPEAudioInbandTonePlayer + ( + CPEAudioData& aOwner, // ref. to class owner + RFs& aFsSession + ):iOwner( aOwner ), + iFsSession( aFsSession ) + { + } + +// ----------------------------------------------------------------------------- +// CPEAudioInbandTonePlayer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPEAudioInbandTonePlayer::ConstructL( + CPEAudioFactory& aFactory ) + { + TEFLOGSTRING( KTAOBJECT, "AUD CPEAudioInbandTonePlayer::ConstructL()" ); + iCurrent = aFactory.CreateAudioToneUtilityL( *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 ); + + 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; + + } + +// ----------------------------------------------------------------------------- +// CPEAudioInbandTonePlayer::PlayInbandTone +// Searches the given Inband tone from iToneArray and calls PlayCurrentTone -member function. +// ----------------------------------------------------------------------------- +// +void CPEAudioInbandTonePlayer::PlayInbandTone( + TCCPTone aTone ) + { + //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(); + + TEFLOGSTRING( KTAREQOUT, + "AUD CPEAudioInbandTonePlayer::PlayInbandTone: CMdaAudioToneUtility->PrepareToPlayDesSequence()" ); + switch( aTone ) + { + case ECCPToneUserBusy: + TEFLOGSTRING( KTAINT, "AUD CPEAudioInbandTonePlayer::PlayInbandTone: iResourceBusySeq" ); + iCurrent->PrepareToPlayDesSequence( resourceBusySeq ); + break; + case ECCPToneRadioPathNotAvailable: + TEFLOGSTRING( KTAINT, "AUD CPEAudioInbandTonePlayer::PlayInbandTone: iResourceRadioPathSeq" ); + iCurrent->PrepareToPlayDesSequence( resourceRadioPathSeq ); + break; + case ECCPToneCongestion: + TEFLOGSTRING( KTAINT, "AUD CPEAudioInbandTonePlayer::PlayInbandTone: iResourceCongestionSeq" ); + iCurrent->PrepareToPlayDesSequence( resourceCongestionSeq ); + break; + case ECCPToneSpecialInformation: + TEFLOGSTRING( KTAINT, "AUD CPEAudioInbandTonePlayer::PlayInbandTone: iResourceSpecialSeq" ); + iCurrent->PrepareToPlayDesSequence( resourceSpecialSeq ); + break; + case ECCPReorder: + TEFLOGSTRING( KTAINT, "AUD CPEAudioInbandTonePlayer::PlayInbandTone: iResourceReorderSeq" ); + iCurrent->PrepareToPlayDesSequence( resourceReorderSeq ); + break; + case ECCPRemoteAlerting: + TEFLOGSTRING( KTAINT, "AUD CPEAudioInbandTonePlayer::PlayInbandTone: iResourceRingGoingSeq" ); + iCurrent->PrepareToPlayDesSequence( resourceRingGoingSeq ); + break; + case ECCPCallWaiting: + TEFLOGSTRING( KTAINT, "AUD CPEAudioInbandTonePlayer::PlayInbandTone: iResourceCallWaitingSeq" ); + iCurrent->PrepareToPlayDesSequence( resourceCallWaitingSeq ); + break; + case ECCPNoSoundSequence: + TEFLOGSTRING( KTAINT, "AUD CPEAudioInbandTonePlayer::PlayInbandTone: called ECCPNoSoundSequence " ); + break; + default: + TEFLOGSTRING2( KTAINT, "AUD CPEAudioInbandTonePlayer::PlayInbandTone: No InbandTone defined to play with: %d", aTone ); + __ASSERT_DEBUG( EFalse, Panic( EPEPanicNotCompleted ) ); + break; + } + } + +// ----------------------------------------------------------------------------- +// CPEAudioInbandTonePlayer::Cancel +// Cancels the currently playing tone. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEAudioInbandTonePlayer::Cancel() + { + TEFLOGSTRING( KTAINT, "AUD CPEAudioInbandTonePlayer::Cancel()"); + if ( iCurrent ) + { + if ( iCurrent->State() == EMdaAudioToneUtilityNotReady ) + { + // Prepare is called, but toneplayer's state is not yet prepare, + // then cancel to prepare is needed. + TEFLOGSTRING( KTAREQOUT, + "AUD CPEAudioInbandTonePlayer::Cancel: CMdaAudioToneUtility->CancelPrepare"); + iCurrent->CancelPrepare(); + } + else + { + TEFLOGSTRING( KTAREQOUT, + "AUD CPEAudioInbandTonePlayer::Cancel: CMdaAudioToneUtility->CancelPlay"); + iCurrent->CancelPlay(); + } + } + } + +// ----------------------------------------------------------------------------- +// CPEAudioInbandTonePlayer::PlayCurrentTone +// Cancels the currently playing tone. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEAudioInbandTonePlayer::PlayCurrentTone() + { + if ( iCurrent ) + { + if ( iCurrent->State() == EMdaAudioToneUtilityPrepared ) + { + + UpdateTonePlayerVolume(); + + TEFLOGSTRING( KTAREQOUT, + "AUD CPEAudioInbandTonePlayer::PlayCurrentTone(): CMdaAudioToneUtility->SetPriority()"); + + switch( iToneName ) + { + case ECCPToneUserBusy: + iCurrent->SetRepeats( + KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds( KPhoneInbandToneZero ) ); + iCurrent->SetPriority( + KAudioPriorityNetMsg, + static_cast < TMdaPriorityPreference > ( KAudioPrefBusy ) ); + break; + case ECCPToneRadioPathNotAvailable: + iCurrent->SetRepeats( + KPhoneInbandToneRepeatOnce, + TTimeIntervalMicroSeconds( KPhoneInbandToneZero ) ); + iCurrent->SetPriority( + KAudioPriorityNetMsg, + static_cast < TMdaPriorityPreference > ( KAudioPrefRadioNotAvailable ) ); + break; + case ECCPToneCongestion: + iCurrent->SetRepeats( + KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds( KPhoneInbandToneZero ) ); + iCurrent->SetPriority( + KAudioPriorityNetMsg, + static_cast < TMdaPriorityPreference > ( KAudioPrefCongestion ) ); + break; + case ECCPToneSpecialInformation: + iCurrent->SetRepeats( + KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds( KPhoneInbandToneZero ) ); + iCurrent->SetPriority( + KAudioPriorityNetMsg, + static_cast < TMdaPriorityPreference > ( KAudioPrefSpecialInformation ) ); + break; + case ECCPReorder: + iCurrent->SetRepeats( + KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds( KPhoneInbandToneZero ) ); + iCurrent->SetPriority( + KAudioPriorityNetMsg, + static_cast < TMdaPriorityPreference > ( KAudioPrefReorder ) ); + break; + case ECCPRemoteAlerting: + iCurrent->SetRepeats( + KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds( KPhoneInbandToneZero ) ); + iCurrent->SetPriority( + KAudioPriorityNetMsg, + static_cast < TMdaPriorityPreference > ( KAudioPrefRingGoing ) ); + break; + case ECCPCallWaiting: + iCurrent->SetRepeats( + KPhoneInbandToneNoRepeat, + TTimeIntervalMicroSeconds( KPhoneInbandToneZero ) ); + iCurrent->SetPriority( + KAudioPriorityNetMsg, + static_cast < TMdaPriorityPreference > ( KAudioPrefCallWaiting )); + break; + case 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( + KPhoneInbandToneNoRepeat, + TTimeIntervalMicroSeconds( KPhoneInbandToneZero ) ); + } + break; + case ECCPNoSoundSequence: + case ECCPBeepSequence: + iCurrent->SetRepeats( + KMdaAudioToneRepeatForever, + TTimeIntervalMicroSeconds( KPhoneInbandToneZero ) ); + iCurrent->SetPriority( + KAudioPriorityPhoneCall, + static_cast < TMdaPriorityPreference > ( KAudioPrefIncomingCall ) ); + iCurrent->SetRepeats( + KPhoneInbandToneNoRepeat, + TTimeIntervalMicroSeconds( KPhoneInbandToneZero ) ); + iCurrent->SetVolumeRamp( TTimeIntervalMicroSeconds( KPhoneInbandToneZero ) ); + break; + default: + TEFLOGSTRING2( KTAREQOUT, + "AUD CPEAudioInbandTonePlayer::PlayCurrentTone: No InbandTone defined to set priority with %d", + iToneName); + break; + } + + #ifdef __WINS__ + TEFLOGSTRING( KTAMESINT, + "AUD CPEAudioInbandTonePlayer::PlayCurrentTone: Ignored call to CMdaAudioToneUtility->Play(), because can't play in WINS"); + #else + //Play the tone + TEFLOGSTRING( KTAREQOUT, + "AUD CPEAudioInbandTonePlayer::PlayCurrentTone: CMdaAudioToneUtility->Play() called"); + iCurrent->Play(); + #endif + } // State() + } //iCurrent + } + +// ----------------------------------------------------------------------------- +// CPEAudioInbandTonePlayer::MatoPrepareComplete +// Updates flag values and plays current inbandtone. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEAudioInbandTonePlayer::MatoPrepareComplete( TInt aError ) + { + + if( aError == KErrNone ) + { + PlayCurrentTone(); + } + else + { + TEFLOGSTRING2( KTAREQIN, + "AUD CPEAudioInbandTonePlayer::MatoPrepareComplete: aError = %d", + aError ); + } + + + } + + +// ----------------------------------------------------------------------------- +// CPEAudioInbandTonePlayer::SetVolume +// ----------------------------------------------------------------------------- +// +void CPEAudioInbandTonePlayer::SetVolume( TInt aVolume ) + { + TInt safeVolume = + Max( Min( aVolume, KPhoneInbandVolumeMax ), KPhoneInbandVolumeMin ); + + TEFLOGSTRING2( KTAREQIN, + "AUD CPEAudioInbandTonePlayer::SetVolume: VOLUME = %d", safeVolume ); + + if ( iCurrent && EMdaAudioToneUtilityNotReady != iCurrent->State() ) + { + TInt mediaServerVolume = CalculateMediaServerVolume( safeVolume ); + TEFLOGSTRING2( KTAREQIN, + "AUD CPEAudioInbandTonePlayer::SetVolume: MEDIA SERVER VOLUME = %d", + mediaServerVolume ); + iCurrent->SetVolume( mediaServerVolume ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEAudioInbandTonePlayer::MatoPlayComplete +// - +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEAudioInbandTonePlayer::MatoPlayComplete( TInt aError ) + { + + if( aError != KErrNone ) + { + TEFLOGSTRING2( KTAREQIN, + "CPEAudioInbandTonePlayer::MatoPlayComplete: aError = %d", + aError ); + } + + } + +// ----------------------------------------------------------------------------- +// CPEAudioInbandTonePlayer::CalculateMediaServerVolume +// ----------------------------------------------------------------------------- +// +TInt CPEAudioInbandTonePlayer::CalculateMediaServerVolume( TInt aVolume ) const + { + // 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 ); + } + + +// ----------------------------------------------------------------------------- +// CPEAudioInbandTonePlayer::UpdateTonePlayerVolume +// ----------------------------------------------------------------------------- +// +void CPEAudioInbandTonePlayer::UpdateTonePlayerVolume() + { + TInt volume( KPhoneInbandVolumeMin ); + iOwner.GetAudioVolumeSync( volume ); + SetVolume( volume ); + } + +// End of File