--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoplayback/videoplaybackview/controlsrc/videoplaybackvolumecontrol.cpp Tue Oct 05 09:26:49 2010 +0300
@@ -0,0 +1,338 @@
+/*
+* Copyright (c) 2010 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: Implementation of VideoPlaybackVolumeControl
+*
+*/
+
+// Version : %version: 1 %
+
+
+#include <QTimer>
+#include <hbvolumesliderpopup.h>
+
+#include "mpxvideo_debug.h"
+#include "videoplaybackvolumecontrol.h"
+#include "videoplaybackcontrolscontroller.h"
+
+const int KVolumeDragEventTimeOut = 100000; //set volume maximum 10 times a sec during dragging
+
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::VideoPlaybackVolumeControl()
+// -------------------------------------------------------------------------------------------------
+//
+VideoPlaybackVolumeControl::VideoPlaybackVolumeControl( VideoPlaybackControlsController* controller )
+ : mController( controller )
+ , mVolumePopup( NULL )
+ , mDraggingHandlerTimer( NULL )
+ , mVolume( KPbPlaybackVolumeLevelMin )
+ , mVolumeNormalizer( 0 )
+ , mMutedByMuteIcon( false )
+ , mDragging( false )
+{
+ MPX_ENTER_EXIT(_L("VideoPlaybackVolumeControl::VideoPlaybackVolumeControl"));
+}
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::~VideoPlaybackVolumeControl()
+// -------------------------------------------------------------------------------------------------
+//
+VideoPlaybackVolumeControl::~VideoPlaybackVolumeControl()
+{
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::~VideoPlaybackVolumeControl()"));
+
+ if ( mDraggingHandlerTimer )
+ {
+ disconnect( mDraggingHandlerTimer, SIGNAL( timeout() ), this, SLOT( handleDraggingTimerTimeOut() ) );
+
+ if ( mDraggingHandlerTimer->isActive() )
+ {
+ mDraggingHandlerTimer->stop();
+ }
+
+ delete mDraggingHandlerTimer;
+ mDraggingHandlerTimer = NULL;
+ }
+
+ if ( mVolumePopup )
+ {
+ disconnect( mVolumePopup, SIGNAL( valueChanged( int ) ), this, SLOT( handleSliderValueChanged( int ) ) );
+ disconnect( mVolumePopup, SIGNAL( iconClicked() ), this, SLOT( handleMuteIconClicked() ) );
+ disconnect( mVolumePopup, SIGNAL( sliderPressed() ), this, SLOT( handleSliderPressed() ) );
+ disconnect( mVolumePopup, SIGNAL( sliderReleased() ), this, SLOT( handleSliderReleased() ) );
+
+ delete mVolumePopup;
+ mVolumePopup = NULL;
+ }
+}
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::initialize()
+// -------------------------------------------------------------------------------------------------
+//
+void VideoPlaybackVolumeControl::initialize()
+{
+ MPX_ENTER_EXIT(_L("VideoPlaybackVolumeControl::initialize()"));
+
+ if ( ! mVolumePopup )
+ {
+ //
+ // Create volume popup control
+ //
+ mVolumePopup = new HbVolumeSliderPopup();
+ mVolumePopup->setVisible( false );
+ mVolumePopup->setTimeout( KControlsTimeOut );
+ mVolumePopup->setTickPosition( Hb::NoSliderTicks );
+
+ connect( mVolumePopup, SIGNAL( valueChanged( int ) ), this, SLOT( handleSliderValueChanged( int ) ), Qt::QueuedConnection );
+ connect( mVolumePopup, SIGNAL( iconClicked() ), this, SLOT( handleMuteIconClicked() ) );
+ connect( mVolumePopup, SIGNAL( sliderPressed() ), this, SLOT( handleSliderPressed() ) );
+ connect( mVolumePopup, SIGNAL( sliderReleased() ), this, SLOT( handleSliderReleased() ) );
+
+ if ( mController->fileDetails()->mAudioEnabled )
+ {
+ int volumeSteps = mController->volumeSteps();
+
+ mVolumePopup->setRange( 0, volumeSteps );
+ mVolumePopup->setSingleStep( 1 );
+ mVolumeNormalizer = ( KPbPlaybackVolumeLevelMax - KPbPlaybackVolumeLevelMin ) / volumeSteps;
+ mVolumePopup->setValue( mVolume / mVolumeNormalizer );
+
+ mDraggingHandlerTimer = new QTimer();
+ mDraggingHandlerTimer->setSingleShot( false );
+ mDraggingHandlerTimer->setInterval( KVolumeDragEventTimeOut );
+ connect( mDraggingHandlerTimer, SIGNAL( timeout() ), this, SLOT( handleDraggingTimerTimeOut() ) );
+ }
+ else
+ {
+ //
+ // Dimmed the volume control if it is video only
+ //
+ mVolumePopup->setValue( 0 );
+ mVolumePopup->setEnabled( false );
+ }
+
+ }
+}
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::volumeChanged()
+// -------------------------------------------------------------------------------------------------
+//
+void VideoPlaybackVolumeControl::volumeChanged( int volume )
+{
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::volumeChanged() volume = %d"), volume );
+
+ //
+ // If we get expected volume from video helix, we don't need to set the volume to volume slider.
+ // Or we can stay in infinite loop like this..1->2->3->4->1->2->3->4...
+ // Unlike 9.2, mVolumePopup updates UI first and then emit volumechanged signal,
+ // so there should be workaround to avoid infinite loop
+ // 1. mVolumePopup->setValue( 5 )
+ // 2. mVolumePopup emits valueChanged( 5 )
+ // 3. set the volume 5 to video helix
+ // 4. video helix sends voluemchanged with volume 5
+ //
+ if ( mExpectedVolList.length() && mExpectedVolList.first() == volume )
+ {
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::volumeChanged() mExpectedVolList.first() = %d"),
+ mExpectedVolList.first() );
+
+ mExpectedVolList.removeFirst();
+ }
+ else if ( ! mDragging )
+ {
+ mVolume = volume;
+
+ if ( mVolumePopup )
+ {
+ mVolumePopup->setValue( mVolume / mVolumeNormalizer );
+ setVisible( true );
+ }
+ }
+}
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::setVisible()
+// -------------------------------------------------------------------------------------------------
+//
+void VideoPlaybackVolumeControl::setVisible( bool visible )
+{
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::setVisible() visibility = %d"), visible );
+
+ //
+ // Late init. When we have to show the volume control, we create.
+ //
+ if ( ! mVolumePopup )
+ {
+ initialize();
+ }
+
+ mVolumePopup->setVisible( visible );
+}
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::isVisible()
+// -------------------------------------------------------------------------------------------------
+//
+bool VideoPlaybackVolumeControl::isVisible()
+{
+ bool visible = false;
+
+ if ( mVolumePopup )
+ {
+ visible = mVolumePopup->isVisible();
+ }
+
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::isVisible()"), visible );
+
+ return visible;
+}
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::handleSliderValueChanged()
+// -------------------------------------------------------------------------------------------------
+//
+void VideoPlaybackVolumeControl::handleSliderValueChanged( int volume )
+{
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::handleSliderValueChanged() vol = %d"), volume );
+
+ volume *= mVolumeNormalizer;
+
+ //
+ // If user is dragging, we won't send all the volumechanged value to video helix
+ // since it causes huge traffic and issues with asynchnous calls
+ // So we send commands 10 times a sec as we do in 9.2
+ //
+ if ( mDragging )
+ {
+ mDraggingVolume = volume;
+ }
+ else
+ {
+ setVolume( volume );
+ }
+}
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::handleMuteIconClicked()
+// -------------------------------------------------------------------------------------------------
+//
+void VideoPlaybackVolumeControl::handleMuteIconClicked()
+{
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::handleMuteIconClicked()"));
+
+ if ( mVolumePopup->value() )
+ {
+ mController->handleCommand( EMPXPbvCmdUnMute );
+ }
+ else
+ {
+ mMutedByMuteIcon = true;
+ mController->handleCommand( EMPXPbvCmdMute );
+ }
+}
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::handleSliderPressed()
+// -------------------------------------------------------------------------------------------------
+//
+void VideoPlaybackVolumeControl::handleSliderPressed()
+{
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::handleSliderPressed()"));
+
+ mDragging = true;
+
+ if ( mDraggingHandlerTimer && mDraggingHandlerTimer->isActive() )
+ {
+ mDraggingHandlerTimer->stop();
+ }
+
+ mDraggingHandlerTimer->start( 0 );
+}
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::handleSliderReleased()
+// -------------------------------------------------------------------------------------------------
+//
+void VideoPlaybackVolumeControl::handleSliderReleased()
+{
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::handleSliderReleased()"));
+
+ mDragging = false;
+
+ if ( mDraggingHandlerTimer )
+ {
+ mDraggingHandlerTimer->stop();
+ }
+
+ setVolume( mDraggingVolume );
+}
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::handleDraggingTimerTimeOut()
+// -------------------------------------------------------------------------------------------------
+//
+void VideoPlaybackVolumeControl::handleDraggingTimerTimeOut()
+{
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::handleDraggingTimerTimeOut() mDraggingVolume = %d")
+ ,mDraggingVolume );
+
+ if ( mDragging )
+ {
+ setVolume( mDraggingVolume );
+ }
+}
+
+// -------------------------------------------------------------------------------------------------
+// VideoPlaybackVolumeControl::setVolume()
+// -------------------------------------------------------------------------------------------------
+//
+void VideoPlaybackVolumeControl::setVolume( int volume )
+{
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::setVolume() mVolume = %d, volume = %d")
+ , mVolume, volume );
+
+ if ( mVolume != volume )
+ {
+ mVolume = volume;
+
+ if ( mMutedByMuteIcon && volume == 0 )
+ {
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::setVolume() don't need to update volume right after muted"));
+
+ //
+ // If this function gets called sincen user tap on mute icon to mute,
+ // Then add min value to the expectedlist. playback plugin will send min value to ui.
+ //
+ mExpectedVolList.append( KPbPlaybackVolumeLevelMin );
+
+ //
+ // Don't need to update volume '0' right after muted.
+ // If we set '0' to playbackplugin after muted,
+ // it won't go back to previous volume with unmuted through media key or remote
+ //
+ mMutedByMuteIcon = false;
+ }
+ else
+ {
+ MPX_DEBUG(_L("VideoPlaybackVolumeControl::setVolume() setvolume = %d"), mVolume );
+
+ mExpectedVolList.append( mVolume );
+ mController->handleCommand( EMPXPbvCmdSetVolume, mVolume );
+ }
+ }
+}
+
+//End of file