javauis/mmapi_akn/baseline/src/cmmavolumecontrol.cpp
branchRCL_3
changeset 21 4376525cdefb
parent 14 04becd199f91
child 24 6c158198356e
--- a/javauis/mmapi_akn/baseline/src/cmmavolumecontrol.cpp	Wed Jun 09 09:34:07 2010 +0300
+++ b/javauis/mmapi_akn/baseline/src/cmmavolumecontrol.cpp	Mon Jun 21 15:32:50 2010 +0300
@@ -17,15 +17,19 @@
 
 
 //  INCLUDE FILES
-
+#include "cmmaplayer.h"
 #include "cmmavolumecontrol.h"
-#include "cmmaplayer.h"
 #include <jdebug.h>
+#include <mprofile.h>
+#include <mprofileengine.h>
+#include <cprofilechangenotifyhandler.h>
 
 _LIT(KMMAVolumeErrorMsg, "Can't set volume level");
 
 const TInt KMMAJavaSoundIndex = 0;
+const TInt KMMAProfileSoundIndex = 1;
 const TInt KMMAGlobalVolumeSoundIndex = 2;
+const TInt KAudioEarpiece = 3;
 
 void CMMAVolumeControl::StaticSetLevelL(CMMAVolumeControl* aVolumeControl,
                                         TInt aLevel)
@@ -50,6 +54,7 @@
 
 CMMAVolumeControl::~CMMAVolumeControl()
 {
+    delete iProfChangeNotifier;
     iLevels.Close();
 }
 
@@ -58,11 +63,12 @@
 {
     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();
+    // Add level for javasound, will set in StaticSetLevelL method.
+    SetJavaSoundVolumeLevelL();
 
+    SetProfileSoundVolumeLevelL();
+
+    // Sets level to 0 if profile isn't on
     iLevel = CalculateLevel();
 
     // The default value is not yet known. Volume control may change the
@@ -72,6 +78,85 @@
     iLevels[ KMMAJavaSoundIndex ] = KErrNotFound;
 }
 
+void CMMAVolumeControl::SetJavaSoundVolumeLevelL()
+{
+    // In constructor iLevels array is empty and Java level will be the first,
+    // KMMAJavaSoundIndex.
+    AddLevelL();
+}
+
+void CMMAVolumeControl::SetProfileSoundVolumeLevelL()
+{
+    // Add level for profile, level's index will be 1, KMMAProfileSoundIndex
+    AddLevelL();
+}
+
+void CMMAVolumeControl::SetProfilesBasedSoundMutingL()
+{
+    //Get the current active profile id.
+    MProfileEngine* lProfileEngine = CreateProfileEngineL();
+    iProfileId =lProfileEngine->ActiveProfileId();
+    lProfileEngine->Release();
+
+    // if profile is silent or meeting and no headset or bluetooth device
+    // connected,set profile volume level to 0, otherwise keep the original
+    // value 100
+    if ( (EProfileSilentId == iProfileId || EProfileMeetingId == iProfileId)&&
+            iAudioOutputPreference != KAudioEarpiece )
+    {
+        iLevels[ KMMAProfileSoundIndex ] = 0;
+    }
+
+    // Gets notfication about profile changes
+    // Notification is sent to MProfileChangeObserver::HandleActiveProfileEventL()
+    iProfChangeNotifier = CProfileChangeNotifyHandler::NewL( this );
+    // Sets level to 0 if profile isn't on
+    iLevel = CalculateLevel();
+
+}
+void CMMAVolumeControl::HandleActiveProfileEventL(TProfileEvent aProfileEvent,
+        TInt aProfileId)
+{
+    switch (aProfileEvent)
+    {
+    case EProfileNewActiveProfile:
+    {
+        // New profile is activated
+        // Update the volume level, if profile is changed to silent or meeting
+        // then mute it, if no headset or bluetooth device is connected
+        // else set it to max volume level
+        TInt level = 0;
+        iProfileId = aProfileId;
+
+        if ( EProfileSilentId != aProfileId &&
+                EProfileMeetingId != aProfileId)
+        {
+
+            level = KMMAVolumeMaxLevel;
+        }
+        else if (iAudioOutputPreference == KAudioEarpiece)
+        {
+            level = KMMAVolumeMaxLevel;
+        }
+        else
+        {
+            level = 0;
+        }
+        TRAPD( error, SetVolumeLevelL( KMMAProfileSoundIndex, level ) );
+        if ( error != KErrNone )
+        {
+            iPlayer->PostStringEvent( CMMAPlayerEvent::EError,
+                                      KMMAVolumeErrorMsg );
+        }
+        break;
+    }
+    default: // do nothing
+        break;
+    }
+}
+
+
+
 const TDesC& CMMAVolumeControl::ClassName() const
 {
     return KMMAVolumeControlName;
@@ -171,7 +256,7 @@
 {
     DEBUG_INT2("CMMAVolumeControl::SetVolumeLevelL - setting index %d, level %d",
                aLevelIndex, aVolumeLevel);
-    if (0 >= iLevels.Count() ||  iLevels.Count() > 3)
+    if (0 >= iLevels.Count() ||  iLevels.Count() > 4)
     {
         return ;
     }
@@ -216,6 +301,23 @@
     DEBUG_INT("CMMAVolumeControl::GetVolumeLevelL - level %d", *aVolumeLevel);
 }
 
+EXPORT_C void CMMAVolumeControl::SetAudioOutputPreferenceL(
+    TInt aRoutingPreference)
+{
+    iAudioOutputPreference = aRoutingPreference;
+    // If audio o/p preference is set to private then set the profile sound
+    // to max value else if profile is in silent or meeting set the profile
+    // sound to 0   
+    if ( iAudioOutputPreference == KAudioEarpiece)
+    {
+       SetVolumeLevelL(KMMAProfileSoundIndex, KMMAVolumeMaxLevel);
+    }
+    else if (EProfileSilentId == iProfileId || EProfileMeetingId == iProfileId)
+    {
+       SetVolumeLevelL(KMMAProfileSoundIndex, 0);
+    }
+}
+
 TInt CMMAVolumeControl::CalculateLevel()
 {
     TInt levelCount = iLevels.Count();