videoplayback/videohelix/src/mpxvideoaccessoryobserver.cpp
changeset 0 96612d01cf9f
child 8 ce5ada96ab30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoplayback/videohelix/src/mpxvideoaccessoryobserver.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,289 @@
+/*
+* Copyright (c) 2008 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:  This class observes the accessory framework.
+ *
+*/
+
+// Version : %version: 6 %
+
+//
+//  INCLUDE FILES
+//
+#include <e32svr.h>
+#include <AccPolSubblockNameArray.h>
+
+#include "mpxvideoaccessoryobserver.h"
+#include "mpxvideoplaybackcontroller.h"
+#include "mpxvideo_debug.h"
+
+//
+// ============================ MEMBER FUNCTIONS ===================================================
+//
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoAccessoryObserver::NewL
+//   Two-phased constructor.
+// -------------------------------------------------------------------------------------------------
+//
+CMPXVideoAccessoryObserver*
+CMPXVideoAccessoryObserver::NewL( CMPXVideoPlaybackController* aController )
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoAccessoryObserver::NewL()"));
+
+    CMPXVideoAccessoryObserver* self = new (ELeave) CMPXVideoAccessoryObserver( aController );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoAccessoryObserver::ConstructL
+//   Symbian 2nd phase constructor can leave
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoAccessoryObserver::ConstructL()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoAccessoryObserver::ConstructL()"));
+
+#ifdef __ACCESSORY_FW
+    User::LeaveIfError( iServer.Connect() );
+    User::LeaveIfError( iConnection.CreateSubSession( iServer ) );
+
+    //
+    //  Get initial accessory status synchronously
+    //
+    iConnection.GetAccessoryConnectionStatus( iGenericIdArray );
+#endif
+
+    //
+    //  This will set check if a TV-Out accessory has been connected
+    //  and initialize the member variable
+    //
+    UpdateTvOutStatusL();
+
+    StartMonitoringL();
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoAccessoryObserver::CMPXVideoAccessoryObserver
+// -------------------------------------------------------------------------------------------------
+//
+CMPXVideoAccessoryObserver::CMPXVideoAccessoryObserver( CMPXVideoPlaybackController* aController )
+    : CActive( CActive::EPriorityStandard )
+    , iController( aController )
+    , iTvOutConnected( EFalse )
+    , iTvOutPlaybackAllowed( ETrue )
+{
+    CActiveScheduler::Add( this );
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoAccessoryObserver::~CMPXVideoAccessoryObserver
+// Destructor, close and release the handles.
+// -------------------------------------------------------------------------------------------------
+//
+CMPXVideoAccessoryObserver::~CMPXVideoAccessoryObserver()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoAccessoryObserver::~CMPXVideoAccessoryObserver()"));
+
+    Cancel();
+
+#ifdef __ACCESSORY_FW
+    iConnection.CloseSubSession();
+    iServer.Disconnect();
+#endif
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoAccessoryObserver::StartMonitoringL
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoAccessoryObserver::StartMonitoringL()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoAccessoryObserver::StartMonitoringL()"));
+
+    if ( ! IsActive() )
+    {
+#ifdef __ACCESSORY_FW
+        iConnection.NotifyAccessoryConnectionStatusChanged( iStatus, iGenericIdArray );
+#endif
+
+        SetActive();
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoAccessoryObserver::UpdateTvOutStatusL
+// -------------------------------------------------------------------------------------------------
+//
+TBool CMPXVideoAccessoryObserver::UpdateTvOutStatusL()
+{
+    MPX_DEBUG(_L("CMPXVideoAccessoryObserver::UpdateTvOutStatusL()"));
+
+    TBool statusChanged = EFalse;
+
+    //
+    //  Initialize TV-Out value to EFalse before checking if
+    //  accessories support TV-Out
+    //
+    TBool tvOutConnected = EFalse;
+
+#ifdef __ACCESSORY_FW
+    CAccPolSubblockNameArray* nameArray = CAccPolSubblockNameArray::NewL();
+    CleanupStack::PushL( nameArray );
+
+    //
+    //  Get the number of currently connected accessories
+    //  Loop through each connected accessory looking for
+    //  the desired capabilities
+    //
+    const TInt count = iGenericIdArray.Count();
+
+    for ( TInt index = 0 ; index < count ; index++ )
+    {
+        //
+        //  Get all supported capabilities for this connected accessory.
+        //
+        iConnection.GetSubblockNameArrayL( iGenericIdArray.GetGenericIDL( index ), *nameArray );
+
+        //
+        //  Check if this connected accessory supports TV-Out
+        //
+        if ( nameArray->HasName( KAccVideoOut ) )
+        {
+            MPX_DEBUG(_L("    TV-Out Capabilities Exist"));
+
+            tvOutConnected = ETrue;
+            break;
+        }
+    }
+
+    CleanupStack::PopAndDestroy( nameArray );
+#endif
+
+    //
+    //  Check if the TV-Out status has changed
+    //
+    if ( iTvOutConnected != tvOutConnected )
+    {
+        iTvOutConnected = tvOutConnected;
+
+        if ( iTvOutConnected )
+        {
+            //
+            //  Check the playablility of the clip
+            //
+            iTvOutPlaybackAllowed = iController->iPlaybackMode->IsTvOutAllowedL();
+        }
+        else
+        {
+            iTvOutPlaybackAllowed = ETrue;
+        }
+
+        statusChanged   = ETrue;
+    }
+
+    MPX_DEBUG(_L("    iTvOutConnected = %d"), iTvOutConnected);
+
+    MPX_DEBUG(_L("CMPXVideoAccessoryObserver::UpdateTvOutStatusL() ret = %d"), statusChanged);
+
+    return statusChanged;
+}
+
+// -----------------------------------------------------------------------------
+//   CMPXVideoAccessoryObserver::RunL
+// -----------------------------------------------------------------------------
+//
+void CMPXVideoAccessoryObserver::RunL()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoAccessoryObserver::RunL()"),
+                   _L("iStatus = %d"), iStatus.Int());
+
+#ifdef __ACCESSORY_FW
+    if ( KErrNone == iStatus.Int() )
+    {
+        //
+        //  Check for TV-Out status change
+        //  If a changed, issue notice to the observer
+        //
+        if ( UpdateTvOutStatusL() )
+        {
+            iController->HandleTvOutEventL( iTvOutConnected );
+        }
+    }
+#endif
+
+    //
+    //  Renew request for accessory events
+    //
+    StartMonitoringL();
+}
+
+// -----------------------------------------------------------------------------
+//   CMPXVideoAccessoryObserver::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CMPXVideoAccessoryObserver::DoCancel()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoAccessoryObserver::DoCancel()"));
+
+#ifdef __ACCESSORY_FW
+    iConnection.CancelNotifyAccessoryConnectionStatusChanged();
+#endif
+}
+
+// -----------------------------------------------------------------------------
+//   CMPXVideoAccessoryObserver::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CMPXVideoAccessoryObserver::RunError( TInt aError )
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoAccessoryObserver::RunError()"),
+                   _L("aError = %d"), aError);
+
+#ifdef __ACCESSORY_FW
+    //
+    //  Error occurred, issue new request for accessory status
+    //
+    iConnection.NotifyAccessoryConnectionStatusChanged( iStatus, iGenericIdArray );
+#endif
+
+    return KErrNone;
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoAccessoryObserver::IsTvOutConnected
+// -------------------------------------------------------------------------------------------------
+//
+TBool CMPXVideoAccessoryObserver::IsTvOutConnected()
+{
+    MPX_DEBUG(_L("CMPXVideoAccessoryObserver::IsTvOutConnected(%d)"), iTvOutConnected);
+
+    return iTvOutConnected;
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoAccessoryObserver::IsTvOutPlaybackAllowed
+// -------------------------------------------------------------------------------------------------
+//
+TBool CMPXVideoAccessoryObserver::IsTvOutPlaybackAllowed()
+{
+    TBool playAllowed = ( ! iTvOutConnected || iTvOutPlaybackAllowed );
+    MPX_DEBUG(_L("CMPXVideoAccessoryObserver::IsTvOutPlaybackAllowed(%d)"), playAllowed);
+
+    return playAllowed;
+}
+
+//  End of File