utilities/mpmediacontroller/src/mpvolumeslider.cpp
changeset 48 af3740e3753f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/utilities/mpmediacontroller/src/mpvolumeslider.cpp	Wed Aug 18 09:46:20 2010 +0300
@@ -0,0 +1,222 @@
+/*
+* Copyright (c) 2009 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: Music Player volume slider.
+*
+*/
+
+#include <hbvolumesliderpopup.h>
+
+#include "mpvolumeslider.h"
+#include "mpenginefactory.h"
+#include "mptrace.h"
+
+const int KVolumeMin = 0;
+const int KVolumeMuted = 1;
+const int KDefaultSteps = 10;
+const int KDataCompleted = 0x07; // 0x01 volume max, 0x02 volume level, 0x04 volume mute
+
+/*!
+ Constructs MpVolumeSlider.
+ */
+MpVolumeSlider::MpVolumeSlider( QObject *parent )
+    : QObject( parent),
+      mMpEngine( 0 ),
+      mVolumeSliderPopup( 0 ),
+      mEngineVolumeMax( 0 ),
+      mEngineVolumeLevel( 0 ),
+      mEngineMuted( false ),
+      mEngineDataCompleted( 0 ),
+      mSliderPressed( false ),
+      mSliderStep( 0 )
+{
+    TX_ENTRY
+    mMpEngine = MpEngineFactory::sharedEngine();
+    connect( mMpEngine, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ), 
+             this, SLOT( handleVolumeProperty( MpCommon::MpVolumeProperty, int ) ) );
+
+    //Request Volume properties
+    mMpEngine->getMaxVolume();
+    mMpEngine->getVolume();
+    mMpEngine->getMuteState();
+    TX_EXIT
+}
+
+/*!
+ Destructs MpVolumeSlider.
+ */
+MpVolumeSlider::~MpVolumeSlider()
+{
+    TX_ENTRY
+    delete mVolumeSliderPopup;
+    TX_EXIT
+}
+
+/*!
+ Make volume slider visible with latest engine data.
+ */
+void MpVolumeSlider::showVolumeSlider()
+{
+    TX_ENTRY
+
+    if ( !mSliderPressed ) {
+
+        // Initialize popup until needed, in order to save time during app start up.
+        if ( !mVolumeSliderPopup ) {
+            initializeVolumeSliderPopup();
+        }
+
+        // Update VolumeSlider with Engine values
+        if ( mEngineMuted ) {
+            if ( mVolumeSliderPopup->value() != KVolumeMin ) {
+                // Muted from outside (possibly from Headset or MediaKeys), update volume slider as "muted"
+                // Todo: Replace with a more appropriate method to mute slider, when provided by Orbit.
+                mVolumeSliderPopup->setValue( KVolumeMin );
+            }
+        }
+        else if ( mVolumeSliderPopup->value() != ( mEngineVolumeLevel / mSliderStep ) ){
+            mVolumeSliderPopup->setValue( mEngineVolumeLevel / mSliderStep );
+        }
+
+        // Show VolumeSlider
+        if ( !mVolumeSliderPopup->isVisible() ) {
+            mVolumeSliderPopup->setVisible( true );
+        }
+    }
+
+    TX_EXIT
+}
+
+/*!
+ Slot to handle volume property notifications
+ */
+void MpVolumeSlider::handleVolumeProperty( MpCommon::MpVolumeProperty property, int value )
+{
+    TX_ENTRY_ARGS("Property: " << property << ", Value: " << value );
+    switch( property )
+    {
+        case MpCommon::MaxVolume :
+            mEngineVolumeMax = value;
+            mEngineDataCompleted |= 0x01;
+            break;
+        case MpCommon::Volume :
+            mEngineVolumeLevel = value;
+            // Framework automatically mutes if volume == KVolumeMin and unmutes when volume > KVolumeMin
+            mEngineMuted = mEngineVolumeLevel == KVolumeMin; 
+            if ( mEngineDataCompleted == KDataCompleted ) {
+                showVolumeSlider();
+            }
+            else {
+                mEngineDataCompleted |= 0x02;
+            }
+            break;
+        case MpCommon::MuteState :
+            mEngineMuted = ( value == KVolumeMuted );
+            if ( mEngineDataCompleted == KDataCompleted ) {
+                showVolumeSlider();
+            }
+            else {
+                mEngineDataCompleted |= 0x04;
+            }
+            break;
+        default:
+            TX_LOG_ARGS( "We should never be here" );
+            break;
+    }
+    TX_EXIT
+}
+
+/*!
+ Slot called when slider is pressed.
+ */
+void MpVolumeSlider::sliderPressed()
+{
+    TX_ENTRY
+    mSliderPressed = true;
+    TX_EXIT
+}
+
+/*!
+ Slot called when slider is released.
+ */
+void MpVolumeSlider::sliderReleased()
+{
+    TX_ENTRY
+    mSliderPressed = false;
+    TX_EXIT
+}
+
+/*!
+ Slot called when mute icon is clicekd.
+ */
+void MpVolumeSlider::muteIconClicked()
+{
+    TX_ENTRY
+    if ( mVolumeSliderPopup->value() ) {
+        mMpEngine->unmute();
+        mEngineMuted = false;
+    }
+    else {
+        mMpEngine->mute();
+        mEngineMuted = true;
+    }
+    TX_EXIT
+}
+
+/*!
+ Slot called when volume slider value changes.
+ */
+void MpVolumeSlider::volumeSliderChanged( int value )
+{
+    TX_ENTRY
+
+    if ( mEngineVolumeLevel != ( value * mSliderStep ) ) {
+        // When Mute icon is clicked, slider value changes automatically to zero,
+        // don't send that change in order to avoid reset the engine previous volume.
+        if ( !( mEngineMuted && value == KVolumeMin ) ) {
+            mMpEngine->setVolume( value * mSliderStep );
+        }
+    }
+
+    TX_EXIT
+}
+
+/*!
+ Inernal
+ */
+void MpVolumeSlider::initializeVolumeSliderPopup()
+{
+    TX_ENTRY
+
+    mVolumeSliderPopup = new HbVolumeSliderPopup();
+    mVolumeSliderPopup->setRange( KVolumeMin, KDefaultSteps );
+    mVolumeSliderPopup->setSingleStep( 1 );
+    mVolumeSliderPopup->setTickPosition( Hb::NoSliderTicks );
+    mSliderStep = mEngineVolumeMax / KDefaultSteps ;
+
+    connect( mVolumeSliderPopup, SIGNAL( sliderPressed() ), 
+             this, SLOT( sliderPressed() ) );
+    connect( mVolumeSliderPopup, SIGNAL( sliderReleased() ), 
+             this, SLOT( sliderReleased() ) );
+    connect( mVolumeSliderPopup, SIGNAL( iconClicked() ), 
+             this, SLOT( muteIconClicked() ) );
+    // volumeChanged event is also sent when VolumeSlider is Muted/Unmuted
+    // QueuedConnection used in order to handle Mute events first,
+    // and then be able to know whether to apply the slider volume changes to the engine
+    connect( mVolumeSliderPopup, SIGNAL( valueChanged( int ) ), 
+             this, SLOT( volumeSliderChanged( int ) ),
+             Qt::QueuedConnection );
+
+    TX_EXIT
+}
+