--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/utilities/mpmediacontroller/src/mpvolumeslider.cpp Fri Aug 06 16:51:36 2010 -0500
@@ -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
+}
+