diff -r 6c158198356e -r ae942d28ec0e javauis/mmapi_qt/baseline/src/cmmavolumecontrol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/mmapi_qt/baseline/src/cmmavolumecontrol.cpp Tue Aug 31 15:09:22 2010 +0300 @@ -0,0 +1,239 @@ +/* +* Copyright (c) 2002-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 is used for volume setting +* +*/ + + +// INCLUDE FILES + +#include "cmmavolumecontrol.h" +#include "cmmaplayer.h" +#include + +_LIT(KMMAVolumeErrorMsg, "Can't set volume level"); + +const TInt KMMAJavaSoundIndex = 0; +const TInt KMMAGlobalVolumeSoundIndex = 2; + +void CMMAVolumeControl::StaticSetLevelL(CMMAVolumeControl* aVolumeControl, + TInt aLevel) +{ + // Java level is the first + aVolumeControl->SetVolumeLevelL(KMMAJavaSoundIndex, aLevel); +} + +void CMMAVolumeControl::StaticGetLevelL(CMMAVolumeControl* aVolumeControl, + TInt* aLevel) +{ + // Java level is the first + aVolumeControl->GetVolumeLevelL(KMMAJavaSoundIndex, aLevel); +} + + +CMMAVolumeControl::CMMAVolumeControl(CMMAPlayer* aPlayer) + : iPlayer(aPlayer), iLevel(KMMAVolumeMaxLevel) +{ +} + + +CMMAVolumeControl::~CMMAVolumeControl() +{ + iLevels.Close(); +} + + +void CMMAVolumeControl::ConstructBaseL() +{ + iPlayer->AddStateListenerL(this); + + // Add level for java, will set in StaticSetLevelL method. + // In constructor iLevels array is empty and Java level will be the first, + // KMMAJavaSoundIndex. + AddLevelL(); + + iLevel = CalculateLevel(); + + // The default value is not yet known. Volume control may change the + // volume of the controller before it has been retrieved so when the + // state of the player is changed the Java volume is retrieved from + // the controller. + iLevels[ KMMAJavaSoundIndex ] = KErrNotFound; +} + +const TDesC& CMMAVolumeControl::ClassName() const +{ + return KMMAVolumeControlName; +} + +void CMMAVolumeControl::SetLevelL(TInt aLevel) +{ + // Level cannot be set to derived control if player is not prefetched. + if (iPlayer->State() > CMMAPlayer::ERealized) + { + DoSetLevelL(aLevel); + } + iLevel = aLevel; +} + +void CMMAVolumeControl::StateChanged(TInt aState) +{ + LOG1(EJavaMMAPI, EInfo, "CMMAVolumeControl::StateChanged - state %d", aState); + // Set the volume if the player is prefetched + if (aState == CMMAPlayer::EPrefetched) + { + TRAPD(error, + { + // Get the default value for the Java sound level + if (iLevels[ KMMAJavaSoundIndex ] == KErrNotFound) + { + iLevels[ KMMAJavaSoundIndex ] = DoGetLevelL(); + iLevel = CalculateLevel(); + } + SetLevelL(iLevel); + + }); + if (error != KErrNone) + { + iPlayer->PostStringEvent(CMMAPlayerEvent::EError, + KMMAVolumeErrorMsg); + } + } + + // Level is already set for Global Volume so no need to set it again + // Notify the initial global volume value to java + // Notify only if STATE == CMMAPlayer::ERealized + // Error ID AKUR-7G69Q5 GLOBAL VOLUME EVENT CR + if (aState == CMMAPlayer::ERealized) + { + if ((iLevels.Count() - 1) == KMMAGlobalVolumeSoundIndex) + { + LOG(EJavaMMAPI, EInfo, "MMA::CMMAVolumeControl::StateChanged : Post GLOBAL VOL EVENT "); + if (iLevels[ KMMAGlobalVolumeSoundIndex ] != KErrNotFound) + { + LOG1(EJavaMMAPI, EInfo, "MMA::CMMAVolumeControl::StateChanged : Post complete Val = %d ",iLevels[ KMMAGlobalVolumeSoundIndex ]); + iPlayer->PostLongEvent(CMMAPlayerEvent::ENOKIA_EXTERNAL_VOLUME_EVENT, + iLevels[ KMMAGlobalVolumeSoundIndex ]); + } + } + } +} + +void CMMAVolumeControl::RefreshVolume() +{ + LOG(EJavaMMAPI, EInfo, "MMA::CMMAVolumeControl::RefreshVolume ++ "); + TRAPD(error, + { + // Get the default value for the Java sound level + if (iLevels[ KMMAJavaSoundIndex ] == KErrNotFound) + { + iLevels[ KMMAJavaSoundIndex ] = DoGetLevelL(); + iLevel = CalculateLevel(); + } + SetLevelL(iLevel); + + }); + + if (error != KErrNone) + { + iPlayer->PostStringEvent(CMMAPlayerEvent::EError, + KMMAVolumeErrorMsg); + } + LOG(EJavaMMAPI, EInfo, "MMA::CMMAVolumeControl::RefreshVolume -- "); +} + +void CMMAVolumeControl::RefreshControl() +{ + RefreshVolume(); +} + +EXPORT_C TInt CMMAVolumeControl::AddLevelL() +{ + User::LeaveIfError(iLevels.Append(KMMAVolumeMaxLevel)); + + // New level is the last element + return iLevels.Count() - 1; +} + +EXPORT_C void CMMAVolumeControl::SetVolumeLevelL(TInt aLevelIndex, + TInt aVolumeLevel) +{ + LOG2(EJavaMMAPI, EInfo, "CMMAVolumeControl::SetVolumeLevelL - setting index %d, level %d", + aLevelIndex, aVolumeLevel); + if (0 >= iLevels.Count() || iLevels.Count() > 3) + { + return ; + } + TInt oldVolumeLevel = iLevels[ aLevelIndex ]; + iLevels[ aLevelIndex ] = aVolumeLevel; + SetLevelL(CalculateLevel()); + + // send event if level is really changed + if ((aLevelIndex == KMMAJavaSoundIndex) && + (aVolumeLevel != oldVolumeLevel)) + { + iPlayer->PostObjectEvent(CMMAPlayerEvent::EVolumeChanged, + iControlObject); + } + + // send event if global volume level is really changed + // Error ID AKUR-7G69Q5 GLOBAL VOLUME EVENT CR + if ((aLevelIndex == KMMAGlobalVolumeSoundIndex) && + (aVolumeLevel != oldVolumeLevel)) + { + + iPlayer->PostLongEvent(CMMAPlayerEvent::ENOKIA_EXTERNAL_VOLUME_EVENT, + iLevels[ aLevelIndex ]); + } +} + +void CMMAVolumeControl::GetVolumeLevelL(TInt aLevelIndex, + TInt* aVolumeLevel) +{ + LOG1(EJavaMMAPI, EInfo, "CMMAVolumeControl::GetVolumeLevelL - level index %d", aLevelIndex); + + // Return max volume if the default Java volume level is not yet known + if (aLevelIndex == KMMAJavaSoundIndex && + iLevels[ KMMAJavaSoundIndex ] == KErrNotFound) + { + *aVolumeLevel = KMMAVolumeMaxLevel; + return; + } + + *aVolumeLevel = iLevels[ aLevelIndex ]; + + LOG1(EJavaMMAPI, EInfo, "CMMAVolumeControl::GetVolumeLevelL - level %d", *aVolumeLevel); +} + +TInt CMMAVolumeControl::CalculateLevel() +{ + TInt levelCount = iLevels.Count(); + + // 64 bit integer must be used to have more than 4 levels. + TInt64 level = KMMAVolumeMaxLevel; + TInt64 sum = 1; + + // All levels in the array are percentage of the max volume (0..100). + // Actual sound level will be multiplying all levels. + for (TInt i = 0; i < levelCount; i++) + { + // If the level is not known it is expected to be max volume + level = (iLevels[ i ] == KErrNotFound ? + level * KMMAVolumeMaxLevel : + level * iLevels[ i ]); + sum *= KMMAVolumeMaxLevel; + } + return level / sum; +} +// END OF FILE