mpx/playbackframework/playbackengine/src/mpxaccessoryobserver.cpp
changeset 0 a2952bb97e68
child 2 7a9a8e73f54b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpx/playbackframework/playbackengine/src/mpxaccessoryobserver.cpp	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,301 @@
+/*
+* Copyright (c) 2006 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:  Accessory observer
+*
+*/
+
+#include <mpxlog.h>
+#include "mpxaccessoryobserver.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMPXAccessoryObserver::NewL
+// Two phase constructor
+// -----------------------------------------------------------------------------
+//
+CMPXAccessoryObserver* CMPXAccessoryObserver::NewL(
+    MMPXAccessoryEventObserver& aObs)
+    {
+    CMPXAccessoryObserver* self = new ( ELeave ) CMPXAccessoryObserver(aObs);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMPXAccessoryObserver::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMPXAccessoryObserver::ConstructL()
+    {
+    MPX_DEBUG1("CMPXAccessoryObserver::ConstructL()" );
+#ifdef __ACCESSORY_FW
+    User::LeaveIfError(iServer.Connect());
+    User::LeaveIfError(iMode.CreateSubSession(iServer));
+#endif // __ACCESSORY_FW
+    StartL();
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXAccessoryObserver::CMPXAccessoryObserver
+// -----------------------------------------------------------------------------
+//
+#ifdef __ACCESSORY_FW
+CMPXAccessoryObserver::CMPXAccessoryObserver(
+    MMPXAccessoryEventObserver& aObs)
+:   CActive( CActive::EPriorityStandard ),
+    iObs(aObs)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+#else
+CMPXAccessoryObserver::CMPXAccessoryObserver(
+    MMPXAccessoryEventObserver& aObs)
+:   CDosEventListenerBase(),
+    iObs(aObs)
+    {
+    }
+#endif // __ACCESSORY_FW
+
+
+// -----------------------------------------------------------------------------
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CMPXAccessoryObserver::~CMPXAccessoryObserver()
+    {
+    MPX_DEBUG1("CMPXAccessoryObserver::~CMPXAccessoryObserver()");
+#ifdef __ACCESSORY_FW
+    Cancel();
+    iMode.CloseSubSession();
+    iServer.Disconnect();
+#endif // __ACCESSORY_FW
+    }
+
+#ifndef __ACCESSORY_FW
+// -----------------------------------------------------------------------------
+// CMPXAccessoryObserver::AccessoryModeChangedL
+// Receives event on accessory mode change.
+// -----------------------------------------------------------------------------
+//
+void CMPXAccessoryObserver::AccessoryModeChangedL(
+    TDosAccessoryMode aAccessoryState )
+    {
+    MPX_FUNC("CMPXAccessoryObserver::AccessoryModeChangedL");
+
+    TMPXPlaybackAccessoryMode mode( ConvertToMpxMode( aAccessoryState ));
+    if ( EPbAccessoryModeUnknown != mode )
+        { //inform parent
+        iObs.HandleAccesoryEventL(mode);
+        }
+    }
+#endif // __ACCESSORY_FW
+
+// -----------------------------------------------------------------------------
+// CMPXAccessoryObserver::StartL
+// -----------------------------------------------------------------------------
+//
+void CMPXAccessoryObserver::StartL()
+    {
+    MPX_DEBUG1("CMPXAccessoryObserver::StartL()");
+
+#ifdef __ACCESSORY_FW
+    if (!IsActive())
+        {
+        iMode.NotifyAccessoryModeChanged(iStatus, iAccessory_mode);
+        SetActive();
+        }
+#else
+    StartListeningL(KAccessoryModeChanged, sizeof (TDosAccessoryMode), EQueue );
+#endif // __ACCESSORY_FW
+
+    }
+// -----------------------------------------------------------------------------
+// CMPXAccessoryObserver::AccessoryModeL
+// Gets current accessory mode
+// -----------------------------------------------------------------------------
+//
+TMPXPlaybackAccessoryMode CMPXAccessoryObserver::AccessoryModeL()
+    {
+    MPX_DEBUG1("CMPXAccessoryObserver::AccessoryModeL() entering");
+
+#ifdef __ACCESSORY_FW
+    RAccessoryServer     accessoryServer;
+    User::LeaveIfError( accessoryServer.Connect () );
+    CleanupClosePushL( accessoryServer );
+    RAccessoryMode       accessory;
+    accessory.CreateSubSession( accessoryServer );
+    TAccPolAccessoryMode accMode;
+    TInt err = accessory.GetAccessoryMode( accMode );
+    accessory.CloseSubSession();
+    CleanupStack::PopAndDestroy( &accessoryServer );
+#else
+    RDosServer dosServer;
+    User::LeaveIfError( dosServer.Connect () );
+    CleanupClosePushL( dosServer );
+    RDosAccessory dosAccessory;
+    User::LeaveIfError( dosAccessory.Open( dosServer ) );
+    CleanupClosePushL( dosAccessory );
+    TDosAccessoryMode accMode( EDosAccNotConnected );
+    TInt err = dosAccessory.GetAccessoryMode( accMode );
+    CleanupStack::PopAndDestroy( 2, dosServer ); // close dosAccessory and dosServer
+#endif // __ACCESSORY_FW
+
+    MPX_DEBUG1("CMPXAccessoryObserver::AccessoryModeL() exiting");
+    return ConvertToMpxMode( accMode );
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXAccessoryObserver::ConvertToMpxMode
+// Converts from accessory mode to internal MPX mode enum
+// -----------------------------------------------------------------------------
+//
+TMPXPlaybackAccessoryMode CMPXAccessoryObserver::ConvertToMpxMode(
+#ifdef __ACCESSORY_FW
+    TAccPolAccessoryMode& aMode )
+#else
+    TDosAccessoryMode& aMode )
+#endif // __ACCESORY_FW
+    {
+    MPX_DEBUG1("CMPXAccessoryObserver::ConvertToMpxMode() entering");
+
+    TMPXPlaybackAccessoryMode mode( EPbAccessoryModeUnknown );
+
+#ifdef __ACCESSORY_FW
+    MPX_DEBUG2("CMPXAccessoryObserver::ConvertToMpxMode(): aMode.iAccessoryMode = %d", aMode.iAccessoryMode);
+    switch ( aMode.iAccessoryMode )
+        {
+        case EAccModeHandPortable:
+            mode = EPbAccessoryHandPortable;
+            break;
+        case EAccModeWiredHeadset:
+            mode = EPbAccessoryWiredHeadset;
+            break;
+        case EAccModeWirelessHeadset:
+            mode = EPbAccessoryWirelessHeadset;
+            break;
+        case EAccModeWiredCarKit:
+            mode = EPbAccessoryWiredCarKit;
+            break;
+        case EAccModeWirelessCarKit:
+            mode = EPbAccessoryWirelessCarKit;
+            break;
+        case EAccModeTextDevice:
+            mode = EPbAccessoryTextDevice;
+            break;
+        case EAccModeLoopset:
+            mode = EPbAccessoryLoopset;
+            break;
+        case EAccModeMusicStand:
+            mode = EPbAccessoryMusicStand;
+            break;
+        case EAccModeTVOut:
+            mode = EPbAccessoryTVOut;
+            break;
+        case EAccModeHeadphones:
+            mode = EPbAccessoryHeadphones;
+            break;
+        default:
+            break;
+        }
+#else
+    MPX_DEBUG2("CMPXAccessoryObserver::ConvertToMpxMode(): aMode = %d", aMode);
+    switch ( aMode )
+        {
+        case EDosAccNotConnected:
+            mode = EPbAccessoryNone;
+            break;
+        case EDosAccUnsupportedConnected:
+            mode = EPbAccessoryUnsupported;
+            break;
+        case EDosAccModeHeadset:
+            mode = EPbAccessoryHeadset;
+            break;
+        case EDosAccModeLoopset:
+            mode = EPbAccessoryLoopset;
+            break;
+        case EDosAccModeTty:
+            mode = EPbAccessoryTty;
+            break;
+        case EDosAccModeCarKit:
+            mode = EPbAccessoryCarKit;
+            break;
+        case EDosAccModeBtHeadset:
+            mode = EPbAccessoryBtHeadset;
+            break;
+        case EDosAccModeBtCarKit:
+            mode = EPbAccessoryBtCarKit;
+            break;
+        default:
+            break;
+        }
+#endif // __ACCESORY_FW
+
+    MPX_DEBUG2("CMPXAccessoryObserver::ConvertToMpxMode() exiting: %d", mode);
+    return mode;
+    }
+
+#ifdef __ACCESSORY_FW
+// -----------------------------------------------------------------------------
+// CMPXAccessoryObserver::RunL
+// -----------------------------------------------------------------------------
+//
+void CMPXAccessoryObserver::RunL()
+    {
+    MPX_DEBUG2("CMPXAccessoryObserver::RunL() status %d ",iStatus.Int() );
+
+    switch ( iStatus.Int() )
+        {
+        case KErrCancel:
+            return;
+        case KErrNone:
+            {
+            TMPXPlaybackAccessoryMode mode = ConvertToMpxMode( iAccessory_mode );
+            MPX_DEBUG2("CMPXAccessoryObserver::AccessoryModeChangedL() mode %d",mode );
+
+            //inform parent
+            if ( EPbAccessoryModeUnknown != mode )
+                {
+                iObs.HandleAccesoryEventL(mode);
+                }
+            // Issue request again
+            StartL();
+            }
+            break;
+        case KErrNotSupported:
+            break;
+        default:
+             StartL();
+            break;
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXAccessoryObserver::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CMPXAccessoryObserver::DoCancel()
+    {
+    MPX_FUNC("CMPXAccessoryObserver::DoCancel()");
+    iMode.CancelNotifyAccessoryModeChanged();
+    }
+#endif // __ACCESSORY_FW
+
+// End of file