diff -r e5618cc85d74 -r 6c158198356e javauis/nokiasound/src/cmidtone.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/nokiasound/src/cmidtone.cpp Thu Aug 19 09:48:13 2010 +0300 @@ -0,0 +1,244 @@ +/* +* Copyright (c) 2006-2007 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 class implements beep playing and OTA ringingtone playing. +* +*/ + + +#include +#include + +#include "com_nokia_mid_sound_Sound.h" +#include "CMIDTone.h" +#include "MMIDEventSender.h" + +namespace +{ +const TInt KMIDMaxJavaVolume = 255; +const TInt KMIDMinNativeVolume = 1; +const TInt KMIDStopSleepTime = 10000; +const TInt KMIDMicrosInMilli = 1000; +const TInt KMIDMinDataLength = 4; +const TInt KMIDLoopForever = 999999; +} + +CMIDTone* CMIDTone::NewL(TInt aFreq, TInt64 aDuration, + MMIDEventSender* aEventSender) +{ + CMIDTone* self = new(ELeave) CMIDTone(aEventSender); + CleanupStack::PushL(self); + self->ConstructL(aFreq, aDuration); + CleanupStack::Pop(self); + return self; +} + +CMIDTone* CMIDTone::NewL(const TDesC8& aData, MMIDEventSender* aEventSender) +{ + CMIDTone* self = new(ELeave) CMIDTone(aEventSender); + CleanupStack::PushL(self); + self->ConstructL(aData); + CleanupStack::Pop(self); + return self; +} + + +CMIDTone::~CMIDTone() +{ + if (iMdaAudioToneUtility) + { + if (iMdaAudioToneUtility->State() == EMdaAudioToneUtilityNotReady) + { + iMdaAudioToneUtility->CancelPrepare(); + } + else if (iMdaAudioToneUtility->State() + == EMdaAudioToneUtilityPlaying) + { + iMdaAudioToneUtility->CancelPlay(); + } + } + delete iMdaAudioToneUtility; + delete iSchedulerWait; +} + +CMIDTone::CMIDTone(MMIDEventSender* aEventSender) + : CMIDSoundImpl(aEventSender) +{ +} + +void CMIDTone::ConstructL(TInt aFreq, TInt64 aDuration) +{ + CMIDSoundImpl::ConstructL(); + iSchedulerWait = new(ELeave) CActiveSchedulerWait; + iFreq = aFreq; + iDuration = aDuration; + iState = EInitialising; + iMdaAudioToneUtility = CMdaAudioToneUtility::NewL(*this); + iMdaAudioToneUtility->PrepareToPlayTone(iFreq, + TTimeIntervalMicroSeconds(iDuration * KMIDMicrosInMilli)); + iSchedulerWait->Start(); +} + +void CMIDTone::ConstructL(const TDesC8& aData) +{ + CMIDSoundImpl::ConstructL(); + iSchedulerWait = new(ELeave) CActiveSchedulerWait; + // first byte is the number of command parts + iFreq = 0; + iDuration = 0; + iState = EInitialising; + + if (aData.Length() < KMIDMinDataLength) + { + iState = ENotSupported; + User::Leave(KErrArgument); + } + + if (aData[0x000] == 0x02 && aData[0x001] == 0x4a && aData[0x002] == 0x3a) + { + iState = EInitialising; + } + else if (aData[0x000] == 0x03 && aData[0x001] == 0x4a && aData[0x002] == + 0x44 && aData[0x003] == 0x3a) + { + iState = EInitialising; + } + else if (aData[0] == 0x00 && aData[1] == 0x11) + { + iState = EInitialising; + } + else + { + iState = ENotSupported; + User::Leave(KErrArgument); + } + iMdaAudioToneUtility = CMdaAudioToneUtility::NewL(*this); + iMdaAudioToneUtility->PrepareToPlayDesSequence(aData); + iSchedulerWait->Start(); + +} + +TInt CMIDTone::Play(TInt aLoop) +{ + __ASSERT_DEBUG(iState == EReadyToPlay, User::Invariant()); + + if (aLoop == 0) + { + // There is no known working method to play tone forever + aLoop = KMIDLoopForever; + } + + // Setting repeats to 1 causes sound played twice + if (aLoop == 1) + { + iMdaAudioToneUtility->SetRepeats(0, TTimeIntervalMicroSeconds(0)); + } + else if (aLoop > 1) + { + iMdaAudioToneUtility->SetRepeats(aLoop, TTimeIntervalMicroSeconds(0)); + } + + iMdaAudioToneUtility->Play(); + + iEventSender->SendEvent(com_nokia_mid_sound_Sound_SOUND_PLAYING); + iState = EPlaying; + iPlayed = ETrue; + + return KErrNone; +} + +void CMIDTone::Stop() +{ + if (iState == EPlaying) + { + iMdaAudioToneUtility->CancelPlay(); + // sleep to make sure the device has time to stop + User::After(TTimeIntervalMicroSeconds32(KMIDStopSleepTime)); // CSI: 92 MdaAudioToneUtility does not send event when stopping has finished # + iEventSender->SendEvent(com_nokia_mid_sound_Sound_SOUND_STOPPED); + iState = EReadyToPlay; + } +} + +void CMIDTone::SetVolume(TInt aVolume) +{ + TInt maxVolume = iMdaAudioToneUtility->MaxVolume(); + TInt volume = 0; + if (aVolume) + { + volume = (((maxVolume + - KMIDMinNativeVolume + 1) + * aVolume) + / (KMIDMaxJavaVolume + 1)) + KMIDMinNativeVolume; + } + iMdaAudioToneUtility->SetVolume(volume); +} + +TInt CMIDTone::Volume() +{ + TInt maxVolume = iMdaAudioToneUtility->MaxVolume(); + TInt volume = (iMdaAudioToneUtility->Volume() * + KMIDMaxJavaVolume) / maxVolume; + + return volume; +} + +void CMIDTone::MatoPrepareComplete(TInt aError) +{ + if (aError == KErrNone) + { + iState = EReadyToPlay; + } + else + { + if (aError == KErrNotSupported) + { + iState = ENotSupported; + } + else + { + iState = ENotReady; + } + } + iSchedulerWait->AsyncStop(); +} + +void CMIDTone::MatoPlayComplete(TInt aError) +{ + if (KErrNone == aError) + { + iEventSender->SendEvent(com_nokia_mid_sound_Sound_SOUND_STOPPED); + iState = EReadyToPlay; + } +} + +void CMIDTone::Release() +{ + iState = ENotReady; + if (iMdaAudioToneUtility) + { + if (iMdaAudioToneUtility->State() == EMdaAudioToneUtilityNotReady) + { + iMdaAudioToneUtility->CancelPrepare(); + } + else if (iMdaAudioToneUtility->State() == EMdaAudioToneUtilityPlaying + || iState == EPlaying) + { + iMdaAudioToneUtility->CancelPlay(); + } + } + delete iMdaAudioToneUtility; + iMdaAudioToneUtility = NULL; + iState = ENotReady; +} + +// End of File