sipvoipprovider/src/svpvolumeobserver.cpp
changeset 0 a4daefaec16c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sipvoipprovider/src/svpvolumeobserver.cpp	Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,209 @@
+/*
+* Copyright (c) 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:  SVP telephony volume observer.
+*
+*/
+
+
+#include <centralrepository.h>
+#include <TelephonyAudioRouting.h>
+#include <telephonydomaincrkeys.h>
+
+#include "svpvolumeobserver.h"
+#include "svplogger.h"
+#include "svpvolumeupdateobserver.h"
+
+// Default volume for initialization
+const TInt KDefaultVolume = 4;
+
+
+// ---------------------------------------------------------------------------
+// CSVPVolumeObserver::CSVPVolumeObserver
+// ---------------------------------------------------------------------------
+//
+CSVPVolumeObserver::CSVPVolumeObserver( MSVPVolumeUpdateObserver& aObserver ) 
+    : iCurrentIhfVolume( KDefaultVolume ), iCurrentEarVolume( KDefaultVolume ),
+    iMode( CTelephonyAudioRouting::EHandset ), iRepository( NULL ),
+    iVolumeUpdate( aObserver )
+    {
+    SVPDEBUG1("CSVPVolumeObserver::CSVPVolumeObserver()");
+    }
+
+// ---------------------------------------------------------------------------
+// CSVPVolumeObserver::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CSVPVolumeObserver::ConstructL()
+    {
+    iRepository = CRepository::NewL( KCRUidInCallVolume );
+    iNotifier = CCenRepNotifyHandler::NewL( *this, *iRepository );
+    
+    // Get the current EAR volume from repository
+    User::LeaveIfError( 
+        iRepository->Get( KTelIncallEarVolume, iCurrentEarVolume ) );
+        
+    // Get the current IHF volume from repository
+    User::LeaveIfError( iRepository->Get( KTelIncallLoudspeakerVolume, 
+        iCurrentIhfVolume ) );
+    
+    // create instance of telephony audio routing for tracking mode changes
+    iTelephonyAudioRouting = CTelephonyAudioRouting::NewL( *this );
+    
+    SVPDEBUG2("CSVPVolumeObserver::ConstructL iCurrentIhfVolume: %d",
+        iCurrentIhfVolume );
+    SVPDEBUG2("CSVPVolumeObserver::ConstructL iCurrentEarVolume: %d",
+        iCurrentEarVolume );
+    
+    iNotifier->StartListeningL();
+    }
+
+// ---------------------------------------------------------------------------
+// CSVPVolumeObserver::NewL
+// ---------------------------------------------------------------------------
+//
+CSVPVolumeObserver* CSVPVolumeObserver::NewL( 
+        MSVPVolumeUpdateObserver& aObserver )
+    {
+    CSVPVolumeObserver* self = new( ELeave ) CSVPVolumeObserver( aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+// ---------------------------------------------------------------------------
+// CSVPVolumeObserver::~CSVPVolumeObserver
+// ---------------------------------------------------------------------------
+//
+CSVPVolumeObserver::~CSVPVolumeObserver()
+    {
+    if ( iNotifier )
+        {
+        iNotifier->StopListening();
+        }
+    
+    delete iNotifier;
+    delete iRepository;
+    delete iTelephonyAudioRouting;
+    }
+    
+// ---------------------------------------------------------------------------
+// CSVPVolumeObserver::HandleNotifyGeneric
+// ---------------------------------------------------------------------------
+//
+void CSVPVolumeObserver::HandleNotifyGeneric( TUint32 aId )
+    {
+    SVPDEBUG1("CSVPVolumeObserver::HandleNotifyGeneric() In");
+    TInt error = KErrArgument;
+    
+    if ( KTelIncallEarVolume == aId )
+        {
+        error = iRepository->Get( KTelIncallEarVolume, iCurrentEarVolume );
+        
+        SVPDEBUG2("CSVPVolumeObserver::HandleNotifyGeneric EAR VOL: %d",
+            iCurrentEarVolume );
+        }
+    else if ( KTelIncallLoudspeakerVolume == aId )
+        {
+        error = iRepository->Get( KTelIncallLoudspeakerVolume,
+            iCurrentIhfVolume );
+        
+        SVPDEBUG2("CSVPVolumeObserver::HandleNotifyGeneric IHF VOL: %d",
+            iCurrentIhfVolume );
+        }
+    // else we are not interested in this notification. Note that we set error
+    // to be KErrArgument and thus we do not set volume if aId is not what
+    // we accept it to be.
+    
+    if( KErrNone == error )
+        {
+        // Handle volume so that everything else is like earpiece but
+        // loudspeaker.
+        TInt volume =  KDefaultVolume;
+        if ( CTelephonyAudioRouting::ELoudspeaker == iMode )
+            {
+            volume = iCurrentIhfVolume;
+            }
+        else
+            {
+            volume = iCurrentEarVolume;
+            }
+            
+        // volume update
+        iVolumeUpdate.VolumeChanged( volume );
+        }
+        
+    SVPDEBUG2("CSVPVolumeObserver::HandleNotifyGeneric ERROR: %d", error );
+    }
+    
+// ---------------------------------------------------------------------------
+// CSVPVolumeObserver::OutputChanged
+// ---------------------------------------------------------------------------
+//
+void CSVPVolumeObserver::OutputChanged( 
+    CTelephonyAudioRouting& aTelephonyAudioRouting )
+    {
+    SVPDEBUG1("CSVPVolumeObserver::OutputChanged In");
+    
+    // Only unique audio route is the loudspeaker.
+    if ( CTelephonyAudioRouting::ELoudspeaker ==
+        aTelephonyAudioRouting.Output() )
+        {
+        SVPDEBUG1("CSVPVolumeObserver::OutputChanged to LOUDSPEAKER");
+        iMode = CTelephonyAudioRouting::ELoudspeaker;
+        iVolumeUpdate.VolumeChanged( iCurrentIhfVolume );
+        }
+    else
+        {
+        // in other cases apply earpiece volume level.
+        SVPDEBUG2("CSVPVolumeObserver::OutputChanged to %d",
+            aTelephonyAudioRouting.Output() );
+        
+        iMode = CTelephonyAudioRouting::EHandset;
+        iVolumeUpdate.VolumeChanged( iCurrentEarVolume );
+        }
+         
+    SVPDEBUG1("CSVPVolumeObserver::OutputChanged Out");
+    }
+
+// ---------------------------------------------------------------------------
+// CSVPVolumeObserver::SetOutputComplete
+// ---------------------------------------------------------------------------
+//
+void CSVPVolumeObserver::SetOutputComplete( 
+    CTelephonyAudioRouting& /*aTelephonyAudioRouting*/, TInt /*aError*/ )
+    {
+    // no operations
+    }
+
+// ---------------------------------------------------------------------------
+// CSVPVolumeObserver::AvailableOutputsChanged
+// ---------------------------------------------------------------------------
+//
+void CSVPVolumeObserver::AvailableOutputsChanged( 
+    CTelephonyAudioRouting& /*aTelephonyAudioRouting*/ )
+    {
+    // no operations
+    }
+
+
+
+
+
+
+
+
+
+
+